Go to the documentation of this file.00001 import string
00002 import yaml
00003 import collections
00004 from lxml import etree
00005
00006
00007
00008 from xml.etree.ElementTree import ElementTree
00009
00010 def xml_string(rootXml, addHeader = True):
00011
00012 xmlString = etree.tostring(rootXml, pretty_print = True)
00013 if addHeader:
00014 xmlString = '<?xml version="1.0"?>\n' + xmlString
00015 return xmlString
00016
00017 def dict_sub(obj, keys):
00018 return dict((key, obj[key]) for key in keys)
00019
00020 def node_add(doc, sub):
00021 if sub is None:
00022 return None
00023 if type(sub) == str:
00024 return etree.SubElement(doc, sub)
00025 elif isinstance(sub, etree._Element):
00026 doc.append(sub)
00027 return sub
00028 else:
00029 raise Exception('Invalid sub value')
00030
00031 def pfloat(x):
00032 return str(x).rstrip('.')
00033
00034 def xml_children(node):
00035 children = node.getchildren()
00036 def predicate(node):
00037 return not isinstance(node, etree._Comment)
00038 return filter(predicate, children)
00039
00040 def to_yaml(obj):
00041 """ Simplify yaml representation for pretty printing """
00042
00043
00044 if obj is None or type(obj) in [str, unicode]:
00045 out = str(obj)
00046 elif type(obj) in [int, float, bool]:
00047 return obj
00048 elif hasattr(obj, 'to_yaml'):
00049 out = obj.to_yaml()
00050 elif isinstance(obj, etree._Element):
00051 out = etree.tostring(obj, pretty_print = True)
00052 elif type(obj) == dict:
00053 out = {}
00054 for (var, value) in obj.iteritems():
00055 out[str(var)] = to_yaml(value)
00056 elif hasattr(obj, 'tolist'):
00057
00058 out = to_yaml(obj.tolist())
00059 elif isinstance(obj, collections.Iterable):
00060 out = [to_yaml(item) for item in obj]
00061 else:
00062 out = str(obj)
00063 return out
00064
00065 class SelectiveReflection(object):
00066 def get_refl_vars(self):
00067 return vars(self).keys()
00068
00069 class YamlReflection(SelectiveReflection):
00070 def to_yaml(self):
00071 raw = dict((var, getattr(self, var)) for var in self.get_refl_vars())
00072 return to_yaml(raw)
00073
00074 def __str__(self):
00075 return yaml.dump(self.to_yaml()).rstrip()