summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Alexander <steve@z3u.com>2002-06-18 22:14:16 +0000
committerSteve Alexander <steve@z3u.com>2002-06-18 22:14:16 +0000
commitf58a13d0bfabfc9975ab6a497b2a686d8d2e0203 (patch)
treef0b687c1390d3d0d534ae5d9f19f333615c93f3a
parent3fba666f642b7335ae6f57eb1116ab92c7ffeab2 (diff)
downloadzope-traversing-f58a13d0bfabfc9975ab6a497b2a686d8d2e0203.tar.gz
added traverseName convenience function.
-rw-r--r--__init__.py18
-rw-r--r--tests/testConvenienceFunctions.py43
2 files changed, 59 insertions, 2 deletions
diff --git a/__init__.py b/__init__.py
index cab237d..546d6c3 100644
--- a/__init__.py
+++ b/__init__.py
@@ -28,6 +28,9 @@ _marker = object()
def traverse(place, path, default=_marker, request=None):
"""Traverse 'path' relative to 'place'
+ 'path' can be a string with path segments separated by '/'
+ or a sequence of path segments.
+
Raises NotFoundError if path cannot be found
Raises TypeError if place is not context wrapped
@@ -35,6 +38,7 @@ def traverse(place, path, default=_marker, request=None):
source, such as an HTTP request form variable, is a bad idea.
It could allow a maliciously constructed request to call
code unexpectedly.
+ Consider using traverseName instead.
"""
if not _isWrapper(place):
raise TypeError, "Not enough context information to traverse"
@@ -44,6 +48,20 @@ def traverse(place, path, default=_marker, request=None):
else:
return traverser.traverse(path, default=default, request=request)
+def traverseName(obj, name, default=_marker):
+ """Traverse a single step 'name' relative to 'place'
+
+ 'name' must be a string. 'name' will be treated as a single
+ path segment, no matter what characters it contains.
+
+ Raises NotFoundError if path cannot be found
+ Raises TypeError if place is not context wrapped
+ """
+ # by passing [name] to traverse (above), we ensure that name is
+ # treated as a single path segment, regardless of any '/' characters
+ return traverse(obj, [name], default=default)
+
+
def objectName(obj):
"""Get the name an object was traversed via
diff --git a/tests/testConvenienceFunctions.py b/tests/testConvenienceFunctions.py
index af9a3b6..4bf2021 100644
--- a/tests/testConvenienceFunctions.py
+++ b/tests/testConvenienceFunctions.py
@@ -13,7 +13,7 @@
##############################################################################
"""
-$Id: testConvenienceFunctions.py,v 1.1 2002/06/15 20:38:18 stevea Exp $
+$Id: testConvenienceFunctions.py,v 1.2 2002/06/18 22:14:16 stevea Exp $
"""
from unittest import TestCase, TestSuite, main, makeSuite
from Zope.App.OFS.Services.ServiceManager.tests.PlacefulSetup \
@@ -25,6 +25,7 @@ from Zope.App.Traversing.ITraverser import ITraverser
from Zope.App.Traversing.ITraversable import ITraversable
from Zope.App.Traversing.DefaultTraversable import DefaultTraversable
from Zope.App.Traversing.ObjectName import IObjectName, ObjectName
+from Zope.Exceptions import NotFoundError
class C:
def __init__(self, name):
@@ -70,7 +71,45 @@ class Test(PlacefulSetup, TestCase):
traverse,
self.unwrapped_item, '/folder/item'
)
-
+
+ def testTraverseName(self):
+ from Zope.App.Traversing import traverseName
+ self.assertEqual(
+ traverseName(self.folder, 'item'),
+ self.tr.traverse('/folder/item')
+ )
+ self.assertEqual(
+ traverseName(self.item, '.'),
+ self.tr.traverse('/folder/item')
+ )
+
+
+ def testTraverseNameUnwrapped(self):
+ from Zope.App.Traversing import traverseName
+ self.assertRaises(
+ TypeError,
+ traverseName,
+ self.unwrapped_item, 'item'
+ )
+
+ def testTraverseNameBadValue(self):
+ from Zope.App.Traversing import traverseName
+ self.assertRaises(
+ NotFoundError,
+ traverseName,
+ self.folder, '../root'
+ )
+ self.assertRaises(
+ NotFoundError,
+ traverseName,
+ self.folder, '/root'
+ )
+ self.assertRaises(
+ NotFoundError,
+ traverseName,
+ self.folder, './item'
+ )
+
def testObjectName(self):
from Zope.App.Traversing import objectName
self.assertEqual(