blob: 3a9fb56dc632c99776bd567694d646aeaa138505 [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,
Łukasz Langadfdd2f72014-09-15 02:08:41 -070020 empty_lines_in_values=True, default_section='DEFAULT',
21 interpolation=<unset>, converters=<unset>):
Georg Brandl96a60ae2010-07-28 13:13:46 +000022 Create the parser. When `defaults' is given, it is initialized into the
23 dictionary or intrinsic defaults. The keys must be strings, the values
Łukasz Langa5c863392010-11-21 13:41:35 +000024 must be appropriate for %()s string interpolation.
Georg Brandl96a60ae2010-07-28 13:13:46 +000025
26 When `dict_type' is given, it will be used to create the dictionary
27 objects for the list of sections, for the options within a section, and
28 for the default values.
29
30 When `delimiters' is given, it will be used as the set of substrings
31 that divide keys from values.
32
33 When `comment_prefixes' is given, it will be used as the set of
Łukasz Langab25a7912010-12-17 01:32:29 +000034 substrings that prefix comments in empty lines. Comments can be
35 indented.
36
37 When `inline_comment_prefixes' is given, it will be used as the set of
38 substrings that prefix comments in non-empty lines.
Georg Brandl96a60ae2010-07-28 13:13:46 +000039
Fred Drakea4923622010-08-09 12:52:45 +000040 When `strict` is True, the parser won't allow for any section or option
41 duplicates while reading from a single source (file, string or
Łukasz Langab25a7912010-12-17 01:32:29 +000042 dictionary). Default is True.
Fred Drakea4923622010-08-09 12:52:45 +000043
Georg Brandl96a60ae2010-07-28 13:13:46 +000044 When `empty_lines_in_values' is False (default: True), each empty line
45 marks the end of an option. Otherwise, internal empty lines of
46 a multiline option are kept as part of the value.
47
48 When `allow_no_value' is True (default: False), options without
49 values are accepted; the value presented for these is None.
Guido van Rossum3d209861997-12-09 16:10:31 +000050
Łukasz Langadfdd2f72014-09-15 02:08:41 -070051 When `default_section' is given, the name of the special section is
52 named accordingly. By default it is called ``"DEFAULT"`` but this can
53 be customized to point to any other valid section name. Its current
54 value can be retrieved using the ``parser_instance.default_section``
55 attribute and may be modified at runtime.
56
57 When `interpolation` is given, it should be an Interpolation subclass
58 instance. It will be used as the handler for option value
59 pre-processing when using getters. RawConfigParser object s don't do
60 any sort of interpolation, whereas ConfigParser uses an instance of
61 BasicInterpolation. The library also provides a ``zc.buildbot``
62 inspired ExtendedInterpolation implementation.
63
64 When `converters` is given, it should be a dictionary where each key
65 represents the name of a type converter and each value is a callable
66 implementing the conversion from string to the desired datatype. Every
67 converter gets its corresponding get*() method on the parser object and
68 section proxies.
69
Barry Warsawf09f6a51999-01-26 22:01:37 +000070 sections()
Georg Brandl96a60ae2010-07-28 13:13:46 +000071 Return all the configuration section names, sans DEFAULT.
Guido van Rossum3d209861997-12-09 16:10:31 +000072
Guido van Rossuma5a24b71999-10-04 19:58:22 +000073 has_section(section)
Georg Brandl96a60ae2010-07-28 13:13:46 +000074 Return whether the given section exists.
Guido van Rossuma5a24b71999-10-04 19:58:22 +000075
Eric S. Raymond649685a2000-07-14 14:28:22 +000076 has_option(section, option)
Georg Brandl96a60ae2010-07-28 13:13:46 +000077 Return whether the given option exists in the given section.
Eric S. Raymond649685a2000-07-14 14:28:22 +000078
Barry Warsawf09f6a51999-01-26 22:01:37 +000079 options(section)
Georg Brandl96a60ae2010-07-28 13:13:46 +000080 Return list of configuration options for the named section.
Guido van Rossum3d209861997-12-09 16:10:31 +000081
Georg Brandl8dcaa732010-07-29 12:17:40 +000082 read(filenames, encoding=None)
Georg Brandl96a60ae2010-07-28 13:13:46 +000083 Read and parse the list of named configuration files, given by
Guido van Rossum6a8d84b1999-10-04 18:57:27 +000084 name. A single filename is also allowed. Non-existing files
Fred Drake82903142004-05-18 04:24:02 +000085 are ignored. Return list of successfully read files.
Guido van Rossum6a8d84b1999-10-04 18:57:27 +000086
Fred Drakea4923622010-08-09 12:52:45 +000087 read_file(f, filename=None)
Georg Brandl96a60ae2010-07-28 13:13:46 +000088 Read and parse one configuration file, given as a file object.
Fred Drakea4923622010-08-09 12:52:45 +000089 The filename defaults to f.name; it is only used in error
90 messages (if f has no `name' attribute, the string `<???>' is used).
91
92 read_string(string)
93 Read configuration from a given string.
94
95 read_dict(dictionary)
96 Read configuration from a dictionary. Keys are section names,
97 values are dictionaries with keys and values that should be present
98 in the section. If the used dictionary type preserves order, sections
Fred Drakecc645b92010-09-04 04:35:34 +000099 and their keys will be added in order. Values are automatically
100 converted to strings.
Guido van Rossum3d209861997-12-09 16:10:31 +0000101
Łukasz Langa26d513c2010-11-10 18:57:39 +0000102 get(section, option, raw=False, vars=None, fallback=_UNSET)
Georg Brandl96a60ae2010-07-28 13:13:46 +0000103 Return a string value for the named option. All % interpolations are
Barry Warsawf09f6a51999-01-26 22:01:37 +0000104 expanded in the return values, based on the defaults passed into the
105 constructor and the DEFAULT section. Additional substitutions may be
106 provided using the `vars' argument, which must be a dictionary whose
Fred Drakecc645b92010-09-04 04:35:34 +0000107 contents override any pre-existing defaults. If `option' is a key in
108 `vars', the value from `vars' is used.
Guido van Rossum3d209861997-12-09 16:10:31 +0000109
Łukasz Langa26d513c2010-11-10 18:57:39 +0000110 getint(section, options, raw=False, vars=None, fallback=_UNSET)
Georg Brandl96a60ae2010-07-28 13:13:46 +0000111 Like get(), but convert value to an integer.
Guido van Rossum3d209861997-12-09 16:10:31 +0000112
Łukasz Langa26d513c2010-11-10 18:57:39 +0000113 getfloat(section, options, raw=False, vars=None, fallback=_UNSET)
Georg Brandl96a60ae2010-07-28 13:13:46 +0000114 Like get(), but convert value to a float.
Guido van Rossum3d209861997-12-09 16:10:31 +0000115
Łukasz Langa26d513c2010-11-10 18:57:39 +0000116 getboolean(section, options, raw=False, vars=None, fallback=_UNSET)
Georg Brandl96a60ae2010-07-28 13:13:46 +0000117 Like get(), but convert value to a boolean (currently case
Neal Norwitzf680cc42002-12-17 01:56:47 +0000118 insensitively defined as 0, false, no, off for False, and 1, true,
119 yes, on for True). Returns False or True.
Eric S. Raymond649685a2000-07-14 14:28:22 +0000120
Łukasz Langa71b37a52010-12-17 21:56:32 +0000121 items(section=_UNSET, raw=False, vars=None)
Łukasz Langa30574692012-12-31 02:18:20 +0100122 If section is given, return a list of tuples with (name, value) for
123 each option in the section. Otherwise, return a list of tuples with
124 (section_name, section_proxy) for each section, including DEFAULTSECT.
Fred Drake2ca041f2002-09-27 15:49:56 +0000125
Eric S. Raymond649685a2000-07-14 14:28:22 +0000126 remove_section(section)
Georg Brandl96a60ae2010-07-28 13:13:46 +0000127 Remove the given file section and all its options.
Eric S. Raymond649685a2000-07-14 14:28:22 +0000128
129 remove_option(section, option)
Georg Brandl96a60ae2010-07-28 13:13:46 +0000130 Remove the given option from the given section.
Eric S. Raymond649685a2000-07-14 14:28:22 +0000131
132 set(section, option, value)
Georg Brandl96a60ae2010-07-28 13:13:46 +0000133 Set the given option.
Eric S. Raymond649685a2000-07-14 14:28:22 +0000134
Georg Brandl96a60ae2010-07-28 13:13:46 +0000135 write(fp, space_around_delimiters=True)
136 Write the configuration state in .ini format. If
137 `space_around_delimiters' is True (the default), delimiters
138 between keys and values are surrounded by spaces.
Guido van Rossum3d209861997-12-09 16:10:31 +0000139"""
140
Raymond Hettinger57d1a882011-02-23 00:46:28 +0000141from collections.abc import MutableMapping
Raymond Hettinger9fe1ccf2011-02-26 01:02:51 +0000142from collections import OrderedDict as _default_dict, ChainMap as _ChainMap
Łukasz Langa26d513c2010-11-10 18:57:39 +0000143import functools
Fred Drakea4923622010-08-09 12:52:45 +0000144import io
Łukasz Langa26d513c2010-11-10 18:57:39 +0000145import itertools
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000146import re
Georg Brandl96a60ae2010-07-28 13:13:46 +0000147import sys
Fred Drakea4923622010-08-09 12:52:45 +0000148import warnings
Guido van Rossum3d209861997-12-09 16:10:31 +0000149
Fred Drakea4923622010-08-09 12:52:45 +0000150__all__ = ["NoSectionError", "DuplicateOptionError", "DuplicateSectionError",
151 "NoOptionError", "InterpolationError", "InterpolationDepthError",
Łukasz Langadfdd2f72014-09-15 02:08:41 -0700152 "InterpolationMissingOptionError", "InterpolationSyntaxError",
153 "ParsingError", "MissingSectionHeaderError",
David Goodger1cbf2062004-10-03 15:55:09 +0000154 "ConfigParser", "SafeConfigParser", "RawConfigParser",
Łukasz Langadfdd2f72014-09-15 02:08:41 -0700155 "Interpolation", "BasicInterpolation", "ExtendedInterpolation",
156 "LegacyInterpolation", "SectionProxy", "ConverterMapping",
Fred Drakec2ff9052002-09-27 15:33:11 +0000157 "DEFAULTSECT", "MAX_INTERPOLATION_DEPTH"]
Skip Montanaroe99d5ea2001-01-20 19:54:20 +0000158
Guido van Rossum3d209861997-12-09 16:10:31 +0000159DEFAULTSECT = "DEFAULT"
160
Fred Drake2a37f9f2000-09-27 22:43:54 +0000161MAX_INTERPOLATION_DEPTH = 10
162
Guido van Rossum3d209861997-12-09 16:10:31 +0000163
Tim Peters88869f92001-01-14 23:36:06 +0000164
Guido van Rossum3d209861997-12-09 16:10:31 +0000165# exception classes
Fred Drake7c1e5ad2000-12-11 18:13:19 +0000166class Error(Exception):
Fred Drake8d5dd982002-12-30 23:51:45 +0000167 """Base class for ConfigParser exceptions."""
168
Guido van Rossum3d209861997-12-09 16:10:31 +0000169 def __init__(self, msg=''):
Fred Drakee2c64912002-12-31 17:23:27 +0000170 self.message = msg
Fred Drake7c1e5ad2000-12-11 18:13:19 +0000171 Exception.__init__(self, msg)
Fred Drake8d5dd982002-12-30 23:51:45 +0000172
Guido van Rossum3d209861997-12-09 16:10:31 +0000173 def __repr__(self):
Fred Drakee2c64912002-12-31 17:23:27 +0000174 return self.message
Fred Drake8d5dd982002-12-30 23:51:45 +0000175
Fred Drake7c1e5ad2000-12-11 18:13:19 +0000176 __str__ = __repr__
Guido van Rossum3d209861997-12-09 16:10:31 +0000177
Georg Brandl96a60ae2010-07-28 13:13:46 +0000178
Guido van Rossum3d209861997-12-09 16:10:31 +0000179class NoSectionError(Error):
Fred Drake8d5dd982002-12-30 23:51:45 +0000180 """Raised when no section matches a requested option."""
181
Guido van Rossum3d209861997-12-09 16:10:31 +0000182 def __init__(self, section):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000183 Error.__init__(self, 'No section: %r' % (section,))
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000184 self.section = section
Michael Foordbd6c0792010-07-25 23:09:25 +0000185 self.args = (section, )
Guido van Rossum3d209861997-12-09 16:10:31 +0000186
Georg Brandl96a60ae2010-07-28 13:13:46 +0000187
Guido van Rossum3d209861997-12-09 16:10:31 +0000188class DuplicateSectionError(Error):
Fred Drakea4923622010-08-09 12:52:45 +0000189 """Raised when a section is repeated in an input source.
Fred Drake8d5dd982002-12-30 23:51:45 +0000190
Fred Drakea4923622010-08-09 12:52:45 +0000191 Possible repetitions that raise this exception are: multiple creation
192 using the API or in strict parsers when a section is found more than once
193 in a single input file, string or dictionary.
194 """
195
196 def __init__(self, section, source=None, lineno=None):
197 msg = [repr(section), " already exists"]
198 if source is not None:
Łukasz Langaf9b4eb42013-06-23 19:10:25 +0200199 message = ["While reading from ", repr(source)]
Fred Drakea4923622010-08-09 12:52:45 +0000200 if lineno is not None:
201 message.append(" [line {0:2d}]".format(lineno))
202 message.append(": section ")
203 message.extend(msg)
204 msg = message
205 else:
206 msg.insert(0, "Section ")
207 Error.__init__(self, "".join(msg))
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000208 self.section = section
Fred Drakea4923622010-08-09 12:52:45 +0000209 self.source = source
210 self.lineno = lineno
211 self.args = (section, source, lineno)
212
213
214class DuplicateOptionError(Error):
215 """Raised by strict parsers when an option is repeated in an input source.
216
217 Current implementation raises this exception only when an option is found
218 more than once in a single file, string or dictionary.
219 """
220
221 def __init__(self, section, option, source=None, lineno=None):
222 msg = [repr(option), " in section ", repr(section),
223 " already exists"]
224 if source is not None:
Łukasz Langaf9b4eb42013-06-23 19:10:25 +0200225 message = ["While reading from ", repr(source)]
Fred Drakea4923622010-08-09 12:52:45 +0000226 if lineno is not None:
227 message.append(" [line {0:2d}]".format(lineno))
228 message.append(": option ")
229 message.extend(msg)
230 msg = message
231 else:
232 msg.insert(0, "Option ")
233 Error.__init__(self, "".join(msg))
234 self.section = section
235 self.option = option
236 self.source = source
237 self.lineno = lineno
238 self.args = (section, option, source, lineno)
Guido van Rossum3d209861997-12-09 16:10:31 +0000239
Georg Brandl96a60ae2010-07-28 13:13:46 +0000240
Guido van Rossum3d209861997-12-09 16:10:31 +0000241class NoOptionError(Error):
Fred Drake8d5dd982002-12-30 23:51:45 +0000242 """A requested option was not found."""
243
Guido van Rossum3d209861997-12-09 16:10:31 +0000244 def __init__(self, option, section):
Fred Drakee2c64912002-12-31 17:23:27 +0000245 Error.__init__(self, "No option %r in section: %r" %
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000246 (option, section))
247 self.option = option
248 self.section = section
Michael Foordbd6c0792010-07-25 23:09:25 +0000249 self.args = (option, section)
Guido van Rossum3d209861997-12-09 16:10:31 +0000250
Georg Brandl96a60ae2010-07-28 13:13:46 +0000251
Guido van Rossum3d209861997-12-09 16:10:31 +0000252class InterpolationError(Error):
Fred Drakee2c64912002-12-31 17:23:27 +0000253 """Base class for interpolation-related exceptions."""
Fred Drake8d5dd982002-12-30 23:51:45 +0000254
Fred Drakee2c64912002-12-31 17:23:27 +0000255 def __init__(self, option, section, msg):
256 Error.__init__(self, msg)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000257 self.option = option
258 self.section = section
Michael Foordbd6c0792010-07-25 23:09:25 +0000259 self.args = (option, section, msg)
Guido van Rossum3d209861997-12-09 16:10:31 +0000260
Georg Brandl96a60ae2010-07-28 13:13:46 +0000261
Fred Drakee2c64912002-12-31 17:23:27 +0000262class InterpolationMissingOptionError(InterpolationError):
263 """A string substitution required a setting which was not available."""
264
265 def __init__(self, option, section, rawval, reference):
Robert Collinsac37ba02015-08-14 11:11:35 +1200266 msg = ("Bad value substitution: option {!r} in section {!r} contains "
267 "an interpolation key {!r} which is not a valid option name. "
268 "Raw value: {!r}".format(option, section, reference, rawval))
Fred Drakee2c64912002-12-31 17:23:27 +0000269 InterpolationError.__init__(self, option, section, msg)
270 self.reference = reference
Michael Foordbd6c0792010-07-25 23:09:25 +0000271 self.args = (option, section, rawval, reference)
Fred Drakee2c64912002-12-31 17:23:27 +0000272
Georg Brandl96a60ae2010-07-28 13:13:46 +0000273
Fred Drakee2c64912002-12-31 17:23:27 +0000274class InterpolationSyntaxError(InterpolationError):
Fred Drakea4923622010-08-09 12:52:45 +0000275 """Raised when the source text contains invalid syntax.
276
Łukasz Langa7f64c8a2010-12-16 01:16:22 +0000277 Current implementation raises this exception when the source text into
278 which substitutions are made does not conform to the required syntax.
Fred Drakea4923622010-08-09 12:52:45 +0000279 """
Neal Norwitzce1d9442002-12-30 23:38:47 +0000280
Georg Brandl96a60ae2010-07-28 13:13:46 +0000281
Fred Drakee2c64912002-12-31 17:23:27 +0000282class InterpolationDepthError(InterpolationError):
Fred Drake8d5dd982002-12-30 23:51:45 +0000283 """Raised when substitutions are nested too deeply."""
284
Fred Drake2a37f9f2000-09-27 22:43:54 +0000285 def __init__(self, option, section, rawval):
Robert Collinsac37ba02015-08-14 11:11:35 +1200286 msg = ("Recursion limit exceeded in value substitution: option {!r} "
287 "in section {!r} contains an interpolation key which "
288 "cannot be substituted in {} steps. Raw value: {!r}"
289 "".format(option, section, MAX_INTERPOLATION_DEPTH,
290 rawval))
Fred Drakee2c64912002-12-31 17:23:27 +0000291 InterpolationError.__init__(self, option, section, msg)
Michael Foordbd6c0792010-07-25 23:09:25 +0000292 self.args = (option, section, rawval)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000293
Georg Brandl96a60ae2010-07-28 13:13:46 +0000294
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000295class ParsingError(Error):
Fred Drake8d5dd982002-12-30 23:51:45 +0000296 """Raised when a configuration file does not follow legal syntax."""
297
Fred Drakea4923622010-08-09 12:52:45 +0000298 def __init__(self, source=None, filename=None):
299 # Exactly one of `source'/`filename' arguments has to be given.
300 # `filename' kept for compatibility.
301 if filename and source:
302 raise ValueError("Cannot specify both `filename' and `source'. "
303 "Use `source'.")
304 elif not filename and not source:
305 raise ValueError("Required argument `source' not given.")
306 elif filename:
307 source = filename
Serhiy Storchakabc27a052014-02-06 22:49:45 +0200308 Error.__init__(self, 'Source contains parsing errors: %r' % source)
Fred Drakea4923622010-08-09 12:52:45 +0000309 self.source = source
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000310 self.errors = []
Fred Drakea4923622010-08-09 12:52:45 +0000311 self.args = (source, )
312
313 @property
314 def filename(self):
315 """Deprecated, use `source'."""
316 warnings.warn(
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000317 "The 'filename' attribute will be removed in future versions. "
Fred Drakea4923622010-08-09 12:52:45 +0000318 "Use 'source' instead.",
Łukasz Langa49afa382010-11-11 19:53:23 +0000319 DeprecationWarning, stacklevel=2
Fred Drakea4923622010-08-09 12:52:45 +0000320 )
321 return self.source
322
323 @filename.setter
324 def filename(self, value):
325 """Deprecated, user `source'."""
326 warnings.warn(
327 "The 'filename' attribute will be removed in future versions. "
328 "Use 'source' instead.",
Łukasz Langa49afa382010-11-11 19:53:23 +0000329 DeprecationWarning, stacklevel=2
Fred Drakea4923622010-08-09 12:52:45 +0000330 )
331 self.source = value
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000332
333 def append(self, lineno, line):
334 self.errors.append((lineno, line))
Fred Drakee2c64912002-12-31 17:23:27 +0000335 self.message += '\n\t[line %2d]: %s' % (lineno, line)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +0000336
Georg Brandl96a60ae2010-07-28 13:13:46 +0000337
Fred Drake2a37f9f2000-09-27 22:43:54 +0000338class MissingSectionHeaderError(ParsingError):
Fred Drake8d5dd982002-12-30 23:51:45 +0000339 """Raised when a key-value pair is found before any section header."""
340
Fred Drake2a37f9f2000-09-27 22:43:54 +0000341 def __init__(self, filename, lineno, line):
342 Error.__init__(
343 self,
Serhiy Storchakabc27a052014-02-06 22:49:45 +0200344 'File contains no section headers.\nfile: %r, line: %d\n%r' %
Fred Drake2a37f9f2000-09-27 22:43:54 +0000345 (filename, lineno, line))
Fred Drakea4923622010-08-09 12:52:45 +0000346 self.source = filename
Fred Drake2a37f9f2000-09-27 22:43:54 +0000347 self.lineno = lineno
348 self.line = line
Michael Foordbd6c0792010-07-25 23:09:25 +0000349 self.args = (filename, lineno, line)
Guido van Rossum3d209861997-12-09 16:10:31 +0000350
Georg Brandl96a60ae2010-07-28 13:13:46 +0000351
Fred Drakecc645b92010-09-04 04:35:34 +0000352# Used in parser getters to indicate the default behaviour when a specific
353# option is not found it to raise an exception. Created to enable `None' as
354# a valid fallback value.
355_UNSET = object()
356
357
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000358class Interpolation:
359 """Dummy interpolation that passes the value through with no changes."""
360
361 def before_get(self, parser, section, option, value, defaults):
362 return value
363
364 def before_set(self, parser, section, option, value):
365 return value
366
367 def before_read(self, parser, section, option, value):
368 return value
369
370 def before_write(self, parser, section, option, value):
371 return value
372
373
374class BasicInterpolation(Interpolation):
Łukasz Langa7f64c8a2010-12-16 01:16:22 +0000375 """Interpolation as implemented in the classic ConfigParser.
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000376
377 The option values can contain format strings which refer to other values in
378 the same section, or values in the special default section.
379
380 For example:
381
382 something: %(dir)s/whatever
383
384 would resolve the "%(dir)s" to the value of dir. All reference
385 expansions are done late, on demand. If a user needs to use a bare % in
Ezio Melottie130a522011-10-19 10:58:56 +0300386 a configuration file, she can escape it by writing %%. Other % usage
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000387 is considered a user error and raises `InterpolationSyntaxError'."""
388
389 _KEYCRE = re.compile(r"%\(([^)]+)\)s")
390
391 def before_get(self, parser, section, option, value, defaults):
392 L = []
393 self._interpolate_some(parser, option, L, value, section, defaults, 1)
394 return ''.join(L)
395
396 def before_set(self, parser, section, option, value):
397 tmp_value = value.replace('%%', '') # escaped percent signs
398 tmp_value = self._KEYCRE.sub('', tmp_value) # valid syntax
399 if '%' in tmp_value:
400 raise ValueError("invalid interpolation syntax in %r at "
401 "position %d" % (value, tmp_value.find('%')))
402 return value
403
404 def _interpolate_some(self, parser, option, accum, rest, section, map,
405 depth):
Robert Collinsac37ba02015-08-14 11:11:35 +1200406 rawval = parser.get(section, option, raw=True, fallback=rest)
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000407 if depth > MAX_INTERPOLATION_DEPTH:
Robert Collinsac37ba02015-08-14 11:11:35 +1200408 raise InterpolationDepthError(option, section, rawval)
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000409 while rest:
410 p = rest.find("%")
411 if p < 0:
412 accum.append(rest)
413 return
414 if p > 0:
415 accum.append(rest[:p])
416 rest = rest[p:]
417 # p is no longer used
418 c = rest[1:2]
419 if c == "%":
420 accum.append("%")
421 rest = rest[2:]
422 elif c == "(":
423 m = self._KEYCRE.match(rest)
424 if m is None:
425 raise InterpolationSyntaxError(option, section,
426 "bad interpolation variable reference %r" % rest)
427 var = parser.optionxform(m.group(1))
428 rest = rest[m.end():]
429 try:
430 v = map[var]
431 except KeyError:
432 raise InterpolationMissingOptionError(
Robert Collinsf7a92672015-08-14 11:47:41 +1200433 option, section, rawval, var) from None
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000434 if "%" in v:
435 self._interpolate_some(parser, option, accum, v,
436 section, map, depth + 1)
437 else:
438 accum.append(v)
439 else:
440 raise InterpolationSyntaxError(
441 option, section,
442 "'%%' must be followed by '%%' or '(', "
443 "found: %r" % (rest,))
444
445
446class ExtendedInterpolation(Interpolation):
447 """Advanced variant of interpolation, supports the syntax used by
448 `zc.buildout'. Enables interpolation between sections."""
449
450 _KEYCRE = re.compile(r"\$\{([^}]+)\}")
451
452 def before_get(self, parser, section, option, value, defaults):
453 L = []
454 self._interpolate_some(parser, option, L, value, section, defaults, 1)
455 return ''.join(L)
456
457 def before_set(self, parser, section, option, value):
458 tmp_value = value.replace('$$', '') # escaped dollar signs
459 tmp_value = self._KEYCRE.sub('', tmp_value) # valid syntax
460 if '$' in tmp_value:
461 raise ValueError("invalid interpolation syntax in %r at "
Łukasz Langafa608182013-04-24 01:25:18 +0200462 "position %d" % (value, tmp_value.find('$')))
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000463 return value
464
465 def _interpolate_some(self, parser, option, accum, rest, section, map,
466 depth):
Robert Collinsac37ba02015-08-14 11:11:35 +1200467 rawval = parser.get(section, option, raw=True, fallback=rest)
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000468 if depth > MAX_INTERPOLATION_DEPTH:
Robert Collinsac37ba02015-08-14 11:11:35 +1200469 raise InterpolationDepthError(option, section, rawval)
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000470 while rest:
471 p = rest.find("$")
472 if p < 0:
473 accum.append(rest)
474 return
475 if p > 0:
476 accum.append(rest[:p])
477 rest = rest[p:]
478 # p is no longer used
479 c = rest[1:2]
480 if c == "$":
481 accum.append("$")
482 rest = rest[2:]
483 elif c == "{":
484 m = self._KEYCRE.match(rest)
485 if m is None:
486 raise InterpolationSyntaxError(option, section,
487 "bad interpolation variable reference %r" % rest)
Łukasz Langae698cd52011-04-28 10:58:57 +0200488 path = m.group(1).split(':')
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000489 rest = rest[m.end():]
490 sect = section
491 opt = option
492 try:
493 if len(path) == 1:
Łukasz Langae698cd52011-04-28 10:58:57 +0200494 opt = parser.optionxform(path[0])
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000495 v = map[opt]
496 elif len(path) == 2:
497 sect = path[0]
Łukasz Langae698cd52011-04-28 10:58:57 +0200498 opt = parser.optionxform(path[1])
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000499 v = parser.get(sect, opt, raw=True)
500 else:
501 raise InterpolationSyntaxError(
502 option, section,
503 "More than one ':' found: %r" % (rest,))
Łukasz Langa71b37a52010-12-17 21:56:32 +0000504 except (KeyError, NoSectionError, NoOptionError):
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000505 raise InterpolationMissingOptionError(
Robert Collinsf7a92672015-08-14 11:47:41 +1200506 option, section, rawval, ":".join(path)) from None
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000507 if "$" in v:
508 self._interpolate_some(parser, opt, accum, v, sect,
509 dict(parser.items(sect, raw=True)),
510 depth + 1)
511 else:
512 accum.append(v)
513 else:
514 raise InterpolationSyntaxError(
515 option, section,
516 "'$' must be followed by '$' or '{', "
517 "found: %r" % (rest,))
518
519
Łukasz Langa7f64c8a2010-12-16 01:16:22 +0000520class LegacyInterpolation(Interpolation):
521 """Deprecated interpolation used in old versions of ConfigParser.
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000522 Use BasicInterpolation or ExtendedInterpolation instead."""
523
524 _KEYCRE = re.compile(r"%\(([^)]*)\)s|.")
525
526 def before_get(self, parser, section, option, value, vars):
527 rawval = value
528 depth = MAX_INTERPOLATION_DEPTH
529 while depth: # Loop through this until it's done
530 depth -= 1
531 if value and "%(" in value:
532 replace = functools.partial(self._interpolation_replace,
533 parser=parser)
534 value = self._KEYCRE.sub(replace, value)
535 try:
536 value = value % vars
537 except KeyError as e:
538 raise InterpolationMissingOptionError(
Łukasz Langa949053b2014-09-04 01:36:33 -0700539 option, section, rawval, e.args[0]) from None
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000540 else:
541 break
542 if value and "%(" in value:
543 raise InterpolationDepthError(option, section, rawval)
544 return value
545
546 def before_set(self, parser, section, option, value):
547 return value
548
549 @staticmethod
550 def _interpolation_replace(match, parser):
551 s = match.group(1)
552 if s is None:
553 return match.group()
554 else:
555 return "%%(%s)s" % parser.optionxform(s)
556
557
Łukasz Langa26d513c2010-11-10 18:57:39 +0000558class RawConfigParser(MutableMapping):
Georg Brandl96a60ae2010-07-28 13:13:46 +0000559 """ConfigParser that does not do interpolation."""
560
561 # Regular expressions for parsing section headers and options
562 _SECT_TMPL = r"""
563 \[ # [
564 (?P<header>[^]]+) # very permissive!
565 \] # ]
566 """
567 _OPT_TMPL = r"""
568 (?P<option>.*?) # very permissive!
569 \s*(?P<vi>{delim})\s* # any number of space/tab,
570 # followed by any of the
571 # allowed delimiters,
572 # followed by any space/tab
573 (?P<value>.*)$ # everything up to eol
574 """
575 _OPT_NV_TMPL = r"""
576 (?P<option>.*?) # very permissive!
577 \s*(?: # any number of space/tab,
578 (?P<vi>{delim})\s* # optionally followed by
579 # any of the allowed
580 # delimiters, followed by any
581 # space/tab
582 (?P<value>.*))?$ # everything up to eol
583 """
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000584 # Interpolation algorithm to be used if the user does not specify another
585 _DEFAULT_INTERPOLATION = Interpolation()
Georg Brandl96a60ae2010-07-28 13:13:46 +0000586 # Compiled regular expression for matching sections
587 SECTCRE = re.compile(_SECT_TMPL, re.VERBOSE)
588 # Compiled regular expression for matching options with typical separators
589 OPTCRE = re.compile(_OPT_TMPL.format(delim="=|:"), re.VERBOSE)
590 # Compiled regular expression for matching options with optional values
591 # delimited using typical separators
592 OPTCRE_NV = re.compile(_OPT_NV_TMPL.format(delim="=|:"), re.VERBOSE)
593 # Compiled regular expression for matching leading whitespace in a line
594 NONSPACECRE = re.compile(r"\S")
Fred Drakecc645b92010-09-04 04:35:34 +0000595 # Possible boolean values in the configuration.
596 BOOLEAN_STATES = {'1': True, 'yes': True, 'true': True, 'on': True,
597 '0': False, 'no': False, 'false': False, 'off': False}
Georg Brandl96a60ae2010-07-28 13:13:46 +0000598
Fred Drake03c44a32010-02-19 06:08:41 +0000599 def __init__(self, defaults=None, dict_type=_default_dict,
Fred Drakea4923622010-08-09 12:52:45 +0000600 allow_no_value=False, *, delimiters=('=', ':'),
Łukasz Langab25a7912010-12-17 01:32:29 +0000601 comment_prefixes=('#', ';'), inline_comment_prefixes=None,
602 strict=True, empty_lines_in_values=True,
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000603 default_section=DEFAULTSECT,
Łukasz Langadfdd2f72014-09-15 02:08:41 -0700604 interpolation=_UNSET, converters=_UNSET):
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000605
Thomas Wouters89f507f2006-12-13 04:49:30 +0000606 self._dict = dict_type
607 self._sections = self._dict()
608 self._defaults = self._dict()
Łukasz Langadfdd2f72014-09-15 02:08:41 -0700609 self._converters = ConverterMapping(self)
Łukasz Langa49afa382010-11-11 19:53:23 +0000610 self._proxies = self._dict()
Łukasz Langac264c092010-11-20 16:15:37 +0000611 self._proxies[default_section] = SectionProxy(self, default_section)
David Goodger68a1abd2004-10-03 15:40:25 +0000612 if defaults:
613 for key, value in defaults.items():
614 self._defaults[self.optionxform(key)] = value
Georg Brandl96a60ae2010-07-28 13:13:46 +0000615 self._delimiters = tuple(delimiters)
616 if delimiters == ('=', ':'):
617 self._optcre = self.OPTCRE_NV if allow_no_value else self.OPTCRE
618 else:
Fred Drakea4923622010-08-09 12:52:45 +0000619 d = "|".join(re.escape(d) for d in delimiters)
Georg Brandl96a60ae2010-07-28 13:13:46 +0000620 if allow_no_value:
Fred Drakea4923622010-08-09 12:52:45 +0000621 self._optcre = re.compile(self._OPT_NV_TMPL.format(delim=d),
Georg Brandl96a60ae2010-07-28 13:13:46 +0000622 re.VERBOSE)
623 else:
Fred Drakea4923622010-08-09 12:52:45 +0000624 self._optcre = re.compile(self._OPT_TMPL.format(delim=d),
Georg Brandl96a60ae2010-07-28 13:13:46 +0000625 re.VERBOSE)
Łukasz Langab25a7912010-12-17 01:32:29 +0000626 self._comment_prefixes = tuple(comment_prefixes or ())
627 self._inline_comment_prefixes = tuple(inline_comment_prefixes or ())
Fred Drakea4923622010-08-09 12:52:45 +0000628 self._strict = strict
Łukasz Langa26d513c2010-11-10 18:57:39 +0000629 self._allow_no_value = allow_no_value
Georg Brandl96a60ae2010-07-28 13:13:46 +0000630 self._empty_lines_in_values = empty_lines_in_values
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000631 self.default_section=default_section
Łukasz Langa1aa422f2011-04-28 17:03:45 +0200632 self._interpolation = interpolation
633 if self._interpolation is _UNSET:
634 self._interpolation = self._DEFAULT_INTERPOLATION
635 if self._interpolation is None:
636 self._interpolation = Interpolation()
Łukasz Langadfdd2f72014-09-15 02:08:41 -0700637 if converters is not _UNSET:
638 self._converters.update(converters)
Guido van Rossum3d209861997-12-09 16:10:31 +0000639
640 def defaults(self):
Fred Drakefce65572002-10-25 18:08:18 +0000641 return self._defaults
Guido van Rossum3d209861997-12-09 16:10:31 +0000642
643 def sections(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000644 """Return a list of section names, excluding [DEFAULT]"""
Fred Drakefce65572002-10-25 18:08:18 +0000645 # self._sections will never have [DEFAULT] in it
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000646 return list(self._sections.keys())
Guido van Rossum3d209861997-12-09 16:10:31 +0000647
648 def add_section(self, section):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000649 """Create a new section in the configuration.
Guido van Rossum3d209861997-12-09 16:10:31 +0000650
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000651 Raise DuplicateSectionError if a section by the specified name
Łukasz Langac264c092010-11-20 16:15:37 +0000652 already exists. Raise ValueError if name is DEFAULT.
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000653 """
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000654 if section == self.default_section:
Łukasz Langa3a11e712010-12-03 22:15:19 +0000655 raise ValueError('Invalid section name: %r' % section)
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000656
Fred Drakefce65572002-10-25 18:08:18 +0000657 if section in self._sections:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000658 raise DuplicateSectionError(section)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000659 self._sections[section] = self._dict()
Łukasz Langa49afa382010-11-11 19:53:23 +0000660 self._proxies[section] = SectionProxy(self, section)
Guido van Rossum3d209861997-12-09 16:10:31 +0000661
662 def has_section(self, section):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000663 """Indicate whether the named section is present in the configuration.
Guido van Rossum3d209861997-12-09 16:10:31 +0000664
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000665 The DEFAULT section is not acknowledged.
666 """
Fred Drakefce65572002-10-25 18:08:18 +0000667 return section in self._sections
Guido van Rossum3d209861997-12-09 16:10:31 +0000668
669 def options(self, section):
Guido van Rossuma5a24b71999-10-04 19:58:22 +0000670 """Return a list of option names for the given section name."""
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000671 try:
Fred Drakefce65572002-10-25 18:08:18 +0000672 opts = self._sections[section].copy()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000673 except KeyError:
Łukasz Langa949053b2014-09-04 01:36:33 -0700674 raise NoSectionError(section) from None
Fred Drakefce65572002-10-25 18:08:18 +0000675 opts.update(self._defaults)
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000676 return list(opts.keys())
Guido van Rossum3d209861997-12-09 16:10:31 +0000677
Georg Brandl8dcaa732010-07-29 12:17:40 +0000678 def read(self, filenames, encoding=None):
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000679 """Read and parse a filename or a list of filenames.
Tim Peters88869f92001-01-14 23:36:06 +0000680
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000681 Files that cannot be opened are silently ignored; this is
Barry Warsaw25394511999-10-12 16:12:48 +0000682 designed so that you can specify a list of potential
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000683 configuration file locations (e.g. current directory, user's
684 home directory, systemwide directory), and all existing
685 configuration files in the list will be read. A single
686 filename may also be given.
Fred Drake82903142004-05-18 04:24:02 +0000687
688 Return list of successfully read files.
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000689 """
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000690 if isinstance(filenames, str):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000691 filenames = [filenames]
Fred Drake82903142004-05-18 04:24:02 +0000692 read_ok = []
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000693 for filename in filenames:
694 try:
Florent Xicluna42d54452010-09-22 22:35:38 +0000695 with open(filename, encoding=encoding) as fp:
696 self._read(fp, filename)
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200697 except OSError:
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000698 continue
Fred Drake82903142004-05-18 04:24:02 +0000699 read_ok.append(filename)
700 return read_ok
Guido van Rossum3d209861997-12-09 16:10:31 +0000701
Fred Drakea4923622010-08-09 12:52:45 +0000702 def read_file(self, f, source=None):
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000703 """Like read() but the argument must be a file-like object.
704
Łukasz Langadaab1c82011-04-27 18:10:05 +0200705 The `f' argument must be iterable, returning one line at a time.
706 Optional second argument is the `source' specifying the name of the
707 file being read. If not given, it is taken from f.name. If `f' has no
708 `name' attribute, `<???>' is used.
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000709 """
Fred Drakea4923622010-08-09 12:52:45 +0000710 if source is None:
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000711 try:
Florent Xicluna42d54452010-09-22 22:35:38 +0000712 source = f.name
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000713 except AttributeError:
Fred Drakea4923622010-08-09 12:52:45 +0000714 source = '<???>'
715 self._read(f, source)
716
717 def read_string(self, string, source='<string>'):
718 """Read configuration from a given string."""
719 sfile = io.StringIO(string)
720 self.read_file(sfile, source)
721
722 def read_dict(self, dictionary, source='<dict>'):
723 """Read configuration from a dictionary.
724
725 Keys are section names, values are dictionaries with keys and values
726 that should be present in the section. If the used dictionary type
727 preserves order, sections and their keys will be added in order.
728
Łukasz Langa2cf9ddb2010-12-04 12:46:01 +0000729 All types held in the dictionary are converted to strings during
730 reading, including section names, option names and keys.
731
Fred Drakea4923622010-08-09 12:52:45 +0000732 Optional second argument is the `source' specifying the name of the
733 dictionary being read.
734 """
735 elements_added = set()
736 for section, keys in dictionary.items():
Łukasz Langa2cf9ddb2010-12-04 12:46:01 +0000737 section = str(section)
Fred Drakea4923622010-08-09 12:52:45 +0000738 try:
739 self.add_section(section)
Łukasz Langa26d513c2010-11-10 18:57:39 +0000740 except (DuplicateSectionError, ValueError):
Fred Drakea4923622010-08-09 12:52:45 +0000741 if self._strict and section in elements_added:
742 raise
Łukasz Langa71b37a52010-12-17 21:56:32 +0000743 elements_added.add(section)
Fred Drakea4923622010-08-09 12:52:45 +0000744 for key, value in keys.items():
Łukasz Langa2cf9ddb2010-12-04 12:46:01 +0000745 key = self.optionxform(str(key))
Fred Drakecc645b92010-09-04 04:35:34 +0000746 if value is not None:
747 value = str(value)
Fred Drakea4923622010-08-09 12:52:45 +0000748 if self._strict and (section, key) in elements_added:
749 raise DuplicateOptionError(section, key, source)
750 elements_added.add((section, key))
751 self.set(section, key, value)
752
753 def readfp(self, fp, filename=None):
754 """Deprecated, use read_file instead."""
755 warnings.warn(
756 "This method will be removed in future versions. "
757 "Use 'parser.read_file()' instead.",
Łukasz Langa49afa382010-11-11 19:53:23 +0000758 DeprecationWarning, stacklevel=2
Fred Drakea4923622010-08-09 12:52:45 +0000759 )
760 self.read_file(fp, source=filename)
Guido van Rossum6a8d84b1999-10-04 18:57:27 +0000761
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000762 def get(self, section, option, *, raw=False, vars=None, fallback=_UNSET):
Fred Drakecc645b92010-09-04 04:35:34 +0000763 """Get an option value for a given section.
764
765 If `vars' is provided, it must be a dictionary. The option is looked up
766 in `vars' (if provided), `section', and in `DEFAULTSECT' in that order.
Łukasz Langa26d513c2010-11-10 18:57:39 +0000767 If the key is not found and `fallback' is provided, it is used as
768 a fallback value. `None' can be provided as a `fallback' value.
769
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000770 If interpolation is enabled and the optional argument `raw' is False,
771 all interpolations are expanded in the return values.
772
773 Arguments `raw', `vars', and `fallback' are keyword only.
774
775 The section DEFAULT is special.
Fred Drakecc645b92010-09-04 04:35:34 +0000776 """
777 try:
778 d = self._unify_values(section, vars)
779 except NoSectionError:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000780 if fallback is _UNSET:
Fred Drakecc645b92010-09-04 04:35:34 +0000781 raise
Fred Drakefce65572002-10-25 18:08:18 +0000782 else:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000783 return fallback
Fred Drakecc645b92010-09-04 04:35:34 +0000784 option = self.optionxform(option)
785 try:
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000786 value = d[option]
Fred Drakecc645b92010-09-04 04:35:34 +0000787 except KeyError:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000788 if fallback is _UNSET:
Fred Drakefce65572002-10-25 18:08:18 +0000789 raise NoOptionError(option, section)
Fred Drakecc645b92010-09-04 04:35:34 +0000790 else:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000791 return fallback
Fred Drake2a37f9f2000-09-27 22:43:54 +0000792
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000793 if raw or value is None:
794 return value
795 else:
796 return self._interpolation.before_get(self, section, option, value,
797 d)
Fred Drake2ca041f2002-09-27 15:49:56 +0000798
Łukasz Langa26d513c2010-11-10 18:57:39 +0000799 def _get(self, section, conv, option, **kwargs):
800 return conv(self.get(section, option, **kwargs))
Guido van Rossum3d209861997-12-09 16:10:31 +0000801
Łukasz Langadfdd2f72014-09-15 02:08:41 -0700802 def _get_conv(self, section, option, conv, *, raw=False, vars=None,
803 fallback=_UNSET, **kwargs):
Fred Drakecc645b92010-09-04 04:35:34 +0000804 try:
Łukasz Langadfdd2f72014-09-15 02:08:41 -0700805 return self._get(section, conv, option, raw=raw, vars=vars,
806 **kwargs)
Fred Drakecc645b92010-09-04 04:35:34 +0000807 except (NoSectionError, NoOptionError):
Łukasz Langa26d513c2010-11-10 18:57:39 +0000808 if fallback is _UNSET:
Fred Drakecc645b92010-09-04 04:35:34 +0000809 raise
Łukasz Langadfdd2f72014-09-15 02:08:41 -0700810 return fallback
811
812 # getint, getfloat and getboolean provided directly for backwards compat
813 def getint(self, section, option, *, raw=False, vars=None,
814 fallback=_UNSET, **kwargs):
815 return self._get_conv(section, option, int, raw=raw, vars=vars,
816 fallback=fallback, **kwargs)
Guido van Rossum3d209861997-12-09 16:10:31 +0000817
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000818 def getfloat(self, section, option, *, raw=False, vars=None,
Łukasz Langadfdd2f72014-09-15 02:08:41 -0700819 fallback=_UNSET, **kwargs):
820 return self._get_conv(section, option, float, raw=raw, vars=vars,
821 fallback=fallback, **kwargs)
Guido van Rossum3d209861997-12-09 16:10:31 +0000822
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000823 def getboolean(self, section, option, *, raw=False, vars=None,
Łukasz Langadfdd2f72014-09-15 02:08:41 -0700824 fallback=_UNSET, **kwargs):
825 return self._get_conv(section, option, self._convert_to_boolean,
826 raw=raw, vars=vars, fallback=fallback, **kwargs)
Guido van Rossum3d209861997-12-09 16:10:31 +0000827
Łukasz Langa71b37a52010-12-17 21:56:32 +0000828 def items(self, section=_UNSET, raw=False, vars=None):
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000829 """Return a list of (name, value) tuples for each option in a section.
830
831 All % interpolations are expanded in the return values, based on the
832 defaults passed into the constructor, unless the optional argument
833 `raw' is true. Additional substitutions may be provided using the
834 `vars' argument, which must be a dictionary whose contents overrides
835 any pre-existing defaults.
836
837 The section DEFAULT is special.
838 """
Łukasz Langa71b37a52010-12-17 21:56:32 +0000839 if section is _UNSET:
840 return super().items()
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000841 d = self._defaults.copy()
842 try:
843 d.update(self._sections[section])
844 except KeyError:
845 if section != self.default_section:
846 raise NoSectionError(section)
847 # Update with the entry specific variables
848 if vars:
849 for key, value in vars.items():
850 d[self.optionxform(key)] = value
Łukasz Langa24bcc612010-12-04 11:48:11 +0000851 value_getter = lambda option: self._interpolation.before_get(self,
852 section, option, d[option], d)
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000853 if raw:
Łukasz Langa24bcc612010-12-04 11:48:11 +0000854 value_getter = lambda option: d[option]
855 return [(option, value_getter(option)) for option in d.keys()]
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000856
Łukasz Langa3a8479a2012-12-31 03:38:39 +0100857 def popitem(self):
858 """Remove a section from the parser and return it as
859 a (section_name, section_proxy) tuple. If no section is present, raise
860 KeyError.
861
862 The section DEFAULT is never returned because it cannot be removed.
863 """
864 for key in self.sections():
865 value = self[key]
866 del self[key]
867 return key, value
868 raise KeyError
869
Guido van Rossum9e480ad1999-06-17 18:41:42 +0000870 def optionxform(self, optionstr):
Eric S. Raymond9eb54d92001-02-09 05:19:09 +0000871 return optionstr.lower()
Guido van Rossum9e480ad1999-06-17 18:41:42 +0000872
Eric S. Raymond417c4892000-07-10 18:11:00 +0000873 def has_option(self, section, option):
Łukasz Langa71b37a52010-12-17 21:56:32 +0000874 """Check for the existence of a given option in a given section.
875 If the specified `section' is None or an empty string, DEFAULT is
876 assumed. If the specified `section' does not exist, returns False."""
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000877 if not section or section == self.default_section:
Fred Drakec2ff9052002-09-27 15:33:11 +0000878 option = self.optionxform(option)
Fred Drakefce65572002-10-25 18:08:18 +0000879 return option in self._defaults
880 elif section not in self._sections:
Neal Norwitzf680cc42002-12-17 01:56:47 +0000881 return False
Eric S. Raymond417c4892000-07-10 18:11:00 +0000882 else:
Fred Drake3c823aa2001-02-26 21:55:34 +0000883 option = self.optionxform(option)
Fred Drakefce65572002-10-25 18:08:18 +0000884 return (option in self._sections[section]
885 or option in self._defaults)
Eric S. Raymond417c4892000-07-10 18:11:00 +0000886
Fred Drake03c44a32010-02-19 06:08:41 +0000887 def set(self, section, option, value=None):
Eric S. Raymond417c4892000-07-10 18:11:00 +0000888 """Set an option."""
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000889 if value:
890 value = self._interpolation.before_set(self, section, option,
891 value)
892 if not section or section == self.default_section:
Fred Drakefce65572002-10-25 18:08:18 +0000893 sectdict = self._defaults
Eric S. Raymond417c4892000-07-10 18:11:00 +0000894 else:
895 try:
Fred Drakefce65572002-10-25 18:08:18 +0000896 sectdict = self._sections[section]
Eric S. Raymond417c4892000-07-10 18:11:00 +0000897 except KeyError:
Łukasz Langa949053b2014-09-04 01:36:33 -0700898 raise NoSectionError(section) from None
Fred Drakec2ff9052002-09-27 15:33:11 +0000899 sectdict[self.optionxform(option)] = value
Eric S. Raymond417c4892000-07-10 18:11:00 +0000900
Georg Brandl96a60ae2010-07-28 13:13:46 +0000901 def write(self, fp, space_around_delimiters=True):
902 """Write an .ini-format representation of the configuration state.
903
904 If `space_around_delimiters' is True (the default), delimiters
905 between keys and values are surrounded by spaces.
906 """
907 if space_around_delimiters:
908 d = " {} ".format(self._delimiters[0])
909 else:
910 d = self._delimiters[0]
Fred Drakefce65572002-10-25 18:08:18 +0000911 if self._defaults:
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000912 self._write_section(fp, self.default_section,
Łukasz Langac264c092010-11-20 16:15:37 +0000913 self._defaults.items(), d)
Fred Drakefce65572002-10-25 18:08:18 +0000914 for section in self._sections:
Georg Brandl96a60ae2010-07-28 13:13:46 +0000915 self._write_section(fp, section,
916 self._sections[section].items(), d)
917
918 def _write_section(self, fp, section_name, section_items, delimiter):
919 """Write a single section to the specified `fp'."""
920 fp.write("[{}]\n".format(section_name))
921 for key, value in section_items:
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000922 value = self._interpolation.before_write(self, section_name, key,
923 value)
Łukasz Langa26d513c2010-11-10 18:57:39 +0000924 if value is not None or not self._allow_no_value:
Georg Brandl96a60ae2010-07-28 13:13:46 +0000925 value = delimiter + str(value).replace('\n', '\n\t')
926 else:
927 value = ""
928 fp.write("{}{}\n".format(key, value))
929 fp.write("\n")
Eric S. Raymond417c4892000-07-10 18:11:00 +0000930
Thomas Woutersff4df6d2000-07-21 05:19:59 +0000931 def remove_option(self, section, option):
Eric S. Raymond649685a2000-07-14 14:28:22 +0000932 """Remove an option."""
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000933 if not section or section == self.default_section:
Fred Drakefce65572002-10-25 18:08:18 +0000934 sectdict = self._defaults
Eric S. Raymond649685a2000-07-14 14:28:22 +0000935 else:
936 try:
Fred Drakefce65572002-10-25 18:08:18 +0000937 sectdict = self._sections[section]
Eric S. Raymond649685a2000-07-14 14:28:22 +0000938 except KeyError:
Łukasz Langa949053b2014-09-04 01:36:33 -0700939 raise NoSectionError(section) from None
Fred Drake3c823aa2001-02-26 21:55:34 +0000940 option = self.optionxform(option)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000941 existed = option in sectdict
Eric S. Raymond649685a2000-07-14 14:28:22 +0000942 if existed:
Fred Drakeff4a23b2000-12-04 16:29:13 +0000943 del sectdict[option]
Eric S. Raymond649685a2000-07-14 14:28:22 +0000944 return existed
945
Thomas Woutersff4df6d2000-07-21 05:19:59 +0000946 def remove_section(self, section):
Eric S. Raymond649685a2000-07-14 14:28:22 +0000947 """Remove a file section."""
Fred Drakefce65572002-10-25 18:08:18 +0000948 existed = section in self._sections
Fred Drakec2ff9052002-09-27 15:33:11 +0000949 if existed:
Fred Drakefce65572002-10-25 18:08:18 +0000950 del self._sections[section]
Łukasz Langa49afa382010-11-11 19:53:23 +0000951 del self._proxies[section]
Fred Drakec2ff9052002-09-27 15:33:11 +0000952 return existed
Eric S. Raymond649685a2000-07-14 14:28:22 +0000953
Łukasz Langa26d513c2010-11-10 18:57:39 +0000954 def __getitem__(self, key):
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000955 if key != self.default_section and not self.has_section(key):
Łukasz Langa26d513c2010-11-10 18:57:39 +0000956 raise KeyError(key)
Łukasz Langa49afa382010-11-11 19:53:23 +0000957 return self._proxies[key]
Łukasz Langa26d513c2010-11-10 18:57:39 +0000958
959 def __setitem__(self, key, value):
960 # To conform with the mapping protocol, overwrites existing values in
961 # the section.
962
963 # XXX this is not atomic if read_dict fails at any point. Then again,
964 # no update method in configparser is atomic in this implementation.
Łukasz Langa02101942012-12-31 13:55:11 +0100965 if key == self.default_section:
966 self._defaults.clear()
Łukasz Langaa821f822013-01-01 22:33:19 +0100967 elif key in self._sections:
968 self._sections[key].clear()
Łukasz Langa26d513c2010-11-10 18:57:39 +0000969 self.read_dict({key: value})
970
971 def __delitem__(self, key):
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000972 if key == self.default_section:
Łukasz Langa26d513c2010-11-10 18:57:39 +0000973 raise ValueError("Cannot remove the default section.")
974 if not self.has_section(key):
975 raise KeyError(key)
976 self.remove_section(key)
977
978 def __contains__(self, key):
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000979 return key == self.default_section or self.has_section(key)
Łukasz Langa26d513c2010-11-10 18:57:39 +0000980
981 def __len__(self):
982 return len(self._sections) + 1 # the default section
983
984 def __iter__(self):
985 # XXX does it break when underlying container state changed?
Łukasz Langab6a6f5f2010-12-03 16:28:00 +0000986 return itertools.chain((self.default_section,), self._sections.keys())
Łukasz Langa26d513c2010-11-10 18:57:39 +0000987
Fred Drakefce65572002-10-25 18:08:18 +0000988 def _read(self, fp, fpname):
Georg Brandl96a60ae2010-07-28 13:13:46 +0000989 """Parse a sectioned configuration file.
Guido van Rossum3d209861997-12-09 16:10:31 +0000990
Fred Drakea4923622010-08-09 12:52:45 +0000991 Each section in a configuration file contains a header, indicated by
992 a name in square brackets (`[]'), plus key/value options, indicated by
Georg Brandl96a60ae2010-07-28 13:13:46 +0000993 `name' and `value' delimited with a specific substring (`=' or `:' by
994 default).
995
Fred Drakea4923622010-08-09 12:52:45 +0000996 Values can span multiple lines, as long as they are indented deeper
997 than the first line of the value. Depending on the parser's mode, blank
998 lines may be treated as parts of multiline values or ignored.
Georg Brandl96a60ae2010-07-28 13:13:46 +0000999
1000 Configuration files may include comments, prefixed by specific
Fred Drakea4923622010-08-09 12:52:45 +00001001 characters (`#' and `;' by default). Comments may appear on their own
1002 in an otherwise empty line or may be entered in lines holding values or
Georg Brandl96a60ae2010-07-28 13:13:46 +00001003 section names.
Guido van Rossum45e2fbc1998-03-26 21:13:24 +00001004 """
Fred Drakea4923622010-08-09 12:52:45 +00001005 elements_added = set()
Brian Curtin9a27b0c2010-07-26 00:27:10 +00001006 cursect = None # None, or a dictionary
Fred Drakea4923622010-08-09 12:52:45 +00001007 sectname = None
Guido van Rossum45e2fbc1998-03-26 21:13:24 +00001008 optname = None
1009 lineno = 0
Georg Brandl96a60ae2010-07-28 13:13:46 +00001010 indent_level = 0
Brian Curtin9a27b0c2010-07-26 00:27:10 +00001011 e = None # None, or an exception
Georg Brandl96a60ae2010-07-28 13:13:46 +00001012 for lineno, line in enumerate(fp, start=1):
Łukasz Langacba24322012-07-07 18:54:08 +02001013 comment_start = sys.maxsize
Georg Brandl96a60ae2010-07-28 13:13:46 +00001014 # strip inline comments
Łukasz Langacba24322012-07-07 18:54:08 +02001015 inline_prefixes = {p: -1 for p in self._inline_comment_prefixes}
1016 while comment_start == sys.maxsize and inline_prefixes:
1017 next_prefixes = {}
1018 for prefix, index in inline_prefixes.items():
1019 index = line.find(prefix, index+1)
1020 if index == -1:
1021 continue
1022 next_prefixes[prefix] = index
1023 if index == 0 or (index > 0 and line[index-1].isspace()):
1024 comment_start = min(comment_start, index)
1025 inline_prefixes = next_prefixes
Łukasz Langab25a7912010-12-17 01:32:29 +00001026 # strip full line comments
1027 for prefix in self._comment_prefixes:
1028 if line.strip().startswith(prefix):
1029 comment_start = 0
1030 break
Łukasz Langacba24322012-07-07 18:54:08 +02001031 if comment_start == sys.maxsize:
1032 comment_start = None
Georg Brandl96a60ae2010-07-28 13:13:46 +00001033 value = line[:comment_start].strip()
1034 if not value:
Georg Brandlf206d0e2010-07-29 11:56:20 +00001035 if self._empty_lines_in_values:
Georg Brandl96a60ae2010-07-28 13:13:46 +00001036 # add empty line to the value, but only if there was no
1037 # comment on the line
Georg Brandlf206d0e2010-07-29 11:56:20 +00001038 if (comment_start is None and
1039 cursect is not None and
1040 optname and
1041 cursect[optname] is not None):
1042 cursect[optname].append('') # newlines added at join
Georg Brandl96a60ae2010-07-28 13:13:46 +00001043 else:
1044 # empty line marks end of value
1045 indent_level = sys.maxsize
Guido van Rossum45e2fbc1998-03-26 21:13:24 +00001046 continue
1047 # continuation line?
Georg Brandl96a60ae2010-07-28 13:13:46 +00001048 first_nonspace = self.NONSPACECRE.search(line)
1049 cur_indent_level = first_nonspace.start() if first_nonspace else 0
1050 if (cursect is not None and optname and
1051 cur_indent_level > indent_level):
1052 cursect[optname].append(value)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +00001053 # a section header or option header?
Guido van Rossum45e2fbc1998-03-26 21:13:24 +00001054 else:
Georg Brandl96a60ae2010-07-28 13:13:46 +00001055 indent_level = cur_indent_level
Barry Warsawbfa3f6b1998-07-01 20:41:12 +00001056 # is it a section header?
Georg Brandl96a60ae2010-07-28 13:13:46 +00001057 mo = self.SECTCRE.match(value)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +00001058 if mo:
1059 sectname = mo.group('header')
Fred Drakefce65572002-10-25 18:08:18 +00001060 if sectname in self._sections:
Fred Drakea4923622010-08-09 12:52:45 +00001061 if self._strict and sectname in elements_added:
1062 raise DuplicateSectionError(sectname, fpname,
1063 lineno)
Fred Drakefce65572002-10-25 18:08:18 +00001064 cursect = self._sections[sectname]
Fred Drakea4923622010-08-09 12:52:45 +00001065 elements_added.add(sectname)
Łukasz Langab6a6f5f2010-12-03 16:28:00 +00001066 elif sectname == self.default_section:
Fred Drakefce65572002-10-25 18:08:18 +00001067 cursect = self._defaults
Barry Warsawbfa3f6b1998-07-01 20:41:12 +00001068 else:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001069 cursect = self._dict()
Fred Drakefce65572002-10-25 18:08:18 +00001070 self._sections[sectname] = cursect
Łukasz Langa49afa382010-11-11 19:53:23 +00001071 self._proxies[sectname] = SectionProxy(self, sectname)
Fred Drakea4923622010-08-09 12:52:45 +00001072 elements_added.add(sectname)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +00001073 # So sections can't start with a continuation line
1074 optname = None
1075 # no section header in the file?
1076 elif cursect is None:
Walter Dörwald70a6b492004-02-12 17:35:32 +00001077 raise MissingSectionHeaderError(fpname, lineno, line)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +00001078 # an option line?
1079 else:
Georg Brandl96a60ae2010-07-28 13:13:46 +00001080 mo = self._optcre.match(value)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +00001081 if mo:
Fred Drakec517b9b2000-02-28 20:59:03 +00001082 optname, vi, optval = mo.group('option', 'vi', 'value')
Georg Brandl96a60ae2010-07-28 13:13:46 +00001083 if not optname:
1084 e = self._handle_error(e, fpname, lineno, line)
Brian Curtin9a27b0c2010-07-26 00:27:10 +00001085 optname = self.optionxform(optname.rstrip())
Fred Drakea4923622010-08-09 12:52:45 +00001086 if (self._strict and
1087 (sectname, optname) in elements_added):
1088 raise DuplicateOptionError(sectname, optname,
1089 fpname, lineno)
1090 elements_added.add((sectname, optname))
Fred Drake03c44a32010-02-19 06:08:41 +00001091 # This check is fine because the OPTCRE cannot
1092 # match if it would set optval to None
1093 if optval is not None:
Fred Drake03c44a32010-02-19 06:08:41 +00001094 optval = optval.strip()
Brian Curtin9a27b0c2010-07-26 00:27:10 +00001095 cursect[optname] = [optval]
1096 else:
1097 # valueless option handling
Łukasz Langab6a6f5f2010-12-03 16:28:00 +00001098 cursect[optname] = None
Barry Warsawbfa3f6b1998-07-01 20:41:12 +00001099 else:
Georg Brandl96a60ae2010-07-28 13:13:46 +00001100 # a non-fatal parsing error occurred. set up the
Barry Warsawbfa3f6b1998-07-01 20:41:12 +00001101 # exception but keep going. the exception will be
1102 # raised at the end of the file and will contain a
1103 # list of all bogus lines
Georg Brandl96a60ae2010-07-28 13:13:46 +00001104 e = self._handle_error(e, fpname, lineno, line)
Barry Warsawbfa3f6b1998-07-01 20:41:12 +00001105 # if any parsing errors occurred, raise an exception
1106 if e:
1107 raise e
Georg Brandl96a60ae2010-07-28 13:13:46 +00001108 self._join_multiline_values()
Fred Drakefce65572002-10-25 18:08:18 +00001109
Georg Brandl96a60ae2010-07-28 13:13:46 +00001110 def _join_multiline_values(self):
Łukasz Langab6a6f5f2010-12-03 16:28:00 +00001111 defaults = self.default_section, self._defaults
1112 all_sections = itertools.chain((defaults,),
1113 self._sections.items())
1114 for section, options in all_sections:
Brian Curtin9a27b0c2010-07-26 00:27:10 +00001115 for name, val in options.items():
1116 if isinstance(val, list):
Łukasz Langab6a6f5f2010-12-03 16:28:00 +00001117 val = '\n'.join(val).rstrip()
1118 options[name] = self._interpolation.before_read(self,
1119 section,
1120 name, val)
Fred Drakefce65572002-10-25 18:08:18 +00001121
Georg Brandl96a60ae2010-07-28 13:13:46 +00001122 def _handle_error(self, exc, fpname, lineno, line):
1123 if not exc:
1124 exc = ParsingError(fpname)
1125 exc.append(lineno, repr(line))
1126 return exc
1127
Fred Drakecc645b92010-09-04 04:35:34 +00001128 def _unify_values(self, section, vars):
Raymond Hettingerddb52402011-02-21 19:42:11 +00001129 """Create a sequence of lookups with 'vars' taking priority over
1130 the 'section' which takes priority over the DEFAULTSECT.
1131
Fred Drakefce65572002-10-25 18:08:18 +00001132 """
Raymond Hettingerddb52402011-02-21 19:42:11 +00001133 sectiondict = {}
Fred Drakefce65572002-10-25 18:08:18 +00001134 try:
Raymond Hettingerddb52402011-02-21 19:42:11 +00001135 sectiondict = self._sections[section]
Fred Drakefce65572002-10-25 18:08:18 +00001136 except KeyError:
Łukasz Langab6a6f5f2010-12-03 16:28:00 +00001137 if section != self.default_section:
Fred Drakefce65572002-10-25 18:08:18 +00001138 raise NoSectionError(section)
1139 # Update with the entry specific variables
Raymond Hettingerddb52402011-02-21 19:42:11 +00001140 vardict = {}
David Goodger68a1abd2004-10-03 15:40:25 +00001141 if vars:
1142 for key, value in vars.items():
Fred Drakecc645b92010-09-04 04:35:34 +00001143 if value is not None:
1144 value = str(value)
Raymond Hettingerddb52402011-02-21 19:42:11 +00001145 vardict[self.optionxform(key)] = value
1146 return _ChainMap(vardict, sectiondict, self._defaults)
Fred Drakecc645b92010-09-04 04:35:34 +00001147
1148 def _convert_to_boolean(self, value):
1149 """Return a boolean value translating from other types if necessary.
1150 """
1151 if value.lower() not in self.BOOLEAN_STATES:
1152 raise ValueError('Not a boolean: %s' % value)
1153 return self.BOOLEAN_STATES[value.lower()]
1154
Łukasz Langa2cf9ddb2010-12-04 12:46:01 +00001155 def _validate_value_types(self, *, section="", option="", value=""):
Łukasz Langa26d513c2010-11-10 18:57:39 +00001156 """Raises a TypeError for non-string values.
1157
1158 The only legal non-string value if we allow valueless
1159 options is None, so we need to check if the value is a
1160 string if:
1161 - we do not allow valueless options, or
1162 - we allow valueless options but the value is not None
1163
1164 For compatibility reasons this method is not used in classic set()
Łukasz Langa7f64c8a2010-12-16 01:16:22 +00001165 for RawConfigParsers. It is invoked in every case for mapping protocol
1166 access and in ConfigParser.set().
Łukasz Langa26d513c2010-11-10 18:57:39 +00001167 """
Łukasz Langa2cf9ddb2010-12-04 12:46:01 +00001168 if not isinstance(section, str):
1169 raise TypeError("section names must be strings")
1170 if not isinstance(option, str):
1171 raise TypeError("option keys must be strings")
Łukasz Langa26d513c2010-11-10 18:57:39 +00001172 if not self._allow_no_value or value:
1173 if not isinstance(value, str):
1174 raise TypeError("option values must be strings")
1175
Łukasz Langadfdd2f72014-09-15 02:08:41 -07001176 @property
1177 def converters(self):
1178 return self._converters
1179
Łukasz Langa26d513c2010-11-10 18:57:39 +00001180
Fred Drakecc645b92010-09-04 04:35:34 +00001181class ConfigParser(RawConfigParser):
1182 """ConfigParser implementing interpolation."""
1183
Łukasz Langab6a6f5f2010-12-03 16:28:00 +00001184 _DEFAULT_INTERPOLATION = BasicInterpolation()
David Goodger1cbf2062004-10-03 15:55:09 +00001185
Fred Drake03c44a32010-02-19 06:08:41 +00001186 def set(self, section, option, value=None):
Łukasz Langab6a6f5f2010-12-03 16:28:00 +00001187 """Set an option. Extends RawConfigParser.set by validating type and
1188 interpolation syntax on the value."""
Łukasz Langa2cf9ddb2010-12-04 12:46:01 +00001189 self._validate_value_types(option=option, value=value)
Łukasz Langab6a6f5f2010-12-03 16:28:00 +00001190 super().set(section, option, value)
Łukasz Langa26d513c2010-11-10 18:57:39 +00001191
Łukasz Langa2cf9ddb2010-12-04 12:46:01 +00001192 def add_section(self, section):
1193 """Create a new section in the configuration. Extends
1194 RawConfigParser.add_section by validating if the section name is
1195 a string."""
1196 self._validate_value_types(section=section)
1197 super().add_section(section)
1198
Łukasz Langa26d513c2010-11-10 18:57:39 +00001199
Łukasz Langa7f64c8a2010-12-16 01:16:22 +00001200class SafeConfigParser(ConfigParser):
1201 """ConfigParser alias for backwards compatibility purposes."""
1202
1203 def __init__(self, *args, **kwargs):
1204 super().__init__(*args, **kwargs)
1205 warnings.warn(
1206 "The SafeConfigParser class has been renamed to ConfigParser "
1207 "in Python 3.2. This alias will be removed in future versions."
1208 " Use ConfigParser directly instead.",
1209 DeprecationWarning, stacklevel=2
1210 )
1211
1212
Łukasz Langa26d513c2010-11-10 18:57:39 +00001213class SectionProxy(MutableMapping):
1214 """A proxy for a single section from a parser."""
1215
Łukasz Langaa73dc9d2010-11-21 13:56:42 +00001216 def __init__(self, parser, name):
1217 """Creates a view on a section of the specified `name` in `parser`."""
Łukasz Langa26d513c2010-11-10 18:57:39 +00001218 self._parser = parser
Łukasz Langaa73dc9d2010-11-21 13:56:42 +00001219 self._name = name
Łukasz Langadfdd2f72014-09-15 02:08:41 -07001220 for conv in parser.converters:
1221 key = 'get' + conv
1222 getter = functools.partial(self.get, _impl=getattr(parser, key))
1223 setattr(self, key, getter)
Łukasz Langa26d513c2010-11-10 18:57:39 +00001224
1225 def __repr__(self):
Łukasz Langaa73dc9d2010-11-21 13:56:42 +00001226 return '<Section: {}>'.format(self._name)
Łukasz Langa26d513c2010-11-10 18:57:39 +00001227
1228 def __getitem__(self, key):
Łukasz Langaa73dc9d2010-11-21 13:56:42 +00001229 if not self._parser.has_option(self._name, key):
Łukasz Langa26d513c2010-11-10 18:57:39 +00001230 raise KeyError(key)
Łukasz Langaa73dc9d2010-11-21 13:56:42 +00001231 return self._parser.get(self._name, key)
Łukasz Langa26d513c2010-11-10 18:57:39 +00001232
1233 def __setitem__(self, key, value):
Łukasz Langa2cf9ddb2010-12-04 12:46:01 +00001234 self._parser._validate_value_types(option=key, value=value)
Łukasz Langaa73dc9d2010-11-21 13:56:42 +00001235 return self._parser.set(self._name, key, value)
Łukasz Langa26d513c2010-11-10 18:57:39 +00001236
1237 def __delitem__(self, key):
Łukasz Langa71b37a52010-12-17 21:56:32 +00001238 if not (self._parser.has_option(self._name, key) and
1239 self._parser.remove_option(self._name, key)):
Łukasz Langa26d513c2010-11-10 18:57:39 +00001240 raise KeyError(key)
Łukasz Langa26d513c2010-11-10 18:57:39 +00001241
1242 def __contains__(self, key):
Łukasz Langaa73dc9d2010-11-21 13:56:42 +00001243 return self._parser.has_option(self._name, key)
Łukasz Langa26d513c2010-11-10 18:57:39 +00001244
1245 def __len__(self):
Łukasz Langa71b37a52010-12-17 21:56:32 +00001246 return len(self._options())
Łukasz Langa26d513c2010-11-10 18:57:39 +00001247
1248 def __iter__(self):
Łukasz Langa71b37a52010-12-17 21:56:32 +00001249 return self._options().__iter__()
1250
1251 def _options(self):
1252 if self._name != self._parser.default_section:
1253 return self._parser.options(self._name)
1254 else:
1255 return self._parser.defaults()
Łukasz Langaa73dc9d2010-11-21 13:56:42 +00001256
1257 @property
1258 def parser(self):
1259 # The parser object of the proxy is read-only.
1260 return self._parser
1261
1262 @property
1263 def name(self):
1264 # The name of the section on a proxy is read-only.
1265 return self._name
Łukasz Langadfdd2f72014-09-15 02:08:41 -07001266
1267 def get(self, option, fallback=None, *, raw=False, vars=None,
1268 _impl=None, **kwargs):
1269 """Get an option value.
1270
1271 Unless `fallback` is provided, `None` will be returned if the option
1272 is not found.
1273
1274 """
1275 # If `_impl` is provided, it should be a getter method on the parser
1276 # object that provides the desired type conversion.
1277 if not _impl:
1278 _impl = self._parser.get
1279 return _impl(self._name, option, raw=raw, vars=vars,
1280 fallback=fallback, **kwargs)
1281
1282
1283class ConverterMapping(MutableMapping):
1284 """Enables reuse of get*() methods between the parser and section proxies.
1285
1286 If a parser class implements a getter directly, the value for the given
1287 key will be ``None``. The presence of the converter name here enables
1288 section proxies to find and use the implementation on the parser class.
1289 """
1290
1291 GETTERCRE = re.compile(r"^get(?P<name>.+)$")
1292
1293 def __init__(self, parser):
1294 self._parser = parser
1295 self._data = {}
1296 for getter in dir(self._parser):
1297 m = self.GETTERCRE.match(getter)
1298 if not m or not callable(getattr(self._parser, getter)):
1299 continue
1300 self._data[m.group('name')] = None # See class docstring.
1301
1302 def __getitem__(self, key):
1303 return self._data[key]
1304
1305 def __setitem__(self, key, value):
1306 try:
1307 k = 'get' + key
1308 except TypeError:
1309 raise ValueError('Incompatible key: {} (type: {})'
1310 ''.format(key, type(key)))
1311 if k == 'get':
1312 raise ValueError('Incompatible key: cannot use "" as a name')
1313 self._data[key] = value
1314 func = functools.partial(self._parser._get_conv, conv=value)
1315 func.converter = value
1316 setattr(self._parser, k, func)
1317 for proxy in self._parser.values():
1318 getter = functools.partial(proxy.get, _impl=func)
1319 setattr(proxy, k, getter)
1320
1321 def __delitem__(self, key):
1322 try:
1323 k = 'get' + (key or None)
1324 except TypeError:
1325 raise KeyError(key)
1326 del self._data[key]
1327 for inst in itertools.chain((self._parser,), self._parser.values()):
1328 try:
1329 delattr(inst, k)
1330 except AttributeError:
1331 # don't raise since the entry was present in _data, silently
1332 # clean up
1333 continue
1334
1335 def __iter__(self):
1336 return iter(self._data)
1337
1338 def __len__(self):
1339 return len(self._data)