summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2015-09-02 08:34:55 -0700
committerChris McDonough <chrism@plope.com>2015-09-02 08:34:55 -0700
commitb9b68fed103b18a19a0c0935365abbdd4a720dbc (patch)
treed130a2ea14b2f5d3728ff53c02bba8773799b62d
parent94853b4af2ce3e7d57c9eda4d997a696cdc82da5 (diff)
parentf17b973ea66b7ffb2afb03da2c559e55c22fe3ee (diff)
downloadpyramid-b9b68fed103b18a19a0c0935365abbdd4a720dbc.tar.gz
pyramid-b9b68fed103b18a19a0c0935365abbdd4a720dbc.tar.bz2
pyramid-b9b68fed103b18a19a0c0935365abbdd4a720dbc.zip
Merge branch 'master' of github.com:Pylons/pyramid
-rw-r--r--CHANGES.txt5
-rw-r--r--docs/conf.py41
-rw-r--r--docs/narr/i18n.rst7
-rw-r--r--docs/narr/scaffolding.rst5
-rw-r--r--docs/quick_tutorial/authentication.rst3
-rw-r--r--docs/quick_tutorial/authorization.rst3
-rw-r--r--pyramid/httpexceptions.py11
-rw-r--r--pyramid/tests/test_httpexceptions.py4
-rw-r--r--pyramid/tests/test_session.py13
9 files changed, 51 insertions, 41 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index 9ed486b26..98fa7f85a 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -201,6 +201,11 @@ Bug Fixes
default to an iterable instead of ``None``. It may be checked for a length
of 0. This was the behavior in 1.5.
+- ``pyramid.httpexceptions.HTTPException`` now defaults to
+ ``520 Unknown Error`` instead of ``None None`` to conform with changes in
+ WebOb 1.5.
+ See https://github.com/Pylons/pyramid/pull/1865
+
Deprecations
------------
diff --git a/docs/conf.py b/docs/conf.py
index 11e42c5f3..8a9bac6ed 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -58,37 +58,24 @@ extensions = [
# Looks for objects in external projects
intersphinx_mapping = {
- 'tutorials': ('http://docs.pylonsproject.org/projects/pyramid-tutorials/en/latest/', None),
+ 'colander': ( 'http://docs.pylonsproject.org/projects/colander/en/latest', None),
'cookbook': ('http://docs.pylonsproject.org/projects/pyramid-cookbook/en/latest/', None),
+ 'deform': ('http://docs.pylonsproject.org/projects/deform/en/latest', None),
'jinja2': ('http://docs.pylonsproject.org/projects/pyramid-jinja2/en/latest/', None),
- 'tm': (
- 'http://docs.pylonsproject.org/projects/pyramid_tm/en/latest/',
- None,
- ),
- 'zcomponent': ('http://docs.zope.org/zope.component', None),
- 'webtest': ('http://webtest.pythonpaste.org/en/latest', None),
- 'webob': ('http://docs.webob.org/en/latest', None),
- 'colander': (
- 'http://docs.pylonsproject.org/projects/colander/en/latest',
- None),
- 'deform': (
- 'http://docs.pylonsproject.org/projects/deform/en/latest',
- None),
- 'sqla': ('http://docs.sqlalchemy.org/en/latest', None),
- 'who': ('http://repozewho.readthedocs.org/en/latest', None),
+ 'pylonswebframework': ('http://docs.pylonsproject.org/projects/pylons-webframework/en/latest/', None),
'python': ('http://docs.python.org', None),
'python3': ('http://docs.python.org/3', None),
- 'tstring':
- ('http://docs.pylonsproject.org/projects/translationstring/en/latest',
- None),
- 'venusian':
- ('http://docs.pylonsproject.org/projects/venusian/en/latest', None),
- 'toolbar':
- ('http://docs.pylonsproject.org/projects/pyramid-debugtoolbar/en/latest',
- None),
- 'zcml':
- ('http://docs.pylonsproject.org/projects/pyramid-zcml/en/latest',
- None),
+ 'sqla': ('http://docs.sqlalchemy.org/en/latest', None),
+ 'tm': ('http://docs.pylonsproject.org/projects/pyramid_tm/en/latest/', None),
+ 'toolbar': ('http://docs.pylonsproject.org/projects/pyramid-debugtoolbar/en/latest', None),
+ 'tstring': ('http://docs.pylonsproject.org/projects/translationstring/en/latest', None),
+ 'tutorials': ('http://docs.pylonsproject.org/projects/pyramid-tutorials/en/latest/', None),
+ 'venusian': ('http://docs.pylonsproject.org/projects/venusian/en/latest', None),
+ 'webob': ('http://docs.webob.org/en/latest', None),
+ 'webtest': ('http://webtest.pythonpaste.org/en/latest', None),
+ 'who': ('http://repozewho.readthedocs.org/en/latest', None),
+ 'zcml': ('http://docs.pylonsproject.org/projects/pyramid-zcml/en/latest', None),
+ 'zcomponent': ('http://docs.zope.org/zope.component', None),
}
diff --git a/docs/narr/i18n.rst b/docs/narr/i18n.rst
index 3c804a158..8d81418d9 100644
--- a/docs/narr/i18n.rst
+++ b/docs/narr/i18n.rst
@@ -219,10 +219,9 @@ by creating various kinds of gettext files.
The steps a developer must take to work with :term:`gettext`
:term:`message catalog` files within a :app:`Pyramid`
application are very similar to the steps a :term:`Pylons`
- developer must take to do the same. See the `Pylons
- internationalization documentation
- <http://wiki.pylonshq.com/display/pylonsdocs/Internationalization+and+Localization>`_
- for more information.
+ developer must take to do the same. See the :ref:`Pylons
+ Internationalization and Localization documentation
+ <pylonswebframework:i18n>` for more information.
GNU gettext uses three types of files in the translation framework,
``.pot`` files, ``.po`` files and ``.mo`` files.
diff --git a/docs/narr/scaffolding.rst b/docs/narr/scaffolding.rst
index f924d0d62..4fcdeb537 100644
--- a/docs/narr/scaffolding.rst
+++ b/docs/narr/scaffolding.rst
@@ -57,6 +57,11 @@ As you create files and directories within the template directory, note that:
have that string replaced with the value of the ``var`` variable provided
to the scaffold.
+- Files that start with a dot (e.g., ``.env``) are ignored and will not be
+ copied over to the destination directory. If you want to include a file with
+ a leading dot then you must replace the dot with ``+dot+`` (e.g.,
+ ``+dot+env``).
+
Otherwise, files and directories which live in the template directory will be
copied directly without modification to the ``pcreate`` output location.
diff --git a/docs/quick_tutorial/authentication.rst b/docs/quick_tutorial/authentication.rst
index a4ab83c45..7fd8173d4 100644
--- a/docs/quick_tutorial/authentication.rst
+++ b/docs/quick_tutorial/authentication.rst
@@ -123,9 +123,6 @@ Extra Credit
#. Can I use a database behind my ``groupfinder`` to look up principals?
-#. Do I have to put a ``renderer`` in my ``@forbidden_view_config``
- decorator?
-
#. Once I am logged in, does any user-centric information get jammed
onto each request? Use ``import pdb; pdb.set_trace()`` to answer
this.
diff --git a/docs/quick_tutorial/authorization.rst b/docs/quick_tutorial/authorization.rst
index 08df15a28..855043f7f 100644
--- a/docs/quick_tutorial/authorization.rst
+++ b/docs/quick_tutorial/authorization.rst
@@ -101,6 +101,9 @@ by decorating the view with ``@forbidden_view_config``.
Extra Credit
============
+#. Do I have to put a ``renderer`` in my ``@forbidden_view_config``
+ decorator?
+
#. Perhaps you would like the experience of not having enough permissions
(forbidden) to be richer. How could you change this?
diff --git a/pyramid/httpexceptions.py b/pyramid/httpexceptions.py
index 93d06e0d6..8bf9a0a72 100644
--- a/pyramid/httpexceptions.py
+++ b/pyramid/httpexceptions.py
@@ -160,6 +160,13 @@ class HTTPException(Response, Exception):
# title = 'OK'
# explanation = 'why this happens'
# body_template_obj = Template('response template')
+ #
+ # This class itself uses the error code "520" with the error message/title
+ # of "Unknown Error". This is not an RFC standard, however it is
+ # implemented in practice. Sub-classes should be overriding the default
+ # values and 520 should not be seen in the wild from Pyramid applications.
+ # Due to changes in WebOb, a code of "None" is not valid, and WebOb due to
+ # more strict error checking rejects it now.
# differences from webob.exc.WSGIHTTPException:
#
@@ -178,8 +185,8 @@ class HTTPException(Response, Exception):
#
# - documentation improvements (Pyramid-specific docstrings where necessary)
#
- code = None
- title = None
+ code = 520
+ title = 'Unknown Error'
explanation = ''
body_template_obj = Template('''\
${explanation}${br}${br}
diff --git a/pyramid/tests/test_httpexceptions.py b/pyramid/tests/test_httpexceptions.py
index c700dc80e..b94ef30e4 100644
--- a/pyramid/tests/test_httpexceptions.py
+++ b/pyramid/tests/test_httpexceptions.py
@@ -120,7 +120,7 @@ class TestHTTPException(unittest.TestCase):
def test_ctor_calls_Response_ctor(self):
exc = self._makeOne('message')
- self.assertEqual(exc.status, 'None None')
+ self.assertEqual(exc.status, '520 Unknown Error')
def test_ctor_extends_headers(self):
exc = self._makeOne(headers=[('X-Foo', 'foo')])
@@ -329,7 +329,7 @@ class Test_HTTPMove(unittest.TestCase):
start_response = DummyStartResponse()
app_iter = exc(environ, start_response)
self.assertEqual(app_iter[0],
- (b'None None\n\nThe resource has been moved to foo; '
+ (b'520 Unknown Error\n\nThe resource has been moved to foo; '
b'you should be redirected automatically.\n\n'))
class TestHTTPForbidden(unittest.TestCase):
diff --git a/pyramid/tests/test_session.py b/pyramid/tests/test_session.py
index b013ffa66..eac6593d9 100644
--- a/pyramid/tests/test_session.py
+++ b/pyramid/tests/test_session.py
@@ -1,3 +1,4 @@
+import base64
import json
import unittest
from pyramid import testing
@@ -277,7 +278,7 @@ class TestBaseCookieSession(SharedCookieSessionTests, unittest.TestCase):
return BaseCookieSessionFactory(serializer, **kw)(request)
def _serialize(self, value):
- return json.dumps(value)
+ return base64.b64encode(json.dumps(value).encode('utf-8'))
def test_reissue_not_triggered(self):
import time
@@ -650,10 +651,16 @@ class Test_check_csrf_token(unittest.TestCase):
class DummySerializer(object):
def dumps(self, value):
- return json.dumps(value).encode('utf-8')
+ return base64.b64encode(json.dumps(value).encode('utf-8'))
def loads(self, value):
- return json.loads(value.decode('utf-8'))
+ try:
+ return json.loads(base64.b64decode(value).decode('utf-8'))
+
+ # base64.b64decode raises a TypeError on py2 instead of a ValueError
+ # and a ValueError is required for the session to handle it properly
+ except TypeError:
+ raise ValueError
class DummySessionFactory(dict):
_dirty = False