Michael Merickel
2018-04-24 e678e20421296545f14d643a63857b9bdd30ceca
Merge pull request #3265 from mmerickel/backport-3264-to-1.9-branch

backport 3264 to 1.9 branch
3 files modified
69 ■■■■■ changed files
CHANGES.txt 7 ●●●●● patch | view | raw | blame | history
pyramid/scripting.py 19 ●●●● patch | view | raw | blame | history
pyramid/tests/test_scripting.py 43 ●●●●● patch | view | raw | blame | history
CHANGES.txt
@@ -1,3 +1,10 @@
unreleased
==========
- Fix ``pyramid.scripting.get_root`` which was broken by the execution policy
  feature added in the 1.9 release.
  See https://github.com/Pylons/pyramid/pull/3265
.. _changes_1.9.1:
1.9.1 (2017-07-13)
pyramid/scripting.py
@@ -8,7 +8,7 @@
from pyramid.request import Request
from pyramid.request import apply_request_extensions
from pyramid.threadlocal import manager as threadlocal_manager
from pyramid.threadlocal import RequestContext
from pyramid.traversal import DefaultRootFactory
def get_root(app, request=None):
@@ -26,10 +26,11 @@
    registry = app.registry
    if request is None:
        request = _make_request('/', registry)
    threadlocals = {'registry':registry, 'request':request}
    app.threadlocal_manager.push(threadlocals)
    def closer(request=request): # keep request alive via this function default
        app.threadlocal_manager.pop()
    request.registry = registry
    ctx = RequestContext(request)
    ctx.begin()
    def closer():
        ctx.end()
    root = app.root_factory(request)
    return root, closer
@@ -87,12 +88,12 @@
    # NB: even though _make_request might have already set registry on
    # request, we reset it in case someone has passed in their own
    # request.
    request.registry = registry
    threadlocals = {'registry':registry, 'request':request}
    threadlocal_manager.push(threadlocals)
    request.registry = registry
    ctx = RequestContext(request)
    ctx.begin()
    apply_request_extensions(request)
    def closer():
        threadlocal_manager.pop()
        ctx.end()
    root_factory = registry.queryUtility(IRootFactory,
                                         default=DefaultRootFactory)
    root = root_factory(request)
pyramid/tests/test_scripting.py
@@ -8,38 +8,35 @@
    def _makeRegistry(self):
        return DummyRegistry([DummyFactory])
    def setUp(self):
        from pyramid.threadlocal import manager
        self.manager = manager
        self.default = manager.get()
    def test_it_norequest(self):
        registry = self._makeRegistry()
        app = DummyApp(registry=registry)
        root, closer = self._callFUT(app)
        self.assertEqual(len(app.threadlocal_manager.pushed), 1)
        pushed = app.threadlocal_manager.pushed[0]
        self.assertEqual(dummy_root, root)
        pushed = self.manager.get()
        self.assertEqual(pushed['registry'], registry)
        self.assertEqual(pushed['request'].registry, app.registry)
        self.assertEqual(len(app.threadlocal_manager.popped), 0)
        self.assertEqual(pushed['request'].registry, registry)
        self.assertEqual(pushed['request'].environ['path'], '/')
        closer()
        self.assertEqual(len(app.threadlocal_manager.popped), 1)
        self.assertEqual(self.default, self.manager.get())
    def test_it_withrequest(self):
        registry = self._makeRegistry()
        app = DummyApp(registry=registry)
        request = DummyRequest({})
        root, closer = self._callFUT(app, request)
        self.assertEqual(len(app.threadlocal_manager.pushed), 1)
        pushed = app.threadlocal_manager.pushed[0]
        self.assertEqual(dummy_root, root)
        pushed = self.manager.get()
        self.assertEqual(pushed['registry'], registry)
        self.assertEqual(pushed['request'], request)
        self.assertEqual(len(app.threadlocal_manager.popped), 0)
        self.assertEqual(pushed['request'].registry, registry)
        closer()
        self.assertEqual(len(app.threadlocal_manager.popped), 1)
    def test_it_requestfactory_overridden(self):
        registry = self._makeRegistry()
        app = DummyApp(registry=registry)
        root, closer = self._callFUT(app)
        self.assertEqual(len(app.threadlocal_manager.pushed), 1)
        pushed = app.threadlocal_manager.pushed[0]
        self.assertEqual(pushed['request'].environ['path'], '/')
        self.assertEqual(self.default, self.manager.get())
class Test_prepare(unittest.TestCase):
    def _callFUT(self, request=None, registry=None):
@@ -206,24 +203,12 @@
class DummyApp:
    def __init__(self, registry=None):
        self.threadlocal_manager = DummyThreadLocalManager()
        if registry:
            self.registry = registry
    def root_factory(self, environ):
        return dummy_root
class DummyThreadLocalManager:
    def __init__(self):
        self.pushed = []
        self.popped = []
    def push(self, item):
        self.pushed.append(item)
    def pop(self):
        self.popped.append(True)
class DummyRequest(object):
    matchdict = None
    matched_route = None