blob: 80f6aeddd2f08c4396ce10e6f71a474a46987d01 [file] [log] [blame]
Guido van Rossum3d209861997-12-09 16:10:31 +00001"""Configuration file parser.
2
Georg Brandl96a60ae2010-07-28 13:13:46 +00003A configuration file consists of sections, lead by a "[section]" header,
Guido van Rossum3d209861997-12-09 16:10:31 +00004and 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
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +000022ConfigParser -- responsible for parsing a list of
Guido van Rossum3d209861997-12-09 16:10:31 +000023 configuration files, and managing the parsed database.
24
25 methods:
26
Fred Drakecc645b92010-09-04 04:35:34 +000027 __init__(defaults=None, dict_type=_default_dict, allow_no_value=False,
28 delimiters=('=', ':'), comment_prefixes=_COMPATIBLE,
29 strict=False, empty_lines_in_values=True):
Georg Brandl96a60ae2010-07-28 13:13:46 +000030 Create the parser. When `defaults' is given, it is initialized into the
31 dictionary or intrinsic defaults. The keys must be strings, the values
Fred Drakea4923622010-08-09 12:52:45 +000032 must be appropriate for %()s string interpolation. Note that `__name__'
Georg Brandl96a60ae2010-07-28 13:13:46 +000033 is always an intrinsic default; its value is the section's name.
34
35 When `dict_type' is given, it will be used to create the dictionary
36 objects for the list of sections, for the options within a section, and
37 for the default values.
38
39 When `delimiters' is given, it will be used as the set of substrings
40 that divide keys from values.
41
42 When `comment_prefixes' is given, it will be used as the set of
43 substrings that prefix comments in a line.
44
Fred Drakea4923622010-08-09 12:52:45 +000045 When `strict` is True, the parser won't allow for any section or option
46 duplicates while reading from a single source (file, string or
47 dictionary). Default is False.
48
Georg Brandl96a60ae2010-07-28 13:13:46 +000049 When `empty_lines_in_values' is False (default: True), each empty line
50 marks the end of an option. Otherwise, internal empty lines of
51 a multiline option are kept as part of the value.
52
53 When `allow_no_value' is True (default: False), options without
54 values are accepted; the value presented for these is None.
Guido van Rossum3d209861997-12-09 16:10:31 +000055
Barry Warsawf09f6a51999-01-26 22:01:37 +000056 sections()
Georg Brandl96a60ae2010-07-28 13:13:46 +000057 Return all the configuration section names, sans DEFAULT.
Guido van Rossum3d209861997-12-09 16:10:31 +000058
Guido van Rossuma5a24b71999-10-04 19:58:22 +000059 has_section(section)
Georg Brandl96a60ae2010-07-28 13:13:46 +000060 Return whether the given section exists.
Guido van Rossuma5a24b71999-10-04 19:58:22 +000061
Eric S. Raymond649685a2000-07-14 14:28:22 +000062 has_option(section, option)
Georg Brandl96a60ae2010-07-28 13:13:46 +000063 Return whether the given option exists in the given section.
Eric S. Raymond649685a2000-07-14 14:28:22 +000064
Barry Warsawf09f6a51999-01-26 22:01:37 +000065 options(section)
Georg Brandl96a60ae2010-07-28 13:13:46 +000066 Return list of configuration options for the named section.
Guido van Rossum3d209861997-12-09 16:10:31 +000067
Georg Brandl8dcaa732010-07-29 12:17:40 +000068 read(filenames, encoding=None)
Georg Brandl96a60ae2010-07-28 13:13:46 +000069 Read and parse the list of named configuration files, given by
Guido van Rossum6a8d84b1999-10-04 18:57:27 +000070 name. A single filename is also allowed. Non-existing files
Fred Drake82903142004-05-18 04:24:02 +000071 are ignored. Return list of successfully read files.
Guido van Rossum6a8d84b1999-10-04 18:57:27 +000072
Fred Drakea4923622010-08-09 12:52:45 +000073 read_file(f, filename=None)
Georg Brandl96a60ae2010-07-28 13:13:46 +000074 Read and parse one configuration file, given as a file object.
Fred Drakea4923622010-08-09 12:52:45 +000075 The filename defaults to f.name; it is only used in error
76 messages (if f has no `name' attribute, the string `<???>' is used).
77
78 read_string(string)
79 Read configuration from a given string.
80
81 read_dict(dictionary)
82 Read configuration from a dictionary. Keys are section names,
83 values are dictionaries with keys and values that should be present
84 in the section. If the used dictionary type preserves order, sections
Fred Drakecc645b92010-09-04 04:35:34 +000085 and their keys will be added in order. Values are automatically
86 converted to strings.
Guido van Rossum3d209861997-12-09 16:10:31 +000087
Łukasz Langa26d513c2010-11-10 18:57:39 +000088 get(section, option, raw=False, vars=None, fallback=_UNSET)
Georg Brandl96a60ae2010-07-28 13:13:46 +000089 Return a string value for the named option. All % interpolations are
Barry Warsawf09f6a51999-01-26 22:01:37 +000090 expanded in the return values, based on the defaults passed into the
91 constructor and the DEFAULT section. Additional substitutions may be
92 provided using the `vars' argument, which must be a dictionary whose
Fred Drakecc645b92010-09-04 04:35:34 +000093 contents override any pre-existing defaults. If `option' is a key in
94 `vars', the value from `vars' is used.
Guido van Rossum3d209861997-12-09 16:10:31 +000095
Łukasz Langa26d513c2010-11-10 18:57:39 +000096 getint(section, options, raw=False, vars=None, fallback=_UNSET)
Georg Brandl96a60ae2010-07-28 13:13:46 +000097 Like get(), but convert value to an integer.
Guido van Rossum3d209861997-12-09 16:10:31 +000098
Łukasz Langa26d513c2010-11-10 18:57:39 +000099 getfloat(section, options, raw=False, vars=None, fallback=_UNSET)
Georg Brandl96a60ae2010-07-28 13:13:46 +0000100 Like get(), but convert value to a float.
Guido van Rossum3d209861997-12-09 16:10:31 +0000101
Łukasz Langa26d513c2010-11-10 18:57:39 +0000102 getboolean(section, options, raw=False, vars=None, fallback=_UNSET)
Georg Brandl96a60ae2010-07-28 13:13:46 +0000103 Like get(), but convert value to a boolean (currently case
Neal Norwitzf680cc42002-12-17 01:56:47 +0000104 insensitively defined as 0, false, no, off for False, and 1, true,
105 yes, on for True). Returns False or True.
Eric S. Raymond649685a2000-07-14 14:28:22 +0000106
Neal Norwitzf680cc42002-12-17 01:56:47 +0000107 items(section, raw=False, vars=None)
Georg Brandl96a60ae2010-07-28 13:13:46 +0000108 Return a list of tuples with (name, value) for each option
Fred Drake2ca041f2002-09-27 15:49:56 +0000109 in the section.
110
Eric S. Raymond649685a2000-07-14 14:28:22 +0000111 remove_section(section)
Georg Brandl96a60ae2010-07-28 13:13:46 +0000112 Remove the given file section and all its options.
Eric S. Raymond649685a2000-07-14 14:28:22 +0000113
114 remove_option(section, option)
Georg Brandl96a60ae2010-07-28 13:13:46 +0000115 Remove the given option from the given section.
Eric S. Raymond649685a2000-07-14 14:28:22 +0000116
117 set(section, option, value)
Georg Brandl96a60ae2010-07-28 13:13:46 +0000118 Set the given option.
Eric S. Raymond649685a2000-07-14 14:28:22 +0000119
Georg Brandl96a60ae2010-07-28 13:13:46 +0000120 write(fp, space_around_delimiters=True)
121 Write the configuration state in .ini format. If
122 `space_around_delimiters' is True (the default), delimiters
123 between keys and values are surrounded by spaces.
Guido van Rossum3d209861997-12-09 16:10:31 +0000124"""
125
Łukasz Langa26d513c2010-11-10 18:57:39 +0000126from collections import MutableMapping, OrderedDict as _default_dict
127import functools
Fred Drakea4923622010-08-09 12:52:45 +0000128import io
Łukasz Langa26d513c2010-11-10 18:57:39 +0000129import itertools
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000130import re
Georg Brandl96a60ae2010-07-28 13:13:46 +0000131import sys
Fred Drakea4923622010-08-09 12:52:45 +0000132import warnings
Guido van Rossum3d209861997-12-09 16:10:31 +0000133
Fred Drakea4923622010-08-09 12:52:45 +0000134__all__ = ["NoSectionError", "DuplicateOptionError", "DuplicateSectionError",
135 "NoOptionError", "InterpolationError", "InterpolationDepthError",
Fred Drake8d5dd982002-12-30 23:51:45 +0000136 "InterpolationSyntaxError", "ParsingError",
David Goodger1cbf2062004-10-03 15:55:09 +0000137 "MissingSectionHeaderError",
138 "ConfigParser", "SafeConfigParser", "RawConfigParser",
Fred Drakec2ff9052002-09-27 15:33:11 +0000139 "DEFAULTSECT", "MAX_INTERPOLATION_DEPTH"]
Skip Montanaroe99d5ea2001-01-20 19:54:20 +0000140
Guido van Rossum3d209861997-12-09 16:10:31 +0000141DEFAULTSECT = "DEFAULT"
142
Fred Drake2a37f9f2000-09-27 22:43:54 +0000143MAX_INTERPOLATION_DEPTH = 10
144
Guido van Rossum3d209861997-12-09 16:10:31 +0000145
Tim Peters88869f92001-01-14 23:36:06 +0000146
Guido van Rossum3d209861997-12-09 16:10:31 +0000147# exception classes
Fred Drake7c1e5ad2000-12-11 18:13:19 +0000148class Error(Exception):
Fred Drake8d5dd982002-12-30 23:51:45 +0000149 """Base class for ConfigParser exceptions."""
150
Guido van Rossum360e4b82007-05-14 22:51:27 +0000151 def _get_message(self):
152 """Getter for 'message'; needed only to override deprecation in
Georg Brandl96a60ae2010-07-28 13:13:46 +0000153 BaseException.
154 """
Guido van Rossum360e4b82007-05-14 22:51:27 +0000155 return self.__message
156
157 def _set_message(self, value):
158 """Setter for 'message'; needed only to override deprecation in
Georg Brandl96a60ae2010-07-28 13:13:46 +0000159 BaseException.
160 """
Guido van Rossum360e4b82007-05-14 22:51:27 +0000161 self.__message = value
162
163 # BaseException.message has been deprecated since Python 2.6. To prevent
Fred Drakea4923622010-08-09 12:52:45 +0000164 # DeprecationWarning from popping up over this pre-existing attribute, use
165 # a new property that takes lookup precedence.
Guido van Rossum360e4b82007-05-14 22:51:27 +0000166 message = property(_get_message, _set_message)
167
Guido van Rossum3d209861997-12-09 16:10:31 +0000168 def __init__(self, msg=''):
Fred Drakee2c64912002-12-31 17:23:27 +0000169 self.message = msg
Fred Drake7c1e5ad2000-12-11 18:13:19 +0000170 Exception.__init__(self, msg)
Fred Drake8d5dd982002-12-30 23:51:45 +0000171
Guido van Rossum3d209861997-12-09 16:10:31 +0000172 def __repr__(self):
Fred Drakee2c64912002-12-31 17:23:27 +0000173 return self.message
Fred Drake8d5dd982002-12-30 23:51:45 +0000174
Fred Drake7c1e5ad2000-12-11 18:13:19 +0000175 __str__ = __repr__
Guido van Rossum3d209861997-12-09 16:10:31 +0000176
Georg Brandl96a60ae2010-07-28 13:13:46 +0000177
Guido van Rossum3d209861997-12-09 16:10:31 +0000178class NoSectionError(Error):
Fred Drake8d5dd982002-12-30 23:51:45 +0000179 """Raised when no section matches a requested option."""
180
Guido van Rossum3d209861997-12-09 16:10:31 +0000181 def __init__(self, section):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000182 Error.__init__(self, 'No section: %r' % (section,))
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000183 self.section = section
Michael Foordbd6c0792010-07-25 23:09:25 +0000184 self.args = (section, )
Guido van Rossum3d209861997-12-09 16:10:31 +0000185
Georg Brandl96a60ae2010-07-28 13:13:46 +0000186
Guido van Rossum3d209861997-12-09 16:10:31 +0000187class DuplicateSectionError(Error):
Fred Drakea4923622010-08-09 12:52:45 +0000188 """Raised when a section is repeated in an input source.
Fred Drake8d5dd982002-12-30 23:51:45 +0000189
Fred Drakea4923622010-08-09 12:52:45 +0000190 Possible repetitions that raise this exception are: multiple creation
191 using the API or in strict parsers when a section is found more than once
192 in a single input file, string or dictionary.
193 """
194
195 def __init__(self, section, source=None, lineno=None):
196 msg = [repr(section), " already exists"]
197 if source is not None:
198 message = ["While reading from ", source]
199 if lineno is not None:
200 message.append(" [line {0:2d}]".format(lineno))
201 message.append(": section ")
202 message.extend(msg)
203 msg = message
204 else:
205 msg.insert(0, "Section ")
206 Error.__init__(self, "".join(msg))
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000207 self.section = section
Fred Drakea4923622010-08-09 12:52:45 +0000208 self.source = source
209 self.lineno = lineno
210 self.args = (section, source, lineno)
211
212
213class DuplicateOptionError(Error):
214 """Raised by strict parsers when an option is repeated in an input source.
215
216 Current implementation raises this exception only when an option is found
217 more than once in a single file, string or dictionary.
218 """
219
220 def __init__(self, section, option, source=None, lineno=None):
221 msg = [repr(option), " in section ", repr(section),
222 " already exists"]
223 if source is not None:
224 message = ["While reading from ", source]
225 if lineno is not None:
226 message.append(" [line {0:2d}]".format(lineno))
227 message.append(": option ")
228 message.extend(msg)
229 msg = message
230 else:
231 msg.insert(0, "Option ")
232 Error.__init__(self, "".join(msg))
233 self.section = section
234 self.option = option
235 self.source = source
236 self.lineno = lineno
237 self.args = (section, option, source, lineno)
Guido van Rossum3d209861997-12-09 16:10:31 +0000238
Georg Brandl96a60ae2010-07-28 13:13:46 +0000239
Guido van Rossum3d209861997-12-09 16:10:31 +0000240class NoOptionError(Error):
Fred Drake8d5dd982002-12-30 23:51:45 +0000241 """A requested option was not found."""
242
Guido van Rossum3d209861997-12-09 16:10:31 +0000243 def __init__(self, option, section):
Fred Drakee2c64912002-12-31 17:23:27 +0000244 Error.__init__(self, "No option %r in section: %r" %
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000245 (option, section))
246 self.option = option
247 self.section = section
Michael Foordbd6c0792010-07-25 23:09:25 +0000248 self.args = (option, section)
Guido van Rossum3d209861997-12-09 16:10:31 +0000249
Georg Brandl96a60ae2010-07-28 13:13:46 +0000250
Guido van Rossum3d209861997-12-09 16:10:31 +0000251class InterpolationError(Error):
Fred Drakee2c64912002-12-31 17:23:27 +0000252 """Base class for interpolation-related exceptions."""
Fred Drake8d5dd982002-12-30 23:51:45 +0000253
Fred Drakee2c64912002-12-31 17:23:27 +0000254 def __init__(self, option, section, msg):
255 Error.__init__(self, msg)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000256 self.option = option
257 self.section = section
Michael Foordbd6c0792010-07-25 23:09:25 +0000258 self.args = (option, section, msg)
Guido van Rossum3d209861997-12-09 16:10:31 +0000259
Georg Brandl96a60ae2010-07-28 13:13:46 +0000260
Fred Drakee2c64912002-12-31 17:23:27 +0000261class InterpolationMissingOptionError(InterpolationError):
262 """A string substitution required a setting which was not available."""
263
264 def __init__(self, option, section, rawval, reference):
265 msg = ("Bad value substitution:\n"
266 "\tsection: [%s]\n"
267 "\toption : %s\n"
268 "\tkey : %s\n"
269 "\trawval : %s\n"
270 % (section, option, reference, rawval))
271 InterpolationError.__init__(self, option, section, msg)
272 self.reference = reference
Michael Foordbd6c0792010-07-25 23:09:25 +0000273 self.args = (option, section, rawval, reference)
Fred Drakee2c64912002-12-31 17:23:27 +0000274
Georg Brandl96a60ae2010-07-28 13:13:46 +0000275
Fred Drakee2c64912002-12-31 17:23:27 +0000276class InterpolationSyntaxError(InterpolationError):
Fred Drakea4923622010-08-09 12:52:45 +0000277 """Raised when the source text contains invalid syntax.
278
279 Current implementation raises this exception only for SafeConfigParser
280 instances when the source text into which substitutions are made
281 does not conform to the required syntax.
282 """
Neal Norwitzce1d9442002-12-30 23:38:47 +0000283
Georg Brandl96a60ae2010-07-28 13:13:46 +0000284
Fred Drakee2c64912002-12-31 17:23:27 +0000285class InterpolationDepthError(InterpolationError):
Fred Drake8d5dd982002-12-30 23:51:45 +0000286 """Raised when substitutions are nested too deeply."""
287
Fred Drake2a37f9f2000-09-27 22:43:54 +0000288 def __init__(self, option, section, rawval):
Fred Drakee2c64912002-12-31 17:23:27 +0000289 msg = ("Value interpolation too deeply recursive:\n"
290 "\tsection: [%s]\n"
291 "\toption : %s\n"
292 "\trawval : %s\n"
293 % (section, option, rawval))
294 InterpolationError.__init__(self, option, section, msg)
Michael Foordbd6c0792010-07-25 23:09:25 +0000295 self.args = (option, section, rawval)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000296
Georg Brandl96a60ae2010-07-28 13:13:46 +0000297
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000298class ParsingError(Error):
Fred Drake8d5dd982002-12-30 23:51:45 +0000299 """Raised when a configuration file does not follow legal syntax."""
300
Fred Drakea4923622010-08-09 12:52:45 +0000301 def __init__(self, source=None, filename=None):
302 # Exactly one of `source'/`filename' arguments has to be given.
303 # `filename' kept for compatibility.
304 if filename and source:
305 raise ValueError("Cannot specify both `filename' and `source'. "
306 "Use `source'.")
307 elif not filename and not source:
308 raise ValueError("Required argument `source' not given.")
309 elif filename:
310 source = filename
311 Error.__init__(self, 'Source contains parsing errors: %s' % source)
312 self.source = source
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000313 self.errors = []
Fred Drakea4923622010-08-09 12:52:45 +0000314 self.args = (source, )
315
316 @property
317 def filename(self):
318 """Deprecated, use `source'."""
319 warnings.warn(
320 "This 'filename' attribute will be removed in future versions. "
321 "Use 'source' instead.",
322 PendingDeprecationWarning, stacklevel=2
323 )
324 return self.source
325
326 @filename.setter
327 def filename(self, value):
328 """Deprecated, user `source'."""
329 warnings.warn(
330 "The 'filename' attribute will be removed in future versions. "
331 "Use 'source' instead.",
332 PendingDeprecationWarning, stacklevel=2
333 )
334 self.source = value
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000335
336 def append(self, lineno, line):
337 self.errors.append((lineno, line))
Fred Drakee2c64912002-12-31 17:23:27 +0000338 self.message += '\n\t[line %2d]: %s' % (lineno, line)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000339
Georg Brandl96a60ae2010-07-28 13:13:46 +0000340
Fred Drake2a37f9f2000-09-27 22:43:54 +0000341class MissingSectionHeaderError(ParsingError):
Fred Drake8d5dd982002-12-30 23:51:45 +0000342 """Raised when a key-value pair is found before any section header."""
343
Fred Drake2a37f9f2000-09-27 22:43:54 +0000344 def __init__(self, filename, lineno, line):
345 Error.__init__(
346 self,
Walter Dörwald70a6b492004-02-12 17:35:32 +0000347 'File contains no section headers.\nfile: %s, line: %d\n%r' %
Fred Drake2a37f9f2000-09-27 22:43:54 +0000348 (filename, lineno, line))
Fred Drakea4923622010-08-09 12:52:45 +0000349 self.source = filename
Fred Drake2a37f9f2000-09-27 22:43:54 +0000350 self.lineno = lineno
351 self.line = line
Michael Foordbd6c0792010-07-25 23:09:25 +0000352 self.args = (filename, lineno, line)
Guido van Rossum3d209861997-12-09 16:10:31 +0000353
Georg Brandl96a60ae2010-07-28 13:13:46 +0000354
Fred Drakecc645b92010-09-04 04:35:34 +0000355# Used in parsers to denote selecting a backwards-compatible inline comment
356# character behavior (; and # are comments at the start of a line, but ; only
357# inline)
358_COMPATIBLE = object()
359
360# Used in parser getters to indicate the default behaviour when a specific
361# option is not found it to raise an exception. Created to enable `None' as
362# a valid fallback value.
363_UNSET = object()
364
365
Łukasz Langa26d513c2010-11-10 18:57:39 +0000366class RawConfigParser(MutableMapping):
Georg Brandl96a60ae2010-07-28 13:13:46 +0000367 """ConfigParser that does not do interpolation."""
368
369 # Regular expressions for parsing section headers and options
370 _SECT_TMPL = r"""
371 \[ # [
372 (?P<header>[^]]+) # very permissive!
373 \] # ]
374 """
375 _OPT_TMPL = r"""
376 (?P<option>.*?) # very permissive!
377 \s*(?P<vi>{delim})\s* # any number of space/tab,
378 # followed by any of the
379 # allowed delimiters,
380 # followed by any space/tab
381 (?P<value>.*)$ # everything up to eol
382 """
383 _OPT_NV_TMPL = r"""
384 (?P<option>.*?) # very permissive!
385 \s*(?: # any number of space/tab,
386 (?P<vi>{delim})\s* # optionally followed by
387 # any of the allowed
388 # delimiters, followed by any
389 # space/tab
390 (?P<value>.*))?$ # everything up to eol
391 """
392
393 # Compiled regular expression for matching sections
394 SECTCRE = re.compile(_SECT_TMPL, re.VERBOSE)
395 # Compiled regular expression for matching options with typical separators
396 OPTCRE = re.compile(_OPT_TMPL.format(delim="=|:"), re.VERBOSE)
397 # Compiled regular expression for matching options with optional values
398 # delimited using typical separators
399 OPTCRE_NV = re.compile(_OPT_NV_TMPL.format(delim="=|:"), re.VERBOSE)
400 # Compiled regular expression for matching leading whitespace in a line
401 NONSPACECRE = re.compile(r"\S")
Fred Drakecc645b92010-09-04 04:35:34 +0000402 # Possible boolean values in the configuration.
403 BOOLEAN_STATES = {'1': True, 'yes': True, 'true': True, 'on': True,
404 '0': False, 'no': False, 'false': False, 'off': False}
Georg Brandl96a60ae2010-07-28 13:13:46 +0000405
Fred Drake03c44a32010-02-19 06:08:41 +0000406 def __init__(self, defaults=None, dict_type=_default_dict,
Fred Drakea4923622010-08-09 12:52:45 +0000407 allow_no_value=False, *, delimiters=('=', ':'),
408 comment_prefixes=_COMPATIBLE, strict=False,
409 empty_lines_in_values=True):
Thomas Wouters89f507f2006-12-13 04:49:30 +0000410 self._dict = dict_type
411 self._sections = self._dict()
412 self._defaults = self._dict()
Łukasz Langa26d513c2010-11-10 18:57:39 +0000413 self._views = self._dict()
414 self._views[DEFAULTSECT] = SectionProxy(self, DEFAULTSECT)
David Goodger68a1abd2004-10-03 15:40:25 +0000415 if defaults:
416 for key, value in defaults.items():
417 self._defaults[self.optionxform(key)] = value
Georg Brandl96a60ae2010-07-28 13:13:46 +0000418 self._delimiters = tuple(delimiters)
419 if delimiters == ('=', ':'):
420 self._optcre = self.OPTCRE_NV if allow_no_value else self.OPTCRE
421 else:
Fred Drakea4923622010-08-09 12:52:45 +0000422 d = "|".join(re.escape(d) for d in delimiters)
Georg Brandl96a60ae2010-07-28 13:13:46 +0000423 if allow_no_value:
Fred Drakea4923622010-08-09 12:52:45 +0000424 self._optcre = re.compile(self._OPT_NV_TMPL.format(delim=d),
Georg Brandl96a60ae2010-07-28 13:13:46 +0000425 re.VERBOSE)
426 else:
Fred Drakea4923622010-08-09 12:52:45 +0000427 self._optcre = re.compile(self._OPT_TMPL.format(delim=d),
Georg Brandl96a60ae2010-07-28 13:13:46 +0000428 re.VERBOSE)
Fred Drakecc645b92010-09-04 04:35:34 +0000429 if comment_prefixes is _COMPATIBLE:
Georg Brandl96a60ae2010-07-28 13:13:46 +0000430 self._startonly_comment_prefixes = ('#',)
431 self._comment_prefixes = (';',)
432 else:
433 self._startonly_comment_prefixes = ()
434 self._comment_prefixes = tuple(comment_prefixes or ())
Fred Drakea4923622010-08-09 12:52:45 +0000435 self._strict = strict
Łukasz Langa26d513c2010-11-10 18:57:39 +0000436 self._allow_no_value = allow_no_value
Georg Brandl96a60ae2010-07-28 13:13:46 +0000437 self._empty_lines_in_values = empty_lines_in_values
Guido van Rossum3d209861997-12-09 16:10:31 +0000438
439 def defaults(self):
Fred Drakefce65572002-10-25 18:08:18 +0000440 return self._defaults
Guido van Rossum3d209861997-12-09 16:10:31 +0000441
442 def sections(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000443 """Return a list of section names, excluding [DEFAULT]"""
Fred Drakefce65572002-10-25 18:08:18 +0000444 # self._sections will never have [DEFAULT] in it
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000445 return list(self._sections.keys())
Guido van Rossum3d209861997-12-09 16:10:31 +0000446
447 def add_section(self, section):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000448 """Create a new section in the configuration.
Guido van Rossum3d209861997-12-09 16:10:31 +0000449
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000450 Raise DuplicateSectionError if a section by the specified name
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000451 already exists. Raise ValueError if name is DEFAULT or any of it's
452 case-insensitive variants.
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000453 """
Łukasz Langa26d513c2010-11-10 18:57:39 +0000454 if section.upper() == DEFAULTSECT:
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000455 raise ValueError('Invalid section name: %s' % section)
456
Fred Drakefce65572002-10-25 18:08:18 +0000457 if section in self._sections:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000458 raise DuplicateSectionError(section)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000459 self._sections[section] = self._dict()
Łukasz Langa26d513c2010-11-10 18:57:39 +0000460 self._views[section] = SectionProxy(self, section)
Guido van Rossum3d209861997-12-09 16:10:31 +0000461
462 def has_section(self, section):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000463 """Indicate whether the named section is present in the configuration.
Guido van Rossum3d209861997-12-09 16:10:31 +0000464
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000465 The DEFAULT section is not acknowledged.
466 """
Fred Drakefce65572002-10-25 18:08:18 +0000467 return section in self._sections
Guido van Rossum3d209861997-12-09 16:10:31 +0000468
469 def options(self, section):
Guido van Rossuma5a24b71999-10-04 19:58:22 +0000470 """Return a list of option names for the given section name."""
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000471 try:
Fred Drakefce65572002-10-25 18:08:18 +0000472 opts = self._sections[section].copy()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000473 except KeyError:
474 raise NoSectionError(section)
Fred Drakefce65572002-10-25 18:08:18 +0000475 opts.update(self._defaults)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000476 if '__name__' in opts:
Fred Drake2a37f9f2000-09-27 22:43:54 +0000477 del opts['__name__']
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000478 return list(opts.keys())
Guido van Rossum3d209861997-12-09 16:10:31 +0000479
Georg Brandl8dcaa732010-07-29 12:17:40 +0000480 def read(self, filenames, encoding=None):
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000481 """Read and parse a filename or a list of filenames.
Tim Peters88869f92001-01-14 23:36:06 +0000482
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000483 Files that cannot be opened are silently ignored; this is
Barry Warsaw25394511999-10-12 16:12:48 +0000484 designed so that you can specify a list of potential
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000485 configuration file locations (e.g. current directory, user's
486 home directory, systemwide directory), and all existing
487 configuration files in the list will be read. A single
488 filename may also be given.
Fred Drake82903142004-05-18 04:24:02 +0000489
490 Return list of successfully read files.
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000491 """
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000492 if isinstance(filenames, str):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000493 filenames = [filenames]
Fred Drake82903142004-05-18 04:24:02 +0000494 read_ok = []
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000495 for filename in filenames:
496 try:
Florent Xicluna42d54452010-09-22 22:35:38 +0000497 with open(filename, encoding=encoding) as fp:
498 self._read(fp, filename)
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000499 except IOError:
500 continue
Fred Drake82903142004-05-18 04:24:02 +0000501 read_ok.append(filename)
502 return read_ok
Guido van Rossum3d209861997-12-09 16:10:31 +0000503
Fred Drakea4923622010-08-09 12:52:45 +0000504 def read_file(self, f, source=None):
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000505 """Like read() but the argument must be a file-like object.
506
Fred Drakea4923622010-08-09 12:52:45 +0000507 The `f' argument must have a `readline' method. Optional second
508 argument is the `source' specifying the name of the file being read. If
509 not given, it is taken from f.name. If `f' has no `name' attribute,
510 `<???>' is used.
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000511 """
Fred Drakea4923622010-08-09 12:52:45 +0000512 if source is None:
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000513 try:
Florent Xicluna42d54452010-09-22 22:35:38 +0000514 source = f.name
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000515 except AttributeError:
Fred Drakea4923622010-08-09 12:52:45 +0000516 source = '<???>'
517 self._read(f, source)
518
519 def read_string(self, string, source='<string>'):
520 """Read configuration from a given string."""
521 sfile = io.StringIO(string)
522 self.read_file(sfile, source)
523
524 def read_dict(self, dictionary, source='<dict>'):
525 """Read configuration from a dictionary.
526
527 Keys are section names, values are dictionaries with keys and values
528 that should be present in the section. If the used dictionary type
529 preserves order, sections and their keys will be added in order.
530
531 Optional second argument is the `source' specifying the name of the
532 dictionary being read.
533 """
534 elements_added = set()
535 for section, keys in dictionary.items():
536 try:
537 self.add_section(section)
Łukasz Langa26d513c2010-11-10 18:57:39 +0000538 except (DuplicateSectionError, ValueError):
Fred Drakea4923622010-08-09 12:52:45 +0000539 if self._strict and section in elements_added:
540 raise
541 elements_added.add(section)
542 for key, value in keys.items():
543 key = self.optionxform(key)
Fred Drakecc645b92010-09-04 04:35:34 +0000544 if value is not None:
545 value = str(value)
Fred Drakea4923622010-08-09 12:52:45 +0000546 if self._strict and (section, key) in elements_added:
547 raise DuplicateOptionError(section, key, source)
548 elements_added.add((section, key))
549 self.set(section, key, value)
550
551 def readfp(self, fp, filename=None):
552 """Deprecated, use read_file instead."""
553 warnings.warn(
554 "This method will be removed in future versions. "
555 "Use 'parser.read_file()' instead.",
556 PendingDeprecationWarning, stacklevel=2
557 )
558 self.read_file(fp, source=filename)
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000559
Łukasz Langa26d513c2010-11-10 18:57:39 +0000560 def get(self, section, option, *, vars=None, fallback=_UNSET):
Fred Drakecc645b92010-09-04 04:35:34 +0000561 """Get an option value for a given section.
562
563 If `vars' is provided, it must be a dictionary. The option is looked up
564 in `vars' (if provided), `section', and in `DEFAULTSECT' in that order.
Łukasz Langa26d513c2010-11-10 18:57:39 +0000565 If the key is not found and `fallback' is provided, it is used as
566 a fallback value. `None' can be provided as a `fallback' value.
567
568 Arguments `vars' and `fallback' are keyword only.
Fred Drakecc645b92010-09-04 04:35:34 +0000569 """
570 try:
571 d = self._unify_values(section, vars)
572 except NoSectionError:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000573 if fallback is _UNSET:
Fred Drakecc645b92010-09-04 04:35:34 +0000574 raise
Fred Drakefce65572002-10-25 18:08:18 +0000575 else:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000576 return fallback
Fred Drakecc645b92010-09-04 04:35:34 +0000577 option = self.optionxform(option)
578 try:
579 return d[option]
580 except KeyError:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000581 if fallback is _UNSET:
Fred Drakefce65572002-10-25 18:08:18 +0000582 raise NoOptionError(option, section)
Fred Drakecc645b92010-09-04 04:35:34 +0000583 else:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000584 return fallback
Fred Drake2a37f9f2000-09-27 22:43:54 +0000585
Fred Drakefce65572002-10-25 18:08:18 +0000586 def items(self, section):
Fred Drake2ca041f2002-09-27 15:49:56 +0000587 try:
Fred Drakefce65572002-10-25 18:08:18 +0000588 d2 = self._sections[section]
Fred Drake2ca041f2002-09-27 15:49:56 +0000589 except KeyError:
590 if section != DEFAULTSECT:
591 raise NoSectionError(section)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000592 d2 = self._dict()
Fred Drakefce65572002-10-25 18:08:18 +0000593 d = self._defaults.copy()
594 d.update(d2)
Fred Drakedf393bd2002-10-25 20:41:30 +0000595 if "__name__" in d:
596 del d["__name__"]
Fred Drakefce65572002-10-25 18:08:18 +0000597 return d.items()
Fred Drake2ca041f2002-09-27 15:49:56 +0000598
Łukasz Langa26d513c2010-11-10 18:57:39 +0000599 def _get(self, section, conv, option, **kwargs):
600 return conv(self.get(section, option, **kwargs))
Guido van Rossum3d209861997-12-09 16:10:31 +0000601
Łukasz Langa26d513c2010-11-10 18:57:39 +0000602 def getint(self, section, option, *, vars=None, fallback=_UNSET):
Fred Drakecc645b92010-09-04 04:35:34 +0000603 try:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000604 return self._get(section, int, option, vars=vars)
Fred Drakecc645b92010-09-04 04:35:34 +0000605 except (NoSectionError, NoOptionError):
Łukasz Langa26d513c2010-11-10 18:57:39 +0000606 if fallback is _UNSET:
Fred Drakecc645b92010-09-04 04:35:34 +0000607 raise
608 else:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000609 return fallback
Guido van Rossum3d209861997-12-09 16:10:31 +0000610
Łukasz Langa26d513c2010-11-10 18:57:39 +0000611 def getfloat(self, section, option, *, vars=None, fallback=_UNSET):
Fred Drakecc645b92010-09-04 04:35:34 +0000612 try:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000613 return self._get(section, float, option, vars=vars)
Fred Drakecc645b92010-09-04 04:35:34 +0000614 except (NoSectionError, NoOptionError):
Łukasz Langa26d513c2010-11-10 18:57:39 +0000615 if fallback is _UNSET:
Fred Drakecc645b92010-09-04 04:35:34 +0000616 raise
617 else:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000618 return fallback
Guido van Rossum3d209861997-12-09 16:10:31 +0000619
Łukasz Langa26d513c2010-11-10 18:57:39 +0000620 def getboolean(self, section, option, *, vars=None, fallback=_UNSET):
Fred Drakecc645b92010-09-04 04:35:34 +0000621 try:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000622 return self._get(section, self._convert_to_boolean, option,
623 vars=vars)
Fred Drakecc645b92010-09-04 04:35:34 +0000624 except (NoSectionError, NoOptionError):
Łukasz Langa26d513c2010-11-10 18:57:39 +0000625 if fallback is _UNSET:
Fred Drakecc645b92010-09-04 04:35:34 +0000626 raise
627 else:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000628 return fallback
Guido van Rossum3d209861997-12-09 16:10:31 +0000629
Guido van Rossum9e480ad1999-06-17 18:41:42 +0000630 def optionxform(self, optionstr):
Eric S. Raymond9eb54d92001-02-09 05:19:09 +0000631 return optionstr.lower()
Guido van Rossum9e480ad1999-06-17 18:41:42 +0000632
Eric S. Raymond417c4892000-07-10 18:11:00 +0000633 def has_option(self, section, option):
634 """Check for the existence of a given option in a given section."""
Fred Drakec2ff9052002-09-27 15:33:11 +0000635 if not section or section == DEFAULTSECT:
636 option = self.optionxform(option)
Fred Drakefce65572002-10-25 18:08:18 +0000637 return option in self._defaults
638 elif section not in self._sections:
Neal Norwitzf680cc42002-12-17 01:56:47 +0000639 return False
Eric S. Raymond417c4892000-07-10 18:11:00 +0000640 else:
Fred Drake3c823aa2001-02-26 21:55:34 +0000641 option = self.optionxform(option)
Fred Drakefce65572002-10-25 18:08:18 +0000642 return (option in self._sections[section]
643 or option in self._defaults)
Eric S. Raymond417c4892000-07-10 18:11:00 +0000644
Fred Drake03c44a32010-02-19 06:08:41 +0000645 def set(self, section, option, value=None):
Eric S. Raymond417c4892000-07-10 18:11:00 +0000646 """Set an option."""
Fred Drakec2ff9052002-09-27 15:33:11 +0000647 if not section or section == DEFAULTSECT:
Fred Drakefce65572002-10-25 18:08:18 +0000648 sectdict = self._defaults
Eric S. Raymond417c4892000-07-10 18:11:00 +0000649 else:
650 try:
Fred Drakefce65572002-10-25 18:08:18 +0000651 sectdict = self._sections[section]
Eric S. Raymond417c4892000-07-10 18:11:00 +0000652 except KeyError:
653 raise NoSectionError(section)
Fred Drakec2ff9052002-09-27 15:33:11 +0000654 sectdict[self.optionxform(option)] = value
Eric S. Raymond417c4892000-07-10 18:11:00 +0000655
Georg Brandl96a60ae2010-07-28 13:13:46 +0000656 def write(self, fp, space_around_delimiters=True):
657 """Write an .ini-format representation of the configuration state.
658
659 If `space_around_delimiters' is True (the default), delimiters
660 between keys and values are surrounded by spaces.
661 """
662 if space_around_delimiters:
663 d = " {} ".format(self._delimiters[0])
664 else:
665 d = self._delimiters[0]
Fred Drakefce65572002-10-25 18:08:18 +0000666 if self._defaults:
Georg Brandl96a60ae2010-07-28 13:13:46 +0000667 self._write_section(fp, DEFAULTSECT, self._defaults.items(), d)
Fred Drakefce65572002-10-25 18:08:18 +0000668 for section in self._sections:
Georg Brandl96a60ae2010-07-28 13:13:46 +0000669 self._write_section(fp, section,
670 self._sections[section].items(), d)
671
672 def _write_section(self, fp, section_name, section_items, delimiter):
673 """Write a single section to the specified `fp'."""
674 fp.write("[{}]\n".format(section_name))
675 for key, value in section_items:
676 if key == "__name__":
677 continue
Łukasz Langa26d513c2010-11-10 18:57:39 +0000678 if value is not None or not self._allow_no_value:
Georg Brandl96a60ae2010-07-28 13:13:46 +0000679 value = delimiter + str(value).replace('\n', '\n\t')
680 else:
681 value = ""
682 fp.write("{}{}\n".format(key, value))
683 fp.write("\n")
Eric S. Raymond417c4892000-07-10 18:11:00 +0000684
Thomas Woutersff4df6d2000-07-21 05:19:59 +0000685 def remove_option(self, section, option):
Eric S. Raymond649685a2000-07-14 14:28:22 +0000686 """Remove an option."""
Fred Drakec2ff9052002-09-27 15:33:11 +0000687 if not section or section == DEFAULTSECT:
Fred Drakefce65572002-10-25 18:08:18 +0000688 sectdict = self._defaults
Eric S. Raymond649685a2000-07-14 14:28:22 +0000689 else:
690 try:
Fred Drakefce65572002-10-25 18:08:18 +0000691 sectdict = self._sections[section]
Eric S. Raymond649685a2000-07-14 14:28:22 +0000692 except KeyError:
693 raise NoSectionError(section)
Fred Drake3c823aa2001-02-26 21:55:34 +0000694 option = self.optionxform(option)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000695 existed = option in sectdict
Eric S. Raymond649685a2000-07-14 14:28:22 +0000696 if existed:
Fred Drakeff4a23b2000-12-04 16:29:13 +0000697 del sectdict[option]
Eric S. Raymond649685a2000-07-14 14:28:22 +0000698 return existed
699
Thomas Woutersff4df6d2000-07-21 05:19:59 +0000700 def remove_section(self, section):
Eric S. Raymond649685a2000-07-14 14:28:22 +0000701 """Remove a file section."""
Fred Drakefce65572002-10-25 18:08:18 +0000702 existed = section in self._sections
Fred Drakec2ff9052002-09-27 15:33:11 +0000703 if existed:
Fred Drakefce65572002-10-25 18:08:18 +0000704 del self._sections[section]
Łukasz Langa26d513c2010-11-10 18:57:39 +0000705 del self._views[section]
Fred Drakec2ff9052002-09-27 15:33:11 +0000706 return existed
Eric S. Raymond649685a2000-07-14 14:28:22 +0000707
Łukasz Langa26d513c2010-11-10 18:57:39 +0000708 def __getitem__(self, key):
709 if key != DEFAULTSECT and not self.has_section(key):
710 raise KeyError(key)
711 return self._views[key]
712
713 def __setitem__(self, key, value):
714 # To conform with the mapping protocol, overwrites existing values in
715 # the section.
716
717 # XXX this is not atomic if read_dict fails at any point. Then again,
718 # no update method in configparser is atomic in this implementation.
719 self.remove_section(key)
720 self.read_dict({key: value})
721
722 def __delitem__(self, key):
723 if key == DEFAULTSECT:
724 raise ValueError("Cannot remove the default section.")
725 if not self.has_section(key):
726 raise KeyError(key)
727 self.remove_section(key)
728
729 def __contains__(self, key):
730 return key == DEFAULTSECT or self.has_section(key)
731
732 def __len__(self):
733 return len(self._sections) + 1 # the default section
734
735 def __iter__(self):
736 # XXX does it break when underlying container state changed?
737 return itertools.chain((DEFAULTSECT,), self._sections.keys())
738
Fred Drakefce65572002-10-25 18:08:18 +0000739 def _read(self, fp, fpname):
Georg Brandl96a60ae2010-07-28 13:13:46 +0000740 """Parse a sectioned configuration file.
Guido van Rossum3d209861997-12-09 16:10:31 +0000741
Fred Drakea4923622010-08-09 12:52:45 +0000742 Each section in a configuration file contains a header, indicated by
743 a name in square brackets (`[]'), plus key/value options, indicated by
Georg Brandl96a60ae2010-07-28 13:13:46 +0000744 `name' and `value' delimited with a specific substring (`=' or `:' by
745 default).
746
Fred Drakea4923622010-08-09 12:52:45 +0000747 Values can span multiple lines, as long as they are indented deeper
748 than the first line of the value. Depending on the parser's mode, blank
749 lines may be treated as parts of multiline values or ignored.
Georg Brandl96a60ae2010-07-28 13:13:46 +0000750
751 Configuration files may include comments, prefixed by specific
Fred Drakea4923622010-08-09 12:52:45 +0000752 characters (`#' and `;' by default). Comments may appear on their own
753 in an otherwise empty line or may be entered in lines holding values or
Georg Brandl96a60ae2010-07-28 13:13:46 +0000754 section names.
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000755 """
Fred Drakea4923622010-08-09 12:52:45 +0000756 elements_added = set()
Brian Curtin9a27b0c2010-07-26 00:27:10 +0000757 cursect = None # None, or a dictionary
Fred Drakea4923622010-08-09 12:52:45 +0000758 sectname = None
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000759 optname = None
760 lineno = 0
Georg Brandl96a60ae2010-07-28 13:13:46 +0000761 indent_level = 0
Brian Curtin9a27b0c2010-07-26 00:27:10 +0000762 e = None # None, or an exception
Georg Brandl96a60ae2010-07-28 13:13:46 +0000763 for lineno, line in enumerate(fp, start=1):
Georg Brandlf206d0e2010-07-29 11:56:20 +0000764 # strip full line comments
Georg Brandl96a60ae2010-07-28 13:13:46 +0000765 comment_start = None
766 for prefix in self._startonly_comment_prefixes:
767 if line.strip().startswith(prefix):
768 comment_start = 0
769 break
770 # strip inline comments
771 for prefix in self._comment_prefixes:
772 index = line.find(prefix)
773 if index == 0 or (index > 0 and line[index-1].isspace()):
774 comment_start = index
775 break
776 value = line[:comment_start].strip()
777 if not value:
Georg Brandlf206d0e2010-07-29 11:56:20 +0000778 if self._empty_lines_in_values:
Georg Brandl96a60ae2010-07-28 13:13:46 +0000779 # add empty line to the value, but only if there was no
780 # comment on the line
Georg Brandlf206d0e2010-07-29 11:56:20 +0000781 if (comment_start is None and
782 cursect is not None and
783 optname and
784 cursect[optname] is not None):
785 cursect[optname].append('') # newlines added at join
Georg Brandl96a60ae2010-07-28 13:13:46 +0000786 else:
787 # empty line marks end of value
788 indent_level = sys.maxsize
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000789 continue
790 # continuation line?
Georg Brandl96a60ae2010-07-28 13:13:46 +0000791 first_nonspace = self.NONSPACECRE.search(line)
792 cur_indent_level = first_nonspace.start() if first_nonspace else 0
793 if (cursect is not None and optname and
794 cur_indent_level > indent_level):
795 cursect[optname].append(value)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000796 # a section header or option header?
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000797 else:
Georg Brandl96a60ae2010-07-28 13:13:46 +0000798 indent_level = cur_indent_level
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000799 # is it a section header?
Georg Brandl96a60ae2010-07-28 13:13:46 +0000800 mo = self.SECTCRE.match(value)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000801 if mo:
802 sectname = mo.group('header')
Fred Drakefce65572002-10-25 18:08:18 +0000803 if sectname in self._sections:
Fred Drakea4923622010-08-09 12:52:45 +0000804 if self._strict and sectname in elements_added:
805 raise DuplicateSectionError(sectname, fpname,
806 lineno)
Fred Drakefce65572002-10-25 18:08:18 +0000807 cursect = self._sections[sectname]
Fred Drakea4923622010-08-09 12:52:45 +0000808 elements_added.add(sectname)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000809 elif sectname == DEFAULTSECT:
Fred Drakefce65572002-10-25 18:08:18 +0000810 cursect = self._defaults
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000811 else:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000812 cursect = self._dict()
813 cursect['__name__'] = sectname
Fred Drakefce65572002-10-25 18:08:18 +0000814 self._sections[sectname] = cursect
Łukasz Langa26d513c2010-11-10 18:57:39 +0000815 self._views[sectname] = SectionProxy(self, sectname)
Fred Drakea4923622010-08-09 12:52:45 +0000816 elements_added.add(sectname)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000817 # So sections can't start with a continuation line
818 optname = None
819 # no section header in the file?
820 elif cursect is None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000821 raise MissingSectionHeaderError(fpname, lineno, line)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000822 # an option line?
823 else:
Georg Brandl96a60ae2010-07-28 13:13:46 +0000824 mo = self._optcre.match(value)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000825 if mo:
Fred Drakec517b9b2000-02-28 20:59:03 +0000826 optname, vi, optval = mo.group('option', 'vi', 'value')
Georg Brandl96a60ae2010-07-28 13:13:46 +0000827 if not optname:
828 e = self._handle_error(e, fpname, lineno, line)
Brian Curtin9a27b0c2010-07-26 00:27:10 +0000829 optname = self.optionxform(optname.rstrip())
Fred Drakea4923622010-08-09 12:52:45 +0000830 if (self._strict and
831 (sectname, optname) in elements_added):
832 raise DuplicateOptionError(sectname, optname,
833 fpname, lineno)
834 elements_added.add((sectname, optname))
Fred Drake03c44a32010-02-19 06:08:41 +0000835 # This check is fine because the OPTCRE cannot
836 # match if it would set optval to None
837 if optval is not None:
Fred Drake03c44a32010-02-19 06:08:41 +0000838 optval = optval.strip()
Brian Curtin9a27b0c2010-07-26 00:27:10 +0000839 # allow empty values
840 if optval == '""':
841 optval = ''
842 cursect[optname] = [optval]
843 else:
844 # valueless option handling
845 cursect[optname] = optval
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000846 else:
Georg Brandl96a60ae2010-07-28 13:13:46 +0000847 # a non-fatal parsing error occurred. set up the
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000848 # exception but keep going. the exception will be
849 # raised at the end of the file and will contain a
850 # list of all bogus lines
Georg Brandl96a60ae2010-07-28 13:13:46 +0000851 e = self._handle_error(e, fpname, lineno, line)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000852 # if any parsing errors occurred, raise an exception
853 if e:
854 raise e
Georg Brandl96a60ae2010-07-28 13:13:46 +0000855 self._join_multiline_values()
Fred Drakefce65572002-10-25 18:08:18 +0000856
Georg Brandl96a60ae2010-07-28 13:13:46 +0000857 def _join_multiline_values(self):
Łukasz Langa26d513c2010-11-10 18:57:39 +0000858 all_sections = itertools.chain((self._defaults,),
859 self._sections.values())
Brian Curtin9a27b0c2010-07-26 00:27:10 +0000860 for options in all_sections:
861 for name, val in options.items():
862 if isinstance(val, list):
Georg Brandlf206d0e2010-07-29 11:56:20 +0000863 options[name] = '\n'.join(val).rstrip()
Fred Drakefce65572002-10-25 18:08:18 +0000864
Georg Brandl96a60ae2010-07-28 13:13:46 +0000865 def _handle_error(self, exc, fpname, lineno, line):
866 if not exc:
867 exc = ParsingError(fpname)
868 exc.append(lineno, repr(line))
869 return exc
870
Fred Drakecc645b92010-09-04 04:35:34 +0000871 def _unify_values(self, section, vars):
872 """Create a copy of the DEFAULTSECT with values from a specific
873 `section' and the `vars' dictionary. If provided, values in `vars'
874 take precendence.
Fred Drakefce65572002-10-25 18:08:18 +0000875 """
876 d = self._defaults.copy()
877 try:
878 d.update(self._sections[section])
879 except KeyError:
880 if section != DEFAULTSECT:
881 raise NoSectionError(section)
882 # Update with the entry specific variables
David Goodger68a1abd2004-10-03 15:40:25 +0000883 if vars:
884 for key, value in vars.items():
Fred Drakecc645b92010-09-04 04:35:34 +0000885 if value is not None:
886 value = str(value)
David Goodger68a1abd2004-10-03 15:40:25 +0000887 d[self.optionxform(key)] = value
Fred Drakecc645b92010-09-04 04:35:34 +0000888 return d
889
890 def _convert_to_boolean(self, value):
891 """Return a boolean value translating from other types if necessary.
892 """
893 if value.lower() not in self.BOOLEAN_STATES:
894 raise ValueError('Not a boolean: %s' % value)
895 return self.BOOLEAN_STATES[value.lower()]
896
Łukasz Langa26d513c2010-11-10 18:57:39 +0000897 def _validate_value_type(self, value):
898 """Raises a TypeError for non-string values.
899
900 The only legal non-string value if we allow valueless
901 options is None, so we need to check if the value is a
902 string if:
903 - we do not allow valueless options, or
904 - we allow valueless options but the value is not None
905
906 For compatibility reasons this method is not used in classic set()
907 for RawConfigParsers and ConfigParsers. It is invoked in every
908 case for mapping protocol access and in SafeConfigParser.set().
909 """
910 if not self._allow_no_value or value:
911 if not isinstance(value, str):
912 raise TypeError("option values must be strings")
913
914
Fred Drakecc645b92010-09-04 04:35:34 +0000915
916class ConfigParser(RawConfigParser):
917 """ConfigParser implementing interpolation."""
918
Łukasz Langa26d513c2010-11-10 18:57:39 +0000919 def get(self, section, option, *, raw=False, vars=None, fallback=_UNSET):
Fred Drakecc645b92010-09-04 04:35:34 +0000920 """Get an option value for a given section.
921
922 If `vars' is provided, it must be a dictionary. The option is looked up
923 in `vars' (if provided), `section', and in `DEFAULTSECT' in that order.
Łukasz Langa26d513c2010-11-10 18:57:39 +0000924 If the key is not found and `fallback' is provided, it is used as
925 a fallback value. `None' can be provided as a `fallback' value.
Fred Drakecc645b92010-09-04 04:35:34 +0000926
927 All % interpolations are expanded in the return values, unless the
928 optional argument `raw' is true. Values for interpolation keys are
929 looked up in the same manner as the option.
930
Łukasz Langa26d513c2010-11-10 18:57:39 +0000931 Arguments `raw', `vars', and `fallback' are keyword only.
932
Fred Drakecc645b92010-09-04 04:35:34 +0000933 The section DEFAULT is special.
934 """
935 try:
936 d = self._unify_values(section, vars)
937 except NoSectionError:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000938 if fallback is _UNSET:
Fred Drakecc645b92010-09-04 04:35:34 +0000939 raise
940 else:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000941 return fallback
Fred Drakefce65572002-10-25 18:08:18 +0000942 option = self.optionxform(option)
943 try:
944 value = d[option]
945 except KeyError:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000946 if fallback is _UNSET:
Fred Drakecc645b92010-09-04 04:35:34 +0000947 raise NoOptionError(option, section)
948 else:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000949 return fallback
Fred Drakefce65572002-10-25 18:08:18 +0000950
Fred Drake03c44a32010-02-19 06:08:41 +0000951 if raw or value is None:
Fred Drakefce65572002-10-25 18:08:18 +0000952 return value
953 else:
954 return self._interpolate(section, option, value, d)
955
Łukasz Langa26d513c2010-11-10 18:57:39 +0000956 def getint(self, section, option, *, raw=False, vars=None,
957 fallback=_UNSET):
Fred Drakecc645b92010-09-04 04:35:34 +0000958 try:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000959 return self._get(section, int, option, raw=raw, vars=vars)
Fred Drakecc645b92010-09-04 04:35:34 +0000960 except (NoSectionError, NoOptionError):
Łukasz Langa26d513c2010-11-10 18:57:39 +0000961 if fallback is _UNSET:
Fred Drakecc645b92010-09-04 04:35:34 +0000962 raise
963 else:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000964 return fallback
Fred Drakecc645b92010-09-04 04:35:34 +0000965
Łukasz Langa26d513c2010-11-10 18:57:39 +0000966 def getfloat(self, section, option, *, raw=False, vars=None,
967 fallback=_UNSET):
Fred Drakecc645b92010-09-04 04:35:34 +0000968 try:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000969 return self._get(section, float, option, raw=raw, vars=vars)
Fred Drakecc645b92010-09-04 04:35:34 +0000970 except (NoSectionError, NoOptionError):
Łukasz Langa26d513c2010-11-10 18:57:39 +0000971 if fallback is _UNSET:
Fred Drakecc645b92010-09-04 04:35:34 +0000972 raise
973 else:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000974 return fallback
Fred Drakecc645b92010-09-04 04:35:34 +0000975
Łukasz Langa26d513c2010-11-10 18:57:39 +0000976 def getboolean(self, section, option, *, raw=False, vars=None,
977 fallback=_UNSET):
Fred Drakecc645b92010-09-04 04:35:34 +0000978 try:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000979 return self._get(section, self._convert_to_boolean, option,
980 raw=raw, vars=vars)
Fred Drakecc645b92010-09-04 04:35:34 +0000981 except (NoSectionError, NoOptionError):
Łukasz Langa26d513c2010-11-10 18:57:39 +0000982 if fallback is _UNSET:
Fred Drakecc645b92010-09-04 04:35:34 +0000983 raise
984 else:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000985 return fallback
Fred Drakecc645b92010-09-04 04:35:34 +0000986
Neal Norwitzf680cc42002-12-17 01:56:47 +0000987 def items(self, section, raw=False, vars=None):
Fred Drakea4923622010-08-09 12:52:45 +0000988 """Return a list of (name, value) tuples for each option in a section.
Fred Drakefce65572002-10-25 18:08:18 +0000989
990 All % interpolations are expanded in the return values, based on the
991 defaults passed into the constructor, unless the optional argument
992 `raw' is true. Additional substitutions may be provided using the
993 `vars' argument, which must be a dictionary whose contents overrides
994 any pre-existing defaults.
995
996 The section DEFAULT is special.
997 """
998 d = self._defaults.copy()
999 try:
1000 d.update(self._sections[section])
1001 except KeyError:
1002 if section != DEFAULTSECT:
1003 raise NoSectionError(section)
1004 # Update with the entry specific variables
1005 if vars:
David Goodger68a1abd2004-10-03 15:40:25 +00001006 for key, value in vars.items():
1007 d[self.optionxform(key)] = value
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001008 options = list(d.keys())
Fred Drakedf393bd2002-10-25 20:41:30 +00001009 if "__name__" in options:
1010 options.remove("__name__")
Fred Drakefce65572002-10-25 18:08:18 +00001011 if raw:
Fred Drake8c4da532003-10-21 16:45:00 +00001012 return [(option, d[option])
1013 for option in options]
Fred Drakefce65572002-10-25 18:08:18 +00001014 else:
Fred Drake8c4da532003-10-21 16:45:00 +00001015 return [(option, self._interpolate(section, option, d[option], d))
1016 for option in options]
Fred Drakefce65572002-10-25 18:08:18 +00001017
1018 def _interpolate(self, section, option, rawval, vars):
1019 # do the string interpolation
1020 value = rawval
Tim Peters230a60c2002-11-09 05:08:07 +00001021 depth = MAX_INTERPOLATION_DEPTH
Fred Drakefce65572002-10-25 18:08:18 +00001022 while depth: # Loop through this until it's done
1023 depth -= 1
Fred Drake03c44a32010-02-19 06:08:41 +00001024 if value and "%(" in value:
Fred Drakebc12b012004-05-18 02:25:51 +00001025 value = self._KEYCRE.sub(self._interpolation_replace, value)
Fred Drakefce65572002-10-25 18:08:18 +00001026 try:
1027 value = value % vars
Guido van Rossumb940e112007-01-10 16:19:56 +00001028 except KeyError as e:
Fred Drakee2c64912002-12-31 17:23:27 +00001029 raise InterpolationMissingOptionError(
Brett Cannonca477b22007-03-21 22:26:20 +00001030 option, section, rawval, e.args[0])
Fred Drakefce65572002-10-25 18:08:18 +00001031 else:
1032 break
Fred Drake03c44a32010-02-19 06:08:41 +00001033 if value and "%(" in value:
Fred Drakefce65572002-10-25 18:08:18 +00001034 raise InterpolationDepthError(option, section, rawval)
1035 return value
Fred Drake0eebd5c2002-10-25 21:52:00 +00001036
Fred Drakebc12b012004-05-18 02:25:51 +00001037 _KEYCRE = re.compile(r"%\(([^)]*)\)s|.")
1038
1039 def _interpolation_replace(self, match):
1040 s = match.group(1)
1041 if s is None:
1042 return match.group()
1043 else:
1044 return "%%(%s)s" % self.optionxform(s)
1045
Fred Drake0eebd5c2002-10-25 21:52:00 +00001046
1047class SafeConfigParser(ConfigParser):
Georg Brandl96a60ae2010-07-28 13:13:46 +00001048 """ConfigParser implementing sane interpolation."""
Fred Drake0eebd5c2002-10-25 21:52:00 +00001049
1050 def _interpolate(self, section, option, rawval, vars):
1051 # do the string interpolation
1052 L = []
1053 self._interpolate_some(option, L, rawval, section, vars, 1)
1054 return ''.join(L)
1055
Guido van Rossumd8faa362007-04-27 19:54:29 +00001056 _interpvar_re = re.compile(r"%\(([^)]+)\)s")
Fred Drake0eebd5c2002-10-25 21:52:00 +00001057
1058 def _interpolate_some(self, option, accum, rest, section, map, depth):
1059 if depth > MAX_INTERPOLATION_DEPTH:
1060 raise InterpolationDepthError(option, section, rest)
1061 while rest:
1062 p = rest.find("%")
1063 if p < 0:
1064 accum.append(rest)
1065 return
1066 if p > 0:
1067 accum.append(rest[:p])
1068 rest = rest[p:]
1069 # p is no longer used
1070 c = rest[1:2]
1071 if c == "%":
1072 accum.append("%")
1073 rest = rest[2:]
1074 elif c == "(":
Guido van Rossumd8faa362007-04-27 19:54:29 +00001075 m = self._interpvar_re.match(rest)
Fred Drake0eebd5c2002-10-25 21:52:00 +00001076 if m is None:
Neal Norwitz10f30182003-06-29 04:23:35 +00001077 raise InterpolationSyntaxError(option, section,
1078 "bad interpolation variable reference %r" % rest)
Fred Drakebc12b012004-05-18 02:25:51 +00001079 var = self.optionxform(m.group(1))
Fred Drake0eebd5c2002-10-25 21:52:00 +00001080 rest = rest[m.end():]
1081 try:
1082 v = map[var]
1083 except KeyError:
Fred Drakee2c64912002-12-31 17:23:27 +00001084 raise InterpolationMissingOptionError(
1085 option, section, rest, var)
Fred Drake0eebd5c2002-10-25 21:52:00 +00001086 if "%" in v:
1087 self._interpolate_some(option, accum, v,
1088 section, map, depth + 1)
1089 else:
1090 accum.append(v)
1091 else:
1092 raise InterpolationSyntaxError(
Neal Norwitz10f30182003-06-29 04:23:35 +00001093 option, section,
Fred Drakea4923622010-08-09 12:52:45 +00001094 "'%%' must be followed by '%%' or '(', "
1095 "found: %r" % (rest,))
David Goodger1cbf2062004-10-03 15:55:09 +00001096
Fred Drake03c44a32010-02-19 06:08:41 +00001097 def set(self, section, option, value=None):
David Goodger1cbf2062004-10-03 15:55:09 +00001098 """Set an option. Extend ConfigParser.set: check for string values."""
Łukasz Langa26d513c2010-11-10 18:57:39 +00001099 self._validate_value_type(value)
Fred Drakea4923622010-08-09 12:52:45 +00001100 # check for bad percent signs
1101 if value:
1102 tmp_value = value.replace('%%', '') # escaped percent signs
1103 tmp_value = self._interpvar_re.sub('', tmp_value) # valid syntax
1104 if '%' in tmp_value:
1105 raise ValueError("invalid interpolation syntax in %r at "
1106 "position %d" % (value, tmp_value.find('%')))
David Goodger1cbf2062004-10-03 15:55:09 +00001107 ConfigParser.set(self, section, option, value)
Łukasz Langa26d513c2010-11-10 18:57:39 +00001108
1109
1110class SectionProxy(MutableMapping):
1111 """A proxy for a single section from a parser."""
1112
1113 _noname = ("__name__ special key access and modification "
1114 "not supported through the mapping interface.")
1115
1116 def __init__(self, parser, section_name):
1117 """Creates a view on a section named `section_name` in `parser`."""
1118 self._parser = parser
1119 self._section = section_name
1120 self.getint = functools.partial(self._parser.getint,
1121 self._section)
1122 self.getfloat = functools.partial(self._parser.getfloat,
1123 self._section)
1124 self.getboolean = functools.partial(self._parser.getboolean,
1125 self._section)
1126
1127 def __repr__(self):
1128 return '<Section: {}>'.format(self._section)
1129
1130 def __getitem__(self, key):
1131 if key == '__name__':
1132 raise ValueError(self._noname)
1133 if not self._parser.has_option(self._section, key):
1134 raise KeyError(key)
1135 return self._parser.get(self._section, key)
1136
1137 def __setitem__(self, key, value):
1138 if key == '__name__':
1139 raise ValueError(self._noname)
1140 self._parser._validate_value_type(value)
1141 return self._parser.set(self._section, key, value)
1142
1143 def __delitem__(self, key):
1144 if key == '__name__':
1145 raise ValueError(self._noname)
1146 if not self._parser.has_option(self._section, key):
1147 raise KeyError(key)
1148 return self._parser.remove_option(self._section, key)
1149
1150 def __contains__(self, key):
1151 if key == '__name__':
1152 return False
1153 return self._parser.has_option(self._section, key)
1154
1155 def __len__(self):
1156 # __name__ is properly hidden by .options()
1157 # XXX weak performance
1158 return len(self._parser.options(self._section))
1159
1160 def __iter__(self):
1161 # __name__ is properly hidden by .options()
1162 # XXX weak performance
1163 # XXX does not break when underlying container state changed
1164 return self._parser.options(self._section).__iter__()