bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1 |
================================== |
2 |
Reading and Writing Config Files |
|
3 |
================================== |
|
4 |
||
5 |
---------------------------------------- |
|
6 |
ConfigObj 4 Introduction and Reference |
|
7 |
---------------------------------------- |
|
8 |
||
9 |
:Authors: Michael Foord, Nicola Larosa |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
10 |
:Version: ConfigObj 4.4.0 |
11 |
:Date: 2007/02/04 |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
12 |
:Homepage: `ConfigObj Homepage`_ |
13 |
:Sourceforge: Sourceforge_ |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
14 |
:Development: `SVN Repository`_ |
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
15 |
:License: `BSD License`_ |
16 |
:Support: `Mailing List`_ |
|
17 |
||
18 |
.. _Mailing List: http://lists.sourceforge.net/lists/listinfo/configobj-develop |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
19 |
.. _SVN Repository: http://svn.pythonutils.python-hosting.com |
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
20 |
|
21 |
.. meta:: |
|
22 |
:description: ConfigObj - a Python module for easy reading and writing of |
|
23 |
config files. |
|
24 |
:keywords: python, script, module, config, configuration, data, persistence, |
|
25 |
developer, configparser |
|
26 |
||
27 |
.. contents:: ConfigObj Manual |
|
28 |
.. sectnum:: |
|
29 |
||
30 |
Introduction |
|
31 |
============ |
|
32 |
||
33 |
**ConfigObj** is a simple but powerful config file reader and writer: an *ini |
|
34 |
file round tripper*. Its main feature is that it is very easy to use, with a |
|
35 |
straightforward programmer's interface and a simple syntax for config files. |
|
36 |
It has lots of other features though : |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
37 |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
38 |
* Nested sections (subsections), to any level |
39 |
* List values |
|
40 |
* Multiple line values |
|
41 |
* String interpolation (substitution) |
|
42 |
* Integrated with a powerful validation system |
|
43 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
44 |
- including automatic type checking/conversion |
45 |
- repeated sections |
|
46 |
- and allowing default values |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
47 |
|
48 |
* All comments in the file are preserved |
|
49 |
* The order of keys/sections is preserved |
|
50 |
* No external dependencies |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
51 |
* Full Unicode support |
52 |
* A powerful ``unrepr`` mode for storing basic datatypes |
|
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
53 |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
54 |
ConfigObj has a barrage of doctests [#]_ built into it, testing almost every |
55 |
feature. Run ``python configobj_test.py -v`` to see them in action. |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
56 |
|
57 |
For support and bug reports please use the ConfigObj `Mailing List`_. |
|
58 |
||
59 |
||
60 |
.. _ConfigObj for Data Persistence: http://www.voidspace.org.uk/python/articles/configobj_for_data_persistence.shtml |
|
61 |
.. _ConfigPersist.py: http://www.voidspace.org.uk/python/configpersist.html |
|
62 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
63 |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
64 |
Downloading |
65 |
=========== |
|
66 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
67 |
The current version is **4.4.0**, dated 4th February 2007. ConfigObj 4 is |
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
68 |
now stable. We still expect to pick up a few bugs along the way though [#]_. |
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
69 |
{sm;:-)}
|
70 |
||
71 |
You can get ConfigObj in the following ways : |
|
72 |
||
73 |
Files |
|
74 |
----- |
|
75 |
||
76 |
* configobj.py_ from Voidspace |
|
77 |
||
78 |
ConfigObj has no external dependencies. This file is sufficient to access |
|
79 |
all the functionality except Validation_. |
|
80 |
||
81 |
* configobj.zip_ from Voidspace |
|
82 |
||
83 |
This also contains validate.py_ , the `API Docs`_ and `this document`_. |
|
84 |
||
85 |
* The latest development version can be obtained from the `Subversion |
|
86 |
Repository`_. |
|
87 |
||
88 |
* validate.py_ from Voidspace |
|
89 |
||
90 |
* You can also download *configobj.zip* from Sourceforge_ |
|
91 |
||
92 |
Documentation |
|
93 |
------------- |
|
94 |
||
95 |
*configobj.zip* contains `this document`_ and full `API Docs`_, generated by |
|
96 |
the EpyDoc_ program. |
|
97 |
||
98 |
* You can view `this document`_ online as the `ConfigObj Homepage`_. |
|
99 |
||
100 |
* You can also browse the `API Docs`_ online. |
|
101 |
||
102 |
Pythonutils |
|
103 |
----------- |
|
104 |
||
105 |
ConfigObj is also part of the Pythonutils_ set of modules. This contains |
|
106 |
various other useful modules, and is required by many of the `Voidspace Python |
|
107 |
Projects`_. |
|
108 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
109 |
Development Version |
110 |
------------------- |
|
111 |
||
112 |
It is sometimes possible to get the latest *development version* of ConfigObj |
|
113 |
from the `Subversion Repository <http://svn.pythonutils.python-hosting.com/trunk/pythonutils/>`_. |
|
114 |
||
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
115 |
.. _configobj.py: http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=configobj.py |
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
116 |
.. _configobj.zip: http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=configobj-4.4.0.zip |
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
117 |
.. _validate.py: http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=validate.py |
118 |
.. _API Docs: http://www.voidspace.org.uk/python/configobj-api/ |
|
119 |
.. _this document: |
|
120 |
.. _configobj homepage: http://www.voidspace.org.uk/python/configobj.html |
|
121 |
.. _Sourceforge: http://sourceforge.net/projects/configobj |
|
122 |
.. _EpyDoc: http://epydoc.sourceforge.net |
|
123 |
.. _pythonutils: http://www.voidspace.org.uk/python/pythonutils.html |
|
124 |
.. _Voidspace Python Projects: http://www.voidspace.org.uk/python |
|
125 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
126 |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
127 |
|
128 |
ConfigObj in the Real World |
|
129 |
=========================== |
|
130 |
||
131 |
Projects that use **ConfigObj** include : |
|
132 |
||
133 |
* `Bazaar <http://bazaar-ng.org>`_. |
|
134 |
||
135 |
Bazaar is a Python distributed {acro;VCS;Version Control System}.
|
|
136 |
ConfigObj is used to read ``bazaar.conf`` and ``branches.conf``. |
|
137 |
||
138 |
* `Turbogears <http://www.turbogears.org/>`_ |
|
139 |
||
140 |
Turbogears is a web application framework. |
|
141 |
||
142 |
* `Chandler <http://chandler.osafoundation.org/>`_ |
|
143 |
||
144 |
A Python and `wxPython <http://www.wxpython.org>`_ |
|
145 |
{acro;PIM;Personal Information Manager}, being developed by the
|
|
146 |
`OSAFoundation <http://www.osafoundation.org/>`_. |
|
147 |
||
148 |
* `CryptoBox <https://systemausfall.org/trac/cryptobox/wiki/CryptoBox/en>`_ |
|
149 |
||
150 |
A very interesting looking Debian based Live-CD which supports storing |
|
151 |
data using an encrypted harddisk; usable even by non technical users. |
|
152 |
||
153 |
* `Simple64 <http://ubuntuforums.org/showthread.php?t=266290>`_ |
|
154 |
||
155 |
A Ubuntu tool which provides a GUI to install a host of applications. |
|
156 |
||
157 |
* `Debian-cd-ng <http://wiki.debian.org/debian-cd-ng>`_ |
|
158 |
||
159 |
*Debian-cd-ng* recommends ConfigObj for parsing the Debian-cd configuration files. |
|
160 |
||
161 |
* `NeuroImaging in Python <http://projects.scipy.org/neuroimaging/ni/wiki>`_ |
|
162 |
||
163 |
BrainSTAT is a project with the ultimate goal to produce a |
|
164 |
platform-independent python environment for the analysis of brain |
|
165 |
imaging data. |
|
166 |
||
167 |
* `Gruik <http://www.tracos.org/gruik/wiki>`_ |
|
168 |
||
169 |
Gruik is a free software network packet sniffer. |
|
170 |
||
171 |
||
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
172 |
Getting Started |
173 |
=============== |
|
174 |
||
175 |
The outstanding feature of using ConfigObj is simplicity. Most functions can be |
|
176 |
performed with single line commands. |
|
177 |
||
178 |
Reading a Config File |
|
179 |
--------------------- |
|
180 |
||
181 |
The normal way to read a config file, is to give ConfigObj the filename : |
|
182 |
||
183 |
.. raw:: html |
|
184 |
||
185 |
{+coloring}
|
|
186 |
||
187 |
from configobj import ConfigObj |
|
188 |
config = ConfigObj(filename) |
|
189 |
||
190 |
{-coloring}
|
|
191 |
||
192 |
You can also pass the config file in as a list of lines, or a ``StringIO`` |
|
193 |
instance, so it doesn't matter where your config data comes from. |
|
194 |
||
195 |
You can then access members of your config file as a dictionary. Subsections |
|
196 |
will also be dictionaries. |
|
197 |
||
198 |
.. raw:: html |
|
199 |
||
200 |
{+coloring}
|
|
201 |
||
202 |
from configobj import ConfigObj |
|
203 |
config = ConfigObj(filename) |
|
204 |
# |
|
205 |
value1 = config['keyword1'] |
|
206 |
value2 = config['keyword2'] |
|
207 |
# |
|
208 |
section1 = config['section1'] |
|
209 |
value3 = section1['keyword3'] |
|
210 |
value4 = section1['keyword4'] |
|
211 |
# |
|
212 |
# you could also write |
|
213 |
value3 = config['section1']['keyword3'] |
|
214 |
value4 = config['section1']['keyword4'] |
|
215 |
||
216 |
{-coloring}
|
|
217 |
||
218 |
Writing a Config File |
|
219 |
--------------------- |
|
220 |
||
221 |
Creating a new config file is just as easy as reading one. You can specify a |
|
222 |
filename when you create the ConfigObj, or do it later [#]_. |
|
223 |
||
224 |
If you *don't* set a filename, then the ``write`` method will return a list of |
|
225 |
lines instead of writing to file. See the write_ method for more details. |
|
226 |
||
227 |
Here we show creating an empty ConfigObj, setting a filename and some values, |
|
228 |
and then writing to file : |
|
229 |
||
230 |
.. raw:: html |
|
231 |
||
232 |
{+coloring}
|
|
233 |
||
234 |
from configobj import ConfigObj |
|
235 |
config = ConfigObj() |
|
236 |
config.filename = filename |
|
237 |
# |
|
238 |
config['keyword1'] = value1 |
|
239 |
config['keyword2'] = value2 |
|
240 |
# |
|
241 |
config['section1'] = {}
|
|
242 |
config['section1']['keyword3'] = value3 |
|
243 |
config['section1']['keyword4'] = value4 |
|
244 |
# |
|
245 |
section2 = {
|
|
246 |
'keyword5': value5, |
|
247 |
'keyword6': value6, |
|
248 |
'sub-section': {
|
|
249 |
'keyword7': value7 |
|
250 |
} |
|
251 |
} |
|
252 |
config['section2'] = section2 |
|
253 |
# |
|
254 |
config['section3'] = {}
|
|
255 |
config['section3']['keyword 8'] = [value8, value9, value10] |
|
256 |
config['section3']['keyword 9'] = [value11, value12, value13] |
|
257 |
# |
|
258 |
config.write() |
|
259 |
||
260 |
{-coloring}
|
|
261 |
||
262 |
.. caution:: |
|
263 |
||
264 |
Keywords and section names can only be strings [#]_. Attempting to set |
|
265 |
anything else will raise a ``ValueError``. |
|
266 |
||
267 |
Config Files |
|
268 |
------------ |
|
269 |
||
270 |
The config files that ConfigObj will read and write are based on the 'INI' |
|
271 |
format. This means it will read and write files created for ``ConfigParser`` |
|
272 |
[#]_. |
|
273 |
||
274 |
Keywords and values are separated by an ``'='``, and section markers are |
|
275 |
between square brackets. Keywords, values, and section names can be surrounded |
|
276 |
by single or double quotes. Indentation is not significant, but can be |
|
277 |
preserved. |
|
278 |
||
279 |
Subsections are indicated by repeating the square brackets in the section |
|
280 |
marker. You nest levels by using more brackets. |
|
281 |
||
282 |
You can have list values by separating items with a comma, and values spanning |
|
283 |
multiple lines by using triple quotes (single or double). |
|
284 |
||
285 |
For full details on all these see `the config file format`_. Here's an example |
|
286 |
to illustrate : :: |
|
287 |
||
288 |
# This is the 'initial_comment' |
|
289 |
# Which may be several lines |
|
290 |
keyword1 = value1 |
|
291 |
'keyword 2' = 'value 2' |
|
292 |
||
293 |
[ "section 1" ] |
|
294 |
# This comment goes with keyword 3 |
|
295 |
keyword 3 = value 3 |
|
296 |
'keyword 4' = value4, value 5, 'value 6' |
|
297 |
||
298 |
[[ sub-section ]] # an inline comment |
|
299 |
# sub-section is inside "section 1" |
|
300 |
'keyword 5' = 'value 7' |
|
301 |
'keyword 6' = '''A multiline value, |
|
302 |
that spans more than one line :-) |
|
303 |
The line breaks are included in the value.''' |
|
304 |
||
305 |
[[[ sub-sub-section ]]] |
|
306 |
# sub-sub-section is *in* 'sub-section' |
|
307 |
# which is in 'section 1' |
|
308 |
'keyword 7' = 'value 8' |
|
309 |
||
310 |
[section 2] # an inline comment |
|
311 |
keyword8 = "value 9" |
|
312 |
keyword9 = value10 # an inline comment |
|
313 |
# The 'final_comment' |
|
314 |
# Which also may be several lines |
|
315 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
316 |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
317 |
ConfigObj specifications |
318 |
======================== |
|
319 |
||
320 |
.. raw:: html |
|
321 |
||
322 |
{+coloring}
|
|
323 |
||
324 |
config = ConfigObj(infile=None, options=None, **keywargs) |
|
325 |
||
326 |
{-coloring}
|
|
327 |
||
328 |
infile |
|
329 |
------ |
|
330 |
||
331 |
You don't need to specify an infile. If you omit it, an empty ConfigObj will be |
|
332 |
created. ``infile`` *can* be : |
|
333 |
||
334 |
* Nothing. In which case the ``filename`` attribute of your ConfigObj will be |
|
335 |
``None``. You can set a filename at any time. |
|
336 |
||
337 |
* A filename. What happens if the file doesn't already exist is determined by |
|
338 |
the options_ ``file_error`` and ``create_empty``. The filename will be |
|
339 |
preserved as the ``filename`` attribute. This can be changed at any time. |
|
340 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
341 |
* A list of lines. Any trailing newlines will be removed from the lines. The |
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
342 |
``filename`` attribute of your ConfigObj will be ``None``. |
343 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
344 |
* A ``StringIO`` instance or file object, or any object with a ``read`` method. |
345 |
The ``filename`` attribute of your ConfigObj will be ``None`` [#]_. |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
346 |
|
347 |
* A dictionary. You can initialise a ConfigObj from a dictionary [#]_. The |
|
348 |
``filename`` attribute of your ConfigObj will be ``None``. All keys must be |
|
349 |
strings. In this case, the order of values and sections is arbitrary. |
|
350 |
||
351 |
options |
|
352 |
------- |
|
353 |
||
354 |
There are various options that control the way ConfigObj behaves. They can be |
|
355 |
passed in as a dictionary of options, or as keyword arguments. Explicit keyword |
|
356 |
arguments override the dictionary. |
|
357 |
||
358 |
All of the options are available as attributes after the config file has been |
|
359 |
parsed. |
|
360 |
||
361 |
ConfigObj has the following options (with the default values shown) : |
|
362 |
||
363 |
* 'raise_errors': ``False`` |
|
364 |
||
365 |
When parsing, it is possible that the config file will be badly formed. The |
|
366 |
default is to parse the whole file and raise a single error at the end. You |
|
367 |
can set ``raise_errors = True`` to have errors raised immediately. See the |
|
368 |
exceptions_ section for more details. |
|
369 |
||
370 |
Altering this value after initial parsing has no effect. |
|
371 |
||
372 |
* 'list_values': ``True`` |
|
373 |
||
374 |
If ``True`` (the default) then list values are possible. If ``False``, the |
|
375 |
values are not parsed for lists. |
|
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
376 |
|
377 |
If ``list_values = False`` then single line values are not quoted or |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
378 |
unquoted when reading and writing. |
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
379 |
|
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
380 |
Changing this value affects whether single line values will be quoted or |
381 |
not when writing. |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
382 |
|
383 |
* 'create_empty': ``False`` |
|
384 |
||
385 |
If this value is ``True`` and the file specified by ``infile`` doesn't |
|
386 |
exist, ConfigObj will create an empty file. This can be a useful test that |
|
387 |
the filename makes sense: an impossible filename will cause an error. |
|
388 |
||
389 |
Altering this value after initial parsing has no effect. |
|
390 |
||
391 |
* 'file_error': ``False`` |
|
392 |
||
393 |
If this value is ``True`` and the file specified by ``infile`` doesn't |
|
394 |
exist, ConfigObj will raise an ``IOError``. |
|
395 |
||
396 |
Altering this value after initial parsing has no effect. |
|
397 |
||
398 |
* 'interpolation': ``True`` |
|
399 |
||
400 |
Whether string interpolation is switched on or not. It is on (``True``) by |
|
401 |
default. |
|
402 |
||
403 |
You can set this attribute to change whether string interpolation is done |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
404 |
when values are fetched. See the `String Interpolation`_ section for more details. |
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
405 |
|
406 |
* 'configspec': ``None`` |
|
407 |
||
408 |
If you want to use the validation system, you supply a configspec. This is |
|
409 |
effectively a type of config file that specifies a check for each member. |
|
410 |
This check can be used to do type conversion as well as check that the |
|
411 |
value is within your required parameters. |
|
412 |
||
413 |
You provide a configspec in the same way as you do the initial file: a |
|
414 |
filename, or list of lines, etc. See the validation_ section for full |
|
415 |
details on how to use the system. |
|
416 |
||
417 |
When parsed, every section has a ``configspec`` with a dictionary of |
|
418 |
configspec checks for *that section*. |
|
419 |
||
420 |
* 'stringify': ``True`` |
|
421 |
||
422 |
If you use the validation scheme, it can do type checking *and* conversion |
|
423 |
for you. This means you may want to set members to integers, or other |
|
424 |
non-string values. |
|
425 |
||
426 |
If 'stringify' is set to ``True`` (default) then non-string values will |
|
427 |
be converted to strings when you write the config file. The validation_ |
|
428 |
process converts values from strings to the required type. |
|
429 |
||
430 |
If 'stringify' is set to ``False``, attempting to set a member to a |
|
431 |
non-string value [#]_ will raise a ``TypeError`` (no type conversion is |
|
432 |
done by validation). |
|
433 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
434 |
* 'indent_type': ``' '`` |
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
435 |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
436 |
Indentation is not significant; it can however be present in the input and |
437 |
output config. Any combination of tabs and spaces may be used: the string |
|
438 |
will be repeated for each level of indentation. Typical values are: ``''`` |
|
439 |
(no indentation), ``' '`` (indentation with four spaces, the default), |
|
440 |
``'\t'`` (indentation with one tab). |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
441 |
|
442 |
If this option is not specified, and the ConfigObj is initialised with a |
|
443 |
dictionary, the indentation used in the output is the default one, that is, |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
444 |
four spaces. |
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
445 |
|
446 |
If this option is not specified, and the ConfigObj is initialised with a |
|
447 |
list of lines or a file, the indentation used in the first indented line is |
|
448 |
selected and used in all output lines. If no input line is indented, no |
|
449 |
output line will be either. |
|
450 |
||
451 |
If this option *is* specified, the option value is used in the output |
|
452 |
config, overriding the type of indentation in the input config (if any). |
|
453 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
454 |
* 'encoding': ``None`` |
455 |
||
456 |
By default **ConfigObj** does not decode the file/strings you pass it into |
|
457 |
Unicode [#]_. If you want your config file as Unicode (keys and members) |
|
458 |
you need to provide an encoding to decode the file with. This encoding will |
|
459 |
also be used to encode the config file when writing. |
|
460 |
||
461 |
You can change the encoding attribute at any time. |
|
462 |
||
463 |
Any characters in your strings that can't be encoded with the specified |
|
464 |
encoding will raise a ``UnicodeEncodeError``. |
|
465 |
||
466 |
.. note:: |
|
467 |
||
468 |
``UTF16`` encoded files will automatically be detected and decoded, |
|
469 |
even if ``encoding`` is ``None``. |
|
470 |
||
471 |
This is because it is a 16-bit encoding, and ConfigObj will mangle it |
|
472 |
(split characters on byte boundaries) if it parses it without decoding. |
|
473 |
||
474 |
* 'default_encoding': ``None`` |
|
475 |
||
476 |
When using the ``write`` method, **ConfigObj** uses the ``encoding`` |
|
477 |
attribute to encode the Unicode strings. If any members (or keys) have |
|
478 |
been set as byte strings instead of Unicode, these must first be decoded |
|
479 |
to Unicode before outputting in the specified encoding. |
|
480 |
||
481 |
``default_encoding``, if specified, is the encoding used to decode byte |
|
482 |
strings in the **ConfigObj** before writing. If this is ``None``, then |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
483 |
the Python default encoding (``sys.defaultencoding`` - usually ASCII) is |
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
484 |
used. |
485 |
||
486 |
For most Western European users, a value of ``latin-1`` is sensible. |
|
487 |
||
488 |
``default_encoding`` is *only* used if an ``encoding`` is specified. |
|
489 |
||
490 |
Any characters in byte-strings that can't be decoded using the |
|
491 |
``default_encoding`` will raise a ``UnicodeDecodeError``. |
|
492 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
493 |
* 'unrepr': ``False`` |
494 |
||
495 |
The ``unrepr`` option reads and writes files in a different mode. This |
|
496 |
allows you to store and retrieve the basic Python data-types using config |
|
497 |
files. |
|
498 |
||
499 |
This uses Python syntax for lists and quoting. See `unrepr mode`_ for the |
|
500 |
full details. |
|
501 |
||
502 |
* 'write_empty_values': ``False`` |
|
503 |
||
504 |
If ``write_empty_values`` is ``True``, empty strings are written as |
|
505 |
empty values. See `Empty Values`_ for more details. |
|
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
506 |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
507 |
Methods |
508 |
------- |
|
509 |
||
510 |
The ConfigObj is a subclass of an object called ``Section``, which is itself a |
|
511 |
subclass of ``dict``, the builtin dictionary type. This means it also has |
|
512 |
**all** the normal dictionary methods. |
|
513 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
514 |
In addition, the following `Section Methods`_ may be useful : |
515 |
||
516 |
* *encode* |
|
517 |
* *decode* |
|
518 |
* *walk* |
|
519 |
* *merge* |
|
520 |
* *dict* |
|
521 |
* *as_bool* |
|
522 |
* *as_float* |
|
523 |
* *as_int* |
|
524 |
||
525 |
Read about Sections_ for details of all the methods. |
|
526 |
||
527 |
.. hint:: |
|
528 |
||
529 |
The *merge* method of sections is a recursive update. |
|
530 |
||
531 |
You can use this to merge sections, or even whole ConfigObjs, into each |
|
532 |
other. |
|
533 |
||
534 |
You would typically use this to create a default ConfigObj and then merge |
|
535 |
in user settings. This way users only need to specify values that are |
|
536 |
different from the default. |
|
537 |
||
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
538 |
|
539 |
The public methods available on ConfigObj are : |
|
540 |
||
541 |
* 'write' |
|
542 |
* 'validate' |
|
543 |
||
544 |
write |
|
545 |
~~~~~ |
|
546 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
547 |
:: |
548 |
||
549 |
write(file_object=None) |
|
550 |
||
551 |
This method writes the current ConfigObj and takes a single, optional argument |
|
552 |
[#]_. |
|
553 |
||
554 |
If you pass in a file like object to the ``write`` method, the config file will |
|
555 |
be written to this. (The only method of this object that is used is its |
|
556 |
``write`` method, so a ``StringIO`` instance, or any other file like object |
|
557 |
will work.) |
|
558 |
||
559 |
Otherwise, the behaviour of this method depends on the ``filename`` attribute |
|
560 |
of the ConfigObj. |
|
561 |
||
562 |
``filename`` |
|
563 |
ConfigObj will write the configuration to the file specified. |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
564 |
|
565 |
``None`` |
|
566 |
``write`` returns a list of lines. (Not ``'\n'`` terminated) |
|
567 |
||
568 |
First the 'initial_comment' is written, then the config file, followed by the |
|
569 |
'final_comment'. Comment lines and inline comments are written with each |
|
570 |
key/value. |
|
571 |
||
572 |
validate |
|
573 |
~~~~~~~~ |
|
574 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
575 |
:: |
576 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
577 |
validate(validator, preserve_errors=False, copy=False) |
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
578 |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
579 |
.. raw:: html |
580 |
||
581 |
{+coloring}
|
|
582 |
||
583 |
# filename is the config file |
|
584 |
# filename2 is the configspec |
|
585 |
# (which could also be hardcoded into your program) |
|
586 |
config = ConfigObj(filename, configspec=filename2) |
|
587 |
# |
|
588 |
from validate import Validator |
|
589 |
val = Validator() |
|
590 |
test = config.validate(val) |
|
591 |
if test == True: |
|
592 |
print 'Succeeded.' |
|
593 |
||
594 |
{-coloring}
|
|
595 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
596 |
The validate method uses the `validate |
597 |
<http://www.voidspace.org.uk/python/validate.html>`__ module to do the |
|
598 |
validation. |
|
599 |
||
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
600 |
This method validates the ConfigObj against the configspec. By doing type |
601 |
conversion as well, it can abstract away the config file altogether and present |
|
602 |
the config *data* to your application (in the types it expects it to be). |
|
603 |
||
604 |
If the ``configspec`` attribute of the ConfigObj is ``None``, it raises a |
|
605 |
``ValueError``. |
|
606 |
||
607 |
If the stringify_ attribute is set, this process will convert values to the |
|
608 |
type defined in the configspec. |
|
609 |
||
610 |
The validate method uses checks specified in the configspec and defined in the |
|
611 |
``Validator`` object. It is very easy to extend. |
|
612 |
||
613 |
The configspec looks like the config file, but instead of the value, you |
|
614 |
specify the check (and any default value). See the validation_ section for |
|
615 |
details. |
|
616 |
||
617 |
.. hint:: |
|
618 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
619 |
The system of configspecs can seem confusing at first, but is actually |
620 |
quite simple and powerful. For a concrete example of how to use it, you may |
|
621 |
find this blog entry helpful : |
|
622 |
`Transforming Values with ConfigObj <http://www.voidspace.org.uk/python/weblog/arch_d7_2006_03_04.shtml#e257>`_. |
|
623 |
||
624 |
There is also a module to assist in auto-generating configspecs called |
|
625 |
ConfigPersist.py_. Its use is explained in `ConfigObj for Data Persistence`_. |
|
626 |
||
627 |
The ``copy`` parameter fills in missing values from the configspec (default |
|
628 |
values), *without* marking the values as defaults. It also causes comments to |
|
629 |
be copied from the configspec into the config file. This allows you to use a |
|
630 |
configspec to create default config files. (Normally default values aren't |
|
631 |
written out by the ``write`` method.) |
|
632 |
||
633 |
As of ConfigObj 4.3.0 you can also pass in a ConfigObj instance as your |
|
634 |
configspec. This is especially useful if you need to specify the encoding of |
|
635 |
your configspec file. When you read your configspec file, you *must* specify |
|
636 |
``list_values=False``. |
|
637 |
||
638 |
.. raw:: html |
|
639 |
||
640 |
{+coloring}
|
|
641 |
from configobj import ConfigObj |
|
642 |
configspec = ConfigObj(configspecfilename, encoding='UTF8', |
|
643 |
list_values=False) |
|
644 |
config = ConfigObj(filename, configspec=configspec) |
|
645 |
{-coloring}
|
|
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
646 |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
647 |
Return Value |
648 |
############ |
|
649 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
650 |
By default, the validate method either returns ``True`` (everything passed) |
651 |
or a dictionary of ``True``/``False`` representing pass/fail. The dictionary |
|
652 |
follows the structure of the ConfigObj. |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
653 |
|
654 |
If a whole section passes then it is replaced with the value ``True``. If a |
|
655 |
whole section fails, then it is replaced with the value ``False``. |
|
656 |
||
657 |
If a value is missing, and there is no default in the check, then the check |
|
658 |
automatically fails. |
|
659 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
660 |
The ``validate`` method takes an optional keyword argument ``preserve_errors``. |
661 |
If you set this to ``True``, instead of getting ``False`` for failed checks you |
|
662 |
get the actual error object from the **validate** module. This usually contains |
|
663 |
useful information about why the check failed. |
|
664 |
||
665 |
See the `flatten_errors`_ function for how to turn your results dictionary into |
|
666 |
a useful list of error messages. |
|
667 |
||
668 |
Even if ``preserve_errors`` is ``True``, missing keys or sections will still be |
|
669 |
represented by a ``False`` in the results dictionary. |
|
670 |
||
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
671 |
Mentioning Default Values |
672 |
######################### |
|
673 |
||
674 |
In the check in your configspec, you can specify a default to be used - by |
|
675 |
using the ``default`` keyword. E.g. :: |
|
676 |
||
677 |
key1 = integer(0, 30, default=15) |
|
678 |
key2 = integer(default=15) |
|
679 |
key3 = boolean(default=True) |
|
680 |
key4 = option('Hello', 'Goodbye', 'Not Today', default='Not Today')
|
|
681 |
||
682 |
If the configspec check supplies a default and the value is missing in the |
|
683 |
config, then the default will be set in your ConfigObj. (It is still passed to |
|
684 |
the ``Validator`` so that type conversion can be done: this means the default |
|
685 |
value must still pass the check.) |
|
686 |
||
687 |
ConfigObj keeps a record of which values come from defaults, using the |
|
688 |
``defaults`` attribute of sections_. Any key in this list isn't written out by |
|
689 |
the ``write`` method. If a key is set from outside (even to the same value) |
|
690 |
then it is removed from the ``defaults`` list. |
|
691 |
||
692 |
.. note: |
|
693 |
||
694 |
Even if all the keys in a section are in the defaults list, the section |
|
695 |
marker is still written out. |
|
696 |
||
697 |
There is additionally a special case default value of ``None``. If you set the |
|
698 |
default value to ``None`` and the value is missing, the value will always be |
|
699 |
set to ``None``. As the other checks don't return ``None`` (unless you |
|
700 |
implement your own that do), you can tell that this value came from a default |
|
701 |
value (and was missing from the config file). It allows an easy way of |
|
702 |
implementing optional values. Simply check (and ignore) members that are set |
|
703 |
to ``None``. |
|
704 |
||
705 |
.. note:: |
|
706 |
||
707 |
If stringify_ is ``False`` then ``default=None`` returns ``''`` instead of |
|
708 |
``None``. This is because setting a value to a non-string raises an error |
|
709 |
if stringify is unset. |
|
710 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
711 |
The default value can be a list. See `List Values`_ for the way to do this. |
712 |
||
713 |
Writing invalid default values is a *guaranteed* way of confusing your users. |
|
714 |
Default values **must** pass the check. |
|
715 |
||
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
716 |
Mentioning Repeated Sections |
717 |
############################ |
|
718 |
||
719 |
In the configspec it is possible to cause *every* sub-section in a section to |
|
720 |
be validated using the same configspec. You do this with a section in the |
|
721 |
configspec called ``__many__``. Every sub-section in that section has the |
|
722 |
``__many__`` configspec applied to it (without you having to explicitly name |
|
723 |
them in advance). |
|
724 |
||
725 |
If you define a ``__many__`` type section it must the only sub-section in that |
|
726 |
section. Having a ``__many__`` *and* other sub-sections defined in the same |
|
727 |
section will raise a ``RepeatSectionError``. |
|
728 |
||
729 |
Your ``__many__`` section can have nested subsections, which can also include |
|
730 |
``__many__`` type sections. |
|
731 |
||
732 |
See `Repeated Sections`_ for examples. |
|
733 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
734 |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
735 |
Mentioning SimpleVal |
736 |
#################### |
|
737 |
||
738 |
If you just want to check if all members are present, then you can use the |
|
739 |
``SimpleVal`` object that comes with ConfigObj. It only fails members if they |
|
740 |
are missing. |
|
741 |
||
742 |
Write a configspec that has all the members you want to check for, but set |
|
743 |
every section to ``''``. |
|
744 |
||
745 |
.. raw:: html |
|
746 |
||
747 |
{+coloring}
|
|
748 |
||
749 |
val = SimpleVal() |
|
750 |
test = config.validate(val) |
|
751 |
if test is True: |
|
752 |
print 'Succeeded.' |
|
753 |
||
754 |
{-coloring}
|
|
755 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
756 |
|
757 |
Mentioning copy Mode |
|
758 |
#################### |
|
759 |
||
760 |
As discussed in `Mentioning Default Values`_, you can use a configspec to |
|
761 |
supply default values. These are marked in the ConfigObj instance as defaults, |
|
762 |
and *not* written out by the ``write`` mode. This means that your users only |
|
763 |
need to supply values that are different from the defaults. |
|
764 |
||
765 |
This can be inconvenient if you *do* want to write out the default values, |
|
766 |
for example to write out a default config file. |
|
767 |
||
768 |
If you set ``copy=True`` when you call validate, then no values are marked as |
|
769 |
defaults. In addition, all comments from the configspec are copied into |
|
770 |
your ConfigObj instance. You can then call ``write`` to create your config |
|
771 |
file. |
|
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
772 |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
773 |
There is a limitation with this. In order to allow `String Interpolation`_ to work |
774 |
within configspecs, ``DEFAULT`` sections are not processed by |
|
775 |
validation; even in copy mode. |
|
776 |
||
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
777 |
Attributes |
778 |
---------- |
|
779 |
||
780 |
A ConfigObj has the following attributes : |
|
781 |
||
782 |
* indent_type |
|
783 |
* interpolate |
|
784 |
* stringify |
|
785 |
* BOM |
|
786 |
* initial_comment |
|
787 |
* final_comment |
|
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
788 |
* list_values |
789 |
* encoding |
|
790 |
* default_encoding |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
791 |
* unrepr |
792 |
* write_empty_values |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
793 |
|
794 |
.. note:: |
|
795 |
||
796 |
This doesn't include *comments*, *inline_comments*, *defaults*, or |
|
797 |
*configspec*. These are actually attributes of Sections_. |
|
798 |
||
799 |
It also has the following attributes as a result of parsing. They correspond to |
|
800 |
options_ when the ConfigObj was created, but changing them has no effect. |
|
801 |
||
802 |
* raise_errors |
|
803 |
* create_empty |
|
804 |
* file_error |
|
805 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
806 |
interpolation |
807 |
~~~~~~~~~~~~~ |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
808 |
|
809 |
ConfigObj can perform string interpolation in a *similar* way to |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
810 |
``ConfigParser``. See the `String Interpolation`_ section for full details. |
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
811 |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
812 |
If ``interpolation`` is set to ``False``, then interpolation is *not* done when |
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
813 |
you fetch values. |
814 |
||
815 |
stringify |
|
816 |
~~~~~~~~~ |
|
817 |
||
818 |
If this attribute is set (``True``) then the validate_ method changes the |
|
819 |
values in the ConfigObj. These are turned back into strings when write_ is |
|
820 |
called. |
|
821 |
||
822 |
If stringify is unset (``False``) then attempting to set a value to a non |
|
823 |
string (or a list of strings) will raise a ``TypeError``. |
|
824 |
||
825 |
BOM |
|
826 |
~~~ |
|
827 |
||
828 |
If the initial config file *started* with the UTF8 Unicode signature (known |
|
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
829 |
slightly incorrectly as the {acro;BOM;Byte Order Mark}), or the UTF16 BOM, then
|
830 |
this attribute is set to ``True``. Otherwise it is ``False``. |
|
831 |
||
832 |
If it is set to ``True`` when ``write`` is called then, if ``encoding`` is set |
|
833 |
to ``None`` *or* to ``utf_8`` (and variants) a UTF BOM will be written. |
|
834 |
||
835 |
For UTF16 encodings, a BOM is *always* written. |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
836 |
|
837 |
initial_comment |
|
838 |
~~~~~~~~~~~~~~~ |
|
839 |
||
840 |
This is a list of lines. If the ConfigObj is created from an existing file, it |
|
841 |
will contain any lines of comments before the start of the members. |
|
842 |
||
843 |
If you create a new ConfigObj, this will be an empty list. |
|
844 |
||
845 |
The write method puts these lines before it starts writing out the members. |
|
846 |
||
847 |
final_comment |
|
848 |
~~~~~~~~~~~~~ |
|
849 |
||
850 |
This is a list of lines. If the ConfigObj is created from an existing file, it |
|
851 |
will contain any lines of comments after the last member. |
|
852 |
||
853 |
If you create a new ConfigObj, this will be an empty list. |
|
854 |
||
855 |
The ``write`` method puts these lines after it finishes writing out the |
|
856 |
members. |
|
857 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
858 |
list_values |
859 |
~~~~~~~~~~~ |
|
860 |
||
861 |
This attribute is ``True`` or ``False``. If set to ``False`` then values are |
|
862 |
not parsed for list values. In addition single line values are not unquoted. |
|
863 |
||
864 |
This allows you to do your own parsing of values. It exists primarily to |
|
865 |
support the reading of the configspec_ - but has other use cases. |
|
866 |
||
867 |
For example you could use the ``LineParser`` from the |
|
868 |
`listquote module <http://www.voidspace.org.uk/python/listquote.html#lineparser>`_ |
|
869 |
to read values for nested lists. |
|
870 |
||
871 |
Single line values aren't quoted when writing - but multiline values are |
|
872 |
handled as normal. |
|
873 |
||
874 |
.. caution:: |
|
875 |
||
876 |
Because values aren't quoted, leading or trailing whitespace can be |
|
877 |
lost. |
|
878 |
||
879 |
This behaviour was changed in version 4.0.1. |
|
880 |
||
881 |
Prior to this, single line values might have been quoted; even with |
|
882 |
``list_values=False``. This means that files written by **ConfigObj** |
|
883 |
*could* now be incompatible - and need the quotes removing by hand. |
|
884 |
||
885 |
encoding |
|
886 |
~~~~~~~~ |
|
887 |
||
888 |
This is the encoding used to encode the output, when you call ``write``. It |
|
889 |
must be a valid encoding `recognised by Python <http://docs.python.org/lib/standard-encodings.html>`_. |
|
890 |
||
891 |
If this value is ``None`` then no encoding is done when ``write`` is called. |
|
892 |
||
893 |
||
894 |
default_encoding |
|
895 |
~~~~~~~~~~~~~~~~ |
|
896 |
||
897 |
If encoding is set, any byte-strings in your ConfigObj instance (keys or |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
898 |
members) will first be decoded to Unicode using the encoding specified by the |
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
899 |
``default_encoding`` attribute. This ensures that the output is in the encoding |
900 |
specified. |
|
901 |
||
902 |
If this value is ``None`` then ``sys.defaultencoding`` is used instead. |
|
903 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
904 |
unrepr |
905 |
~~~~~~ |
|
906 |
||
907 |
Another boolean value. If this is set, then ``repr(value)`` is used to write |
|
908 |
values. This writes values in a slightly different way to the normal ConfigObj |
|
909 |
file syntax. |
|
910 |
||
911 |
This preserves basic Python data-types when read back in. See `unrepr mode`_ |
|
912 |
for more details. |
|
913 |
||
914 |
write_empty_values |
|
915 |
~~~~~~~~~~~~~~~~~~ |
|
916 |
||
917 |
Also boolean. If set, values that are an empty string (``''``) are written as |
|
918 |
empty values. See `Empty Values`_ for more details. |
|
919 |
||
920 |
||
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
921 |
The Config File Format |
922 |
====================== |
|
923 |
||
924 |
You saw an example config file in the `Config Files`_ section. Here is a fuller |
|
925 |
specification of the config files used and created by ConfigObj. |
|
926 |
||
927 |
The basic pattern for keywords is : :: |
|
928 |
||
929 |
# comment line |
|
930 |
# comment line |
|
931 |
keyword = value # inline comment |
|
932 |
||
933 |
Both keyword and value can optionally be surrounded in quotes. The equals sign |
|
934 |
is the only valid divider. |
|
935 |
||
936 |
Values can have comments on the lines above them, and an inline comment after |
|
937 |
them. This, of course, is optional. See the comments_ section for details. |
|
938 |
||
939 |
If a keyword or value starts or ends with whitespace, or contains a quote mark |
|
940 |
or comma, then it should be surrounded by quotes. Quotes are not necessary if |
|
941 |
whitespace is surrounded by non-whitespace. |
|
942 |
||
943 |
Values can also be lists. Lists are comma separated. You indicate a single |
|
944 |
member list by a trailing comma. An empty list is shown by a single comma : :: |
|
945 |
||
946 |
keyword1 = value1, value2, value3 |
|
947 |
keyword2 = value1, # a single member list |
|
948 |
keyword3 = , # an empty list |
|
949 |
||
950 |
Values that contain line breaks (multi-line values) can be surrounded by triple |
|
951 |
quotes. These can also be used if a value contains both types of quotes. List |
|
952 |
members cannot be surrounded by triple quotes : :: |
|
953 |
||
954 |
keyword1 = ''' A multi line value |
|
955 |
on several |
|
956 |
lines''' # with a comment |
|
957 |
keyword2 = '''I won't be "afraid".''' |
|
958 |
# |
|
959 |
keyword3 = """ A multi line value |
|
960 |
on several |
|
961 |
lines""" # with a comment |
|
962 |
keyword4 = """I won't be "afraid".""" |
|
963 |
||
964 |
.. warning:: |
|
965 |
||
966 |
There is no way of safely quoting values that contain both types of triple |
|
967 |
quotes. |
|
968 |
||
969 |
A line that starts with a '#', possibly preceded by whitespace, is a comment. |
|
970 |
||
971 |
New sections are indicated by a section marker line. That is the section name |
|
972 |
in square brackets. Whitespace around the section name is ignored. The name can |
|
973 |
be quoted with single or double quotes. The marker can have comments before it |
|
974 |
and an inline comment after it : :: |
|
975 |
||
976 |
# The First Section |
|
977 |
[ section name 1 ] # first section |
|
978 |
keyword1 = value1 |
|
979 |
||
980 |
# The Second Section |
|
981 |
[ "section name 2" ] # second section |
|
982 |
keyword2 = value2 |
|
983 |
||
984 |
Any subsections (sections that are *inside* the current section) are |
|
985 |
designated by repeating the square brackets before and after the section name. |
|
986 |
The number of square brackets represents the nesting level of the sub-section. |
|
987 |
Square brackets may be separated by whitespace; such whitespace, however, will |
|
988 |
not be present in the output config written by the ``write`` method. |
|
989 |
||
990 |
Indentation is not significant, but can be preserved. See the description of |
|
991 |
the ``indent_type`` option, in the `ConfigObj specifications`_ chapter, for the |
|
992 |
details. |
|
993 |
||
994 |
A *NestingError* will be raised if the number of the opening and the closing |
|
995 |
brackets in a section marker is not the same, or if a sub-section's nesting |
|
996 |
level is greater than the nesting level of it parent plus one. |
|
997 |
||
998 |
In the outer section, single values can only appear before any sub-section. |
|
999 |
Otherwise they will belong to the sub-section immediately before them. :: |
|
1000 |
||
1001 |
# initial comment |
|
1002 |
keyword1 = value1 |
|
1003 |
keyword2 = value2 |
|
1004 |
||
1005 |
[section 1] |
|
1006 |
keyword1 = value1 |
|
1007 |
keyword2 = value2 |
|
1008 |
||
1009 |
[[sub-section]] |
|
1010 |
# this is in section 1 |
|
1011 |
keyword1 = value1 |
|
1012 |
keyword2 = value2 |
|
1013 |
||
1014 |
[[[nested section]]] |
|
1015 |
# this is in sub section |
|
1016 |
keyword1 = value1 |
|
1017 |
keyword2 = value2 |
|
1018 |
||
1019 |
[[sub-section2]] |
|
1020 |
# this is in section 1 again |
|
1021 |
keyword1 = value1 |
|
1022 |
keyword2 = value2 |
|
1023 |
||
1024 |
[[sub-section3]] |
|
1025 |
# this is also in section 1, indentation is misleading here |
|
1026 |
keyword1 = value1 |
|
1027 |
keyword2 = value2 |
|
1028 |
||
1029 |
# final comment |
|
1030 |
||
1031 |
When parsed, the above config file produces the following data structure : |
|
1032 |
||
1033 |
.. raw:: html |
|
1034 |
||
1035 |
{+coloring}
|
|
1036 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
1037 |
ConfigObj({
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1038 |
'keyword1': 'value1', |
1039 |
'keyword2': 'value2', |
|
1040 |
'section 1': {
|
|
1041 |
'keyword1': 'value1', |
|
1042 |
'keyword2': 'value2', |
|
1043 |
'sub-section': {
|
|
1044 |
'keyword1': 'value1', |
|
1045 |
'keyword2': 'value2', |
|
1046 |
'nested section': {
|
|
1047 |
'keyword1': 'value1', |
|
1048 |
'keyword2': 'value2', |
|
1049 |
}, |
|
1050 |
}, |
|
1051 |
'sub-section2': {
|
|
1052 |
'keyword1': 'value1', |
|
1053 |
'keyword2': 'value2', |
|
1054 |
}, |
|
1055 |
'sub-section3': {
|
|
1056 |
'keyword1': 'value1', |
|
1057 |
'keyword2': 'value2', |
|
1058 |
}, |
|
1059 |
}, |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
1060 |
}) |
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1061 |
|
1062 |
{-coloring}
|
|
1063 |
||
1064 |
Sections are ordered: note how the structure of the resulting ConfigObj is in |
|
1065 |
the same order as the original file. |
|
1066 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
1067 |
.. note:: |
1068 |
||
1069 |
In ConfigObj 4.3.0 *empty values* became valid syntax. They are read as the |
|
1070 |
empty string. There is also an option/attribute (``write_empty_values``) to |
|
1071 |
allow the writing of these. |
|
1072 |
||
1073 |
This is mainly to support 'legacy' config files, written from other |
|
1074 |
applications. This is documented under `Empty Values`_. |
|
1075 |
||
1076 |
`unrepr mode`_ introduces *another* syntax variation, used for storing |
|
1077 |
basic Python datatypes in config files. {sm;:-)}
|
|
1078 |
||
1079 |
||
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1080 |
Sections |
1081 |
======== |
|
1082 |
||
1083 |
Every section in a ConfigObj has certain properties. The ConfigObj itself also |
|
1084 |
has these properties, because it too is a section (sometimes called the *root |
|
1085 |
section*). |
|
1086 |
||
1087 |
``Section`` is a subclass of the standard new-class dictionary, therefore it |
|
1088 |
has **all** the methods of a normal dictionary. This means you can ``update`` |
|
1089 |
and ``clear`` sections. |
|
1090 |
||
1091 |
.. note:: |
|
1092 |
||
1093 |
You create a new section by assigning a member to be a dictionary. |
|
1094 |
||
1095 |
The new ``Section`` is created *from* the dictionary, but isn't the same |
|
1096 |
thing as the dictionary. (So references to the dictionary you use to create |
|
1097 |
the section *aren't* references to the new section). |
|
1098 |
||
1099 |
Note the following. |
|
1100 |
||
1101 |
.. raw:: html |
|
1102 |
||
1103 |
{+coloring}
|
|
1104 |
||
1105 |
config = ConfigObj() |
|
1106 |
vals = {'key1': 'value 1',
|
|
1107 |
'key2': 'value 2' |
|
1108 |
} |
|
1109 |
config['vals'] = vals |
|
1110 |
config['vals'] == vals |
|
1111 |
True |
|
1112 |
config['vals'] is vals |
|
1113 |
False |
|
1114 |
||
1115 |
{-coloring}
|
|
1116 |
||
1117 |
If you now change ``vals``, the changes won't be reflected in ``config['vals']``. |
|
1118 |
||
1119 |
A section is ordered, following its ``scalars`` and ``sections`` |
|
1120 |
attributes documented below. This means that the following dictionary |
|
1121 |
attributes return their results in order. |
|
1122 |
||
1123 |
* '__iter__' |
|
1124 |
||
1125 |
More commonly known as ``for member in section:``. |
|
1126 |
||
1127 |
* '__repr__' and '__str__' |
|
1128 |
||
1129 |
Any time you print or display the ConfigObj. |
|
1130 |
||
1131 |
* 'items' |
|
1132 |
||
1133 |
* 'iteritems' |
|
1134 |
||
1135 |
* 'iterkeys' |
|
1136 |
||
1137 |
* 'itervalues' |
|
1138 |
||
1139 |
* 'keys' |
|
1140 |
||
1141 |
* 'popitem' |
|
1142 |
||
1143 |
* 'values' |
|
1144 |
||
1145 |
Section Attributes |
|
1146 |
------------------ |
|
1147 |
||
1148 |
* main |
|
1149 |
||
1150 |
A reference to the main ConfigObj. |
|
1151 |
||
1152 |
* parent |
|
1153 |
||
1154 |
A reference to the 'parent' section, the section that this section is a |
|
1155 |
member of. |
|
1156 |
||
1157 |
On the ConfigObj this attribute is a reference to itself. You can use this |
|
1158 |
to walk up the sections, stopping when ``section.parent is section``. |
|
1159 |
||
1160 |
* depth |
|
1161 |
||
1162 |
The nesting level of the current section. |
|
1163 |
||
1164 |
If you create a new ConfigObj and add sections, 1 will be added to the |
|
1165 |
depth level between sections. |
|
1166 |
||
1167 |
* defaults |
|
1168 |
||
1169 |
This attribute is a list of scalars that came from default values. Values |
|
1170 |
that came from defaults aren't written out by the ``write`` method. |
|
1171 |
Setting any of these values in the section removes them from the defaults |
|
1172 |
list. |
|
1173 |
||
1174 |
* scalars, sections |
|
1175 |
||
1176 |
These attributes are normal lists, representing the order that members, |
|
1177 |
single values and subsections appear in the section. The order will either |
|
1178 |
be the order of the original config file, *or* the order that you added |
|
1179 |
members. |
|
1180 |
||
1181 |
The order of members in this lists is the order that ``write`` creates in |
|
1182 |
the config file. The ``scalars`` list is output before the ``sections`` |
|
1183 |
list. |
|
1184 |
||
1185 |
Adding or removing members also alters these lists. You can manipulate the |
|
1186 |
lists directly to alter the order of members. |
|
1187 |
||
1188 |
.. warning:: |
|
1189 |
||
1190 |
If you alter the ``scalars``, ``sections``, or ``defaults`` attributes |
|
1191 |
so that they no longer reflect the contents of the section, you will |
|
1192 |
break your ConfigObj. |
|
1193 |
||
1194 |
See also the ``rename`` method. |
|
1195 |
||
1196 |
* comments |
|
1197 |
||
1198 |
This is a dictionary of comments associated with each member. Each entry is |
|
1199 |
a list of lines. These lines are written out before the member. |
|
1200 |
||
1201 |
* inline_comments |
|
1202 |
||
1203 |
This is *another* dictionary of comments associated with each member. Each |
|
1204 |
entry is a string that is put inline with the member. |
|
1205 |
||
1206 |
* configspec |
|
1207 |
||
1208 |
The configspec attribute is a dictionary mapping scalars to *checks*. A |
|
1209 |
check defines the expected type and possibly the allowed values for a |
|
1210 |
member. |
|
1211 |
||
1212 |
The configspec has the same format as a config file, but instead of values |
|
1213 |
it has a specification for the value (which may include a default value). |
|
1214 |
The validate_ method uses it to check the config file makes sense. If a |
|
1215 |
configspec is passed in when the ConfigObj is created, then it is parsed |
|
1216 |
and broken up to become the ``configspec`` attribute of each section. |
|
1217 |
||
1218 |
If you didn't pass in a configspec, this attribute will be ``None`` on the |
|
1219 |
root section (the main ConfigObj). |
|
1220 |
||
1221 |
You can set the configspec attribute directly on a section. |
|
1222 |
||
1223 |
See the validation_ section for full details of how to write configspecs. |
|
1224 |
||
1225 |
Section Methods |
|
1226 |
--------------- |
|
1227 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
1228 |
* **dict** |
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1229 |
|
1230 |
This method takes no arguments. It returns a deep copy of the section as a |
|
1231 |
dictionary. All subsections will also be dictionaries, and list values will |
|
1232 |
be copies, rather than references to the original [#]_. |
|
1233 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
1234 |
* **rename** |
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1235 |
|
1236 |
``rename(oldkey, newkey)`` |
|
1237 |
||
1238 |
This method renames a key, without affecting its position in the sequence. |
|
1239 |
||
1240 |
It is mainly implemented for the ``encode`` and ``decode`` methods, which |
|
1241 |
provide some Unicode support. |
|
1242 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
1243 |
* **merge** |
1244 |
||
1245 |
``merge(indict)`` |
|
1246 |
||
1247 |
This method is a *recursive update* method. It allows you to merge two |
|
1248 |
config files together. |
|
1249 |
||
1250 |
You would typically use this to create a default ConfigObj and then merge |
|
1251 |
in user settings. This way users only need to specify values that are |
|
1252 |
different from the default. |
|
1253 |
||
1254 |
For example : |
|
1255 |
||
1256 |
.. raw:: html |
|
1257 |
||
1258 |
{+coloring}
|
|
1259 |
||
1260 |
# def_cfg contains your default config settings |
|
1261 |
# user_cfg contains the user settings |
|
1262 |
cfg = ConfigObj(def_cfg) |
|
1263 |
usr = ConfigObj(user_cfg) |
|
1264 |
# |
|
1265 |
cfg.merge(usr) |
|
1266 |
||
1267 |
""" |
|
1268 |
cfg now contains a combination of the default settings and the user |
|
1269 |
settings. |
|
1270 |
||
1271 |
The user settings will have overwritten any of the default ones. |
|
1272 |
""" |
|
1273 |
||
1274 |
{-coloring}
|
|
1275 |
||
1276 |
* **walk** |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1277 |
|
1278 |
This method can be used to transform values and names. See `walking a |
|
1279 |
section`_ for examples and explanation. |
|
1280 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
1281 |
* **decode** |
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1282 |
|
1283 |
``decode(encoding)`` |
|
1284 |
||
1285 |
This method decodes names and values into Unicode objects, using the |
|
1286 |
supplied encoding. |
|
1287 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
1288 |
* **encode** |
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1289 |
|
1290 |
``encode(encoding)`` |
|
1291 |
||
1292 |
This method is the opposite of ``decode`` {sm;:!:}.
|
|
1293 |
||
1294 |
It encodes names and values using the supplied encoding. If any of your |
|
1295 |
names/values are strings rather than Unicode, Python will have to do an |
|
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
1296 |
implicit decode first. (This method uses ``sys.defaultencoding`` for |
1297 |
implicit decodes.) |
|
1298 |
||
1299 |
* **as_bool** |
|
1300 |
||
1301 |
``as_bool(key)`` |
|
1302 |
||
1303 |
Returns ``True`` if the key contains a string that represents ``True``, or |
|
1304 |
is the ``True`` object. |
|
1305 |
||
1306 |
Returns ``False`` if the key contains a string that represents ``False``, |
|
1307 |
or is the ``False`` object. |
|
1308 |
||
1309 |
Raises a ``ValueError`` if the key contains anything else. |
|
1310 |
||
1311 |
Strings that represent ``True`` are (not case sensitive) : :: |
|
1312 |
||
1313 |
true, yes, on, 1 |
|
1314 |
||
1315 |
Strings that represent ``False`` are : :: |
|
1316 |
||
1317 |
false, no, off, 0 |
|
1318 |
||
1319 |
.. note:: |
|
1320 |
||
1321 |
In ConfigObj 4.1.0, this method was called ``istrue``. That method is |
|
1322 |
now deprecated and will issue a warning when used. It will go away |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
1323 |
in a future release. |
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
1324 |
|
1325 |
* **as_int** |
|
1326 |
||
1327 |
``as_int(key)`` |
|
1328 |
||
1329 |
This returns the value contained in the specified key as an integer. |
|
1330 |
||
1331 |
It raises a ``ValueError`` if the conversion can't be done. |
|
1332 |
||
1333 |
* **as_float** |
|
1334 |
||
1335 |
``as_float(key)`` |
|
1336 |
||
1337 |
This returns the value contained in the specified key as a float. |
|
1338 |
||
1339 |
It raises a ``ValueError`` if the conversion can't be done. |
|
1340 |
||
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1341 |
Walking a Section |
1342 |
----------------- |
|
1343 |
||
1344 |
.. note:: |
|
1345 |
||
1346 |
The walk method allows you to call a function on every member/name. |
|
1347 |
||
1348 |
.. raw:: html |
|
1349 |
||
1350 |
{+coloring}
|
|
1351 |
||
1352 |
walk(function, raise_errors=True, |
|
1353 |
call_on_sections=False, **keywargs): |
|
1354 |
||
1355 |
{-coloring}
|
|
1356 |
||
1357 |
``walk`` is a method of the ``Section`` object. This means it is also a method |
|
1358 |
of ConfigObj. |
|
1359 |
||
1360 |
It walks through every member and calls a function on the keyword and value. It |
|
1361 |
walks recursively through subsections. |
|
1362 |
||
1363 |
It returns a dictionary of all the computed values. |
|
1364 |
||
1365 |
If the function raises an exception, the default is to propagate the error, and |
|
1366 |
stop. If ``raise_errors=False`` then it sets the return value for that keyword |
|
1367 |
to ``False`` instead, and continues. This is similar to the way validation_ |
|
1368 |
works. |
|
1369 |
||
1370 |
Your function receives the arguments ``(section, key)``. The current value is |
|
1371 |
then ``section[key]`` [#]_. Any unrecognised keyword arguments you pass to |
|
1372 |
walk, are passed on to the function. |
|
1373 |
||
1374 |
Normally ``walk`` just recurses into subsections. If you are transforming (or |
|
1375 |
checking) names as well as values, then you want to be able to change the names |
|
1376 |
of sections. In this case set ``call_on_sections`` to ``True``. Now, on |
|
1377 |
encountering a sub-section, *first* the function is called for the *whole* |
|
1378 |
sub-section, and *then* it recurses into it's members. This means your function |
|
1379 |
must be able to handle receiving dictionaries as well as strings and lists. |
|
1380 |
||
1381 |
If you are using the return value from ``walk`` *and* ``call_on_sections``, |
|
1382 |
note that walk discards the return value when it calls your function. |
|
1383 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
1384 |
.. caution:: |
1385 |
||
1386 |
You can use ``walk`` to transform the names of members of a section |
|
1387 |
but you mustn't add or delete members. |
|
1388 |
||
1389 |
||
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1390 |
Examples |
1391 |
-------- |
|
1392 |
||
1393 |
Examples that use the walk method are the ``encode`` and ``decode`` methods. |
|
1394 |
They both define a function and pass it to walk. Because these functions |
|
1395 |
transform names as well as values (from byte strings to Unicode) they set |
|
1396 |
``call_on_sections=True``. |
|
1397 |
||
1398 |
To see how they do it, *read the source Luke* {sm;:cool:}.
|
|
1399 |
||
1400 |
You can use this for transforming all values in your ConfigObj. For example |
|
1401 |
you might like the nested lists from ConfigObj 3. This was provided by the |
|
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
1402 |
listquote_ module. You could switch off the parsing for list values |
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1403 |
(``list_values=False``) and use listquote to parse every value. |
1404 |
||
1405 |
Another thing you might want to do is use the Python escape codes in your |
|
1406 |
values. You might be *used* to using ``\n`` for line feed and ``\t`` for tab. |
|
1407 |
Obviously we'd need to decode strings that come from the config file (using the |
|
1408 |
escape codes). Before writing out we'll need to put the escape codes back in |
|
1409 |
encode. |
|
1410 |
||
1411 |
As an example we'll write a function to use with walk, that encodes or decodes |
|
1412 |
values using the ``string-escape`` codec. |
|
1413 |
||
1414 |
The function has to take each value and set the new value. As a bonus we'll |
|
1415 |
create one function that will do decode *or* encode depending on a keyword |
|
1416 |
argument. |
|
1417 |
||
1418 |
We don't want to work with section names, we're only transforming values, so |
|
1419 |
we can leave ``call_on_sections`` as ``False``. This means the two datatypes we |
|
1420 |
have to handle are strings and lists, we can ignore everything else. (We'll |
|
1421 |
treat tuples as lists as well). |
|
1422 |
||
1423 |
We're not using the return values, so it doesn't need to return anything, just |
|
1424 |
change the values if appropriate. |
|
1425 |
||
1426 |
.. raw:: html |
|
1427 |
||
1428 |
{+coloring}
|
|
1429 |
||
1430 |
def string_escape(section, key, encode=False): |
|
1431 |
""" |
|
1432 |
A function to encode or decode using the 'string-escape' codec. |
|
1433 |
To be passed to the walk method of a ConfigObj. |
|
1434 |
By default it decodes. |
|
1435 |
To encode, pass in the keyword argument ``encode=True``. |
|
1436 |
""" |
|
1437 |
val = section[key] |
|
1438 |
# is it a type we can work with |
|
1439 |
# NOTE: for platforms where Python > 2.2 |
|
1440 |
# you can use basestring instead of (str, unicode) |
|
1441 |
if not isinstance(val, (str, unicode, list, tuple)): |
|
1442 |
# no ! |
|
1443 |
return |
|
1444 |
elif isinstance(val, (str, unicode)): |
|
1445 |
# it's a string ! |
|
1446 |
if not encode: |
|
1447 |
section[key] = val.decode('string-escape')
|
|
1448 |
else: |
|
1449 |
section[key] = val.encode('string-escape')
|
|
1450 |
else: |
|
1451 |
# it must be a list or tuple! |
|
1452 |
# we'll be lazy and create a new list |
|
1453 |
newval = [] |
|
1454 |
# we'll check every member of the list |
|
1455 |
for entry in val: |
|
1456 |
if isinstance(entry, (str, unicode)): |
|
1457 |
if not encode: |
|
1458 |
newval.append(entry.decode('string-escape'))
|
|
1459 |
else: |
|
1460 |
newval.append(entry.encode('string-escape'))
|
|
1461 |
else: |
|
1462 |
newval.append(entry) |
|
1463 |
# done ! |
|
1464 |
section[key] = newval |
|
1465 |
||
1466 |
# assume we have a ConfigObj called ``config`` |
|
1467 |
# |
|
1468 |
# To decode |
|
1469 |
config.walk(string_escape) |
|
1470 |
# |
|
1471 |
# To encode. |
|
1472 |
# Because ``walk`` doesn't recognise the ``encode`` argument |
|
1473 |
# it passes it to our function. |
|
1474 |
config.walk(string_escape, encode=True) |
|
1475 |
||
1476 |
{-coloring}
|
|
1477 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
1478 |
Here's a simple example of using ``walk`` to transform names and values. One |
1479 |
usecase of this would be to create a *standard* config file with placeholders |
|
1480 |
for section and keynames. You can then use walk to create new config files |
|
1481 |
and change values and member names : |
|
1482 |
||
1483 |
.. raw:: html |
|
1484 |
||
1485 |
{+coloring}
|
|
1486 |
||
1487 |
# We use 'XXXX' as a placeholder |
|
1488 |
config = ''' |
|
1489 |
XXXXkey1 = XXXXvalue1 |
|
1490 |
XXXXkey2 = XXXXvalue2 |
|
1491 |
XXXXkey3 = XXXXvalue3 |
|
1492 |
[XXXXsection1] |
|
1493 |
XXXXkey1 = XXXXvalue1 |
|
1494 |
XXXXkey2 = XXXXvalue2 |
|
1495 |
XXXXkey3 = XXXXvalue3 |
|
1496 |
[XXXXsection2] |
|
1497 |
XXXXkey1 = XXXXvalue1 |
|
1498 |
XXXXkey2 = XXXXvalue2 |
|
1499 |
XXXXkey3 = XXXXvalue3 |
|
1500 |
[[XXXXsection1]] |
|
1501 |
XXXXkey1 = XXXXvalue1 |
|
1502 |
XXXXkey2 = XXXXvalue2 |
|
1503 |
XXXXkey3 = XXXXvalue3 |
|
1504 |
'''.splitlines() |
|
1505 |
cfg = ConfigObj(config) |
|
1506 |
# |
|
1507 |
def transform(section, key): |
|
1508 |
val = section[key] |
|
1509 |
newkey = key.replace('XXXX', 'CLIENT1')
|
|
1510 |
section.rename(key, newkey) |
|
1511 |
if isinstance(val, (tuple, list, dict)): |
|
1512 |
pass |
|
1513 |
else: |
|
1514 |
val = val.replace('XXXX', 'CLIENT1')
|
|
1515 |
section[newkey] = val |
|
1516 |
# |
|
1517 |
cfg.walk(transform, call_on_sections=True) |
|
1518 |
print cfg |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
1519 |
ConfigObj({'CLIENT1key1': 'CLIENT1value1', 'CLIENT1key2': 'CLIENT1value2',
|
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
1520 |
'CLIENT1key3': 'CLIENT1value3', |
1521 |
'CLIENT1section1': {'CLIENT1key1': 'CLIENT1value1',
|
|
1522 |
'CLIENT1key2': 'CLIENT1value2', 'CLIENT1key3': 'CLIENT1value3'}, |
|
1523 |
'CLIENT1section2': {'CLIENT1key1': 'CLIENT1value1',
|
|
1524 |
'CLIENT1key2': 'CLIENT1value2', 'CLIENT1key3': 'CLIENT1value3', |
|
1525 |
'CLIENT1section1': {'CLIENT1key1': 'CLIENT1value1',
|
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
1526 |
'CLIENT1key2': 'CLIENT1value2', 'CLIENT1key3': 'CLIENT1value3'}}}) |
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
1527 |
|
1528 |
{-coloring}
|
|
1529 |
||
1530 |
||
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1531 |
Exceptions |
1532 |
========== |
|
1533 |
||
1534 |
There are several places where ConfigObj may raise exceptions (other than |
|
1535 |
because of bugs). |
|
1536 |
||
1537 |
1) If a configspec filename you pass in doesn't exist, or a config file |
|
1538 |
filename doesn't exist *and* ``file_error=True``, an ``IOError`` will be |
|
1539 |
raised. |
|
1540 |
||
1541 |
2) If you try to set a non-string key, or a non string value when |
|
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
1542 |
``stringify=False``, a ``TypeError`` will be raised. |
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1543 |
|
1544 |
3) A badly built config file will cause parsing errors. |
|
1545 |
||
1546 |
4) A parsing error can also occur when reading a configspec. |
|
1547 |
||
1548 |
5) In string interpolation you can specify a value that doesn't exist, or |
|
1549 |
create circular references (recursion). |
|
1550 |
||
1551 |
6) If you have a ``__many__`` repeated section with other section definitions |
|
1552 |
(in a configspec), a ``RepeatSectionError`` will be raised. |
|
1553 |
||
1554 |
Number 5 (which is actually two different types of exceptions) is documented |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
1555 |
in `String Interpolation`_. |
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1556 |
|
1557 |
Number 6 is explained in the validation_ section. |
|
1558 |
||
1559 |
*This* section is about errors raised during parsing. |
|
1560 |
||
1561 |
The base error class is ``ConfigObjError``. This is a subclass of |
|
1562 |
``SyntaxError``, so you can trap for ``SyntaxError`` without needing to |
|
1563 |
directly import any of the ConfigObj exceptions. |
|
1564 |
||
1565 |
The following other exceptions are defined (all deriving from |
|
1566 |
``ConfigObjError``) : |
|
1567 |
||
1568 |
* ``NestingError`` |
|
1569 |
||
1570 |
This error indicates either a mismatch in the brackets in a section marker, |
|
1571 |
or an excessive level of nesting. |
|
1572 |
||
1573 |
* ``ParseError`` |
|
1574 |
||
1575 |
This error indicates that a line is badly written. It is neither a valid |
|
1576 |
``key = value`` line, nor a valid section marker line, nor a comment line. |
|
1577 |
||
1578 |
* ``DuplicateError`` |
|
1579 |
||
1580 |
The keyword or section specified already exists. |
|
1581 |
||
1582 |
* ``ConfigspecError`` |
|
1583 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
1584 |
An error occurred whilst parsing a configspec. |
1585 |
||
1586 |
* ``UnreprError`` |
|
1587 |
||
1588 |
An error occurred when parsing a value in `unrepr mode`_. |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1589 |
|
1590 |
When parsing a configspec, ConfigObj will stop on the first error it |
|
1591 |
encounters. It will raise a ``ConfigspecError``. This will have an ``error`` |
|
1592 |
attribute, which is the actual error that was raised. |
|
1593 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
1594 |
Behaviour when parsing a config file depends on the option ``raise_errors``. |
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1595 |
If ConfigObj encounters an error while parsing a config file: |
1596 |
||
1597 |
If ``raise_errors=True`` then ConfigObj will raise the appropriate error |
|
1598 |
and parsing will stop. |
|
1599 |
||
1600 |
If ``raise_errors=False`` (the default) then parsing will continue to the |
|
1601 |
end and *all* errors will be collected. |
|
1602 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
1603 |
If ``raise_errors`` is False and multiple errors are found a ``ConfigObjError`` |
1604 |
is raised. The error raised has a ``config`` attribute, which is the parts of |
|
1605 |
the ConfigObj that parsed successfully. It also has an attribute ``errors``, |
|
1606 |
which is a list of *all* the errors raised. Each entry in the list is an |
|
1607 |
instance of the appropriate error type. Each one has the following attributes |
|
1608 |
(useful for delivering a sensible error message to your user) : |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1609 |
|
1610 |
* ``line``: the original line that caused the error. |
|
1611 |
||
1612 |
* ``line_number``: its number in the config file. |
|
1613 |
||
1614 |
* ``message``: the error message that accompanied the error. |
|
1615 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
1616 |
If only one error is found, then that error is re-raised. The error still has |
1617 |
the ``config`` and ``errors`` attributes. This means that your error handling |
|
1618 |
code can be the same whether one error is raised in parsing , or several. |
|
1619 |
||
1620 |
It also means that in the most common case (a single error) a useful error |
|
1621 |
message will be raised. |
|
1622 |
||
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1623 |
.. note:: |
1624 |
||
1625 |
One wrongly written line could break the basic structure of your config |
|
1626 |
file. This could cause every line after it to flag an error, so having a |
|
1627 |
list of all the lines that caused errors may not be as useful as it sounds. |
|
1628 |
{sm;:-(}.
|
|
1629 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
1630 |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1631 |
Validation |
1632 |
========== |
|
1633 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
1634 |
.. hint:: |
1635 |
||
1636 |
The system of configspecs can seem confusing at first, but is actually |
|
1637 |
quite simple and powerful. For a concrete example of how to use it, you may |
|
1638 |
find this blog entry helpful : |
|
1639 |
`Transforming Values with ConfigObj <http://www.voidspace.org.uk/python/weblog/arch_d7_2006_03_04.shtml#e257>`_. |
|
1640 |
||
1641 |
There is also a module to assist in auto-generating configspecs called |
|
1642 |
ConfigPersist.py_. Its use is explained in `ConfigObj for Data Persistence`_. |
|
1643 |
||
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1644 |
Validation is done through a combination of the configspec_ and a ``Validator`` |
1645 |
object. For this you need *validate.py* [#]_. See downloading_ if you don't |
|
1646 |
have a copy. |
|
1647 |
||
1648 |
Validation can perform two different operations : |
|
1649 |
||
1650 |
1) Check that a value meets a specification. For example, check that a value |
|
1651 |
is an integer between one and six, or is a choice from a specific set of |
|
1652 |
options. |
|
1653 |
||
1654 |
2) It can convert the value into the type required. For example, if one of |
|
1655 |
your values is a port number, validation will turn it into an integer for |
|
1656 |
you. |
|
1657 |
||
1658 |
So validation can act as a transparent layer between the datatypes of your |
|
1659 |
application configuration (boolean, integers, floats, etc) and the text format |
|
1660 |
of your config file. |
|
1661 |
||
1662 |
configspec |
|
1663 |
---------- |
|
1664 |
||
1665 |
The ``validate`` method checks members against an entry in the configspec. Your |
|
1666 |
configspec therefore resembles your config file, with a check for every member. |
|
1667 |
||
1668 |
In order to perform validation you need a ``Validator`` object. This has |
|
1669 |
several useful built-in check functions. You can also create your own custom |
|
1670 |
functions and register them with your Validator object. |
|
1671 |
||
1672 |
Each check is the name of one of these functions, including any parameters and |
|
1673 |
keyword arguments. The configspecs look like function calls, and they map to |
|
1674 |
function calls. |
|
1675 |
||
1676 |
The basic datatypes that an un-extended Validator can test for are : |
|
1677 |
||
1678 |
* boolean values (True and False) |
|
1679 |
* integers (including minimum and maximum values) |
|
1680 |
* floats (including min and max) |
|
1681 |
* strings (including min and max length) |
|
1682 |
* IP addresses (v4 only) |
|
1683 |
||
1684 |
It can also handle lists of these types and restrict a value to being one from |
|
1685 |
a set of options. |
|
1686 |
||
1687 |
An example configspec is going to look something like : :: |
|
1688 |
||
1689 |
port = integer(0, 100) |
|
1690 |
user = string(max=25) |
|
1691 |
mode = option('quiet', 'loud', 'silent')
|
|
1692 |
||
1693 |
You can specify default values, and also have the same configspec applied to |
|
1694 |
several sections. This is called `repeated sections`_. |
|
1695 |
||
1696 |
For full details on writing configspecs, please refer to the `validate.py |
|
1697 |
documentation`_. |
|
1698 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
1699 |
.. important:: |
1700 |
||
1701 |
Your configspec is read by ConfigObj in the same way as a config file. |
|
1702 |
||
1703 |
That means you can do interpolation *within* your configspec. |
|
1704 |
||
1705 |
In order to allow this, checks in the 'DEFAULT' section (of the root level |
|
1706 |
of your configspec) are *not* used. |
|
1707 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
1708 |
If you need to specify the encoding of your configspec, then you can pass in a |
1709 |
ConfigObj instance as your configspec. When you read your configspec file, you |
|
1710 |
*must* specify ``list_values=False``. |
|
1711 |
||
1712 |
.. raw:: html |
|
1713 |
||
1714 |
{+coloring}
|
|
1715 |
from configobj import ConfigObj |
|
1716 |
configspec = ConfigObj(configspecfilename, encoding='UTF8', |
|
1717 |
list_values=False) |
|
1718 |
config = ConfigObj(filename, configspec=configspec) |
|
1719 |
{-coloring}
|
|
1720 |
||
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1721 |
.. _validate.py documentation: http://www.voidspace.org.uk/python/validate.html |
1722 |
||
1723 |
Type Conversion |
|
1724 |
--------------- |
|
1725 |
||
1726 |
By default, validation does type conversion. This means that if you specify |
|
1727 |
``integer`` as the check, then calling validate_ will actually change the value |
|
1728 |
to an integer (so long as the check succeeds). |
|
1729 |
||
1730 |
It also means that when you call the write_ method, the value will be converted |
|
1731 |
back into a string using the ``str`` function. |
|
1732 |
||
1733 |
To switch this off, and leave values as strings after validation, you need to |
|
1734 |
set the stringify_ attribute to ``False``. If this is the case, attempting to |
|
1735 |
set a value to a non-string will raise an error. |
|
1736 |
||
1737 |
Default Values |
|
1738 |
-------------- |
|
1739 |
||
1740 |
You can set a default value in your check. If the value is missing from the |
|
1741 |
config file then this value will be used instead. This means that your user |
|
1742 |
only has to supply values that differ from the defaults. |
|
1743 |
||
1744 |
If you *don't* supply a default then for a value to be missing is an error, |
|
1745 |
and this will show in the `return value`_ from validate. |
|
1746 |
||
1747 |
Additionally you can set the default to be ``None``. This means the value will |
|
1748 |
be set to ``None`` (the object) *whichever check is used*. (It will be set to |
|
1749 |
``''`` rather than ``None`` if stringify_ is ``False``). You can use this |
|
1750 |
to easily implement optional values in your config files. :: |
|
1751 |
||
1752 |
port = integer(0, 100, default=80) |
|
1753 |
user = string(max=25, default=0) |
|
1754 |
mode = option('quiet', 'loud', 'silent', default='loud')
|
|
1755 |
nick = string(default=None) |
|
1756 |
||
1757 |
.. note:: |
|
1758 |
||
1759 |
Because the default goes through type conversion, it also has to pass the |
|
1760 |
check. |
|
1761 |
||
1762 |
Note that ``default=None`` is case sensitive. |
|
1763 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
1764 |
|
1765 |
List Values |
|
1766 |
~~~~~~~~~~~ |
|
1767 |
||
1768 |
It's possible that you will want to specify a list as a default value. To avoid |
|
1769 |
confusing syntax with commas and quotes you use a list constructor to specify |
|
1770 |
that keyword arguments are lists. This includes the ``default`` value. This |
|
1771 |
makes checks look something like : :: |
|
1772 |
||
1773 |
checkname(default=list('val1', 'val2', 'val3'))
|
|
1774 |
||
1775 |
This works with all keyword arguments, but is most useful for default values. |
|
1776 |
||
1777 |
||
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1778 |
Repeated Sections |
1779 |
----------------- |
|
1780 |
||
1781 |
Repeated sections are a way of specifying a configspec for a section that |
|
1782 |
should be applied to *all* subsections in the same section. |
|
1783 |
||
1784 |
The easiest way of explaining this is to give an example. Suppose you have a |
|
1785 |
config file that describes a dog. That dog has various attributes, but it can |
|
1786 |
also have many fleas. You don't know in advance how many fleas there will be, |
|
1787 |
or what they will be called, but you want each flea validated against the same |
|
1788 |
configspec. |
|
1789 |
||
1790 |
We can define a section called *fleas*. We want every flea in that section |
|
1791 |
(every sub-section) to have the same configspec applied to it. We do this by |
|
1792 |
defining a single section called ``__many__``. :: |
|
1793 |
||
1794 |
[dog] |
|
1795 |
name = string(default=Rover) |
|
1796 |
age = float(0, 99, default=0) |
|
1797 |
||
1798 |
[[fleas]] |
|
1799 |
||
1800 |
[[[__many__]]] |
|
1801 |
bloodsucker = boolean(default=True) |
|
1802 |
children = integer(default=10000) |
|
1803 |
size = option(small, tiny, micro, default=tiny) |
|
1804 |
||
1805 |
Every flea on our dog will now be validated using the ``__many__`` configspec. |
|
1806 |
||
1807 |
If you define another sub-section in a section *as well as* a ``__many__`` then |
|
1808 |
you will get an error. |
|
1809 |
||
1810 |
``__many__`` sections can have sub-sections, including their own ``__many__`` |
|
1811 |
sub-sections. Defaults work in the normal way in repeated sections. |
|
1812 |
||
1813 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
1814 |
Copy Mode |
1815 |
--------- |
|
1816 |
||
1817 |
Because you can specify default values in your configspec, you can use |
|
1818 |
ConfigObj to write out default config files for your application. |
|
1819 |
||
1820 |
However, normally values supplied from a default in a configspec are *not* |
|
1821 |
written out by the ``write`` method. |
|
1822 |
||
1823 |
To do this, you need to specify ``copy=True`` when you call validate. As well |
|
1824 |
as not marking values as default, all the comments in the configspec file |
|
1825 |
will be copied into your ConfigObj instance. |
|
1826 |
||
1827 |
.. raw:: html |
|
1828 |
||
1829 |
{+coloring}
|
|
1830 |
from configobj import ConfigObj |
|
1831 |
from validate import Validator |
|
1832 |
vdt = Validator() |
|
1833 |
config = ConfigObj(configspec='default.ini') |
|
1834 |
config.filename = 'new_default.ini' |
|
1835 |
config.validate(vdt, copy=True) |
|
1836 |
config.write() |
|
1837 |
{-coloring}
|
|
1838 |
||
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1839 |
Validation and Interpolation |
1840 |
---------------------------- |
|
1841 |
||
1842 |
String interpolation and validation don't play well together. When validation |
|
1843 |
changes type it sets the value. If the value uses interpolation, then the |
|
1844 |
interpolation reference would normally be overwritten. Calling ``write`` would |
|
1845 |
then use the absolute value and the interpolation reference would be lost. |
|
1846 |
||
1847 |
As a compromise - if the value is unchanged by validation then it is not reset. |
|
1848 |
This means strings that pass through validation unmodified will not be |
|
1849 |
overwritten. If validation changes type - the value has to be overwritten, and |
|
1850 |
any interpolation references are lost {sm;:-(}.
|
|
1851 |
||
1852 |
SimpleVal |
|
1853 |
--------- |
|
1854 |
||
1855 |
You may not need a full validation process, but still want to check if all the |
|
1856 |
expected values are present. |
|
1857 |
||
1858 |
Provided as part of the ConfigObj module is the ``SimpleVal`` object. This has |
|
1859 |
a dummy ``test`` method that always passes. |
|
1860 |
||
1861 |
The only reason a test will fail is if the value is missing. The return value |
|
1862 |
from ``validate`` will either be ``True``, meaning all present, or a dictionary |
|
1863 |
with ``False`` for all missing values/sections. |
|
1864 |
||
1865 |
To use it, you still need to pass in a valid configspec when you create the |
|
1866 |
ConfigObj, but just set all the values to ``''``. Then create an instance of |
|
1867 |
``SimpleVal`` and pass it to the ``validate`` method. |
|
1868 |
||
1869 |
As a trivial example if you had the following config file : :: |
|
1870 |
||
1871 |
# config file for an application |
|
1872 |
port = 80 |
|
1873 |
protocol = http |
|
1874 |
domain = voidspace |
|
1875 |
top_level_domain = org.uk |
|
1876 |
||
1877 |
You would write the following configspec : :: |
|
1878 |
||
1879 |
port = '' |
|
1880 |
protocol = '' |
|
1881 |
domain = '' |
|
1882 |
top_level_domain = '' |
|
1883 |
||
1884 |
.. raw:: html |
|
1885 |
||
1886 |
{+coloring}
|
|
1887 |
||
1888 |
config = Configobj(filename, configspec=configspec) |
|
1889 |
val = SimpleVal() |
|
1890 |
test = config.validate(val) |
|
1891 |
if test == True: |
|
1892 |
print 'All values present.' |
|
1893 |
elif test == False: |
|
1894 |
print 'No values present!' |
|
1895 |
else: |
|
1896 |
for entry in test: |
|
1897 |
if test[entry] == False: |
|
1898 |
print '"%s" missing.' % entry |
|
1899 |
||
1900 |
{-coloring}
|
|
1901 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
1902 |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
1903 |
Empty values |
1904 |
============ |
|
1905 |
||
1906 |
Many config files from other applications allow empty values. As of version |
|
1907 |
4.3.0, ConfigObj will read these as an empty string. |
|
1908 |
||
1909 |
A new option/attribute has been added (``write_empty_values``) to allow |
|
1910 |
ConfigObj to write empty strings as empty values. |
|
1911 |
||
1912 |
.. raw:: html |
|
1913 |
||
1914 |
{+coloring}
|
|
1915 |
from configobj import ConfigObj |
|
1916 |
cfg = ''' |
|
1917 |
key = |
|
1918 |
key2 = # a comment |
|
1919 |
'''.splitlines() |
|
1920 |
config = ConfigObj(cfg) |
|
1921 |
print config |
|
1922 |
ConfigObj({'key': '', 'key2': ''})
|
|
1923 |
||
1924 |
config.write_empty_values = True |
|
1925 |
for line in config.write(): |
|
1926 |
print line |
|
1927 |
||
1928 |
key = |
|
1929 |
key2 = # a comment |
|
1930 |
{-coloring}
|
|
1931 |
||
1932 |
unrepr mode |
|
1933 |
=========== |
|
1934 |
||
1935 |
The ``unrepr`` option allows you to store and retrieve the basic Python |
|
1936 |
data-types using config files. It has to use a slightly different syntax to |
|
1937 |
normal ConfigObj files. Unsurprisingly it uses Python syntax. |
|
1938 |
||
1939 |
This means that lists are different (they are surrounded by square brackets), |
|
1940 |
and strings *must* be quoted. |
|
1941 |
||
1942 |
The types that ``unrepr`` can work with are : |
|
1943 |
||
1944 |
| strings, lists tuples |
|
1945 |
| None, True, False |
|
1946 |
| dictionaries, integers, floats |
|
1947 |
| longs and complex numbers |
|
1948 |
||
1949 |
You can't store classes, types or instances. |
|
1950 |
||
1951 |
``unrepr`` uses ``repr(object)`` to write out values, so it currently *doesn't* |
|
1952 |
check that you are writing valid objects. If you attempt to read an unsupported |
|
1953 |
value, ConfigObj will raise a ``configobj.UnknownType`` exception. |
|
1954 |
||
1955 |
Values that are triple quoted cased. The triple quotes are removed *before* |
|
1956 |
converting. This means that you can use triple quotes to write dictionaries |
|
1957 |
over several lines in your config files. They won't be written like this |
|
1958 |
though. |
|
1959 |
||
1960 |
If you are writing config files by hand, for use with ``unrepr``, you should |
|
1961 |
be aware of the following differences from normal ConfigObj syntax : |
|
1962 |
||
1963 |
| List : ``['A List', 'With', 'Strings']`` |
|
1964 |
| Strings : ``"Must be quoted."`` |
|
1965 |
| Backslash : ``"The backslash must be escaped \\"`` |
|
1966 |
||
1967 |
These all follow normal Python syntax. |
|
1968 |
||
1969 |
In unrepr mode *inline comments* are not saved. This is because lines are |
|
1970 |
parsed using the `compiler package <http://docs.python.org/lib/compiler.html>`_ |
|
1971 |
which discards comments. |
|
1972 |
||
1973 |
String Interpolation |
|
1974 |
==================== |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
1975 |
|
1976 |
ConfigObj allows string interpolation *similar* to the way ``ConfigParser`` |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
1977 |
or ``string.Template`` work. The value of the ``interpolation`` attribute |
1978 |
determines which style of interpolation you want to use. Valid values are |
|
1979 |
"ConfigParser" or "Template" (case-insensitive, so "configparser" and |
|
1980 |
"template" will also work). For backwards compatibility reasons, the value |
|
1981 |
``True`` is also a valid value for the ``interpolation`` attribute, and |
|
1982 |
will select ``ConfigParser``-style interpolation. At some undetermined point |
|
1983 |
in the future, that default *may* change to ``Template``-style interpolation. |
|
1984 |
||
1985 |
For ``ConfigParser``-style interpolation, you specify a value to be |
|
1986 |
substituted by including ``%(name)s`` in the value. |
|
1987 |
||
1988 |
For ``Template``-style interpolation, you specify a value to be substituted |
|
1989 |
by including ``${cl}name{cr}`` in the value. Alternately, if 'name' is a valid
|
|
1990 |
Python identifier (i.e., is composed of nothing but alphanumeric characters, |
|
1991 |
plus the underscore character), then the braces are optional and the value |
|
1992 |
can be written as ``$name``. |
|
1993 |
||
1994 |
Note that ``ConfigParser``-style interpolation and ``Template``-style |
|
1995 |
interpolation are mutually exclusive; you cannot have a configuration file |
|
1996 |
that's a mix of one or the other. Pick one and stick to it. ``Template``-style |
|
1997 |
interpolation is simpler to read and write by hand, and is recommended if |
|
1998 |
you don't have a particular reason to use ``ConfigParser``-style. |
|
1999 |
||
2000 |
Interpolation checks first the current section to see if ``name`` is the key |
|
2001 |
to a value. ('name' is case sensitive).
|
|
2002 |
||
2003 |
If it doesn't find it, next it checks the 'DEFAULT' sub-section of the current |
|
2004 |
section. |
|
2005 |
||
2006 |
If it still doesn't find it, it moves on to check the parent section and the |
|
2007 |
parent section's 'DEFAULT' subsection, and so on all the way up to the main |
|
2008 |
section. |
|
2009 |
||
2010 |
If the value specified isn't found in any of these locations, then a |
|
2011 |
``MissingInterpolationOption`` error is raised (a subclass of |
|
2012 |
``ConfigObjError``). |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
2013 |
|
2014 |
If it is found then the returned value is also checked for substitutions. This |
|
2015 |
allows you to make up compound values (for example directory paths) that use |
|
2016 |
more than one default value. It also means it's possible to create circular |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
2017 |
references. If there are any circular references which would cause an infinite |
2018 |
interpolation loop, an ``InterpolationLoopError`` is raised. |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
2019 |
|
2020 |
Both of these errors are subclasses of ``InterpolationError``, which is a |
|
2021 |
subclass of ``ConfigObjError``. |
|
2022 |
||
2023 |
String interpolation and validation don't play well together. This is because |
|
2024 |
validation overwrites values - and so may erase the interpolation references. |
|
2025 |
See `Validation and Interpolation`_. (This can only happen if validation |
|
2026 |
has to *change* the value). |
|
2027 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
2028 |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
2029 |
Comments |
2030 |
======== |
|
2031 |
||
2032 |
Any line that starts with a '#', possibly preceded by whitespace, is a comment. |
|
2033 |
||
2034 |
If a config file starts with comments then these are preserved as the |
|
2035 |
initial_comment_. |
|
2036 |
||
2037 |
If a config file ends with comments then these are preserved as the |
|
2038 |
final_comment_. |
|
2039 |
||
2040 |
Every key or section marker may have lines of comments immediately above it. |
|
2041 |
These are saved as the ``comments`` attribute of the section. Each member is a |
|
2042 |
list of lines. |
|
2043 |
||
2044 |
You can also have a comment inline with a value. These are saved as the |
|
2045 |
``inline_comments`` attribute of the section, with one entry per member of the |
|
2046 |
section. |
|
2047 |
||
2048 |
Subsections (section markers in the config file) can also have comments. |
|
2049 |
||
2050 |
See `Section Attributes`_ for more on these attributes. |
|
2051 |
||
2052 |
These comments are all written back out by the ``write`` method. |
|
2053 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
2054 |
|
2055 |
flatten_errors |
|
2056 |
============== |
|
2057 |
||
2058 |
:: |
|
2059 |
||
2060 |
flatten_errors(cfg, res) |
|
2061 |
||
2062 |
Validation_ is a powerful way of checking that the values supplied by the user |
|
2063 |
make sense. |
|
2064 |
||
2065 |
The validate_ method returns a results dictionary that represents pass or fail |
|
2066 |
for each value. This doesn't give you any information about *why* the check |
|
2067 |
failed. |
|
2068 |
||
2069 |
``flatten_errors`` is an example function that turns a results dictionary into |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
2070 |
a flat list, that only contains values that *failed*. |
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
2071 |
|
2072 |
``cfg`` is the ConfigObj instance being checked, ``res`` is the results |
|
2073 |
dictionary returned by ``validate``. |
|
2074 |
||
2075 |
It returns a list of keys that failed. Each member of the list is a tuple : :: |
|
2076 |
||
2077 |
([list of sections...], key, result) |
|
2078 |
||
2079 |
If ``validate`` was called with ``preserve_errors=False`` (the default) |
|
2080 |
then ``result`` will always be ``False``. |
|
2081 |
||
2082 |
*list of sections* is a flattened list of sections that the key was found |
|
2083 |
in. |
|
2084 |
||
2085 |
If the section was missing then key will be ``None``. |
|
2086 |
||
2087 |
If the value (or section) was missing then ``result`` will be ``False``. |
|
2088 |
||
2089 |
If ``validate`` was called with ``preserve_errors=True`` and a value |
|
2090 |
was present, but failed the check, then ``result`` will be the exception |
|
2091 |
object returned. You can use this as a string that describes the failure. |
|
2092 |
||
2093 |
For example : |
|
2094 |
||
2095 |
*The value "3" is of the wrong type*. |
|
2096 |
||
2097 |
||
2098 |
Example Usage |
|
2099 |
------------- |
|
2100 |
||
2101 |
The output from ``flatten_errors`` is a list of tuples. |
|
2102 |
||
2103 |
Here is an example of how you could present this information to the user. |
|
2104 |
||
2105 |
.. raw:: html |
|
2106 |
||
2107 |
{+coloring}
|
|
2108 |
||
2109 |
vtor = validate.Validator() |
|
2110 |
# ini is your config file - cs is the configspec |
|
2111 |
cfg = ConfigObj(ini, configspec=cs) |
|
2112 |
res = cfg.validate(vtor, preserve_errors=True) |
|
2113 |
for entry in flatten_errors(cfg, res): |
|
2114 |
# each entry is a tuple |
|
2115 |
section_list, key, error = entry |
|
2116 |
if key is not None: |
|
2117 |
section_list.append(key) |
|
2118 |
else: |
|
2119 |
section_list.append('[missing section]')
|
|
2120 |
section_string = ', '.join(section_list) |
|
2121 |
if error == False: |
|
2122 |
error = 'Missing value or section.' |
|
2123 |
print section_string, ' = ', error |
|
2124 |
||
2125 |
{-coloring}
|
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
2126 |
|
2127 |
Backwards Compatibility |
|
2128 |
======================= |
|
2129 |
||
2130 |
There have been a lot of changes since ConfigObj 3. The core parser is now |
|
2131 |
based on regular expressions, and is a lot faster and smaller. There is now no |
|
2132 |
difference in the way we treat flat files and non-flatfiles, that is, no empty |
|
2133 |
sections. This means some of the code can be a lot simpler, less code does |
|
2134 |
more of the work [#]_. |
|
2135 |
||
2136 |
There have been other simplifications: for example we only have eight options |
|
2137 |
instead of seventeen. |
|
2138 |
||
2139 |
Most config files created for ConfigObj 3 will be read with no changes and many |
|
2140 |
programs will work without having to alter code. Some of the changes do break |
|
2141 |
backwards compatibility: for example, code that uses the previous options will |
|
2142 |
now raise an error. It should be very easy to fix these, though. |
|
2143 |
||
2144 |
Below is a list of all the changes that affect backwards compatibility. This |
|
2145 |
doesn't include details of method signatures that have changed, because almost |
|
2146 |
all of them have. |
|
2147 |
||
2148 |
Incompatible Changes |
|
2149 |
-------------------- |
|
2150 |
||
2151 |
(I have removed a lot of needless complications: this list is probably not |
|
2152 |
conclusive, many option/attribute/method names have changed.) |
|
2153 |
||
2154 |
Case sensitive. |
|
2155 |
||
2156 |
The only valid divider is '='. |
|
2157 |
||
2158 |
Line continuations with ``\`` removed. |
|
2159 |
||
2160 |
No recursive lists in values. |
|
2161 |
||
2162 |
No empty sections. |
|
2163 |
||
2164 |
No distinction between flatfiles and non flatfiles. |
|
2165 |
||
2166 |
Change in list syntax: use commas to indicate list, not parentheses (square |
|
2167 |
brackets and parentheses are no longer recognised as lists). |
|
2168 |
||
2169 |
';' is no longer valid for comments, and no multiline comments. |
|
2170 |
||
2171 |
No attribute-style access to values. |
|
2172 |
||
2173 |
Empty values not allowed: use '' or "". |
|
2174 |
||
2175 |
In ConfigObj 3, setting a non-flatfile member to ``None`` would initialise it |
|
2176 |
as an empty section. |
|
2177 |
||
2178 |
The escape entities '&mjf-lf;' and '&mjf-quot;' have gone, replaced by triple |
|
2179 |
quote, multiple line values. |
|
2180 |
||
2181 |
The ``newline``, ``force_return``, and ``default`` options have gone. |
|
2182 |
||
2183 |
``fileerror`` and ``createempty`` options have become ``file_error`` and |
|
2184 |
``create_empty``. |
|
2185 |
||
2186 |
Partial configspecs (for specifying the order members should be written out, |
|
2187 |
and which should be present) have gone. The configspec is no longer used to |
|
2188 |
specify order for the ``write`` method. |
|
2189 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
2190 |
Infinite loops in string interpolation are now detected and raise an error |
2191 |
``InterpolationLoopError``. |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
2192 |
|
2193 |
Specifying a value for interpolation which doesn't exist now raises a |
|
2194 |
``MissingInterpolationOption`` error (instead of merely being ignored). |
|
2195 |
||
2196 |
The ``writein`` method has been removed. |
|
2197 |
||
2198 |
The comments attribute is now a list (``inline_comments`` equates to the old |
|
2199 |
comments attribute). |
|
2200 |
||
2201 |
ConfigObj 3 |
|
2202 |
----------- |
|
2203 |
||
2204 |
ConfigObj 3 is now deprecated in favour of ConfigObj 4. I can fix bugs in |
|
2205 |
ConfigObj 3 if needed, though. |
|
2206 |
||
2207 |
For anyone who still needs it, you can download it here: `ConfigObj 3.3.1`_ |
|
2208 |
||
2209 |
You can read the old docs at : `ConfigObj 3 Docs`_ |
|
2210 |
||
2211 |
.. _ConfigObj 3.3.1: http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=configobj3.zip |
|
2212 |
.. _ConfigObj 3 Docs: http://www.voidspace.org.uk/python/configobj3.html |
|
2213 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
2214 |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
2215 |
CREDITS |
2216 |
======= |
|
2217 |
||
2218 |
ConfigObj 4 is written by (and copyright) `Michael Foord`_ and |
|
2219 |
`Nicola Larosa`_. |
|
2220 |
||
2221 |
Particularly thanks to Nicola Larosa for help on the config file spec, the |
|
2222 |
validation system and the doctests. |
|
2223 |
||
2224 |
*validate.py* was originally written by Michael Foord and `Mark Andrews`_. |
|
2225 |
||
2226 |
Thanks to others for input and bugfixes. |
|
2227 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
2228 |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
2229 |
LICENSE |
2230 |
======= |
|
2231 |
||
2232 |
ConfigObj, and related files, are licensed under the BSD license. This is a |
|
2233 |
very unrestrictive license, but it comes with the usual disclaimer. This is |
|
2234 |
free software: test it, break it, just don't blame us if it eats your data ! |
|
2235 |
Of course if it does, let us know and we'll fix the problem so it doesn't |
|
2236 |
happen to anyone else {sm;:-)}. ::
|
|
2237 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
2238 |
Copyright (c) 2004 - 2006, Michael Foord & Nicola Larosa |
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
2239 |
All rights reserved. |
2240 |
||
2241 |
Redistribution and use in source and binary forms, with or without |
|
2242 |
modification, are permitted provided that the following conditions are |
|
2243 |
met: |
|
2244 |
||
2245 |
||
2246 |
* Redistributions of source code must retain the above copyright |
|
2247 |
notice, this list of conditions and the following disclaimer. |
|
2248 |
||
2249 |
* Redistributions in binary form must reproduce the above |
|
2250 |
copyright notice, this list of conditions and the following |
|
2251 |
disclaimer in the documentation and/or other materials provided |
|
2252 |
with the distribution. |
|
2253 |
||
2254 |
* Neither the name of Michael Foord nor Nicola Larosa |
|
2255 |
may be used to endorse or promote products derived from this |
|
2256 |
software without specific prior written permission. |
|
2257 |
||
2258 |
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
2259 |
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
2260 |
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
2261 |
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|
2262 |
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
2263 |
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
2264 |
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
2265 |
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
2266 |
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
2267 |
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
2268 |
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
2269 |
||
2270 |
You should also be able to find a copy of this license at : `BSD License`_ |
|
2271 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
2272 |
.. _BSD License: http://www.voidspace.org.uk/python/license.shtml |
2273 |
||
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
2274 |
|
2275 |
TODO |
|
2276 |
==== |
|
2277 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
2278 |
Better support for configuration from multiple files, including tracking |
2279 |
*where* the original file came from and writing changes to the correct |
|
2280 |
file. |
|
2281 |
||
2282 |
Make ``newline`` an option (as well as an attribute) ? |
|
2283 |
||
2284 |
``UTF16`` encoded files, when returned as a list of lines, will have the |
|
2285 |
BOM at the start of every line. Should this be removed from all but the |
|
2286 |
first line ? |
|
2287 |
||
2288 |
Option to set warning type for unicode decode ? (Defaults to strict). |
|
2289 |
||
2290 |
A method to optionally remove uniform indentation from multiline values. |
|
2291 |
(do as an example of using ``walk`` - along with string-escape) |
|
2292 |
||
2293 |
Should the results dictionary from validate be an ordered dictionary if |
|
2294 |
`odict <http://www.voidspace.org.uk/python/odict.html>`_ is available ? |
|
2295 |
||
2296 |
Implement some of the sequence methods (which include slicing) from the |
|
2297 |
newer ``odict`` ? |
|
2298 |
||
2299 |
Preserve line numbers of values (and possibly the original text of each value). |
|
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
2300 |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
2301 |
|
2302 |
ISSUES |
|
2303 |
====== |
|
2304 |
||
2305 |
.. note:: |
|
2306 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
2307 |
Please file any bug reports to `Michael Foord`_ or the **ConfigObj** |
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
2308 |
`Mailing List`_. |
2309 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
2310 |
There is currently no way to specify the encoding of a configspec file. |
2311 |
||
2312 |
When using ``copy`` mode for validation, it won't copy ``DEFAULT`` |
|
2313 |
sections. This is so that you *can* use interpolation in configspec |
|
2314 |
files. |
|
2315 |
||
2316 |
``validate`` doesn't report *extra* values or sections. |
|
2317 |
||
2318 |
You can't have a keyword with the same name as a section (in the same |
|
2319 |
section). They are both dictionary keys - so they would overlap. |
|
2320 |
||
2321 |
ConfigObj doesn't quote and unquote values if ``list_values=False``. |
|
2322 |
This means that leading or trailing whitespace in values will be lost when |
|
2323 |
writing. (Unless you manually quote). |
|
2324 |
||
2325 |
Interpolation checks first the current section, then the 'DEFAULT' subsection |
|
2326 |
of the current section, before moving on to the current section's parent and |
|
2327 |
so on up the tree. |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
2328 |
|
2329 |
Logically a 'DEFAULT' section should apply to all subsections of the *same |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
2330 |
parent* - this means that checking the 'DEFAULT' subsection in the |
2331 |
*current section* is not necessarily logical ? |
|
2332 |
||
2333 |
Does it matter that we don't support the ':' divider, which is supported |
|
2334 |
by ``ConfigParser`` ? |
|
2335 |
||
2336 |
String interpolation and validation don't play well together. When |
|
2337 |
validation changes type it sets the value. This will correctly fetch the |
|
2338 |
value using interpolation - but then overwrite the interpolation reference. |
|
2339 |
If the value is unchanged by validation (it's a string) - but other types |
|
2340 |
will be. |
|
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
2341 |
|
2342 |
||
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
2343 |
CHANGELOG |
2344 |
========= |
|
2345 |
||
2346 |
This is an abbreviated changelog showing the major releases up to version 4. |
|
2347 |
From version 4 it lists all releases and changes. *More* data on individual |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
2348 |
changes may be found in the source code or the CHANGELOG file. |
2349 |
||
2350 |
||
2351 |
2007/02/04 - Version 4.4.0 |
|
2352 |
-------------------------- |
|
2353 |
||
2354 |
Official release of 4.4.0 |
|
2355 |
||
2356 |
||
2357 |
2006/12/17 - Version 4.3.3-alpha4 |
|
2358 |
--------------------------------- |
|
2359 |
||
2360 |
By Nicola Larosa |
|
2361 |
||
2362 |
Allowed arbitrary indentation in the ``indent_type`` parameter, removed the |
|
2363 |
``NUM_INDENT_SPACES`` and ``MAX_INTERPOL_DEPTH`` (a leftover) constants, |
|
2364 |
added indentation tests (including another docutils workaround, sigh), updated |
|
2365 |
the documentation. |
|
2366 |
||
2367 |
By Michael Foord |
|
2368 |
||
2369 |
Made the import of ``compiler`` conditional so that ``ConfigObj`` can be used |
|
2370 |
with `IronPython <http://www.codeplex.com/IronPython>`_. |
|
2371 |
||
2372 |
||
2373 |
2006/12/17 - Version 4.3.3-alpha3 |
|
2374 |
--------------------------------- |
|
2375 |
||
2376 |
By Nicola Larosa |
|
2377 |
||
2378 |
Added a missing ``self.`` in the _handle_comment method and a related test, |
|
2379 |
per Sourceforge bug #1523975. |
|
2380 |
||
2381 |
||
2382 |
2006/12/09 - Version 4.3.3-alpha2 |
|
2383 |
--------------------------------- |
|
2384 |
||
2385 |
By Nicola Larosa |
|
2386 |
||
2387 |
Changed interpolation search strategy, based on this patch by Robin Munn: |
|
2388 |
http://sourceforge.net/mailarchive/message.php?msg_id=17125993 |
|
2389 |
||
2390 |
||
2391 |
2006/12/09 - Version 4.3.3-alpha1 |
|
2392 |
--------------------------------- |
|
2393 |
||
2394 |
By Nicola Larosa |
|
2395 |
||
2396 |
Added Template-style interpolation, with tests, based on this patch by |
|
2397 |
Robin Munn: http://sourceforge.net/mailarchive/message.php?msg_id=17125991 |
|
2398 |
(awful archives, bad Sourceforge, bad). |
|
2399 |
||
2400 |
||
2401 |
2006/06/04 - Version 4.3.2 |
|
2402 |
-------------------------- |
|
2403 |
||
2404 |
Changed error handling, if parsing finds a single error then that error will |
|
2405 |
be re-raised. That error will still have an ``errors`` and a ``config`` |
|
2406 |
attribute. |
|
2407 |
||
2408 |
Fixed bug where '\n' terminated files could be truncated. |
|
2409 |
||
2410 |
Bugfix in ``unrepr`` mode, it couldn't handle '#' in values. (Thanks to |
|
2411 |
Philippe Normand for the report.) |
|
2412 |
||
2413 |
As a consequence of this fix, ConfigObj doesn't now keep inline comments in |
|
2414 |
``unrepr`` mode. This is because the parser in the `compiler package`_ |
|
2415 |
doesn't keep comments. {sm;:-)}
|
|
2416 |
||
2417 |
Error messages are now more useful. They tell you the number of parsing errors |
|
2418 |
and the line number of the first error. (In the case of multiple errors.) |
|
2419 |
||
2420 |
Line numbers in exceptions now start at 1, not 0. |
|
2421 |
||
2422 |
Errors in ``unrepr`` mode are now handled the same way as in the normal mode. |
|
2423 |
The errors stored will be an ``UnreprError``. |
|
2424 |
||
2425 |
||
2426 |
2006/04/29 - Version 4.3.1 |
|
2427 |
-------------------------- |
|
2428 |
||
2429 |
Added ``validate.py`` back into ``configobj.zip``. (Thanks to Stewart |
|
2430 |
Midwinter) |
|
2431 |
||
2432 |
Updated to `validate.py`_ 0.2.2. |
|
2433 |
||
2434 |
Preserve tuples when calling the ``dict`` method. (Thanks to Gustavo Niemeyer.) |
|
2435 |
||
2436 |
Changed ``__repr__`` to return a string that contains ``ConfigObj({ ... })``.
|
|
2437 |
||
2438 |
Change so that an options dictionary isn't modified by passing it to ConfigObj. |
|
2439 |
(Thanks to Artarious.) |
|
2440 |
||
2441 |
Added ability to handle negative integers in ``unrepr``. (Thanks to Kevin |
|
2442 |
Dangoor.) |
|
2443 |
||
2444 |
||
2445 |
2006/03/24 - Version 4.3.0 |
|
2446 |
-------------------------- |
|
2447 |
||
2448 |
Moved the tests and the CHANGELOG (etc) into a separate file. This has reduced |
|
2449 |
the size of ``configobj.py`` by about 40%. |
|
2450 |
||
2451 |
Added the ``unrepr`` mode to reading and writing config files. Thanks to Kevin |
|
2452 |
Dangoor for this suggestion. |
|
2453 |
||
2454 |
Empty values are now valid syntax. They are read as an empty string ``''``. |
|
2455 |
(``key =``, or ``key = # comment``.) |
|
2456 |
||
2457 |
``validate`` now honours the order of the configspec. |
|
2458 |
||
2459 |
Added the ``copy`` mode to validate. Thanks to Louis Cordier for this |
|
2460 |
suggestion. |
|
2461 |
||
2462 |
Fixed bug where files written on windows could be given ``'\r\r\n'`` line |
|
2463 |
terminators. |
|
2464 |
||
2465 |
Fixed bug where last occurring comment line could be interpreted as the |
|
2466 |
final comment if the last line isn't terminated. |
|
2467 |
||
2468 |
Fixed bug where nested list values would be flattened when ``write`` is |
|
2469 |
called. Now sub-lists have a string representation written instead. |
|
2470 |
||
2471 |
Deprecated ``encode`` and ``decode`` methods instead. |
|
2472 |
||
2473 |
You can now pass in a ConfigObj instance as a configspec (remember to read |
|
2474 |
the configspec file using ``list_values=False``). |
|
2475 |
||
2476 |
Sorted footnotes in the docs. |
|
2477 |
||
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
2478 |
|
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
2479 |
2006/02/16 - Version 4.2.0 |
2480 |
-------------------------- |
|
2481 |
||
2482 |
Removed ``BOM_UTF8`` from ``__all__``. |
|
2483 |
||
2484 |
The ``BOM`` attribute has become a boolean. (Defaults to ``False``.) It is |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
2485 |
*only* ``True`` for the ``UTF16/UTF8`` encodings. |
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
2486 |
|
2487 |
File like objects no longer need a ``seek`` attribute. |
|
2488 |
||
2489 |
Full unicode support added. New options/attributes ``encoding``, |
|
2490 |
``default_encoding``. |
|
2491 |
||
2492 |
ConfigObj no longer keeps a reference to file like objects. Instead the |
|
2493 |
``write`` method takes a file like object as an optional argument. (Which |
|
2494 |
will be used in preference of the ``filename`` attribute if that exists as |
|
2495 |
well.) |
|
2496 |
||
2497 |
utf16 files decoded to unicode. |
|
2498 |
||
2499 |
If ``BOM`` is ``True``, but no encoding specified, then the utf8 BOM is |
|
2500 |
written out at the start of the file. (It will normally only be ``True`` if |
|
2501 |
the utf8 BOM was found when the file was read.) |
|
2502 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
2503 |
Thanks to Aaron Bentley for help and testing on the unicode issues. |
2504 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
2505 |
File paths are *not* converted to absolute paths, relative paths will |
2506 |
remain relative as the ``filename`` attribute. |
|
2507 |
||
2508 |
Fixed bug where ``final_comment`` wasn't returned if ``write`` is returning |
|
2509 |
a list of lines. |
|
2510 |
||
2511 |
Deprecated ``istrue``, replaced it with ``as_bool``. |
|
2512 |
||
2513 |
Added ``as_int`` and ``as_float``. |
|
2514 |
||
2515 |
2005/12/14 - Version 4.1.0 |
|
2516 |
-------------------------- |
|
2517 |
||
2518 |
Added ``merge``, a recursive update. |
|
2519 |
||
2520 |
Added ``preserve_errors`` to ``validate`` and the ``flatten_errors`` |
|
2521 |
example function. |
|
2522 |
||
2523 |
Thanks to Matthew Brett for suggestions and helping me iron out bugs. |
|
2524 |
||
2525 |
Fixed bug where a config file is *all* comment, the comment will now be |
|
2526 |
``initial_comment`` rather than ``final_comment``. |
|
2527 |
||
2528 |
Validation no longer done on the 'DEFAULT' section (only in the root level). |
|
2529 |
This allows interpolation in configspecs. |
|
2530 |
||
2531 |
Also use the new list syntax in validate_ 0.2.1. (For configspecs). |
|
2532 |
||
2533 |
2005/12/02 - Version 4.0.2 |
|
2534 |
-------------------------- |
|
2535 |
||
2536 |
Fixed bug in ``create_empty``. Thanks to Paul Jimenez for the report. |
|
2537 |
||
2538 |
||
2539 |
2005/11/05 - Version 4.0.1 |
|
2540 |
-------------------------- |
|
2541 |
||
2542 |
Fixed bug in ``Section.walk`` when transforming names as well as values. |
|
2543 |
||
2544 |
Added the ``istrue`` method. (Fetches the boolean equivalent of a string |
|
2545 |
value). |
|
2546 |
||
2547 |
Fixed ``list_values=False`` - they are now only quoted/unquoted if they |
|
2548 |
are multiline values. |
|
2549 |
||
2550 |
List values are written as ``item, item`` rather than ``item,item``. |
|
2551 |
||
2552 |
||
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
2553 |
2005/10/17 - Version 4.0.0 |
2554 |
-------------------------- |
|
2555 |
||
2556 |
**ConfigObj 4.0.0 Final** |
|
2557 |
||
2558 |
Fixed bug in ``setdefault``. When creating a new section with setdefault the |
|
2559 |
reference returned would be to the dictionary passed in *not* to the new |
|
2560 |
section. Bug fixed and behaviour documented. |
|
2561 |
||
2562 |
Obscure typo/bug fixed in ``write``. Wouldn't have affected anyone though. |
|
2563 |
||
2564 |
2005/09/09 - Version 4.0.0 beta 5 |
|
2565 |
--------------------------------- |
|
2566 |
||
2567 |
Removed ``PositionError``. |
|
2568 |
||
2569 |
Allowed quotes around keys as documented. |
|
2570 |
||
2571 |
Fixed bug with commas in comments. (matched as a list value) |
|
2572 |
||
2573 |
2005/09/07 - Version 4.0.0 beta 4 |
|
2574 |
--------------------------------- |
|
2575 |
||
2576 |
Fixed bug in ``__delitem__``. Deleting an item no longer deletes the |
|
2577 |
``inline_comments`` attribute. |
|
2578 |
||
2579 |
Fixed bug in initialising ConfigObj from a ConfigObj. |
|
2580 |
||
2581 |
Changed the mailing list address. |
|
2582 |
||
2583 |
2005/08/28 - Version 4.0.0 beta 3 |
|
2584 |
--------------------------------- |
|
2585 |
||
2586 |
Interpolation is switched off before writing out files. |
|
2587 |
||
2588 |
Fixed bug in handling ``StringIO`` instances. (Thanks to report from |
|
2589 |
"Gustavo Niemeyer" <gustavo@niemeyer.net>) |
|
2590 |
||
2591 |
Moved the doctests from the ``__init__`` method to a separate function. |
|
2592 |
(For the sake of IDE calltips). |
|
2593 |
||
2594 |
2005/08/25 - Version 4.0.0 beta 2 |
|
2595 |
--------------------------------- |
|
2596 |
||
2597 |
Amendments to *validate.py*. |
|
2598 |
||
2599 |
Official release. |
|
2600 |
||
2601 |
2005/08/21 - Version 4.0.0 beta 1 |
|
2602 |
--------------------------------- |
|
2603 |
||
2604 |
Reads nested subsections to any depth. |
|
2605 |
||
2606 |
Multiline values. |
|
2607 |
||
2608 |
Simplified options and methods. |
|
2609 |
||
2610 |
New list syntax. |
|
2611 |
||
2612 |
Faster, smaller, and better parser. |
|
2613 |
||
2614 |
Validation greatly improved. Includes: |
|
2615 |
||
2616 |
* type conversion |
|
2617 |
* default values |
|
2618 |
* repeated sections |
|
2619 |
||
2620 |
Improved error handling. |
|
2621 |
||
2622 |
Plus lots of other improvements {sm;:grin:}.
|
|
2623 |
||
2624 |
2004/05/24 - Version 3.0.0 |
|
2625 |
-------------------------- |
|
2626 |
||
2627 |
Several incompatible changes: another major overhaul and change. (Lots of |
|
2628 |
improvements though). |
|
2629 |
||
2630 |
Added support for standard config files with sections. This has an entirely |
|
2631 |
new interface: each section is a dictionary of values. |
|
2632 |
||
2633 |
Changed the update method to be called writein: update clashes with a dict |
|
2634 |
method. |
|
2635 |
||
2636 |
Made various attributes keyword arguments, added several. |
|
2637 |
||
2638 |
Configspecs and orderlists have changed a great deal. |
|
2639 |
||
2640 |
Removed support for adding dictionaries: use update instead. |
|
2641 |
||
2642 |
Now subclasses a new class called caselessDict. This should add various |
|
2643 |
dictionary methods that could have caused errors before. |
|
2644 |
||
2645 |
It also preserves the original casing of keywords when writing them back out. |
|
2646 |
||
2647 |
Comments are also saved using a ``caselessDict``. |
|
2648 |
||
2649 |
Using a non-string key will now raise a ``TypeError`` rather than converting |
|
2650 |
the key. |
|
2651 |
||
2652 |
Added an exceptions keyword for *much* better handling of errors. |
|
2653 |
||
2654 |
Made ``creatempty=False`` the default. |
|
2655 |
||
2656 |
Now checks indict *and* any keyword args. Keyword args take precedence over |
|
2657 |
indict. |
|
2658 |
||
2659 |
``' ', ':', '=', ','`` and ``'\t'`` are now all valid dividers where the |
|
2660 |
keyword is unquoted. |
|
2661 |
||
2662 |
ConfigObj now does no type checking against configspec when you set items. |
|
2663 |
||
2664 |
delete and add methods removed (they were unnecessary). |
|
2665 |
||
2666 |
Docs rewritten to include all this gumph and more; actually ConfigObj is |
|
2667 |
*really* easy to use. |
|
2668 |
||
2669 |
Support for stdout was removed. |
|
2670 |
||
2671 |
A few new methods added. |
|
2672 |
||
2673 |
Charmap is now incorporated into ConfigObj. |
|
2674 |
||
2675 |
2004/03/14 - Version 2.0.0 beta |
|
2676 |
------------------------------- |
|
2677 |
||
2678 |
Re-written it to subclass dict. My first forays into inheritance and operator |
|
2679 |
overloading. |
|
2680 |
||
2681 |
The config object now behaves like a dictionary. |
|
2682 |
||
2683 |
I've completely broken the interface, but I don't think anyone was really |
|
2684 |
using it anyway. |
|
2685 |
||
2686 |
This new version is much more 'classy' {sm;:wink:}
|
|
2687 |
||
2688 |
It will also read straight from/to a filename and completely parse a config |
|
2689 |
file without you *having* to supply a config spec. |
|
2690 |
||
2691 |
Uses listparse, so can handle nested list items as values. |
|
2692 |
||
2693 |
No longer has getval and setval methods: use normal dictionary methods, or add |
|
2694 |
and delete. |
|
2695 |
||
2696 |
2004/01/29 - Version 1.0.5 |
|
2697 |
-------------------------- |
|
2698 |
||
2699 |
Version 1.0.5 has a couple of bugfixes as well as a couple of useful additions |
|
2700 |
over previous versions. |
|
2701 |
||
2702 |
Since 1.0.0 the buildconfig function has been moved into this distribution, |
|
2703 |
and the methods reset, verify, getval and setval have been added. |
|
2704 |
||
2705 |
A couple of bugs have been fixed. |
|
2706 |
||
2707 |
Origins |
|
2708 |
------- |
|
2709 |
||
2710 |
ConfigObj originated in a set of functions for reading config files in the |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
2711 |
`atlantibots <http://www.voidspace.org.uk/atlantibots/>`_ project. The original |
2712 |
functions were written by Rob McNeur. |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
2713 |
|
2714 |
||
2715 |
---------- |
|
2716 |
||
2717 |
Footnotes |
|
2718 |
========= |
|
2719 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
2720 |
.. [#] 315 of them, at the time of writing. |
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
2721 |
|
2722 |
.. [#] And if you discover any bugs, let us know. We'll fix them quickly. |
|
2723 |
||
2724 |
.. [#] If you specify a filename that doesn't exist, ConfigObj will assume you |
|
2725 |
are creating a new one. See the *create_empty* and *file_error* options_. |
|
2726 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
2727 |
.. [#] They can be byte strings (*ordinary* strings) or Unicode. |
2728 |
||
2729 |
.. [#] Except we don't support the RFC822 style line continuations, nor ':' as |
|
2730 |
a divider. |
|
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
2731 |
|
2732 |
.. [#] This is a change in ConfigObj 4.2.0. Note that ConfigObj doesn't call |
|
2733 |
the seek method of any file like object you pass in. You may want to call |
|
2734 |
``file_object.seek(0)`` yourself, first. |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
2735 |
|
2736 |
.. [#] A side effect of this is that it enables you to copy a ConfigObj : |
|
2737 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
2738 |
.. raw:: html |
2739 |
||
2740 |
{+coloring}
|
|
2741 |
||
2742 |
# only copies members |
|
2743 |
# not attributes/comments |
|
2744 |
config2 = ConfigObj(config1) |
|
2745 |
||
2746 |
{-coloring}
|
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
2747 |
|
2748 |
The order of values and sections will not be preserved, though. |
|
2749 |
||
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
2750 |
.. [#] Other than lists of strings. |
2751 |
||
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
2752 |
.. [#] The exception is if it detects a ``UTF16`` encoded file which it |
2753 |
must decode before parsing. |
|
2754 |
||
2755 |
.. [#] The method signature in the API docs will show that this method takes |
|
2756 |
two arguments. The second is the section to be written. This is because the |
|
2757 |
``write`` method is called recursively. |
|
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
2758 |
|
2759 |
.. [#] The dict method doesn't actually use the deepcopy mechanism. This means |
|
2760 |
if you add nested lists (etc) to your ConfigObj, then the dictionary |
|
2761 |
returned by dict may contain some references. For all *normal* ConfigObjs |
|
2762 |
it will return a deepcopy. |
|
2763 |
||
2764 |
.. [#] Passing ``(section, key)`` rather than ``(value, key)`` allows you to |
|
2765 |
change the value by setting ``section[key] = newval``. It also gives you |
|
2766 |
access to the *rename* method of the section. |
|
2767 |
||
2768 |
.. [#] Minimum required version of *validate.py* 0.2.0 . |
|
2769 |
||
2770 |
.. [#] It also makes ConfigObj a lot simpler to *use*. |
|
2771 |
||
2772 |
.. note:: |
|
2773 |
||
2774 |
Rendering this document with docutils also needs the |
|
2775 |
textmacros module and the PySrc CSS stuff. See |
|
2776 |
http://www.voidspace.org.uk/python/firedrop2/textmacros.shtml |
|
2777 |
||
2778 |
.. raw:: html |
|
2779 |
||
2780 |
<div align="center"> |
|
|
2991.2.1
by Vincent Ladeuil
Update configobj to version 4.4.0: |
2781 |
<p> |
2782 |
<a href="http://www.python.org"> |
|
2783 |
<img src="images/new_python.gif" width="100" height="103" border="0" |
|
2784 |
alt="Powered by Python" /> |
|
2785 |
</a> |
|
2786 |
<a href="http://sourceforge.net"> |
|
2787 |
<img src="http://sourceforge.net/sflogo.php?group_id=123265&type=1" width="88" height="31" border="0" alt="SourceForge.net Logo" /> |
|
2788 |
</a> |
|
2789 |
<a href="http://www.opensource.org"> |
|
2790 |
<img src="images/osi-certified-120x100.gif" width="120" height="100" border="0" |
|
2791 |
alt="Certified Open Source"/> |
|
2792 |
</a> |
|
2793 |
</p> |
|
2794 |
<p> |
|
2795 |
<a href="http://www.voidspace.org.uk/python/index.shtml"> |
|
2796 |
<img src="images/pythonbanner.gif" width="468" height="60" |
|
2797 |
alt="Python on Voidspace" border="0" /> |
|
2798 |
</a> |
|
2799 |
</p> |
|
2800 |
<p> |
|
2801 |
<a href="http://sourceforge.net/donate/index.php?group_id=123265"> |
|
2802 |
<img src="http://images.sourceforge.net/images/project-support.jpg" width="88" height="32" border="0" alt="Support This Project" /> |
|
2803 |
</a> |
|
2804 |
</p> |
|
2805 |
<p> |
|
2806 |
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"> |
|
2807 |
</script> |
|
2808 |
<script type="text/javascript"> |
|
2809 |
_uacct = "UA-203625-1"; |
|
2810 |
urchinTracker(); |
|
2811 |
</script> |
|
2812 |
</p> |
|
2813 |
||
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
2814 |
</div> |
2815 |
||
2816 |
.. _listquote: http://www.voidspace.org.uk/python/modules.shtml#listquote |
|
|
1556.2.1
by Aaron Bentley
Switched to ConfigObj 4.2.0 |
2817 |
.. _Michael Foord: http://www.voidspace.org.uk/index2.shtml |
|
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
2818 |
.. _Nicola Larosa: http://www.teknico.net |
2819 |
.. _Mark Andrews: http://www.la-la.com |