Package elisa :: Package extern :: Package coherence :: Module config
[hide private]
[frames] | no frames]

Source Code for Module elisa.extern.coherence.config

  1  # 
  2  # Licensed under the MIT license 
  3  # http://opensource.org/licenses/mit-license.php 
  4   
  5  # Copyright 2007, Frank Scholz <coherence@beebits.net> 
  6   
  7  from coherence.extern.et import ET, indent 
  8   
9 -class ConfigMixin(object):
10
11 - def nodes_to_dict(self,node):
12 13 if node.tag.endswith('list'): 14 return ConfigList(node) 15 else: 16 return ConfigDict(node)
17 18
19 -class ConfigList(list,ConfigMixin):
20
21 - def __init__(self,node):
22 self.name = node.tag 23 list.__init__(self) 24 self.from_element(node)
25
26 - def to_element(self):
27 root = ET.Element(self.name) 28 for v in self: 29 if isinstance(v, (dict,list)): 30 root.append(v.to_element()) 31 return root
32
33 - def from_element(self,node):
34 for n in node: 35 if n.get('active','yes') == 'yes': 36 if len(n) == 0: 37 a = {} 38 for attr,value in n.items(): 39 if attr == 'active': 40 continue 41 a[attr] = value 42 if len(a): 43 self.append(a) 44 else: 45 self.append(self.nodes_to_dict(n))
46
47 -class ConfigDict(dict,ConfigMixin):
48
49 - def __init__(self,node):
50 self.name = node.tag 51 dict.__init__(self) 52 self.from_element(node)
53
54 - def to_element(self):
55 root = ET.Element(self.name) 56 for key, value in self.items(): 57 if isinstance(value, (dict,list)): 58 root.append(value.to_element()) 59 else: 60 s = ET.SubElement(root,key) 61 if isinstance(value, basestring): 62 s.text = value 63 else: 64 s.text = str(value) 65 return root
66
67 - def from_element(self, node):
68 for attr,value in node.items(): 69 if attr == 'active': 70 continue 71 self[attr] = value 72 73 for n in node: 74 if n.get('active','yes') == 'yes': 75 if len(n) == 0: 76 if n.text is not None and len(n.text)>0: 77 self[n.get('name',n.tag)] = n.text 78 for attr,value in n.items(): 79 if attr == 'active': 80 continue 81 self[attr] = value 82 else: 83 tag = n.tag 84 #if tag.endswith('list'): 85 # tag = tag[:-4] 86 self[n.get('name',tag)] = self.nodes_to_dict(n)
87 88 #def __setitem__(self, key, value): 89 # self.config[key] = value 90 91 #def __getitem__(self, key): 92 # """ fetch an item """ 93 # value = self.config.get(key, None) 94 # return value 95 96 #def __delitem__(self, key): 97 # del self.config[key] 98 99 #def get(self, key, default=None): 100 # try: 101 # return self[key] 102 # except KeyError: 103 # return default 104 105 #def items(self): 106 # """ """ 107 # return self.config.items() 108 109 #def keys(self): 110 # """ """ 111 # return self.config.keys() 112 113 #def values(self): 114 # """ """ 115 # return self.config.values() 116 117 #def __repr__(self): 118 # return "%r" % self.config 119
120 -class Config(ConfigDict):
121 """ 122 an incomplete XML file to dict and vice versa mapper 123 124 - nodes with an attribute 'active' set to 'no' are ignored 125 and not transferred into the dict 126 127 - nodes with tags ending with 'list' are transferrend into 128 an item with the key = 'tag' and a list with the subnodes 129 as the value 130 131 at the moment we parse the xml file and create dicts or lists out 132 of the nodes, but maybe it is much easier to keep the xml structure 133 as it is and simulate the dict/list access behavior on it? 134 135 """ 136
137 - def __init__(self, file):
138 self.file = file 139 dict.__init__(self) 140 try: 141 xml = ET.parse(file) 142 except SyntaxError, msg: 143 raise SyntaxError, msg 144 except IOError, msg: 145 raise IOError, msg 146 except Exception, msg: 147 raise SyntaxError, msg 148 149 xmlroot = xml.getroot() 150 self.name = xmlroot.tag 151 self.from_element(xmlroot)
152
153 - def save(self,file=None):
154 if file == None: 155 file = self.file 156 e = ET.Element(self.name) 157 for key, value in self.items(): 158 if isinstance(value, (dict,list)): 159 e.append(value.to_element()) 160 else: 161 s = ET.SubElement(e,key) 162 if isinstance(value, basestring): 163 s.text = value 164 else: 165 s.text = str(value) 166 indent(e) 167 db = ET.ElementTree(e) 168 db.write(file, encoding='utf-8')
169 170 171 if __name__ == '__main__': 172 173 import sys 174 175 config = Config(sys.argv[1]) 176 print config 177 config['serverport'] = 55555 178 config['test'] = 'test' 179 config['logging']['level'] = 'info' 180 del config['controlpoint'] 181 #del config['logging']['level'] 182 print config 183 config.save('/tmp/t') 184