Blame SOURCES/0002-support-python3.patch

rdobuilder 6febab
From 050e291cbf63fd190f1ec14d65d1154a23ce8756 Mon Sep 17 00:00:00 2001
rdobuilder 6febab
From: Sandro Tosi <morph@debian.org>
rdobuilder 6febab
Date: Sun, 10 Jan 2016 00:25:45 +0000
rdobuilder 6febab
Subject: support python3
rdobuilder 6febab
rdobuilder 6febab
Origin: https://github.com/nlhepler/pydot/tree/adf18a858a63b321b7e4ffd964a24d73add1bf4f
rdobuilder 6febab
Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=739858
rdobuilder 6febab
Reviewed-by: Sandro Tosi <morph@debian.org>
rdobuilder 6febab
Last-Update: 2016-01-10
rdobuilder 6febab
rdobuilder 6febab
---
rdobuilder 6febab
 dot_parser.py |  429 ++++++++--------
rdobuilder 6febab
 pydot.py      | 1553 +++++++++++++++++++++++++++------------------------------
rdobuilder 6febab
 setup.py      |    6 +-
rdobuilder 6febab
 3 files changed, 954 insertions(+), 1034 deletions(-)
rdobuilder 6febab
rdobuilder 6febab
diff --git a/dot_parser.py b/dot_parser.py
rdobuilder 6febab
index dedd61a..4cdd482 100644
rdobuilder 6febab
--- a/dot_parser.py
rdobuilder 6febab
+++ b/dot_parser.py
rdobuilder 6febab
@@ -1,4 +1,3 @@
rdobuilder 6febab
-# -*- coding: Latin-1 -*-
rdobuilder 6febab
 """Graphviz's dot language parser.
rdobuilder 6febab
 
rdobuilder 6febab
 The dotparser parses graphviz files in dot and dot files and transforms them
rdobuilder 6febab
@@ -10,236 +9,215 @@ Author: Michael Krause <michael@krause-software.de>
rdobuilder 6febab
 Fixes by: Ero Carrera <ero@dkbza.org>
rdobuilder 6febab
 """
rdobuilder 6febab
 
rdobuilder 6febab
+from __future__ import division, print_function
rdobuilder 6febab
+
rdobuilder 6febab
 __author__ = ['Michael Krause', 'Ero Carrera']
rdobuilder 6febab
 __license__ = 'MIT'
rdobuilder 6febab
 
rdobuilder 6febab
-
rdobuilder 6febab
 import sys
rdobuilder 6febab
-import glob
rdobuilder 6febab
 import pydot
rdobuilder 6febab
-import re
rdobuilder 6febab
 import codecs
rdobuilder 6febab
 
rdobuilder 6febab
 from pyparsing import __version__ as pyparsing_version
rdobuilder 6febab
 
rdobuilder 6febab
-from pyparsing import ( nestedExpr, Literal, CaselessLiteral, Word, Upcase, OneOrMore, ZeroOrMore,
rdobuilder 6febab
-    Forward, NotAny, delimitedList, oneOf, Group, Optional, Combine, alphas, nums,
rdobuilder 6febab
-    restOfLine, cStyleComment, nums, alphanums, printables, empty, quotedString,
rdobuilder 6febab
-    ParseException, ParseResults, CharsNotIn, _noncomma, dblQuotedString, QuotedString, ParserElement )
rdobuilder 6febab
+from pyparsing import (
rdobuilder 6febab
+    nestedExpr, Literal, CaselessLiteral, Word, OneOrMore,
rdobuilder 6febab
+    Forward, Group, Optional, Combine, nums, restOfLine,
rdobuilder 6febab
+    cStyleComment, alphanums, printables, ParseException,
rdobuilder 6febab
+    ParseResults, CharsNotIn, QuotedString
rdobuilder 6febab
+    )
rdobuilder 6febab
+
rdobuilder 6febab
+
rdobuilder 6febab
+PY3 = not sys.version_info < (3, 0, 0)
rdobuilder 6febab
+
rdobuilder 6febab
+if PY3:
rdobuilder 6febab
+    basestring = str
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
 class P_AttrList:
rdobuilder 6febab
 
rdobuilder 6febab
     def __init__(self, toks):
rdobuilder 6febab
-
rdobuilder 6febab
         self.attrs = {}
rdobuilder 6febab
         i = 0
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         while i < len(toks):
rdobuilder 6febab
             attrname = toks[i]
rdobuilder 6febab
-            if i+2 < len(toks) and toks[i+1] == '=':
rdobuilder 6febab
-                attrvalue = toks[i+2]
rdobuilder 6febab
+            if i + 2 < len(toks) and toks[i + 1] == '=':
rdobuilder 6febab
+                attrvalue = toks[i + 2]
rdobuilder 6febab
                 i += 3
rdobuilder 6febab
             else:
rdobuilder 6febab
                 attrvalue = None
rdobuilder 6febab
                 i += 1
rdobuilder 6febab
-                
rdobuilder 6febab
+
rdobuilder 6febab
             self.attrs[attrname] = attrvalue
rdobuilder 6febab
-            
rdobuilder 6febab
-            
rdobuilder 6febab
-    def __repr__(self):
rdobuilder 6febab
 
rdobuilder 6febab
+    def __repr__(self):
rdobuilder 6febab
         return "%s(%r)" % (self.__class__.__name__, self.attrs)
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
-
rdobuilder 6febab
 class DefaultStatement(P_AttrList):
rdobuilder 6febab
 
rdobuilder 6febab
     def __init__(self, default_type, attrs):
rdobuilder 6febab
-
rdobuilder 6febab
         self.default_type = default_type
rdobuilder 6febab
         self.attrs = attrs
rdobuilder 6febab
 
rdobuilder 6febab
     def __repr__(self):
rdobuilder 6febab
-
rdobuilder 6febab
-        return "%s(%s, %r)" % (self.__class__.__name__,
rdobuilder 6febab
-            self.default_type, self.attrs)
rdobuilder 6febab
+        return "%s(%s, %r)" % (
rdobuilder 6febab
+            self.__class__.__name__,
rdobuilder 6febab
+            self.default_type, self.attrs
rdobuilder 6febab
+            )
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
 top_graphs = list()
rdobuilder 6febab
 
rdobuilder 6febab
-def push_top_graph_stmt(str, loc, toks):
rdobuilder 6febab
 
rdobuilder 6febab
+def push_top_graph_stmt(str, loc, toks):
rdobuilder 6febab
     attrs = {}
rdobuilder 6febab
     g = None
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     for element in toks:
rdobuilder 6febab
-    
rdobuilder 6febab
-        if( isinstance(element, (ParseResults, tuple, list)) and
rdobuilder 6febab
-            len(element) == 1 and isinstance(element[0], basestring) ):
rdobuilder 6febab
-            
rdobuilder 6febab
+        if (isinstance(element, (ParseResults, tuple, list)) and
rdobuilder 6febab
+                len(element) == 1 and isinstance(element[0], basestring)):
rdobuilder 6febab
             element = element[0]
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         if element == 'strict':
rdobuilder 6febab
             attrs['strict'] = True
rdobuilder 6febab
-            
rdobuilder 6febab
-        elif element in ['graph', 'digraph']:
rdobuilder 6febab
 
rdobuilder 6febab
+        elif element in ['graph', 'digraph']:
rdobuilder 6febab
             attrs = {}
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
             g = pydot.Dot(graph_type=element, **attrs)
rdobuilder 6febab
             attrs['type'] = element
rdobuilder 6febab
-            
rdobuilder 6febab
-            top_graphs.append( g )
rdobuilder 6febab
-            
rdobuilder 6febab
-        elif isinstance( element, basestring):
rdobuilder 6febab
-            g.set_name( element )
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
+            top_graphs.append(g)
rdobuilder 6febab
+
rdobuilder 6febab
+        elif isinstance(element, basestring):
rdobuilder 6febab
+            g.set_name(element)
rdobuilder 6febab
+
rdobuilder 6febab
         elif isinstance(element, pydot.Subgraph):
rdobuilder 6febab
-        
rdobuilder 6febab
-            g.obj_dict['attributes'].update( element.obj_dict['attributes'] )
rdobuilder 6febab
-            g.obj_dict['edges'].update( element.obj_dict['edges'] )
rdobuilder 6febab
-            g.obj_dict['nodes'].update( element.obj_dict['nodes'] )
rdobuilder 6febab
-            g.obj_dict['subgraphs'].update( element.obj_dict['subgraphs'] )
rdobuilder 6febab
-            
rdobuilder 6febab
+            g.obj_dict['attributes'].update(element.obj_dict['attributes'])
rdobuilder 6febab
+            g.obj_dict['edges'].update(element.obj_dict['edges'])
rdobuilder 6febab
+            g.obj_dict['nodes'].update(element.obj_dict['nodes'])
rdobuilder 6febab
+            g.obj_dict['subgraphs'].update(element.obj_dict['subgraphs'])
rdobuilder 6febab
             g.set_parent_graph(g)
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         elif isinstance(element, P_AttrList):
rdobuilder 6febab
             attrs.update(element.attrs)
rdobuilder 6febab
 
rdobuilder 6febab
         elif isinstance(element, (ParseResults, list)):
rdobuilder 6febab
             add_elements(g, element)
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         else:
rdobuilder 6febab
-            raise ValueError, "Unknown element statement: %r " % element
rdobuilder 6febab
-    
rdobuilder 6febab
-    
rdobuilder 6febab
+            raise ValueError("Unknown element statement: %r " % element)
rdobuilder 6febab
+
rdobuilder 6febab
     for g in top_graphs:
rdobuilder 6febab
         update_parent_graph_hierarchy(g)
rdobuilder 6febab
-    
rdobuilder 6febab
-    if len( top_graphs ) == 1:
rdobuilder 6febab
+
rdobuilder 6febab
+    if len(top_graphs) == 1:
rdobuilder 6febab
         return top_graphs[0]
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
     return top_graphs
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
 def update_parent_graph_hierarchy(g, parent_graph=None, level=0):
rdobuilder 6febab
-
rdobuilder 6febab
-
rdobuilder 6febab
     if parent_graph is None:
rdobuilder 6febab
         parent_graph = g
rdobuilder 6febab
-        
rdobuilder 6febab
-    for key_name in ('edges',):
rdobuilder 6febab
 
rdobuilder 6febab
+    for key_name in ('edges',):
rdobuilder 6febab
         if isinstance(g, pydot.frozendict):
rdobuilder 6febab
             item_dict = g
rdobuilder 6febab
         else:
rdobuilder 6febab
             item_dict = g.obj_dict
rdobuilder 6febab
-            
rdobuilder 6febab
-        if not item_dict.has_key( key_name ):
rdobuilder 6febab
+
rdobuilder 6febab
+        if key_name not in item_dict:
rdobuilder 6febab
             continue
rdobuilder 6febab
 
rdobuilder 6febab
         for key, objs in item_dict[key_name].items():
rdobuilder 6febab
             for obj in objs:
rdobuilder 6febab
-                if 'parent_graph' in obj and obj['parent_graph'].get_parent_graph()==g:
rdobuilder 6febab
+                if 'parent_graph' in obj and obj['parent_graph'].get_parent_graph() == g:
rdobuilder 6febab
                     if obj['parent_graph'] is g:
rdobuilder 6febab
                         pass
rdobuilder 6febab
                     else:
rdobuilder 6febab
                         obj['parent_graph'].set_parent_graph(parent_graph)
rdobuilder 6febab
 
rdobuilder 6febab
                 if key_name == 'edges' and len(key) == 2:
rdobuilder 6febab
-                    for idx, vertex in enumerate( obj['points'] ):
rdobuilder 6febab
-                        if isinstance( vertex, (pydot.Graph, pydot.Subgraph, pydot.Cluster)):
rdobuilder 6febab
+                    for idx, vertex in enumerate(obj['points']):
rdobuilder 6febab
+                        if isinstance(vertex, (pydot.Graph, pydot.Subgraph, pydot.Cluster)):
rdobuilder 6febab
                             vertex.set_parent_graph(parent_graph)
rdobuilder 6febab
-                        if isinstance( vertex, pydot.frozendict):
rdobuilder 6febab
+                        if isinstance(vertex, pydot.frozendict):
rdobuilder 6febab
                             if vertex['parent_graph'] is g:
rdobuilder 6febab
                                 pass
rdobuilder 6febab
                             else:
rdobuilder 6febab
                                 vertex['parent_graph'].set_parent_graph(parent_graph)
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
-
rdobuilder 6febab
 def add_defaults(element, defaults):
rdobuilder 6febab
-
rdobuilder 6febab
     d = element.__dict__
rdobuilder 6febab
     for key, value in defaults.items():
rdobuilder 6febab
         if not d.get(key):
rdobuilder 6febab
             d[key] = value
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
-
rdobuilder 6febab
 def add_elements(g, toks, defaults_graph=None, defaults_node=None, defaults_edge=None):
rdobuilder 6febab
-    
rdobuilder 6febab
     if defaults_graph is None:
rdobuilder 6febab
         defaults_graph = {}
rdobuilder 6febab
     if defaults_node is None:
rdobuilder 6febab
         defaults_node = {}
rdobuilder 6febab
     if defaults_edge is None:
rdobuilder 6febab
         defaults_edge = {}
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
     for elm_idx, element in enumerate(toks):
rdobuilder 6febab
-        
rdobuilder 6febab
         if isinstance(element, (pydot.Subgraph, pydot.Cluster)):
rdobuilder 6febab
-        
rdobuilder 6febab
             add_defaults(element, defaults_graph)
rdobuilder 6febab
             g.add_subgraph(element)
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         elif isinstance(element, pydot.Node):
rdobuilder 6febab
-        
rdobuilder 6febab
             add_defaults(element, defaults_node)
rdobuilder 6febab
             g.add_node(element)
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         elif isinstance(element, pydot.Edge):
rdobuilder 6febab
-        
rdobuilder 6febab
             add_defaults(element, defaults_edge)
rdobuilder 6febab
             g.add_edge(element)
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         elif isinstance(element, ParseResults):
rdobuilder 6febab
-        
rdobuilder 6febab
             for e in element:
rdobuilder 6febab
                 add_elements(g, [e], defaults_graph, defaults_node, defaults_edge)
rdobuilder 6febab
-                
rdobuilder 6febab
+
rdobuilder 6febab
         elif isinstance(element, DefaultStatement):
rdobuilder 6febab
-        
rdobuilder 6febab
             if element.default_type == 'graph':
rdobuilder 6febab
-            
rdobuilder 6febab
                 default_graph_attrs = pydot.Node('graph', **element.attrs)
rdobuilder 6febab
                 g.add_node(default_graph_attrs)
rdobuilder 6febab
 
rdobuilder 6febab
             elif element.default_type == 'node':
rdobuilder 6febab
-            
rdobuilder 6febab
                 default_node_attrs = pydot.Node('node', **element.attrs)
rdobuilder 6febab
                 g.add_node(default_node_attrs)
rdobuilder 6febab
 
rdobuilder 6febab
             elif element.default_type == 'edge':
rdobuilder 6febab
-            
rdobuilder 6febab
                 default_edge_attrs = pydot.Node('edge', **element.attrs)
rdobuilder 6febab
                 g.add_node(default_edge_attrs)
rdobuilder 6febab
                 defaults_edge.update(element.attrs)
rdobuilder 6febab
 
rdobuilder 6febab
             else:
rdobuilder 6febab
-                raise ValueError, "Unknown DefaultStatement: %s " % element.default_type
rdobuilder 6febab
-                
rdobuilder 6febab
+                raise ValueError("Unknown DefaultStatement: %s " % element.default_type)
rdobuilder 6febab
+
rdobuilder 6febab
         elif isinstance(element, P_AttrList):
rdobuilder 6febab
-        
rdobuilder 6febab
             g.obj_dict['attributes'].update(element.attrs)
rdobuilder 6febab
 
rdobuilder 6febab
         else:
rdobuilder 6febab
-            raise ValueError, "Unknown element statement: %r" % element
rdobuilder 6febab
+            raise ValueError("Unknown element statement: %r" % element)
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
-def push_graph_stmt(str, loc, toks):            
rdobuilder 6febab
-                       
rdobuilder 6febab
+def push_graph_stmt(str, loc, toks):
rdobuilder 6febab
     g = pydot.Subgraph('')
rdobuilder 6febab
     add_elements(g, toks)
rdobuilder 6febab
     return g
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
 def push_subgraph_stmt(str, loc, toks):
rdobuilder 6febab
-
rdobuilder 6febab
     g = pydot.Subgraph('')
rdobuilder 6febab
+
rdobuilder 6febab
     for e in toks:
rdobuilder 6febab
-        if len(e)==3:
rdobuilder 6febab
+        if len(e) == 3:
rdobuilder 6febab
             e[2].set_name(e[1])
rdobuilder 6febab
             if e[0] == 'subgraph':
rdobuilder 6febab
                 e[2].obj_dict['show_keyword'] = True
rdobuilder 6febab
@@ -253,11 +231,9 @@ def push_subgraph_stmt(str, loc, toks):
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
 def push_default_stmt(str, loc, toks):
rdobuilder 6febab
-
rdobuilder 6febab
     # The pydot class instances should be marked as
rdobuilder 6febab
     # default statements to be inherited by actual
rdobuilder 6febab
     # graphs, nodes and edges.
rdobuilder 6febab
-    #
rdobuilder 6febab
     default_type = toks[0][0]
rdobuilder 6febab
     if len(toks) > 1:
rdobuilder 6febab
         attrs = toks[1].attrs
rdobuilder 6febab
@@ -267,90 +243,80 @@ def push_default_stmt(str, loc, toks):
rdobuilder 6febab
     if default_type in ['graph', 'node', 'edge']:
rdobuilder 6febab
         return DefaultStatement(default_type, attrs)
rdobuilder 6febab
     else:
rdobuilder 6febab
-        raise ValueError, "Unknown default statement: %r " % toks
rdobuilder 6febab
+        raise ValueError("Unknown default statement: %r " % toks)
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
 def push_attr_list(str, loc, toks):
rdobuilder 6febab
-
rdobuilder 6febab
     p = P_AttrList(toks)
rdobuilder 6febab
     return p
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
 def get_port(node):
rdobuilder 6febab
-
rdobuilder 6febab
-    if len(node)>1:
rdobuilder 6febab
+    if len(node) > 1:
rdobuilder 6febab
         if isinstance(node[1], ParseResults):
rdobuilder 6febab
-            if len(node[1][0])==2:
rdobuilder 6febab
-                if node[1][0][0]==':':
rdobuilder 6febab
+            if len(node[1][0]) == 2:
rdobuilder 6febab
+                if node[1][0][0] == ':':
rdobuilder 6febab
                     return node[1][0][1]
rdobuilder 6febab
-                    
rdobuilder 6febab
     return None
rdobuilder 6febab
 
rdobuilder 6febab
-    
rdobuilder 6febab
-def do_node_ports(node):
rdobuilder 6febab
 
rdobuilder 6febab
+def do_node_ports(node):
rdobuilder 6febab
     node_port = ''
rdobuilder 6febab
+
rdobuilder 6febab
     if len(node) > 1:
rdobuilder 6febab
-        node_port = ''.join( [str(a)+str(b) for a,b in node[1] ] )
rdobuilder 6febab
+        node_port = ''.join([str(a) + str(b) for a, b in node[1]])
rdobuilder 6febab
 
rdobuilder 6febab
     return node_port
rdobuilder 6febab
 
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
 def push_edge_stmt(str, loc, toks):
rdobuilder 6febab
-    
rdobuilder 6febab
     tok_attrs = [a for a in toks if isinstance(a, P_AttrList)]
rdobuilder 6febab
     attrs = {}
rdobuilder 6febab
+
rdobuilder 6febab
     for a in tok_attrs:
rdobuilder 6febab
         attrs.update(a.attrs)
rdobuilder 6febab
 
rdobuilder 6febab
     e = []
rdobuilder 6febab
 
rdobuilder 6febab
     if isinstance(toks[0][0], pydot.Graph):
rdobuilder 6febab
-    
rdobuilder 6febab
         n_prev = pydot.frozendict(toks[0][0].obj_dict)
rdobuilder 6febab
-    else:        
rdobuilder 6febab
-        n_prev = toks[0][0] + do_node_ports( toks[0] )
rdobuilder 6febab
+    else:
rdobuilder 6febab
+        n_prev = toks[0][0] + do_node_ports(toks[0])
rdobuilder 6febab
 
rdobuilder 6febab
     if isinstance(toks[2][0], ParseResults):
rdobuilder 6febab
-    
rdobuilder 6febab
-        n_next_list = [[n.get_name(),] for n in toks[2][0] ]
rdobuilder 6febab
+        n_next_list = [[n.get_name()] for n in toks[2][0]]
rdobuilder 6febab
         for n_next in [n for n in n_next_list]:
rdobuilder 6febab
             n_next_port = do_node_ports(n_next)
rdobuilder 6febab
-            e.append(pydot.Edge(n_prev, n_next[0]+n_next_port, **attrs))
rdobuilder 6febab
+            e.append(pydot.Edge(n_prev, n_next[0] + n_next_port, **attrs))
rdobuilder 6febab
 
rdobuilder 6febab
     elif isinstance(toks[2][0], pydot.Graph):
