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')
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'})