def traverseName(obj, name, default=_marker, traversable=None, request=None): """Traverse a single step 'name' relative to the given object. 'name' must be a string. '.' and '..' are treated specially, as well as names starting with '@' or '+'. Otherwise 'name' will be treated as a single path segment. You can explicitly pass in an ITraversable as the 'traversable' argument. If you do not, the given object will be adapted to ITraversable. 'request' is passed in when traversing from presentation code. This allows paths like @@foo to work. Raises LocationError if path cannot be found and 'default' was not provided. """ further_path = [] if default is _marker: obj = traversePathElement(obj, name, further_path, traversable=traversable, request=request) else: obj = traversePathElement(obj, name, further_path, default=default, traversable=traversable, request=request) if further_path: raise NotImplementedError('further_path returned from traverse') else: return obj
def path_traverse(base, econtext, call, path_items): if path_items: request = econtext.get("request") path_items = list(path_items) path_items.reverse() while path_items: name = path_items.pop() ns_used = ":" in name if ns_used: namespace, name = name.split(":", 1) base = z3c.pt.namespaces.function_namespaces[namespace](base) if ITraversable.providedBy(base): base = traversePathElement(base, name, path_items, request=request) # base = proxify(base) continue # special-case dicts for performance reasons if isinstance(base, dict): next = base.get(name, _marker) else: next = getattr(base, name, _marker) if next is not _marker: base = next if ns_used and isinstance(base, MethodType): base = base() # The bytecode peephole optimizer removes the next line: continue # pragma: no cover else: base = traversePathElement(base, name, path_items, request=request) # if not isinstance(base, (basestring, tuple, list)): # base = proxify(base) if call and getattr(base, "__call__", _marker) is not _marker: return base() return base
def traverseName(obj, name, default=_marker, traversable=None, request=None): """ Traverse a single step 'name' relative to the given object. See `ITraversalAPI` for details. """ further_path = [] if default is _marker: obj = traversePathElement(obj, name, further_path, traversable=traversable, request=request) else: obj = traversePathElement(obj, name, further_path, default=default, traversable=traversable, request=request) if further_path: raise NotImplementedError('further_path returned from traverse') return obj
def path_traverse(base, econtext, call, path_items): if path_items: request = econtext.get('request') path_items = list(path_items) path_items.reverse() while len(path_items): name = path_items.pop() ns_used = ':' in name if ns_used: namespace, name = name.split(':', 1) base = z3c.pt.namespaces.function_namespaces[namespace](base) if ITraversable.providedBy(base): base = traversePathElement(base, name, path_items, request=request) # base = proxify(base) continue # special-case dicts for performance reasons if isinstance(base, dict): next = base.get(name, _marker) else: next = getattr(base, name, _marker) if next is not _marker: base = next if ns_used and isinstance(base, MethodType): base = base() continue else: base = traversePathElement(base, name, path_items, request=request) # if not isinstance(base, (basestring, tuple, list)): # base = proxify(base) if call and getattr(base, '__call__', _marker) is not _marker: return base() return base
def path_traverse(base, econtext, call, path_items): if path_items: request = econtext.get("request") path_items = list(path_items) path_items.reverse() while path_items: name = path_items.pop() ns_used = ":" in name if ns_used: namespace, name = name.split(":", 1) base = z3c.pt.namespaces.function_namespaces[namespace](base) if ITraversable.providedBy(base): base = traversePathElement( base, name, path_items, request=request ) # base = proxify(base) continue # special-case dicts for performance reasons if isinstance(base, dict): next = base.get(name, _marker) else: next = getattr(base, name, _marker) if next is not _marker: base = next if ns_used and isinstance(base, MethodType): base = base() # The bytecode peephole optimizer removes the next line: continue # pragma: no cover else: base = traversePathElement( base, name, path_items, request=request ) # if not isinstance(base, (basestring, tuple, list)): # base = proxify(base) if call and getattr(base, "__call__", _marker) is not _marker: return base() return base
def path_traverse(base, econtext, call, path_items): if path_items: request = econtext.get('request') path_items = list(path_items) path_items.reverse() while len(path_items): name = path_items.pop() ns_used = ':' in name if ns_used: namespace, name = name.split(':', 1) base = z3c.pt.namespaces.function_namespaces[namespace](base) if ITraversable.providedBy(base): base = traversePathElement( base, name, path_items, request=request) # base = proxify(base) continue # special-case dicts for performance reasons if isinstance(base, dict): next = base.get(name, _marker) else: next = getattr(base, name, _marker) if next is not _marker: base = next if ns_used and isinstance(base, MethodType): base = base() continue else: base = traversePathElement( base, name, path_items, request=request) # if not isinstance(base, (basestring, tuple, list)): # base = proxify(base) if call and getattr(base, '__call__', _marker) is not _marker: return base() return base
def __call__(self, object, path_items, econtext): request = econtext._vars_stack[0].get('request', None) path_items = list(path_items) path_items.reverse() while path_items: name = path_items.pop() assert getattr(object, '__class__', None) != dict object = traversePathElement(object, name, path_items, request=request) return object
def test_traversePathElement_LocationError_with_default(self): class Traversable(object): called = False def traverse(self, nm, further_path): self.called = True raise LocationError() t = Traversable() self.assertIs(self, adapters.traversePathElement(None, None, (), default=self, traversable=t)) self.assertTrue(t.called)
def traverse(cls, base, request, path_items): """See ``zope.app.pagetemplate.engine``.""" path_items = list(path_items) path_items.reverse() while path_items: name = path_items.pop() if ITraversable.providedBy(base): base = getattr(base, cls.traverseMethod)(name) else: base = traversePathElement(base, name, path_items, request=request) return base
def test_traversePathElement_UnicodeEncodeError_with_default(self): test = self class Traversable(object): called = False fail = test.fail def traverse(self, nm, further_path): self.called = True u'\xff'.encode("ascii") self.fail("Should not be reached") t = Traversable() self.assertIs(self, adapters.traversePathElement(None, None, (), default=self, traversable=t)) self.assertTrue(t.called)
def test_traversePathElement_LocationError_with_default(self): class Traversable(object): called = False def traverse(self, nm, further_path): self.called = True raise LocationError() t = Traversable() self.assertIs( self, adapters.traversePathElement(None, None, (), default=self, traversable=t)) self.assertTrue(t.called)
def __call__(self, object, path_items, econtext): """Traverses a sequence of names, first trying attributes then items. """ request = getattr(econtext, 'request', None) path_items = list(path_items) path_items.reverse() while path_items: name = path_items.pop() # special-case dicts for performance reasons if getattr(object, '__class__', None) == dict: object = object[name] else: object = traversePathElement(object, name, path_items, request=request) object = self.proxify(object) return object
def trustedBoboAwareZopeTraverse(object, path_items, econtext): """Traverses a sequence of names, first trying attributes then items. This uses zope.traversing path traversal where possible and interacts correctly with objects providing OFS.interface.ITraversable when necessary (bobo-awareness). """ request = getattr(econtext, 'request', None) path_items = list(path_items) path_items.reverse() while path_items: name = path_items.pop() if OFS.interfaces.ITraversable.providedBy(object): object = object.unrestrictedTraverse(name) else: object = traversePathElement(object, name, path_items, request=request) return object
def traverse(cls, base, request, path_items): """See ``zope.app.pagetemplate.engine``.""" length = len(path_items) if length: i = 0 method = cls.traverse_method while i < length: name = path_items[i] i += 1 if ITraversable.providedBy(base): traverser = getattr(base, method) base = traverser(name) else: base = traversePathElement( base, name, path_items[i:], request=request ) return base
def test_traversePathElement_UnicodeEncodeError_with_default(self): test = self class Traversable(object): called = False fail = test.fail def traverse(self, nm, further_path): self.called = True u'\xff'.encode("ascii") self.fail("Should not be reached") t = Traversable() self.assertIs( self, adapters.traversePathElement(None, None, (), default=self, traversable=t)) self.assertTrue(t.called)