rdobuilder 6febab
-    
rdobuilder 6febab
         e.append(pydot.Edge(n_prev, pydot.frozendict(toks[2][0].obj_dict), **attrs))
rdobuilder 6febab
 
rdobuilder 6febab
     elif isinstance(toks[2][0], pydot.Node):
rdobuilder 6febab
-    
rdobuilder 6febab
         node = toks[2][0]
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         if node.get_port() is not None:
rdobuilder 6febab
             name_port = node.get_name() + ":" + node.get_port()
rdobuilder 6febab
         else:
rdobuilder 6febab
             name_port = node.get_name()
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         e.append(pydot.Edge(n_prev, name_port, **attrs))
rdobuilder 6febab
 
rdobuilder 6febab
     elif isinstance(toks[2][0], type('')):
rdobuilder 6febab
-    
rdobuilder 6febab
         for n_next in [n for n in tuple(toks)[2::2]]:
rdobuilder 6febab
-
rdobuilder 6febab
             if isinstance(n_next, P_AttrList) or not isinstance(n_next[0], type('')):
rdobuilder 6febab
                 continue
rdobuilder 6febab
 
rdobuilder 6febab
-            n_next_port = do_node_ports( n_next )
rdobuilder 6febab
-            e.append(pydot.Edge(n_prev, n_next[0]+n_next_port, **attrs))
rdobuilder 6febab
-                
rdobuilder 6febab
-            n_prev = n_next[0]+n_next_port
rdobuilder 6febab
-            
rdobuilder 6febab
+            n_next_port = do_node_ports(n_next)
rdobuilder 6febab
+            e.append(pydot.Edge(n_prev, n_next[0] + n_next_port, **attrs))
rdobuilder 6febab
+
rdobuilder 6febab
+            n_prev = n_next[0] + n_next_port
rdobuilder 6febab
+
rdobuilder 6febab
     else:
rdobuilder 6febab
         # UNEXPECTED EDGE TYPE
rdobuilder 6febab
         pass
rdobuilder 6febab
-        
rdobuilder 6febab
-    return e
rdobuilder 6febab
 
rdobuilder 6febab
+    return e
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
 def push_node_stmt(s, loc, toks):
rdobuilder 6febab
@@ -359,30 +325,25 @@ def push_node_stmt(s, loc, toks):
rdobuilder 6febab
         attrs = toks[1].attrs
rdobuilder 6febab
     else:
rdobuilder 6febab
         attrs = {}
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
     node_name = toks[0]
rdobuilder 6febab
     if isinstance(node_name, list) or isinstance(node_name, tuple):
rdobuilder 6febab
-        if len(node_name)>0:
rdobuilder 6febab
+        if len(node_name) > 0:
rdobuilder 6febab
             node_name = node_name[0]
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     n = pydot.Node(str(node_name), **attrs)
rdobuilder 6febab
     return n
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
-
rdobuilder 6febab
-    
rdobuilder 6febab
-    
rdobuilder 6febab
-
rdobuilder 6febab
 graphparser = None
rdobuilder 6febab
 
rdobuilder 6febab
-def graph_definition():
rdobuilder 6febab
 
rdobuilder 6febab
+def graph_definition():
rdobuilder 6febab
     global graphparser
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     if not graphparser:
rdobuilder 6febab
-    
rdobuilder 6febab
         # punctuation
rdobuilder 6febab
-        colon  = Literal(":")
rdobuilder 6febab
+        colon = Literal(":")
rdobuilder 6febab
         lbrace = Literal("{")
rdobuilder 6febab
         rbrace = Literal("}")
rdobuilder 6febab
         lbrack = Literal("[")
rdobuilder 6febab
@@ -390,142 +351,170 @@ def graph_definition():
rdobuilder 6febab
         lparen = Literal("(")
rdobuilder 6febab
         rparen = Literal(")")
rdobuilder 6febab
         equals = Literal("=")
rdobuilder 6febab
-        comma  = Literal(",")
rdobuilder 6febab
-        dot    = Literal(".")
rdobuilder 6febab
-        slash  = Literal("/")
rdobuilder 6febab
-        bslash = Literal("\\")
rdobuilder 6febab
-        star   = Literal("*")
rdobuilder 6febab
-        semi   = Literal(";")
rdobuilder 6febab
-        at     = Literal("@")
rdobuilder 6febab
-        minus  = Literal("-")
rdobuilder 6febab
-        
rdobuilder 6febab
+        comma = Literal(",")
rdobuilder 6febab
+        # dot = Literal(".")
rdobuilder 6febab
+        # slash = Literal("/")
rdobuilder 6febab
+        # bslash = Literal("\\")
rdobuilder 6febab
+        # star = Literal("*")
rdobuilder 6febab
+        semi = Literal(";")
rdobuilder 6febab
+        at = Literal("@")
rdobuilder 6febab
+        minus = Literal("-")
rdobuilder 6febab
+
rdobuilder 6febab
         # keywords
rdobuilder 6febab
-        strict_    = CaselessLiteral("strict")
rdobuilder 6febab
-        graph_     = CaselessLiteral("graph")
rdobuilder 6febab
-        digraph_   = CaselessLiteral("digraph")
rdobuilder 6febab
-        subgraph_  = CaselessLiteral("subgraph")
rdobuilder 6febab
-        node_      = CaselessLiteral("node")
rdobuilder 6febab
-        edge_      = CaselessLiteral("edge")
rdobuilder 6febab
-        
rdobuilder 6febab
-        
rdobuilder 6febab
+        strict_ = CaselessLiteral("strict")
rdobuilder 6febab
+        graph_ = CaselessLiteral("graph")
rdobuilder 6febab
+        digraph_ = CaselessLiteral("digraph")
rdobuilder 6febab
+        subgraph_ = CaselessLiteral("subgraph")
rdobuilder 6febab
+        node_ = CaselessLiteral("node")
rdobuilder 6febab
+        edge_ = CaselessLiteral("edge")
rdobuilder 6febab
+
rdobuilder 6febab
         # token definitions
rdobuilder 6febab
-        
rdobuilder 6febab
-        identifier = Word(alphanums + "_." ).setName("identifier")
rdobuilder 6febab
-        
rdobuilder 6febab
-        double_quoted_string = QuotedString('"', multiline=True, unquoteResults=False) # dblQuotedString
rdobuilder 6febab
+        identifier = Word(alphanums + "_.").setName("identifier")
rdobuilder 6febab
+
rdobuilder 6febab
+        # dblQuotedString
rdobuilder 6febab
+        double_quoted_string = QuotedString('"', multiline=True, unquoteResults=False)
rdobuilder 6febab
 
rdobuilder 6febab
-        alphastring_ = OneOrMore(CharsNotIn(_noncomma + ' '))
rdobuilder 6febab
+        noncomma_ = "".join([c for c in printables if c != ","])
rdobuilder 6febab
+        alphastring_ = OneOrMore(CharsNotIn(noncomma_ + ' '))
rdobuilder 6febab
 
rdobuilder 6febab
         def parse_html(s, loc, toks):
rdobuilder 6febab
             return '<%s>' % ''.join(toks[0])
rdobuilder 6febab
-            
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         opener = '<'
rdobuilder 6febab
         closer = '>'
rdobuilder 6febab
-        html_text = nestedExpr( opener, closer, 
rdobuilder 6febab
-            ( CharsNotIn( opener + closer )  ) 
rdobuilder 6febab
-                ).setParseAction(parse_html).leaveWhitespace()
rdobuilder 6febab
-
rdobuilder 6febab
-        ID = ( identifier | html_text | 
rdobuilder 6febab
-            double_quoted_string | #.setParseAction(strip_quotes) |
rdobuilder 6febab
-            alphastring_ ).setName("ID")
rdobuilder 6febab
-            
rdobuilder 6febab
-        
rdobuilder 6febab
-        float_number = Combine(Optional(minus) +	
rdobuilder 6febab
-            OneOrMore(Word(nums + "."))).setName("float_number")
rdobuilder 6febab
-            
rdobuilder 6febab
-        righthand_id =  (float_number | ID ).setName("righthand_id")
rdobuilder 6febab
+        html_text = nestedExpr(
rdobuilder 6febab
+            opener, closer,
rdobuilder 6febab
+            (CharsNotIn(opener + closer))
rdobuilder 6febab
+            ).setParseAction(parse_html).leaveWhitespace()
rdobuilder 6febab
+
rdobuilder 6febab
+        ID = (
rdobuilder 6febab
+            identifier | html_text |
rdobuilder 6febab
+            double_quoted_string |  # .setParseAction(strip_quotes) |
rdobuilder 6febab
+            alphastring_
rdobuilder 6febab
+            ).setName("ID")
rdobuilder 6febab
+
rdobuilder 6febab
+        float_number = Combine(
rdobuilder 6febab
+            Optional(minus) +
rdobuilder 6febab
+            OneOrMore(Word(nums + "."))
rdobuilder 6febab
+            ).setName("float_number")
rdobuilder 6febab
+
rdobuilder 6febab
+        righthand_id = (float_number | ID).setName("righthand_id")
rdobuilder 6febab
 
rdobuilder 6febab
         port_angle = (at + ID).setName("port_angle")
rdobuilder 6febab
-        
rdobuilder 6febab
-        port_location = (OneOrMore(Group(colon + ID)) |	
rdobuilder 6febab
-            Group(colon + lparen + ID + comma + ID + rparen)).setName("port_location")
rdobuilder 6febab
-            
rdobuilder 6febab
-        port = (Group(port_location + Optional(port_angle)) |	
rdobuilder 6febab
-            Group(port_angle + Optional(port_location))).setName("port")
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
+        port_location = (
rdobuilder 6febab
+            OneOrMore(Group(colon + ID)) |
rdobuilder 6febab
+            Group(colon + lparen + ID + comma + ID + rparen)
rdobuilder 6febab
+            ).setName("port_location")
rdobuilder 6febab
+
rdobuilder 6febab
+        port = (
rdobuilder 6febab
+            Group(port_location + Optional(port_angle)) |
rdobuilder 6febab
+            Group(port_angle + Optional(port_location))
rdobuilder 6febab
+            ).setName("port")
rdobuilder 6febab
+
rdobuilder 6febab
         node_id = (ID + Optional(port))
rdobuilder 6febab
-        a_list = OneOrMore(ID + Optional(equals + righthand_id) +
rdobuilder 6febab
-            Optional(comma.suppress())).setName("a_list")
rdobuilder 6febab
-        
rdobuilder 6febab
-        attr_list = OneOrMore(lbrack.suppress() + Optional(a_list) +	
rdobuilder 6febab
-            rbrack.suppress()).setName("attr_list")
rdobuilder 6febab
-        
rdobuilder 6febab
+        a_list = OneOrMore(
rdobuilder 6febab
+            ID + Optional(equals + righthand_id) + Optional(comma.suppress())
rdobuilder 6febab
+            ).setName("a_list")
rdobuilder 6febab
+
rdobuilder 6febab
+        attr_list = OneOrMore(
rdobuilder 6febab
+            lbrack.suppress() + Optional(a_list) + rbrack.suppress()
rdobuilder 6febab
+            ).setName("attr_list")
rdobuilder 6febab
+
rdobuilder 6febab
         attr_stmt = (Group(graph_ | node_ | edge_) + attr_list).setName("attr_stmt")
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         edgeop = (Literal("--") | Literal("->")).setName("edgeop")
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         stmt_list = Forward()
rdobuilder 6febab
-        graph_stmt = Group(lbrace.suppress() + Optional(stmt_list) +	
rdobuilder 6febab
-            rbrace.suppress() + Optional(semi.suppress()) ).setName("graph_stmt")
rdobuilder 6febab
-            
rdobuilder 6febab
-            
rdobuilder 6febab
+        graph_stmt = Group(
rdobuilder 6febab
+            lbrace.suppress() + Optional(stmt_list) +
rdobuilder 6febab
+            rbrace.suppress() + Optional(semi.suppress())
rdobuilder 6febab
+            ).setName("graph_stmt")
rdobuilder 6febab
+
rdobuilder 6febab
         edge_point = Forward()
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         edgeRHS = OneOrMore(edgeop + edge_point)
rdobuilder 6febab
         edge_stmt = edge_point + edgeRHS + Optional(attr_list)
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         subgraph = Group(subgraph_ + Optional(ID) + graph_stmt).setName("subgraph")
rdobuilder 6febab
-        
rdobuilder 6febab
-        edge_point << Group( subgraph | graph_stmt | node_id ).setName('edge_point')
rdobuilder 6febab
-        
rdobuilder 6febab
-        node_stmt = (node_id + Optional(attr_list) + Optional(semi.suppress())).setName("node_stmt")
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
+        edge_point << Group(subgraph | graph_stmt | node_id).setName('edge_point')
rdobuilder 6febab
+
rdobuilder 6febab
+        node_stmt = (
rdobuilder 6febab
+            node_id + Optional(attr_list) + Optional(semi.suppress())
rdobuilder 6febab
+            ).setName("node_stmt")
rdobuilder 6febab
+
rdobuilder 6febab
         assignment = (ID + equals + righthand_id).setName("assignment")
rdobuilder 6febab
-        stmt =  (assignment | edge_stmt | attr_stmt | subgraph | graph_stmt | node_stmt).setName("stmt")
rdobuilder 6febab
+        stmt = (
rdobuilder 6febab
+            assignment | edge_stmt | attr_stmt |
rdobuilder 6febab
+            subgraph | graph_stmt | node_stmt
rdobuilder 6febab
+            ).setName("stmt")
rdobuilder 6febab
         stmt_list << OneOrMore(stmt + Optional(semi.suppress()))
rdobuilder 6febab
-        
rdobuilder 6febab
-        graphparser = OneOrMore( (Optional(strict_) + Group((graph_ | digraph_)) +
rdobuilder 6febab
-            Optional(ID) + graph_stmt).setResultsName("graph") )
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
+        graphparser = OneOrMore((
rdobuilder 6febab
+            Optional(strict_) + Group((graph_ | digraph_)) +
rdobuilder 6febab
+            Optional(ID) + graph_stmt
rdobuilder 6febab
+            ).setResultsName("graph"))
rdobuilder 6febab
+
rdobuilder 6febab
         singleLineComment = Group("//" + restOfLine) | Group("#" + restOfLine)
rdobuilder 6febab
-        
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         # actions
rdobuilder 6febab
-        
rdobuilder 6febab
         graphparser.ignore(singleLineComment)
rdobuilder 6febab
         graphparser.ignore(cStyleComment)
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         assignment.setParseAction(push_attr_list)
rdobuilder 6febab
         a_list.setParseAction(push_attr_list)
rdobuilder 6febab
         edge_stmt.setParseAction(push_edge_stmt)
rdobuilder 6febab
         node_stmt.setParseAction(push_node_stmt)
rdobuilder 6febab
         attr_stmt.setParseAction(push_default_stmt)
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         subgraph.setParseAction(push_subgraph_stmt)
rdobuilder 6febab
         graph_stmt.setParseAction(push_graph_stmt)
rdobuilder 6febab
         graphparser.setParseAction(push_top_graph_stmt)
rdobuilder 6febab
-        
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     return graphparser
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
 def parse_dot_data(data):
rdobuilder 6febab
-
rdobuilder 6febab
     global top_graphs
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     top_graphs = list()
rdobuilder 6febab
 
rdobuilder 6febab
-    if data.startswith(codecs.BOM_UTF8):
rdobuilder 6febab
-        data = data.decode( 'utf-8' )
rdobuilder 6febab
-        
rdobuilder 6febab
+    if PY3:
rdobuilder 6febab
+        if isinstance(data, bytes):
rdobuilder 6febab
+            # this is extremely hackish
rdobuilder 6febab
+            try:
rdobuilder 6febab
+                idx = data.index(b'charset') + 7
rdobuilder 6febab
+                while data[idx] in b' \t\n\r=':
rdobuilder 6febab
+                    idx += 1
rdobuilder 6febab
+                fst = idx
rdobuilder 6febab
+                while data[idx] not in b' \t\n\r];,':
rdobuilder 6febab
+                    idx += 1
rdobuilder 6febab
+                charset = data[fst:idx].strip(b'"\'').decode('ascii')
rdobuilder 6febab
+                data = data.decode(charset)
rdobuilder 6febab
+            except:
rdobuilder 6febab
+                data = data.decode('utf-8')
rdobuilder 6febab
+    else:
rdobuilder 6febab
+        if data.startswith(codecs.BOM_UTF8):
rdobuilder 6febab
+            data = data.decode('utf-8')
rdobuilder 6febab
+
rdobuilder 6febab
     try:
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
         graphparser = graph_definition()
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         if pyparsing_version >= '1.2':
rdobuilder 6febab
             graphparser.parseWithTabs()
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         tokens = graphparser.parseString(data)
rdobuilder 6febab
 
rdobuilder 6febab
         if len(tokens) == 1:
rdobuilder 6febab
             return tokens[0]
rdobuilder 6febab
         else:
rdobuilder 6febab
             return [g for g in tokens]
rdobuilder 6febab
-        
rdobuilder 6febab
-    except ParseException, err:
rdobuilder 6febab
-    
rdobuilder 6febab
-        print err.line
rdobuilder 6febab
-        print " "*(err.column-1) + "^"
rdobuilder 6febab
-        print err
rdobuilder 6febab
+
rdobuilder 6febab
+    except ParseException:
rdobuilder 6febab
+        err = sys.exc_info()[1]
rdobuilder 6febab
+        print(err.line)
rdobuilder 6febab
+        print(" " * (err.column - 1) + "^")
rdobuilder 6febab
+        print(err)
rdobuilder 6febab
         return None
