Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/galaxy/util/jstree.py @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author | shellac |
---|---|
date | Mon, 01 Jun 2020 08:59:25 -0400 |
parents | 79f47841a781 |
children |
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/galaxy/util/jstree.py Thu May 14 16:47:39 2020 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,156 +0,0 @@ -from __future__ import print_function - -import copy -import os -from collections import namedtuple - -import dictobj - -Path = namedtuple('Path', ('path', 'id', 'options')) - - -class Node(dictobj.DictionaryObject): - """ - Copyright 2012 "Grim Apps" - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - Helper class written by William Grim - grimwm - Original repo: https://github.com/grimwm/py-jstree - Code adjusted according to the idea of Frank Blechschmidt - FraBle - Thank you! - ************************ - This class exists as a helper to the JSTree. Its "jsonData" method can - generate sub-tree JSON without putting the logic directly into the JSTree. - - This data structure is only semi-immutable. The JSTree uses a directly - iterative (i.e. no stack is managed) builder pattern to construct a - tree out of paths. Therefore, the children are not known in advance, and - we have to keep the children attribute mutable. - """ - - def __init__(self, path, oid, **kwargs): - """ - kwargs allows users to pass arbitrary information into a Node that - will later be output in jsonData(). It allows for more advanced - configuration than the default path handling that JSTree currently allows. - For example, users may want to pass "attr" or some other valid jsTree options. - - Example: - >>> node = Node('a', None) - >>> assert node._items == {'text': 'a', 'children': dictobj.MutableDictionaryObject({})} - >>> assert node.jsonData() == {'text': 'a'} - - >>> node = Node('a', 1) - >>> assert node._items == {'text': 'a', 'children': dictobj.MutableDictionaryObject({}), 'li_attr': dictobj.DictionaryObject({'id': 1}), 'id': 1} - >>> assert node.jsonData() == {'text': 'a', 'id': 1, 'li_attr': {'id': 1}} - - >>> node = Node('a', 5, icon="folder", state = {'opened': True}) - >>> assert node._items == {'text': 'a', 'id': 5, 'state': dictobj.DictionaryObject({'opened': True}), 'children': dictobj.MutableDictionaryObject({}), 'li_attr': dictobj.DictionaryObject({'id': 5}), 'icon': 'folder'} - >>> assert node.jsonData() == {'text': 'a', 'state': {'opened': True}, 'id': 5, 'li_attr': {'id': 5}, 'icon': 'folder'} - """ - super(Node, self).__init__() - - children = kwargs.get('children', {}) - if len([key for key in children if not isinstance(children[key], Node)]): - raise TypeError( - "One or more children were not instances of '%s'" % Node.__name__) - if 'children' in kwargs: - del kwargs['children'] - self._items['children'] = dictobj.MutableDictionaryObject(children) - - if oid is not None: - li_attr = kwargs.get('li_attr', {}) - li_attr['id'] = oid - kwargs['li_attr'] = li_attr - self._items['id'] = oid - - self._items.update(dictobj.DictionaryObject(**kwargs)) - self._items['text'] = path - - def jsonData(self): - children = [self.children[k].jsonData() for k in sorted(self.children)] - output = {} - for k in self._items: - if 'children' == k: - continue - if isinstance(self._items[k], dictobj.DictionaryObject): - output[k] = self._items[k].asdict() - else: - output[k] = self._items[k] - if len(children): - output['children'] = children - return output - - -class JSTree(dictobj.DictionaryObject): - """ - An immutable dictionary-like object that converts a list of "paths" - into a tree structure suitable for jQuery's jsTree. - """ - - def __init__(self, paths, **kwargs): - """ - Take a list of paths and put them into a tree. Paths with the same prefix should - be at the same level in the tree. - - kwargs may be standard jsTree options used at all levels in the tree. These will be outputted - in the JSON. - - """ - if len([p for p in paths if not isinstance(p, Path)]): - raise TypeError( - "All paths must be instances of '%s'" % Path.__name__) - - super(JSTree, self).__init__() - - root = Node('', None, **kwargs) - for path in sorted(paths): - curr = root - subpaths = path.path.split(os.path.sep) - for i, subpath in enumerate(subpaths): - if subpath not in curr.children: - opt = copy.deepcopy(kwargs) - if len(subpaths) - 1 == i: - oid = path.id - opt.update(path.options) if path.options is not None else None - else: - oid = None - curr.children[subpath] = Node(subpath, oid, **opt) - # oid = path.id if len(subpaths) - 1 == i else None - # curr.children[subpath] = Node(subpath, oid, **kwargs) - curr = curr.children[subpath] - self._items['_root'] = root - - def pretty(self, root=None, depth=0, spacing=2): - """ - Create a "pretty print" represenation of the tree with customized indentation at each - level of the tree. - """ - if root is None: - root = self._root - fmt = "%s%s/" if root.children else "%s%s" - s = fmt % (" " * depth * spacing, root.text) - for child in root.children: - child = root.children[child] - s += "\n%s" % self.pretty(child, depth + 1, spacing) - return s - - def jsonData(self): - """ - Returns a copy of the internal tree in a JSON-friendly format, - ready for consumption by jsTree. The data is represented as a - list of dictionaries, each of which are our internal nodes. - - """ - return [self._root.children[k].jsonData() for k in sorted(self._root.children)]