summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Piercy <web@stevepiercy.com>2017-06-10 12:50:20 -0700
committerSteve Piercy <web@stevepiercy.com>2017-06-10 12:50:20 -0700
commit8cbd2355d45fa6b1d6495564d0c12f646b860803 (patch)
tree80d9cbd2612597b454e13a64eb8a6f8e1641ef92
parentd07c3a0e91a6f9d96e80c36e40470a83383a656c (diff)
parenta503511cf82ab1db8c66eb949eeb30da92dd621f (diff)
downloadpyramid-8cbd2355d45fa6b1d6495564d0c12f646b860803.tar.gz
pyramid-8cbd2355d45fa6b1d6495564d0c12f646b860803.tar.bz2
pyramid-8cbd2355d45fa6b1d6495564d0c12f646b860803.zip
Merge remote-tracking branch 'upstream/master'
-rw-r--r--CHANGES.txt4
-rw-r--r--CONTRIBUTORS.txt2
-rw-r--r--docs/narr/install.rst4
-rw-r--r--docs/quick_tour/sqla_demo/sqla_demo/models/__init__.py2
-rw-r--r--docs/tutorials/wiki2/definingmodels.rst2
-rw-r--r--docs/tutorials/wiki2/src/authentication/tutorial/models/__init__.py1
-rw-r--r--docs/tutorials/wiki2/src/authorization/tutorial/models/__init__.py1
-rw-r--r--docs/tutorials/wiki2/src/basiclayout/tutorial/models/__init__.py1
-rw-r--r--docs/tutorials/wiki2/src/installation/tutorial/models/__init__.py1
-rw-r--r--docs/tutorials/wiki2/src/models/tutorial/__init__.py2
-rw-r--r--docs/tutorials/wiki2/src/models/tutorial/models/__init__.py1
-rw-r--r--docs/tutorials/wiki2/src/tests/tutorial/models/__init__.py1
-rw-r--r--docs/tutorials/wiki2/src/views/tutorial/models/__init__.py1
-rw-r--r--pyramid/authentication.py10
-rw-r--r--pyramid/scaffolds/alchemy/+package+/models/__init__.py_tmpl1
-rw-r--r--pyramid/scaffolds/zodb/+package+/__init__.py2
-rw-r--r--pyramid/security.py5
-rw-r--r--pyramid/tests/test_security.py24
-rw-r--r--pyramid/view.py2
19 files changed, 55 insertions, 12 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index 06bb71c1e..1402045d4 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -17,6 +17,10 @@ unreleased
invoked from ``request.invoke_exception_view``.
See https://github.com/Pylons/pyramid/pull/3060
+- Fix a bug in which ``pyramid.security.ALL_PERMISSIONS`` failed to return
+ a valid iterator in its ``__iter__`` implementation.
+ See https://github.com/Pylons/pyramid/pull/3074
+
1.9a2 (2017-05-09)
==================
diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt
index cbee08d0d..445536e9e 100644
--- a/CONTRIBUTORS.txt
+++ b/CONTRIBUTORS.txt
@@ -302,3 +302,5 @@ Contributors
- Jeremy(Ching-Rui) Chen, 2017/04/19
- Fang-Pen Lin, 2017/05/22
+
+- Volker Diels-Grabsch, 2017/06/09
diff --git a/docs/narr/install.rst b/docs/narr/install.rst
index 2a25ad84d..c2bd00bff 100644
--- a/docs/narr/install.rst
+++ b/docs/narr/install.rst
@@ -206,9 +206,7 @@ After installing Python as described previously in :ref:`for-mac-os-x-users` or
``$VENV/bin/pip`` clearly specifies that ``pip`` is run from within the
virtual environment and not at the system level.
- ``activate`` drops turds into the user's shell environment, leaving them
- vulnerable to executing commands in the wrong context. ``deactivate`` might
- not correctly restore previous shell environment variables.
+ ``activate`` makes changes to the user's shell environment which can often be convenient. However, in the context of long-form documentation, environment configuration can easily be forgotten. By keeping each snippet explicit we can reduce copy / paste errors by users in which commands are executed against the wrong Python environment. Also, ``deactivate`` might not correctly restore previous shell environment variables. Avoiding ``activate`` keeps the environment more reproducible.
Although using ``source bin/activate``, then ``pip``, requires fewer key
strokes to issue commands once invoked, there are other things to consider.
diff --git a/docs/quick_tour/sqla_demo/sqla_demo/models/__init__.py b/docs/quick_tour/sqla_demo/sqla_demo/models/__init__.py
index 339326758..e6eb98fbd 100644
--- a/docs/quick_tour/sqla_demo/sqla_demo/models/__init__.py
+++ b/docs/quick_tour/sqla_demo/sqla_demo/models/__init__.py
@@ -57,7 +57,7 @@ def includeme(config):
"""
settings = config.get_settings()
-
+ settings['tm.manager_hook'] = 'pyramid_tm.explicit_manager'
# use pyramid_tm to hook the transaction lifecycle to the request
config.include('pyramid_tm')
diff --git a/docs/tutorials/wiki2/definingmodels.rst b/docs/tutorials/wiki2/definingmodels.rst
index 5cebb943c..801b56eb4 100644
--- a/docs/tutorials/wiki2/definingmodels.rst
+++ b/docs/tutorials/wiki2/definingmodels.rst
@@ -153,7 +153,7 @@ the following:
.. literalinclude:: src/models/tutorial/models/__init__.py
:linenos:
:language: py
- :emphasize-lines: 8,9
+ :emphasize-lines: 10,11
Here we align our imports with the names of the models, ``Page`` and ``User``.
diff --git a/docs/tutorials/wiki2/src/authentication/tutorial/models/__init__.py b/docs/tutorials/wiki2/src/authentication/tutorial/models/__init__.py
index 8147052ad..cd8347ccd 100644
--- a/docs/tutorials/wiki2/src/authentication/tutorial/models/__init__.py
+++ b/docs/tutorials/wiki2/src/authentication/tutorial/models/__init__.py
@@ -58,6 +58,7 @@ def includeme(config):
"""
settings = config.get_settings()
+ settings['tm.manager_hook'] = 'pyramid_tm.explicit_manager'
# use pyramid_tm to hook the transaction lifecycle to the request
config.include('pyramid_tm')
diff --git a/docs/tutorials/wiki2/src/authorization/tutorial/models/__init__.py b/docs/tutorials/wiki2/src/authorization/tutorial/models/__init__.py
index 8147052ad..cd8347ccd 100644
--- a/docs/tutorials/wiki2/src/authorization/tutorial/models/__init__.py
+++ b/docs/tutorials/wiki2/src/authorization/tutorial/models/__init__.py
@@ -58,6 +58,7 @@ def includeme(config):
"""
settings = config.get_settings()
+ settings['tm.manager_hook'] = 'pyramid_tm.explicit_manager'
# use pyramid_tm to hook the transaction lifecycle to the request
config.include('pyramid_tm')
diff --git a/docs/tutorials/wiki2/src/basiclayout/tutorial/models/__init__.py b/docs/tutorials/wiki2/src/basiclayout/tutorial/models/__init__.py
index 5ca037787..ae575691c 100644
--- a/docs/tutorials/wiki2/src/basiclayout/tutorial/models/__init__.py
+++ b/docs/tutorials/wiki2/src/basiclayout/tutorial/models/__init__.py
@@ -57,6 +57,7 @@ def includeme(config):
"""
settings = config.get_settings()
+ settings['tm.manager_hook'] = 'pyramid_tm.explicit_manager'
# use pyramid_tm to hook the transaction lifecycle to the request
config.include('pyramid_tm')
diff --git a/docs/tutorials/wiki2/src/installation/tutorial/models/__init__.py b/docs/tutorials/wiki2/src/installation/tutorial/models/__init__.py
index 5ca037787..ae575691c 100644
--- a/docs/tutorials/wiki2/src/installation/tutorial/models/__init__.py
+++ b/docs/tutorials/wiki2/src/installation/tutorial/models/__init__.py
@@ -57,6 +57,7 @@ def includeme(config):
"""
settings = config.get_settings()
+ settings['tm.manager_hook'] = 'pyramid_tm.explicit_manager'
# use pyramid_tm to hook the transaction lifecycle to the request
config.include('pyramid_tm')
diff --git a/docs/tutorials/wiki2/src/models/tutorial/__init__.py b/docs/tutorials/wiki2/src/models/tutorial/__init__.py
index 4dab44823..7654fc808 100644
--- a/docs/tutorials/wiki2/src/models/tutorial/__init__.py
+++ b/docs/tutorials/wiki2/src/models/tutorial/__init__.py
@@ -5,6 +5,8 @@ def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
config = Configurator(settings=settings)
+ settings = config.get_settings()
+ settings['tm.manager_hook'] = 'pyramid_tm.explicit_manager'
config.include('pyramid_jinja2')
config.include('.models')
config.include('.routes')
diff --git a/docs/tutorials/wiki2/src/models/tutorial/models/__init__.py b/docs/tutorials/wiki2/src/models/tutorial/models/__init__.py
index 8147052ad..cd8347ccd 100644
--- a/docs/tutorials/wiki2/src/models/tutorial/models/__init__.py
+++ b/docs/tutorials/wiki2/src/models/tutorial/models/__init__.py
@@ -58,6 +58,7 @@ def includeme(config):
"""
settings = config.get_settings()
+ settings['tm.manager_hook'] = 'pyramid_tm.explicit_manager'
# use pyramid_tm to hook the transaction lifecycle to the request
config.include('pyramid_tm')
diff --git a/docs/tutorials/wiki2/src/tests/tutorial/models/__init__.py b/docs/tutorials/wiki2/src/tests/tutorial/models/__init__.py
index 8147052ad..cd8347ccd 100644
--- a/docs/tutorials/wiki2/src/tests/tutorial/models/__init__.py
+++ b/docs/tutorials/wiki2/src/tests/tutorial/models/__init__.py
@@ -58,6 +58,7 @@ def includeme(config):
"""
settings = config.get_settings()
+ settings['tm.manager_hook'] = 'pyramid_tm.explicit_manager'
# use pyramid_tm to hook the transaction lifecycle to the request
config.include('pyramid_tm')
diff --git a/docs/tutorials/wiki2/src/views/tutorial/models/__init__.py b/docs/tutorials/wiki2/src/views/tutorial/models/__init__.py
index 8147052ad..cd8347ccd 100644
--- a/docs/tutorials/wiki2/src/views/tutorial/models/__init__.py
+++ b/docs/tutorials/wiki2/src/views/tutorial/models/__init__.py
@@ -58,6 +58,7 @@ def includeme(config):
"""
settings = config.get_settings()
+ settings['tm.manager_hook'] = 'pyramid_tm.explicit_manager'
# use pyramid_tm to hook the transaction lifecycle to the request
config.include('pyramid_tm')
diff --git a/pyramid/authentication.py b/pyramid/authentication.py
index 03b204e1a..445d6fcd2 100644
--- a/pyramid/authentication.py
+++ b/pyramid/authentication.py
@@ -1084,10 +1084,12 @@ class BasicAuthAuthenticationPolicy(CallbackAuthenticationPolicy):
from pyramid.view import forbidden_view_config
@forbidden_view_config()
- def basic_challenge(request):
- response = HTTPUnauthorized()
- response.headers.update(forget(request))
- return response
+ def forbidden_view(request):
+ if request.authenticated_userid is None:
+ response = HTTPUnauthorized()
+ response.headers.update(forget(request))
+ return response
+ return HTTPForbidden()
"""
def __init__(self, check, realm='Realm', debug=False):
self.check = check
diff --git a/pyramid/scaffolds/alchemy/+package+/models/__init__.py_tmpl b/pyramid/scaffolds/alchemy/+package+/models/__init__.py_tmpl
index f626d1ef0..521816ce7 100644
--- a/pyramid/scaffolds/alchemy/+package+/models/__init__.py_tmpl
+++ b/pyramid/scaffolds/alchemy/+package+/models/__init__.py_tmpl
@@ -57,6 +57,7 @@ def includeme(config):
"""
settings = config.get_settings()
+ settings['tm.manager_hook'] = 'pyramid_tm.explicit_manager'
# use pyramid_tm to hook the transaction lifecycle to the request
config.include('pyramid_tm')
diff --git a/pyramid/scaffolds/zodb/+package+/__init__.py b/pyramid/scaffolds/zodb/+package+/__init__.py
index f2a86df47..a956d0faf 100644
--- a/pyramid/scaffolds/zodb/+package+/__init__.py
+++ b/pyramid/scaffolds/zodb/+package+/__init__.py
@@ -12,6 +12,8 @@ def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
config = Configurator(root_factory=root_factory, settings=settings)
+ settings = config.get_settings()
+ settings['tm.manager_hook'] = 'pyramid_tm.explicit_manager'
config.include('pyramid_chameleon')
config.add_static_view('static', 'static', cache_max_age=3600)
config.scan()
diff --git a/pyramid/security.py b/pyramid/security.py
index 82e6b73a9..035f09f77 100644
--- a/pyramid/security.py
+++ b/pyramid/security.py
@@ -21,10 +21,13 @@ _marker = object()
class AllPermissionsList(object):
""" Stand in 'permission list' to represent all permissions """
+
def __iter__(self):
- return ()
+ return iter(())
+
def __contains__(self, other):
return True
+
def __eq__(self, other):
return isinstance(other, self.__class__)
diff --git a/pyramid/tests/test_security.py b/pyramid/tests/test_security.py
index 6d75ac8e3..5561a05d7 100644
--- a/pyramid/tests/test_security.py
+++ b/pyramid/tests/test_security.py
@@ -16,12 +16,32 @@ class TestAllPermissionsList(unittest.TestCase):
def _makeOne(self):
return self._getTargetClass()()
- def test_it(self):
+ def test_equality_w_self(self):
thing = self._makeOne()
self.assertTrue(thing.__eq__(thing))
- self.assertEqual(thing.__iter__(), ())
+
+ def test_equality_w_other_instances_of_class(self):
+ thing = self._makeOne()
+ other = self._makeOne()
+ self.assertTrue(thing.__eq__(other))
+
+ def test_equality_miss(self):
+ thing = self._makeOne()
+ other = object()
+ self.assertFalse(thing.__eq__(other))
+
+ def test_contains_w_string(self):
+ thing = self._makeOne()
self.assertTrue('anything' in thing)
+ def test_contains_w_object(self):
+ thing = self._makeOne()
+ self.assertTrue(object() in thing)
+
+ def test_iterable(self):
+ thing = self._makeOne()
+ self.assertEqual(list(thing), [])
+
def test_singleton(self):
from pyramid.security import ALL_PERMISSIONS
self.assertEqual(ALL_PERMISSIONS.__class__, self._getTargetClass())
diff --git a/pyramid/view.py b/pyramid/view.py
index 47b756ad8..14d11825e 100644
--- a/pyramid/view.py
+++ b/pyramid/view.py
@@ -668,6 +668,8 @@ class ViewMethodsMixin(object):
response. Otherwise the previous values for ``request.exception`` and
``request.exc_info`` will be restored.
+ .. versionadded:: 1.7
+
.. versionchanged:: 1.9
The ``request.exception`` and ``request.exc_info`` properties will
reflect the exception used to render the response where previously