rdobuilder 6febab
diff --git a/pydot.py b/pydot.py
rdobuilder 6febab
index e9bd2a1..c20db18 100644
rdobuilder 6febab
--- a/pydot.py
rdobuilder 6febab
+++ b/pydot.py
rdobuilder 6febab
@@ -17,24 +17,40 @@ Copyright (c) 2005-2011 Ero Carrera <ero.carrera@gmail.com>
rdobuilder 6febab
 Distributed under MIT license [http://opensource.org/licenses/mit-license.html].
rdobuilder 6febab
 """
rdobuilder 6febab
 
rdobuilder 6febab
-__revision__ = "$LastChangedRevision: 28 $"
rdobuilder 6febab
+from __future__ import division, print_function
rdobuilder 6febab
+
rdobuilder 6febab
 __author__ = 'Ero Carrera'
rdobuilder 6febab
-__version__ = '1.0.%d' % int( __revision__[21:-2] )
rdobuilder 6febab
+__version__ = '1.0.29'
rdobuilder 6febab
 __license__ = 'MIT'
rdobuilder 6febab
 
rdobuilder 6febab
 import os
rdobuilder 6febab
 import re
rdobuilder 6febab
 import subprocess
rdobuilder 6febab
+import sys
rdobuilder 6febab
 import tempfile
rdobuilder 6febab
 import copy
rdobuilder 6febab
+
rdobuilder 6febab
+from operator import itemgetter
rdobuilder 6febab
+
rdobuilder 6febab
 try:
rdobuilder 6febab
     import dot_parser
rdobuilder 6febab
-except Exception, e:
rdobuilder 6febab
-    print "Couldn't import dot_parser, loading of dot files will not be possible."
rdobuilder 6febab
-    
rdobuilder 6febab
+except Exception:
rdobuilder 6febab
+    print("Couldn't import dot_parser, loading of dot files will not be possible.")
rdobuilder 6febab
+
rdobuilder 6febab
 
rdobuilder 6febab
+PY3 = not sys.version_info < (3, 0, 0)
rdobuilder 6febab
 
rdobuilder 6febab
-GRAPH_ATTRIBUTES = set( ['Damping', 'K', 'URL', 'aspect', 'bb', 'bgcolor',
rdobuilder 6febab
+if PY3:
rdobuilder 6febab
+    NULL_SEP = b''
rdobuilder 6febab
+    basestring = str
rdobuilder 6febab
+    long = int
rdobuilder 6febab
+    unicode = str
rdobuilder 6febab
+else:
rdobuilder 6febab
+    NULL_SEP = ''
rdobuilder 6febab
+
rdobuilder 6febab
+
rdobuilder 6febab
+GRAPH_ATTRIBUTES = set([
rdobuilder 6febab
+    'Damping', 'K', 'URL', 'aspect', 'bb', 'bgcolor',
rdobuilder 6febab
     'center', 'charset', 'clusterrank', 'colorscheme', 'comment', 'compound',
rdobuilder 6febab
     'concentrate', 'defaultdist', 'dim', 'dimen', 'diredgeconstraints',
rdobuilder 6febab
     'dpi', 'epsilon', 'esep', 'fontcolor', 'fontname', 'fontnames',
rdobuilder 6febab
@@ -46,13 +62,15 @@ GRAPH_ATTRIBUTES = set( ['Damping', 'K', 'URL', 'aspect', 'bb', 'bgcolor',
rdobuilder 6febab
     'overlap_scaling', 'pack', 'packmode', 'pad', 'page', 'pagedir',
rdobuilder 6febab
     'quadtree', 'quantum', 'rankdir', 'ranksep', 'ratio', 'remincross',
rdobuilder 6febab
     'repulsiveforce', 'resolution', 'root', 'rotate', 'searchsize', 'sep',
rdobuilder 6febab
-    'showboxes', 'size', 'smoothing', 'sortv', 'splines', 'start', 
rdobuilder 6febab
+    'showboxes', 'size', 'smoothing', 'sortv', 'splines', 'start',
rdobuilder 6febab
     'stylesheet', 'target', 'truecolor', 'viewport', 'voro_margin',
rdobuilder 6febab
-    # for subgraphs 
rdobuilder 6febab
-    'rank' ] )
rdobuilder 6febab
+    # for subgraphs
rdobuilder 6febab
+    'rank'
rdobuilder 6febab
+   ])
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
-EDGE_ATTRIBUTES = set( ['URL', 'arrowhead', 'arrowsize', 'arrowtail',
rdobuilder 6febab
+EDGE_ATTRIBUTES = set([
rdobuilder 6febab
+    'URL', 'arrowhead', 'arrowsize', 'arrowtail',
rdobuilder 6febab
     'color', 'colorscheme', 'comment', 'constraint', 'decorate', 'dir',
rdobuilder 6febab
     'edgeURL', 'edgehref', 'edgetarget', 'edgetooltip', 'fontcolor',
rdobuilder 6febab
     'fontname', 'fontsize', 'headURL', 'headclip', 'headhref', 'headlabel',
rdobuilder 6febab
@@ -63,10 +81,12 @@ EDGE_ATTRIBUTES = set( ['URL', 'arrowhead', 'arrowsize', 'arrowtail',
rdobuilder 6febab
     'nojustify', 'penwidth', 'pos', 'samehead', 'sametail', 'showboxes',
rdobuilder 6febab
     'style', 'tailURL', 'tailclip', 'tailhref', 'taillabel', 'tailport',
rdobuilder 6febab
     'tailtarget', 'tailtooltip', 'target', 'tooltip', 'weight',
rdobuilder 6febab
-    'rank' ] )
rdobuilder 6febab
+    'rank'
rdobuilder 6febab
+   ])
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
-NODE_ATTRIBUTES = set( ['URL', 'color', 'colorscheme', 'comment',
rdobuilder 6febab
+NODE_ATTRIBUTES = set([
rdobuilder 6febab
+    'URL', 'color', 'colorscheme', 'comment',
rdobuilder 6febab
     'distortion', 'fillcolor', 'fixedsize', 'fontcolor', 'fontname',
rdobuilder 6febab
     'fontsize', 'group', 'height', 'id', 'image', 'imagescale', 'label',
rdobuilder 6febab
     'labelloc', 'layer', 'margin', 'nojustify', 'orientation', 'penwidth',
rdobuilder 6febab
@@ -74,14 +94,62 @@ NODE_ATTRIBUTES = set( ['URL', 'color', 'colorscheme', 'comment',
rdobuilder 6febab
     'shape', 'shapefile', 'showboxes', 'sides', 'skew', 'sortv', 'style',
rdobuilder 6febab
     'target', 'tooltip', 'vertices', 'width', 'z',
rdobuilder 6febab
     # The following are attributes dot2tex
rdobuilder 6febab
-    'texlbl',  'texmode' ] )
rdobuilder 6febab
+    'texlbl', 'texmode'
rdobuilder 6febab
+   ])
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
-CLUSTER_ATTRIBUTES = set( ['K', 'URL', 'bgcolor', 'color', 'colorscheme',
rdobuilder 6febab
+CLUSTER_ATTRIBUTES = set([
rdobuilder 6febab
+    'K', 'URL', 'bgcolor', 'color', 'colorscheme',
rdobuilder 6febab
     'fillcolor', 'fontcolor', 'fontname', 'fontsize', 'label', 'labeljust',
rdobuilder 6febab
     'labelloc', 'lheight', 'lp', 'lwidth', 'nojustify', 'pencolor',
rdobuilder 6febab
-    'penwidth', 'peripheries', 'sortv', 'style', 'target', 'tooltip'] )
rdobuilder 6febab
-            
rdobuilder 6febab
+    'penwidth', 'peripheries', 'sortv', 'style', 'target', 'tooltip'
rdobuilder 6febab
+   ])
rdobuilder 6febab
+
rdobuilder 6febab
+
rdobuilder 6febab
+def is_string_like(obj): # from John Hunter, types-free version
rdobuilder 6febab
+    """Check if obj is string."""
rdobuilder 6febab
+    try:
rdobuilder 6febab
+        obj + ''
rdobuilder 6febab
+    except (TypeError, ValueError):
rdobuilder 6febab
+        return False
rdobuilder 6febab
+    return True
rdobuilder 6febab
+
rdobuilder 6febab
+def get_fobj(fname, mode='w+'):
rdobuilder 6febab
+    """Obtain a proper file object.
rdobuilder 6febab
+
rdobuilder 6febab
+    Parameters
rdobuilder 6febab
+    ----------
rdobuilder 6febab
+    fname : string, file object, file descriptor
rdobuilder 6febab
+        If a string or file descriptor, then we create a file object. If *fname*
rdobuilder 6febab
+        is a file object, then we do nothing and ignore the specified *mode*
rdobuilder 6febab
+        parameter.
rdobuilder 6febab
+    mode : str
rdobuilder 6febab
+        The mode of the file to be opened.
rdobuilder 6febab
+
rdobuilder 6febab
+    Returns
rdobuilder 6febab
+    -------
rdobuilder 6febab
+    fobj : file object
rdobuilder 6febab
+        The file object.
rdobuilder 6febab
+    close : bool
rdobuilder 6febab
+        If *fname* was a string, then *close* will be *True* to signify that
rdobuilder 6febab
+        the file object should be closed after writing to it. Otherwise, *close*
rdobuilder 6febab
+        will be *False* signifying that the user, in essence, created the file
rdobuilder 6febab
+        object already and that subsequent operations should not close it.
rdobuilder 6febab
+
rdobuilder 6febab
+    """
rdobuilder 6febab
+    if is_string_like(fname):
rdobuilder 6febab
+        fobj = open(fname, mode)
rdobuilder 6febab
+        close = True
rdobuilder 6febab
+    elif hasattr(fname, 'write'):
rdobuilder 6febab
+        # fname is a file-like object, perhaps a StringIO (for example)
rdobuilder 6febab
+        fobj = fname
rdobuilder 6febab
+        close = False
rdobuilder 6febab
+    else:
rdobuilder 6febab
+        # assume it is a file descriptor
rdobuilder 6febab
+        fobj = os.fdopen(fname, mode)
rdobuilder 6febab
+        close = False
rdobuilder 6febab
+    return fobj, close
rdobuilder 6febab
+
rdobuilder 6febab
 
rdobuilder 6febab
 #
rdobuilder 6febab
 # Extented version of ASPN's Python Cookbook Recipe:
rdobuilder 6febab
@@ -92,7 +160,7 @@ CLUSTER_ATTRIBUTES = set( ['K', 'URL', 'bgcolor', 'color', 'colorscheme',
rdobuilder 6febab
 #
rdobuilder 6febab
 class frozendict(dict):
rdobuilder 6febab
     def _blocked_attribute(obj):
rdobuilder 6febab
-        raise AttributeError, "A frozendict cannot be modified."
rdobuilder 6febab
+        raise AttributeError("A frozendict cannot be modified.")
rdobuilder 6febab
     _blocked_attribute = property(_blocked_attribute)
rdobuilder 6febab
 
rdobuilder 6febab
     __delitem__ = __setitem__ = clear = _blocked_attribute
rdobuilder 6febab
@@ -105,7 +173,7 @@ class frozendict(dict):
rdobuilder 6febab
         for arg in args:
rdobuilder 6febab
             if isinstance(arg, dict):
rdobuilder 6febab
                 arg = copy.copy(arg)
rdobuilder 6febab
-                for k, v in arg.iteritems():
rdobuilder 6febab
+                for k, v in arg.items():
rdobuilder 6febab
                     if isinstance(v, frozendict):
rdobuilder 6febab
                         arg[k] = v
rdobuilder 6febab
                     elif isinstance(v, dict):
rdobuilder 6febab
@@ -114,13 +182,13 @@ class frozendict(dict):
rdobuilder 6febab
                         v_ = list()
rdobuilder 6febab
                         for elm in v:
rdobuilder 6febab
                             if isinstance(elm, dict):
rdobuilder 6febab
-                                v_.append( frozendict(elm) )
rdobuilder 6febab
+                                v_.append(frozendict(elm))
rdobuilder 6febab
                             else:
rdobuilder 6febab
-                                v_.append( elm )
rdobuilder 6febab
+                                v_.append(elm)
rdobuilder 6febab
                         arg[k] = tuple(v_)
rdobuilder 6febab
-                args_.append( arg )
rdobuilder 6febab
+                args_.append(arg)
rdobuilder 6febab
             else:
rdobuilder 6febab
-                args_.append( arg )
rdobuilder 6febab
+                args_.append(arg)
rdobuilder 6febab
 
rdobuilder 6febab
         dict.__init__(new, *args_, **kw)
rdobuilder 6febab
         return new
rdobuilder 6febab
@@ -132,7 +200,7 @@ class frozendict(dict):
rdobuilder 6febab
         try:
rdobuilder 6febab
             return self._cached_hash
rdobuilder 6febab
         except AttributeError:
rdobuilder 6febab
-            h = self._cached_hash = hash(tuple(sorted(self.iteritems())))
rdobuilder 6febab
+            h = self._cached_hash = hash(tuple(sorted(self.items())))
rdobuilder 6febab
             return h
rdobuilder 6febab
 
rdobuilder 6febab
     def __repr__(self):
rdobuilder 6febab
@@ -142,23 +210,25 @@ class frozendict(dict):
rdobuilder 6febab
 dot_keywords = ['graph', 'subgraph', 'digraph', 'node', 'edge', 'strict']
rdobuilder 6febab
 
rdobuilder 6febab
 id_re_alpha_nums = re.compile('^[_a-zA-Z][a-zA-Z0-9_,]*$', re.UNICODE)
rdobuilder 6febab
-id_re_alpha_nums_with_ports = re.compile('^[_a-zA-Z][a-zA-Z0-9_,:\"]*[a-zA-Z0-9_,\"]+$', re.UNICODE)
rdobuilder 6febab
+id_re_alpha_nums_with_ports = re.compile(
rdobuilder 6febab
+    '^[_a-zA-Z][a-zA-Z0-9_,:\"]*[a-zA-Z0-9_,\"]+$', re.UNICODE
rdobuilder 6febab
+    )
rdobuilder 6febab
 id_re_num = re.compile('^[0-9,]+$', re.UNICODE)
rdobuilder 6febab
 id_re_with_port = re.compile('^([^:]*):([^:]*)$', re.UNICODE)
rdobuilder 6febab
-id_re_dbl_quoted = re.compile('^\".*\"$', re.S|re.UNICODE)
rdobuilder 6febab
-id_re_html = re.compile('^<.*>$', re.S|re.UNICODE)
rdobuilder 6febab
+id_re_dbl_quoted = re.compile('^\".*\"$', re.S | re.UNICODE)
rdobuilder 6febab
+id_re_html = re.compile('^<.*>$', re.S | re.UNICODE)
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
-def needs_quotes( s ):
rdobuilder 6febab
+def needs_quotes(s):
rdobuilder 6febab
     """Checks whether a string is a dot language ID.
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     It will check whether the string is solely composed
rdobuilder 6febab
     by the characters allowed in an ID or not.
rdobuilder 6febab
     If the string is one of the reserved keywords it will
rdobuilder 6febab
     need quotes too but the user will need to add them
rdobuilder 6febab
     manually.
rdobuilder 6febab
     """
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     # If the name is a reserved keyword it will need quotes but pydot
rdobuilder 6febab
     # can't tell when it's being used as a keyword or when it's simply
rdobuilder 6febab
     # a name. Hence the user needs to supply the quotes when an element
rdobuilder 6febab
@@ -168,11 +238,14 @@ def needs_quotes( s ):
rdobuilder 6febab
     if s in dot_keywords:
rdobuilder 6febab
         return False
rdobuilder 6febab
 
rdobuilder 6febab
-    chars = [ord(c) for c in s if ord(c)>0x7f or ord(c)==0]
rdobuilder 6febab
+    chars = [ord(c) for c in s if ord(c) > 0x7f or ord(c) == 0]
rdobuilder 6febab
     if chars and not id_re_dbl_quoted.match(s) and not id_re_html.match(s):
rdobuilder 6febab
         return True
rdobuilder 6febab
-        
rdobuilder 6febab
-    for test_re in [id_re_alpha_nums, id_re_num, id_re_dbl_quoted, id_re_html, id_re_alpha_nums_with_ports]:
rdobuilder 6febab
+
rdobuilder 6febab
+    for test_re in [
rdobuilder 6febab
+            id_re_alpha_nums, id_re_num, id_re_dbl_quoted,
rdobuilder 6febab
+            id_re_html, id_re_alpha_nums_with_ports
rdobuilder 6febab
+           ]:
rdobuilder 6febab
         if test_re.match(s):
rdobuilder 6febab
             return False
rdobuilder 6febab
 
rdobuilder 6febab
@@ -184,109 +257,109 @@ def needs_quotes( s ):
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
 def quote_if_necessary(s):
rdobuilder 6febab
+    # Older versions of graphviz throws a syntax error for empty values without
rdobuilder 6febab
+    # quotes, e.g. [label=]
rdobuilder 6febab
+    if s == '':
rdobuilder 6febab
+        return '""'
rdobuilder 6febab
 
rdobuilder 6febab
     if isinstance(s, bool):
rdobuilder 6febab
         if s is True:
rdobuilder 6febab
             return 'True'
rdobuilder 6febab
         return 'False'
rdobuilder 6febab
 
rdobuilder 6febab
-    if not isinstance( s, basestring ):
rdobuilder 6febab
+    if not isinstance(s, basestring):
rdobuilder 6febab
         return s
rdobuilder 6febab
 
rdobuilder 6febab
     if not s:
rdobuilder 6febab
         return s
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
     if needs_quotes(s):
rdobuilder 6febab
-        replace = {'"'  : r'\"',
rdobuilder 6febab
-                   "\n" : r'\n',
rdobuilder 6febab
-                   "\r" : r'\r'}
rdobuilder 6febab
-        for (a,b) in replace.items():
rdobuilder 6febab
+        replace = {'"': r'\"', "\n": r'\n', "\r": r'\r'}
rdobuilder 6febab
+        for (a, b) in replace.items():
rdobuilder 6febab
             s = s.replace(a, b)
rdobuilder 6febab
 
rdobuilder 6febab
         return '"' + s + '"'
rdobuilder 6febab
-     
rdobuilder 6febab
-    return s   
rdobuilder 6febab
 
rdobuilder 6febab
+    return s
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
 def graph_from_dot_data(data):
rdobuilder 6febab
     """Load graph as defined by data in DOT format.
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     The data is assumed to be in DOT format. It will
rdobuilder 6febab
-    be parsed and a Dot class will be returned, 
rdobuilder 6febab
+    be parsed and a Dot class will be returned,
rdobuilder 6febab
     representing the graph.
rdobuilder 6febab
     """
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     return dot_parser.parse_dot_data(data)
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
 def graph_from_dot_file(path):
rdobuilder 6febab
     """Load graph as defined by a DOT file.
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     The file is assumed to be in DOT format. It will
rdobuilder 6febab
-    be loaded, parsed and a Dot class will be returned, 
rdobuilder 6febab
+    be loaded, parsed and a Dot class will be returned,
rdobuilder 6febab
     representing the graph.
rdobuilder 6febab
     """
rdobuilder 6febab
-    
rdobuilder 6febab
-    fd = file(path, 'rb')
rdobuilder 6febab
+
rdobuilder 6febab
+    fd = open(path, 'rb')
rdobuilder 6febab
     data = fd.read()
rdobuilder 6febab
     fd.close()
rdobuilder 6febab
-    
rdobuilder 6febab
-    return graph_from_dot_data(data)
rdobuilder 6febab
 
rdobuilder 6febab
+    return graph_from_dot_data(data)
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
 def graph_from_edges(edge_list, node_prefix='', directed=False):
rdobuilder 6febab
     """Creates a basic graph out of an edge list.
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     The edge list has to be a list of tuples representing
rdobuilder 6febab
     the nodes connected by the edge.
rdobuilder 6febab
     The values can be anything: bool, int, float, str.
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     If the graph is undirected by default, it is only
rdobuilder 6febab
     calculated from one of the symmetric halves of the matrix.
rdobuilder 6febab
     """
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     if directed:
rdobuilder 6febab
         graph = Dot(graph_type='digraph')
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
     else:
rdobuilder 6febab
         graph = Dot(graph_type='graph')
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
     for edge in edge_list:
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         if isinstance(edge[0], str):
rdobuilder 6febab
             src = node_prefix + edge[0]
rdobuilder 6febab
         else:
rdobuilder 6febab
             src = node_prefix + str(edge[0])
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         if isinstance(edge[1], str):
rdobuilder 6febab
             dst = node_prefix + edge[1]
rdobuilder 6febab
         else:
rdobuilder 6febab
             dst = node_prefix + str(edge[1])
rdobuilder 6febab
 
rdobuilder 6febab
-        e = Edge( src, dst )
rdobuilder 6febab
+        e = Edge(src, dst)
rdobuilder 6febab
         graph.add_edge(e)
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
     return graph
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
-def graph_from_adjacency_matrix(matrix, node_prefix= u'', directed=False):
rdobuilder 6febab
+def graph_from_adjacency_matrix(matrix, node_prefix='', directed=False):
rdobuilder 6febab
     """Creates a basic graph out of an adjacency matrix.
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     The matrix has to be a list of rows of values
rdobuilder 6febab
     representing an adjacency matrix.
rdobuilder 6febab
     The values can be anything: bool, int, float, as long
rdobuilder 6febab
     as they can evaluate to True or False.
rdobuilder 6febab
     """
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     node_orig = 1
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     if directed:
rdobuilder 6febab
         graph = Dot(graph_type='digraph')
rdobuilder 6febab
     else:
rdobuilder 6febab
         graph = Dot(graph_type='graph')
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
     for row in matrix:
rdobuilder 6febab
         if not directed:
rdobuilder 6febab
             skip = matrix.index(row)
rdobuilder 6febab
@@ -294,320 +367,297 @@ def graph_from_adjacency_matrix(matrix, node_prefix= u'', directed=False):
rdobuilder 6febab
         else:
rdobuilder 6febab
             skip = 0
rdobuilder 6febab
             r = row
rdobuilder 6febab
-        node_dest = skip+1
rdobuilder 6febab
-        
rdobuilder 6febab
+        node_dest = skip + 1
rdobuilder 6febab
+
rdobuilder 6febab
         for e in r:
rdobuilder 6febab
             if e:
rdobuilder 6febab
                 graph.add_edge(
rdobuilder 6febab
-                    Edge( node_prefix + node_orig, 
rdobuilder 6febab
-                        node_prefix + node_dest) )
rdobuilder 6febab
+                    Edge(
rdobuilder 6febab
+                        node_prefix + node_orig,
rdobuilder 6febab
+                        node_prefix + node_dest
rdobuilder 6febab
+                        )
rdobuilder 6febab
+                    )
rdobuilder 6febab
             node_dest += 1
rdobuilder 6febab
         node_orig += 1
rdobuilder 6febab
-        
rdobuilder 6febab
-    return graph
rdobuilder 6febab
 
rdobuilder 6febab
+    return graph
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
 def graph_from_incidence_matrix(matrix, node_prefix='', directed=False):
rdobuilder 6febab
     """Creates a basic graph out of an incidence matrix.
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     The matrix has to be a list of rows of values
rdobuilder 6febab
     representing an incidence matrix.
rdobuilder 6febab
     The values can be anything: bool, int, float, as long
rdobuilder 6febab
     as they can evaluate to True or False.
rdobuilder 6febab
     """
rdobuilder 6febab
-    
rdobuilder 6febab
-    node_orig = 1
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     if directed:
rdobuilder 6febab
         graph = Dot(graph_type='digraph')
rdobuilder 6febab
     else:
rdobuilder 6febab
         graph = Dot(graph_type='graph')
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
     for row in matrix:
rdobuilder 6febab
         nodes = []
rdobuilder 6febab
         c = 1
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         for node in row:
rdobuilder 6febab
             if node:
rdobuilder 6febab
-                nodes.append(c*node)
rdobuilder 6febab
+                nodes.append(c * node)
rdobuilder 6febab
             c += 1
rdobuilder 6febab
-            nodes.sort()
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
+        nodes.sort()
rdobuilder 6febab
+
rdobuilder 6febab
         if len(nodes) == 2:
rdobuilder 6febab
-            graph.add_edge(	
rdobuilder 6febab
-                Edge( node_prefix + abs(nodes[0]),	
rdobuilder 6febab
-                    node_prefix + nodes[1] ))
rdobuilder 6febab
+            graph.add_edge(
rdobuilder 6febab
+                Edge(
rdobuilder 6febab
+                    node_prefix + abs(nodes[0]),
rdobuilder 6febab
+                    node_prefix + nodes[1]
rdobuilder 6febab
+                    )
rdobuilder 6febab
+                )
rdobuilder 6febab
 
rdobuilder 6febab
     if not directed:
rdobuilder 6febab
         graph.set_simplify(True)
rdobuilder 6febab
 
rdobuilder 6febab
     return graph
rdobuilder 6febab
 
rdobuilder 6febab
-            
rdobuilder 6febab
-
rdobuilder 6febab
 
rdobuilder 6febab
 def __find_executables(path):
rdobuilder 6febab
     """Used by find_graphviz
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     path - single directory as a string
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     If any of the executables are found, it will return a dictionary
rdobuilder 6febab
     containing the program names as keys and their paths as values.
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     Otherwise returns None
rdobuilder 6febab
     """
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     success = False
rdobuilder 6febab
     progs = {'dot': '', 'twopi': '', 'neato': '', 'circo': '', 'fdp': '', 'sfdp': ''}
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     was_quoted = False
rdobuilder 6febab
     path = path.strip()
rdobuilder 6febab
     if path.startswith('"') and path.endswith('"'):
rdobuilder 6febab
         path = path[1:-1]
rdobuilder 6febab
-        was_quoted =  True
rdobuilder 6febab
-    
rdobuilder 6febab
-    if os.path.isdir(path) : 
rdobuilder 6febab
-    
rdobuilder 6febab
-        for prg in progs.iterkeys():
rdobuilder 6febab
-    
rdobuilder 6febab
+        was_quoted = True
rdobuilder 6febab
+
rdobuilder 6febab
+    if os.path.isdir(path):
rdobuilder 6febab
+        for prg in progs.keys():
rdobuilder 6febab
             if progs[prg]:
rdobuilder 6febab
                 continue
rdobuilder 6febab
-               
rdobuilder 6febab
-            if os.path.exists( os.path.join(path, prg) ):
rdobuilder 6febab
-                
rdobuilder 6febab
+
rdobuilder 6febab
+            if os.path.exists(os.path.join(path, prg)):
rdobuilder 6febab
                 if was_quoted:
rdobuilder 6febab
                     progs[prg] = '"' + os.path.join(path, prg) + '"'
rdobuilder 6febab
                 else:
rdobuilder 6febab
                     progs[prg] = os.path.join(path, prg)
rdobuilder 6febab
-                    
rdobuilder 6febab
+
rdobuilder 6febab
                 success = True
rdobuilder 6febab
-               
rdobuilder 6febab
-            elif os.path.exists( os.path.join(path, prg + '.exe') ):
rdobuilder 6febab
 
rdobuilder 6febab
+            elif os.path.exists(os.path.join(path, prg + '.exe')):
rdobuilder 6febab
                 if was_quoted:
rdobuilder 6febab
                     progs[prg] = '"' + os.path.join(path, prg + '.exe') + '"'
rdobuilder 6febab
                 else:
rdobuilder 6febab
                     progs[prg] = os.path.join(path, prg + '.exe')
rdobuilder 6febab
-                    
rdobuilder 6febab
+
rdobuilder 6febab
                 success = True
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     if success:
rdobuilder 6febab
-    
rdobuilder 6febab
         return progs
rdobuilder 6febab
-        
rdobuilder 6febab
     else:
rdobuilder 6febab
-    
rdobuilder 6febab
         return None
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
-
rdobuilder 6febab
 # The multi-platform version of this 'find_graphviz' function was
rdobuilder 6febab
 # contributed by Peter Cock
rdobuilder 6febab
-#
rdobuilder 6febab
 def find_graphviz():
rdobuilder 6febab
     """Locate Graphviz's executables in the system.
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     Tries three methods:
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     First: Windows Registry (Windows only)
rdobuilder 6febab
     This requires Mark Hammond's pywin32 is installed.
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     Secondly: Search the path
rdobuilder 6febab
     It will look for 'dot', 'twopi' and 'neato' in all the directories
rdobuilder 6febab
     specified in the PATH environment variable.
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     Thirdly: Default install location (Windows only)
rdobuilder 6febab
     It will look for 'dot', 'twopi' and 'neato' in the default install
rdobuilder 6febab
     location under the "Program Files" directory.
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     It will return a dictionary containing the program names as keys
rdobuilder 6febab
     and their paths as values.
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     If this fails, it returns None.
rdobuilder 6febab
     """
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     # Method 1 (Windows only)
rdobuilder 6febab
-    #
rdobuilder 6febab
     if os.sys.platform == 'win32':
rdobuilder 6febab
-        
rdobuilder 6febab
-        HKEY_LOCAL_MACHINE =    0x80000002
rdobuilder 6febab
-        KEY_QUERY_VALUE =       0x0001
rdobuilder 6febab
+
rdobuilder 6febab
+        HKEY_LOCAL_MACHINE = 0x80000002
rdobuilder 6febab
+        KEY_QUERY_VALUE = 0x0001
rdobuilder 6febab
 
rdobuilder 6febab
         RegOpenKeyEx = None
rdobuilder 6febab
         RegQueryValueEx = None
rdobuilder 6febab
         RegCloseKey = None
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         try:
rdobuilder 6febab
-            import win32api, win32con
rdobuilder 6febab
+            import win32api
rdobuilder 6febab
             RegOpenKeyEx = win32api.RegOpenKeyEx
rdobuilder 6febab
             RegQueryValueEx = win32api.RegQueryValueEx
rdobuilder 6febab
             RegCloseKey = win32api.RegCloseKey
rdobuilder 6febab
 
rdobuilder 6febab
         except ImportError:
rdobuilder 6febab
             # Print a messaged suggesting they install these?
rdobuilder 6febab
-            #
rdobuilder 6febab
             pass
rdobuilder 6febab
 
rdobuilder 6febab
         try:
rdobuilder 6febab
             import ctypes
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
             def RegOpenKeyEx(key, subkey, opt, sam):
rdobuilder 6febab
                 result = ctypes.c_uint(0)
rdobuilder 6febab
                 ctypes.windll.advapi32.RegOpenKeyExA(key, subkey, opt, sam, ctypes.byref(result))
rdobuilder 6febab
                 return result.value
rdobuilder 6febab
-                
rdobuilder 6febab
-            def RegQueryValueEx( hkey, valuename ):
rdobuilder 6febab
+
rdobuilder 6febab
+            def RegQueryValueEx(hkey, valuename):
rdobuilder 6febab
                 data_type = ctypes.c_uint(0)
rdobuilder 6febab
                 data_len = ctypes.c_uint(1024)
rdobuilder 6febab
-                data = ctypes.create_string_buffer( 1024 )
rdobuilder 6febab
-                
rdobuilder 6febab
-                res = ctypes.windll.advapi32.RegQueryValueExA(hkey, valuename, 0, 
rdobuilder 6febab
-                    ctypes.byref(data_type), data, ctypes.byref(data_len))
rdobuilder 6febab
-                    
rdobuilder 6febab
+                data = ctypes.create_string_buffer(1024)
rdobuilder 6febab
+
rdobuilder 6febab
+                # this has a return value, which we should probably check
rdobuilder 6febab
+                ctypes.windll.advapi32.RegQueryValueExA(
rdobuilder 6febab
+                    hkey, valuename, 0, ctypes.byref(data_type),
rdobuilder 6febab
+                    data, ctypes.byref(data_len)
rdobuilder 6febab
+                    )
rdobuilder 6febab
+
rdobuilder 6febab
                 return data.value
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
             RegCloseKey = ctypes.windll.advapi32.RegCloseKey
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         except ImportError:
rdobuilder 6febab
             # Print a messaged suggesting they install these?
rdobuilder 6febab
-            #
rdobuilder 6febab
             pass
rdobuilder 6febab
 
rdobuilder 6febab
         if RegOpenKeyEx is not None:
rdobuilder 6febab
-            
rdobuilder 6febab
             # Get the GraphViz install path from the registry
rdobuilder 6febab
-            #
rdobuilder 6febab
             hkey = None
rdobuilder 6febab
             potentialKeys = [
rdobuilder 6febab
                 "SOFTWARE\\ATT\\Graphviz",
rdobuilder 6febab
-                "SOFTWARE\\AT&T Research Labs\\Graphviz",
rdobuilder 6febab
-            ]
rdobuilder 6febab
+                "SOFTWARE\\AT&T Research Labs\\Graphviz"
rdobuilder 6febab
+                ]
rdobuilder 6febab
             for potentialKey in potentialKeys:
rdobuilder 6febab
-                
rdobuilder 6febab
+
rdobuilder 6febab
                 try:
rdobuilder 6febab
-                    hkey = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
rdobuilder 6febab
-                        potentialKey, 0, KEY_QUERY_VALUE )
rdobuilder 6febab
-                    
rdobuilder 6febab
+                    hkey = RegOpenKeyEx(
rdobuilder 6febab
+                        HKEY_LOCAL_MACHINE,
rdobuilder 6febab
+                        potentialKey, 0, KEY_QUERY_VALUE
rdobuilder 6febab
+                        )
rdobuilder 6febab
+
rdobuilder 6febab
                     if hkey is not None:
rdobuilder 6febab
-                        path = RegQueryValueEx( hkey, "InstallPath" )
rdobuilder 6febab
-                        RegCloseKey( hkey )
rdobuilder 6febab
-                        
rdobuilder 6febab
+                        path = RegQueryValueEx(hkey, "InstallPath")
rdobuilder 6febab
+                        RegCloseKey(hkey)
rdobuilder 6febab
+
rdobuilder 6febab
                         # The regitry variable might exist, left by old installations
rdobuilder 6febab
                         # but with no value, in those cases we keep searching...
rdobuilder 6febab
                         if not path:
rdobuilder 6febab
                             continue
rdobuilder 6febab
-                        
rdobuilder 6febab
+
rdobuilder 6febab
                         # Now append the "bin" subdirectory:
rdobuilder 6febab
-                        #
rdobuilder 6febab
                         path = os.path.join(path, "bin")
rdobuilder 6febab
                         progs = __find_executables(path)
rdobuilder 6febab
-                        if progs is not None :
rdobuilder 6febab
-                            #print "Used Windows registry"
rdobuilder 6febab
+                        if progs is not None:
rdobuilder 6febab
+                            #print("Used Windows registry")
rdobuilder 6febab
                             return progs
rdobuilder 6febab
-                
rdobuilder 6febab
-                except Exception, excp:
rdobuilder 6febab
-                    #raise excp
rdobuilder 6febab
+
rdobuilder 6febab
+                except Exception:
rdobuilder 6febab
+                    #raise
rdobuilder 6febab
                     pass
rdobuilder 6febab
                 else:
rdobuilder 6febab
                     break
rdobuilder 6febab
-                    
rdobuilder 6febab
-
rdobuilder 6febab
 
rdobuilder 6febab
     # Method 2 (Linux, Windows etc)
rdobuilder 6febab
-    #
rdobuilder 6febab
-    if os.environ.has_key('PATH'):
rdobuilder 6febab
-    
rdobuilder 6febab
+    if 'PATH' in os.environ:
rdobuilder 6febab
         for path in os.environ['PATH'].split(os.pathsep):
rdobuilder 6febab
             progs = __find_executables(path)
rdobuilder 6febab
-            if progs is not None :
rdobuilder 6febab
-                #print "Used path"
rdobuilder 6febab
+            if progs is not None:
rdobuilder 6febab
+                #print("Used path")
rdobuilder 6febab
                 return progs
rdobuilder 6febab
 
rdobuilder 6febab
     # Method 3 (Windows only)
rdobuilder 6febab
-    #
rdobuilder 6febab
     if os.sys.platform == 'win32':
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
         # Try and work out the equivalent of "C:\Program Files" on this
rdobuilder 6febab
         # machine (might be on drive D:, or in a different language)
rdobuilder 6febab
-        #
rdobuilder 6febab
-        
rdobuilder 6febab
-        if os.environ.has_key('PROGRAMFILES'):
rdobuilder 6febab
-        
rdobuilder 6febab
+        if 'PROGRAMFILES' in os.environ:
rdobuilder 6febab
             # Note, we could also use the win32api to get this
rdobuilder 6febab
             # information, but win32api may not be installed.
rdobuilder 6febab
-            
rdobuilder 6febab
             path = os.path.join(os.environ['PROGRAMFILES'], 'ATT', 'GraphViz', 'bin')
rdobuilder 6febab
-            
rdobuilder 6febab
         else:
rdobuilder 6febab
-        
rdobuilder 6febab
             #Just in case, try the default...
rdobuilder 6febab
             path = r"C:\Program Files\att\Graphviz\bin"
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         progs = __find_executables(path)
rdobuilder 6febab
-        
rdobuilder 6febab
-        if progs is not None :
rdobuilder 6febab
-        
rdobuilder 6febab
-            #print "Used default install location"
rdobuilder 6febab
-            return progs
rdobuilder 6febab
 
rdobuilder 6febab
+        if progs is not None:
rdobuilder 6febab
+
rdobuilder 6febab
+            #print("Used default install location")
rdobuilder 6febab
+            return progs
rdobuilder 6febab
 
rdobuilder 6febab
     for path in (
rdobuilder 6febab
-        '/usr/bin', '/usr/local/bin',
rdobuilder 6febab
-        '/opt/local/bin',
rdobuilder 6febab
-        '/opt/bin', '/sw/bin', '/usr/share',
rdobuilder 6febab
-        '/Applications/Graphviz.app/Contents/MacOS/' ):
rdobuilder 6febab
-        
rdobuilder 6febab
+            '/usr/bin', '/usr/local/bin',
rdobuilder 6febab
+            '/opt/local/bin',
rdobuilder 6febab
+            '/opt/bin', '/sw/bin', '/usr/share',
rdobuilder 6febab
+            '/Applications/Graphviz.app/Contents/MacOS/'
rdobuilder 6febab
+            ):
rdobuilder 6febab
+
rdobuilder 6febab
         progs = __find_executables(path)
rdobuilder 6febab
-        if progs is not None :
rdobuilder 6febab
-            #print "Used path"
rdobuilder 6febab
+        if progs is not None:
rdobuilder 6febab
+            #print("Used path")
rdobuilder 6febab
             return progs
rdobuilder 6febab
 
rdobuilder 6febab
     # Failed to find GraphViz
rdobuilder 6febab
-    #
rdobuilder 6febab
     return None
rdobuilder 6febab
-    
rdobuilder 6febab
 
rdobuilder 6febab
-class Common:
rdobuilder 6febab
+
rdobuilder 6febab
+class Common(object):
rdobuilder 6febab
     """Common information to several classes.
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     Should not be directly used, several classes are derived from
rdobuilder 6febab
     this one.
rdobuilder 6febab
     """
rdobuilder 6febab
-    
rdobuilder 6febab
 
rdobuilder 6febab
     def __getstate__(self):
rdobuilder 6febab
 
rdobuilder 6febab
         dict = copy.copy(self.obj_dict)
rdobuilder 6febab
-   
rdobuilder 6febab
+
rdobuilder 6febab
         return dict
rdobuilder 6febab
 
rdobuilder 6febab
-    
rdobuilder 6febab
     def __setstate__(self, state):
rdobuilder 6febab
-    
rdobuilder 6febab
-        self.obj_dict = state
rdobuilder 6febab
 
rdobuilder 6febab
+        self.obj_dict = state
rdobuilder 6febab
 
rdobuilder 6febab
     def __get_attribute__(self, attr):
rdobuilder 6febab
         """Look for default attributes for this node"""
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         attr_val = self.obj_dict['attributes'].get(attr, None)
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         if attr_val is None:
rdobuilder 6febab
             # get the defaults for nodes/edges
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
             default_node_name = self.obj_dict['type']
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
             # The defaults for graphs are set on a node named 'graph'
rdobuilder 6febab
             if default_node_name in ('subgraph', 'digraph', 'cluster'):
rdobuilder 6febab
                 default_node_name = 'graph'
rdobuilder 6febab
-                
rdobuilder 6febab
+
rdobuilder 6febab
             g = self.get_parent_graph()
rdobuilder 6febab
             if g is not None:
rdobuilder 6febab
-                defaults = g.get_node( default_node_name )
rdobuilder 6febab
+                defaults = g.get_node(default_node_name)
rdobuilder 6febab
             else:
rdobuilder 6febab
                 return None
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
             # Multiple defaults could be set by having repeated 'graph [...]'
rdobuilder 6febab
             # 'node [...]', 'edge [...]' statements. In such case, if the
rdobuilder 6febab
             # same attribute is set in different statements, only the first
rdobuilder 6febab
@@ -618,84 +668,78 @@ class Common:
rdobuilder 6febab
             #
rdobuilder 6febab
             if not isinstance(defaults, (list, tuple)):
rdobuilder 6febab
                 defaults = [defaults]
rdobuilder 6febab
-                
rdobuilder 6febab
+
rdobuilder 6febab
             for default in defaults:
rdobuilder 6febab
                 attr_val = default.obj_dict['attributes'].get(attr, None)
rdobuilder 6febab
                 if attr_val:
rdobuilder 6febab
                     return attr_val
rdobuilder 6febab
         else:
rdobuilder 6febab
             return attr_val
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         return None
rdobuilder 6febab
-    
rdobuilder 6febab
 
rdobuilder 6febab
     def set_parent_graph(self, parent_graph):
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
         self.obj_dict['parent_graph'] = parent_graph
rdobuilder 6febab
-        
rdobuilder 6febab
 
rdobuilder 6febab
     def get_parent_graph(self):
rdobuilder 6febab
-    
rdobuilder 6febab
-        return self.obj_dict.get('parent_graph', None)
rdobuilder 6febab
 
rdobuilder 6febab
+        return self.obj_dict.get('parent_graph', None)
rdobuilder 6febab
 
rdobuilder 6febab
     def set(self, name, value):
rdobuilder 6febab
         """Set an attribute value by name.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         Given an attribute 'name' it will set its value to 'value'.
rdobuilder 6febab
         There's always the possibility of using the methods:
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
             set_'name'(value)
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         which are defined for all the existing attributes.
rdobuilder 6febab
         """
rdobuilder 6febab
 
rdobuilder 6febab
         self.obj_dict['attributes'][name] = value
rdobuilder 6febab
 
rdobuilder 6febab
-
rdobuilder 6febab
     def get(self, name):
rdobuilder 6febab
         """Get an attribute value by name.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         Given an attribute 'name' it will get its value.
rdobuilder 6febab
         There's always the possibility of using the methods:
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
             get_'name'()
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         which are defined for all the existing attributes.
rdobuilder 6febab
         """
rdobuilder 6febab
 
rdobuilder 6febab
         return self.obj_dict['attributes'].get(name, None)
rdobuilder 6febab
-        
rdobuilder 6febab
 
rdobuilder 6febab
     def get_attributes(self):
rdobuilder 6febab
         """"""
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         return self.obj_dict['attributes']
rdobuilder 6febab
 
rdobuilder 6febab
-        
rdobuilder 6febab
     def set_sequence(self, seq):
rdobuilder 6febab
-    
rdobuilder 6febab
-        self.obj_dict['sequence'] = seq
rdobuilder 6febab
 
rdobuilder 6febab
+        self.obj_dict['sequence'] = seq
rdobuilder 6febab
 
rdobuilder 6febab
     def get_sequence(self):
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
         return self.obj_dict['sequence']
rdobuilder 6febab
-        
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
     def create_attribute_methods(self, obj_attributes):
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
         #for attr in self.obj_dict['attributes']:
rdobuilder 6febab
         for attr in obj_attributes:
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
             # Generate all the Setter methods.
rdobuilder 6febab
             #
rdobuilder 6febab
-            self.__setattr__( 'set_'+attr, lambda x, a=attr : self.obj_dict['attributes'].__setitem__(a, x) )
rdobuilder 6febab
-            
rdobuilder 6febab
+            self.__setattr__(
rdobuilder 6febab
+                'set_' + attr,
rdobuilder 6febab
+                lambda x, a=attr: self.obj_dict['attributes'].__setitem__(a, x)
rdobuilder 6febab
+                )
rdobuilder 6febab
+
rdobuilder 6febab
             # Generate all the Getter methods.
rdobuilder 6febab
             #
rdobuilder 6febab
-            self.__setattr__('get_'+attr, lambda a=attr : self.__get_attribute__(a))
rdobuilder 6febab
-
rdobuilder 6febab
+            self.__setattr__('get_' + attr, lambda a=attr: self.__get_attribute__(a))
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
 class Error(Exception):
rdobuilder 6febab
@@ -703,6 +747,7 @@ class Error(Exception):
rdobuilder 6febab
     """
rdobuilder 6febab
     def __init__(self, value):
rdobuilder 6febab
         self.value = value
rdobuilder 6febab
+
rdobuilder 6febab
     def __str__(self):
rdobuilder 6febab
         return self.value
rdobuilder 6febab
 
rdobuilder 6febab
@@ -712,119 +757,108 @@ class InvocationException(Exception):
rdobuilder 6febab
     """
rdobuilder 6febab
     def __init__(self, value):
rdobuilder 6febab
         self.value = value
rdobuilder 6febab
+
rdobuilder 6febab
     def __str__(self):
rdobuilder 6febab
         return self.value
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
-
rdobuilder 6febab
-class Node(object, Common):
rdobuilder 6febab
+class Node(Common):
rdobuilder 6febab
     """A graph node.
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     This class represents a graph's node with all its attributes.
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     node(name, attribute=value, ...)
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     name: node's name
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     All the attributes defined in the Graphviz dot language should
rdobuilder 6febab
     be supported.
rdobuilder 6febab
     """
rdobuilder 6febab
 
rdobuilder 6febab
-    def __init__(self, name = '', obj_dict = None, **attrs):
rdobuilder 6febab
-    
rdobuilder 6febab
+    def __init__(self, name='', obj_dict=None, **attrs):
rdobuilder 6febab
+
rdobuilder 6febab
         #
rdobuilder 6febab
         # Nodes will take attributes of all other types because the defaults
rdobuilder 6febab
         # for any GraphViz object are dealt with as if they were Node definitions
rdobuilder 6febab
         #
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         if obj_dict is not None:
rdobuilder 6febab
-        
rdobuilder 6febab
             self.obj_dict = obj_dict
rdobuilder 6febab
-            
rdobuilder 6febab
         else:
rdobuilder 6febab
-        
rdobuilder 6febab
             self.obj_dict = dict()
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
             # Copy the attributes
rdobuilder 6febab
             #
rdobuilder 6febab
-            self.obj_dict[ 'attributes' ] = dict( attrs )
rdobuilder 6febab
-            self.obj_dict[ 'type' ] = 'node'
rdobuilder 6febab
-            self.obj_dict[ 'parent_graph' ] = None
rdobuilder 6febab
-            self.obj_dict[ 'parent_node_list' ] = None
rdobuilder 6febab
-            self.obj_dict[ 'sequence' ] = None
rdobuilder 6febab
-    
rdobuilder 6febab
+            self.obj_dict['attributes'] = dict(attrs)
rdobuilder 6febab
+            self.obj_dict['type'] = 'node'
rdobuilder 6febab
+            self.obj_dict['parent_graph'] = None
rdobuilder 6febab
+            self.obj_dict['parent_node_list'] = None
rdobuilder 6febab
+            self.obj_dict['sequence'] = None
rdobuilder 6febab
+
rdobuilder 6febab
             # Remove the compass point
rdobuilder 6febab
             #
rdobuilder 6febab
             port = None
rdobuilder 6febab
             if isinstance(name, basestring) and not name.startswith('"'):
rdobuilder 6febab
                 idx = name.find(':')
rdobuilder 6febab
-                if idx > 0 and idx+1 < len(name):
rdobuilder 6febab
+                if idx > 0 and idx + 1 < len(name):
rdobuilder 6febab
                     name, port = name[:idx], name[idx:]
rdobuilder 6febab
 
rdobuilder 6febab
             if isinstance(name, (long, int)):
rdobuilder 6febab
                 name = str(name)
rdobuilder 6febab
-            
rdobuilder 6febab
-            self.obj_dict['name'] = quote_if_necessary( name )
rdobuilder 6febab
+
rdobuilder 6febab
+            self.obj_dict['name'] = quote_if_necessary(name)
rdobuilder 6febab
             self.obj_dict['port'] = port
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         self.create_attribute_methods(NODE_ATTRIBUTES)
rdobuilder 6febab
-        
rdobuilder 6febab
-    
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     def set_name(self, node_name):
rdobuilder 6febab
         """Set the node's name."""
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         self.obj_dict['name'] = node_name
rdobuilder 6febab
-        
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
     def get_name(self):
rdobuilder 6febab
         """Get the node's name."""
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         return self.obj_dict['name']
rdobuilder 6febab
 
rdobuilder 6febab
-    
rdobuilder 6febab
     def get_port(self):
rdobuilder 6febab
         """Get the node's port."""
rdobuilder 6febab
-        
rdobuilder 6febab
-        return self.obj_dict['port']
rdobuilder 6febab
 
rdobuilder 6febab
+        return self.obj_dict['port']
rdobuilder 6febab
 
rdobuilder 6febab
     def add_style(self, style):
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
         styles = self.obj_dict['attributes'].get('style', None)
rdobuilder 6febab
         if not styles and style:
rdobuilder 6febab
-            styles = [ style ]
rdobuilder 6febab
+            styles = [style]
rdobuilder 6febab
         else:
rdobuilder 6febab
             styles = styles.split(',')
rdobuilder 6febab
-            styles.append( style )
rdobuilder 6febab
-        
rdobuilder 6febab
-        self.obj_dict['attributes']['style'] = ','.join( styles )
rdobuilder 6febab
-        
rdobuilder 6febab
+            styles.append(style)
rdobuilder 6febab
+
rdobuilder 6febab
+        self.obj_dict['attributes']['style'] = ','.join(styles)
rdobuilder 6febab
 
rdobuilder 6febab
     def to_string(self):
rdobuilder 6febab
         """Returns a string representation of the node in dot language.
rdobuilder 6febab
         """
rdobuilder 6febab
-        
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         # RMF: special case defaults for node, edge and graph properties.
rdobuilder 6febab
         #
rdobuilder 6febab
         node = quote_if_necessary(self.obj_dict['name'])
rdobuilder 6febab
 
rdobuilder 6febab
         node_attr = list()
rdobuilder 6febab
 
rdobuilder 6febab
-        for attr, value in self.obj_dict['attributes'].iteritems():
rdobuilder 6febab
+        for attr, value in sorted(self.obj_dict['attributes'].items(), key=itemgetter(0)):
rdobuilder 6febab
             if value is not None:
rdobuilder 6febab
-                node_attr.append( '%s=%s' % (attr, quote_if_necessary(value) ) )
rdobuilder 6febab
+                node_attr.append('%s=%s' % (attr, quote_if_necessary(value)))
rdobuilder 6febab
             else:
rdobuilder 6febab
-                node_attr.append( attr )
rdobuilder 6febab
-                
rdobuilder 6febab
-                
rdobuilder 6febab
+                node_attr.append(attr)
rdobuilder 6febab
+
rdobuilder 6febab
         # No point in having nodes setting any defaults if the don't set
rdobuilder 6febab
         # any attributes...
rdobuilder 6febab
         #
rdobuilder 6febab
         if node in ('graph', 'node', 'edge') and len(node_attr) == 0:
rdobuilder 6febab
             return ''
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         node_attr = ', '.join(node_attr)
rdobuilder 6febab
 
rdobuilder 6febab
         if node_attr:
rdobuilder 6febab
@@ -833,207 +867,191 @@ class Node(object, Common):
rdobuilder 6febab
         return node + ';'
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
-
rdobuilder 6febab
-class Edge(object,  Common ):
rdobuilder 6febab
+class Edge(Common):
rdobuilder 6febab
     """A graph edge.
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     This class represents a graph's edge with all its attributes.
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     edge(src, dst, attribute=value, ...)
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     src: source node's name
rdobuilder 6febab
     dst: destination node's name
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     All the attributes defined in the Graphviz dot language should
rdobuilder 6febab
     be supported.
rdobuilder 6febab
-    
rdobuilder 6febab
- 	Attributes can be set through the dynamically generated methods:
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
+    Attributes can be set through the dynamically generated methods:
rdobuilder 6febab
+
rdobuilder 6febab
      set_[attribute name], i.e. set_label, set_fontname
rdobuilder 6febab
-     
rdobuilder 6febab
+
rdobuilder 6febab
     or directly by using the instance's special dictionary:
rdobuilder 6febab
-    
rdobuilder 6febab
-     Edge.obj_dict['attributes'][attribute name], i.e. 
rdobuilder 6febab
-     
rdobuilder 6febab
+
rdobuilder 6febab
+     Edge.obj_dict['attributes'][attribute name], i.e.
rdobuilder 6febab
+
rdobuilder 6febab
         edge_instance.obj_dict['attributes']['label']
rdobuilder 6febab
         edge_instance.obj_dict['attributes']['fontname']
rdobuilder 6febab
-        
rdobuilder 6febab
-    """
rdobuilder 6febab
-    
rdobuilder 6febab
 
rdobuilder 6febab
+    """
rdobuilder 6febab
 
rdobuilder 6febab
     def __init__(self, src='', dst='', obj_dict=None, **attrs):
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
         if isinstance(src, (list, tuple)) and dst == '':
rdobuilder 6febab
             src, dst = src
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         if obj_dict is not None:
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
             self.obj_dict = obj_dict
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         else:
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
             self.obj_dict = dict()
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
             # Copy the attributes
rdobuilder 6febab
             #
rdobuilder 6febab
-            self.obj_dict[ 'attributes' ] = dict( attrs )
rdobuilder 6febab
-            self.obj_dict[ 'type' ] = 'edge'
rdobuilder 6febab
-            self.obj_dict[ 'parent_graph' ] = None
rdobuilder 6febab
-            self.obj_dict[ 'parent_edge_list' ] = None
rdobuilder 6febab
-            self.obj_dict[ 'sequence' ] = None
rdobuilder 6febab
+            self.obj_dict['attributes'] = dict(attrs)
rdobuilder 6febab
+            self.obj_dict['type'] = 'edge'
rdobuilder 6febab
+            self.obj_dict['parent_graph'] = None
rdobuilder 6febab
+            self.obj_dict['parent_edge_list'] = None
rdobuilder 6febab
+            self.obj_dict['sequence'] = None
rdobuilder 6febab
 
rdobuilder 6febab
             if isinstance(src, Node):
rdobuilder 6febab
                 src = src.get_name()
rdobuilder 6febab
-                
rdobuilder 6febab
+
rdobuilder 6febab
             if isinstance(dst, Node):
rdobuilder 6febab
                 dst = dst.get_name()
rdobuilder 6febab
-    
rdobuilder 6febab
-            points = ( quote_if_necessary( src) , quote_if_necessary( dst) )
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
+            points = (quote_if_necessary(src), quote_if_necessary(dst))
rdobuilder 6febab
+
rdobuilder 6febab
             self.obj_dict['points'] = points
rdobuilder 6febab
-            
rdobuilder 6febab
-        self.create_attribute_methods(EDGE_ATTRIBUTES)
rdobuilder 6febab
 
rdobuilder 6febab
+        self.create_attribute_methods(EDGE_ATTRIBUTES)
rdobuilder 6febab
 
rdobuilder 6febab
     def get_source(self):
rdobuilder 6febab
         """Get the edges source node name."""
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
         return self.obj_dict['points'][0]
rdobuilder 6febab
-        
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
     def get_destination(self):
rdobuilder 6febab
         """Get the edge's destination node name."""
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         return self.obj_dict['points'][1]
rdobuilder 6febab
-            
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
     def __hash__(self):
rdobuilder 6febab
-        
rdobuilder 6febab
-         return hash( hash(self.get_source()) + hash(self.get_destination()) )
rdobuilder 6febab
-        
rdobuilder 6febab
-        
rdobuilder 6febab
+        return hash(hash(self.get_source()) + hash(self.get_destination()))
rdobuilder 6febab
+
rdobuilder 6febab
     def __eq__(self, edge):
rdobuilder 6febab
         """Compare two edges.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         If the parent graph is directed, arcs linking
rdobuilder 6febab
         node A to B are considered equal and A->B != B->A
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         If the parent graph is undirected, any edge
rdobuilder 6febab
         connecting two nodes is equal to any other
rdobuilder 6febab
         edge connecting the same nodes, A->B == B->A
rdobuilder 6febab
         """
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         if not isinstance(edge, Edge):
rdobuilder 6febab
-            raise Error, "Can't compare and edge to a non-edge object."
rdobuilder 6febab
-            
rdobuilder 6febab
+            raise Error("Can't compare and edge to a non-edge object.")
rdobuilder 6febab
+
rdobuilder 6febab
         if self.get_parent_graph().get_top_graph_type() == 'graph':
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
             # If the graph is undirected, the edge has neither
rdobuilder 6febab
             # source nor destination.
rdobuilder 6febab
             #
rdobuilder 6febab
-            if	( ( self.get_source() == edge.get_source() and self.get_destination() == edge.get_destination() ) or
rdobuilder 6febab
-                ( edge.get_source() == self.get_destination() and edge.get_destination() == self.get_source() ) ):
rdobuilder 6febab
+            if ((self.get_source() == edge.get_source() and
rdobuilder 6febab
+                    self.get_destination() == edge.get_destination()) or
rdobuilder 6febab
+                (edge.get_source() == self.get_destination() and
rdobuilder 6febab
+                    edge.get_destination() == self.get_source())):
rdobuilder 6febab
                 return True
rdobuilder 6febab
-                
rdobuilder 6febab
+
rdobuilder 6febab
         else:
rdobuilder 6febab
-        
rdobuilder 6febab
-            if self.get_source()==edge.get_source() and self.get_destination()==edge.get_destination() :
rdobuilder 6febab
+            if (self.get_source() == edge.get_source() and
rdobuilder 6febab
+                    self.get_destination() == edge.get_destination()):
rdobuilder 6febab
                 return True
rdobuilder 6febab
-                
rdobuilder 6febab
+
rdobuilder 6febab
         return False
rdobuilder 6febab
 
rdobuilder 6febab
-        
rdobuilder 6febab
-    
rdobuilder 6febab
     def parse_node_ref(self, node_str):
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
         if not isinstance(node_str, str):
rdobuilder 6febab
             return node_str
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
         if node_str.startswith('"') and node_str.endswith('"'):
rdobuilder 6febab
-        
rdobuilder 6febab
             return node_str
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         node_port_idx = node_str.rfind(':')
rdobuilder 6febab
-        
rdobuilder 6febab
-        if node_port_idx>0 and node_str[0]=='"' and node_str[node_port_idx-1]=='"':
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
+        if (node_port_idx > 0 and node_str[0] == '"' and
rdobuilder 6febab
+                node_str[node_port_idx - 1] == '"'):
rdobuilder 6febab
             return node_str
rdobuilder 6febab
-                
rdobuilder 6febab
-        if node_port_idx>0:
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
+        if node_port_idx > 0:
rdobuilder 6febab
             a = node_str[:node_port_idx]
rdobuilder 6febab
-            b = node_str[node_port_idx+1:]
rdobuilder 6febab
+            b = node_str[node_port_idx + 1:]
rdobuilder 6febab
 
rdobuilder 6febab
             node = quote_if_necessary(a)
rdobuilder 6febab
 
rdobuilder 6febab
-            node += ':'+quote_if_necessary(b)
rdobuilder 6febab
+            node += ':' + quote_if_necessary(b)
rdobuilder 6febab
 
rdobuilder 6febab
             return node
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         return node_str
rdobuilder 6febab
-        
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     def to_string(self):
rdobuilder 6febab
         """Returns a string representation of the edge in dot language.
rdobuilder 6febab
         """
rdobuilder 6febab
 
rdobuilder 6febab
-        src = self.parse_node_ref( self.get_source() )
rdobuilder 6febab
-        dst = self.parse_node_ref( self.get_destination() )
rdobuilder 6febab
-        
rdobuilder 6febab
+        src = self.parse_node_ref(self.get_source())
rdobuilder 6febab
+        dst = self.parse_node_ref(self.get_destination())
rdobuilder 6febab
+
rdobuilder 6febab
         if isinstance(src, frozendict):
rdobuilder 6febab
-            edge = [ Subgraph(obj_dict=src).to_string() ]
rdobuilder 6febab
+            edge = [Subgraph(obj_dict=src).to_string()]
rdobuilder 6febab
         elif isinstance(src, (int, long)):
rdobuilder 6febab
-            edge = [ str(src) ]
rdobuilder 6febab
+            edge = [str(src)]
rdobuilder 6febab
         else:
rdobuilder 6febab
-            edge = [ src ]
rdobuilder 6febab
-        
rdobuilder 6febab
-        if	(self.get_parent_graph() and
rdobuilder 6febab
-            self.get_parent_graph().get_top_graph_type() and
rdobuilder 6febab
-            self.get_parent_graph().get_top_graph_type() == 'digraph' ):
rdobuilder 6febab
-
rdobuilder 6febab
-            edge.append( '->' )
rdobuilder 6febab
-            
rdobuilder 6febab
+            edge = [src]
rdobuilder 6febab
+
rdobuilder 6febab
+        if (self.get_parent_graph() and
rdobuilder 6febab
+                self.get_parent_graph().get_top_graph_type() and
rdobuilder 6febab
+                self.get_parent_graph().get_top_graph_type() == 'digraph'):
rdobuilder 6febab
+
rdobuilder 6febab
+            edge.append('->')
rdobuilder 6febab
+
rdobuilder 6febab
         else:
rdobuilder 6febab
-            edge.append( '--' )
rdobuilder 6febab
-            
rdobuilder 6febab
+            edge.append('--')
rdobuilder 6febab
+
rdobuilder 6febab
         if isinstance(dst, frozendict):
rdobuilder 6febab
-            edge.append( Subgraph(obj_dict=dst).to_string() )
rdobuilder 6febab
+            edge.append(Subgraph(obj_dict=dst).to_string())
rdobuilder 6febab
         elif isinstance(dst, (int, long)):
rdobuilder 6febab
-            edge.append( str(dst) )
rdobuilder 6febab
+            edge.append(str(dst))
rdobuilder 6febab
         else:
rdobuilder 6febab
-            edge.append( dst )
rdobuilder 6febab
-
rdobuilder 6febab
+            edge.append(dst)
rdobuilder 6febab
 
rdobuilder 6febab
         edge_attr = list()
rdobuilder 6febab
-        
rdobuilder 6febab
-        for attr, value in self.obj_dict['attributes'].iteritems():
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
+        for attr, value in sorted(self.obj_dict['attributes'].items(), key=itemgetter(0)):
rdobuilder 6febab
             if value is not None:
rdobuilder 6febab
-                edge_attr.append( '%s=%s' % (attr, quote_if_necessary(value) ) )
rdobuilder 6febab
+                edge_attr.append('%s=%s' % (attr, quote_if_necessary(value)))
rdobuilder 6febab
             else:
rdobuilder 6febab
-                edge_attr.append( attr )
rdobuilder 6febab
+                edge_attr.append(attr)
rdobuilder 6febab
 
rdobuilder 6febab
         edge_attr = ', '.join(edge_attr)
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         if edge_attr:
rdobuilder 6febab
-            edge.append( ' [' + edge_attr + ']' )
rdobuilder 6febab
+            edge.append(' [' + edge_attr + ']')
rdobuilder 6febab
 
rdobuilder 6febab
         return ' '.join(edge) + ';'
rdobuilder 6febab
-    
rdobuilder 6febab
-    
rdobuilder 6febab
-    
rdobuilder 6febab
-    
rdobuilder 6febab
-    
rdobuilder 6febab
-class Graph(object, Common):
rdobuilder 6febab
+
rdobuilder 6febab
+
rdobuilder 6febab
+class Graph(Common):
rdobuilder 6febab
     """Class representing a graph in Graphviz's dot language.
rdobuilder 6febab
 
rdobuilder 6febab
     This class implements the methods to work on a representation
rdobuilder 6febab
     of a graph in Graphviz's dot language.
rdobuilder 6febab
-    
rdobuilder 6febab
-    graph(  graph_name='G', graph_type='digraph',
rdobuilder 6febab
+
rdobuilder 6febab
+    graph(graph_name='G', graph_type='digraph',
rdobuilder 6febab
         strict=False, suppress_disconnected=False, attribute=value, ...)
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     graph_name:
rdobuilder 6febab
         the graph's name
rdobuilder 6febab
     graph_type:
rdobuilder 6febab
@@ -1045,222 +1063,178 @@ class Graph(object, Common):
rdobuilder 6febab
         if True it will avoid displaying equal edges, i.e.
rdobuilder 6febab
         only one edge between two nodes. removing the
rdobuilder 6febab
         duplicated ones.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
     All the attributes defined in the Graphviz dot language should
rdobuilder 6febab
     be supported.
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     Attributes can be set through the dynamically generated methods:
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
      set_[attribute name], i.e. set_size, set_fontname
rdobuilder 6febab
-     
rdobuilder 6febab
+
rdobuilder 6febab
     or using the instance's attributes:
rdobuilder 6febab
-    
rdobuilder 6febab
-     Graph.obj_dict['attributes'][attribute name], i.e. 
rdobuilder 6febab
-     
rdobuilder 6febab
+
rdobuilder 6febab
+     Graph.obj_dict['attributes'][attribute name], i.e.
rdobuilder 6febab
+
rdobuilder 6febab
         graph_instance.obj_dict['attributes']['label']
rdobuilder 6febab
         graph_instance.obj_dict['attributes']['fontname']
rdobuilder 6febab
     """
rdobuilder 6febab
-    
rdobuilder 6febab
 
rdobuilder 6febab
-    def __init__(self, graph_name='G', obj_dict=None, graph_type='digraph', strict=False,
rdobuilder 6febab
-        suppress_disconnected=False, simplify=False, **attrs):
rdobuilder 6febab
+    def __init__(
rdobuilder 6febab
+            self, graph_name='G', obj_dict=None, graph_type='digraph', strict=False,
rdobuilder 6febab
+            suppress_disconnected=False, simplify=False, **attrs):
rdobuilder 6febab
 
rdobuilder 6febab
         if obj_dict is not None:
rdobuilder 6febab
             self.obj_dict = obj_dict
rdobuilder 6febab
-            
rdobuilder 6febab
         else:
rdobuilder 6febab
-
rdobuilder 6febab
             self.obj_dict = dict()
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
             self.obj_dict['attributes'] = dict(attrs)
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
             if graph_type not in ['graph', 'digraph']:
rdobuilder 6febab
-                raise Error, 'Invalid type "%s". Accepted graph types are: graph, digraph, subgraph' % graph_type
rdobuilder 6febab
-    
rdobuilder 6febab
-    
rdobuilder 6febab
+                raise Error((
rdobuilder 6febab
+                    'Invalid type "%s". Accepted graph types are: '
rdobuilder 6febab
+                    'graph, digraph, subgraph' % graph_type
rdobuilder 6febab
+                    ))
rdobuilder 6febab
+
rdobuilder 6febab
             self.obj_dict['name'] = quote_if_necessary(graph_name)
rdobuilder 6febab
             self.obj_dict['type'] = graph_type
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
             self.obj_dict['strict'] = strict
rdobuilder 6febab
             self.obj_dict['suppress_disconnected'] = suppress_disconnected
rdobuilder 6febab
             self.obj_dict['simplify'] = simplify
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
             self.obj_dict['current_child_sequence'] = 1
rdobuilder 6febab
             self.obj_dict['nodes'] = dict()
rdobuilder 6febab
             self.obj_dict['edges'] = dict()
rdobuilder 6febab
             self.obj_dict['subgraphs'] = dict()
rdobuilder 6febab
 
rdobuilder 6febab
             self.set_parent_graph(self)
rdobuilder 6febab
-            
rdobuilder 6febab
 
rdobuilder 6febab
         self.create_attribute_methods(GRAPH_ATTRIBUTES)
rdobuilder 6febab
 
rdobuilder 6febab
-
rdobuilder 6febab
     def get_graph_type(self):
rdobuilder 6febab
-    
rdobuilder 6febab
         return self.obj_dict['type']
rdobuilder 6febab
 
rdobuilder 6febab
-
rdobuilder 6febab
     def get_top_graph_type(self):
rdobuilder 6febab
-    
rdobuilder 6febab
         parent = self
rdobuilder 6febab
         while True:
rdobuilder 6febab
             parent_ = parent.get_parent_graph()
rdobuilder 6febab
             if parent_ == parent:
rdobuilder 6febab
                 break
rdobuilder 6febab
             parent = parent_
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
         return parent.obj_dict['type']
rdobuilder 6febab
-                
rdobuilder 6febab
 
rdobuilder 6febab
     def set_graph_defaults(self, **attrs):
rdobuilder 6febab
-
rdobuilder 6febab
-        self.add_node( Node('graph', **attrs) )
rdobuilder 6febab
-
rdobuilder 6febab
+        self.add_node(Node('graph', **attrs))
rdobuilder 6febab
 
rdobuilder 6febab
     def get_graph_defaults(self, **attrs):
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
         graph_nodes = self.get_node('graph')
rdobuilder 6febab
-        
rdobuilder 6febab
-        if isinstance( graph_nodes, (list, tuple)):
rdobuilder 6febab
-            return [ node.get_attributes() for node in graph_nodes ]
rdobuilder 6febab
-            
rdobuilder 6febab
-        return graph_nodes.get_attributes()            
rdobuilder 6febab
-            
rdobuilder 6febab
-        
rdobuilder 6febab
 
rdobuilder 6febab
-    def set_node_defaults(self, **attrs):
rdobuilder 6febab
+        if isinstance(graph_nodes, (list, tuple)):
rdobuilder 6febab
+            return [node.get_attributes() for node in graph_nodes]
rdobuilder 6febab
 
rdobuilder 6febab
-        self.add_node( Node('node', **attrs) )
rdobuilder 6febab
+        return graph_nodes.get_attributes()
rdobuilder 6febab
 
rdobuilder 6febab
+    def set_node_defaults(self, **attrs):
rdobuilder 6febab
+        self.add_node(Node('node', **attrs))
rdobuilder 6febab
 
rdobuilder 6febab
     def get_node_defaults(self, **attrs):
rdobuilder 6febab
-    
rdobuilder 6febab
-    
rdobuilder 6febab
         graph_nodes = self.get_node('node')
rdobuilder 6febab
 
rdobuilder 6febab
-        if isinstance( graph_nodes, (list, tuple)):
rdobuilder 6febab
-            return [ node.get_attributes() for node in graph_nodes ]
rdobuilder 6febab
-            
rdobuilder 6febab
-        return graph_nodes.get_attributes()            
rdobuilder 6febab
-        
rdobuilder 6febab
-
rdobuilder 6febab
-    def set_edge_defaults(self, **attrs):
rdobuilder 6febab
-
rdobuilder 6febab
-        self.add_node( Node('edge', **attrs) )
rdobuilder 6febab
+        if isinstance(graph_nodes, (list, tuple)):
rdobuilder 6febab
+            return [node.get_attributes() for node in graph_nodes]
rdobuilder 6febab
 
rdobuilder 6febab
+        return graph_nodes.get_attributes()
rdobuilder 6febab
 
rdobuilder 6febab
+    def set_edge_defaults(self, **attrs):
rdobuilder 6febab
+        self.add_node(Node('edge', **attrs))
rdobuilder 6febab
 
rdobuilder 6febab
     def get_edge_defaults(self, **attrs):
rdobuilder 6febab
-    
rdobuilder 6febab
         graph_nodes = self.get_node('edge')
rdobuilder 6febab
 
rdobuilder 6febab
-        if isinstance( graph_nodes, (list, tuple)):
rdobuilder 6febab
-            return [ node.get_attributes() for node in graph_nodes ]
rdobuilder 6febab
-            
rdobuilder 6febab
-        return graph_nodes.get_attributes()            
rdobuilder 6febab
+        if isinstance(graph_nodes, (list, tuple)):
rdobuilder 6febab
+            return [node.get_attributes() for node in graph_nodes]
rdobuilder 6febab
 
rdobuilder 6febab
-    
rdobuilder 6febab
+        return graph_nodes.get_attributes()
rdobuilder 6febab
 
rdobuilder 6febab
     def set_simplify(self, simplify):
rdobuilder 6febab
         """Set whether to simplify or not.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         If True it will avoid displaying equal edges, i.e.
rdobuilder 6febab
         only one edge between two nodes. removing the
rdobuilder 6febab
         duplicated ones.
rdobuilder 6febab
         """
rdobuilder 6febab
-        
rdobuilder 6febab
-        self.obj_dict['simplify'] = simplify
rdobuilder 6febab
-
rdobuilder 6febab
 
rdobuilder 6febab
+        self.obj_dict['simplify'] = simplify
rdobuilder 6febab
 
rdobuilder 6febab
     def get_simplify(self):
rdobuilder 6febab
         """Get whether to simplify or not.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         Refer to set_simplify for more information.
rdobuilder 6febab
         """
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         return self.obj_dict['simplify']
rdobuilder 6febab
 
rdobuilder 6febab
-            
rdobuilder 6febab
     def set_type(self, graph_type):
rdobuilder 6febab
         """Set the graph's type, 'graph' or 'digraph'."""
rdobuilder 6febab
 
rdobuilder 6febab
         self.obj_dict['type'] = graph_type
rdobuilder 6febab
 
rdobuilder 6febab
-
rdobuilder 6febab
-        
rdobuilder 6febab
     def get_type(self):
rdobuilder 6febab
         """Get the graph's type, 'graph' or 'digraph'."""
rdobuilder 6febab
 
rdobuilder 6febab
         return self.obj_dict['type']
rdobuilder 6febab
 
rdobuilder 6febab
-
rdobuilder 6febab
-
rdobuilder 6febab
     def set_name(self, graph_name):
rdobuilder 6febab
         """Set the graph's name."""
rdobuilder 6febab
-        
rdobuilder 6febab
-        self.obj_dict['name'] = graph_name
rdobuilder 6febab
-
rdobuilder 6febab
 
rdobuilder 6febab
+        self.obj_dict['name'] = graph_name
rdobuilder 6febab
 
rdobuilder 6febab
     def get_name(self):
rdobuilder 6febab
         """Get the graph's name."""
rdobuilder 6febab
-        
rdobuilder 6febab
-        return self.obj_dict['name']
rdobuilder 6febab
 
rdobuilder 6febab
+        return self.obj_dict['name']
rdobuilder 6febab
 
rdobuilder 6febab
-                    
rdobuilder 6febab
     def set_strict(self, val):
rdobuilder 6febab
         """Set graph to 'strict' mode.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         This option is only valid for top level graphs.
rdobuilder 6febab
         """
rdobuilder 6febab
-        
rdobuilder 6febab
-        self.obj_dict['strict'] = val
rdobuilder 6febab
-
rdobuilder 6febab
 
rdobuilder 6febab
+        self.obj_dict['strict'] = val
rdobuilder 6febab
 
rdobuilder 6febab
     def get_strict(self, val):
rdobuilder 6febab
         """Get graph's 'strict' mode (True, False).
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         This option is only valid for top level graphs.
rdobuilder 6febab
         """
rdobuilder 6febab
-        
rdobuilder 6febab
-        return self.obj_dict['strict']
rdobuilder 6febab
-        
rdobuilder 6febab
 
rdobuilder 6febab
+        return self.obj_dict['strict']
rdobuilder 6febab
 
rdobuilder 6febab
     def set_suppress_disconnected(self, val):
rdobuilder 6febab
         """Suppress disconnected nodes in the output graph.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         This option will skip nodes in the graph with no incoming or outgoing
rdobuilder 6febab
         edges. This option works also for subgraphs and has effect only in the
rdobuilder 6febab
         current graph/subgraph.
rdobuilder 6febab
         """
rdobuilder 6febab
-        
rdobuilder 6febab
-        self.obj_dict['suppress_disconnected'] = val
rdobuilder 6febab
-            
rdobuilder 6febab
 
rdobuilder 6febab
+        self.obj_dict['suppress_disconnected'] = val
rdobuilder 6febab
 
rdobuilder 6febab
     def get_suppress_disconnected(self, val):
rdobuilder 6febab
         """Get if suppress disconnected is set.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         Refer to set_suppress_disconnected for more information.
rdobuilder 6febab
         """
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         return self.obj_dict['suppress_disconnected']
rdobuilder 6febab
-            
rdobuilder 6febab
 
rdobuilder 6febab
     def get_next_sequence_number(self):
rdobuilder 6febab
-    
rdobuilder 6febab
         seq = self.obj_dict['current_child_sequence']
rdobuilder 6febab
-        
rdobuilder 6febab
         self.obj_dict['current_child_sequence'] += 1
rdobuilder 6febab
-        
rdobuilder 6febab
         return seq
rdobuilder 6febab
-        
rdobuilder 6febab
-
rdobuilder 6febab
 
rdobuilder 6febab
     def add_node(self, graph_node):
rdobuilder 6febab
         """Adds a node object to the graph.
rdobuilder 6febab
@@ -1268,106 +1242,101 @@ class Graph(object, Common):
rdobuilder 6febab
         It takes a node object as its only argument and returns
rdobuilder 6febab
         None.
rdobuilder 6febab
         """
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         if not isinstance(graph_node, Node):
rdobuilder 6febab
             raise TypeError('add_node() received a non node class object: ' + str(graph_node))
rdobuilder 6febab
 
rdobuilder 6febab
-            
rdobuilder 6febab
         node = self.get_node(graph_node.get_name())
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         if not node:
rdobuilder 6febab
+            self.obj_dict['nodes'][graph_node.get_name()] = [graph_node.obj_dict]
rdobuilder 6febab
 
rdobuilder 6febab
-            self.obj_dict['nodes'][graph_node.get_name()] = [ graph_node.obj_dict ]
rdobuilder 6febab
-            
rdobuilder 6febab
             #self.node_dict[graph_node.get_name()] = graph_node.attributes
rdobuilder 6febab
             graph_node.set_parent_graph(self.get_parent_graph())
rdobuilder 6febab
-                
rdobuilder 6febab
         else:
rdobuilder 6febab
-        
rdobuilder 6febab
-            self.obj_dict['nodes'][graph_node.get_name()].append( graph_node.obj_dict )
rdobuilder 6febab
+            self.obj_dict['nodes'][graph_node.get_name()].append(graph_node.obj_dict)
rdobuilder 6febab
 
rdobuilder 6febab
         graph_node.set_sequence(self.get_next_sequence_number())
rdobuilder 6febab
 
rdobuilder 6febab
-
rdobuilder 6febab
-
rdobuilder 6febab
     def del_node(self, name, index=None):
rdobuilder 6febab
         """Delete a node from the graph.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         Given a node's name all node(s) with that same name
rdobuilder 6febab
         will be deleted if 'index' is not specified or set
rdobuilder 6febab
         to None.
rdobuilder 6febab
         If there are several nodes with that same name and
rdobuilder 6febab
         'index' is given, only the node in that position
rdobuilder 6febab
         will be deleted.
rdobuilder 6febab
-        
rdobuilder 6febab
-        'index' should be an integer specifying the position 
rdobuilder 6febab
+
rdobuilder 6febab
+        'index' should be an integer specifying the position
rdobuilder 6febab
         of the node to delete. If index is larger than the
rdobuilder 6febab
         number of nodes with that name, no action is taken.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         If nodes are deleted it returns True. If no action
rdobuilder 6febab
         is taken it returns False.
rdobuilder 6febab
         """
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
         if isinstance(name, Node):
rdobuilder 6febab
             name = name.get_name()
rdobuilder 6febab
-        
rdobuilder 6febab
-        if self.obj_dict['nodes'].has_key(name):
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
+        if name in self.obj_dict['nodes']:
rdobuilder 6febab
             if index is not None and index < len(self.obj_dict['nodes'][name]):
rdobuilder 6febab
                 del self.obj_dict['nodes'][name][index]
rdobuilder 6febab
                 return True
rdobuilder 6febab
             else:
rdobuilder 6febab
                 del self.obj_dict['nodes'][name]
rdobuilder 6febab
                 return True
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         return False
rdobuilder 6febab
-                        
rdobuilder 6febab
 
rdobuilder 6febab
     def get_node(self, name):
rdobuilder 6febab
         """Retrieve a node from the graph.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         Given a node's name the corresponding Node
rdobuilder 6febab
         instance will be returned.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         If one or more nodes exist with that name a list of
rdobuilder 6febab
         Node instances is returned.
rdobuilder 6febab
         An empty list is returned otherwise.
rdobuilder 6febab
         """
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         match = list()
rdobuilder 6febab
-        
rdobuilder 6febab
-        if self.obj_dict['nodes'].has_key(name):
rdobuilder 6febab
-        
rdobuilder 6febab
-            match.extend( [ Node( obj_dict = obj_dict ) for obj_dict in self.obj_dict['nodes'][name] ])
rdobuilder 6febab
-        
rdobuilder 6febab
-        return match
rdobuilder 6febab
 
rdobuilder 6febab
+        if name in self.obj_dict['nodes']:
rdobuilder 6febab
+            match.extend([
rdobuilder 6febab
+                Node(obj_dict=obj_dict)
rdobuilder 6febab
+                for obj_dict
rdobuilder 6febab
+                in self.obj_dict['nodes'][name]
rdobuilder 6febab
+                ])
rdobuilder 6febab
+
rdobuilder 6febab
+        return match
rdobuilder 6febab
 
rdobuilder 6febab
     def get_nodes(self):
rdobuilder 6febab
         """Get the list of Node instances."""
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         return self.get_node_list()
rdobuilder 6febab
-        
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
     def get_node_list(self):
rdobuilder 6febab
         """Get the list of Node instances.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         This method returns the list of Node instances
rdobuilder 6febab
         composing the graph.
rdobuilder 6febab
         """
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         node_objs = list()
rdobuilder 6febab
-        
rdobuilder 6febab
-        for node, obj_dict_list in self.obj_dict['nodes'].iteritems():
rdobuilder 6febab
-                node_objs.extend( [ Node( obj_dict = obj_d ) for obj_d in obj_dict_list ] )
rdobuilder 6febab
-        
rdobuilder 6febab
-        return node_objs
rdobuilder 6febab
 
rdobuilder 6febab
+        for node, obj_dict_list in self.obj_dict['nodes'].items():
rdobuilder 6febab
+            node_objs.extend([
rdobuilder 6febab
+                Node(obj_dict=obj_d)
rdobuilder 6febab
+                for obj_d
rdobuilder 6febab
+                in obj_dict_list
rdobuilder 6febab
+                ])
rdobuilder 6febab
 
rdobuilder 6febab
+        return node_objs
rdobuilder 6febab
 
rdobuilder 6febab
     def add_edge(self, graph_edge):
rdobuilder 6febab
         """Adds an edge object to the graph.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         It takes a edge object as its only argument and returns
rdobuilder 6febab
         None.
rdobuilder 6febab
         """
rdobuilder 6febab
@@ -1375,78 +1344,70 @@ class Graph(object, Common):
rdobuilder 6febab
         if not isinstance(graph_edge, Edge):
rdobuilder 6febab
             raise TypeError('add_edge() received a non edge class object: ' + str(graph_edge))
rdobuilder 6febab
 
rdobuilder 6febab
-        edge_points = ( graph_edge.get_source(), graph_edge.get_destination() )
rdobuilder 6febab
+        edge_points = (graph_edge.get_source(), graph_edge.get_destination())
rdobuilder 6febab
 
rdobuilder 6febab
-        if self.obj_dict['edges'].has_key(edge_points):
rdobuilder 6febab
+        if edge_points in self.obj_dict['edges']:
rdobuilder 6febab
 
rdobuilder 6febab
             edge_list = self.obj_dict['edges'][edge_points]
rdobuilder 6febab
             edge_list.append(graph_edge.obj_dict)
rdobuilder 6febab
-
rdobuilder 6febab
         else:
rdobuilder 6febab
+            self.obj_dict['edges'][edge_points] = [graph_edge.obj_dict]
rdobuilder 6febab
 
rdobuilder 6febab
-            self.obj_dict['edges'][edge_points] = [ graph_edge.obj_dict ]
rdobuilder 6febab
-
rdobuilder 6febab
-
rdobuilder 6febab
-        graph_edge.set_sequence( self.get_next_sequence_number() )
rdobuilder 6febab
-
rdobuilder 6febab
-        graph_edge.set_parent_graph( self.get_parent_graph() )
rdobuilder 6febab
-
rdobuilder 6febab
-
rdobuilder 6febab
+        graph_edge.set_sequence(self.get_next_sequence_number())
rdobuilder 6febab
+        graph_edge.set_parent_graph(self.get_parent_graph())
rdobuilder 6febab
 
rdobuilder 6febab
     def del_edge(self, src_or_list, dst=None, index=None):
rdobuilder 6febab
         """Delete an edge from the graph.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         Given an edge's (source, destination) node names all
rdobuilder 6febab
         matching edges(s) will be deleted if 'index' is not
rdobuilder 6febab
         specified or set to None.
rdobuilder 6febab
         If there are several matching edges and 'index' is
rdobuilder 6febab
         given, only the edge in that position will be deleted.
rdobuilder 6febab
-        
rdobuilder 6febab
-        'index' should be an integer specifying the position 
rdobuilder 6febab
+
rdobuilder 6febab
+        'index' should be an integer specifying the position
rdobuilder 6febab
         of the edge to delete. If index is larger than the
rdobuilder 6febab
         number of matching edges, no action is taken.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         If edges are deleted it returns True. If no action
rdobuilder 6febab
         is taken it returns False.
rdobuilder 6febab
         """
rdobuilder 6febab
 
rdobuilder 6febab
-        if isinstance( src_or_list, (list, tuple)):
rdobuilder 6febab
+        if isinstance(src_or_list, (list, tuple)):
rdobuilder 6febab
             if dst is not None and isinstance(dst, (int, long)):
rdobuilder 6febab
                 index = dst
rdobuilder 6febab
             src, dst = src_or_list
rdobuilder 6febab
         else:
rdobuilder 6febab
             src, dst = src_or_list, dst
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
         if isinstance(src, Node):
rdobuilder 6febab
             src = src.get_name()
rdobuilder 6febab
 
rdobuilder 6febab
         if isinstance(dst, Node):
rdobuilder 6febab
             dst = dst.get_name()
rdobuilder 6febab
-        
rdobuilder 6febab
-        if self.obj_dict['edges'].has_key( (src, dst) ):
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
+        if (src, dst) in self.obj_dict['edges']:
rdobuilder 6febab
             if index is not None and index < len(self.obj_dict['edges'][(src, dst)]):
rdobuilder 6febab
                 del self.obj_dict['edges'][(src, dst)][index]
rdobuilder 6febab
                 return True
rdobuilder 6febab
             else:
rdobuilder 6febab
                 del self.obj_dict['edges'][(src, dst)]
rdobuilder 6febab
                 return True
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         return False
rdobuilder 6febab
-        
rdobuilder 6febab
 
rdobuilder 6febab
     def get_edge(self, src_or_list, dst=None):
rdobuilder 6febab
         """Retrieved an edge from the graph.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         Given an edge's source and destination the corresponding
rdobuilder 6febab
         Edge instance(s) will be returned.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         If one or more edges exist with that source and destination
rdobuilder 6febab
         a list of Edge instances is returned.
rdobuilder 6febab
         An empty list is returned otherwise.
rdobuilder 6febab
         """
rdobuilder 6febab
 
rdobuilder 6febab
-        if isinstance( src_or_list, (list, tuple)) and dst is None:
rdobuilder 6febab
+        if isinstance(src_or_list, (list, tuple)) and dst is None:
rdobuilder 6febab
             edge_points = tuple(src_or_list)
rdobuilder 6febab
             edge_points_reverse = (edge_points[1], edge_points[0])
rdobuilder 6febab
         else:
rdobuilder 6febab
@@ -1454,224 +1415,205 @@ class Graph(object, Common):
rdobuilder 6febab
             edge_points_reverse = (dst, src_or_list)
rdobuilder 6febab
 
rdobuilder 6febab
         match = list()
rdobuilder 6febab
-        
rdobuilder 6febab
-        if self.obj_dict['edges'].has_key( edge_points ) or (
rdobuilder 6febab
-            self.get_top_graph_type() == 'graph' and self.obj_dict['edges'].has_key( edge_points_reverse )):
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
+        if edge_points in self.obj_dict['edges'] or (
rdobuilder 6febab
+                self.get_top_graph_type() == 'graph' and
rdobuilder 6febab
+                edge_points_reverse in self.obj_dict['edges']
rdobuilder 6febab
+                ):
rdobuilder 6febab
+
rdobuilder 6febab
             edges_obj_dict = self.obj_dict['edges'].get(
rdobuilder 6febab
                 edge_points,
rdobuilder 6febab
-                self.obj_dict['edges'].get( edge_points_reverse, None ))
rdobuilder 6febab
-        
rdobuilder 6febab
+                self.obj_dict['edges'].get(edge_points_reverse, None))
rdobuilder 6febab
+
rdobuilder 6febab
             for edge_obj_dict in edges_obj_dict:
