blob: 16d18d25eb17114f690d7b124a6b20d38b651deb [file] [log] [blame]
Guido van Rossum3d209861997-12-09 16:10:31 +00001"""Configuration file parser.
2
3A setup file consists of sections, lead by a "[section]" header,
4and followed by "name: value" entries, with continuations and such in
Barry Warsawbfa3f6b1998-07-01 20:41:12 +00005the style of RFC 822.
Guido van Rossum3d209861997-12-09 16:10:31 +00006
Barry Warsawbfa3f6b1998-07-01 20:41:12 +00007The option values can contain format strings which refer to other values in
8the same section, or values in a special [DEFAULT] section.
9
Guido van Rossum3d209861997-12-09 16:10:31 +000010For example:
11
12 something: %(dir)s/whatever
13
14would resolve the "%(dir)s" to the value of dir. All reference
15expansions are done late, on demand.
16
17Intrinsic defaults can be specified by passing them into the
18ConfigParser constructor as a dictionary.
19
20class:
21
22ConfigParser -- responsible for for parsing a list of
23 configuration files, and managing the parsed database.
24
25 methods:
26
Barry Warsawf09f6a51999-01-26 22:01:37 +000027 __init__(defaults=None)
28 create the parser and specify a dictionary of intrinsic defaults. The
29 keys must be strings, the values must be appropriate for %()s string
30 interpolation. Note that `__name__' is always an intrinsic default;
31 it's value is the section's name.
Guido van Rossum3d209861997-12-09 16:10:31 +000032
Barry Warsawf09f6a51999-01-26 22:01:37 +000033 sections()
34 return all the configuration section names, sans DEFAULT
Guido van Rossum3d209861997-12-09 16:10:31 +000035
Guido van Rossuma5a24b71999-10-04 19:58:22 +000036 has_section(section)
37 return whether the given section exists
38
Eric S. Raymond649685a2000-07-14 14:28:22 +000039 has_option(section, option)
40 return whether the given option exists in the given section
41
Barry Warsawf09f6a51999-01-26 22:01:37 +000042 options(section)
43 return list of configuration options for the named section
Guido van Rossum3d209861997-12-09 16:10:31 +000044
Guido van Rossuma5a24b71999-10-04 19:58:22 +000045 has_option(section, option)
46 return whether the given section has the given option
47
Guido van Rossumc0780ac1999-01-30 04:35:47 +000048 read(filenames)
Guido van Rossum6a8d84b1999-10-04 18:57:27 +000049 read and parse the list of named configuration files, given by
50 name. A single filename is also allowed. Non-existing files
51 are ignored.
52
53 readfp(fp, filename=None)
54 read and parse one configuration file, given as a file object.
55 The filename defaults to fp.name; it is only used in error
Barry Warsaw25394511999-10-12 16:12:48 +000056 messages (if fp has no `name' attribute, the string `<???>' is used).
Guido van Rossum3d209861997-12-09 16:10:31 +000057
Barry Warsawf09f6a51999-01-26 22:01:37 +000058 get(section, option, raw=0, vars=None)
59 return a string value for the named option. All % interpolations are
60 expanded in the return values, based on the defaults passed into the
61 constructor and the DEFAULT section. Additional substitutions may be
62 provided using the `vars' argument, which must be a dictionary whose
63 contents override any pre-existing defaults.
Guido van Rossum3d209861997-12-09 16:10:31 +000064
Barry Warsawf09f6a51999-01-26 22:01:37 +000065 getint(section, options)
66 like get(), but convert value to an integer
Guido van Rossum3d209861997-12-09 16:10:31 +000067
Barry Warsawf09f6a51999-01-26 22:01:37 +000068 getfloat(section, options)
69 like get(), but convert value to a float
Guido van Rossum3d209861997-12-09 16:10:31 +000070
Barry Warsawf09f6a51999-01-26 22:01:37 +000071 getboolean(section, options)
72 like get(), but convert value to a boolean (currently defined as 0 or
73 1, only)
Eric S. Raymond649685a2000-07-14 14:28:22 +000074
75 remove_section(section)
76 remove the given file section and all its options
77
78 remove_option(section, option)
79 remove the given option from the given section
80
81 set(section, option, value)
82 set the given option
83
84 write(fp)
85 write the configuration state in .ini format
Guido van Rossum3d209861997-12-09 16:10:31 +000086"""
87
88import sys
89import string
Barry Warsawbfa3f6b1998-07-01 20:41:12 +000090import re
Guido van Rossum3d209861997-12-09 16:10:31 +000091
92DEFAULTSECT = "DEFAULT"
93
94
95
96# exception classes
97class Error:
98 def __init__(self, msg=''):
Barry Warsawbfa3f6b1998-07-01 20:41:12 +000099 self._msg = msg
Guido van Rossum3d209861997-12-09 16:10:31 +0000100 def __repr__(self):
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000101 return self._msg
Guido van Rossum3d209861997-12-09 16:10:31 +0000102
103class NoSectionError(Error):
104 def __init__(self, section):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000105 Error.__init__(self, 'No section: %s' % section)
106 self.section = section
Guido van Rossum3d209861997-12-09 16:10:31 +0000107
108class DuplicateSectionError(Error):
109 def __init__(self, section):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000110 Error.__init__(self, "Section %s already exists" % section)
111 self.section = section
Guido van Rossum3d209861997-12-09 16:10:31 +0000112
113class NoOptionError(Error):
114 def __init__(self, option, section):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000115 Error.__init__(self, "No option `%s' in section: %s" %
116 (option, section))
117 self.option = option
118 self.section = section
Guido van Rossum3d209861997-12-09 16:10:31 +0000119
120class InterpolationError(Error):
Barry Warsaw64462121998-08-06 18:48:41 +0000121 def __init__(self, reference, option, section, rawval):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000122 Error.__init__(self,
Barry Warsaw64462121998-08-06 18:48:41 +0000123 "Bad value substitution:\n"
124 "\tsection: [%s]\n"
125 "\toption : %s\n"
126 "\tkey : %s\n"
127 "\trawval : %s\n"
128 % (section, option, reference, rawval))
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000129 self.reference = reference
130 self.option = option
131 self.section = section
Guido van Rossum3d209861997-12-09 16:10:31 +0000132
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000133class MissingSectionHeaderError(Error):
134 def __init__(self, filename, lineno, line):
135 Error.__init__(
136 self,
137 'File contains no section headers.\nfile: %s, line: %d\n%s' %
138 (filename, lineno, line))
139 self.filename = filename
140 self.lineno = lineno
141 self.line = line
142
143class ParsingError(Error):
144 def __init__(self, filename):
145 Error.__init__(self, 'File contains parsing errors: %s' % filename)
146 self.filename = filename
147 self.errors = []
148
149 def append(self, lineno, line):
150 self.errors.append((lineno, line))
151 self._msg = self._msg + '\n\t[line %2d]: %s' % (lineno, line)
152
Guido van Rossum3d209861997-12-09 16:10:31 +0000153
154
155class ConfigParser:
156 def __init__(self, defaults=None):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000157 self.__sections = {}
158 if defaults is None:
159 self.__defaults = {}
160 else:
161 self.__defaults = defaults
Guido van Rossum3d209861997-12-09 16:10:31 +0000162
163 def defaults(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000164 return self.__defaults
Guido van Rossum3d209861997-12-09 16:10:31 +0000165
166 def sections(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000167 """Return a list of section names, excluding [DEFAULT]"""
168 # self.__sections will never have [DEFAULT] in it
169 return self.__sections.keys()
Guido van Rossum3d209861997-12-09 16:10:31 +0000170
171 def add_section(self, section):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000172 """Create a new section in the configuration.
Guido van Rossum3d209861997-12-09 16:10:31 +0000173
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000174 Raise DuplicateSectionError if a section by the specified name
175 already exists.
176 """
177 if self.__sections.has_key(section):
178 raise DuplicateSectionError(section)
179 self.__sections[section] = {}
Guido van Rossum3d209861997-12-09 16:10:31 +0000180
181 def has_section(self, section):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000182 """Indicate whether the named section is present in the configuration.
Guido van Rossum3d209861997-12-09 16:10:31 +0000183
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000184 The DEFAULT section is not acknowledged.
185 """
186 return self.__sections.has_key(section)
Guido van Rossum3d209861997-12-09 16:10:31 +0000187
188 def options(self, section):
Guido van Rossuma5a24b71999-10-04 19:58:22 +0000189 """Return a list of option names for the given section name."""
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000190 try:
191 opts = self.__sections[section].copy()
192 except KeyError:
193 raise NoSectionError(section)
194 opts.update(self.__defaults)
195 return opts.keys()
Guido van Rossum3d209861997-12-09 16:10:31 +0000196
Guido van Rossuma5a24b71999-10-04 19:58:22 +0000197 def has_option(self, section, option):
198 """Return whether the given section has the given option."""
199 try:
200 opts = self.__sections[section]
201 except KeyError:
202 raise NoSectionError(section)
203 return opts.has_key(option)
204
Guido van Rossum3d209861997-12-09 16:10:31 +0000205 def read(self, filenames):
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000206 """Read and parse a filename or a list of filenames.
207
208 Files that cannot be opened are silently ignored; this is
Barry Warsaw25394511999-10-12 16:12:48 +0000209 designed so that you can specify a list of potential
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000210 configuration file locations (e.g. current directory, user's
211 home directory, systemwide directory), and all existing
212 configuration files in the list will be read. A single
213 filename may also be given.
214 """
Fred Drakefd4114e2000-05-09 14:46:40 +0000215 if type(filenames) in [type(''), type(u'')]:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000216 filenames = [filenames]
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000217 for filename in filenames:
218 try:
219 fp = open(filename)
220 except IOError:
221 continue
222 self.__read(fp, filename)
Fred Drake2438a481999-10-04 18:11:56 +0000223 fp.close()
Guido van Rossum3d209861997-12-09 16:10:31 +0000224
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000225 def readfp(self, fp, filename=None):
226 """Like read() but the argument must be a file-like object.
227
228 The `fp' argument must have a `readline' method. Optional
229 second argument is the `filename', which if not given, is
230 taken from fp.name. If fp has no `name' attribute, `<???>' is
231 used.
232
233 """
234 if filename is None:
235 try:
236 filename = fp.name
237 except AttributeError:
238 filename = '<???>'
239 self.__read(fp, filename)
240
Guido van Rossume6506e71999-01-26 19:29:25 +0000241 def get(self, section, option, raw=0, vars=None):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000242 """Get an option value for a given section.
Guido van Rossum3d209861997-12-09 16:10:31 +0000243
Barry Warsawf09f6a51999-01-26 22:01:37 +0000244 All % interpolations are expanded in the return values, based on the
245 defaults passed into the constructor, unless the optional argument
246 `raw' is true. Additional substitutions may be provided using the
247 `vars' argument, which must be a dictionary whose contents overrides
248 any pre-existing defaults.
Guido van Rossum3d209861997-12-09 16:10:31 +0000249
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000250 The section DEFAULT is special.
251 """
252 try:
253 sectdict = self.__sections[section].copy()
254 except KeyError:
255 if section == DEFAULTSECT:
256 sectdict = {}
257 else:
258 raise NoSectionError(section)
259 d = self.__defaults.copy()
260 d.update(sectdict)
Guido van Rossume6506e71999-01-26 19:29:25 +0000261 # Update with the entry specific variables
262 if vars:
263 d.update(vars)
Guido van Rossum9e480ad1999-06-17 18:41:42 +0000264 option = self.optionxform(option)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000265 try:
266 rawval = d[option]
267 except KeyError:
268 raise NoOptionError(option, section)
269 # do the string interpolation
270 if raw:
271 return rawval
Guido van Rossum3d209861997-12-09 16:10:31 +0000272
Guido van Rossume6506e71999-01-26 19:29:25 +0000273 value = rawval # Make it a pretty variable name
Guido van Rossum72ce8581999-02-12 14:13:10 +0000274 depth = 0
275 while depth < 10: # Loop through this until it's done
276 depth = depth + 1
Guido van Rossuma5a24b71999-10-04 19:58:22 +0000277 if string.find(value, "%(") >= 0:
Guido van Rossume6506e71999-01-26 19:29:25 +0000278 try:
279 value = value % d
280 except KeyError, key:
281 raise InterpolationError(key, option, section, rawval)
282 else:
283 return value
284
Guido van Rossum3d209861997-12-09 16:10:31 +0000285 def __get(self, section, conv, option):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000286 return conv(self.get(section, option))
Guido van Rossum3d209861997-12-09 16:10:31 +0000287
288 def getint(self, section, option):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000289 return self.__get(section, string.atoi, option)
Guido van Rossum3d209861997-12-09 16:10:31 +0000290
291 def getfloat(self, section, option):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000292 return self.__get(section, string.atof, option)
Guido van Rossum3d209861997-12-09 16:10:31 +0000293
294 def getboolean(self, section, option):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000295 v = self.get(section, option)
296 val = string.atoi(v)
297 if val not in (0, 1):
298 raise ValueError, 'Not a boolean: %s' % v
299 return val
Guido van Rossum3d209861997-12-09 16:10:31 +0000300
Guido van Rossum9e480ad1999-06-17 18:41:42 +0000301 def optionxform(self, optionstr):
302 return string.lower(optionstr)
303
Eric S. Raymond417c4892000-07-10 18:11:00 +0000304 def has_option(self, section, option):
305 """Check for the existence of a given option in a given section."""
306 if not section or section == "DEFAULT":
307 return self.__defaults.has_key(option)
308 elif not self.has_section(section):
309 return 0
310 else:
311 return self.__sections[section].has_key(option)
312
313 def set(self, section, option, value):
314 """Set an option."""
315 if not section or section == "DEFAULT":
316 sectdict = self.__defaults
317 else:
318 try:
319 sectdict = self.__sections[section]
320 except KeyError:
321 raise NoSectionError(section)
322 sectdict[option] = value
323
324 def write(self, fp):
325 """Write an .ini-format representation of the configuration state."""
326 if self.__defaults:
327 fp.write("[DEFAULT]\n")
Eric S. Raymond649685a2000-07-14 14:28:22 +0000328 for (key, value) in self.__defaults.items():
329 fp.write("%s = %s\n" % (key, value))
Eric S. Raymond417c4892000-07-10 18:11:00 +0000330 fp.write("\n")
331 for section in self.sections():
332 fp.write("[" + section + "]\n")
333 sectdict = self.__sections[section]
Eric S. Raymond649685a2000-07-14 14:28:22 +0000334 for (key, value) in sectdict.items():
Eric S. Raymond417c4892000-07-10 18:11:00 +0000335 if key == "__name__":
336 continue
Eric S. Raymond649685a2000-07-14 14:28:22 +0000337 fp.write("%s = %s\n" % (key, value))
Eric S. Raymond417c4892000-07-10 18:11:00 +0000338 fp.write("\n")
339
Thomas Woutersff4df6d2000-07-21 05:19:59 +0000340 def remove_option(self, section, option):
Eric S. Raymond649685a2000-07-14 14:28:22 +0000341 """Remove an option."""
342 if not section or section == "DEFAULT":
343 sectdict = self.__defaults
344 else:
345 try:
346 sectdict = self.__sections[section]
347 except KeyError:
348 raise NoSectionError(section)
349 existed = sectdict.has_key(key)
350 if existed:
351 del sectdict[key]
352 return existed
353
Thomas Woutersff4df6d2000-07-21 05:19:59 +0000354 def remove_section(self, section):
Eric S. Raymond649685a2000-07-14 14:28:22 +0000355 """Remove a file section."""
356 if self.__sections.has_key(section):
357 del self.__sections[section]
358 return 1
359 else:
360 return 0
361
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000362 #
363 # Regular expressions for parsing section headers and options. Note a
364 # slight semantic change from the previous version, because of the use
365 # of \w, _ is allowed in section header names.
Guido van Rossum9e480ad1999-06-17 18:41:42 +0000366 SECTCRE = re.compile(
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000367 r'\[' # [
Fred Drake1ab41fc2000-02-28 23:23:55 +0000368 r'(?P<header>[-\w_.*,(){}]+)' # a lot of stuff found by IvL
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000369 r'\]' # ]
370 )
Guido van Rossum9e480ad1999-06-17 18:41:42 +0000371 OPTCRE = re.compile(
Fred Drake1ab41fc2000-02-28 23:23:55 +0000372 r'(?P<option>[-\w_.*,(){}]+)' # a lot of stuff found by IvL
Fred Drakec517b9b2000-02-28 20:59:03 +0000373 r'[ \t]*(?P<vi>[:=])[ \t]*' # any number of space/tab,
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000374 # followed by separator
375 # (either : or =), followed
376 # by any # space/tab
377 r'(?P<value>.*)$' # everything up to eol
378 )
379
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000380 def __read(self, fp, fpname):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000381 """Parse a sectioned setup file.
Guido van Rossum3d209861997-12-09 16:10:31 +0000382
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000383 The sections in setup file contains a title line at the top,
384 indicated by a name in square brackets (`[]'), plus key/value
385 options lines, indicated by `name: value' format lines.
386 Continuation are represented by an embedded newline then
387 leading whitespace. Blank lines, lines beginning with a '#',
388 and just about everything else is ignored.
389 """
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000390 cursect = None # None, or a dictionary
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000391 optname = None
392 lineno = 0
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000393 e = None # None, or an exception
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000394 while 1:
395 line = fp.readline()
396 if not line:
397 break
398 lineno = lineno + 1
399 # comment or blank line?
400 if string.strip(line) == '' or line[0] in '#;':
401 continue
402 if string.lower(string.split(line)[0]) == 'rem' \
Fred Drakec517b9b2000-02-28 20:59:03 +0000403 and line[0] in "rR": # no leading whitespace
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000404 continue
405 # continuation line?
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000406 if line[0] in ' \t' and cursect is not None and optname:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000407 value = string.strip(line)
408 if value:
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000409 cursect[optname] = cursect[optname] + '\n ' + value
410 # a section header or option header?
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000411 else:
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000412 # is it a section header?
Guido van Rossum9e480ad1999-06-17 18:41:42 +0000413 mo = self.SECTCRE.match(line)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000414 if mo:
415 sectname = mo.group('header')
416 if self.__sections.has_key(sectname):
417 cursect = self.__sections[sectname]
418 elif sectname == DEFAULTSECT:
419 cursect = self.__defaults
420 else:
Barry Warsaw64462121998-08-06 18:48:41 +0000421 cursect = {'__name__': sectname}
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000422 self.__sections[sectname] = cursect
423 # So sections can't start with a continuation line
424 optname = None
425 # no section header in the file?
426 elif cursect is None:
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000427 raise MissingSectionHeaderError(fpname, lineno, `line`)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000428 # an option line?
429 else:
Guido van Rossum9e480ad1999-06-17 18:41:42 +0000430 mo = self.OPTCRE.match(line)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000431 if mo:
Fred Drakec517b9b2000-02-28 20:59:03 +0000432 optname, vi, optval = mo.group('option', 'vi', 'value')
Jeremy Hylton820314e2000-03-03 20:43:57 +0000433 if vi in ('=', ':') and ';' in optval:
Fred Drakec517b9b2000-02-28 20:59:03 +0000434 # ';' is a comment delimiter only if it follows
435 # a spacing character
436 pos = string.find(optval, ';')
437 if pos and optval[pos-1] in string.whitespace:
438 optval = optval[:pos]
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000439 optval = string.strip(optval)
440 # allow empty values
441 if optval == '""':
442 optval = ''
Guido van Rossum41267362000-09-25 14:42:33 +0000443 cursect[self.optionxform(optname)] = optval
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000444 else:
445 # a non-fatal parsing error occurred. set up the
446 # exception but keep going. the exception will be
447 # raised at the end of the file and will contain a
448 # list of all bogus lines
449 if not e:
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000450 e = ParsingError(fpname)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000451 e.append(lineno, `line`)
452 # if any parsing errors occurred, raise an exception
453 if e:
454 raise e