/ octoprint_GPX / iniparser.py
iniparser.py
1 # coding=utf-8 2 from __future__ import absolute_import 3 __author__ = "Mark Walker <markwal@hotmail.com> based on work by Gina Häußge" 4 __license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' 5 6 from collections import OrderedDict 7 import re 8 import os 9 10 class IniParser(): 11 def __init__(self, filename, logger): 12 self.lines = [] 13 self.counter = 0; 14 self.ini = {} 15 self.idx = OrderedDict() 16 self.filename = filename 17 self._logger = logger 18 self._regex_section = re.compile("\[(.+)\]") 19 self._regex_name_value = re.compile("([^=;]+?)=(\s*)(.+?)(\s*)(;.+)?$") 20 21 def read(self): 22 self.ini = ini = {} 23 self.idx = idx = OrderedDict() 24 self.lines = lines = [] 25 self.counter = 0 26 sectionname = None 27 ini[sectionname] = {} 28 idx[sectionname] = OrderedDict() 29 with open(self.filename) as inifile: 30 for line in inifile: 31 line = line.strip() 32 lines.append(line); 33 m = self._regex_section.match(line) 34 if m: 35 sectionname = m.group(1) 36 ini[sectionname] = {} 37 idx[sectionname] = OrderedDict() 38 else: 39 m = self._regex_name_value.match(line) 40 if m: 41 itemname = m.group(1).strip() 42 if not itemname == 'None': 43 ini[sectionname][m.group(1).strip()] = m.group(3) 44 idx[sectionname][m.group(1).strip()] = line 45 else: 46 self.counter += 1 47 idx[sectionname][self.counter] = line 48 49 # config = ConfigParser.SafeConfigParser() 50 # config.read(foo) 51 # ini = {} 52 # for section in config.sections(): 53 # ini[section] = {} 54 # for (name, value) in config.items(section): 55 # ini[section][name] = value 56 return ini 57 58 def update(self, ini): 59 if not ini.items: 60 raise ValueError("Malformed update") 61 for sectionname, section in ini.items(): 62 if not section.items: 63 raise ValueError("Invalid section") 64 for option, value in section.items(): 65 self._logger.info("option, value: %s, %s" % (option, repr(value))) 66 if ("%s" % value) in ["True", "False"]: 67 value = 1 if value else 0 68 if option == "machine_type" and (value == "" or value == "undefined" or value == "None"): 69 value = "r2" 70 if sectionname not in self.ini: 71 self.ini[sectionname] = {} 72 self.ini[sectionname][option] = value 73 if sectionname not in self.idx: 74 self.idx[sectionname] = OrderedDict() 75 line = self.idx[sectionname].get(option) 76 if value == '' or value == 'undefined' or value == 'None': 77 # means delete 78 if line is not None: 79 del self.idx[sectionname][option] 80 continue 81 if line is not None: 82 m = self._regex_name_value.match(line) 83 if m: 84 g = m.groups("") 85 g = g[0:2] + (value,) + g[3:] 86 self.idx[sectionname][option] = "%s=%s%s%s%s" % g 87 continue 88 section = self.idx[sectionname] 89 blanks = 0 90 if len(section) > 0: 91 while section[next(reversed(section))].strip() == '': 92 section.popitem() 93 blanks += 1 94 self.counter += 1 95 section[self.counter] = "%s=%s" % (option, value) 96 for i in range(0, blanks): 97 self.counter += 1 98 section[self.counter] = "" 99 100 def _write_section(self, inifile, section): 101 count = 0 102 for option, line in section.items(): 103 inifile.write(line) 104 count += 1 105 inifile.write("\n") 106 return count 107 108 109 def write(self): 110 self._logger.info("Open %s" % self.filename) 111 with open(self.filename, 'wb') as inifile: 112 self._logger.info("Write %s" % self.filename) 113 count = 0 114 if None in self.idx: 115 count += self._write_section(inifile, self.idx[None]) 116 for sectionname, section in self.idx.items(): 117 if sectionname is not None: 118 inifile.write("[%s]\n" % sectionname) 119 count += self._write_section(inifile, section) 120 if count == 0: 121 self._logger.info("For %s, all sections empty, removing file.", self.filename) 122 os.remove(self.filename) 123 124 def dump(self): 125 for sectionname, section in self.idx.items(): 126 if sectionname is not None: 127 print "[%s]" % sectionname 128 for option, line in section.items(): 129 print line 130 131 def get(self, sectionname, itemname): 132 if sectionname in self.ini and itemname in self.ini[sectionname]: 133 return self.ini[sectionname][itemname] 134 return None 135 136 # config = ConfigParser.SafeConfigParser() 137 # for name, section in ini.items() : 138 # if not config.has_section(name): 139 # config.add_section(name) 140 # for option, value in section.items(): 141 # config.set(name, option, value) 142 # with open(settings().getBaseFolder("plugins") + "/gpx.ini", 'wb') as configfile: 143 # config.write(configfile)