rdobuilder 6febab
-                match.append( Edge( edge_points[0], edge_points[1], obj_dict = edge_obj_dict ) )
rdobuilder 6febab
+                match.append(
rdobuilder 6febab
+                    Edge(edge_points[0], edge_points[1], obj_dict=edge_obj_dict)
rdobuilder 6febab
+                    )
rdobuilder 6febab
 
rdobuilder 6febab
         return match
rdobuilder 6febab
 
rdobuilder 6febab
-
rdobuilder 6febab
     def get_edges(self):
rdobuilder 6febab
         return self.get_edge_list()
rdobuilder 6febab
-        
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
     def get_edge_list(self):
rdobuilder 6febab
         """Get the list of Edge instances.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         This method returns the list of Edge instances
rdobuilder 6febab
         composing the graph.
rdobuilder 6febab
         """
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         edge_objs = list()
rdobuilder 6febab
-        
rdobuilder 6febab
-        for edge, obj_dict_list in self.obj_dict['edges'].iteritems():
rdobuilder 6febab
-                edge_objs.extend( [ Edge( obj_dict = obj_d ) for obj_d in obj_dict_list ] )
rdobuilder 6febab
-        
rdobuilder 6febab
-        return edge_objs
rdobuilder 6febab
 
rdobuilder 6febab
+        for edge, obj_dict_list in self.obj_dict['edges'].items():
rdobuilder 6febab
+            edge_objs.extend([
rdobuilder 6febab
+                Edge(obj_dict=obj_d)
rdobuilder 6febab
+                for obj_d
rdobuilder 6febab
+                in obj_dict_list
rdobuilder 6febab
+                ])
rdobuilder 6febab
+
rdobuilder 6febab
+        return edge_objs
rdobuilder 6febab
 
