Source code for pydeps.render_context

# -*- coding: utf-8 -*-


from StringIO import StringIO
from contextlib import contextmanager
import textwrap


[docs]class RenderContext(object): def __init__(self, out=None): self.out = out self.fp = StringIO() self.fillcolor = '#ffffff' self.fontcolor = '#000000' self.name = None self.concentrate = None @contextmanager
[docs] def graph(self, **kw): """Set up a graphviz graph context. """ self.name = kw.get('name', 'G') self.fillcolor = kw.get('fillcolor', '#ffffff') self.fontcolor = kw.get('fontcolor', '#000000') if kw.get('concentrate', True): self.concentrate = 'concentrate = true;' else: self.concentrate = '' self.dedent(""" digraph {self.name} {{ {self.concentrate} node [style=filled,fillcolor="{self.fillcolor}",fontcolor="{self.fontcolor}",fontname=Helvetica,fontsize=10]; """.format(self=self)) yield self.writeln('}')
[docs] def text(self): """Get value of output stream (StringIO). """ if self.out: self.out.close() # pragma: nocover return self.fp.getvalue()
[docs] def write(self, txt): """Write ``txt`` to file and output stream (StringIO). """ self.fp.write(txt) if self.out: self.out.write(txt) # pragma: nocover
[docs] def writeln(self, txt): """Write ``txt`` and add newline. """ self.write(txt + '\n')
[docs] def dedent(self, txt): """Write ``txt`` dedented. """ self.write(textwrap.dedent(txt))
[docs] def write_attributes(self, attrs): """Write comma separated attribute values (if exists). """ if attrs: self.write( ' [' + ','.join('%s="%s"' % kv for kv in attrs.items()) + ']' ) else: # pragma: nocover pass
def _nodename(self, x): "Return a valid node name." return x.replace('.', '_') def _delattr(self, attr, key, value): if attr.get(key) == value: del attr[key]
[docs] def write_rule(self, a, b, **attrs): "a -> b [a1=x,a2=y];" with self.rule(): self.write('%s -> %s' % (self._nodename(a), self._nodename(b))) self._delattr(attrs, 'weight', 1) self._delattr(attrs, 'minlen', 1) self.write_attributes(attrs)
[docs] def write_node(self, a, **attrs): "a [a1=x,a2=y];" with self.rule(): nodename = self._nodename(a) self.write(nodename) self._delattr(attrs, 'label', nodename) self._delattr(attrs, 'fillcolor', self.fillcolor) self._delattr(attrs, 'fontcolor', self.fontcolor) self.write_attributes(attrs)
@contextmanager
[docs] def rule(self): """Write indented rule. """ self.write(' ') yield self.writeln(';')