Source code for itertree.itree_serializer.itree_renderer

"""
This code is taken from the itertree package:
  _ _____ _____ _____ _____ _____ _____ _____
 | |_   _|   __| __  |_   _| __  |   __|   __|
 |-| | | |   __|    -| | | |    -|   __|   __|
 |_| |_| |_____|__|__| |_| |__|__|_____|_____|

https://pypi.org/project/itertree/
GIT Home:
https://github.com/BR1py/itertree
The documentation can be found here:
https://itertree.readthedocs.io/en/latest/index.html

The code is published under MIT license
For more information see: https://en.wikipedia.org/wiki/MIT_License

CONTENT DESCRIPTION:

This part of code contains the standard iTree serializers (JSON and rendering)
"""

from __future__ import absolute_import

import os
import platform
import gzip
import hashlib
from collections import OrderedDict

from ..itree_helpers import *

[docs] class iTreeRender(object): """ Standard renderer fr the iTree object for creating a very simple pretty print output """ def __init__(self): self._identation = 3 self._heading = '> ' self._link_heading='>>'
[docs] def renders(self, itree_object, filter_method=None,enumerate=False): """ creates a pretty print string from iTree object and returns it in a string The rendered outputs can be filtered but only in hierarchical way. :param itree_object: iTree object to be converted :param filter_method: item filter method or filter-constant to filter specific items out Note:: The root of the object is not filtered and always in the outputs first line :param enumerate: add enumeration before the items :return: string containing the pretty print output """ return self._render_main(itree_object,filter_method,enumerate,False)
def _build_item_str(self,itree_object,enum_cnt=None): out = ['%s('%itree_object.__class__.__name__] if itree_object._tag != NoTag: out.append(repr(itree_object._tag)) out.append(', ') if itree_object._value != NoValue: out.append('value=') out.append(repr(itree_object._value)) out.append(', ') is_links_loaded=False if hasattr(itree_object,'_link') and itree_object._link: link = itree_object._link if link.file_path or link.target_path: out.append('link=iTLink(%s,%s)' % (repr(link.file_path),repr(link.target_path))) out.append(', ') is_links_loaded=link.is_loaded if itree_object._flags or is_links_loaded: flags = itree_object._flags& (~itree_object._LINKED) # we mask the linked out, is shown in header if flags!=0: flags = itree_object._flags if is_links_loaded and itree_object.is_link_root: flags=flags|iTFLAG.LOAD_LINKS if flags!=0: out.append('flags=%s' % (bin(flags))) if out[-1] == ', ': out = out[:-1] if out[-1] == ',': out = out[:-1] out.append(')\n') if enum_cnt is not None: out=['%i. '%enum_cnt]+out return ''.join(out) def _render_main(self, itree_object, filter_method=None,enumerate=False,level=0): """ internal function for rendering the itertree :param itree_object: iTree object to be converted :param filter_method: item filter method or filter-constant to filter specific items out :param enumerate: add enumeration before the items :param level: helper parameter for indentation-level :return: rendered tree output string """ output=[] if level==0: if filter_method: if filter_method(itree_object): if enumerate: output.append(self._build_item_str(itree_object,0)) else: output.append(self._build_item_str(itree_object)) else: if enumerate: output.append(self._build_item_str(itree_object, 0)) else: output.append(self._build_item_str(itree_object)) if filter_method: cnt=0 for item in filter(filter_method,itree_object): if item.is_linked: out = [' ', '. ' * (level), self._link_heading] else: out=[' ','. '*(level),self._heading] if enumerate: out.append(self._build_item_str(item, cnt)) cnt = cnt + 1 else: out.append(self._build_item_str(item)) output.append(''.join(out)) output.extend(self._render_main(item,filter_method,enumerate=enumerate,level=level+1)) else: for item in itree_object: if item.is_linked: out = [' ', '. ' * (level), self._link_heading] else: out = [' ', '. ' * (level), self._heading] if enumerate: out.append(self._build_item_str(item, cnt)) cnt = cnt + 1 else: out.append(self._build_item_str(item)) output.append(''.join(out)) output.extend(self._render_main(item, filter_method, enumerate=enumerate, level=level + 1)) return ''.join(output)