rdobuilder 6febab
-            
rdobuilder 6febab
     def add_subgraph(self, sgraph):
rdobuilder 6febab
         """Adds an subgraph object to the graph.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         It takes a subgraph object as its only argument and returns
rdobuilder 6febab
         None.
rdobuilder 6febab
         """
rdobuilder 6febab
 
rdobuilder 6febab
         if not isinstance(sgraph, Subgraph) and not isinstance(sgraph, Cluster):
rdobuilder 6febab
             raise TypeError('add_subgraph() received a non subgraph class object:' + str(sgraph))
rdobuilder 6febab
-            
rdobuilder 6febab
-        if self.obj_dict['subgraphs'].has_key(sgraph.get_name()):
rdobuilder 6febab
-        
rdobuilder 6febab
-            sgraph_list = self.obj_dict['subgraphs'][ sgraph.get_name() ]
rdobuilder 6febab
-            sgraph_list.append( sgraph.obj_dict )
rdobuilder 6febab
-                
rdobuilder 6febab
+
rdobuilder 6febab
+        if sgraph.get_name() in self.obj_dict['subgraphs']:
rdobuilder 6febab
+
rdobuilder 6febab
+            sgraph_list = self.obj_dict['subgraphs'][sgraph.get_name()]
rdobuilder 6febab
+            sgraph_list.append(sgraph.obj_dict)
rdobuilder 6febab
+
rdobuilder 6febab
         else:
