Exemple #1
0
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
Exemple #2
0
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
Exemple #3
0
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
Exemple #6
0
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
Exemple #7
0
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
Exemple #8
0
    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)
Exemple #10
0
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
Exemple #11
0
    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)
Exemple #13
0
    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)
Exemple #14
0
    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
Exemple #16
0
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
Exemple #17
0
    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
Exemple #18
0
    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
Exemple #19
0
    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)
Exemple #20
0
    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