annotate Lib/ConfigParser.py @ 49955:878d40468c4e legacy-trunk

Issue #4384: Added logging integration with warnings module using captureWarnings(). This change includes a NullHandler which does nothing; it will be of use to library developers who want to avoid the "No handlers could be found for logger XXX" message which can appear if the library user doesn't configure logging.
author Vinay Sajip <vinay_sajip@yahoo.co.uk>
date Wed, 03 Dec 2008 23:22:58 +0000
parents a7bf503c857e
children 83228bbe5906 6b1b2e7a06e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 """Configuration file parser.
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 A setup file consists of sections, lead by a "[section]" header,
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 and followed by "name: value" entries, with continuations and such in
8614
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
5 the style of RFC 822.
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
6
8614
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
7 The option values can contain format strings which refer to other values in
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
8 the same section, or values in a special [DEFAULT] section.
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
9
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 For example:
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
11
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 something: %(dir)s/whatever
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
13
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 would resolve the "%(dir)s" to the value of dir. All reference
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 expansions are done late, on demand.
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
16
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 Intrinsic defaults can be specified by passing them into the
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 ConfigParser constructor as a dictionary.
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
19
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 class:
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
21
30723
6f15e73b59f2 Backport checkin:
Walter Dörwald <walter@livinglogic.de>
parents: 30275
diff changeset
22 ConfigParser -- responsible for parsing a list of
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 configuration files, and managing the parsed database.
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
24
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 methods:
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
26
9961
879e3491b661 Re-format the module docstring and document the new get() argument.
Barry Warsaw <barry@python.org>
parents: 9959
diff changeset
27 __init__(defaults=None)
879e3491b661 Re-format the module docstring and document the new get() argument.
Barry Warsaw <barry@python.org>
parents: 9959
diff changeset
28 create the parser and specify a dictionary of intrinsic defaults. The
879e3491b661 Re-format the module docstring and document the new get() argument.
Barry Warsaw <barry@python.org>
parents: 9959
diff changeset
29 keys must be strings, the values must be appropriate for %()s string
879e3491b661 Re-format the module docstring and document the new get() argument.
Barry Warsaw <barry@python.org>
parents: 9959
diff changeset
30 interpolation. Note that `__name__' is always an intrinsic default;
35276
4adbd331d335 Fix all wrong instances of "it's".
Georg Brandl <georg@python.org>
parents: 33663
diff changeset
31 its value is the section's name.
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
32
9961
879e3491b661 Re-format the module docstring and document the new get() argument.
Barry Warsaw <barry@python.org>
parents: 9959
diff changeset
33 sections()
879e3491b661 Re-format the module docstring and document the new get() argument.
Barry Warsaw <barry@python.org>
parents: 9959
diff changeset
34 return all the configuration section names, sans DEFAULT
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
35
11370
41990bce023a Added has_option(); fix bug in get() which botched interpolation if
Guido van Rossum <guido@python.org>
parents: 11369
diff changeset
36 has_section(section)
41990bce023a Added has_option(); fix bug in get() which botched interpolation if
Guido van Rossum <guido@python.org>
parents: 11369
diff changeset
37 return whether the given section exists
41990bce023a Added has_option(); fix bug in get() which botched interpolation if
Guido van Rossum <guido@python.org>
parents: 11369
diff changeset
38
13600
39f54b9a7f9c ConfigParser enhancements to edit existing configs, part 2
Eric S. Raymond <esr@thyrsus.com>
parents: 13521
diff changeset
39 has_option(section, option)
39f54b9a7f9c ConfigParser enhancements to edit existing configs, part 2
Eric S. Raymond <esr@thyrsus.com>
parents: 13521
diff changeset
40 return whether the given option exists in the given section
39f54b9a7f9c ConfigParser enhancements to edit existing configs, part 2
Eric S. Raymond <esr@thyrsus.com>
parents: 13521
diff changeset
41
9961
879e3491b661 Re-format the module docstring and document the new get() argument.
Barry Warsaw <barry@python.org>
parents: 9959
diff changeset
42 options(section)
879e3491b661 Re-format the module docstring and document the new get() argument.
Barry Warsaw <barry@python.org>
parents: 9959
diff changeset
43 return list of configuration options for the named section
879e3491b661 Re-format the module docstring and document the new get() argument.
Barry Warsaw <barry@python.org>
parents: 9959
diff changeset
44
10037
f132ecfdb285 From: Mike Orr <mso@oz.net>
Guido van Rossum <guido@python.org>
parents: 9961
diff changeset
45 read(filenames)
11369
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
46 read and parse the list of named configuration files, given by
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
47 name. A single filename is also allowed. Non-existing files
32117
29a59f662dd1 ConfigParser:
Fred Drake <fdrake@acm.org>
parents: 32115
diff changeset
48 are ignored. Return list of successfully read files.
11369
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
49
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
50 readfp(fp, filename=None)
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
51 read and parse one configuration file, given as a file object.
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
52 The filename defaults to fp.name; it is only used in error
11381
4ad14e4dc7e5 fixed a typo in a docstring, and slightly expanded the module
Barry Warsaw <barry@python.org>
parents: 11370
diff changeset
53 messages (if fp has no `name' attribute, the string `<???>' is used).
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
54
26685
a20cb5abab6b Update doc for getboolean() to match code (ie, returning True/False)
Neal Norwitz <nnorwitz@gmail.com>
parents: 26126
diff changeset
55 get(section, option, raw=False, vars=None)
9961
879e3491b661 Re-format the module docstring and document the new get() argument.
Barry Warsaw <barry@python.org>
parents: 9959
diff changeset
56 return a string value for the named option. All % interpolations are
879e3491b661 Re-format the module docstring and document the new get() argument.
Barry Warsaw <barry@python.org>
parents: 9959
diff changeset
57 expanded in the return values, based on the defaults passed into the
879e3491b661 Re-format the module docstring and document the new get() argument.
Barry Warsaw <barry@python.org>
parents: 9959
diff changeset
58 constructor and the DEFAULT section. Additional substitutions may be
879e3491b661 Re-format the module docstring and document the new get() argument.
Barry Warsaw <barry@python.org>
parents: 9959
diff changeset
59 provided using the `vars' argument, which must be a dictionary whose
879e3491b661 Re-format the module docstring and document the new get() argument.
Barry Warsaw <barry@python.org>
parents: 9959
diff changeset
60 contents override any pre-existing defaults.
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
61
9961
879e3491b661 Re-format the module docstring and document the new get() argument.
Barry Warsaw <barry@python.org>
parents: 9959
diff changeset
62 getint(section, options)
879e3491b661 Re-format the module docstring and document the new get() argument.
Barry Warsaw <barry@python.org>
parents: 9959
diff changeset
63 like get(), but convert value to an integer
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
64
9961
879e3491b661 Re-format the module docstring and document the new get() argument.
Barry Warsaw <barry@python.org>
parents: 9959
diff changeset
65 getfloat(section, options)
879e3491b661 Re-format the module docstring and document the new get() argument.
Barry Warsaw <barry@python.org>
parents: 9959
diff changeset
66 like get(), but convert value to a float
879e3491b661 Re-format the module docstring and document the new get() argument.
Barry Warsaw <barry@python.org>
parents: 9959
diff changeset
67
879e3491b661 Re-format the module docstring and document the new get() argument.
Barry Warsaw <barry@python.org>
parents: 9959
diff changeset
68 getboolean(section, options)
20261
56f17810534c Apply modified SF patch 467580: ConfigParser.getboolean(): FALSE, TRUE.
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
69 like get(), but convert value to a boolean (currently case
26685
a20cb5abab6b Update doc for getboolean() to match code (ie, returning True/False)
Neal Norwitz <nnorwitz@gmail.com>
parents: 26126
diff changeset
70 insensitively defined as 0, false, no, off for False, and 1, true,
a20cb5abab6b Update doc for getboolean() to match code (ie, returning True/False)
Neal Norwitz <nnorwitz@gmail.com>
parents: 26126
diff changeset
71 yes, on for True). Returns False or True.
13600
39f54b9a7f9c ConfigParser enhancements to edit existing configs, part 2
Eric S. Raymond <esr@thyrsus.com>
parents: 13521
diff changeset
72
26685
a20cb5abab6b Update doc for getboolean() to match code (ie, returning True/False)
Neal Norwitz <nnorwitz@gmail.com>
parents: 26126
diff changeset
73 items(section, raw=False, vars=None)
25461
09551c6da299 items(): New method, provided by Gustavo Niemeyer in SF bug #545096.
Fred Drake <fdrake@acm.org>
parents: 25459
diff changeset
74 return a list of tuples with (name, value) for each option
09551c6da299 items(): New method, provided by Gustavo Niemeyer in SF bug #545096.
Fred Drake <fdrake@acm.org>
parents: 25459
diff changeset
75 in the section.
09551c6da299 items(): New method, provided by Gustavo Niemeyer in SF bug #545096.
Fred Drake <fdrake@acm.org>
parents: 25459
diff changeset
76
13600
39f54b9a7f9c ConfigParser enhancements to edit existing configs, part 2
Eric S. Raymond <esr@thyrsus.com>
parents: 13521
diff changeset
77 remove_section(section)
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15501
diff changeset
78 remove the given file section and all its options
13600
39f54b9a7f9c ConfigParser enhancements to edit existing configs, part 2
Eric S. Raymond <esr@thyrsus.com>
parents: 13521
diff changeset
79
39f54b9a7f9c ConfigParser enhancements to edit existing configs, part 2
Eric S. Raymond <esr@thyrsus.com>
parents: 13521
diff changeset
80 remove_option(section, option)
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15501
diff changeset
81 remove the given option from the given section
13600
39f54b9a7f9c ConfigParser enhancements to edit existing configs, part 2
Eric S. Raymond <esr@thyrsus.com>
parents: 13521
diff changeset
82
39f54b9a7f9c ConfigParser enhancements to edit existing configs, part 2
Eric S. Raymond <esr@thyrsus.com>
parents: 13521
diff changeset
83 set(section, option, value)
39f54b9a7f9c ConfigParser enhancements to edit existing configs, part 2
Eric S. Raymond <esr@thyrsus.com>
parents: 13521
diff changeset
84 set the given option
39f54b9a7f9c ConfigParser enhancements to edit existing configs, part 2
Eric S. Raymond <esr@thyrsus.com>
parents: 13521
diff changeset
85
39f54b9a7f9c ConfigParser enhancements to edit existing configs, part 2
Eric S. Raymond <esr@thyrsus.com>
parents: 13521
diff changeset
86 write(fp)
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15501
diff changeset
87 write the configuration state in .ini format
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 """
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
89
8614
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
90 import re
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
91
26909
074919715355 - added InterpolationSyntaxError to __all__
Fred Drake <fdrake@acm.org>
parents: 26907
diff changeset
92 __all__ = ["NoSectionError", "DuplicateSectionError", "NoOptionError",
074919715355 - added InterpolationSyntaxError to __all__
Fred Drake <fdrake@acm.org>
parents: 26907
diff changeset
93 "InterpolationError", "InterpolationDepthError",
074919715355 - added InterpolationSyntaxError to __all__
Fred Drake <fdrake@acm.org>
parents: 26907
diff changeset
94 "InterpolationSyntaxError", "ParsingError",
33663
5412096d0f95 SF bug #997050: Document, test, & check for non-string values in ConfigParser. Moved the new string-only restriction added in rev. 1.65 to the SafeConfigParser class, leaving existing ConfigParser & RawConfigParser behavior alone, and documented the conditions under which non-string values work.
David Goodger <goodger@python.org>
parents: 33662
diff changeset
95 "MissingSectionHeaderError",
5412096d0f95 SF bug #997050: Document, test, & check for non-string values in ConfigParser. Moved the new string-only restriction added in rev. 1.65 to the SafeConfigParser class, leaving existing ConfigParser & RawConfigParser behavior alone, and documented the conditions under which non-string values work.
David Goodger <goodger@python.org>
parents: 33662
diff changeset
96 "ConfigParser", "SafeConfigParser", "RawConfigParser",
25459
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
97 "DEFAULTSECT", "MAX_INTERPOLATION_DEPTH"]
16070
b5345e99596b added __all__ lists to a number of Python modules
Skip Montanaro <skip@pobox.com>
parents: 15867
diff changeset
98
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 DEFAULTSECT = "DEFAULT"
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
100
14899
606a80834a86 Allow spaces in section names.
Fred Drake <fdrake@acm.org>
parents: 14840
diff changeset
101 MAX_INTERPOLATION_DEPTH = 10
606a80834a86 Allow spaces in section names.
Fred Drake <fdrake@acm.org>
parents: 14840
diff changeset
102
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
103
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15501
diff changeset
104
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
105 # exception classes
15501
55f4a6e8b5b3 Make ConfigParser.Error inherit from Exception.
Fred Drake <fdrake@acm.org>
parents: 15479
diff changeset
106 class Error(Exception):
26909
074919715355 - added InterpolationSyntaxError to __all__
Fred Drake <fdrake@acm.org>
parents: 26907
diff changeset
107 """Base class for ConfigParser exceptions."""
074919715355 - added InterpolationSyntaxError to __all__
Fred Drake <fdrake@acm.org>
parents: 26907
diff changeset
108
41617
615795d52b9f Deprecate BaseException.message as per PEP 352.
Brett Cannon <bcannon@gmail.com>
parents: 41157
diff changeset
109 def _get_message(self):
615795d52b9f Deprecate BaseException.message as per PEP 352.
Brett Cannon <bcannon@gmail.com>
parents: 41157
diff changeset
110 """Getter for 'message'; needed only to override deprecation in
615795d52b9f Deprecate BaseException.message as per PEP 352.
Brett Cannon <bcannon@gmail.com>
parents: 41157
diff changeset
111 BaseException."""
615795d52b9f Deprecate BaseException.message as per PEP 352.
Brett Cannon <bcannon@gmail.com>
parents: 41157
diff changeset
112 return self.__message
615795d52b9f Deprecate BaseException.message as per PEP 352.
Brett Cannon <bcannon@gmail.com>
parents: 41157
diff changeset
113
615795d52b9f Deprecate BaseException.message as per PEP 352.
Brett Cannon <bcannon@gmail.com>
parents: 41157
diff changeset
114 def _set_message(self, value):
615795d52b9f Deprecate BaseException.message as per PEP 352.
Brett Cannon <bcannon@gmail.com>
parents: 41157
diff changeset
115 """Setter for 'message'; needed only to override deprecation in
615795d52b9f Deprecate BaseException.message as per PEP 352.
Brett Cannon <bcannon@gmail.com>
parents: 41157
diff changeset
116 BaseException."""
615795d52b9f Deprecate BaseException.message as per PEP 352.
Brett Cannon <bcannon@gmail.com>
parents: 41157
diff changeset
117 self.__message = value
615795d52b9f Deprecate BaseException.message as per PEP 352.
Brett Cannon <bcannon@gmail.com>
parents: 41157
diff changeset
118
615795d52b9f Deprecate BaseException.message as per PEP 352.
Brett Cannon <bcannon@gmail.com>
parents: 41157
diff changeset
119 # BaseException.message has been deprecated since Python 2.6. To prevent
615795d52b9f Deprecate BaseException.message as per PEP 352.
Brett Cannon <bcannon@gmail.com>
parents: 41157
diff changeset
120 # DeprecationWarning from popping up over this pre-existing attribute, use
615795d52b9f Deprecate BaseException.message as per PEP 352.
Brett Cannon <bcannon@gmail.com>
parents: 41157
diff changeset
121 # a new property that takes lookup precedence.
615795d52b9f Deprecate BaseException.message as per PEP 352.
Brett Cannon <bcannon@gmail.com>
parents: 41157
diff changeset
122 message = property(_get_message, _set_message)
615795d52b9f Deprecate BaseException.message as per PEP 352.
Brett Cannon <bcannon@gmail.com>
parents: 41157
diff changeset
123
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 def __init__(self, msg=''):
26969
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
125 self.message = msg
15501
55f4a6e8b5b3 Make ConfigParser.Error inherit from Exception.
Fred Drake <fdrake@acm.org>
parents: 15479
diff changeset
126 Exception.__init__(self, msg)
26909
074919715355 - added InterpolationSyntaxError to __all__
Fred Drake <fdrake@acm.org>
parents: 26907
diff changeset
127
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
128 def __repr__(self):
26969
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
129 return self.message
26909
074919715355 - added InterpolationSyntaxError to __all__
Fred Drake <fdrake@acm.org>
parents: 26907
diff changeset
130
15501
55f4a6e8b5b3 Make ConfigParser.Error inherit from Exception.
Fred Drake <fdrake@acm.org>
parents: 15479
diff changeset
131 __str__ = __repr__
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
132
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 class NoSectionError(Error):
26909
074919715355 - added InterpolationSyntaxError to __all__
Fred Drake <fdrake@acm.org>
parents: 26907
diff changeset
134 """Raised when no section matches a requested option."""
074919715355 - added InterpolationSyntaxError to __all__
Fred Drake <fdrake@acm.org>
parents: 26907
diff changeset
135
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
136 def __init__(self, section):
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 30734
diff changeset
137 Error.__init__(self, 'No section: %r' % (section,))
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
138 self.section = section
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
139
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
140 class DuplicateSectionError(Error):
26909
074919715355 - added InterpolationSyntaxError to __all__
Fred Drake <fdrake@acm.org>
parents: 26907
diff changeset
141 """Raised when a section is multiply-created."""
074919715355 - added InterpolationSyntaxError to __all__
Fred Drake <fdrake@acm.org>
parents: 26907
diff changeset
142
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
143 def __init__(self, section):
26969
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
144 Error.__init__(self, "Section %r already exists" % section)
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
145 self.section = section
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
146
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 class NoOptionError(Error):
26909
074919715355 - added InterpolationSyntaxError to __all__
Fred Drake <fdrake@acm.org>
parents: 26907
diff changeset
148 """A requested option was not found."""
074919715355 - added InterpolationSyntaxError to __all__
Fred Drake <fdrake@acm.org>
parents: 26907
diff changeset
149
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
150 def __init__(self, option, section):
26969
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
151 Error.__init__(self, "No option %r in section: %r" %
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
152 (option, section))
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
153 self.option = option
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
154 self.section = section
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
155
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
156 class InterpolationError(Error):
26969
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
157 """Base class for interpolation-related exceptions."""
26909
074919715355 - added InterpolationSyntaxError to __all__
Fred Drake <fdrake@acm.org>
parents: 26907
diff changeset
158
26969
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
159 def __init__(self, option, section, msg):
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
160 Error.__init__(self, msg)
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
161 self.option = option
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
162 self.section = section
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
163
26969
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
164 class InterpolationMissingOptionError(InterpolationError):
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
165 """A string substitution required a setting which was not available."""
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
166
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
167 def __init__(self, option, section, rawval, reference):
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
168 msg = ("Bad value substitution:\n"
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
169 "\tsection: [%s]\n"
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
170 "\toption : %s\n"
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
171 "\tkey : %s\n"
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
172 "\trawval : %s\n"
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
173 % (section, option, reference, rawval))
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
174 InterpolationError.__init__(self, option, section, msg)
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
175 self.reference = reference
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
176
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
177 class InterpolationSyntaxError(InterpolationError):
26909
074919715355 - added InterpolationSyntaxError to __all__
Fred Drake <fdrake@acm.org>
parents: 26907
diff changeset
178 """Raised when the source text into which substitutions are made
074919715355 - added InterpolationSyntaxError to __all__
Fred Drake <fdrake@acm.org>
parents: 26907
diff changeset
179 does not conform to the required syntax."""
26907
ccba3b66d676 Add missing InterpolationSyntaxError.
Neal Norwitz <nnorwitz@gmail.com>
parents: 26685
diff changeset
180
26969
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
181 class InterpolationDepthError(InterpolationError):
26909
074919715355 - added InterpolationSyntaxError to __all__
Fred Drake <fdrake@acm.org>
parents: 26907
diff changeset
182 """Raised when substitutions are nested too deeply."""
074919715355 - added InterpolationSyntaxError to __all__
Fred Drake <fdrake@acm.org>
parents: 26907
diff changeset
183
14899
606a80834a86 Allow spaces in section names.
Fred Drake <fdrake@acm.org>
parents: 14840
diff changeset
184 def __init__(self, option, section, rawval):
26969
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
185 msg = ("Value interpolation too deeply recursive:\n"
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
186 "\tsection: [%s]\n"
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
187 "\toption : %s\n"
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
188 "\trawval : %s\n"
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
189 % (section, option, rawval))
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
190 InterpolationError.__init__(self, option, section, msg)
8614
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
191
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
192 class ParsingError(Error):
26909
074919715355 - added InterpolationSyntaxError to __all__
Fred Drake <fdrake@acm.org>
parents: 26907
diff changeset
193 """Raised when a configuration file does not follow legal syntax."""
074919715355 - added InterpolationSyntaxError to __all__
Fred Drake <fdrake@acm.org>
parents: 26907
diff changeset
194
8614
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
195 def __init__(self, filename):
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
196 Error.__init__(self, 'File contains parsing errors: %s' % filename)
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
197 self.filename = filename
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
198 self.errors = []
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
199
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
200 def append(self, lineno, line):
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
201 self.errors.append((lineno, line))
26969
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
202 self.message += '\n\t[line %2d]: %s' % (lineno, line)
8614
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
203
14899
606a80834a86 Allow spaces in section names.
Fred Drake <fdrake@acm.org>
parents: 14840
diff changeset
204 class MissingSectionHeaderError(ParsingError):
26909
074919715355 - added InterpolationSyntaxError to __all__
Fred Drake <fdrake@acm.org>
parents: 26907
diff changeset
205 """Raised when a key-value pair is found before any section header."""
074919715355 - added InterpolationSyntaxError to __all__
Fred Drake <fdrake@acm.org>
parents: 26907
diff changeset
206
14899
606a80834a86 Allow spaces in section names.
Fred Drake <fdrake@acm.org>
parents: 14840
diff changeset
207 def __init__(self, filename, lineno, line):
606a80834a86 Allow spaces in section names.
Fred Drake <fdrake@acm.org>
parents: 14840
diff changeset
208 Error.__init__(
606a80834a86 Allow spaces in section names.
Fred Drake <fdrake@acm.org>
parents: 14840
diff changeset
209 self,
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 30734
diff changeset
210 'File contains no section headers.\nfile: %s, line: %d\n%r' %
14899
606a80834a86 Allow spaces in section names.
Fred Drake <fdrake@acm.org>
parents: 14840
diff changeset
211 (filename, lineno, line))
606a80834a86 Allow spaces in section names.
Fred Drake <fdrake@acm.org>
parents: 14840
diff changeset
212 self.filename = filename
606a80834a86 Allow spaces in section names.
Fred Drake <fdrake@acm.org>
parents: 14840
diff changeset
213 self.lineno = lineno
606a80834a86 Allow spaces in section names.
Fred Drake <fdrake@acm.org>
parents: 14840
diff changeset
214 self.line = line
606a80834a86 Allow spaces in section names.
Fred Drake <fdrake@acm.org>
parents: 14840
diff changeset
215
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
216
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
217 class RawConfigParser:
40418
3ee9d1a36d46 Patch #1371075: Make ConfigParser accept optional dict type
Martin v. Löwis <martin@v.loewis.de>
parents: 35276
diff changeset
218 def __init__(self, defaults=None, dict_type=dict):
3ee9d1a36d46 Patch #1371075: Make ConfigParser accept optional dict type
Martin v. Löwis <martin@v.loewis.de>
parents: 35276
diff changeset
219 self._dict = dict_type
3ee9d1a36d46 Patch #1371075: Make ConfigParser accept optional dict type
Martin v. Löwis <martin@v.loewis.de>
parents: 35276
diff changeset
220 self._sections = self._dict()
3ee9d1a36d46 Patch #1371075: Make ConfigParser accept optional dict type
Martin v. Löwis <martin@v.loewis.de>
parents: 35276
diff changeset
221 self._defaults = self._dict()
33662
cc4684051c46 SF bug #1017864: ConfigParser now correctly handles default keys, processing them with ``ConfigParser.optionxform`` when supplied, consistent with the handling of config file entries and runtime-set options.
David Goodger <goodger@python.org>
parents: 32117
diff changeset
222 if defaults:
cc4684051c46 SF bug #1017864: ConfigParser now correctly handles default keys, processing them with ``ConfigParser.optionxform`` when supplied, consistent with the handling of config file entries and runtime-set options.
David Goodger <goodger@python.org>
parents: 32117
diff changeset
223 for key, value in defaults.items():
cc4684051c46 SF bug #1017864: ConfigParser now correctly handles default keys, processing them with ``ConfigParser.optionxform`` when supplied, consistent with the handling of config file entries and runtime-set options.
David Goodger <goodger@python.org>
parents: 32117
diff changeset
224 self._defaults[self.optionxform(key)] = value
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
225
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
226 def defaults(self):
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
227 return self._defaults
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
228
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
229 def sections(self):
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
230 """Return a list of section names, excluding [DEFAULT]"""
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
231 # self._sections will never have [DEFAULT] in it
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
232 return self._sections.keys()
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
233
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
234 def add_section(self, section):
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
235 """Create a new section in the configuration.
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
236
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
237 Raise DuplicateSectionError if a section by the specified name
45445
dda92a097e8c Issue 1781. Now ConfigParser.add_section does not let you add a
Facundo Batista <facundobatista@gmail.com>
parents: 41617
diff changeset
238 already exists. Raise ValueError if name is DEFAULT or any of it's
dda92a097e8c Issue 1781. Now ConfigParser.add_section does not let you add a
Facundo Batista <facundobatista@gmail.com>
parents: 41617
diff changeset
239 case-insensitive variants.
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
240 """
45445
dda92a097e8c Issue 1781. Now ConfigParser.add_section does not let you add a
Facundo Batista <facundobatista@gmail.com>
parents: 41617
diff changeset
241 if section.lower() == "default":
dda92a097e8c Issue 1781. Now ConfigParser.add_section does not let you add a
Facundo Batista <facundobatista@gmail.com>
parents: 41617
diff changeset
242 raise ValueError, 'Invalid section name: %s' % section
dda92a097e8c Issue 1781. Now ConfigParser.add_section does not let you add a
Facundo Batista <facundobatista@gmail.com>
parents: 41617
diff changeset
243
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
244 if section in self._sections:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
245 raise DuplicateSectionError(section)
40418
3ee9d1a36d46 Patch #1371075: Make ConfigParser accept optional dict type
Martin v. Löwis <martin@v.loewis.de>
parents: 35276
diff changeset
246 self._sections[section] = self._dict()
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
247
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
248 def has_section(self, section):
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
249 """Indicate whether the named section is present in the configuration.
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
250
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
251 The DEFAULT section is not acknowledged.
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
252 """
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
253 return section in self._sections
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
254
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
255 def options(self, section):
11370
41990bce023a Added has_option(); fix bug in get() which botched interpolation if
Guido van Rossum <guido@python.org>
parents: 11369
diff changeset
256 """Return a list of option names for the given section name."""
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
257 try:
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
258 opts = self._sections[section].copy()
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
259 except KeyError:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
260 raise NoSectionError(section)
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
261 opts.update(self._defaults)
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23611
diff changeset
262 if '__name__' in opts:
14899
606a80834a86 Allow spaces in section names.
Fred Drake <fdrake@acm.org>
parents: 14840
diff changeset
263 del opts['__name__']
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
264 return opts.keys()
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
265
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
266 def read(self, filenames):
11369
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
267 """Read and parse a filename or a list of filenames.
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15501
diff changeset
268
11369
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
269 Files that cannot be opened are silently ignored; this is
11381
4ad14e4dc7e5 fixed a typo in a docstring, and slightly expanded the module
Barry Warsaw <barry@python.org>
parents: 11370
diff changeset
270 designed so that you can specify a list of potential
11369
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
271 configuration file locations (e.g. current directory, user's
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
272 home directory, systemwide directory), and all existing
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
273 configuration files in the list will be read. A single
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
274 filename may also be given.
32117
29a59f662dd1 ConfigParser:
Fred Drake <fdrake@acm.org>
parents: 32115
diff changeset
275
29a59f662dd1 ConfigParser:
Fred Drake <fdrake@acm.org>
parents: 32115
diff changeset
276 Return list of successfully read files.
11369
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
277 """
23645
e1e90b0f1f45 Remove uses of the string and types modules:
Walter Dörwald <walter@livinglogic.de>
parents: 23620
diff changeset
278 if isinstance(filenames, basestring):
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
279 filenames = [filenames]
32117
29a59f662dd1 ConfigParser:
Fred Drake <fdrake@acm.org>
parents: 32115
diff changeset
280 read_ok = []
11369
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
281 for filename in filenames:
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
282 try:
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
283 fp = open(filename)
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
284 except IOError:
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
285 continue
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
286 self._read(fp, filename)
11368
b9bbe88d9554 ConfigParser.read(): Don't mask IOError exceptions.
Fred Drake <fdrake@acm.org>
parents: 11007
diff changeset
287 fp.close()
32117
29a59f662dd1 ConfigParser:
Fred Drake <fdrake@acm.org>
parents: 32115
diff changeset
288 read_ok.append(filename)
29a59f662dd1 ConfigParser:
Fred Drake <fdrake@acm.org>
parents: 32115
diff changeset
289 return read_ok
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
290
11369
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
291 def readfp(self, fp, filename=None):
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
292 """Like read() but the argument must be a file-like object.
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
293
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
294 The `fp' argument must have a `readline' method. Optional
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
295 second argument is the `filename', which if not given, is
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
296 taken from fp.name. If fp has no `name' attribute, `<???>' is
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
297 used.
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
298
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
299 """
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
300 if filename is None:
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
301 try:
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
302 filename = fp.name
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
303 except AttributeError:
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
304 filename = '<???>'
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
305 self._read(fp, filename)
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
306
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
307 def get(self, section, option):
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
308 opt = self.optionxform(option)
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
309 if section not in self._sections:
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
310 if section != DEFAULTSECT:
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
311 raise NoSectionError(section)
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
312 if opt in self._defaults:
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
313 return self._defaults[opt]
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
314 else:
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
315 raise NoOptionError(option, section)
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
316 elif opt in self._sections[section]:
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
317 return self._sections[section][opt]
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
318 elif opt in self._defaults:
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
319 return self._defaults[opt]
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
320 else:
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
321 raise NoOptionError(option, section)
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
322
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
323 def items(self, section):
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
324 try:
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
325 d2 = self._sections[section]
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
326 except KeyError:
25459
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
327 if section != DEFAULTSECT:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
328 raise NoSectionError(section)
40418
3ee9d1a36d46 Patch #1371075: Make ConfigParser accept optional dict type
Martin v. Löwis <martin@v.loewis.de>
parents: 35276
diff changeset
329 d2 = self._dict()
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
330 d = self._defaults.copy()
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
331 d.update(d2)
25916
8bb6003f7f54 According to the docs, __name__ is not exposed via the API except
Fred Drake <fdrake@acm.org>
parents: 25908
diff changeset
332 if "__name__" in d:
8bb6003f7f54 According to the docs, __name__ is not exposed via the API except
Fred Drake <fdrake@acm.org>
parents: 25908
diff changeset
333 del d["__name__"]
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
334 return d.items()
25461
09551c6da299 items(): New method, provided by Gustavo Niemeyer in SF bug #545096.
Fred Drake <fdrake@acm.org>
parents: 25459
diff changeset
335
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
336 def _get(self, section, conv, option):
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
337 return conv(self.get(section, option))
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
338
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
339 def getint(self, section, option):
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
340 return self._get(section, int, option)
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
341
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
342 def getfloat(self, section, option):
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
343 return self._get(section, float, option)
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
344
25459
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
345 _boolean_states = {'1': True, 'yes': True, 'true': True, 'on': True,
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
346 '0': False, 'no': False, 'false': False, 'off': False}
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
347
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
348 def getboolean(self, section, option):
20547
a12ccdbce8da Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 20261
diff changeset
349 v = self.get(section, option)
25459
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
350 if v.lower() not in self._boolean_states:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
351 raise ValueError, 'Not a boolean: %s' % v
25459
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
352 return self._boolean_states[v.lower()]
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
353
11007
b9f55cc10ab3 Patch suggested (and partially provided) by Lars Damerow: instead of
Guido van Rossum <guido@python.org>
parents: 10145
diff changeset
354 def optionxform(self, optionstr):
16480
e97217f5b323 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
355 return optionstr.lower()
11007
b9f55cc10ab3 Patch suggested (and partially provided) by Lars Damerow: instead of
Guido van Rossum <guido@python.org>
parents: 10145
diff changeset
356
13521
4dbc75c189bc Give ConfigParser the capability to set as well as read options, and to write
Eric S. Raymond <esr@thyrsus.com>
parents: 12632
diff changeset
357 def has_option(self, section, option):
4dbc75c189bc Give ConfigParser the capability to set as well as read options, and to write
Eric S. Raymond <esr@thyrsus.com>
parents: 12632
diff changeset
358 """Check for the existence of a given option in a given section."""
25459
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
359 if not section or section == DEFAULTSECT:
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
360 option = self.optionxform(option)
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
361 return option in self._defaults
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
362 elif section not in self._sections:
26685
a20cb5abab6b Update doc for getboolean() to match code (ie, returning True/False)
Neal Norwitz <nnorwitz@gmail.com>
parents: 26126
diff changeset
363 return False
13521
4dbc75c189bc Give ConfigParser the capability to set as well as read options, and to write
Eric S. Raymond <esr@thyrsus.com>
parents: 12632
diff changeset
364 else:
16771
b235160f1346 Make sure ConfigParser uses .optionxform() consistently; this affects
Fred Drake <fdrake@acm.org>
parents: 16594
diff changeset
365 option = self.optionxform(option)
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
366 return (option in self._sections[section]
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
367 or option in self._defaults)
13521
4dbc75c189bc Give ConfigParser the capability to set as well as read options, and to write
Eric S. Raymond <esr@thyrsus.com>
parents: 12632
diff changeset
368
4dbc75c189bc Give ConfigParser the capability to set as well as read options, and to write
Eric S. Raymond <esr@thyrsus.com>
parents: 12632
diff changeset
369 def set(self, section, option, value):
4dbc75c189bc Give ConfigParser the capability to set as well as read options, and to write
Eric S. Raymond <esr@thyrsus.com>
parents: 12632
diff changeset
370 """Set an option."""
25459
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
371 if not section or section == DEFAULTSECT:
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
372 sectdict = self._defaults
13521
4dbc75c189bc Give ConfigParser the capability to set as well as read options, and to write
Eric S. Raymond <esr@thyrsus.com>
parents: 12632
diff changeset
373 else:
4dbc75c189bc Give ConfigParser the capability to set as well as read options, and to write
Eric S. Raymond <esr@thyrsus.com>
parents: 12632
diff changeset
374 try:
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
375 sectdict = self._sections[section]
13521
4dbc75c189bc Give ConfigParser the capability to set as well as read options, and to write
Eric S. Raymond <esr@thyrsus.com>
parents: 12632
diff changeset
376 except KeyError:
4dbc75c189bc Give ConfigParser the capability to set as well as read options, and to write
Eric S. Raymond <esr@thyrsus.com>
parents: 12632
diff changeset
377 raise NoSectionError(section)
25459
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
378 sectdict[self.optionxform(option)] = value
13521
4dbc75c189bc Give ConfigParser the capability to set as well as read options, and to write
Eric S. Raymond <esr@thyrsus.com>
parents: 12632
diff changeset
379
4dbc75c189bc Give ConfigParser the capability to set as well as read options, and to write
Eric S. Raymond <esr@thyrsus.com>
parents: 12632
diff changeset
380 def write(self, fp):
4dbc75c189bc Give ConfigParser the capability to set as well as read options, and to write
Eric S. Raymond <esr@thyrsus.com>
parents: 12632
diff changeset
381 """Write an .ini-format representation of the configuration state."""
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
382 if self._defaults:
25459
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
383 fp.write("[%s]\n" % DEFAULTSECT)
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
384 for (key, value) in self._defaults.items():
22294
c6c1a5fbb6c1 I presume this should go here.
Michael W. Hudson <mwh@python.net>
parents: 20547
diff changeset
385 fp.write("%s = %s\n" % (key, str(value).replace('\n', '\n\t')))
13521
4dbc75c189bc Give ConfigParser the capability to set as well as read options, and to write
Eric S. Raymond <esr@thyrsus.com>
parents: 12632
diff changeset
386 fp.write("\n")
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
387 for section in self._sections:
25459
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
388 fp.write("[%s]\n" % section)
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
389 for (key, value) in self._sections[section].items():
25459
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
390 if key != "__name__":
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
391 fp.write("%s = %s\n" %
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
392 (key, str(value).replace('\n', '\n\t')))
13521
4dbc75c189bc Give ConfigParser the capability to set as well as read options, and to write
Eric S. Raymond <esr@thyrsus.com>
parents: 12632
diff changeset
393 fp.write("\n")
4dbc75c189bc Give ConfigParser the capability to set as well as read options, and to write
Eric S. Raymond <esr@thyrsus.com>
parents: 12632
diff changeset
394
13650
3d6d218b673d Small fixes by Petru Paler (patch #100946) checked in with esr's approval.
Thomas Wouters <thomas@python.org>
parents: 13600
diff changeset
395 def remove_option(self, section, option):
13600
39f54b9a7f9c ConfigParser enhancements to edit existing configs, part 2
Eric S. Raymond <esr@thyrsus.com>
parents: 13521
diff changeset
396 """Remove an option."""
25459
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
397 if not section or section == DEFAULTSECT:
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
398 sectdict = self._defaults
13600
39f54b9a7f9c ConfigParser enhancements to edit existing configs, part 2
Eric S. Raymond <esr@thyrsus.com>
parents: 13521
diff changeset
399 else:
39f54b9a7f9c ConfigParser enhancements to edit existing configs, part 2
Eric S. Raymond <esr@thyrsus.com>
parents: 13521
diff changeset
400 try:
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
401 sectdict = self._sections[section]
13600
39f54b9a7f9c ConfigParser enhancements to edit existing configs, part 2
Eric S. Raymond <esr@thyrsus.com>
parents: 13521
diff changeset
402 except KeyError:
39f54b9a7f9c ConfigParser enhancements to edit existing configs, part 2
Eric S. Raymond <esr@thyrsus.com>
parents: 13521
diff changeset
403 raise NoSectionError(section)
16771
b235160f1346 Make sure ConfigParser uses .optionxform() consistently; this affects
Fred Drake <fdrake@acm.org>
parents: 16594
diff changeset
404 option = self.optionxform(option)
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23611
diff changeset
405 existed = option in sectdict
13600
39f54b9a7f9c ConfigParser enhancements to edit existing configs, part 2
Eric S. Raymond <esr@thyrsus.com>
parents: 13521
diff changeset
406 if existed:
15479
e98964bc2681 remove_option(): Use the right variable name for the option name!
Fred Drake <fdrake@acm.org>
parents: 14899
diff changeset
407 del sectdict[option]
13600
39f54b9a7f9c ConfigParser enhancements to edit existing configs, part 2
Eric S. Raymond <esr@thyrsus.com>
parents: 13521
diff changeset
408 return existed
39f54b9a7f9c ConfigParser enhancements to edit existing configs, part 2
Eric S. Raymond <esr@thyrsus.com>
parents: 13521
diff changeset
409
13650
3d6d218b673d Small fixes by Petru Paler (patch #100946) checked in with esr's approval.
Thomas Wouters <thomas@python.org>
parents: 13600
diff changeset
410 def remove_section(self, section):
13600
39f54b9a7f9c ConfigParser enhancements to edit existing configs, part 2
Eric S. Raymond <esr@thyrsus.com>
parents: 13521
diff changeset
411 """Remove a file section."""
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
412 existed = section in self._sections
25459
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
413 if existed:
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
414 del self._sections[section]
25459
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
415 return existed
13600
39f54b9a7f9c ConfigParser enhancements to edit existing configs, part 2
Eric S. Raymond <esr@thyrsus.com>
parents: 13521
diff changeset
416
8614
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
417 #
25459
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
418 # Regular expressions for parsing section headers and options.
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
419 #
11007
b9f55cc10ab3 Patch suggested (and partially provided) by Lars Damerow: instead of
Guido van Rossum <guido@python.org>
parents: 10145
diff changeset
420 SECTCRE = re.compile(
8614
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
421 r'\[' # [
16594
9ef978c6f039 Be much more permissive in what we accept in section names; there has been
Fred Drake <fdrake@acm.org>
parents: 16575
diff changeset
422 r'(?P<header>[^]]+)' # very permissive!
8614
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
423 r'\]' # ]
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
424 )
11007
b9f55cc10ab3 Patch suggested (and partially provided) by Lars Damerow: instead of
Guido van Rossum <guido@python.org>
parents: 10145
diff changeset
425 OPTCRE = re.compile(
25462
16e661970930 Allow internal whitespace in keys.
Fred Drake <fdrake@acm.org>
parents: 25461
diff changeset
426 r'(?P<option>[^:=\s][^:=]*)' # very permissive!
25459
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
427 r'\s*(?P<vi>[:=])\s*' # any number of space/tab,
8614
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
428 # followed by separator
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
429 # (either : or =), followed
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
430 # by any # space/tab
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
431 r'(?P<value>.*)$' # everything up to eol
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
432 )
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
433
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
434 def _read(self, fp, fpname):
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
435 """Parse a sectioned setup file.
6795
5b24cbb1f99b Checking in ConfigParser.py -- I don't see a reason why this can't be
Guido van Rossum <guido@python.org>
parents:
diff changeset
436
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
437 The sections in setup file contains a title line at the top,
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
438 indicated by a name in square brackets (`[]'), plus key/value
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
439 options lines, indicated by `name: value' format lines.
26078
53a3823448d9 Fix docstring typos
Andrew M. Kuchling <amk@amk.ca>
parents: 25918
diff changeset
440 Continuations are represented by an embedded newline then
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
441 leading whitespace. Blank lines, lines beginning with a '#',
26078
53a3823448d9 Fix docstring typos
Andrew M. Kuchling <amk@amk.ca>
parents: 25918
diff changeset
442 and just about everything else are ignored.
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
443 """
8614
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
444 cursect = None # None, or a dictionary
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
445 optname = None
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
446 lineno = 0
8614
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
447 e = None # None, or an exception
26685
a20cb5abab6b Update doc for getboolean() to match code (ie, returning True/False)
Neal Norwitz <nnorwitz@gmail.com>
parents: 26126
diff changeset
448 while True:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
449 line = fp.readline()
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
450 if not line:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
451 break
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
452 lineno = lineno + 1
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
453 # comment or blank line?
16480
e97217f5b323 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
454 if line.strip() == '' or line[0] in '#;':
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
455 continue
25462
16e661970930 Allow internal whitespace in keys.
Fred Drake <fdrake@acm.org>
parents: 25461
diff changeset
456 if line.split(None, 1)[0].lower() == 'rem' and line[0] in "rR":
16e661970930 Allow internal whitespace in keys.
Fred Drake <fdrake@acm.org>
parents: 25461
diff changeset
457 # no leading whitespace
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
458 continue
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
459 # continuation line?
25459
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
460 if line[0].isspace() and cursect is not None and optname:
16480
e97217f5b323 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
461 value = line.strip()
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
462 if value:
25459
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
463 cursect[optname] = "%s\n%s" % (cursect[optname], value)
8614
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
464 # a section header or option header?
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
465 else:
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
466 # is it a section header?
11007
b9f55cc10ab3 Patch suggested (and partially provided) by Lars Damerow: instead of
Guido van Rossum <guido@python.org>
parents: 10145
diff changeset
467 mo = self.SECTCRE.match(line)
8614
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
468 if mo:
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
469 sectname = mo.group('header')
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
470 if sectname in self._sections:
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
471 cursect = self._sections[sectname]
8614
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
472 elif sectname == DEFAULTSECT:
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
473 cursect = self._defaults
8614
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
474 else:
40418
3ee9d1a36d46 Patch #1371075: Make ConfigParser accept optional dict type
Martin v. Löwis <martin@v.loewis.de>
parents: 35276
diff changeset
475 cursect = self._dict()
3ee9d1a36d46 Patch #1371075: Make ConfigParser accept optional dict type
Martin v. Löwis <martin@v.loewis.de>
parents: 35276
diff changeset
476 cursect['__name__'] = sectname
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
477 self._sections[sectname] = cursect
8614
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
478 # So sections can't start with a continuation line
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
479 optname = None
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
480 # no section header in the file?
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
481 elif cursect is None:
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 30734
diff changeset
482 raise MissingSectionHeaderError(fpname, lineno, line)
8614
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
483 # an option line?
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 7165
diff changeset
484 else:
11007
b9f55cc10ab3 Patch suggested (and partially provided) by Lars Damerow: instead of
Guido van Rossum <guido@python.org>
parents: 10145
diff changeset
485 mo = self.OPTCRE.match(line)
8614
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
486 if mo:
11873
7ed104c40db3 (Finally!) Changes related to the ConfigParser/INI-file topics
Fred Drake <fdrake@acm.org>
parents: 11381
diff changeset
487 optname, vi, optval = mo.group('option', 'vi', 'value')
11908
b975a056deb6 allow comments beginning with ; in key: value as well as key = value
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11875
diff changeset
488 if vi in ('=', ':') and ';' in optval:
11873
7ed104c40db3 (Finally!) Changes related to the ConfigParser/INI-file topics
Fred Drake <fdrake@acm.org>
parents: 11381
diff changeset
489 # ';' is a comment delimiter only if it follows
7ed104c40db3 (Finally!) Changes related to the ConfigParser/INI-file topics
Fred Drake <fdrake@acm.org>
parents: 11381
diff changeset
490 # a spacing character
16480
e97217f5b323 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
491 pos = optval.find(';')
25459
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
492 if pos != -1 and optval[pos-1].isspace():
11873
7ed104c40db3 (Finally!) Changes related to the ConfigParser/INI-file topics
Fred Drake <fdrake@acm.org>
parents: 11381
diff changeset
493 optval = optval[:pos]
16480
e97217f5b323 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
494 optval = optval.strip()
8614
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
495 # allow empty values
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
496 if optval == '""':
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
497 optval = ''
25462
16e661970930 Allow internal whitespace in keys.
Fred Drake <fdrake@acm.org>
parents: 25461
diff changeset
498 optname = self.optionxform(optname.rstrip())
25459
d07f8db3db41 has_option(): Use the option name transform consistently.
Fred Drake <fdrake@acm.org>
parents: 23645
diff changeset
499 cursect[optname] = optval
8614
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
500 else:
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
501 # a non-fatal parsing error occurred. set up the
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
502 # exception but keep going. the exception will be
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
503 # raised at the end of the file and will contain a
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
504 # list of all bogus lines
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
505 if not e:
11369
29ce956fa7b7 Urmpfh!
Guido van Rossum <guido@python.org>
parents: 11368
diff changeset
506 e = ParsingError(fpname)
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 30734
diff changeset
507 e.append(lineno, repr(line))
8614
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
508 # if any parsing errors occurred, raise an exception
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
509 if e:
64f0c3188e70 Several changes:
Barry Warsaw <barry@python.org>
parents: 7755
diff changeset
510 raise e
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
511
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
512
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
513 class ConfigParser(RawConfigParser):
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
514
26685
a20cb5abab6b Update doc for getboolean() to match code (ie, returning True/False)
Neal Norwitz <nnorwitz@gmail.com>
parents: 26126
diff changeset
515 def get(self, section, option, raw=False, vars=None):
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
516 """Get an option value for a given section.
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
517
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
518 All % interpolations are expanded in the return values, based on the
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
519 defaults passed into the constructor, unless the optional argument
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
520 `raw' is true. Additional substitutions may be provided using the
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
521 `vars' argument, which must be a dictionary whose contents overrides
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
522 any pre-existing defaults.
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
523
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
524 The section DEFAULT is special.
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
525 """
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
526 d = self._defaults.copy()
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
527 try:
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
528 d.update(self._sections[section])
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
529 except KeyError:
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
530 if section != DEFAULTSECT:
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
531 raise NoSectionError(section)
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
532 # Update with the entry specific variables
33662
cc4684051c46 SF bug #1017864: ConfigParser now correctly handles default keys, processing them with ``ConfigParser.optionxform`` when supplied, consistent with the handling of config file entries and runtime-set options.
David Goodger <goodger@python.org>
parents: 32117
diff changeset
533 if vars:
cc4684051c46 SF bug #1017864: ConfigParser now correctly handles default keys, processing them with ``ConfigParser.optionxform`` when supplied, consistent with the handling of config file entries and runtime-set options.
David Goodger <goodger@python.org>
parents: 32117
diff changeset
534 for key, value in vars.items():
cc4684051c46 SF bug #1017864: ConfigParser now correctly handles default keys, processing them with ``ConfigParser.optionxform`` when supplied, consistent with the handling of config file entries and runtime-set options.
David Goodger <goodger@python.org>
parents: 32117
diff changeset
535 d[self.optionxform(key)] = value
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
536 option = self.optionxform(option)
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
537 try:
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
538 value = d[option]
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
539 except KeyError:
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
540 raise NoOptionError(option, section)
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
541
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
542 if raw:
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
543 return value
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
544 else:
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
545 return self._interpolate(section, option, value, d)
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
546
26685
a20cb5abab6b Update doc for getboolean() to match code (ie, returning True/False)
Neal Norwitz <nnorwitz@gmail.com>
parents: 26126
diff changeset
547 def items(self, section, raw=False, vars=None):
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
548 """Return a list of tuples with (name, value) for each option
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
549 in the section.
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
550
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
551 All % interpolations are expanded in the return values, based on the
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
552 defaults passed into the constructor, unless the optional argument
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
553 `raw' is true. Additional substitutions may be provided using the
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
554 `vars' argument, which must be a dictionary whose contents overrides
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
555 any pre-existing defaults.
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
556
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
557 The section DEFAULT is special.
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
558 """
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
559 d = self._defaults.copy()
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
560 try:
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
561 d.update(self._sections[section])
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
562 except KeyError:
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
563 if section != DEFAULTSECT:
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
564 raise NoSectionError(section)
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
565 # Update with the entry specific variables
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
566 if vars:
33662
cc4684051c46 SF bug #1017864: ConfigParser now correctly handles default keys, processing them with ``ConfigParser.optionxform`` when supplied, consistent with the handling of config file entries and runtime-set options.
David Goodger <goodger@python.org>
parents: 32117
diff changeset
567 for key, value in vars.items():
cc4684051c46 SF bug #1017864: ConfigParser now correctly handles default keys, processing them with ``ConfigParser.optionxform`` when supplied, consistent with the handling of config file entries and runtime-set options.
David Goodger <goodger@python.org>
parents: 32117
diff changeset
568 d[self.optionxform(key)] = value
25916
8bb6003f7f54 According to the docs, __name__ is not exposed via the API except
Fred Drake <fdrake@acm.org>
parents: 25908
diff changeset
569 options = d.keys()
8bb6003f7f54 According to the docs, __name__ is not exposed via the API except
Fred Drake <fdrake@acm.org>
parents: 25908
diff changeset
570 if "__name__" in options:
8bb6003f7f54 According to the docs, __name__ is not exposed via the API except
Fred Drake <fdrake@acm.org>
parents: 25908
diff changeset
571 options.remove("__name__")
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
572 if raw:
30734
916f782ed6d5 Make both items() methods return lists; one had changed to return an
Fred Drake <fdrake@acm.org>
parents: 30723
diff changeset
573 return [(option, d[option])
916f782ed6d5 Make both items() methods return lists; one had changed to return an
Fred Drake <fdrake@acm.org>
parents: 30723
diff changeset
574 for option in options]
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
575 else:
30734
916f782ed6d5 Make both items() methods return lists; one had changed to return an
Fred Drake <fdrake@acm.org>
parents: 30723
diff changeset
576 return [(option, self._interpolate(section, option, d[option], d))
916f782ed6d5 Make both items() methods return lists; one had changed to return an
Fred Drake <fdrake@acm.org>
parents: 30723
diff changeset
577 for option in options]
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
578
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
579 def _interpolate(self, section, option, rawval, vars):
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
580 # do the string interpolation
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
581 value = rawval
26126
98f3fd1ed42f Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 26078
diff changeset
582 depth = MAX_INTERPOLATION_DEPTH
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
583 while depth: # Loop through this until it's done
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
584 depth -= 1
31967
3d046d063a84 Replace str.find()!=1 with the more readable "in" operator.
Raymond Hettinger <python@rcn.com>
parents: 31515
diff changeset
585 if "%(" in value:
32114
70023af2085a ConfigParser:
Fred Drake <fdrake@acm.org>
parents: 31967
diff changeset
586 value = self._KEYCRE.sub(self._interpolation_replace, value)
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
587 try:
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
588 value = value % vars
26927
33dcf4fd0ff9 ConfigParser._interpolate(): Pass the missing key to the
Fred Drake <fdrake@acm.org>
parents: 26909
diff changeset
589 except KeyError, e:
26969
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
590 raise InterpolationMissingOptionError(
48135
a7bf503c857e Remove a __getitem__() removal on an exception to silence a warning triggered
Brett Cannon <bcannon@gmail.com>
parents: 47252
diff changeset
591 option, section, rawval, e.args[0])
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
592 else:
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
593 break
31967
3d046d063a84 Replace str.find()!=1 with the more readable "in" operator.
Raymond Hettinger <python@rcn.com>
parents: 31515
diff changeset
594 if "%(" in value:
25908
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
595 raise InterpolationDepthError(option, section, rawval)
df055a9eff9c Re-factor: Use a RawConfigParser base class and make ConfigParser a
Fred Drake <fdrake@acm.org>
parents: 25462
diff changeset
596 return value
25918
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
597
32114
70023af2085a ConfigParser:
Fred Drake <fdrake@acm.org>
parents: 31967
diff changeset
598 _KEYCRE = re.compile(r"%\(([^)]*)\)s|.")
70023af2085a ConfigParser:
Fred Drake <fdrake@acm.org>
parents: 31967
diff changeset
599
70023af2085a ConfigParser:
Fred Drake <fdrake@acm.org>
parents: 31967
diff changeset
600 def _interpolation_replace(self, match):
70023af2085a ConfigParser:
Fred Drake <fdrake@acm.org>
parents: 31967
diff changeset
601 s = match.group(1)
70023af2085a ConfigParser:
Fred Drake <fdrake@acm.org>
parents: 31967
diff changeset
602 if s is None:
70023af2085a ConfigParser:
Fred Drake <fdrake@acm.org>
parents: 31967
diff changeset
603 return match.group()
70023af2085a ConfigParser:
Fred Drake <fdrake@acm.org>
parents: 31967
diff changeset
604 else:
70023af2085a ConfigParser:
Fred Drake <fdrake@acm.org>
parents: 31967
diff changeset
605 return "%%(%s)s" % self.optionxform(s)
70023af2085a ConfigParser:
Fred Drake <fdrake@acm.org>
parents: 31967
diff changeset
606
25918
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
607
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
608 class SafeConfigParser(ConfigParser):
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
609
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
610 def _interpolate(self, section, option, rawval, vars):
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
611 # do the string interpolation
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
612 L = []
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
613 self._interpolate_some(option, L, rawval, section, vars, 1)
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
614 return ''.join(L)
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
615
41157
53ee2795287b Patch #1603688: ConfigParser.SafeConfigParser now checks values that
Georg Brandl <georg@python.org>
parents: 40418
diff changeset
616 _interpvar_re = re.compile(r"%\(([^)]+)\)s")
53ee2795287b Patch #1603688: ConfigParser.SafeConfigParser now checks values that
Georg Brandl <georg@python.org>
parents: 40418
diff changeset
617 _badpercent_re = re.compile(r"%[^%]|%$")
25918
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
618
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
619 def _interpolate_some(self, option, accum, rest, section, map, depth):
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
620 if depth > MAX_INTERPOLATION_DEPTH:
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
621 raise InterpolationDepthError(option, section, rest)
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
622 while rest:
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
623 p = rest.find("%")
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
624 if p < 0:
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
625 accum.append(rest)
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
626 return
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
627 if p > 0:
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
628 accum.append(rest[:p])
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
629 rest = rest[p:]
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
630 # p is no longer used
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
631 c = rest[1:2]
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
632 if c == "%":
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
633 accum.append("%")
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
634 rest = rest[2:]
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
635 elif c == "(":
41157
53ee2795287b Patch #1603688: ConfigParser.SafeConfigParser now checks values that
Georg Brandl <georg@python.org>
parents: 40418
diff changeset
636 m = self._interpvar_re.match(rest)
25918
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
637 if m is None:
29661
79303de9a05a Fix arguments for instantiating InterpolationSyntaxError
Neal Norwitz <nnorwitz@gmail.com>
parents: 26969
diff changeset
638 raise InterpolationSyntaxError(option, section,
79303de9a05a Fix arguments for instantiating InterpolationSyntaxError
Neal Norwitz <nnorwitz@gmail.com>
parents: 26969
diff changeset
639 "bad interpolation variable reference %r" % rest)
32114
70023af2085a ConfigParser:
Fred Drake <fdrake@acm.org>
parents: 31967
diff changeset
640 var = self.optionxform(m.group(1))
25918
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
641 rest = rest[m.end():]
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
642 try:
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
643 v = map[var]
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
644 except KeyError:
26969
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
645 raise InterpolationMissingOptionError(
776f270a6ea9 Further cleanup of exceptions. All interpolation-related exceptions
Fred Drake <fdrake@acm.org>
parents: 26927
diff changeset
646 option, section, rest, var)
25918
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
647 if "%" in v:
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
648 self._interpolate_some(option, accum, v,
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
649 section, map, depth + 1)
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
650 else:
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
651 accum.append(v)
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
652 else:
9901fda7c366 Implement a safer and more predictable interpolation approach.
Fred Drake <fdrake@acm.org>
parents: 25916
diff changeset
653 raise InterpolationSyntaxError(
29661
79303de9a05a Fix arguments for instantiating InterpolationSyntaxError
Neal Norwitz <nnorwitz@gmail.com>
parents: 26969
diff changeset
654 option, section,
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 30734
diff changeset
655 "'%%' must be followed by '%%' or '(', found: %r" % (rest,))
33663
5412096d0f95 SF bug #997050: Document, test, & check for non-string values in ConfigParser. Moved the new string-only restriction added in rev. 1.65 to the SafeConfigParser class, leaving existing ConfigParser & RawConfigParser behavior alone, and documented the conditions under which non-string values work.
David Goodger <goodger@python.org>
parents: 33662
diff changeset
656
5412096d0f95 SF bug #997050: Document, test, & check for non-string values in ConfigParser. Moved the new string-only restriction added in rev. 1.65 to the SafeConfigParser class, leaving existing ConfigParser & RawConfigParser behavior alone, and documented the conditions under which non-string values work.
David Goodger <goodger@python.org>
parents: 33662
diff changeset
657 def set(self, section, option, value):
5412096d0f95 SF bug #997050: Document, test, & check for non-string values in ConfigParser. Moved the new string-only restriction added in rev. 1.65 to the SafeConfigParser class, leaving existing ConfigParser & RawConfigParser behavior alone, and documented the conditions under which non-string values work.
David Goodger <goodger@python.org>
parents: 33662
diff changeset
658 """Set an option. Extend ConfigParser.set: check for string values."""
5412096d0f95 SF bug #997050: Document, test, & check for non-string values in ConfigParser. Moved the new string-only restriction added in rev. 1.65 to the SafeConfigParser class, leaving existing ConfigParser & RawConfigParser behavior alone, and documented the conditions under which non-string values work.
David Goodger <goodger@python.org>
parents: 33662
diff changeset
659 if not isinstance(value, basestring):
5412096d0f95 SF bug #997050: Document, test, & check for non-string values in ConfigParser. Moved the new string-only restriction added in rev. 1.65 to the SafeConfigParser class, leaving existing ConfigParser & RawConfigParser behavior alone, and documented the conditions under which non-string values work.
David Goodger <goodger@python.org>
parents: 33662
diff changeset
660 raise TypeError("option values must be strings")
41157
53ee2795287b Patch #1603688: ConfigParser.SafeConfigParser now checks values that
Georg Brandl <georg@python.org>
parents: 40418
diff changeset
661 # check for bad percent signs:
53ee2795287b Patch #1603688: ConfigParser.SafeConfigParser now checks values that
Georg Brandl <georg@python.org>
parents: 40418
diff changeset
662 # first, replace all "good" interpolations
53ee2795287b Patch #1603688: ConfigParser.SafeConfigParser now checks values that
Georg Brandl <georg@python.org>
parents: 40418
diff changeset
663 tmp_value = self._interpvar_re.sub('', value)
53ee2795287b Patch #1603688: ConfigParser.SafeConfigParser now checks values that
Georg Brandl <georg@python.org>
parents: 40418
diff changeset
664 # then, check if there's a lone percent sign left
53ee2795287b Patch #1603688: ConfigParser.SafeConfigParser now checks values that
Georg Brandl <georg@python.org>
parents: 40418
diff changeset
665 m = self._badpercent_re.search(tmp_value)
53ee2795287b Patch #1603688: ConfigParser.SafeConfigParser now checks values that
Georg Brandl <georg@python.org>
parents: 40418
diff changeset
666 if m:
53ee2795287b Patch #1603688: ConfigParser.SafeConfigParser now checks values that
Georg Brandl <georg@python.org>
parents: 40418
diff changeset
667 raise ValueError("invalid interpolation syntax in %r at "
53ee2795287b Patch #1603688: ConfigParser.SafeConfigParser now checks values that
Georg Brandl <georg@python.org>
parents: 40418
diff changeset
668 "position %d" % (value, m.start()))
33663
5412096d0f95 SF bug #997050: Document, test, & check for non-string values in ConfigParser. Moved the new string-only restriction added in rev. 1.65 to the SafeConfigParser class, leaving existing ConfigParser & RawConfigParser behavior alone, and documented the conditions under which non-string values work.
David Goodger <goodger@python.org>
parents: 33662
diff changeset
669 ConfigParser.set(self, section, option, value)