rdobuilder 6febab
-            self.obj_dict['subgraphs'][ sgraph.get_name() ] = [ sgraph.obj_dict ]
rdobuilder 6febab
-         
rdobuilder 6febab
-        sgraph.set_sequence( self.get_next_sequence_number() )
rdobuilder 6febab
-        
rdobuilder 6febab
-        sgraph.set_parent_graph( self.get_parent_graph() )
rdobuilder 6febab
+            self.obj_dict['subgraphs'][sgraph.get_name()] = [sgraph.obj_dict]
rdobuilder 6febab
 
rdobuilder 6febab
+        sgraph.set_sequence(self.get_next_sequence_number())
rdobuilder 6febab
 
rdobuilder 6febab
+        sgraph.set_parent_graph(self.get_parent_graph())
rdobuilder 6febab
 
rdobuilder 6febab
-    
rdobuilder 6febab
     def get_subgraph(self, name):
rdobuilder 6febab
         """Retrieved a subgraph from the graph.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         Given a subgraph's name the corresponding
rdobuilder 6febab
         Subgraph instance will be returned.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         If one or more subgraphs exist with the same name, a list of
rdobuilder 6febab
         Subgraph instances is returned.
rdobuilder 6febab
         An empty list is returned otherwise.
rdobuilder 6febab
         """
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         match = list()
rdobuilder 6febab
-        
rdobuilder 6febab
-        if self.obj_dict['subgraphs'].has_key( name ):
rdobuilder 6febab
-        
rdobuilder 6febab
-            sgraphs_obj_dict = self.obj_dict['subgraphs'].get( name )
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
+        if name in self.obj_dict['subgraphs']:
rdobuilder 6febab
+            sgraphs_obj_dict = self.obj_dict['subgraphs'].get(name)
rdobuilder 6febab
+
rdobuilder 6febab
             for obj_dict_list in sgraphs_obj_dict:
