/ 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)