示例#1
0
    def test_get_item_by_path(self):
        class OView(SortedNamesObjectViewMixin, TreeView):
            __type__ = O
            __cell__ = odict((('a', 'The a'),))
            __recursive__ = True

            def get_cell(self, objname, key):
                return getattr(self.obj, key, None)

        class SubView(SortedNamesObjectViewMixin, OView):
            __type__ = O1
            __cell__ = odict((('b', 'The b'), ('a', 'The a'),))

            def get_cell(self, objname, key):
                return getattr(self.obj, key, None)



        class DictSubView(SortedNamesDictViewMixin, SubView):
            __cell__ = odict((('c', 'The c'),))
            def get_cell(self, objname, key):
                return self.obj.get(key, None)
        
        obj = {'root':O(a='root header value for `a` key',
                              sub=O1(),
                              sub2=O(subsub={'a':'Dict `a` header'}),
                              sub3=O1(subsub={'b':'Dict `b` header'}),
                              sub4=O(subsub=O1(b='sub4 header value for `b` key',
                                               a='sub4 header value for `a` key'
                                                )),
                    )}
        tree = Tree(obj, OView, leaf_classes=SubView, sep='.')
        '''
        Separator `TreeView.__sep__` can be different for each level
        '''
        item, tail = tree.get('root.sub3.subsub')
        self.assertTrue(item is NOTEXIST)
        self.assertTrue(tail == 'subsub')

        item, tail = tree.get('root.sub3')
        self.assertTrue(item.cell == [None, None])
        
        tree = Tree(obj, OView, sep='.')
        item, tail = tree.get('root.sub3.subsub.sub')
        self.assertTrue(item is NOTEXIST)
        self.assertTrue(tail == 'sub')
        
        tree = Tree(obj, OView, sep='.')
        item, tail = tree.get('root.sub3.subsub')
        
        self.assertTrue(item.obj == {'b': 'Dict `b` header'})
        self.assertTrue(item.cell == [None, 'Dict `b` header', None])
        self.assertTrue(item.path == 'root.sub3.subsub')
示例#2
0
    def test_converter(self):
        from werkzeug.routing import UnicodeConverter

        from base64 import (urlsafe_b64encode as encodestring,
                            urlsafe_b64decode as decodestring)

        class Base64Converter(UnicodeConverter):
            def to_python(self, value):
                tail = len(value) % 4 is 0 and 0 or 4 - len(value) % 4
                return decodestring(str(value) + tail*'=')

            def to_url(self, value):
                return encodestring(value).rstrip('=')            

        class OView(SortedNamesObjectViewMixin, TreeView):
            __type__ = O
            __cell__ = odict((('a', 'The a'),))
            __recursive__ = True

            def get_cell(self, objname, key):
                return getattr(self.obj, key, None)

        class SubView(SortedNamesObjectViewMixin, OView):
            __type__ = O1
            __cell__ = odict((('b', 'The b'), ('a', 'The a'),))
            '''
            path separator can be redefined for sublevels
            `sep` kwarg for `Tree.__init__` will not be respected in this case
            '''
            __sep__ = '.'


            def get_cell(self, objname, key):
                return getattr(self.obj, key, None)



        class DictSubView(SortedNamesDictViewMixin, SubView):
            __cell__ = odict((('c', 'The c'),))
            '''
            Converter defines name conversion rules for 
            `get` and `path` methods
            '''
            __converter__ = 'base64'

            '''Tree converters will be composed from TreeView subclasses (e.g. levels)
               `__converters__` attrs and `converters` kwarg for `Tree.__init__`
               So if hierarchy tree is complex and used in multiple tree generation processes
               it is better to define converters at level where it is used
               In simple cases its enough to set `converters` kwarg

            '''
            __converters__ = {'base64':Base64Converter}

            def get_cell(self, objname, key):
                return self.obj.get(key, None)
        
        obj = {'root':O(a='root header value for `a` key',
                              sub=O1(),
                              sub2=O(subsub={'a':'Dict `a` header'}),
                              sub3=O1(subsub={'b':'Dict `b` header'}),
                              sub4=O(subsub=O1(b='sub4 header value for `b` key',
                                               a='sub4 header value for `a` key'
                                                )),
                    )}
        tree = Tree(obj, OView, sep='.')

        item, tail = tree.get('root.sub3.c3Vic3Vi')
        self.assertTrue(item.obj == {'b': 'Dict `b` header'})