rdobuilder 6febab
-                #match.extend( Subgraph( obj_dict = obj_d ) for obj_d in obj_dict_list )
rdobuilder 6febab
-                match.append( Subgraph( obj_dict = obj_dict_list ) )
rdobuilder 6febab
-        
rdobuilder 6febab
-        return match
rdobuilder 6febab
+                #match.extend(Subgraph(obj_dict = obj_d) for obj_d in obj_dict_list)
rdobuilder 6febab
+                match.append(Subgraph(obj_dict=obj_dict_list))
rdobuilder 6febab
 
rdobuilder 6febab
+        return match
rdobuilder 6febab
 
rdobuilder 6febab
     def get_subgraphs(self):
rdobuilder 6febab
-    
rdobuilder 6febab
         return self.get_subgraph_list()
rdobuilder 6febab
-        
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
     def get_subgraph_list(self):
rdobuilder 6febab
         """Get the list of Subgraph instances.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         This method returns the list of Subgraph instances
rdobuilder 6febab
         in the graph.
rdobuilder 6febab
         """
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         sgraph_objs = list()
rdobuilder 6febab
-        
rdobuilder 6febab
-        for sgraph, obj_dict_list in self.obj_dict['subgraphs'].iteritems():
rdobuilder 6febab
-                sgraph_objs.extend( [ Subgraph( obj_dict = obj_d ) for obj_d in obj_dict_list ] )
rdobuilder 6febab
-        
rdobuilder 6febab
-        return sgraph_objs
rdobuilder 6febab
-            
rdobuilder 6febab
 
rdobuilder 6febab
+        for sgraph, obj_dict_list in self.obj_dict['subgraphs'].items():
rdobuilder 6febab
+            sgraph_objs.extend([
rdobuilder 6febab
+                Subgraph(obj_dict=obj_d)
rdobuilder 6febab
+                for obj_d
rdobuilder 6febab
+                in obj_dict_list
rdobuilder 6febab
+                ])
rdobuilder 6febab
+
rdobuilder 6febab
+        return sgraph_objs
rdobuilder 6febab
 
rdobuilder 6febab
     def set_parent_graph(self, parent_graph):
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
         self.obj_dict['parent_graph'] = parent_graph
rdobuilder 6febab
-        
rdobuilder 6febab
-        for obj_list in self.obj_dict['nodes'].itervalues():
rdobuilder 6febab
+
rdobuilder 6febab
+        for obj_list in self.obj_dict['nodes'].values():
rdobuilder 6febab
             for obj in obj_list:
rdobuilder 6febab
                 obj['parent_graph'] = parent_graph
rdobuilder 6febab
 
rdobuilder 6febab
-        for obj_list in self.obj_dict['edges'].itervalues():
rdobuilder 6febab
+        for obj_list in self.obj_dict['edges'].values():
rdobuilder 6febab
             for obj in obj_list:
rdobuilder 6febab
                 obj['parent_graph'] = parent_graph
rdobuilder 6febab
 
rdobuilder 6febab
-        for obj_list in self.obj_dict['subgraphs'].itervalues():
rdobuilder 6febab
+        for obj_list in self.obj_dict['subgraphs'].values():
rdobuilder 6febab
             for obj in obj_list:
rdobuilder 6febab
                 Graph(obj_dict=obj).set_parent_graph(parent_graph)
rdobuilder 6febab
 
rdobuilder 6febab
-
rdobuilder 6febab
-
rdobuilder 6febab
     def to_string(self):
rdobuilder 6febab
         """Returns a string representation of the graph in dot language.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         It will return the graph and all its subelements in string from.
rdobuilder 6febab
         """
rdobuilder 6febab
-        
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         graph = list()
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         if self.obj_dict.get('strict', None) is not None:
rdobuilder 6febab
-        
rdobuilder 6febab
-            if self==self.get_parent_graph() and self.obj_dict['strict']:
rdobuilder 6febab
-            
rdobuilder 6febab
+            if self == self.get_parent_graph() and self.obj_dict['strict']:
rdobuilder 6febab
                 graph.append('strict ')
rdobuilder 6febab
 
rdobuilder 6febab
         if self.obj_dict['name'] == '':
rdobuilder 6febab
             if 'show_keyword' in self.obj_dict and self.obj_dict['show_keyword']:
rdobuilder 6febab
-                graph.append( 'subgraph {\n' )
rdobuilder 6febab
+                graph.append('subgraph {\n')
rdobuilder 6febab
             else:
rdobuilder 6febab
-                graph.append( '{\n' )
rdobuilder 6febab
+                graph.append('{\n')
rdobuilder 6febab
         else:
rdobuilder 6febab
-            graph.append( '%s %s {\n' % (self.obj_dict['type'], self.obj_dict['name']) )
rdobuilder 6febab
-
rdobuilder 6febab
+            graph.append('%s %s {\n' % (self.obj_dict['type'], self.obj_dict['name']))
rdobuilder 6febab
 
rdobuilder 6febab
-        for attr in self.obj_dict['attributes'].iterkeys():
rdobuilder 6febab
-        
rdobuilder 6febab
-            if self.obj_dict['attributes'].get(attr, None) is not None:
rdobuilder 6febab
-       
rdobuilder 6febab
-                val = self.obj_dict['attributes'].get(attr)
rdobuilder 6febab
-                if val is not None:
rdobuilder 6febab
-                    graph.append( '%s=%s' % (attr, quote_if_necessary(val)) )
rdobuilder 6febab
-                else:
rdobuilder 6febab
-                    graph.append( attr )
rdobuilder 6febab
-                    
rdobuilder 6febab
-                graph.append( ';\n' )
rdobuilder 6febab
+        for attr, value in sorted(self.obj_dict['attributes'].items(), key=itemgetter(0)):
rdobuilder 6febab
+            if value is not None:
rdobuilder 6febab
+                graph.append('%s=%s' % (attr, quote_if_necessary(value)))
rdobuilder 6febab
+            else:
rdobuilder 6febab
+                graph.append(attr)
rdobuilder 6febab
 
rdobuilder 6febab
+            graph.append(';\n')
rdobuilder 6febab
 
rdobuilder 6febab
         edges_done = set()
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         edge_obj_dicts = list()
rdobuilder 6febab
-        for e in self.obj_dict['edges'].itervalues():
rdobuilder 6febab
+        for e in self.obj_dict['edges'].values():
rdobuilder 6febab
             edge_obj_dicts.extend(e)
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         if edge_obj_dicts:
rdobuilder 6febab
-            edge_src_set, edge_dst_set = zip( *[obj['points'] for obj in edge_obj_dicts] )
rdobuilder 6febab
+            edge_src_set, edge_dst_set = list(zip(*[obj['points'] for obj in edge_obj_dicts]))
rdobuilder 6febab
             edge_src_set, edge_dst_set = set(edge_src_set), set(edge_dst_set)
rdobuilder 6febab
         else:
rdobuilder 6febab
             edge_src_set, edge_dst_set = set(), set()
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         node_obj_dicts = list()
rdobuilder 6febab
-        for e in self.obj_dict['nodes'].itervalues():
rdobuilder 6febab
+        for e in self.obj_dict['nodes'].values():
rdobuilder 6febab
             node_obj_dicts.extend(e)
rdobuilder 6febab
 
rdobuilder 6febab
         sgraph_obj_dicts = list()
rdobuilder 6febab
-        for sg in self.obj_dict['subgraphs'].itervalues():
rdobuilder 6febab
+        for sg in self.obj_dict['subgraphs'].values():
rdobuilder 6febab
             sgraph_obj_dicts.extend(sg)
rdobuilder 6febab
 
rdobuilder 6febab
-        
rdobuilder 6febab
-        obj_list = [ (obj['sequence'], obj) for obj in (edge_obj_dicts + node_obj_dicts + sgraph_obj_dicts) ]
rdobuilder 6febab
-        obj_list.sort()
rdobuilder 6febab
-        
rdobuilder 6febab
+        obj_list = sorted([
rdobuilder 6febab
+            (obj['sequence'], obj)
rdobuilder 6febab
+            for obj
rdobuilder 6febab
+            in (edge_obj_dicts + node_obj_dicts + sgraph_obj_dicts)
rdobuilder 6febab
+            ])
rdobuilder 6febab
+
rdobuilder 6febab
         for idx, obj in obj_list:
rdobuilder 6febab
-        
rdobuilder 6febab
             if obj['type'] == 'node':
rdobuilder 6febab
-
rdobuilder 6febab
                 node = Node(obj_dict=obj)
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
                 if self.obj_dict.get('suppress_disconnected', False):
rdobuilder 6febab
-                
rdobuilder 6febab
                     if (node.get_name() not in edge_src_set and
rdobuilder 6febab
-                        node.get_name() not in edge_dst_set):
rdobuilder 6febab
-                        
rdobuilder 6febab
+                            node.get_name() not in edge_dst_set):
rdobuilder 6febab
                         continue
rdobuilder 6febab
-                        
rdobuilder 6febab
-                graph.append( node.to_string()+'\n' )
rdobuilder 6febab
 
rdobuilder 6febab
-            elif obj['type'] == 'edge':
rdobuilder 6febab
+                graph.append(node.to_string() + '\n')
rdobuilder 6febab
 
rdobuilder 6febab
+            elif obj['type'] == 'edge':
rdobuilder 6febab
                 edge = Edge(obj_dict=obj)
rdobuilder 6febab
-                
rdobuilder 6febab
+
rdobuilder 6febab
                 if self.obj_dict.get('simplify', False) and edge in edges_done:
rdobuilder 6febab
                     continue
rdobuilder 6febab
-                
rdobuilder 6febab
-                graph.append( edge.to_string() + '\n' )
rdobuilder 6febab
+
rdobuilder 6febab
+                graph.append(edge.to_string() + '\n')
rdobuilder 6febab
                 edges_done.add(edge)
rdobuilder 6febab
-                
rdobuilder 6febab
             else:
rdobuilder 6febab
-            
rdobuilder 6febab
                 sgraph = Subgraph(obj_dict=obj)
rdobuilder 6febab
-                
rdobuilder 6febab
-                graph.append( sgraph.to_string()+'\n' )
rdobuilder 6febab
+                graph.append(sgraph.to_string() + '\n')
rdobuilder 6febab
 
rdobuilder 6febab
-        graph.append( '}\n' )
rdobuilder 6febab
-        
rdobuilder 6febab
-        return ''.join(graph)
rdobuilder 6febab
+        graph.append('}\n')
rdobuilder 6febab
 
rdobuilder 6febab
+        return ''.join(graph)
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
 class Subgraph(Graph):
rdobuilder 6febab
@@ -1680,9 +1622,9 @@ class Subgraph(Graph):
rdobuilder 6febab
 
rdobuilder 6febab
     This class implements the methods to work on a representation
rdobuilder 6febab
     of a subgraph in Graphviz's dot language.
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     subgraph(graph_name='subG', suppress_disconnected=False, attribute=value, ...)
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     graph_name:
rdobuilder 6febab
         the subgraph's name
rdobuilder 6febab
     suppress_disconnected:
rdobuilder 6febab
@@ -1690,46 +1632,43 @@ class Subgraph(Graph):
rdobuilder 6febab
         subgraph any disconnected nodes.
rdobuilder 6febab
     All the attributes defined in the Graphviz dot language should
rdobuilder 6febab
     be supported.
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     Attributes can be set through the dynamically generated methods:
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
      set_[attribute name], i.e. set_size, set_fontname
rdobuilder 6febab
-     
rdobuilder 6febab
+
rdobuilder 6febab
     or using the instance's attributes:
rdobuilder 6febab
-    
rdobuilder 6febab
-     Subgraph.obj_dict['attributes'][attribute name], i.e. 
rdobuilder 6febab
-     
rdobuilder 6febab
+
rdobuilder 6febab
+     Subgraph.obj_dict['attributes'][attribute name], i.e.
rdobuilder 6febab
+
rdobuilder 6febab
         subgraph_instance.obj_dict['attributes']['label']
rdobuilder 6febab
         subgraph_instance.obj_dict['attributes']['fontname']
rdobuilder 6febab
     """
rdobuilder 6febab
-    
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     # RMF: subgraph should have all the attributes of graph so it can be passed
rdobuilder 6febab
     # as a graph to all methods
rdobuilder 6febab
     #
rdobuilder 6febab
-    def __init__(self, graph_name='', obj_dict=None, suppress_disconnected=False,
rdobuilder 6febab
-        simplify=False, **attrs):
rdobuilder 6febab
-        
rdobuilder 6febab
+    def __init__(
rdobuilder 6febab
+            self, graph_name='', obj_dict=None, suppress_disconnected=False,
rdobuilder 6febab
+            simplify=False, **attrs):
rdobuilder 6febab
 
rdobuilder 6febab
-        Graph.__init__(self, graph_name=graph_name, obj_dict=obj_dict,
rdobuilder 6febab
+        Graph.__init__(
rdobuilder 6febab
+            self, graph_name=graph_name, obj_dict=obj_dict,
rdobuilder 6febab
             suppress_disconnected=suppress_disconnected, simplify=simplify, **attrs)
rdobuilder 6febab
 
rdobuilder 6febab
         if obj_dict is None:
rdobuilder 6febab
-
rdobuilder 6febab
             self.obj_dict['type'] = 'subgraph'
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
-
rdobuilder 6febab
-
rdobuilder 6febab
 class Cluster(Graph):
rdobuilder 6febab
 
rdobuilder 6febab
     """Class representing a cluster in Graphviz's dot language.
rdobuilder 6febab
 
rdobuilder 6febab
     This class implements the methods to work on a representation
rdobuilder 6febab
     of a cluster in Graphviz's dot language.
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     cluster(graph_name='subG', suppress_disconnected=False, attribute=value, ...)
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     graph_name:
rdobuilder 6febab
         the cluster's name (the string 'cluster' will be always prepended)
rdobuilder 6febab
     suppress_disconnected:
rdobuilder 6febab
@@ -1737,38 +1676,35 @@ class Cluster(Graph):
rdobuilder 6febab
         cluster any disconnected nodes.
rdobuilder 6febab
     All the attributes defined in the Graphviz dot language should
rdobuilder 6febab
     be supported.
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     Attributes can be set through the dynamically generated methods:
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
      set_[attribute name], i.e. set_color, set_fontname
rdobuilder 6febab
-     
rdobuilder 6febab
+
rdobuilder 6febab
     or using the instance's attributes:
rdobuilder 6febab
-    
rdobuilder 6febab
-     Cluster.obj_dict['attributes'][attribute name], i.e. 
rdobuilder 6febab
-     
rdobuilder 6febab
+
rdobuilder 6febab
+     Cluster.obj_dict['attributes'][attribute name], i.e.
rdobuilder 6febab
+
rdobuilder 6febab
         cluster_instance.obj_dict['attributes']['label']
rdobuilder 6febab
         cluster_instance.obj_dict['attributes']['fontname']
