diff options
author | Steve Alexander <steve@z3u.com> | 2002-06-18 22:14:16 +0000 |
---|---|---|
committer | Steve Alexander <steve@z3u.com> | 2002-06-18 22:14:16 +0000 |
commit | f58a13d0bfabfc9975ab6a497b2a686d8d2e0203 (patch) | |
tree | f0b687c1390d3d0d534ae5d9f19f333615c93f3a | |
parent | 3fba666f642b7335ae6f57eb1116ab92c7ffeab2 (diff) | |
download | zope-traversing-f58a13d0bfabfc9975ab6a497b2a686d8d2e0203.tar.gz |
added traverseName convenience function.
-rw-r--r-- | __init__.py | 18 | ||||
-rw-r--r-- | tests/testConvenienceFunctions.py | 43 |
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( |