diff options
| -rw-r--r-- | CHANGES.txt | 6 | ||||
| -rw-r--r-- | HACKING.txt | 2 | ||||
| -rw-r--r-- | MANIFEST.in | 726 | ||||
| -rw-r--r-- | pyramid/scripts/prequest.py | 40 | ||||
| -rw-r--r-- | pyramid/tests/test_scripts/test_prequest.py | 43 | ||||
| -rw-r--r-- | pyramid/url.py | 2 |
6 files changed, 84 insertions, 735 deletions
diff --git a/CHANGES.txt b/CHANGES.txt index 2c8c6ee46..0156b24fd 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -4,6 +4,12 @@ next release Features -------- +- ``scripts/prequest.py``: add support for submitting ``PUT`` and ``PATCH`` + requests. See https://github.com/Pylons/pyramid/pull/1033. add support for + submitting ``OPTIONS`` and ``PROPFIND`` requests, and allow users to specify + basic authentication credentials in the request via a ``--login`` argument to + the script. See https://github.com/Pylons/pyramid/pull/1039. + - ``ACLAuthorizationPolicy`` supports ``__acl__`` as a callable. This removes the ambiguity between the potential ``AttributeError`` that would be raised on the ``context`` when the property was not defined and the diff --git a/HACKING.txt b/HACKING.txt index 26e85ee80..5b5dcc458 100644 --- a/HACKING.txt +++ b/HACKING.txt @@ -126,7 +126,7 @@ documentation in this package which references that API or behavior must change to reflect the bug fix, ideally in the same commit that fixes the bug or adds the feature. -To build and review docs (where ``$yourvenv`` refers to the virtualenv you're +To build and review docs (where ``$VENV`` refers to the virtualenv you're using to develop Pyramid): 1. Run ``$VENV/bin/python setup.py dev docs``. This will cause Sphinx diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index 6ac6051c7..000000000 --- a/MANIFEST.in +++ /dev/null @@ -1,726 +0,0 @@ -.gitignore -.gitmodules -.travis.yml -BFG_HISTORY.txt -CHANGES.txt -CONTRIBUTORS.txt -COPYRIGHT.txt -HACKING.txt -HISTORY.txt -LICENSE.txt -MANIFEST.in -README.rst -RELEASING.txt -TODO.txt -docs/.gitignore -docs/Makefile -docs/_static/latex-note.png -docs/_static/latex-warning.png -docs/_themes -docs/api/authentication.rst -docs/api/authorization.rst -docs/api/compat.rst -docs/api/config.rst -docs/api/decorator.rst -docs/api/events.rst -docs/api/exceptions.rst -docs/api/httpexceptions.rst -docs/api/i18n.rst -docs/api/interfaces.rst -docs/api/location.rst -docs/api/paster.rst -docs/api/path.rst -docs/api/registry.rst -docs/api/renderers.rst -docs/api/request.rst -docs/api/response.rst -docs/api/scaffolds.rst -docs/api/scripting.rst -docs/api/security.rst -docs/api/session.rst -docs/api/settings.rst -docs/api/static.rst -docs/api/testing.rst -docs/api/threadlocal.rst -docs/api/traversal.rst -docs/api/tweens.rst -docs/api/url.rst -docs/api/view.rst -docs/api/wsgi.rst -docs/authorintro.rst -docs/changes.rst -docs/conf.py -docs/conventions.rst -docs/convert_images.sh -docs/copyright.rst -docs/coversizing.py -docs/designdefense.rst -docs/foreword.rst -docs/glossary.rst -docs/index.rst -docs/latexindex.rst -docs/make_book -docs/make_epub -docs/make_pdf -docs/narr/MyProject/CHANGES.txt -docs/narr/MyProject/MANIFEST.in -docs/narr/MyProject/README.txt -docs/narr/MyProject/development.ini -docs/narr/MyProject/myproject/__init__.py -docs/narr/MyProject/myproject/static/favicon.ico -docs/narr/MyProject/myproject/static/footerbg.png -docs/narr/MyProject/myproject/static/headerbg.png -docs/narr/MyProject/myproject/static/ie6.css -docs/narr/MyProject/myproject/static/middlebg.png -docs/narr/MyProject/myproject/static/pylons.css -docs/narr/MyProject/myproject/static/pyramid-small.png -docs/narr/MyProject/myproject/static/pyramid.png -docs/narr/MyProject/myproject/static/transparent.gif -docs/narr/MyProject/myproject/templates/mytemplate.pt -docs/narr/MyProject/myproject/tests.py -docs/narr/MyProject/myproject/views.py -docs/narr/MyProject/production.ini -docs/narr/MyProject/setup.cfg -docs/narr/MyProject/setup.py -docs/narr/advconfig.rst -docs/narr/assets.rst -docs/narr/commandline.rst -docs/narr/configuration.rst -docs/narr/environment.rst -docs/narr/events.rst -docs/narr/extconfig.rst -docs/narr/extending.rst -docs/narr/firstapp.rst -docs/narr/hellotraversal.py -docs/narr/hellotraversal.rst -docs/narr/helloworld.py -docs/narr/hooks.rst -docs/narr/hybrid.rst -docs/narr/i18n.rst -docs/narr/install.rst -docs/narr/introduction.rst -docs/narr/introspector.rst -docs/narr/logging.rst -docs/narr/muchadoabouttraversal.rst -docs/narr/paste.rst -docs/narr/project-debug.png -docs/narr/project.png -docs/narr/project.rst -docs/narr/renderers.rst -docs/narr/resources.rst -docs/narr/resourcetreetraverser.png -docs/narr/router.png -docs/narr/router.rst -docs/narr/scaffolding.rst -docs/narr/security.rst -docs/narr/sessions.rst -docs/narr/startup.rst -docs/narr/subrequest.rst -docs/narr/tb_introspector.png -docs/narr/templates.rst -docs/narr/testing.rst -docs/narr/threadlocals.rst -docs/narr/traversal.rst -docs/narr/upgrading.rst -docs/narr/urldispatch.rst -docs/narr/vhosting.rst -docs/narr/viewconfig.rst -docs/narr/views.rst -docs/narr/webob.rst -docs/narr/zca.rst -docs/python-3.png -docs/remake -docs/tutorials/.gitignore -docs/tutorials/bfg/index.rst -docs/tutorials/modwsgi/index.rst -docs/tutorials/wiki/NOTE-relocatable.txt -docs/tutorials/wiki/authorization.rst -docs/tutorials/wiki/background.rst -docs/tutorials/wiki/basiclayout.rst -docs/tutorials/wiki/definingmodels.rst -docs/tutorials/wiki/definingviews.rst -docs/tutorials/wiki/design.rst -docs/tutorials/wiki/distributing.rst -docs/tutorials/wiki/index.rst -docs/tutorials/wiki/installation.rst -docs/tutorials/wiki/src/authorization/CHANGES.txt -docs/tutorials/wiki/src/authorization/MANIFEST.in -docs/tutorials/wiki/src/authorization/README.txt -docs/tutorials/wiki/src/authorization/development.ini -docs/tutorials/wiki/src/authorization/production.ini -docs/tutorials/wiki/src/authorization/setup.cfg -docs/tutorials/wiki/src/authorization/setup.py -docs/tutorials/wiki/src/authorization/tutorial/__init__.py -docs/tutorials/wiki/src/authorization/tutorial/models.py -docs/tutorials/wiki/src/authorization/tutorial/security.py -docs/tutorials/wiki/src/authorization/tutorial/static/favicon.ico -docs/tutorials/wiki/src/authorization/tutorial/static/footerbg.png -docs/tutorials/wiki/src/authorization/tutorial/static/headerbg.png -docs/tutorials/wiki/src/authorization/tutorial/static/ie6.css -docs/tutorials/wiki/src/authorization/tutorial/static/middlebg.png -docs/tutorials/wiki/src/authorization/tutorial/static/pylons.css -docs/tutorials/wiki/src/authorization/tutorial/static/pyramid-small.png -docs/tutorials/wiki/src/authorization/tutorial/static/pyramid.png -docs/tutorials/wiki/src/authorization/tutorial/static/transparent.gif -docs/tutorials/wiki/src/authorization/tutorial/templates/edit.pt -docs/tutorials/wiki/src/authorization/tutorial/templates/login.pt -docs/tutorials/wiki/src/authorization/tutorial/templates/mytemplate.pt -docs/tutorials/wiki/src/authorization/tutorial/templates/view.pt -docs/tutorials/wiki/src/authorization/tutorial/tests.py -docs/tutorials/wiki/src/authorization/tutorial/views.py -docs/tutorials/wiki/src/basiclayout/CHANGES.txt -docs/tutorials/wiki/src/basiclayout/MANIFEST.in -docs/tutorials/wiki/src/basiclayout/README.txt -docs/tutorials/wiki/src/basiclayout/development.ini -docs/tutorials/wiki/src/basiclayout/production.ini -docs/tutorials/wiki/src/basiclayout/setup.cfg -docs/tutorials/wiki/src/basiclayout/setup.py -docs/tutorials/wiki/src/basiclayout/tutorial/__init__.py -docs/tutorials/wiki/src/basiclayout/tutorial/models.py -docs/tutorials/wiki/src/basiclayout/tutorial/static/favicon.ico -docs/tutorials/wiki/src/basiclayout/tutorial/static/footerbg.png -docs/tutorials/wiki/src/basiclayout/tutorial/static/headerbg.png -docs/tutorials/wiki/src/basiclayout/tutorial/static/ie6.css -docs/tutorials/wiki/src/basiclayout/tutorial/static/middlebg.png -docs/tutorials/wiki/src/basiclayout/tutorial/static/pylons.css -docs/tutorials/wiki/src/basiclayout/tutorial/static/pyramid-small.png -docs/tutorials/wiki/src/basiclayout/tutorial/static/pyramid.png -docs/tutorials/wiki/src/basiclayout/tutorial/static/transparent.gif -docs/tutorials/wiki/src/basiclayout/tutorial/templates/mytemplate.pt -docs/tutorials/wiki/src/basiclayout/tutorial/tests.py -docs/tutorials/wiki/src/basiclayout/tutorial/views.py -docs/tutorials/wiki/src/models/CHANGES.txt -docs/tutorials/wiki/src/models/MANIFEST.in -docs/tutorials/wiki/src/models/README.txt -docs/tutorials/wiki/src/models/development.ini -docs/tutorials/wiki/src/models/production.ini -docs/tutorials/wiki/src/models/setup.cfg -docs/tutorials/wiki/src/models/setup.py -docs/tutorials/wiki/src/models/tutorial/__init__.py -docs/tutorials/wiki/src/models/tutorial/models.py -docs/tutorials/wiki/src/models/tutorial/static/favicon.ico -docs/tutorials/wiki/src/models/tutorial/static/footerbg.png -docs/tutorials/wiki/src/models/tutorial/static/headerbg.png -docs/tutorials/wiki/src/models/tutorial/static/ie6.css -docs/tutorials/wiki/src/models/tutorial/static/middlebg.png -docs/tutorials/wiki/src/models/tutorial/static/pylons.css -docs/tutorials/wiki/src/models/tutorial/static/pyramid-small.png -docs/tutorials/wiki/src/models/tutorial/static/pyramid.png -docs/tutorials/wiki/src/models/tutorial/static/transparent.gif -docs/tutorials/wiki/src/models/tutorial/templates/mytemplate.pt -docs/tutorials/wiki/src/models/tutorial/tests.py -docs/tutorials/wiki/src/models/tutorial/views.py -docs/tutorials/wiki/src/tests/CHANGES.txt -docs/tutorials/wiki/src/tests/MANIFEST.in -docs/tutorials/wiki/src/tests/README.txt -docs/tutorials/wiki/src/tests/development.ini -docs/tutorials/wiki/src/tests/production.ini -docs/tutorials/wiki/src/tests/setup.cfg -docs/tutorials/wiki/src/tests/setup.py -docs/tutorials/wiki/src/tests/tutorial/__init__.py -docs/tutorials/wiki/src/tests/tutorial/models.py -docs/tutorials/wiki/src/tests/tutorial/security.py -docs/tutorials/wiki/src/tests/tutorial/static/favicon.ico -docs/tutorials/wiki/src/tests/tutorial/static/footerbg.png -docs/tutorials/wiki/src/tests/tutorial/static/headerbg.png -docs/tutorials/wiki/src/tests/tutorial/static/ie6.css -docs/tutorials/wiki/src/tests/tutorial/static/middlebg.png -docs/tutorials/wiki/src/tests/tutorial/static/pylons.css -docs/tutorials/wiki/src/tests/tutorial/static/pyramid-small.png -docs/tutorials/wiki/src/tests/tutorial/static/pyramid.png -docs/tutorials/wiki/src/tests/tutorial/static/transparent.gif -docs/tutorials/wiki/src/tests/tutorial/templates/edit.pt -docs/tutorials/wiki/src/tests/tutorial/templates/login.pt -docs/tutorials/wiki/src/tests/tutorial/templates/mytemplate.pt -docs/tutorials/wiki/src/tests/tutorial/templates/view.pt -docs/tutorials/wiki/src/tests/tutorial/tests.py -docs/tutorials/wiki/src/tests/tutorial/views.py -docs/tutorials/wiki/src/views/CHANGES.txt -docs/tutorials/wiki/src/views/MANIFEST.in -docs/tutorials/wiki/src/views/README.txt -docs/tutorials/wiki/src/views/development.ini -docs/tutorials/wiki/src/views/production.ini -docs/tutorials/wiki/src/views/setup.cfg -docs/tutorials/wiki/src/views/setup.py -docs/tutorials/wiki/src/views/tutorial/__init__.py -docs/tutorials/wiki/src/views/tutorial/models.py -docs/tutorials/wiki/src/views/tutorial/static/favicon.ico -docs/tutorials/wiki/src/views/tutorial/static/footerbg.png -docs/tutorials/wiki/src/views/tutorial/static/headerbg.png -docs/tutorials/wiki/src/views/tutorial/static/ie6.css -docs/tutorials/wiki/src/views/tutorial/static/middlebg.png -docs/tutorials/wiki/src/views/tutorial/static/pylons.css -docs/tutorials/wiki/src/views/tutorial/static/pyramid-small.png -docs/tutorials/wiki/src/views/tutorial/static/pyramid.png -docs/tutorials/wiki/src/views/tutorial/static/transparent.gif -docs/tutorials/wiki/src/views/tutorial/templates/edit.pt -docs/tutorials/wiki/src/views/tutorial/templates/mytemplate.pt -docs/tutorials/wiki/src/views/tutorial/templates/view.pt -docs/tutorials/wiki/src/views/tutorial/tests.py -docs/tutorials/wiki/src/views/tutorial/views.py -docs/tutorials/wiki/tests.rst -docs/tutorials/wiki2/authorization.rst -docs/tutorials/wiki2/background.rst -docs/tutorials/wiki2/basiclayout.rst -docs/tutorials/wiki2/definingmodels.rst -docs/tutorials/wiki2/definingviews.rst -docs/tutorials/wiki2/design.rst -docs/tutorials/wiki2/distributing.rst -docs/tutorials/wiki2/index.rst -docs/tutorials/wiki2/installation.rst -docs/tutorials/wiki2/src/authorization/CHANGES.txt -docs/tutorials/wiki2/src/authorization/MANIFEST.in -docs/tutorials/wiki2/src/authorization/README.txt -docs/tutorials/wiki2/src/authorization/development.ini -docs/tutorials/wiki2/src/authorization/production.ini -docs/tutorials/wiki2/src/authorization/setup.cfg -docs/tutorials/wiki2/src/authorization/setup.py -docs/tutorials/wiki2/src/authorization/tutorial/__init__.py -docs/tutorials/wiki2/src/authorization/tutorial/models.py -docs/tutorials/wiki2/src/authorization/tutorial/scripts/__init__.py -docs/tutorials/wiki2/src/authorization/tutorial/scripts/initializedb.py -docs/tutorials/wiki2/src/authorization/tutorial/security.py -docs/tutorials/wiki2/src/authorization/tutorial/static/favicon.ico -docs/tutorials/wiki2/src/authorization/tutorial/static/footerbg.png -docs/tutorials/wiki2/src/authorization/tutorial/static/headerbg.png -docs/tutorials/wiki2/src/authorization/tutorial/static/ie6.css -docs/tutorials/wiki2/src/authorization/tutorial/static/middlebg.png -docs/tutorials/wiki2/src/authorization/tutorial/static/pylons.css -docs/tutorials/wiki2/src/authorization/tutorial/static/pyramid-small.png -docs/tutorials/wiki2/src/authorization/tutorial/static/pyramid.png -docs/tutorials/wiki2/src/authorization/tutorial/static/transparent.gif -docs/tutorials/wiki2/src/authorization/tutorial/templates/edit.pt -docs/tutorials/wiki2/src/authorization/tutorial/templates/login.pt -docs/tutorials/wiki2/src/authorization/tutorial/templates/mytemplate.pt -docs/tutorials/wiki2/src/authorization/tutorial/templates/view.pt -docs/tutorials/wiki2/src/authorization/tutorial/tests.py -docs/tutorials/wiki2/src/authorization/tutorial/views.py -docs/tutorials/wiki2/src/basiclayout/CHANGES.txt -docs/tutorials/wiki2/src/basiclayout/MANIFEST.in -docs/tutorials/wiki2/src/basiclayout/README.txt -docs/tutorials/wiki2/src/basiclayout/development.ini -docs/tutorials/wiki2/src/basiclayout/production.ini -docs/tutorials/wiki2/src/basiclayout/setup.cfg -docs/tutorials/wiki2/src/basiclayout/setup.py -docs/tutorials/wiki2/src/basiclayout/tutorial/__init__.py -docs/tutorials/wiki2/src/basiclayout/tutorial/models.py -docs/tutorials/wiki2/src/basiclayout/tutorial/scripts/__init__.py -docs/tutorials/wiki2/src/basiclayout/tutorial/scripts/initializedb.py -docs/tutorials/wiki2/src/basiclayout/tutorial/static/favicon.ico -docs/tutorials/wiki2/src/basiclayout/tutorial/static/footerbg.png -docs/tutorials/wiki2/src/basiclayout/tutorial/static/headerbg.png -docs/tutorials/wiki2/src/basiclayout/tutorial/static/ie6.css -docs/tutorials/wiki2/src/basiclayout/tutorial/static/middlebg.png -docs/tutorials/wiki2/src/basiclayout/tutorial/static/pylons.css -docs/tutorials/wiki2/src/basiclayout/tutorial/static/pyramid-small.png -docs/tutorials/wiki2/src/basiclayout/tutorial/static/pyramid.png -docs/tutorials/wiki2/src/basiclayout/tutorial/static/transparent.gif -docs/tutorials/wiki2/src/basiclayout/tutorial/templates/mytemplate.pt -docs/tutorials/wiki2/src/basiclayout/tutorial/tests.py -docs/tutorials/wiki2/src/basiclayout/tutorial/views.py -docs/tutorials/wiki2/src/models/CHANGES.txt -docs/tutorials/wiki2/src/models/MANIFEST.in -docs/tutorials/wiki2/src/models/README.txt -docs/tutorials/wiki2/src/models/development.ini -docs/tutorials/wiki2/src/models/production.ini -docs/tutorials/wiki2/src/models/setup.cfg -docs/tutorials/wiki2/src/models/setup.py -docs/tutorials/wiki2/src/models/tutorial/__init__.py -docs/tutorials/wiki2/src/models/tutorial/models.py -docs/tutorials/wiki2/src/models/tutorial/scripts/__init__.py -docs/tutorials/wiki2/src/models/tutorial/scripts/initializedb.py -docs/tutorials/wiki2/src/models/tutorial/static/favicon.ico -docs/tutorials/wiki2/src/models/tutorial/static/footerbg.png -docs/tutorials/wiki2/src/models/tutorial/static/headerbg.png -docs/tutorials/wiki2/src/models/tutorial/static/ie6.css -docs/tutorials/wiki2/src/models/tutorial/static/middlebg.png -docs/tutorials/wiki2/src/models/tutorial/static/pylons.css -docs/tutorials/wiki2/src/models/tutorial/static/pyramid-small.png -docs/tutorials/wiki2/src/models/tutorial/static/pyramid.png -docs/tutorials/wiki2/src/models/tutorial/static/transparent.gif -docs/tutorials/wiki2/src/models/tutorial/templates/mytemplate.pt -docs/tutorials/wiki2/src/models/tutorial/tests.py -docs/tutorials/wiki2/src/models/tutorial/views.py -docs/tutorials/wiki2/src/tests/CHANGES.txt -docs/tutorials/wiki2/src/tests/MANIFEST.in -docs/tutorials/wiki2/src/tests/README.txt -docs/tutorials/wiki2/src/tests/development.ini -docs/tutorials/wiki2/src/tests/production.ini -docs/tutorials/wiki2/src/tests/setup.cfg -docs/tutorials/wiki2/src/tests/setup.py -docs/tutorials/wiki2/src/tests/tutorial/__init__.py -docs/tutorials/wiki2/src/tests/tutorial/models.py -docs/tutorials/wiki2/src/tests/tutorial/scripts/__init__.py -docs/tutorials/wiki2/src/tests/tutorial/scripts/initializedb.py -docs/tutorials/wiki2/src/tests/tutorial/security.py -docs/tutorials/wiki2/src/tests/tutorial/static/favicon.ico -docs/tutorials/wiki2/src/tests/tutorial/static/footerbg.png -docs/tutorials/wiki2/src/tests/tutorial/static/headerbg.png -docs/tutorials/wiki2/src/tests/tutorial/static/ie6.css -docs/tutorials/wiki2/src/tests/tutorial/static/middlebg.png -docs/tutorials/wiki2/src/tests/tutorial/static/pylons.css -docs/tutorials/wiki2/src/tests/tutorial/static/pyramid-small.png -docs/tutorials/wiki2/src/tests/tutorial/static/pyramid.png -docs/tutorials/wiki2/src/tests/tutorial/static/transparent.gif -docs/tutorials/wiki2/src/tests/tutorial/templates/edit.pt -docs/tutorials/wiki2/src/tests/tutorial/templates/login.pt -docs/tutorials/wiki2/src/tests/tutorial/templates/mytemplate.pt -docs/tutorials/wiki2/src/tests/tutorial/templates/view.pt -docs/tutorials/wiki2/src/tests/tutorial/tests.py -docs/tutorials/wiki2/src/tests/tutorial/views.py -docs/tutorials/wiki2/src/views/CHANGES.txt -docs/tutorials/wiki2/src/views/MANIFEST.in -docs/tutorials/wiki2/src/views/README.txt -docs/tutorials/wiki2/src/views/development.ini -docs/tutorials/wiki2/src/views/production.ini -docs/tutorials/wiki2/src/views/setup.cfg -docs/tutorials/wiki2/src/views/setup.py -docs/tutorials/wiki2/src/views/tutorial/__init__.py -docs/tutorials/wiki2/src/views/tutorial/models.py -docs/tutorials/wiki2/src/views/tutorial/scripts/__init__.py -docs/tutorials/wiki2/src/views/tutorial/scripts/initializedb.py -docs/tutorials/wiki2/src/views/tutorial/static/favicon.ico -docs/tutorials/wiki2/src/views/tutorial/static/footerbg.png -docs/tutorials/wiki2/src/views/tutorial/static/headerbg.png -docs/tutorials/wiki2/src/views/tutorial/static/ie6.css -docs/tutorials/wiki2/src/views/tutorial/static/middlebg.png -docs/tutorials/wiki2/src/views/tutorial/static/pylons.css -docs/tutorials/wiki2/src/views/tutorial/static/pyramid-small.png -docs/tutorials/wiki2/src/views/tutorial/static/pyramid.png -docs/tutorials/wiki2/src/views/tutorial/static/transparent.gif -docs/tutorials/wiki2/src/views/tutorial/templates/edit.pt -docs/tutorials/wiki2/src/views/tutorial/templates/mytemplate.pt -docs/tutorials/wiki2/src/views/tutorial/templates/view.pt -docs/tutorials/wiki2/src/views/tutorial/tests.py -docs/tutorials/wiki2/src/views/tutorial/views.py -docs/tutorials/wiki2/tests.rst -docs/whatsnew-1.0.rst -docs/whatsnew-1.1.rst -docs/whatsnew-1.2.rst -docs/whatsnew-1.3.rst -docs/whatsnew-1.4.rst -pyramid/__init__.py -pyramid/asset.py -pyramid/authentication.py -pyramid/authorization.py -pyramid/chameleon_text.py -pyramid/chameleon_zpt.py -pyramid/compat.py -pyramid/config/__init__.py -pyramid/config/adapters.py -pyramid/config/assets.py -pyramid/config/factories.py -pyramid/config/i18n.py -pyramid/config/predicates.py -pyramid/config/rendering.py -pyramid/config/routes.py -pyramid/config/security.py -pyramid/config/settings.py -pyramid/config/testing.py -pyramid/config/tweens.py -pyramid/config/util.py -pyramid/config/views.py -pyramid/config/zca.py -pyramid/decorator.py -pyramid/encode.py -pyramid/events.py -pyramid/exceptions.py -pyramid/fixers/__init__.py -pyramid/fixers/fix_bfg_imports.py -pyramid/httpexceptions.py -pyramid/i18n.py -pyramid/interfaces.py -pyramid/location.py -pyramid/mako_templating.py -pyramid/paster.py -pyramid/path.py -pyramid/registry.py -pyramid/renderers.py -pyramid/request.py -pyramid/resource.py -pyramid/response.py -pyramid/router.py -pyramid/scaffolds/__init__.py -pyramid/scaffolds/alchemy/+package+/__init__.py -pyramid/scaffolds/alchemy/+package+/models.py -pyramid/scaffolds/alchemy/+package+/scripts/__init__.py -pyramid/scaffolds/alchemy/+package+/scripts/initializedb.py -pyramid/scaffolds/alchemy/+package+/static/favicon.ico -pyramid/scaffolds/alchemy/+package+/static/footerbg.png -pyramid/scaffolds/alchemy/+package+/static/headerbg.png -pyramid/scaffolds/alchemy/+package+/static/ie6.css -pyramid/scaffolds/alchemy/+package+/static/middlebg.png -pyramid/scaffolds/alchemy/+package+/static/pylons.css -pyramid/scaffolds/alchemy/+package+/static/pyramid-small.png -pyramid/scaffolds/alchemy/+package+/static/pyramid.png -pyramid/scaffolds/alchemy/+package+/static/transparent.gif -pyramid/scaffolds/alchemy/+package+/templates/mytemplate.pt_tmpl -pyramid/scaffolds/alchemy/+package+/tests.py_tmpl -pyramid/scaffolds/alchemy/+package+/views.py_tmpl -pyramid/scaffolds/alchemy/CHANGES.txt_tmpl -pyramid/scaffolds/alchemy/MANIFEST.in_tmpl -pyramid/scaffolds/alchemy/README.txt_tmpl -pyramid/scaffolds/alchemy/development.ini_tmpl -pyramid/scaffolds/alchemy/production.ini_tmpl -pyramid/scaffolds/alchemy/setup.cfg_tmpl -pyramid/scaffolds/alchemy/setup.py_tmpl -pyramid/scaffolds/copydir.py -pyramid/scaffolds/starter/+package+/__init__.py -pyramid/scaffolds/starter/+package+/static/favicon.ico -pyramid/scaffolds/starter/+package+/static/footerbg.png -pyramid/scaffolds/starter/+package+/static/headerbg.png -pyramid/scaffolds/starter/+package+/static/ie6.css -pyramid/scaffolds/starter/+package+/static/middlebg.png -pyramid/scaffolds/starter/+package+/static/pylons.css -pyramid/scaffolds/starter/+package+/static/pyramid-small.png -pyramid/scaffolds/starter/+package+/static/pyramid.png -pyramid/scaffolds/starter/+package+/static/transparent.gif -pyramid/scaffolds/starter/+package+/templates/mytemplate.pt_tmpl -pyramid/scaffolds/starter/+package+/tests.py_tmpl -pyramid/scaffolds/starter/+package+/views.py_tmpl -pyramid/scaffolds/starter/CHANGES.txt_tmpl -pyramid/scaffolds/starter/MANIFEST.in_tmpl -pyramid/scaffolds/starter/README.txt_tmpl -pyramid/scaffolds/starter/development.ini_tmpl -pyramid/scaffolds/starter/production.ini_tmpl -pyramid/scaffolds/starter/setup.cfg_tmpl -pyramid/scaffolds/starter/setup.py_tmpl -pyramid/scaffolds/template.py -pyramid/scaffolds/tests.py -pyramid/scaffolds/zodb/+package+/__init__.py -pyramid/scaffolds/zodb/+package+/models.py -pyramid/scaffolds/zodb/+package+/static/favicon.ico -pyramid/scaffolds/zodb/+package+/static/footerbg.png -pyramid/scaffolds/zodb/+package+/static/headerbg.png -pyramid/scaffolds/zodb/+package+/static/ie6.css -pyramid/scaffolds/zodb/+package+/static/middlebg.png -pyramid/scaffolds/zodb/+package+/static/pylons.css -pyramid/scaffolds/zodb/+package+/static/pyramid-small.png -pyramid/scaffolds/zodb/+package+/static/pyramid.png -pyramid/scaffolds/zodb/+package+/static/transparent.gif -pyramid/scaffolds/zodb/+package+/templates/mytemplate.pt -pyramid/scaffolds/zodb/+package+/tests.py_tmpl -pyramid/scaffolds/zodb/+package+/views.py_tmpl -pyramid/scaffolds/zodb/CHANGES.txt_tmpl -pyramid/scaffolds/zodb/MANIFEST.in_tmpl -pyramid/scaffolds/zodb/README.txt_tmpl -pyramid/scaffolds/zodb/development.ini_tmpl -pyramid/scaffolds/zodb/production.ini_tmpl -pyramid/scaffolds/zodb/setup.cfg_tmpl -pyramid/scaffolds/zodb/setup.py_tmpl -pyramid/scripting.py -pyramid/scripts/__init__.py -pyramid/scripts/common.py -pyramid/scripts/pcreate.py -pyramid/scripts/prequest.py -pyramid/scripts/proutes.py -pyramid/scripts/pserve.py -pyramid/scripts/pshell.py -pyramid/scripts/ptweens.py -pyramid/scripts/pviews.py -pyramid/security.py -pyramid/session.py -pyramid/settings.py -pyramid/static.py -pyramid/testing.py -pyramid/tests/__init__.py -pyramid/tests/fixtures/components.mak -pyramid/tests/fixtures/dummy.ini -pyramid/tests/fixtures/hello .world.mako -pyramid/tests/fixtures/hello_inherit_pkg.mak -pyramid/tests/fixtures/hellocompo.mak -pyramid/tests/fixtures/helloinherit.mak -pyramid/tests/fixtures/helloworld.mak -pyramid/tests/fixtures/helloworld.mako -pyramid/tests/fixtures/layout.mak -pyramid/tests/fixtures/minimal.pt -pyramid/tests/fixtures/minimal.txt -pyramid/tests/fixtures/nonminimal.mak -pyramid/tests/fixtures/nonminimal.txt -pyramid/tests/fixtures/pp.pt -pyramid/tests/fixtures/static/.hiddenfile -pyramid/tests/fixtures/static/arcs.svg.tgz -pyramid/tests/fixtures/static/index.html -pyramid/tests/fixtures/static/subdir/index.html -pyramid/tests/fixtures/withmacro.pt -pyramid/tests/pkgs/__init__.py -pyramid/tests/pkgs/ccbugapp/__init__.py -pyramid/tests/pkgs/conflictapp/__init__.py -pyramid/tests/pkgs/conflictapp/included.py -pyramid/tests/pkgs/defpermbugapp/__init__.py -pyramid/tests/pkgs/eventonly/__init__.py -pyramid/tests/pkgs/exceptionviewapp/__init__.py -pyramid/tests/pkgs/exceptionviewapp/models.py -pyramid/tests/pkgs/exceptionviewapp/views.py -pyramid/tests/pkgs/fixtureapp/__init__.py -pyramid/tests/pkgs/fixtureapp/models.py -pyramid/tests/pkgs/fixtureapp/subpackage/__init__.py -pyramid/tests/pkgs/fixtureapp/subpackage/templates/bar.pt -pyramid/tests/pkgs/fixtureapp/templates/fixture.pt -pyramid/tests/pkgs/fixtureapp/views.py -pyramid/tests/pkgs/forbiddenapp/__init__.py -pyramid/tests/pkgs/forbiddenview/__init__.py -pyramid/tests/pkgs/hybridapp/__init__.py -pyramid/tests/pkgs/hybridapp/views.py -pyramid/tests/pkgs/includeapp1/__init__.py -pyramid/tests/pkgs/includeapp1/root.py -pyramid/tests/pkgs/includeapp1/three.py -pyramid/tests/pkgs/includeapp1/two.py -pyramid/tests/pkgs/localeapp/__init__.py -pyramid/tests/pkgs/localeapp/locale/GARBAGE -pyramid/tests/pkgs/localeapp/locale/be/LC_MESSAGES -pyramid/tests/pkgs/localeapp/locale/de/LC_MESSAGES/deformsite.mo -pyramid/tests/pkgs/localeapp/locale/de/LC_MESSAGES/deformsite.po -pyramid/tests/pkgs/localeapp/locale/de_DE/LC_MESSAGES/deformsite.mo -pyramid/tests/pkgs/localeapp/locale/de_DE/LC_MESSAGES/deformsite.po -pyramid/tests/pkgs/localeapp/locale/en/LC_MESSAGES/deformsite.mo -pyramid/tests/pkgs/localeapp/locale/en/LC_MESSAGES/deformsite.po -pyramid/tests/pkgs/localeapp/locale2/GARBAGE -pyramid/tests/pkgs/localeapp/locale2/be/LC_MESSAGES -pyramid/tests/pkgs/localeapp/locale2/de/LC_MESSAGES/deformsite.mo -pyramid/tests/pkgs/localeapp/locale2/de/LC_MESSAGES/deformsite.po -pyramid/tests/pkgs/localeapp/locale2/en/LC_MESSAGES/deformsite.mo -pyramid/tests/pkgs/localeapp/locale2/en/LC_MESSAGES/deformsite.po -pyramid/tests/pkgs/localeapp/locale3/GARBAGE -pyramid/tests/pkgs/localeapp/locale3/be/LC_MESSAGES -pyramid/tests/pkgs/localeapp/locale3/de/LC_MESSAGES/deformsite.mo -pyramid/tests/pkgs/localeapp/locale3/de/LC_MESSAGES/deformsite.po -pyramid/tests/pkgs/localeapp/locale3/en/LC_MESSAGES/deformsite.mo -pyramid/tests/pkgs/localeapp/locale3/en/LC_MESSAGES/deformsite.po -pyramid/tests/pkgs/notfoundview/__init__.py -pyramid/tests/pkgs/permbugapp/__init__.py -pyramid/tests/pkgs/rendererscanapp/__init__.py -pyramid/tests/pkgs/rendererscanapp/one.pt -pyramid/tests/pkgs/rendererscanapp/two/__init__.py -pyramid/tests/pkgs/rendererscanapp/two/two.pt -pyramid/tests/pkgs/restbugapp/__init__.py -pyramid/tests/pkgs/restbugapp/views.py -pyramid/tests/pkgs/static_abspath/__init__.py -pyramid/tests/pkgs/static_assetspec/__init__.py -pyramid/tests/pkgs/static_routeprefix/__init__.py -pyramid/tests/pkgs/staticpermapp/__init__.py -pyramid/tests/pkgs/subrequestapp/__init__.py -pyramid/tests/pkgs/viewdecoratorapp/__init__.py -pyramid/tests/pkgs/viewdecoratorapp/views/__init__.py -pyramid/tests/pkgs/viewdecoratorapp/views/templates/foo.pt -pyramid/tests/pkgs/viewdecoratorapp/views/views.py -pyramid/tests/pkgs/wsgiapp2app/__init__.py -pyramid/tests/test_asset.py -pyramid/tests/test_authentication.py -pyramid/tests/test_authorization.py -pyramid/tests/test_chameleon_text.py -pyramid/tests/test_chameleon_zpt.py -pyramid/tests/test_config/__init__.py -pyramid/tests/test_config/files/assets/dummy.txt -pyramid/tests/test_config/files/minimal.pt -pyramid/tests/test_config/path/scanerror/__init__.py -pyramid/tests/test_config/path/scanerror/will_raise_error.py -pyramid/tests/test_config/pkgs/__init__.py -pyramid/tests/test_config/pkgs/asset/__init__.py -pyramid/tests/test_config/pkgs/asset/models.py -pyramid/tests/test_config/pkgs/asset/subpackage/__init__.py -pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt -pyramid/tests/test_config/pkgs/asset/templates/fixture.pt -pyramid/tests/test_config/pkgs/asset/views.py -pyramid/tests/test_config/pkgs/scanextrakw/__init__.py -pyramid/tests/test_config/pkgs/scannable/__init__.py -pyramid/tests/test_config/pkgs/scannable/another.py -pyramid/tests/test_config/pkgs/scannable/pod/notinit.py -pyramid/tests/test_config/pkgs/scannable/subpackage/__init__.py -pyramid/tests/test_config/pkgs/scannable/subpackage/notinit.py -pyramid/tests/test_config/pkgs/scannable/subpackage/subsubpackage/__init__.py -pyramid/tests/test_config/pkgs/selfscan/__init__.py -pyramid/tests/test_config/pkgs/selfscan/another.py -pyramid/tests/test_config/test_adapters.py -pyramid/tests/test_config/test_assets.py -pyramid/tests/test_config/test_factories.py -pyramid/tests/test_config/test_i18n.py -pyramid/tests/test_config/test_init.py -pyramid/tests/test_config/test_predicates.py -pyramid/tests/test_config/test_rendering.py -pyramid/tests/test_config/test_routes.py -pyramid/tests/test_config/test_security.py -pyramid/tests/test_config/test_settings.py -pyramid/tests/test_config/test_testing.py -pyramid/tests/test_config/test_tweens.py -pyramid/tests/test_config/test_util.py -pyramid/tests/test_config/test_views.py -pyramid/tests/test_decorator.py -pyramid/tests/test_docs.py -pyramid/tests/test_encode.py -pyramid/tests/test_events.py -pyramid/tests/test_exceptions.py -pyramid/tests/test_httpexceptions.py -pyramid/tests/test_i18n.py -pyramid/tests/test_integration.py -pyramid/tests/test_location.py -pyramid/tests/test_mako_templating.py -pyramid/tests/test_paster.py -pyramid/tests/test_path.py -pyramid/tests/test_registry.py -pyramid/tests/test_renderers.py -pyramid/tests/test_request.py -pyramid/tests/test_response.py -pyramid/tests/test_router.py -pyramid/tests/test_scaffolds/__init__.py -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/.badfile -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/__init__.py_tmpl -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/resources.py -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/favicon.ico -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/footerbg.png -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/headerbg.png -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/ie6.css -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/middlebg.png -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/pylons.css -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/pyramid-small.png -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/pyramid.png -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/transparent.gif -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/templates/mytemplate.pt_tmpl -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/test_no_content.py_tmpl -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/tests.py_tmpl -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/views.py_tmpl -pyramid/tests/test_scaffolds/fixture_scaffold/CHANGES.txt_tmpl -pyramid/tests/test_scaffolds/fixture_scaffold/MANIFEST.in_tmpl -pyramid/tests/test_scaffolds/fixture_scaffold/README.txt_tmpl -pyramid/tests/test_scaffolds/fixture_scaffold/development.ini_tmpl -pyramid/tests/test_scaffolds/fixture_scaffold/production.ini_tmpl -pyramid/tests/test_scaffolds/fixture_scaffold/setup.cfg_tmpl -pyramid/tests/test_scaffolds/fixture_scaffold/setup.py_tmpl -pyramid/tests/test_scaffolds/test_copydir.py -pyramid/tests/test_scaffolds/test_init.py -pyramid/tests/test_scaffolds/test_template.py -pyramid/tests/test_scripting.py -pyramid/tests/test_scripts/__init__.py -pyramid/tests/test_scripts/dummy.py -pyramid/tests/test_scripts/test_common.py -pyramid/tests/test_scripts/test_pcreate.py -pyramid/tests/test_scripts/test_prequest.py -pyramid/tests/test_scripts/test_proutes.py -pyramid/tests/test_scripts/test_pserve.py -pyramid/tests/test_scripts/test_pshell.py -pyramid/tests/test_scripts/test_ptweens.py -pyramid/tests/test_scripts/test_pviews.py -pyramid/tests/test_security.py -pyramid/tests/test_session.py -pyramid/tests/test_settings.py -pyramid/tests/test_static.py -pyramid/tests/test_testing.py -pyramid/tests/test_threadlocal.py -pyramid/tests/test_traversal.py -pyramid/tests/test_url.py -pyramid/tests/test_urldispatch.py -pyramid/tests/test_util.py -pyramid/tests/test_view.py -pyramid/tests/test_wsgi.py -pyramid/threadlocal.py -pyramid/traversal.py -pyramid/tweens.py -pyramid/url.py -pyramid/urldispatch.py -pyramid/util.py -pyramid/view.py -pyramid/wsgi.py -rtd.txt -setup.cfg -setup.py -tox.ini diff --git a/pyramid/scripts/prequest.py b/pyramid/scripts/prequest.py index 82380b8ca..8628d5a5a 100644 --- a/pyramid/scripts/prequest.py +++ b/pyramid/scripts/prequest.py @@ -1,3 +1,4 @@ +import base64 import optparse import sys import textwrap @@ -18,9 +19,22 @@ class PRequestCommand(object): This command makes an artifical request to a web application that uses a PasteDeploy (.ini) configuration file for the server and application. - Use "prequest config.ini /path" to request "/path". Use "prequest - --method=POST config.ini /path < data" to do a POST with the given - request body. + Use "prequest config.ini /path" to request "/path". + + Use "prequest --method=POST config.ini /path < data" to do a POST with + the given request body. + + Use "prequest --method=PUT config.ini /path < data" to do a + PUT with the given request body. + + Use "prequest --method=PATCH config.ini /path < data" to do a + PATCH with the given request body. + + Use "prequest --method=OPTIONS config.ini /path" to do an + OPTIONS request. + + Use "prequest --method=PROPFIND config.ini /path" to do a + PROPFIND request. If the path is relative (doesn't begin with "/") it is interpreted as relative to "/". The path passed to this script should be URL-quoted. @@ -59,9 +73,17 @@ class PRequestCommand(object): parser.add_option( '-m', '--method', dest='method', - choices=['GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE'], + choices=['GET', 'HEAD', 'POST', 'PUT', 'PATCH','DELETE', + 'PROPFIND', 'OPTIONS'], type='choice', - help='Request method type', + help='Request method type (GET, POST, PUT, PATCH, DELETE, ' + 'PROPFIND, OPTIONS)', + ) + parser.add_option( + '-l', '--login', + dest='login', + type='string', + help='HTTP basic auth username:password pair', ) get_app = staticmethod(get_app) @@ -92,6 +114,10 @@ class PRequestCommand(object): path = url_unquote(path) headers = {} + if self.options.login: + enc = base64.b64encode(self.options.login.encode('ascii')) + headers['Authorization'] = 'Basic ' + enc.decode('ascii') + if self.options.headers: for item in self.options.headers: if ':' not in item: @@ -110,9 +136,9 @@ class PRequestCommand(object): environ = { 'REQUEST_METHOD': request_method, 'SCRIPT_NAME': '', # may be empty if app is at the root - 'PATH_INFO': path, + 'PATH_INFO': path, 'SERVER_NAME': 'localhost', # always mandatory - 'SERVER_PORT': '80', # always mandatory + 'SERVER_PORT': '80', # always mandatory 'SERVER_PROTOCOL': 'HTTP/1.0', 'CONTENT_TYPE': 'text/plain', 'REMOTE_ADDR':'127.0.0.1', diff --git a/pyramid/tests/test_scripts/test_prequest.py b/pyramid/tests/test_scripts/test_prequest.py index 64a7c3045..37f1d3c0f 100644 --- a/pyramid/tests/test_scripts/test_prequest.py +++ b/pyramid/tests/test_scripts/test_prequest.py @@ -68,6 +68,19 @@ class TestPRequestCommand(unittest.TestCase): self.assertEqual(self._app_name, None) self.assertEqual(self._out, ['abc']) + def test_command_w_basic_auth(self): + command = self._makeOne( + ['', '--login=user:password', + '--header=name:value','development.ini', '/']) + command.run() + self.assertEqual(self._environ['HTTP_NAME'], 'value') + self.assertEqual(self._environ['HTTP_AUTHORIZATION'], + 'Basic dXNlcjpwYXNzd29yZA==') + self.assertEqual(self._path_info, '/') + self.assertEqual(self._spec, 'development.ini') + self.assertEqual(self._app_name, None) + self.assertEqual(self._out, ['abc']) + def test_command_has_content_type_header_var(self): command = self._makeOne( ['', '--header=content-type:app/foo','development.ini', '/']) @@ -96,6 +109,7 @@ class TestPRequestCommand(unittest.TestCase): def test_command_method_get(self): command = self._makeOne(['', '--method=GET', 'development.ini', '/']) command.run() + self.assertEqual(self._environ['REQUEST_METHOD'], 'GET') self.assertEqual(self._path_info, '/') self.assertEqual(self._spec, 'development.ini') self.assertEqual(self._app_name, None) @@ -107,6 +121,7 @@ class TestPRequestCommand(unittest.TestCase): stdin = NativeIO() command.stdin = stdin command.run() + self.assertEqual(self._environ['REQUEST_METHOD'], 'POST') self.assertEqual(self._environ['CONTENT_LENGTH'], '-1') self.assertEqual(self._environ['wsgi.input'], stdin) self.assertEqual(self._path_info, '/') @@ -120,6 +135,7 @@ class TestPRequestCommand(unittest.TestCase): stdin = NativeIO() command.stdin = stdin command.run() + self.assertEqual(self._environ['REQUEST_METHOD'], 'PUT') self.assertEqual(self._environ['CONTENT_LENGTH'], '-1') self.assertEqual(self._environ['wsgi.input'], stdin) self.assertEqual(self._path_info, '/') @@ -133,6 +149,7 @@ class TestPRequestCommand(unittest.TestCase): stdin = NativeIO() command.stdin = stdin command.run() + self.assertEqual(self._environ['REQUEST_METHOD'], 'PATCH') self.assertEqual(self._environ['CONTENT_LENGTH'], '-1') self.assertEqual(self._environ['wsgi.input'], stdin) self.assertEqual(self._path_info, '/') @@ -140,6 +157,32 @@ class TestPRequestCommand(unittest.TestCase): self.assertEqual(self._app_name, None) self.assertEqual(self._out, ['abc']) + def test_command_method_propfind(self): + from pyramid.compat import NativeIO + command = self._makeOne(['', '--method=PROPFIND', 'development.ini', + '/']) + stdin = NativeIO() + command.stdin = stdin + command.run() + self.assertEqual(self._environ['REQUEST_METHOD'], 'PROPFIND') + self.assertEqual(self._path_info, '/') + self.assertEqual(self._spec, 'development.ini') + self.assertEqual(self._app_name, None) + self.assertEqual(self._out, ['abc']) + + def test_command_method_options(self): + from pyramid.compat import NativeIO + command = self._makeOne(['', '--method=OPTIONS', 'development.ini', + '/']) + stdin = NativeIO() + command.stdin = stdin + command.run() + self.assertEqual(self._environ['REQUEST_METHOD'], 'OPTIONS') + self.assertEqual(self._path_info, '/') + self.assertEqual(self._spec, 'development.ini') + self.assertEqual(self._app_name, None) + self.assertEqual(self._out, ['abc']) + def test_command_with_query_string(self): command = self._makeOne(['', 'development.ini', '/abc?a=1&b=2&c']) command.run() diff --git a/pyramid/url.py b/pyramid/url.py index 84b58ac45..83f0d1eab 100644 --- a/pyramid/url.py +++ b/pyramid/url.py @@ -387,7 +387,7 @@ class URLMethodsMixin(object): resulting url of a resource that has a path of ``/baz/bar`` will be ``http://foo/baz/bar``. If you want to generate completely relative URLs with no leading scheme, host, port, or initial path, you can - pass ``app_url=''`. Passing ``app_url=''` when the resource path is + pass ``app_url=''``. Passing ``app_url=''`` when the resource path is ``/baz/bar`` will return ``/baz/bar``. .. versionadded:: 1.3 |
