6 from TkAlExceptions
import AllInOneError
11 Dictionary which handles updates of values for already existing keys
13 adapteddict[key] returns a list of all values associated with key
14 This dictionary is used in the class `BetterConfigParser` instead of the
15 default `dict_type` of the `ConfigParser` class.
20 collections.OrderedDict.__init__(self, *args, **kwargs)
22 def __setitem__(self, key, value, dict_setitem=collections.OrderedDict.__setitem__):
24 od.__setitem__(i, y) <==> od[i]=y
25 Updating an existing key appends the new value to the old value
26 instead of replacing it.
29 - `key`: key part of the key-value pair
30 - `value`: value part of the key-value pair
31 - `dict_item`: method which is used for finally setting the item
34 if key !=
"__name__" and "__name__" in self
and self[
"__name__"]==
"validation":
35 if isinstance(value, (str, unicode)):
37 if item == (key, value.split(
"\n")):
40 self.validationslist.append((key, value))
42 dict_setitem(self, key, value)
45 if key !=
"__name__" and "__name__" in self
and self[
"__name__"]==
"validation":
46 return [validation[1]
for validation
in self.
validationslist if validation[0] == key]
48 return collections.OrderedDict.__getitem__(self, key)
51 if "__name__" in self
and self[
"__name__"]==
"validation":
54 return collections.OrderedDict.items(self)
58 ConfigParser.ConfigParser.__init__(self,dict_type=AdaptedDict)
66 items = self.
items(section)
67 except ConfigParser.NoSectionError:
77 for option
in self.options( section ):
78 result[option] = self.get( section, option )
79 if "local"+section.title()
in self.sections():
80 for option
in self.options(
"local"+section.title() ):
81 result[option] = self.get(
"local"+section.title(),
83 except ConfigParser.NoSectionError
as section:
84 msg = (
"%s in configuration files. This section is mandatory."
85 %(str(section).
replace(
":",
"", 1)))
90 result = copy.deepcopy(defaultDict)
91 for option
in demandPars:
93 result[option] = self.get( section, option )
94 except ConfigParser.NoOptionError
as globalSectionError:
95 globalSection = str( globalSectionError ).
split(
"'" )[-2]
96 splittedSectionName = section.split(
":" )
97 if len( splittedSectionName ) > 1:
98 localSection = (
"local"+section.split(
":" )[0].
title()+
":"
99 +section.split(
":")[1])
101 localSection = (
"local"+section.split(
":" )[0].
title())
102 if self.has_section( localSection ):
104 result[option] = self.get( localSection, option )
105 except ConfigParser.NoOptionError
as option:
106 msg = (
"%s. This option is mandatory."
109 "section '"+globalSection+
"' or", 1)))
112 msg = (
"%s. This option is mandatory."
113 %(str(globalSectionError).
replace(
":",
"", 1)))
120 for section
in self.sections():
121 if "alignment:" in section:
122 alignments.append(
Alignment( section.split(
"alignment:" )[1],
128 for section
in self.sections():
129 if "compare:" in section:
131 knownSimpleOptions = [
"levels",
"dbOutput",
"moduleList",
"modulesToPlot",
"useDefaultRange",
"plotOnlyGlobal",
"plotPng",
132 "dx_min",
"dx_max",
"dy_min",
"dy_max",
"dz_min",
"dz_max",
"dr_min",
"dr_max",
"rdphi_min",
"rdphi_max",
133 "dalpha_min",
"dalpha_max",
"dbeta_min",
"dbeta_max",
"dgamma_min",
"dgamma_max",
134 "jobmode",
"3DSubdetector1",
"3Dubdetector2",
"3DTranslationalScaleFactor"])
135 levels = self.get( section,
"levels" )
136 dbOutput = self.get( section,
"dbOutput" )
137 compares[section.split(
":")[1]] = ( levels, dbOutput )
142 "jobmode":
"interactive",
143 "datadir":os.getcwd(),
144 "logdir":os.getcwd(),
148 self.
checkInput(
"general", knownSimpleOptions = defaults.keys())
150 internal_section =
"internals"
151 if not self.has_section(internal_section):
152 self.add_section(internal_section)
153 if not self.has_option(internal_section,
"workdir"):
154 self.set(internal_section,
"workdir",
"/tmp/$USER")
155 general[
"workdir"] = self.get(internal_section,
"workdir")
158 def checkInput(self, section, knownSimpleOptions=[], knownKeywords=[],
161 Method which checks, if the given options in `section` are in the
162 list of `knownSimpleOptions` or match an item of `knownKeywords`.
163 This is basically a check for typos and wrong parameters.
166 - `section`: Section of a configuration file
167 - `knownSimpleOptions`: List of allowed simple options in `section`.
168 - `knownKeywords`: List of allowed keywords in `section`.
171 for option
in self.options( section ):
172 if option
in knownSimpleOptions:
174 elif option.split()[0]
in knownKeywords:
176 elif option
in ignoreOptions:
177 print (
"Ignoring option '%s' in section '[%s]'."
180 msg = (
"Invalid or unknown parameter '%s' in section '%s'!"
184 def items(self, section, raw=False, vars=None):
185 if section ==
"validation":
187 raise NotImplementedError(
"'raw' and 'vars' do not work for betterConfigParser.items()!")
188 items = self._sections[
"validation"].
items()
191 return ConfigParser.ConfigParser.items(self, section, raw, vars)
194 """Write an .ini-format representation of the configuration state."""
195 for section
in self._sections:
196 fp.write(
"[%s]\n" % section)
197 for (key, value)
in self._sections[section].
items():
198 if key ==
"__name__" or not isinstance(value, (str, unicode)):
200 if value
is not None:
201 key =
" = ".
join((key, str(value).
replace(
'\n',
'\n\t')))
202 fp.write(
"%s\n" % (key))
209 OPTCRE_VALIDATION = re.compile(
211 r'(?P<preexisting>preexisting)?'
213 r'\s*(?(preexisting)|'
static std::string join(char **cmd)