blob: 4ee8307613c9c81aecd6f5453b00f31c3bee8e48 [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
Guido van Rossum3d209861997-12-09 16:10:31 +00007Intrinsic defaults can be specified by passing them into the
Łukasz Langa7f64c8a2010-12-16 01:16:22 +00008ConfigParser constructor as a dictionary.
Guido van Rossum3d209861997-12-09 16:10:31 +00009
10class:
11
Łukasz Langa7f64c8a2010-12-16 01:16:22 +000012ConfigParser -- responsible for parsing a list of
Łukasz Langab6a6f5f2010-12-03 16:28:00 +000013 configuration files, and managing the parsed database.
Guido van Rossum3d209861997-12-09 16:10:31 +000014
15 methods:
16
Fred Drakecc645b92010-09-04 04:35:34 +000017 __init__(defaults=None, dict_type=_default_dict, allow_no_value=False,
Łukasz Langab25a7912010-12-17 01:32:29 +000018 delimiters=('=', ':'), comment_prefixes=('#', ';'),
19 inline_comment_prefixes=None, strict=True,
20 empty_lines_in_values=True):
Georg Brandl96a60ae2010-07-28 13:13:46 +000021 Create the parser. When `defaults' is given, it is initialized into the
22 dictionary or intrinsic defaults. The keys must be strings, the values
Łukasz Langa5c863392010-11-21 13:41:35 +000023 must be appropriate for %()s string interpolation.
Georg Brandl96a60ae2010-07-28 13:13:46 +000024
25 When `dict_type' is given, it will be used to create the dictionary
26 objects for the list of sections, for the options within a section, and
27 for the default values.
28
29 When `delimiters' is given, it will be used as the set of substrings
30 that divide keys from values.
31
32 When `comment_prefixes' is given, it will be used as the set of
Łukasz Langab25a7912010-12-17 01:32:29 +000033 substrings that prefix comments in empty lines. Comments can be
34 indented.
35
36 When `inline_comment_prefixes' is given, it will be used as the set of
37 substrings that prefix comments in non-empty lines.
Georg Brandl96a60ae2010-07-28 13:13:46 +000038
Fred Drakea4923622010-08-09 12:52:45 +000039 When `strict` is True, the parser won't allow for any section or option
40 duplicates while reading from a single source (file, string or
Łukasz Langab25a7912010-12-17 01:32:29 +000041 dictionary). Default is True.
Fred Drakea4923622010-08-09 12:52:45 +000042
Georg Brandl96a60ae2010-07-28 13:13:46 +000043 When `empty_lines_in_values' is False (default: True), each empty line
44 marks the end of an option. Otherwise, internal empty lines of
45 a multiline option are kept as part of the value.
46
47 When `allow_no_value' is True (default: False), options without
48 values are accepted; the value presented for these is None.
Guido van Rossum3d209861997-12-09 16:10:31 +000049
Barry Warsawf09f6a51999-01-26 22:01:37 +000050 sections()
Georg Brandl96a60ae2010-07-28 13:13:46 +000051 Return all the configuration section names, sans DEFAULT.
Guido van Rossum3d209861997-12-09 16:10:31 +000052
Guido van Rossuma5a24b71999-10-04 19:58:22 +000053 has_section(section)
Georg Brandl96a60ae2010-07-28 13:13:46 +000054 Return whether the given section exists.
Guido van Rossuma5a24b71999-10-04 19:58:22 +000055
Eric S. Raymond649685a2000-07-14 14:28:22 +000056 has_option(section, option)
Georg Brandl96a60ae2010-07-28 13:13:46 +000057 Return whether the given option exists in the given section.
Eric S. Raymond649685a2000-07-14 14:28:22 +000058
Barry Warsawf09f6a51999-01-26 22:01:37 +000059 options(section)
Georg Brandl96a60ae2010-07-28 13:13:46 +000060 Return list of configuration options for the named section.
Guido van Rossum3d209861997-12-09 16:10:31 +000061
Georg Brandl8dcaa732010-07-29 12:17:40 +000062 read(filenames, encoding=None)
Georg Brandl96a60ae2010-07-28 13:13:46 +000063 Read and parse the list of named configuration files, given by
Guido van Rossum6a8d84b1999-10-04 18:57:27 +000064 name. A single filename is also allowed. Non-existing files
Fred Drake82903142004-05-18 04:24:02 +000065 are ignored. Return list of successfully read files.
Guido van Rossum6a8d84b1999-10-04 18:57:27 +000066
Fred Drakea4923622010-08-09 12:52:45 +000067 read_file(f, filename=None)
Georg Brandl96a60ae2010-07-28 13:13:46 +000068 Read and parse one configuration file, given as a file object.
Fred Drakea4923622010-08-09 12:52:45 +000069 The filename defaults to f.name; it is only used in error
70 messages (if f has no `name' attribute, the string `<???>' is used).
71
72 read_string(string)
73 Read configuration from a given string.
74
75 read_dict(dictionary)
76 Read configuration from a dictionary. Keys are section names,
77 values are dictionaries with keys and values that should be present
78 in the section. If the used dictionary type preserves order, sections
Fred Drakecc645b92010-09-04 04:35:34 +000079 and their keys will be added in order. Values are automatically
80 converted to strings.
Guido van Rossum3d209861997-12-09 16:10:31 +000081
Łukasz Langa26d513c2010-11-10 18:57:39 +000082 get(section, option, raw=False, vars=None, fallback=_UNSET)
Georg Brandl96a60ae2010-07-28 13:13:46 +000083 Return a string value for the named option. All % interpolations are
Barry Warsawf09f6a51999-01-26 22:01:37 +000084 expanded in the return values, based on the defaults passed into the
85 constructor and the DEFAULT section. Additional substitutions may be
86 provided using the `vars' argument, which must be a dictionary whose
Fred Drakecc645b92010-09-04 04:35:34 +000087 contents override any pre-existing defaults. If `option' is a key in
88 `vars', the value from `vars' is used.
Guido van Rossum3d209861997-12-09 16:10:31 +000089
Łukasz Langa26d513c2010-11-10 18:57:39 +000090 getint(section, options, raw=False, vars=None, fallback=_UNSET)
Georg Brandl96a60ae2010-07-28 13:13:46 +000091 Like get(), but convert value to an integer.
Guido van Rossum3d209861997-12-09 16:10:31 +000092
Łukasz Langa26d513c2010-11-10 18:57:39 +000093 getfloat(section, options, raw=False, vars=None, fallback=_UNSET)
Georg Brandl96a60ae2010-07-28 13:13:46 +000094 Like get(), but convert value to a float.
Guido van Rossum3d209861997-12-09 16:10:31 +000095
Łukasz Langa26d513c2010-11-10 18:57:39 +000096 getboolean(section, options, raw=False, vars=None, fallback=_UNSET)
Georg Brandl96a60ae2010-07-28 13:13:46 +000097 Like get(), but convert value to a boolean (currently case
Neal Norwitzf680cc42002-12-17 01:56:47 +000098 insensitively defined as 0, false, no, off for False, and 1, true,
99 yes, on for True). Returns False or True.
Eric S. Raymond649685a2000-07-14 14:28:22 +0000100
Łukasz Langa71b37a52010-12-17 21:56:32 +0000101 items(section=_UNSET, raw=False, vars=None)
Łukasz Langa30574692012-12-31 02:18:20 +0100102 If section is given, return a list of tuples with (name, value) for
103 each option in the section. Otherwise, return a list of tuples with
104 (section_name, section_proxy) for each section, including DEFAULTSECT.
Fred Drake2ca041f2002-09-27 15:49:56 +0000105
Eric S. Raymond649685a2000-07-14 14:28:22 +0000106 remove_section(section)
Georg Brandl96a60ae2010-07-28 13:13:46 +0000107 Remove the given file section and all its options.
Eric S. Raymond649685a2000-07-14 14:28:22 +0000108
109 remove_option(section, option)
Georg Brandl96a60ae2010-07-28 13:13:46 +0000110 Remove the given option from the given section.
Eric S. Raymond649685a2000-07-14 14:28:22 +0000111
112 set(section, option, value)
Georg Brandl96a60ae2010-07-28 13:13:46 +0000113 Set the given option.
Eric S. Raymond649685a2000-07-14 14:28:22 +0000114
Georg Brandl96a60ae2010-07-28 13:13:46 +0000115 write(fp, space_around_delimiters=True)
116 Write the configuration state in .ini format. If
117 `space_around_delimiters' is True (the default), delimiters
118 between keys and values are surrounded by spaces.
Guido van Rossum3d209861997-12-09 16:10:31 +0000119"""
120
Raymond Hettinger57d1a882011-02-23 00:46:28 +0000121from collections.abc import MutableMapping
Raymond Hettinger9fe1ccf2011-02-26 01:02:51 +0000122from collections import OrderedDict as _default_dict, ChainMap as _ChainMap
Łukasz Langa26d513c2010-11-10 18:57:39 +0000123import functools
Fred Drakea4923622010-08-09 12:52:45 +0000124import io
Łukasz Langa26d513c2010-11-10 18:57:39 +0000125import itertools
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000126import re
Georg Brandl96a60ae2010-07-28 13:13:46 +0000127import sys
Fred Drakea4923622010-08-09 12:52:45 +0000128import warnings
Guido van Rossum3d209861997-12-09 16:10:31 +0000129
Fred Drakea4923622010-08-09 12:52:45 +0000130__all__ = ["NoSectionError", "DuplicateOptionError", "DuplicateSectionError",
131 "NoOptionError", "InterpolationError", "InterpolationDepthError",
Fred Drake8d5dd982002-12-30 23:51:45 +0000132 "InterpolationSyntaxError", "ParsingError",
David Goodger1cbf2062004-10-03 15:55:09 +0000133 "MissingSectionHeaderError",
134 "ConfigParser", "SafeConfigParser", "RawConfigParser",
Fred Drakec2ff9052002-09-27 15:33:11 +0000135 "DEFAULTSECT", "MAX_INTERPOLATION_DEPTH"]
Skip Montanaroe99d5ea2001-01-20 19:54:20 +0000136
Guido van Rossum3d209861997-12-09 16:10:31 +0000137DEFAULTSECT = "DEFAULT"
138
Fred Drake2a37f9f2000-09-27 22:43:54 +0000139MAX_INTERPOLATION_DEPTH = 10
140
Guido van Rossum3d209861997-12-09 16:10:31 +0000141
Tim Peters88869f92001-01-14 23:36:06 +0000142
Guido van Rossum3d209861997-12-09 16:10:31 +0000143# exception classes
Fred Drake7c1e5ad2000-12-11 18:13:19 +0000144class Error(Exception):
Fred Drake8d5dd982002-12-30 23:51:45 +0000145 """Base class for ConfigParser exceptions."""
146
Guido van Rossum3d209861997-12-09 16:10:31 +0000147 def __init__(self, msg=''):
Fred Drakee2c64912002-12-31 17:23:27 +0000148 self.message = msg
Fred Drake7c1e5ad2000-12-11 18:13:19 +0000149 Exception.__init__(self, msg)
Fred Drake8d5dd982002-12-30 23:51:45 +0000150
Guido van Rossum3d209861997-12-09 16:10:31 +0000151 def __repr__(self):
Fred Drakee2c64912002-12-31 17:23:27 +0000152 return self.message
Fred Drake8d5dd982002-12-30 23:51:45 +0000153
Fred Drake7c1e5ad2000-12-11 18:13:19 +0000154 __str__ = __repr__
Guido van Rossum3d209861997-12-09 16:10:31 +0000155
Georg Brandl96a60ae2010-07-28 13:13:46 +0000156
Guido van Rossum3d209861997-12-09 16:10:31 +0000157class NoSectionError(Error):
Fred Drake8d5dd982002-12-30 23:51:45 +0000158 """Raised when no section matches a requested option."""
159
Guido van Rossum3d209861997-12-09 16:10:31 +0000160 def __init__(self, section):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000161 Error.__init__(self, 'No section: %r' % (section,))
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000162 self.section = section
Michael Foordbd6c0792010-07-25 23:09:25 +0000163 self.args = (section, )
Guido van Rossum3d209861997-12-09 16:10:31 +0000164
Georg Brandl96a60ae2010-07-28 13:13:46 +0000165
Guido van Rossum3d209861997-12-09 16:10:31 +0000166class DuplicateSectionError(Error):
Fred Drakea4923622010-08-09 12:52:45 +0000167 """Raised when a section is repeated in an input source.
Fred Drake8d5dd982002-12-30 23:51:45 +0000168
Fred Drakea4923622010-08-09 12:52:45 +0000169 Possible repetitions that raise this exception are: multiple creation
170 using the API or in strict parsers when a section is found more than once
171 in a single input file, string or dictionary.
172 """
173
174 def __init__(self, section, source=None, lineno=None):
175 msg = [repr(section), " already exists"]
176 if source is not None:
Łukasz Langaf9b4eb42013-06-23 19:10:25 +0200177 message = ["While reading from ", repr(source)]
Fred Drakea4923622010-08-09 12:52:45 +0000178 if lineno is not None:
179 message.append(" [line {0:2d}]".format(lineno))
180 message.append(": section ")
181 message.extend(msg)
182 msg = message
183 else:
184 msg.insert(0, "Section ")
185 Error.__init__(self, "".join(msg))
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000186 self.section = section
Fred Drakea4923622010-08-09 12:52:45 +0000187 self.source = source
188 self.lineno = lineno
189 self.args = (section, source, lineno)
190
191
192class DuplicateOptionError(Error):
193 """Raised by strict parsers when an option is repeated in an input source.
194
195 Current implementation raises this exception only when an option is found
196 more than once in a single file, string or dictionary.
197 """
198
199 def __init__(self, section, option, source=None, lineno=None):
200 msg = [repr(option), " in section ", repr(section),
201 " already exists"]
202 if source is not None:
Łukasz Langaf9b4eb42013-06-23 19:10:25 +0200203 message = ["While reading from ", repr(source)]
Fred Drakea4923622010-08-09 12:52:45 +0000204 if lineno is not None:
205 message.append(" [line {0:2d}]".format(lineno))
206 message.append(": option ")
207 message.extend(msg)
208 msg = message
209 else:
210 msg.insert(0, "Option ")
211 Error.__init__(self, "".join(msg))
212 self.section = section
213 self.option = option
214 self.source = source
215 self.lineno = lineno
216 self.args = (section, option, source, lineno)
Guido van Rossum3d209861997-12-09 16:10:31 +0000217
Georg Brandl96a60ae2010-07-28 13:13:46 +0000218
Guido van Rossum3d209861997-12-09 16:10:31 +0000219class NoOptionError(Error):
Fred Drake8d5dd982002-12-30 23:51:45 +0000220 """A requested option was not found."""
221
Guido van Rossum3d209861997-12-09 16:10:31 +0000222 def __init__(self, option, section):
Fred Drakee2c64912002-12-31 17:23:27 +0000223 Error.__init__(self, "No option %r in section: %r" %
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000224 (option, section))
225 self.option = option
226 self.section = section
Michael Foordbd6c0792010-07-25 23:09:25 +0000227 self.args = (option, section)
Guido van Rossum3d209861997-12-09 16:10:31 +0000228
Georg Brandl96a60ae2010-07-28 13:13:46 +0000229
Guido van Rossum3d209861997-12-09 16:10:31 +0000230class InterpolationError(Error):
Fred Drakee2c64912002-12-31 17:23:27 +0000231 """Base class for interpolation-related exceptions."""
Fred Drake8d5dd982002-12-30 23:51:45 +0000232
Fred Drakee2c64912002-12-31 17:23:27 +0000233 def __init__(self, option, section, msg):
234 Error.__init__(self, msg)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000235 self.option = option
236 self.section = section
Michael Foordbd6c0792010-07-25 23:09:25 +0000237 self.args = (option, section, msg)
Guido van Rossum3d209861997-12-09 16:10:31 +0000238
Georg Brandl96a60ae2010-07-28 13:13:46 +0000239
Fred Drakee2c64912002-12-31 17:23:27 +0000240class InterpolationMissingOptionError(InterpolationError):
241 """A string substitution required a setting which was not available."""
242
243 def __init__(self, option, section, rawval, reference):
244 msg = ("Bad value substitution:\n"
245 "\tsection: [%s]\n"
246 "\toption : %s\n"
247 "\tkey : %s\n"
248 "\trawval : %s\n"
249 % (section, option, reference, rawval))
250 InterpolationError.__init__(self, option, section, msg)
251 self.reference = reference
Michael Foordbd6c0792010-07-25 23:09:25 +0000252 self.args = (option, section, rawval, reference)
Fred Drakee2c64912002-12-31 17:23:27 +0000253
Georg Brandl96a60ae2010-07-28 13:13:46 +0000254
Fred Drakee2c64912002-12-31 17:23:27 +0000255class InterpolationSyntaxError(InterpolationError):
Fred Drakea4923622010-08-09 12:52:45 +0000256 """Raised when the source text contains invalid syntax.
257
Łukasz Langa7f64c8a2010-12-16 01:16:22 +0000258 Current implementation raises this exception when the source text into
259 which substitutions are made does not conform to the required syntax.
Fred Drakea4923622010-08-09 12:52:45 +0000260 """
Neal Norwitzce1d9442002-12-30 23:38:47 +0000261
Georg Brandl96a60ae2010-07-28 13:13:46 +0000262
Fred Drakee2c64912002-12-31 17:23:27 +0000263class InterpolationDepthError(InterpolationError):
Fred Drake8d5dd982002-12-30 23:51:45 +0000264 """Raised when substitutions are nested too deeply."""
265
Fred Drake2a37f9f2000-09-27 22:43:54 +0000266 def __init__(self, option, section, rawval):
Fred Drakee2c64912002-12-31 17:23:27 +0000267 msg = ("Value interpolation too deeply recursive:\n"
268 "\tsection: [%s]\n"
269 "\toption : %s\n"
270 "\trawval : %s\n"
271 % (section, option, rawval))
272 InterpolationError.__init__(self, option, section, msg)
Michael Foordbd6c0792010-07-25 23:09:25 +0000273 self.args = (option, section, rawval)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000274
Georg Brandl96a60ae2010-07-28 13:13:46 +0000275
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000276class ParsingError(Error):
Fred Drake8d5dd982002-12-30 23:51:45 +0000277 """Raised when a configuration file does not follow legal syntax."""
278
Fred Drakea4923622010-08-09 12:52:45 +0000279 def __init__(self, source=None, filename=None):
280 # Exactly one of `source'/`filename' arguments has to be given.
281 # `filename' kept for compatibility.
282 if filename and source:
283 raise ValueError("Cannot specify both `filename' and `source'. "
284 "Use `source'.")
285 elif not filename and not source:
286 raise ValueError("Required argument `source' not given.")
287 elif filename:
288 source = filename
Serhiy Storchakabc27a052014-02-06 22:49:45 +0200289 Error.__init__(self, 'Source contains parsing errors: %r' % source)
Fred Drakea4923622010-08-09 12:52:45 +0000290 self.source = source
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000291 self.errors = []
Fred Drakea4923622010-08-09 12:52:45 +0000292 self.args = (source, )
293
294 @property
295 def filename(self):
296 """Deprecated, use `source'."""
297 warnings.warn(
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000298 "The 'filename' attribute will be removed in future versions. "
Fred Drakea4923622010-08-09 12:52:45 +0000299 "Use 'source' instead.",
Łukasz Langa49afa382010-11-11 19:53:23 +0000300 DeprecationWarning, stacklevel=2
Fred Drakea4923622010-08-09 12:52:45 +0000301 )
302 return self.source
303
304 @filename.setter
305 def filename(self, value):
306 """Deprecated, user `source'."""
307 warnings.warn(
308 "The 'filename' attribute will be removed in future versions. "
309 "Use 'source' instead.",
Łukasz Langa49afa382010-11-11 19:53:23 +0000310 DeprecationWarning, stacklevel=2
Fred Drakea4923622010-08-09 12:52:45 +0000311 )
312 self.source = value
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000313
314 def append(self, lineno, line):
315 self.errors.append((lineno, line))
Fred Drakee2c64912002-12-31 17:23:27 +0000316 self.message += '\n\t[line %2d]: %s' % (lineno, line)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000317
Georg Brandl96a60ae2010-07-28 13:13:46 +0000318
Fred Drake2a37f9f2000-09-27 22:43:54 +0000319class MissingSectionHeaderError(ParsingError):
Fred Drake8d5dd982002-12-30 23:51:45 +0000320 """Raised when a key-value pair is found before any section header."""
321
Fred Drake2a37f9f2000-09-27 22:43:54 +0000322 def __init__(self, filename, lineno, line):
323 Error.__init__(
324 self,
Serhiy Storchakabc27a052014-02-06 22:49:45 +0200325 'File contains no section headers.\nfile: %r, line: %d\n%r' %
Fred Drake2a37f9f2000-09-27 22:43:54 +0000326 (filename, lineno, line))
Fred Drakea4923622010-08-09 12:52:45 +0000327 self.source = filename
Fred Drake2a37f9f2000-09-27 22:43:54 +0000328 self.lineno = lineno
329 self.line = line
Michael Foordbd6c0792010-07-25 23:09:25 +0000330 self.args = (filename, lineno, line)
Guido van Rossum3d209861997-12-09 16:10:31 +0000331
Georg Brandl96a60ae2010-07-28 13:13:46 +0000332
Fred Drakecc645b92010-09-04 04:35:34 +0000333# Used in parser getters to indicate the default behaviour when a specific
334# option is not found it to raise an exception. Created to enable `None' as
335# a valid fallback value.
336_UNSET = object()
337
338
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000339class Interpolation:
340 """Dummy interpolation that passes the value through with no changes."""
341
342 def before_get(self, parser, section, option, value, defaults):
343 return value
344
345 def before_set(self, parser, section, option, value):
346 return value
347
348 def before_read(self, parser, section, option, value):
349 return value
350
351 def before_write(self, parser, section, option, value):
352 return value
353
354
355class BasicInterpolation(Interpolation):
Łukasz Langa7f64c8a2010-12-16 01:16:22 +0000356 """Interpolation as implemented in the classic ConfigParser.
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000357
358 The option values can contain format strings which refer to other values in
359 the same section, or values in the special default section.
360
361 For example:
362
363 something: %(dir)s/whatever
364
365 would resolve the "%(dir)s" to the value of dir. All reference
366 expansions are done late, on demand. If a user needs to use a bare % in
Ezio Melottie130a522011-10-19 10:58:56 +0300367 a configuration file, she can escape it by writing %%. Other % usage
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000368 is considered a user error and raises `InterpolationSyntaxError'."""
369
370 _KEYCRE = re.compile(r"%\(([^)]+)\)s")
371
372 def before_get(self, parser, section, option, value, defaults):
373 L = []
374 self._interpolate_some(parser, option, L, value, section, defaults, 1)
375 return ''.join(L)
376
377 def before_set(self, parser, section, option, value):
378 tmp_value = value.replace('%%', '') # escaped percent signs
379 tmp_value = self._KEYCRE.sub('', tmp_value) # valid syntax
380 if '%' in tmp_value:
381 raise ValueError("invalid interpolation syntax in %r at "
382 "position %d" % (value, tmp_value.find('%')))
383 return value
384
385 def _interpolate_some(self, parser, option, accum, rest, section, map,
386 depth):
387 if depth > MAX_INTERPOLATION_DEPTH:
388 raise InterpolationDepthError(option, section, rest)
389 while rest:
390 p = rest.find("%")
391 if p < 0:
392 accum.append(rest)
393 return
394 if p > 0:
395 accum.append(rest[:p])
396 rest = rest[p:]
397 # p is no longer used
398 c = rest[1:2]
399 if c == "%":
400 accum.append("%")
401 rest = rest[2:]
402 elif c == "(":
403 m = self._KEYCRE.match(rest)
404 if m is None:
405 raise InterpolationSyntaxError(option, section,
406 "bad interpolation variable reference %r" % rest)
407 var = parser.optionxform(m.group(1))
408 rest = rest[m.end():]
409 try:
410 v = map[var]
411 except KeyError:
412 raise InterpolationMissingOptionError(
413 option, section, rest, var)
414 if "%" in v:
415 self._interpolate_some(parser, option, accum, v,
416 section, map, depth + 1)
417 else:
418 accum.append(v)
419 else:
420 raise InterpolationSyntaxError(
421 option, section,
422 "'%%' must be followed by '%%' or '(', "
423 "found: %r" % (rest,))
424
425
426class ExtendedInterpolation(Interpolation):
427 """Advanced variant of interpolation, supports the syntax used by
428 `zc.buildout'. Enables interpolation between sections."""
429
430 _KEYCRE = re.compile(r"\$\{([^}]+)\}")
431
432 def before_get(self, parser, section, option, value, defaults):
433 L = []
434 self._interpolate_some(parser, option, L, value, section, defaults, 1)
435 return ''.join(L)
436
437 def before_set(self, parser, section, option, value):
438 tmp_value = value.replace('$$', '') # escaped dollar signs
439 tmp_value = self._KEYCRE.sub('', tmp_value) # valid syntax
440 if '$' in tmp_value:
441 raise ValueError("invalid interpolation syntax in %r at "
Łukasz Langafa608182013-04-24 01:25:18 +0200442 "position %d" % (value, tmp_value.find('$')))
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000443 return value
444
445 def _interpolate_some(self, parser, option, accum, rest, section, map,
446 depth):
447 if depth > MAX_INTERPOLATION_DEPTH:
448 raise InterpolationDepthError(option, section, rest)
449 while rest:
450 p = rest.find("$")
451 if p < 0:
452 accum.append(rest)
453 return
454 if p > 0:
455 accum.append(rest[:p])
456 rest = rest[p:]
457 # p is no longer used
458 c = rest[1:2]
459 if c == "$":
460 accum.append("$")
461 rest = rest[2:]
462 elif c == "{":
463 m = self._KEYCRE.match(rest)
464 if m is None:
465 raise InterpolationSyntaxError(option, section,
466 "bad interpolation variable reference %r" % rest)
Łukasz Langae698cd52011-04-28 10:58:57 +0200467 path = m.group(1).split(':')
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000468 rest = rest[m.end():]
469 sect = section
470 opt = option
471 try:
472 if len(path) == 1:
Łukasz Langae698cd52011-04-28 10:58:57 +0200473 opt = parser.optionxform(path[0])
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000474 v = map[opt]
475 elif len(path) == 2:
476 sect = path[0]
Łukasz Langae698cd52011-04-28 10:58:57 +0200477 opt = parser.optionxform(path[1])
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000478 v = parser.get(sect, opt, raw=True)
479 else:
480 raise InterpolationSyntaxError(
481 option, section,
482 "More than one ':' found: %r" % (rest,))
Łukasz Langa71b37a52010-12-17 21:56:32 +0000483 except (KeyError, NoSectionError, NoOptionError):
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000484 raise InterpolationMissingOptionError(
Łukasz Langa71b37a52010-12-17 21:56:32 +0000485 option, section, rest, ":".join(path))
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000486 if "$" in v:
487 self._interpolate_some(parser, opt, accum, v, sect,
488 dict(parser.items(sect, raw=True)),
489 depth + 1)
490 else:
491 accum.append(v)
492 else:
493 raise InterpolationSyntaxError(
494 option, section,
495 "'$' must be followed by '$' or '{', "
496 "found: %r" % (rest,))
497
498
Łukasz Langa7f64c8a2010-12-16 01:16:22 +0000499class LegacyInterpolation(Interpolation):
500 """Deprecated interpolation used in old versions of ConfigParser.
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000501 Use BasicInterpolation or ExtendedInterpolation instead."""
502
503 _KEYCRE = re.compile(r"%\(([^)]*)\)s|.")
504
505 def before_get(self, parser, section, option, value, vars):
506 rawval = value
507 depth = MAX_INTERPOLATION_DEPTH
508 while depth: # Loop through this until it's done
509 depth -= 1
510 if value and "%(" in value:
511 replace = functools.partial(self._interpolation_replace,
512 parser=parser)
513 value = self._KEYCRE.sub(replace, value)
514 try:
515 value = value % vars
516 except KeyError as e:
517 raise InterpolationMissingOptionError(
518 option, section, rawval, e.args[0])
519 else:
520 break
521 if value and "%(" in value:
522 raise InterpolationDepthError(option, section, rawval)
523 return value
524
525 def before_set(self, parser, section, option, value):
526 return value
527
528 @staticmethod
529 def _interpolation_replace(match, parser):
530 s = match.group(1)
531 if s is None:
532 return match.group()
533 else:
534 return "%%(%s)s" % parser.optionxform(s)
535
536
Łukasz Langa26d513c2010-11-10 18:57:39 +0000537class RawConfigParser(MutableMapping):
Georg Brandl96a60ae2010-07-28 13:13:46 +0000538 """ConfigParser that does not do interpolation."""
539
540 # Regular expressions for parsing section headers and options
541 _SECT_TMPL = r"""
542 \[ # [
543 (?P<header>[^]]+) # very permissive!
544 \] # ]
545 """
546 _OPT_TMPL = r"""
547 (?P<option>.*?) # very permissive!
548 \s*(?P<vi>{delim})\s* # any number of space/tab,
549 # followed by any of the
550 # allowed delimiters,
551 # followed by any space/tab
552 (?P<value>.*)$ # everything up to eol
553 """
554 _OPT_NV_TMPL = r"""
555 (?P<option>.*?) # very permissive!
556 \s*(?: # any number of space/tab,
557 (?P<vi>{delim})\s* # optionally followed by
558 # any of the allowed
559 # delimiters, followed by any
560 # space/tab
561 (?P<value>.*))?$ # everything up to eol
562 """
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000563 # Interpolation algorithm to be used if the user does not specify another
564 _DEFAULT_INTERPOLATION = Interpolation()
Georg Brandl96a60ae2010-07-28 13:13:46 +0000565 # Compiled regular expression for matching sections
566 SECTCRE = re.compile(_SECT_TMPL, re.VERBOSE)
567 # Compiled regular expression for matching options with typical separators
568 OPTCRE = re.compile(_OPT_TMPL.format(delim="=|:"), re.VERBOSE)
569 # Compiled regular expression for matching options with optional values
570 # delimited using typical separators
571 OPTCRE_NV = re.compile(_OPT_NV_TMPL.format(delim="=|:"), re.VERBOSE)
572 # Compiled regular expression for matching leading whitespace in a line
573 NONSPACECRE = re.compile(r"\S")
Fred Drakecc645b92010-09-04 04:35:34 +0000574 # Possible boolean values in the configuration.
575 BOOLEAN_STATES = {'1': True, 'yes': True, 'true': True, 'on': True,
576 '0': False, 'no': False, 'false': False, 'off': False}
Georg Brandl96a60ae2010-07-28 13:13:46 +0000577
Fred Drake03c44a32010-02-19 06:08:41 +0000578 def __init__(self, defaults=None, dict_type=_default_dict,
Fred Drakea4923622010-08-09 12:52:45 +0000579 allow_no_value=False, *, delimiters=('=', ':'),
Łukasz Langab25a7912010-12-17 01:32:29 +0000580 comment_prefixes=('#', ';'), inline_comment_prefixes=None,
581 strict=True, empty_lines_in_values=True,
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000582 default_section=DEFAULTSECT,
583 interpolation=_UNSET):
584
Thomas Wouters89f507f2006-12-13 04:49:30 +0000585 self._dict = dict_type
586 self._sections = self._dict()
587 self._defaults = self._dict()
Łukasz Langa49afa382010-11-11 19:53:23 +0000588 self._proxies = self._dict()
Łukasz Langac264c092010-11-20 16:15:37 +0000589 self._proxies[default_section] = SectionProxy(self, default_section)
David Goodger68a1abd2004-10-03 15:40:25 +0000590 if defaults:
591 for key, value in defaults.items():
592 self._defaults[self.optionxform(key)] = value
Georg Brandl96a60ae2010-07-28 13:13:46 +0000593 self._delimiters = tuple(delimiters)
594 if delimiters == ('=', ':'):
595 self._optcre = self.OPTCRE_NV if allow_no_value else self.OPTCRE
596 else:
Fred Drakea4923622010-08-09 12:52:45 +0000597 d = "|".join(re.escape(d) for d in delimiters)
Georg Brandl96a60ae2010-07-28 13:13:46 +0000598 if allow_no_value:
Fred Drakea4923622010-08-09 12:52:45 +0000599 self._optcre = re.compile(self._OPT_NV_TMPL.format(delim=d),
Georg Brandl96a60ae2010-07-28 13:13:46 +0000600 re.VERBOSE)
601 else:
Fred Drakea4923622010-08-09 12:52:45 +0000602 self._optcre = re.compile(self._OPT_TMPL.format(delim=d),
Georg Brandl96a60ae2010-07-28 13:13:46 +0000603 re.VERBOSE)
Łukasz Langab25a7912010-12-17 01:32:29 +0000604 self._comment_prefixes = tuple(comment_prefixes or ())
605 self._inline_comment_prefixes = tuple(inline_comment_prefixes or ())
Fred Drakea4923622010-08-09 12:52:45 +0000606 self._strict = strict
Łukasz Langa26d513c2010-11-10 18:57:39 +0000607 self._allow_no_value = allow_no_value
Georg Brandl96a60ae2010-07-28 13:13:46 +0000608 self._empty_lines_in_values = empty_lines_in_values
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000609 self.default_section=default_section
Łukasz Langa1aa422f2011-04-28 17:03:45 +0200610 self._interpolation = interpolation
611 if self._interpolation is _UNSET:
612 self._interpolation = self._DEFAULT_INTERPOLATION
613 if self._interpolation is None:
614 self._interpolation = Interpolation()
Guido van Rossum3d209861997-12-09 16:10:31 +0000615
616 def defaults(self):
Fred Drakefce65572002-10-25 18:08:18 +0000617 return self._defaults
Guido van Rossum3d209861997-12-09 16:10:31 +0000618
619 def sections(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000620 """Return a list of section names, excluding [DEFAULT]"""
Fred Drakefce65572002-10-25 18:08:18 +0000621 # self._sections will never have [DEFAULT] in it
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000622 return list(self._sections.keys())
Guido van Rossum3d209861997-12-09 16:10:31 +0000623
624 def add_section(self, section):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000625 """Create a new section in the configuration.
Guido van Rossum3d209861997-12-09 16:10:31 +0000626
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000627 Raise DuplicateSectionError if a section by the specified name
Łukasz Langac264c092010-11-20 16:15:37 +0000628 already exists. Raise ValueError if name is DEFAULT.
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000629 """
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000630 if section == self.default_section:
Łukasz Langa3a11e712010-12-03 22:15:19 +0000631 raise ValueError('Invalid section name: %r' % section)
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000632
Fred Drakefce65572002-10-25 18:08:18 +0000633 if section in self._sections:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000634 raise DuplicateSectionError(section)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000635 self._sections[section] = self._dict()
Łukasz Langa49afa382010-11-11 19:53:23 +0000636 self._proxies[section] = SectionProxy(self, section)
Guido van Rossum3d209861997-12-09 16:10:31 +0000637
638 def has_section(self, section):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000639 """Indicate whether the named section is present in the configuration.
Guido van Rossum3d209861997-12-09 16:10:31 +0000640
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000641 The DEFAULT section is not acknowledged.
642 """
Fred Drakefce65572002-10-25 18:08:18 +0000643 return section in self._sections
Guido van Rossum3d209861997-12-09 16:10:31 +0000644
645 def options(self, section):
Guido van Rossuma5a24b71999-10-04 19:58:22 +0000646 """Return a list of option names for the given section name."""
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000647 try:
Fred Drakefce65572002-10-25 18:08:18 +0000648 opts = self._sections[section].copy()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000649 except KeyError:
650 raise NoSectionError(section)
Fred Drakefce65572002-10-25 18:08:18 +0000651 opts.update(self._defaults)
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000652 return list(opts.keys())
Guido van Rossum3d209861997-12-09 16:10:31 +0000653
Georg Brandl8dcaa732010-07-29 12:17:40 +0000654 def read(self, filenames, encoding=None):
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000655 """Read and parse a filename or a list of filenames.
Tim Peters88869f92001-01-14 23:36:06 +0000656
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000657 Files that cannot be opened are silently ignored; this is
Barry Warsaw25394511999-10-12 16:12:48 +0000658 designed so that you can specify a list of potential
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000659 configuration file locations (e.g. current directory, user's
660 home directory, systemwide directory), and all existing
661 configuration files in the list will be read. A single
662 filename may also be given.
Fred Drake82903142004-05-18 04:24:02 +0000663
664 Return list of successfully read files.
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000665 """
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000666 if isinstance(filenames, str):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000667 filenames = [filenames]
Fred Drake82903142004-05-18 04:24:02 +0000668 read_ok = []
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000669 for filename in filenames:
670 try:
Florent Xicluna42d54452010-09-22 22:35:38 +0000671 with open(filename, encoding=encoding) as fp:
672 self._read(fp, filename)
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200673 except OSError:
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000674 continue
Fred Drake82903142004-05-18 04:24:02 +0000675 read_ok.append(filename)
676 return read_ok
Guido van Rossum3d209861997-12-09 16:10:31 +0000677
Fred Drakea4923622010-08-09 12:52:45 +0000678 def read_file(self, f, source=None):
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000679 """Like read() but the argument must be a file-like object.
680
Łukasz Langadaab1c82011-04-27 18:10:05 +0200681 The `f' argument must be iterable, returning one line at a time.
682 Optional second argument is the `source' specifying the name of the
683 file being read. If not given, it is taken from f.name. If `f' has no
684 `name' attribute, `<???>' is used.
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000685 """
Fred Drakea4923622010-08-09 12:52:45 +0000686 if source is None:
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000687 try:
Florent Xicluna42d54452010-09-22 22:35:38 +0000688 source = f.name
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000689 except AttributeError:
Fred Drakea4923622010-08-09 12:52:45 +0000690 source = '<???>'
691 self._read(f, source)
692
693 def read_string(self, string, source='<string>'):
694 """Read configuration from a given string."""
695 sfile = io.StringIO(string)
696 self.read_file(sfile, source)
697
698 def read_dict(self, dictionary, source='<dict>'):
699 """Read configuration from a dictionary.
700
701 Keys are section names, values are dictionaries with keys and values
702 that should be present in the section. If the used dictionary type
703 preserves order, sections and their keys will be added in order.
704
Łukasz Langa2cf9ddb2010-12-04 12:46:01 +0000705 All types held in the dictionary are converted to strings during
706 reading, including section names, option names and keys.
707
Fred Drakea4923622010-08-09 12:52:45 +0000708 Optional second argument is the `source' specifying the name of the
709 dictionary being read.
710 """
711 elements_added = set()
712 for section, keys in dictionary.items():
Łukasz Langa2cf9ddb2010-12-04 12:46:01 +0000713 section = str(section)
Fred Drakea4923622010-08-09 12:52:45 +0000714 try:
715 self.add_section(section)
Łukasz Langa26d513c2010-11-10 18:57:39 +0000716 except (DuplicateSectionError, ValueError):
Fred Drakea4923622010-08-09 12:52:45 +0000717 if self._strict and section in elements_added:
718 raise
Łukasz Langa71b37a52010-12-17 21:56:32 +0000719 elements_added.add(section)
Fred Drakea4923622010-08-09 12:52:45 +0000720 for key, value in keys.items():
Łukasz Langa2cf9ddb2010-12-04 12:46:01 +0000721 key = self.optionxform(str(key))
Fred Drakecc645b92010-09-04 04:35:34 +0000722 if value is not None:
723 value = str(value)
Fred Drakea4923622010-08-09 12:52:45 +0000724 if self._strict and (section, key) in elements_added:
725 raise DuplicateOptionError(section, key, source)
726 elements_added.add((section, key))
727 self.set(section, key, value)
728
729 def readfp(self, fp, filename=None):
730 """Deprecated, use read_file instead."""
731 warnings.warn(
732 "This method will be removed in future versions. "
733 "Use 'parser.read_file()' instead.",
Łukasz Langa49afa382010-11-11 19:53:23 +0000734 DeprecationWarning, stacklevel=2
Fred Drakea4923622010-08-09 12:52:45 +0000735 )
736 self.read_file(fp, source=filename)
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000737
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000738 def get(self, section, option, *, raw=False, vars=None, fallback=_UNSET):
Fred Drakecc645b92010-09-04 04:35:34 +0000739 """Get an option value for a given section.
740
741 If `vars' is provided, it must be a dictionary. The option is looked up
742 in `vars' (if provided), `section', and in `DEFAULTSECT' in that order.
Łukasz Langa26d513c2010-11-10 18:57:39 +0000743 If the key is not found and `fallback' is provided, it is used as
744 a fallback value. `None' can be provided as a `fallback' value.
745
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000746 If interpolation is enabled and the optional argument `raw' is False,
747 all interpolations are expanded in the return values.
748
749 Arguments `raw', `vars', and `fallback' are keyword only.
750
751 The section DEFAULT is special.
Fred Drakecc645b92010-09-04 04:35:34 +0000752 """
753 try:
754 d = self._unify_values(section, vars)
755 except NoSectionError:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000756 if fallback is _UNSET:
Fred Drakecc645b92010-09-04 04:35:34 +0000757 raise
Fred Drakefce65572002-10-25 18:08:18 +0000758 else:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000759 return fallback
Fred Drakecc645b92010-09-04 04:35:34 +0000760 option = self.optionxform(option)
761 try:
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000762 value = d[option]
Fred Drakecc645b92010-09-04 04:35:34 +0000763 except KeyError:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000764 if fallback is _UNSET:
Fred Drakefce65572002-10-25 18:08:18 +0000765 raise NoOptionError(option, section)
Fred Drakecc645b92010-09-04 04:35:34 +0000766 else:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000767 return fallback
Fred Drake2a37f9f2000-09-27 22:43:54 +0000768
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000769 if raw or value is None:
770 return value
771 else:
772 return self._interpolation.before_get(self, section, option, value,
773 d)
Fred Drake2ca041f2002-09-27 15:49:56 +0000774
Łukasz Langa26d513c2010-11-10 18:57:39 +0000775 def _get(self, section, conv, option, **kwargs):
776 return conv(self.get(section, option, **kwargs))
Guido van Rossum3d209861997-12-09 16:10:31 +0000777
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000778 def getint(self, section, option, *, raw=False, vars=None,
779 fallback=_UNSET):
Fred Drakecc645b92010-09-04 04:35:34 +0000780 try:
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000781 return self._get(section, int, option, raw=raw, vars=vars)
Fred Drakecc645b92010-09-04 04:35:34 +0000782 except (NoSectionError, NoOptionError):
Łukasz Langa26d513c2010-11-10 18:57:39 +0000783 if fallback is _UNSET:
Fred Drakecc645b92010-09-04 04:35:34 +0000784 raise
785 else:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000786 return fallback
Guido van Rossum3d209861997-12-09 16:10:31 +0000787
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000788 def getfloat(self, section, option, *, raw=False, vars=None,
789 fallback=_UNSET):
Fred Drakecc645b92010-09-04 04:35:34 +0000790 try:
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000791 return self._get(section, float, option, raw=raw, vars=vars)
Fred Drakecc645b92010-09-04 04:35:34 +0000792 except (NoSectionError, NoOptionError):
Łukasz Langa26d513c2010-11-10 18:57:39 +0000793 if fallback is _UNSET:
Fred Drakecc645b92010-09-04 04:35:34 +0000794 raise
795 else:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000796 return fallback
Guido van Rossum3d209861997-12-09 16:10:31 +0000797
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000798 def getboolean(self, section, option, *, raw=False, vars=None,
799 fallback=_UNSET):
Fred Drakecc645b92010-09-04 04:35:34 +0000800 try:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000801 return self._get(section, self._convert_to_boolean, option,
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000802 raw=raw, vars=vars)
Fred Drakecc645b92010-09-04 04:35:34 +0000803 except (NoSectionError, NoOptionError):
Łukasz Langa26d513c2010-11-10 18:57:39 +0000804 if fallback is _UNSET:
Fred Drakecc645b92010-09-04 04:35:34 +0000805 raise
806 else:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000807 return fallback
Guido van Rossum3d209861997-12-09 16:10:31 +0000808
Łukasz Langa71b37a52010-12-17 21:56:32 +0000809 def items(self, section=_UNSET, raw=False, vars=None):
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000810 """Return a list of (name, value) tuples for each option in a section.
811
812 All % interpolations are expanded in the return values, based on the
813 defaults passed into the constructor, unless the optional argument
814 `raw' is true. Additional substitutions may be provided using the
815 `vars' argument, which must be a dictionary whose contents overrides
816 any pre-existing defaults.
817
818 The section DEFAULT is special.
819 """
Łukasz Langa71b37a52010-12-17 21:56:32 +0000820 if section is _UNSET:
821 return super().items()
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000822 d = self._defaults.copy()
823 try:
824 d.update(self._sections[section])
825 except KeyError:
826 if section != self.default_section:
827 raise NoSectionError(section)
828 # Update with the entry specific variables
829 if vars:
830 for key, value in vars.items():
831 d[self.optionxform(key)] = value
Łukasz Langa24bcc612010-12-04 11:48:11 +0000832 value_getter = lambda option: self._interpolation.before_get(self,
833 section, option, d[option], d)
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000834 if raw:
Łukasz Langa24bcc612010-12-04 11:48:11 +0000835 value_getter = lambda option: d[option]
836 return [(option, value_getter(option)) for option in d.keys()]
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000837
Łukasz Langa3a8479a2012-12-31 03:38:39 +0100838 def popitem(self):
839 """Remove a section from the parser and return it as
840 a (section_name, section_proxy) tuple. If no section is present, raise
841 KeyError.
842
843 The section DEFAULT is never returned because it cannot be removed.
844 """
845 for key in self.sections():
846 value = self[key]
847 del self[key]
848 return key, value
849 raise KeyError
850
Guido van Rossum9e480ad1999-06-17 18:41:42 +0000851 def optionxform(self, optionstr):
Eric S. Raymond9eb54d92001-02-09 05:19:09 +0000852 return optionstr.lower()
Guido van Rossum9e480ad1999-06-17 18:41:42 +0000853
Eric S. Raymond417c4892000-07-10 18:11:00 +0000854 def has_option(self, section, option):
Łukasz Langa71b37a52010-12-17 21:56:32 +0000855 """Check for the existence of a given option in a given section.
856 If the specified `section' is None or an empty string, DEFAULT is
857 assumed. If the specified `section' does not exist, returns False."""
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000858 if not section or section == self.default_section:
Fred Drakec2ff9052002-09-27 15:33:11 +0000859 option = self.optionxform(option)
Fred Drakefce65572002-10-25 18:08:18 +0000860 return option in self._defaults
861 elif section not in self._sections:
Neal Norwitzf680cc42002-12-17 01:56:47 +0000862 return False
Eric S. Raymond417c4892000-07-10 18:11:00 +0000863 else:
Fred Drake3c823aa2001-02-26 21:55:34 +0000864 option = self.optionxform(option)
Fred Drakefce65572002-10-25 18:08:18 +0000865 return (option in self._sections[section]
866 or option in self._defaults)
Eric S. Raymond417c4892000-07-10 18:11:00 +0000867
Fred Drake03c44a32010-02-19 06:08:41 +0000868 def set(self, section, option, value=None):
Eric S. Raymond417c4892000-07-10 18:11:00 +0000869 """Set an option."""
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000870 if value:
871 value = self._interpolation.before_set(self, section, option,
872 value)
873 if not section or section == self.default_section:
Fred Drakefce65572002-10-25 18:08:18 +0000874 sectdict = self._defaults
Eric S. Raymond417c4892000-07-10 18:11:00 +0000875 else:
876 try:
Fred Drakefce65572002-10-25 18:08:18 +0000877 sectdict = self._sections[section]
Eric S. Raymond417c4892000-07-10 18:11:00 +0000878 except KeyError:
879 raise NoSectionError(section)
Fred Drakec2ff9052002-09-27 15:33:11 +0000880 sectdict[self.optionxform(option)] = value
Eric S. Raymond417c4892000-07-10 18:11:00 +0000881
Georg Brandl96a60ae2010-07-28 13:13:46 +0000882 def write(self, fp, space_around_delimiters=True):
883 """Write an .ini-format representation of the configuration state.
884
885 If `space_around_delimiters' is True (the default), delimiters
886 between keys and values are surrounded by spaces.
887 """
888 if space_around_delimiters:
889 d = " {} ".format(self._delimiters[0])
890 else:
891 d = self._delimiters[0]
Fred Drakefce65572002-10-25 18:08:18 +0000892 if self._defaults:
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000893 self._write_section(fp, self.default_section,
Łukasz Langac264c092010-11-20 16:15:37 +0000894 self._defaults.items(), d)
Fred Drakefce65572002-10-25 18:08:18 +0000895 for section in self._sections:
Georg Brandl96a60ae2010-07-28 13:13:46 +0000896 self._write_section(fp, section,
897 self._sections[section].items(), d)
898
899 def _write_section(self, fp, section_name, section_items, delimiter):
900 """Write a single section to the specified `fp'."""
901 fp.write("[{}]\n".format(section_name))
902 for key, value in section_items:
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000903 value = self._interpolation.before_write(self, section_name, key,
904 value)
Łukasz Langa26d513c2010-11-10 18:57:39 +0000905 if value is not None or not self._allow_no_value:
Georg Brandl96a60ae2010-07-28 13:13:46 +0000906 value = delimiter + str(value).replace('\n', '\n\t')
907 else:
908 value = ""
909 fp.write("{}{}\n".format(key, value))
910 fp.write("\n")
Eric S. Raymond417c4892000-07-10 18:11:00 +0000911
Thomas Woutersff4df6d2000-07-21 05:19:59 +0000912 def remove_option(self, section, option):
Eric S. Raymond649685a2000-07-14 14:28:22 +0000913 """Remove an option."""
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000914 if not section or section == self.default_section:
Fred Drakefce65572002-10-25 18:08:18 +0000915 sectdict = self._defaults
Eric S. Raymond649685a2000-07-14 14:28:22 +0000916 else:
917 try:
Fred Drakefce65572002-10-25 18:08:18 +0000918 sectdict = self._sections[section]
Eric S. Raymond649685a2000-07-14 14:28:22 +0000919 except KeyError:
920 raise NoSectionError(section)
Fred Drake3c823aa2001-02-26 21:55:34 +0000921 option = self.optionxform(option)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000922 existed = option in sectdict
Eric S. Raymond649685a2000-07-14 14:28:22 +0000923 if existed:
Fred Drakeff4a23b2000-12-04 16:29:13 +0000924 del sectdict[option]
Eric S. Raymond649685a2000-07-14 14:28:22 +0000925 return existed
926
Thomas Woutersff4df6d2000-07-21 05:19:59 +0000927 def remove_section(self, section):
Eric S. Raymond649685a2000-07-14 14:28:22 +0000928 """Remove a file section."""
Fred Drakefce65572002-10-25 18:08:18 +0000929 existed = section in self._sections
Fred Drakec2ff9052002-09-27 15:33:11 +0000930 if existed:
Fred Drakefce65572002-10-25 18:08:18 +0000931 del self._sections[section]
Łukasz Langa49afa382010-11-11 19:53:23 +0000932 del self._proxies[section]
Fred Drakec2ff9052002-09-27 15:33:11 +0000933 return existed
Eric S. Raymond649685a2000-07-14 14:28:22 +0000934
Łukasz Langa26d513c2010-11-10 18:57:39 +0000935 def __getitem__(self, key):
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000936 if key != self.default_section and not self.has_section(key):
Łukasz Langa26d513c2010-11-10 18:57:39 +0000937 raise KeyError(key)
Łukasz Langa49afa382010-11-11 19:53:23 +0000938 return self._proxies[key]
Łukasz Langa26d513c2010-11-10 18:57:39 +0000939
940 def __setitem__(self, key, value):
941 # To conform with the mapping protocol, overwrites existing values in
942 # the section.
943
944 # XXX this is not atomic if read_dict fails at any point. Then again,
945 # no update method in configparser is atomic in this implementation.
Łukasz Langa02101942012-12-31 13:55:11 +0100946 if key == self.default_section:
947 self._defaults.clear()
Łukasz Langaa821f822013-01-01 22:33:19 +0100948 elif key in self._sections:
949 self._sections[key].clear()
Łukasz Langa26d513c2010-11-10 18:57:39 +0000950 self.read_dict({key: value})
951
952 def __delitem__(self, key):
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000953 if key == self.default_section:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000954 raise ValueError("Cannot remove the default section.")
955 if not self.has_section(key):
956 raise KeyError(key)
957 self.remove_section(key)
958
959 def __contains__(self, key):
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000960 return key == self.default_section or self.has_section(key)
Łukasz Langa26d513c2010-11-10 18:57:39 +0000961
962 def __len__(self):
963 return len(self._sections) + 1 # the default section
964
965 def __iter__(self):
966 # XXX does it break when underlying container state changed?
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000967 return itertools.chain((self.default_section,), self._sections.keys())
Łukasz Langa26d513c2010-11-10 18:57:39 +0000968
Fred Drakefce65572002-10-25 18:08:18 +0000969 def _read(self, fp, fpname):
Georg Brandl96a60ae2010-07-28 13:13:46 +0000970 """Parse a sectioned configuration file.
Guido van Rossum3d209861997-12-09 16:10:31 +0000971
Fred Drakea4923622010-08-09 12:52:45 +0000972 Each section in a configuration file contains a header, indicated by
973 a name in square brackets (`[]'), plus key/value options, indicated by
Georg Brandl96a60ae2010-07-28 13:13:46 +0000974 `name' and `value' delimited with a specific substring (`=' or `:' by
975 default).
976
Fred Drakea4923622010-08-09 12:52:45 +0000977 Values can span multiple lines, as long as they are indented deeper
978 than the first line of the value. Depending on the parser's mode, blank
979 lines may be treated as parts of multiline values or ignored.
Georg Brandl96a60ae2010-07-28 13:13:46 +0000980
981 Configuration files may include comments, prefixed by specific
Fred Drakea4923622010-08-09 12:52:45 +0000982 characters (`#' and `;' by default). Comments may appear on their own
983 in an otherwise empty line or may be entered in lines holding values or
Georg Brandl96a60ae2010-07-28 13:13:46 +0000984 section names.
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000985 """
Fred Drakea4923622010-08-09 12:52:45 +0000986 elements_added = set()
Brian Curtin9a27b0c2010-07-26 00:27:10 +0000987 cursect = None # None, or a dictionary
Fred Drakea4923622010-08-09 12:52:45 +0000988 sectname = None
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000989 optname = None
990 lineno = 0
Georg Brandl96a60ae2010-07-28 13:13:46 +0000991 indent_level = 0
Brian Curtin9a27b0c2010-07-26 00:27:10 +0000992 e = None # None, or an exception
Georg Brandl96a60ae2010-07-28 13:13:46 +0000993 for lineno, line in enumerate(fp, start=1):
Łukasz Langacba24322012-07-07 18:54:08 +0200994 comment_start = sys.maxsize
Georg Brandl96a60ae2010-07-28 13:13:46 +0000995 # strip inline comments
Łukasz Langacba24322012-07-07 18:54:08 +0200996 inline_prefixes = {p: -1 for p in self._inline_comment_prefixes}
997 while comment_start == sys.maxsize and inline_prefixes:
998 next_prefixes = {}
999 for prefix, index in inline_prefixes.items():
1000 index = line.find(prefix, index+1)
1001 if index == -1:
1002 continue
1003 next_prefixes[prefix] = index
1004 if index == 0 or (index > 0 and line[index-1].isspace()):
1005 comment_start = min(comment_start, index)
1006 inline_prefixes = next_prefixes
Łukasz Langab25a7912010-12-17 01:32:29 +00001007 # strip full line comments
1008 for prefix in self._comment_prefixes:
1009 if line.strip().startswith(prefix):
1010 comment_start = 0
1011 break
Łukasz Langacba24322012-07-07 18:54:08 +02001012 if comment_start == sys.maxsize:
1013 comment_start = None
Georg Brandl96a60ae2010-07-28 13:13:46 +00001014 value = line[:comment_start].strip()
1015 if not value:
Georg Brandlf206d0e2010-07-29 11:56:20 +00001016 if self._empty_lines_in_values:
Georg Brandl96a60ae2010-07-28 13:13:46 +00001017 # add empty line to the value, but only if there was no
1018 # comment on the line
Georg Brandlf206d0e2010-07-29 11:56:20 +00001019 if (comment_start is None and
1020 cursect is not None and
1021 optname and
1022 cursect[optname] is not None):
1023 cursect[optname].append('') # newlines added at join
Georg Brandl96a60ae2010-07-28 13:13:46 +00001024 else:
1025 # empty line marks end of value
1026 indent_level = sys.maxsize
Guido van Rossum45e2fbc1998-03-26 21:13:24 +00001027 continue
1028 # continuation line?
Georg Brandl96a60ae2010-07-28 13:13:46 +00001029 first_nonspace = self.NONSPACECRE.search(line)
1030 cur_indent_level = first_nonspace.start() if first_nonspace else 0
1031 if (cursect is not None and optname and
1032 cur_indent_level > indent_level):
1033 cursect[optname].append(value)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +00001034 # a section header or option header?
Guido van Rossum45e2fbc1998-03-26 21:13:24 +00001035 else:
Georg Brandl96a60ae2010-07-28 13:13:46 +00001036 indent_level = cur_indent_level
Barry Warsawbfa3f6b1998-07-01 20:41:12 +00001037 # is it a section header?
Georg Brandl96a60ae2010-07-28 13:13:46 +00001038 mo = self.SECTCRE.match(value)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +00001039 if mo:
1040 sectname = mo.group('header')
Fred Drakefce65572002-10-25 18:08:18 +00001041 if sectname in self._sections:
Fred Drakea4923622010-08-09 12:52:45 +00001042 if self._strict and sectname in elements_added:
1043 raise DuplicateSectionError(sectname, fpname,
1044 lineno)
Fred Drakefce65572002-10-25 18:08:18 +00001045 cursect = self._sections[sectname]
Fred Drakea4923622010-08-09 12:52:45 +00001046 elements_added.add(sectname)
Łukasz Langab6a6f5f2010-12-03 16:28:00 +00001047 elif sectname == self.default_section:
Fred Drakefce65572002-10-25 18:08:18 +00001048 cursect = self._defaults
Barry Warsawbfa3f6b1998-07-01 20:41:12 +00001049 else:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001050 cursect = self._dict()
Fred Drakefce65572002-10-25 18:08:18 +00001051 self._sections[sectname] = cursect
Łukasz Langa49afa382010-11-11 19:53:23 +00001052 self._proxies[sectname] = SectionProxy(self, sectname)
Fred Drakea4923622010-08-09 12:52:45 +00001053 elements_added.add(sectname)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +00001054 # So sections can't start with a continuation line
1055 optname = None
1056 # no section header in the file?
1057 elif cursect is None:
Walter Dörwald70a6b492004-02-12 17:35:32 +00001058 raise MissingSectionHeaderError(fpname, lineno, line)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +00001059 # an option line?
1060 else:
Georg Brandl96a60ae2010-07-28 13:13:46 +00001061 mo = self._optcre.match(value)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +00001062 if mo:
Fred Drakec517b9b2000-02-28 20:59:03 +00001063 optname, vi, optval = mo.group('option', 'vi', 'value')
Georg Brandl96a60ae2010-07-28 13:13:46 +00001064 if not optname:
1065 e = self._handle_error(e, fpname, lineno, line)
Brian Curtin9a27b0c2010-07-26 00:27:10 +00001066 optname = self.optionxform(optname.rstrip())
Fred Drakea4923622010-08-09 12:52:45 +00001067 if (self._strict and
1068 (sectname, optname) in elements_added):
1069 raise DuplicateOptionError(sectname, optname,
1070 fpname, lineno)
1071 elements_added.add((sectname, optname))
Fred Drake03c44a32010-02-19 06:08:41 +00001072 # This check is fine because the OPTCRE cannot
1073 # match if it would set optval to None
1074 if optval is not None:
Fred Drake03c44a32010-02-19 06:08:41 +00001075 optval = optval.strip()
Brian Curtin9a27b0c2010-07-26 00:27:10 +00001076 cursect[optname] = [optval]
1077 else:
1078 # valueless option handling
Łukasz Langab6a6f5f2010-12-03 16:28:00 +00001079 cursect[optname] = None
Barry Warsawbfa3f6b1998-07-01 20:41:12 +00001080 else:
Georg Brandl96a60ae2010-07-28 13:13:46 +00001081 # a non-fatal parsing error occurred. set up the
Barry Warsawbfa3f6b1998-07-01 20:41:12 +00001082 # exception but keep going. the exception will be
1083 # raised at the end of the file and will contain a
1084 # list of all bogus lines
Georg Brandl96a60ae2010-07-28 13:13:46 +00001085 e = self._handle_error(e, fpname, lineno, line)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +00001086 # if any parsing errors occurred, raise an exception
1087 if e:
1088 raise e
Georg Brandl96a60ae2010-07-28 13:13:46 +00001089 self._join_multiline_values()
Fred Drakefce65572002-10-25 18:08:18 +00001090
Georg Brandl96a60ae2010-07-28 13:13:46 +00001091 def _join_multiline_values(self):
Łukasz Langab6a6f5f2010-12-03 16:28:00 +00001092 defaults = self.default_section, self._defaults
1093 all_sections = itertools.chain((defaults,),
1094 self._sections.items())
1095 for section, options in all_sections:
Brian Curtin9a27b0c2010-07-26 00:27:10 +00001096 for name, val in options.items():
1097 if isinstance(val, list):
Łukasz Langab6a6f5f2010-12-03 16:28:00 +00001098 val = '\n'.join(val).rstrip()
1099 options[name] = self._interpolation.before_read(self,
1100 section,
1101 name, val)
Fred Drakefce65572002-10-25 18:08:18 +00001102
Georg Brandl96a60ae2010-07-28 13:13:46 +00001103 def _handle_error(self, exc, fpname, lineno, line):
1104 if not exc:
1105 exc = ParsingError(fpname)
1106 exc.append(lineno, repr(line))
1107 return exc
1108
Fred Drakecc645b92010-09-04 04:35:34 +00001109 def _unify_values(self, section, vars):
Raymond Hettingerddb52402011-02-21 19:42:11 +00001110 """Create a sequence of lookups with 'vars' taking priority over
1111 the 'section' which takes priority over the DEFAULTSECT.
1112
Fred Drakefce65572002-10-25 18:08:18 +00001113 """
Raymond Hettingerddb52402011-02-21 19:42:11 +00001114 sectiondict = {}
Fred Drakefce65572002-10-25 18:08:18 +00001115 try:
Raymond Hettingerddb52402011-02-21 19:42:11 +00001116 sectiondict = self._sections[section]
Fred Drakefce65572002-10-25 18:08:18 +00001117 except KeyError:
Łukasz Langab6a6f5f2010-12-03 16:28:00 +00001118 if section != self.default_section:
Fred Drakefce65572002-10-25 18:08:18 +00001119 raise NoSectionError(section)
1120 # Update with the entry specific variables
Raymond Hettingerddb52402011-02-21 19:42:11 +00001121 vardict = {}
David Goodger68a1abd2004-10-03 15:40:25 +00001122 if vars:
1123 for key, value in vars.items():
Fred Drakecc645b92010-09-04 04:35:34 +00001124 if value is not None:
1125 value = str(value)
Raymond Hettingerddb52402011-02-21 19:42:11 +00001126 vardict[self.optionxform(key)] = value
1127 return _ChainMap(vardict, sectiondict, self._defaults)
Fred Drakecc645b92010-09-04 04:35:34 +00001128
1129 def _convert_to_boolean(self, value):
1130 """Return a boolean value translating from other types if necessary.
1131 """
1132 if value.lower() not in self.BOOLEAN_STATES:
1133 raise ValueError('Not a boolean: %s' % value)
1134 return self.BOOLEAN_STATES[value.lower()]
1135
Łukasz Langa2cf9ddb2010-12-04 12:46:01 +00001136 def _validate_value_types(self, *, section="", option="", value=""):
Łukasz Langa26d513c2010-11-10 18:57:39 +00001137 """Raises a TypeError for non-string values.
1138
1139 The only legal non-string value if we allow valueless
1140 options is None, so we need to check if the value is a
1141 string if:
1142 - we do not allow valueless options, or
1143 - we allow valueless options but the value is not None
1144
1145 For compatibility reasons this method is not used in classic set()
Łukasz Langa7f64c8a2010-12-16 01:16:22 +00001146 for RawConfigParsers. It is invoked in every case for mapping protocol
1147 access and in ConfigParser.set().
Łukasz Langa26d513c2010-11-10 18:57:39 +00001148 """
Łukasz Langa2cf9ddb2010-12-04 12:46:01 +00001149 if not isinstance(section, str):
1150 raise TypeError("section names must be strings")
1151 if not isinstance(option, str):
1152 raise TypeError("option keys must be strings")
Łukasz Langa26d513c2010-11-10 18:57:39 +00001153 if not self._allow_no_value or value:
1154 if not isinstance(value, str):
1155 raise TypeError("option values must be strings")
1156
1157
Fred Drakecc645b92010-09-04 04:35:34 +00001158class ConfigParser(RawConfigParser):
1159 """ConfigParser implementing interpolation."""
1160
Łukasz Langab6a6f5f2010-12-03 16:28:00 +00001161 _DEFAULT_INTERPOLATION = BasicInterpolation()
David Goodger1cbf2062004-10-03 15:55:09 +00001162
Fred Drake03c44a32010-02-19 06:08:41 +00001163 def set(self, section, option, value=None):
Łukasz Langab6a6f5f2010-12-03 16:28:00 +00001164 """Set an option. Extends RawConfigParser.set by validating type and
1165 interpolation syntax on the value."""
Łukasz Langa2cf9ddb2010-12-04 12:46:01 +00001166 self._validate_value_types(option=option, value=value)
Łukasz Langab6a6f5f2010-12-03 16:28:00 +00001167 super().set(section, option, value)
Łukasz Langa26d513c2010-11-10 18:57:39 +00001168
Łukasz Langa2cf9ddb2010-12-04 12:46:01 +00001169 def add_section(self, section):
1170 """Create a new section in the configuration. Extends
1171 RawConfigParser.add_section by validating if the section name is
1172 a string."""
1173 self._validate_value_types(section=section)
1174 super().add_section(section)
1175
Łukasz Langa26d513c2010-11-10 18:57:39 +00001176
Łukasz Langa7f64c8a2010-12-16 01:16:22 +00001177class SafeConfigParser(ConfigParser):
1178 """ConfigParser alias for backwards compatibility purposes."""
1179
1180 def __init__(self, *args, **kwargs):
1181 super().__init__(*args, **kwargs)
1182 warnings.warn(
1183 "The SafeConfigParser class has been renamed to ConfigParser "
1184 "in Python 3.2. This alias will be removed in future versions."
1185 " Use ConfigParser directly instead.",
1186 DeprecationWarning, stacklevel=2
1187 )
1188
1189
Łukasz Langa26d513c2010-11-10 18:57:39 +00001190class SectionProxy(MutableMapping):
1191 """A proxy for a single section from a parser."""
1192
Łukasz Langaa73dc9d2010-11-21 13:56:42 +00001193 def __init__(self, parser, name):
1194 """Creates a view on a section of the specified `name` in `parser`."""
Łukasz Langa26d513c2010-11-10 18:57:39 +00001195 self._parser = parser
Łukasz Langaa73dc9d2010-11-21 13:56:42 +00001196 self._name = name
Łukasz Langa26d513c2010-11-10 18:57:39 +00001197
1198 def __repr__(self):
Łukasz Langaa73dc9d2010-11-21 13:56:42 +00001199 return '<Section: {}>'.format(self._name)
Łukasz Langa26d513c2010-11-10 18:57:39 +00001200
1201 def __getitem__(self, key):
Łukasz Langaa73dc9d2010-11-21 13:56:42 +00001202 if not self._parser.has_option(self._name, key):
Łukasz Langa26d513c2010-11-10 18:57:39 +00001203 raise KeyError(key)
Łukasz Langaa73dc9d2010-11-21 13:56:42 +00001204 return self._parser.get(self._name, key)
Łukasz Langa26d513c2010-11-10 18:57:39 +00001205
1206 def __setitem__(self, key, value):
Łukasz Langa2cf9ddb2010-12-04 12:46:01 +00001207 self._parser._validate_value_types(option=key, value=value)
Łukasz Langaa73dc9d2010-11-21 13:56:42 +00001208 return self._parser.set(self._name, key, value)
Łukasz Langa26d513c2010-11-10 18:57:39 +00001209
1210 def __delitem__(self, key):
Łukasz Langa71b37a52010-12-17 21:56:32 +00001211 if not (self._parser.has_option(self._name, key) and
1212 self._parser.remove_option(self._name, key)):
Łukasz Langa26d513c2010-11-10 18:57:39 +00001213 raise KeyError(key)
Łukasz Langa26d513c2010-11-10 18:57:39 +00001214
1215 def __contains__(self, key):
Łukasz Langaa73dc9d2010-11-21 13:56:42 +00001216 return self._parser.has_option(self._name, key)
Łukasz Langa26d513c2010-11-10 18:57:39 +00001217
1218 def __len__(self):
Łukasz Langa71b37a52010-12-17 21:56:32 +00001219 return len(self._options())
Łukasz Langa26d513c2010-11-10 18:57:39 +00001220
1221 def __iter__(self):
Łukasz Langa71b37a52010-12-17 21:56:32 +00001222 return self._options().__iter__()
1223
1224 def _options(self):
1225 if self._name != self._parser.default_section:
1226 return self._parser.options(self._name)
1227 else:
1228 return self._parser.defaults()
Łukasz Langaa73dc9d2010-11-21 13:56:42 +00001229
Łukasz Langa2f0fd0f2010-12-04 17:48:18 +00001230 def get(self, option, fallback=None, *, raw=False, vars=None):
1231 return self._parser.get(self._name, option, raw=raw, vars=vars,
1232 fallback=fallback)
1233
1234 def getint(self, option, fallback=None, *, raw=False, vars=None):
1235 return self._parser.getint(self._name, option, raw=raw, vars=vars,
1236 fallback=fallback)
1237
1238 def getfloat(self, option, fallback=None, *, raw=False, vars=None):
1239 return self._parser.getfloat(self._name, option, raw=raw, vars=vars,
1240 fallback=fallback)
1241
1242 def getboolean(self, option, fallback=None, *, raw=False, vars=None):
1243 return self._parser.getboolean(self._name, option, raw=raw, vars=vars,
1244 fallback=fallback)
1245
Łukasz Langaa73dc9d2010-11-21 13:56:42 +00001246 @property
1247 def parser(self):
1248 # The parser object of the proxy is read-only.
1249 return self._parser
1250
1251 @property
1252 def name(self):
1253 # The name of the section on a proxy is read-only.
1254 return self._name