rdobuilder 6febab
     """
rdobuilder 6febab
-    
rdobuilder 6febab
 
rdobuilder 6febab
-    def __init__(self, graph_name='subG', obj_dict=None, suppress_disconnected=False,
rdobuilder 6febab
-        simplify=False, **attrs):
rdobuilder 6febab
+    def __init__(
rdobuilder 6febab
+            self, graph_name='subG', obj_dict=None, suppress_disconnected=False,
rdobuilder 6febab
+            simplify=False, **attrs):
rdobuilder 6febab
 
rdobuilder 6febab
-        Graph.__init__(self, graph_name=graph_name, obj_dict=obj_dict,
rdobuilder 6febab
-            suppress_disconnected=suppress_disconnected, simplify=simplify, **attrs)
rdobuilder 6febab
+        Graph.__init__(
rdobuilder 6febab
+            self, graph_name=graph_name, obj_dict=obj_dict,
rdobuilder 6febab
+            suppress_disconnected=suppress_disconnected, simplify=simplify, **attrs
rdobuilder 6febab
+            )
rdobuilder 6febab
 
rdobuilder 6febab
         if obj_dict is None:
rdobuilder 6febab
-
rdobuilder 6febab
             self.obj_dict['type'] = 'subgraph'
rdobuilder 6febab
-            self.obj_dict['name'] = 'cluster_'+graph_name
rdobuilder 6febab
+            self.obj_dict['name'] = 'cluster_' + graph_name
rdobuilder 6febab
 
rdobuilder 6febab
         self.create_attribute_methods(CLUSTER_ATTRIBUTES)
rdobuilder 6febab
 
rdobuilder 6febab
 
rdobuilder 6febab
-
rdobuilder 6febab
-   
rdobuilder 6febab
-
rdobuilder 6febab
-
rdobuilder 6febab
 class Dot(Graph):
rdobuilder 6febab
     """A container for handling a dot language file.
rdobuilder 6febab
 
rdobuilder 6febab
@@ -1776,144 +1712,148 @@ class Dot(Graph):
rdobuilder 6febab
     a dot language file. It is a derived class of
rdobuilder 6febab
     the base class 'Graph'.
rdobuilder 6febab
     """
rdobuilder 6febab
-    
rdobuilder 6febab
-    
rdobuilder 6febab
-     
rdobuilder 6febab
+
rdobuilder 6febab
     def __init__(self, *argsl, **argsd):
rdobuilder 6febab
         Graph.__init__(self, *argsl, **argsd)
rdobuilder 6febab
 
rdobuilder 6febab
         self.shape_files = list()
rdobuilder 6febab
-
rdobuilder 6febab
         self.progs = None
rdobuilder 6febab
-        
rdobuilder 6febab
-        self.formats = ['canon', 'cmap', 'cmapx', 'cmapx_np', 'dia', 'dot',
rdobuilder 6febab
+        self.formats = [
rdobuilder 6febab
+            'canon', 'cmap', 'cmapx', 'cmapx_np', 'dia', 'dot',
rdobuilder 6febab
             'fig', 'gd', 'gd2', 'gif', 'hpgl', 'imap', 'imap_np', 'ismap',
rdobuilder 6febab
             'jpe', 'jpeg', 'jpg', 'mif', 'mp', 'pcl', 'pdf', 'pic', 'plain',
rdobuilder 6febab
             'plain-ext', 'png', 'ps', 'ps2', 'svg', 'svgz', 'vml', 'vmlz',
rdobuilder 6febab
-            'vrml', 'vtx', 'wbmp', 'xdot', 'xlib' ]
rdobuilder 6febab
-
rdobuilder 6febab
+            'vrml', 'vtx', 'wbmp', 'xdot', 'xlib'
rdobuilder 6febab
+            ]
rdobuilder 6febab
         self.prog = 'dot'
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         # Automatically creates all the methods enabling the creation
rdobuilder 6febab
         # of output in any of the supported formats.
rdobuilder 6febab
         for frmt in self.formats:
rdobuilder 6febab
             self.__setattr__(
rdobuilder 6febab
-                'create_'+frmt,
rdobuilder 6febab
-                lambda f=frmt, prog=self.prog : self.create(format=f, prog=prog))
rdobuilder 6febab
-            f = self.__dict__['create_'+frmt]
rdobuilder 6febab
-            f.__doc__ = '''Refer to the docstring accompanying the 'create' method for more information.'''
rdobuilder 6febab
-            
rdobuilder 6febab
-        for frmt in self.formats+['raw']:
rdobuilder 6febab
+                'create_' + frmt,
rdobuilder 6febab
+                lambda f=frmt, prog=self.prog: self.create(format=f, prog=prog)
rdobuilder 6febab
+                )
rdobuilder 6febab
+            f = self.__dict__['create_' + frmt]
rdobuilder 6febab
+            f.__doc__ = (
rdobuilder 6febab
+                '''Refer to the docstring accompanying the'''
rdobuilder 6febab
+                ''''create' method for more information.'''
rdobuilder 6febab
+                )
rdobuilder 6febab
+
rdobuilder 6febab
+        for frmt in self.formats + ['raw']:
rdobuilder 6febab
             self.__setattr__(
rdobuilder 6febab
-                'write_'+frmt,
rdobuilder 6febab
-                lambda path, f=frmt, prog=self.prog : self.write(path, format=f, prog=prog))
rdobuilder 6febab
-                
rdobuilder 6febab
-            f = self.__dict__['write_'+frmt]
rdobuilder 6febab
-            f.__doc__ = '''Refer to the docstring accompanying the 'write' method for more information.'''
rdobuilder 6febab
-        
rdobuilder 6febab
-        
rdobuilder 6febab
-    
rdobuilder 6febab
+                'write_' + frmt,
rdobuilder 6febab
+                lambda path, f=frmt, prog=self.prog: self.write(path, format=f, prog=prog)
rdobuilder 6febab
+                )
rdobuilder 6febab
+
rdobuilder 6febab
+            f = self.__dict__['write_' + frmt]
rdobuilder 6febab
+            f.__doc__ = (
rdobuilder 6febab
+                '''Refer to the docstring accompanying the'''
rdobuilder 6febab
+                ''''write' method for more information.'''
rdobuilder 6febab
+                )
rdobuilder 6febab
+
rdobuilder 6febab
     def __getstate__(self):
rdobuilder 6febab
-        
rdobuilder 6febab
-        dict = copy.copy(self.obj_dict)
rdobuilder 6febab
-        
rdobuilder 6febab
-        return dict
rdobuilder 6febab
-    
rdobuilder 6febab
+        return copy.copy(self.obj_dict)
rdobuilder 6febab
+
rdobuilder 6febab
     def __setstate__(self, state):
rdobuilder 6febab
-        
rdobuilder 6febab
         self.obj_dict = state
rdobuilder 6febab
-        
rdobuilder 6febab
-    
rdobuilder 6febab
+
rdobuilder 6febab
     def set_shape_files(self, file_paths):
rdobuilder 6febab
         """Add the paths of the required image files.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         If the graph needs graphic objects to be used as shapes or otherwise
rdobuilder 6febab
         those need to be in the same folder as the graph is going to be rendered
rdobuilder 6febab
         from. Alternatively the absolute path to the files can be specified when
rdobuilder 6febab
         including the graphics in the graph.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         The files in the location pointed to by the path(s) specified as arguments
rdobuilder 6febab
         to this method will be copied to the same temporary location where the
rdobuilder 6febab
         graph is going to be rendered.
rdobuilder 6febab
         """
rdobuilder 6febab
-        
rdobuilder 6febab
-        if isinstance( file_paths, basestring ):
rdobuilder 6febab
-            self.shape_files.append( file_paths )
rdobuilder 6febab
-            
rdobuilder 6febab
-        if isinstance( file_paths, (list, tuple) ):
rdobuilder 6febab
-            self.shape_files.extend( file_paths )
rdobuilder 6febab
-    
rdobuilder 6febab
-                
rdobuilder 6febab
+
rdobuilder 6febab
+        if isinstance(file_paths, basestring):
rdobuilder 6febab
+            self.shape_files.append(file_paths)
rdobuilder 6febab
+
rdobuilder 6febab
+        if isinstance(file_paths, (list, tuple)):
rdobuilder 6febab
+            self.shape_files.extend(file_paths)
rdobuilder 6febab
+
rdobuilder 6febab
     def set_prog(self, prog):
rdobuilder 6febab
         """Sets the default program.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         Sets the default program in charge of processing
rdobuilder 6febab
         the dot file into a graph.
rdobuilder 6febab
         """
rdobuilder 6febab
         self.prog = prog
rdobuilder 6febab
-        
rdobuilder 6febab
 
rdobuilder 6febab
     def set_graphviz_executables(self, paths):
rdobuilder 6febab
         """This method allows to manually specify the location of the GraphViz executables.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         The argument to this method should be a dictionary where the keys are as follows:
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
             {'dot': '', 'twopi': '', 'neato': '', 'circo': '', 'fdp': ''}
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         and the values are the paths to the corresponding executable, including the name
rdobuilder 6febab
         of the executable itself.
rdobuilder 6febab
         """
rdobuilder 6febab
-    
rdobuilder 6febab
-        self.progs = paths
rdobuilder 6febab
 
rdobuilder 6febab
+        self.progs = paths
rdobuilder 6febab
 
rdobuilder 6febab
     def write(self, path, prog=None, format='raw'):
rdobuilder 6febab
-        """Writes a graph to a file.
rdobuilder 6febab
-
rdobuilder 6febab
+        """
rdobuilder 6febab
         Given a filename 'path' it will open/create and truncate
rdobuilder 6febab
         such file and write on it a representation of the graph
rdobuilder 6febab
         defined by the dot object and in the format specified by
rdobuilder 6febab
-        'format'.
rdobuilder 6febab
+        'format'. 'path' can also be an open file-like object, such as
rdobuilder 6febab
+        a StringIO instance.
rdobuilder 6febab
+
rdobuilder 6febab
         The format 'raw' is used to dump the string representation
rdobuilder 6febab
         of the Dot object, without further processing.
rdobuilder 6febab
         The output can be processed by any of graphviz tools, defined
rdobuilder 6febab
         in 'prog', which defaults to 'dot'
rdobuilder 6febab
         Returns True or False according to the success of the write
rdobuilder 6febab
         operation.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         There's also the preferred possibility of using:
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
             write_'format'(path, prog='program')
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         which are automatically defined for all the supported formats.
rdobuilder 6febab
         [write_ps(), write_gif(), write_dia(), ...]
rdobuilder 6febab
-        """
rdobuilder 6febab
 
rdobuilder 6febab
+        """
rdobuilder 6febab
         if prog is None:
rdobuilder 6febab
             prog = self.prog
rdobuilder 6febab
-        
rdobuilder 6febab
-        dot_fd = file(path, "w+b")
rdobuilder 6febab
-        if format == 'raw':
rdobuilder 6febab
-            data = self.to_string()
rdobuilder 6febab
-            if isinstance(data, basestring):
rdobuilder 6febab
-                if not isinstance(data, unicode):
rdobuilder 6febab
-                    try:
rdobuilder 6febab
-                        data = unicode(data, 'utf-8')
rdobuilder 6febab
-                    except:
rdobuilder 6febab
-                        pass
rdobuilder 6febab
-                        
rdobuilder 6febab
-            try:
rdobuilder 6febab
-                data = data.encode('utf-8')
rdobuilder 6febab
-            except:
rdobuilder 6febab
-                pass
rdobuilder 6febab
-            dot_fd.write(data)
rdobuilder 6febab
-        else:
rdobuilder 6febab
-            dot_fd.write(self.create(prog, format))
rdobuilder 6febab
-        dot_fd.close()
rdobuilder 6febab
 
rdobuilder 6febab
-        return True
rdobuilder 6febab
-        
rdobuilder 6febab
+        fobj, close = get_fobj(path, 'w+b')
rdobuilder 6febab
+        try:
rdobuilder 6febab
+            if format == 'raw':
rdobuilder 6febab
+                data = self.to_string()
rdobuilder 6febab
+                if isinstance(data, basestring):
rdobuilder 6febab
+                    if not isinstance(data, unicode):
rdobuilder 6febab
+                        try:
rdobuilder 6febab
+                            data = unicode(data, 'utf-8')
rdobuilder 6febab
+                        except:
rdobuilder 6febab
+                            pass
rdobuilder 6febab
+
rdobuilder 6febab
+                try:
rdobuilder 6febab
+                    charset = self.get_charset()
rdobuilder 6febab
+                    if not PY3 or not charset:
rdobuilder 6febab
+                        charset = 'utf-8'
rdobuilder 6febab
+                    data = data.encode(charset)
rdobuilder 6febab
+                except:
rdobuilder 6febab
+                    if PY3:
rdobuilder 6febab
+                        data = data.encode('utf-8')
rdobuilder 6febab
+                    pass
rdobuilder 6febab
+
rdobuilder 6febab
+                fobj.write(data)
rdobuilder 6febab
+
rdobuilder 6febab
+            else:
rdobuilder 6febab
+                fobj.write(self.create(prog, format))
rdobuilder 6febab
+        finally:
rdobuilder 6febab
+            if close:
rdobuilder 6febab
+                fobj.close()
rdobuilder 6febab
 
rdobuilder 6febab
+        return True
rdobuilder 6febab
 
rdobuilder 6febab
     def create(self, prog=None, format='ps'):
rdobuilder 6febab
         """Creates and returns a Postscript representation of the graph.
rdobuilder 6febab
@@ -1923,75 +1863,71 @@ class Dot(Graph):
rdobuilder 6febab
         reading the Postscript output and returning it as a string is the
rdobuilder 6febab
         operation is successful.
rdobuilder 6febab
         On failure None is returned.
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         There's also the preferred possibility of using:
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
             create_'format'(prog='program')
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         which are automatically defined for all the supported formats.
rdobuilder 6febab
         [create_ps(), create_gif(), create_dia(), ...]
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         If 'prog' is a list instead of a string the fist item is expected
rdobuilder 6febab
         to be the program name, followed by any optional command-line
rdobuilder 6febab
         arguments for it:
rdobuilder 6febab
-        
rdobuilder 6febab
-            [ 'twopi', '-Tdot', '-s10' ]
rdobuilder 6febab
+
rdobuilder 6febab
+            ['twopi', '-Tdot', '-s10']
rdobuilder 6febab
         """
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         if prog is None:
rdobuilder 6febab
             prog = self.prog
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         if isinstance(prog, (list, tuple)):
rdobuilder 6febab
             prog, args = prog[0], prog[1:]
rdobuilder 6febab
         else:
rdobuilder 6febab
             args = []
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         if self.progs is None:
rdobuilder 6febab
             self.progs = find_graphviz()
rdobuilder 6febab
             if self.progs is None:
rdobuilder 6febab
                 raise InvocationException(
rdobuilder 6febab
-                    'GraphViz\'s executables not found' )
rdobuilder 6febab
-                
rdobuilder 6febab
-        if not self.progs.has_key(prog):
rdobuilder 6febab
+                    'GraphViz\'s executables not found')
rdobuilder 6febab
+
rdobuilder 6febab
+        if prog not in self.progs:
rdobuilder 6febab
             raise InvocationException(
rdobuilder 6febab
-                'GraphViz\'s executable "%s" not found' % prog )
rdobuilder 6febab
-            
rdobuilder 6febab
-        if not os.path.exists( self.progs[prog] ) or not os.path.isfile( self.progs[prog] ):
rdobuilder 6febab
+                'GraphViz\'s executable "%s" not found' % prog)
rdobuilder 6febab
+
rdobuilder 6febab
+        if not os.path.exists(self.progs[prog]) or not os.path.isfile(self.progs[prog]):
rdobuilder 6febab
             raise InvocationException(
rdobuilder 6febab
-                'GraphViz\'s executable "%s" is not a file or doesn\'t exist' % self.progs[prog] )
rdobuilder 6febab
-            
rdobuilder 6febab
-            
rdobuilder 6febab
+                'GraphViz\'s executable "%s" is not a file or doesn\'t exist' % self.progs[prog])
rdobuilder 6febab
+
rdobuilder 6febab
         tmp_fd, tmp_name = tempfile.mkstemp()
rdobuilder 6febab
         os.close(tmp_fd)
rdobuilder 6febab
         self.write(tmp_name)
rdobuilder 6febab
-        tmp_dir = os.path.dirname(tmp_name )
rdobuilder 6febab
-        
rdobuilder 6febab
+        tmp_dir = os.path.dirname(tmp_name)
rdobuilder 6febab
+
rdobuilder 6febab
         # For each of the image files...
rdobuilder 6febab
-        #
rdobuilder 6febab
         for img in self.shape_files:
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
             # Get its data
rdobuilder 6febab
-            #
rdobuilder 6febab
-            f = file(img, 'rb')
rdobuilder 6febab
+            f = open(img, 'rb')
rdobuilder 6febab
             f_data = f.read()
rdobuilder 6febab
             f.close()
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
             # And copy it under a file with the same name in the temporary directory
rdobuilder 6febab
-            #
rdobuilder 6febab
-            f = file( os.path.join( tmp_dir, os.path.basename(img) ), 'wb' )
rdobuilder 6febab
+            f = open(os.path.join(tmp_dir, os.path.basename(img)), 'wb')
rdobuilder 6febab
             f.write(f_data)
rdobuilder 6febab
             f.close()
rdobuilder 6febab
-        
rdobuilder 6febab
-        cmdline = [self.progs[prog], '-T'+format, tmp_name] + args
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
+        cmdline = [self.progs[prog], '-T' + format, tmp_name] + args
rdobuilder 6febab
+
rdobuilder 6febab
         p = subprocess.Popen(
rdobuilder 6febab
             cmdline,
rdobuilder 6febab
             cwd=tmp_dir,
rdobuilder 6febab
             stderr=subprocess.PIPE, stdout=subprocess.PIPE)
rdobuilder 6febab
-            
rdobuilder 6febab
+
rdobuilder 6febab
         stderr = p.stderr
rdobuilder 6febab
         stdout = p.stdout
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
         stdout_output = list()
rdobuilder 6febab
         while True:
rdobuilder 6febab
             data = stdout.read()
rdobuilder 6febab
@@ -1999,9 +1935,9 @@ class Dot(Graph):
rdobuilder 6febab
                 break
rdobuilder 6febab
             stdout_output.append(data)
rdobuilder 6febab
         stdout.close()
rdobuilder 6febab
-            
rdobuilder 6febab
-        stdout_output = ''.join(stdout_output)
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
+        stdout_output = NULL_SEP.join(stdout_output)
rdobuilder 6febab
+
rdobuilder 6febab
         if not stderr.closed:
rdobuilder 6febab
             stderr_output = list()
rdobuilder 6febab
             while True:
rdobuilder 6febab
@@ -2010,29 +1946,28 @@ class Dot(Graph):
rdobuilder 6febab
                     break
rdobuilder 6febab
                 stderr_output.append(data)
rdobuilder 6febab
             stderr.close()
rdobuilder 6febab
-                
rdobuilder 6febab
+
rdobuilder 6febab
             if stderr_output:
rdobuilder 6febab
-                stderr_output = ''.join(stderr_output)
rdobuilder 6febab
-            
rdobuilder 6febab
+                stderr_output = NULL_SEP.join(stderr_output)
rdobuilder 6febab
+                if PY3:
rdobuilder 6febab
+                    stderr_output = stderr_output.decode(sys.stderr.encoding)
rdobuilder 6febab
+
rdobuilder 6febab
         #pid, status = os.waitpid(p.pid, 0)
rdobuilder 6febab
         status = p.wait()
rdobuilder 6febab
-        
rdobuilder 6febab
-        if status != 0 :
rdobuilder 6febab
+
rdobuilder 6febab
+        if status != 0:
rdobuilder 6febab
             raise InvocationException(
rdobuilder 6febab
                 'Program terminated with status: %d. stderr follows: %s' % (
rdobuilder 6febab
-                    status, stderr_output) )
rdobuilder 6febab
+                    status, stderr_output))
rdobuilder 6febab
         elif stderr_output:
rdobuilder 6febab
-            print stderr_output
rdobuilder 6febab
-        
rdobuilder 6febab
+            print(stderr_output)
rdobuilder 6febab
+
rdobuilder 6febab
         # For each of the image files...
rdobuilder 6febab
-        #
rdobuilder 6febab
         for img in self.shape_files:
rdobuilder 6febab
-        
rdobuilder 6febab
+
rdobuilder 6febab
             # remove it
rdobuilder 6febab
-            #
rdobuilder 6febab
-            os.unlink( os.path.join( tmp_dir, os.path.basename(img) ) )
rdobuilder 6febab
+            os.unlink(os.path.join(tmp_dir, os.path.basename(img)))
rdobuilder 6febab
 
rdobuilder 6febab
         os.unlink(tmp_name)
rdobuilder 6febab
-        
rdobuilder 6febab
-        return stdout_output
rdobuilder 6febab
 
rdobuilder 6febab
+        return stdout_output
rdobuilder 6febab
diff --git a/setup.py b/setup.py
rdobuilder 6febab
index 27328d8..92890d7 100644
rdobuilder 6febab
--- a/setup.py
rdobuilder 6febab
+++ b/setup.py
rdobuilder 6febab
@@ -1,10 +1,6 @@
rdobuilder 6febab
 #!/usr/bin/env python
rdobuilder 6febab
 
rdobuilder 6febab
-try:
rdobuilder 6febab
-    from distutils.core import setup
rdobuilder 6febab
-except ImportError, excp:
rdobuilder 6febab
-    from setuptools import setup
rdobuilder 6febab
-    
rdobuilder 6febab
+from setuptools import setup
rdobuilder 6febab
 import pydot
rdobuilder 6febab
 import os
rdobuilder 6febab