summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2011-04-27 17:18:24 -0400
committerChris McDonough <chrism@plope.com>2011-04-27 17:18:24 -0400
commitf426e51a98a85ab55545bd836f31d8731cc14cfe (patch)
tree773b7822fbcc87068256355cdf5b5f76c2465033
parentbca03fcb8df46485d722156da4f2f7685f234ab8 (diff)
downloadpyramid-f426e51a98a85ab55545bd836f31d8731cc14cfe.tar.gz
pyramid-f426e51a98a85ab55545bd836f31d8731cc14cfe.tar.bz2
pyramid-f426e51a98a85ab55545bd836f31d8731cc14cfe.zip
- Passing an ``environ`` dictionary to the ``__call__`` method of a
"traverser" (e.g. an object that implements ``pyramid.interfaces.ITraverser`` such as an instance of ``pyramid.traversal.ResourceTreeTraverser``) as its ``request`` argument now causes a deprecation warning to be emitted. Consumer code should pass a ``request`` object instead. The fact that passing an environ dict is permitted has been documentation-deprecated since ``repoze.bfg`` 1.1, and this capability will be removed entirely in a future version. - The following (undocumented, dictionary-like) methods of the ``pyramid.request.Request`` object have been deprecated: ``__contains__``, ``__delitem__``, ``__getitem__``, ``__iter__``, ``__setitem__``, ``get``, ``has_key``, ``items``, ``iteritems``, ``itervalues``, ``keys``, ``pop``, ``popitem``, ``setdefault``, ``update``, and ``values``. Usage of any of these methods will cause a deprecation warning to be emitted. These methods were added for internal compatibility in ``repoze.bfg`` 1.1 (code that currently expects a request object expected an environ object in BFG 1.0 and before). In a future version, these methods will be removed entirely.
-rw-r--r--CHANGES.txt20
-rw-r--r--pyramid/config.py2
-rw-r--r--pyramid/interfaces.py29
-rw-r--r--pyramid/request.py25
-rw-r--r--pyramid/tests/test_config.py12
-rw-r--r--pyramid/tests/test_request.py216
-rw-r--r--pyramid/tests/test_testing.py10
-rw-r--r--pyramid/tests/test_traversal.py74
-rw-r--r--pyramid/traversal.py5
9 files changed, 250 insertions, 143 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index 7d469551a..5916fa1ab 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -187,6 +187,26 @@ Deprecations
now issued when any view-related parameter is passed to
``Configurator.add_route``.
+- Passing an ``environ`` dictionary to the ``__call__`` method of a
+ "traverser" (e.g. an object that implements
+ ``pyramid.interfaces.ITraverser`` such as an instance of
+ ``pyramid.traversal.ResourceTreeTraverser``) as its ``request`` argument
+ now causes a deprecation warning to be emitted. Consumer code should pass a
+ ``request`` object instead. The fact that passing an environ dict is
+ permitted has been documentation-deprecated since ``repoze.bfg`` 1.1, and
+ this capability will be removed entirely in a future version.
+
+- The following (undocumented, dictionary-like) methods of the
+ ``pyramid.request.Request`` object have been deprecated: ``__contains__``,
+ ``__delitem__``, ``__getitem__``, ``__iter__``, ``__setitem__``, ``get``,
+ ``has_key``, ``items``, ``iteritems``, ``itervalues``, ``keys``, ``pop``,
+ ``popitem``, ``setdefault``, ``update``, and ``values``. Usage of any of
+ these methods will cause a deprecation warning to be emitted. These
+ methods were added for internal compatibility in ``repoze.bfg`` 1.1 (code
+ that currently expects a request object expected an environ object in BFG
+ 1.0 and before). In a future version, these methods will be removed
+ entirely.
+
Behavior Changes
----------------
diff --git a/pyramid/config.py b/pyramid/config.py
index 3986acba7..5b44dd7aa 100644
--- a/pyramid/config.py
+++ b/pyramid/config.py
@@ -2356,7 +2356,7 @@ class Configurator(object):
self.context = context
def __call__(self, request):
- path = request['PATH_INFO']
+ path = request.environ['PATH_INFO']
ob = resources[path]
traversed = traversal_path(path)
return {'context':ob, 'view_name':'','subpath':(),
diff --git a/pyramid/interfaces.py b/pyramid/interfaces.py
index 2364757ab..dbea91c99 100644
--- a/pyramid/interfaces.py
+++ b/pyramid/interfaces.py
@@ -271,24 +271,23 @@ class ITraverser(Interface):
""" Return a dictionary with (at least) the keys ``root``,
``context``, ``view_name``, ``subpath``, ``traversed``,
``virtual_root``, and ``virtual_root_path``. These values are
- typically the result of an object graph traversal. ``root``
- is the physical root object, ``context`` will be a model
- object, ``view_name`` will be the view name used (a Unicode
- name), ``subpath`` will be a sequence of Unicode names that
- followed the view name but were not traversed, ``traversed``
- will be a sequence of Unicode names that were traversed
- (including the virtual root path, if any) ``virtual_root``
- will be a model object representing the virtual root (or the
- physical root if traversal was not performed), and
- ``virtual_root_path`` will be a sequence representing the
- virtual root path (a sequence of Unicode names) or None if
- traversal was not performed.
-
- Extra keys for special purpose functionality can be added as
+ typically the result of an object graph traversal. ``root`` is the
+ physical root object, ``context`` will be a model object,
+ ``view_name`` will be the view name used (a Unicode name),
+ ``subpath`` will be a sequence of Unicode names that followed the
+ view name but were not traversed, ``traversed`` will be a sequence of
+ Unicode names that were traversed (including the virtual root path,
+ if any) ``virtual_root`` will be a model object representing the
+ virtual root (or the physical root if traversal was not performed),
+ and ``virtual_root_path`` will be a sequence representing the virtual
+ root path (a sequence of Unicode names) or ``None`` if traversal was
+ not performed.
+
+ Extra keys for special purpose functionality can be returned as
necessary.
All values returned in the dictionary will be made available
- as attributes of the ``request`` object.
+ as attributes of the ``request`` object by the :term:`router`.
"""
ITraverserFactory = ITraverser # b / c for 1.0 code
diff --git a/pyramid/request.py b/pyramid/request.py
index e5feecd4f..d387a0b2f 100644
--- a/pyramid/request.py
+++ b/pyramid/request.py
@@ -1,3 +1,4 @@
+from zope.deprecation import deprecate
from zope.interface import implements
from zope.interface.interface import InterfaceClass
@@ -322,56 +323,78 @@ class Request(BaseRequest):
# b/c dict interface for "root factory" code that expects a bare
# environ. Explicitly omitted dict methods: clear (unnecessary),
- # copy (implemented by WebOb), fromkeys (unnecessary)
+ # copy (implemented by WebOb), fromkeys (unnecessary); deprecated
+ # as of Pyramid 1.1.
+ dictlike = ('Use of the request as a dict-like object is deprecated as '
+ 'of Pyramid 1.1. Use dict-like methods of "request.environ" '
+ 'instead.')
+
+ @deprecate(dictlike)
def __contains__(self, k):
return self.environ.__contains__(k)
+ @deprecate(dictlike)
def __delitem__(self, k):
return self.environ.__delitem__(k)
+ @deprecate(dictlike)
def __getitem__(self, k):
return self.environ.__getitem__(k)
+ @deprecate(dictlike)
def __iter__(self):
return iter(self.environ)
+ @deprecate(dictlike)
def __setitem__(self, k, v):
self.environ[k] = v
+ @deprecate(dictlike)
def get(self, k, default=None):
return self.environ.get(k, default)
+ @deprecate(dictlike)
def has_key(self, k):
return k in self.environ
+ @deprecate(dictlike)
def items(self):
return self.environ.items()
+ @deprecate(dictlike)
def iteritems(self):
return self.environ.iteritems()
+ @deprecate(dictlike)
def iterkeys(self):
return self.environ.iterkeys()
+ @deprecate(dictlike)
def itervalues(self):
return self.environ.itervalues()
+ @deprecate(dictlike)
def keys(self):
return self.environ.keys()
+ @deprecate(dictlike)
def pop(self, k):
return self.environ.pop(k)
+ @deprecate(dictlike)
def popitem(self):
return self.environ.popitem()
+ @deprecate(dictlike)
def setdefault(self, v, default):
return self.environ.setdefault(v, default)
+ @deprecate(dictlike)
def update(self, v, **kw):
return self.environ.update(v, **kw)
+ @deprecate(dictlike)
def values(self):
return self.environ.values()
diff --git a/pyramid/tests/test_config.py b/pyramid/tests/test_config.py
index 560f68f95..131c7efb3 100644
--- a/pyramid/tests/test_config.py
+++ b/pyramid/tests/test_config.py
@@ -2689,21 +2689,21 @@ class ConfiguratorTests(unittest.TestCase):
config = self._makeOne(autocommit=True)
config.testing_resources(resources)
adapter = config.registry.getAdapter(None, ITraverser)
- result = adapter({'PATH_INFO':'/ob1'})
+ result = adapter(DummyRequest({'PATH_INFO':'/ob1'}))
self.assertEqual(result['context'], ob1)
self.assertEqual(result['view_name'], '')
self.assertEqual(result['subpath'], ())
self.assertEqual(result['traversed'], (u'ob1',))
self.assertEqual(result['virtual_root'], ob1)
self.assertEqual(result['virtual_root_path'], ())
- result = adapter({'PATH_INFO':'/ob2'})
+ result = adapter(DummyRequest({'PATH_INFO':'/ob2'}))
self.assertEqual(result['context'], ob2)
self.assertEqual(result['view_name'], '')
self.assertEqual(result['subpath'], ())
self.assertEqual(result['traversed'], (u'ob2',))
self.assertEqual(result['virtual_root'], ob2)
self.assertEqual(result['virtual_root_path'], ())
- self.assertRaises(KeyError, adapter, {'PATH_INFO':'/ob3'})
+ self.assertRaises(KeyError, adapter, DummyRequest({'PATH_INFO':'/ob3'}))
try:
config.begin()
self.assertEqual(find_resource(None, '/ob1'), ob1)
@@ -4931,8 +4931,10 @@ class Test_isexception(unittest.TestCase):
class DummyRequest:
subpath = ()
matchdict = None
- def __init__(self):
- self.environ = {'PATH_INFO':'/static'}
+ def __init__(self, environ=None):
+ if environ is None:
+ environ = {}
+ self.environ = environ
self.params = {}
self.cookies = {}
def copy(self):
diff --git a/pyramid/tests/test_request.py b/pyramid/tests/test_request.py
index cdd9aa51e..e35856ce0 100644
--- a/pyramid/tests/test_request.py
+++ b/pyramid/tests/test_request.py
@@ -4,10 +4,9 @@ from pyramid import testing
class TestRequest(unittest.TestCase):
def setUp(self):
self.config = testing.setUp()
- self.config.begin()
def tearDown(self):
- self.config.end()
+ testing.tearDown()
def _makeOne(self, environ):
return self._getTargetClass()(environ)
@@ -97,103 +96,6 @@ class TestRequest(unittest.TestCase):
self.assertEqual(getattr(inst, 'bar'), 1)
self.assertEqual(environ, {}) # make sure we're not using adhoc attrs
- def test___contains__(self):
- environ ={'zooma':1}
- inst = self._makeOne(environ)
- self.assertTrue('zooma' in inst)
-
- def test___delitem__(self):
- environ = {'zooma':1}
- inst = self._makeOne(environ)
- del inst['zooma']
- self.assertFalse('zooma' in environ)
-
- def test___getitem__(self):
- environ = {'zooma':1}
- inst = self._makeOne(environ)
- self.assertEqual(inst['zooma'], 1)
-
- def test___iter__(self):
- environ = {'zooma':1}
- inst = self._makeOne(environ)
- iterator = iter(inst)
- self.assertEqual(list(iterator), list(iter(environ)))
-
- def test___setitem__(self):
- environ = {}
- inst = self._makeOne(environ)
- inst['zooma'] = 1
- self.assertEqual(environ, {'zooma':1})
-
- def test_get(self):
- environ = {'zooma':1}
- inst = self._makeOne(environ)
- self.assertEqual(inst.get('zooma'), 1)
-
- def test_has_key(self):
- environ = {'zooma':1}
- inst = self._makeOne(environ)
- self.assertEqual(inst.has_key('zooma'), True)
-
- def test_items(self):
- environ = {'zooma':1}
- inst = self._makeOne(environ)
- self.assertEqual(inst.items(), environ.items())
-
- def test_iteritems(self):
- environ = {'zooma':1}
- inst = self._makeOne(environ)
- self.assertEqual(list(inst.iteritems()), list(environ.iteritems()))
-
- def test_iterkeys(self):
- environ = {'zooma':1}
- inst = self._makeOne(environ)
- self.assertEqual(list(inst.iterkeys()), list(environ.iterkeys()))
-
- def test_itervalues(self):
- environ = {'zooma':1}
- inst = self._makeOne(environ)
- self.assertEqual(list(inst.itervalues()), list(environ.itervalues()))
-
- def test_keys(self):
- environ = {'zooma':1}
- inst = self._makeOne(environ)
- self.assertEqual(inst.keys(), environ.keys())
-
- def test_pop(self):
- environ = {'zooma':1}
- inst = self._makeOne(environ)
- popped = inst.pop('zooma')
- self.assertEqual(environ, {})
- self.assertEqual(popped, 1)
-
- def test_popitem(self):
- environ = {'zooma':1}
- inst = self._makeOne(environ)
- popped = inst.popitem()
- self.assertEqual(environ, {})
- self.assertEqual(popped, ('zooma', 1))
-
- def test_setdefault(self):
- environ = {}
- inst = self._makeOne(environ)
- marker = []
- result = inst.setdefault('a', marker)
- self.assertEqual(environ, {'a':marker})
- self.assertEqual(result, marker)
-
- def test_update(self):
- environ = {}
- inst = self._makeOne(environ)
- inst.update({'a':1}, b=2)
- self.assertEqual(environ, {'a':1, 'b':2})
-
- def test_values(self):
- environ = {'zooma':1}
- inst = self._makeOne(environ)
- result = inst.values()
- self.assertEqual(result, environ.values())
-
def test_add_response_callback(self):
inst = self._makeOne({})
self.assertEqual(inst.response_callbacks, ())
@@ -303,6 +205,122 @@ class TestRequest(unittest.TestCase):
('pyramid.tests:static/foo.css', request, {}) )
+class TestRequestDeprecatedMethods(unittest.TestCase):
+ def setUp(self):
+ self.config = testing.setUp()
+ self.config.begin()
+ import warnings
+ warnings.filterwarnings('ignore')
+
+ def tearDown(self):
+ testing.tearDown()
+ import warnings
+ warnings.resetwarnings()
+
+ def _getTargetClass(self):
+ from pyramid.request import Request
+ return Request
+
+ def _makeOne(self, environ):
+ return self._getTargetClass()(environ)
+
+ def test___contains__(self):
+ environ ={'zooma':1}
+ inst = self._makeOne(environ)
+ self.assertTrue('zooma' in inst)
+
+ def test___delitem__(self):
+ environ = {'zooma':1}
+ inst = self._makeOne(environ)
+ del inst['zooma']
+ self.assertFalse('zooma' in environ)
+
+ def test___getitem__(self):
+ environ = {'zooma':1}
+ inst = self._makeOne(environ)
+ self.assertEqual(inst['zooma'], 1)
+
+ def test___iter__(self):
+ environ = {'zooma':1}
+ inst = self._makeOne(environ)
+ iterator = iter(inst)
+ self.assertEqual(list(iterator), list(iter(environ)))
+
+ def test___setitem__(self):
+ environ = {}
+ inst = self._makeOne(environ)
+ inst['zooma'] = 1
+ self.assertEqual(environ, {'zooma':1})
+
+ def test_get(self):
+ environ = {'zooma':1}
+ inst = self._makeOne(environ)
+ self.assertEqual(inst.get('zooma'), 1)
+
+ def test_has_key(self):
+ environ = {'zooma':1}
+ inst = self._makeOne(environ)
+ self.assertEqual(inst.has_key('zooma'), True)
+
+ def test_items(self):
+ environ = {'zooma':1}
+ inst = self._makeOne(environ)
+ self.assertEqual(inst.items(), environ.items())
+
+ def test_iteritems(self):
+ environ = {'zooma':1}
+ inst = self._makeOne(environ)
+ self.assertEqual(list(inst.iteritems()), list(environ.iteritems()))
+
+ def test_iterkeys(self):
+ environ = {'zooma':1}
+ inst = self._makeOne(environ)
+ self.assertEqual(list(inst.iterkeys()), list(environ.iterkeys()))
+
+ def test_itervalues(self):
+ environ = {'zooma':1}
+ inst = self._makeOne(environ)
+ self.assertEqual(list(inst.itervalues()), list(environ.itervalues()))
+
+ def test_keys(self):
+ environ = {'zooma':1}
+ inst = self._makeOne(environ)
+ self.assertEqual(inst.keys(), environ.keys())
+
+ def test_pop(self):
+ environ = {'zooma':1}
+ inst = self._makeOne(environ)
+ popped = inst.pop('zooma')
+ self.assertEqual(environ, {})
+ self.assertEqual(popped, 1)
+
+ def test_popitem(self):
+ environ = {'zooma':1}
+ inst = self._makeOne(environ)
+ popped = inst.popitem()
+ self.assertEqual(environ, {})
+ self.assertEqual(popped, ('zooma', 1))
+
+ def test_setdefault(self):
+ environ = {}
+ inst = self._makeOne(environ)
+ marker = []
+ result = inst.setdefault('a', marker)
+ self.assertEqual(environ, {'a':marker})
+ self.assertEqual(result, marker)
+
+ def test_update(self):
+ environ = {}
+ inst = self._makeOne(environ)
+ inst.update({'a':1}, b=2)
+ self.assertEqual(environ, {'a':1, 'b':2})
+
+ def test_values(self):
+ environ = {'zooma':1}
+ inst = self._makeOne(environ)
+ result = inst.values()
+ self.assertEqual(result, environ.values())
+
class Test_route_request_iface(unittest.TestCase):
def _callFUT(self, name):
from pyramid.request import route_request_iface
diff --git a/pyramid/tests/test_testing.py b/pyramid/tests/test_testing.py
index 0c94a2803..58ca2b7d9 100644
--- a/pyramid/tests/test_testing.py
+++ b/pyramid/tests/test_testing.py
@@ -42,21 +42,21 @@ class Test_registerResources(TestBase):
testing.registerResources(resources)
from pyramid.interfaces import ITraverser
adapter = self.registry.getAdapter(None, ITraverser)
- result = adapter({'PATH_INFO':'/ob1'})
+ result = adapter(DummyRequest({'PATH_INFO':'/ob1'}))
self.assertEqual(result['context'], ob1)
self.assertEqual(result['view_name'], '')
self.assertEqual(result['subpath'], ())
self.assertEqual(result['traversed'], (u'ob1',))
self.assertEqual(result['virtual_root'], ob1)
self.assertEqual(result['virtual_root_path'], ())
- result = adapter({'PATH_INFO':'/ob2'})
+ result = adapter(DummyRequest({'PATH_INFO':'/ob2'}))
self.assertEqual(result['context'], ob2)
self.assertEqual(result['view_name'], '')
self.assertEqual(result['subpath'], ())
self.assertEqual(result['traversed'], (u'ob2',))
self.assertEqual(result['virtual_root'], ob2)
self.assertEqual(result['virtual_root_path'], ())
- self.assertRaises(KeyError, adapter, {'PATH_INFO':'/ob3'})
+ self.assertRaises(KeyError, adapter, DummyRequest({'PATH_INFO':'/ob3'}))
from pyramid.traversal import find_resource
self.assertEqual(find_resource(None, '/ob1'), ob1)
@@ -897,6 +897,10 @@ class DummyEvent:
class DummyRequest:
application_url = 'http://example.com'
+ def __init__(self, environ=None):
+ if environ is None:
+ environ = {}
+ self.environ = environ
class DummyFactory:
def __init__(self, environ):
diff --git a/pyramid/tests/test_traversal.py b/pyramid/tests/test_traversal.py
index 89edb230b..0ead63703 100644
--- a/pyramid/tests/test_traversal.py
+++ b/pyramid/tests/test_traversal.py
@@ -96,7 +96,8 @@ class ResourceTreeTraverserTests(unittest.TestCase):
def test_call_with_no_pathinfo(self):
policy = self._makeOne(None)
environ = self._getEnviron()
- result = policy(environ)
+ request = DummyRequest(environ)
+ result = policy(request)
self.assertEqual(result['context'], None)
self.assertEqual(result['view_name'], '')
self.assertEqual(result['subpath'], ())
@@ -108,7 +109,8 @@ class ResourceTreeTraverserTests(unittest.TestCase):
def test_call_pathel_with_no_getitem(self):
policy = self._makeOne(None)
environ = self._getEnviron(PATH_INFO='/foo/bar')
- result = policy(environ)
+ request = DummyRequest(environ)
+ result = policy(request)
self.assertEqual(result['context'], None)
self.assertEqual(result['view_name'], 'foo')
self.assertEqual(result['subpath'], ('bar',))
@@ -121,7 +123,8 @@ class ResourceTreeTraverserTests(unittest.TestCase):
root = DummyContext()
policy = self._makeOne(root)
environ = self._getEnviron(PATH_INFO='')
- result = policy(environ)
+ request = DummyRequest(environ)
+ result = policy(request)
self.assertEqual(result['context'], root)
self.assertEqual(result['view_name'], '')
self.assertEqual(result['subpath'], ())
@@ -135,7 +138,8 @@ class ResourceTreeTraverserTests(unittest.TestCase):
root = DummyContext(foo)
policy = self._makeOne(root)
environ = self._getEnviron(PATH_INFO='/foo/bar')
- result = policy(environ)
+ request = DummyRequest(environ)
+ result = policy(request)
self.assertEqual(result['context'], foo)
self.assertEqual(result['view_name'], 'bar')
self.assertEqual(result['subpath'], ())
@@ -149,7 +153,8 @@ class ResourceTreeTraverserTests(unittest.TestCase):
root = DummyContext(foo)
policy = self._makeOne(root)
environ = self._getEnviron(PATH_INFO='/foo/bar/baz/buz')
- result = policy(environ)
+ request = DummyRequest(environ)
+ result = policy(request)
self.assertEqual(result['context'], foo)
self.assertEqual(result['view_name'], 'bar')
self.assertEqual(result['subpath'], ('baz', 'buz'))
@@ -163,7 +168,8 @@ class ResourceTreeTraverserTests(unittest.TestCase):
root = DummyContext(foo)
policy = self._makeOne(root)
environ = self._getEnviron(PATH_INFO='/@@foo')
- result = policy(environ)
+ request = DummyRequest(environ)
+ result = policy(request)
self.assertEqual(result['context'], root)
self.assertEqual(result['view_name'], 'foo')
self.assertEqual(result['subpath'], ())
@@ -180,7 +186,8 @@ class ResourceTreeTraverserTests(unittest.TestCase):
foo = DummyContext(bar, 'foo')
root = DummyContext(foo, 'root')
policy = self._makeOne(root)
- result = policy(environ)
+ request = DummyRequest(environ)
+ result = policy(request)
self.assertEqual(result['context'], baz)
self.assertEqual(result['view_name'], '')
self.assertEqual(result['subpath'], ())
@@ -197,7 +204,8 @@ class ResourceTreeTraverserTests(unittest.TestCase):
foo = DummyContext(bar, 'foo')
root = DummyContext(foo, 'root')
policy = self._makeOne(root)
- result = policy(environ)
+ request = DummyRequest(environ)
+ result = policy(request)
self.assertEqual(result['context'], baz)
self.assertEqual(result['view_name'], '')
self.assertEqual(result['subpath'], ())
@@ -214,7 +222,8 @@ class ResourceTreeTraverserTests(unittest.TestCase):
foo = DummyContext(bar)
root = DummyContext(foo)
policy = self._makeOne(root)
- result = policy(environ)
+ request = DummyRequest(environ)
+ result = policy(request)
self.assertEqual(result['context'], baz)
self.assertEqual(result['view_name'], '')
self.assertEqual(result['subpath'], ())
@@ -231,7 +240,8 @@ class ResourceTreeTraverserTests(unittest.TestCase):
foo = DummyContext(bar, 'foo')
root = DummyContext(foo, 'root')
policy = self._makeOne(root)
- result = policy(environ)
+ request = DummyRequest(environ)
+ result = policy(request)
self.assertEqual(result['context'], baz)
self.assertEqual(result['view_name'], '')
self.assertEqual(result['subpath'], ())
@@ -244,7 +254,8 @@ class ResourceTreeTraverserTests(unittest.TestCase):
policy = self._makeOne(None)
environ = self._getEnviron(HTTP_X_VHM_ROOT='/',
PATH_INFO='/')
- result = policy(environ)
+ request = DummyRequest(environ)
+ result = policy(request)
self.assertEqual(result['context'], None)
self.assertEqual(result['view_name'], '')
self.assertEqual(result['subpath'], ())
@@ -259,8 +270,9 @@ class ResourceTreeTraverserTests(unittest.TestCase):
policy = self._makeOne(root)
segment = unicode('LaPe\xc3\xb1a', 'utf-8').encode('utf-16')
environ = self._getEnviron(PATH_INFO='/%s' % segment)
+ request = DummyRequest(environ)
from pyramid.exceptions import URLDecodeError
- self.assertRaises(URLDecodeError, policy, environ)
+ self.assertRaises(URLDecodeError, policy, request)
def test_non_utf8_path_segment_settings_unicode_path_segments_fails(self):
foo = DummyContext()
@@ -268,14 +280,16 @@ class ResourceTreeTraverserTests(unittest.TestCase):
policy = self._makeOne(root)
segment = unicode('LaPe\xc3\xb1a', 'utf-8').encode('utf-16')
environ = self._getEnviron(PATH_INFO='/%s' % segment)
+ request = DummyRequest(environ)
from pyramid.exceptions import URLDecodeError
- self.assertRaises(URLDecodeError, policy, environ)
+ self.assertRaises(URLDecodeError, policy, request)
def test_withroute_nothingfancy(self):
resource = DummyContext()
traverser = self._makeOne(resource)
environ = {'bfg.routes.matchdict': {}}
- result = traverser(environ)
+ request = DummyRequest(environ)
+ result = traverser(request)
self.assertEqual(result['context'], resource)
self.assertEqual(result['view_name'], '')
self.assertEqual(result['subpath'], ())
@@ -288,7 +302,8 @@ class ResourceTreeTraverserTests(unittest.TestCase):
resource = DummyContext()
traverser = self._makeOne(resource)
environ = {'bfg.routes.matchdict': {'subpath':'/a/b/c'}}
- result = traverser(environ)
+ request = DummyRequest(environ)
+ result = traverser(request)
self.assertEqual(result['context'], resource)
self.assertEqual(result['view_name'], '')
self.assertEqual(result['subpath'], ('a', 'b','c'))
@@ -301,7 +316,8 @@ class ResourceTreeTraverserTests(unittest.TestCase):
resource = DummyContext()
traverser = self._makeOne(resource)
environ = {'bfg.routes.matchdict': {'subpath':('a', 'b', 'c')}}
- result = traverser(environ)
+ request = DummyRequest(environ)
+ result = traverser(request)
self.assertEqual(result['context'], resource)
self.assertEqual(result['view_name'], '')
self.assertEqual(result['subpath'], ('a', 'b','c'))
@@ -314,7 +330,8 @@ class ResourceTreeTraverserTests(unittest.TestCase):
resource = DummyContext()
traverser = self._makeOne(resource)
environ = {'bfg.routes.matchdict': {'traverse':'foo/bar'}}
- result = traverser(environ)
+ request = DummyRequest(environ)
+ result = traverser(request)
self.assertEqual(result['context'], resource)
self.assertEqual(result['view_name'], 'foo')
self.assertEqual(result['subpath'], ('bar',))
@@ -327,7 +344,8 @@ class ResourceTreeTraverserTests(unittest.TestCase):
resource = DummyContext()
traverser = self._makeOne(resource)
environ = {'bfg.routes.matchdict': {'traverse':('foo', 'bar')}}
- result = traverser(environ)
+ request = DummyRequest(environ)
+ result = traverser(request)
self.assertEqual(result['context'], resource)
self.assertEqual(result['view_name'], 'foo')
self.assertEqual(result['subpath'], ('bar',))
@@ -340,7 +358,8 @@ class ResourceTreeTraverserTests(unittest.TestCase):
resource = DummyContext()
traverser = self._makeOne(resource)
environ = {'bfg.routes.matchdict': {'traverse':''}}
- result = traverser(environ)
+ request = DummyRequest(environ)
+ result = traverser(request)
self.assertEqual(result['context'], resource)
self.assertEqual(result['view_name'], '')
self.assertEqual(result['subpath'], ())
@@ -349,6 +368,23 @@ class ResourceTreeTraverserTests(unittest.TestCase):
self.assertEqual(result['virtual_root'], resource)
self.assertEqual(result['virtual_root_path'], ())
+ def test_call_with_environ(self):
+ import warnings
+ warnings.filterwarnings('ignore')
+ try:
+ policy = self._makeOne(None)
+ environ = self._getEnviron()
+ result = policy(environ)
+ self.assertEqual(result['context'], None)
+ self.assertEqual(result['view_name'], '')
+ self.assertEqual(result['subpath'], ())
+ self.assertEqual(result['traversed'], ())
+ self.assertEqual(result['root'], policy.root)
+ self.assertEqual(result['virtual_root'], policy.root)
+ self.assertEqual(result['virtual_root_path'], ())
+ finally:
+ warnings.resetwarnings()
+
class FindInterfaceTests(unittest.TestCase):
def _callFUT(self, context, iface):
from pyramid.traversal import find_interface
diff --git a/pyramid/traversal.py b/pyramid/traversal.py
index 540f17a31..48f8017f6 100644
--- a/pyramid/traversal.py
+++ b/pyramid/traversal.py
@@ -1,4 +1,5 @@
import urllib
+import warnings
from zope.interface import implements
from zope.interface.interfaces import IInterface
@@ -573,6 +574,10 @@ class ResourceTreeTraverser(object):
# rather than a request; some bit of code may still be
# passing us an environ. If so, deal.
environ = request
+ depwarn = ('Passing an environ dictionary directly to a traverser '
+ 'is deprecated in Pyramid 1.1. Pass a request object '
+ 'instead.')
+ warnings.warn(depwarn, DeprecationWarning, 2)
if 'bfg.routes.matchdict' in environ:
matchdict = environ['bfg.routes.matchdict']