~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/util/configobj/docs/configobj.txt

  • Committer: Vincent Ladeuil
  • Date: 2008-01-29 15:16:31 UTC
  • mto: (3206.1.1 trunk)
  • mto: This revision was merged to the branch mainline in revision 3207.
  • Revision ID: v.ladeuil+lp@free.fr-20080129151631-vqjd13tb405mobx6
Fix two more leaking tmp dirs, by reworking TransformPreview lock handling.

* bzrlib/tests/test_transform.py:
(TestTransformMerge): Revert previous patch and cleanly call
preview.finalize now that we can.

* bzrlib/tests/test_merge.py:
(TestMerge.test_make_preview_transform): Catch TransformPreview
leak.

* bzrlib/builtins.py:
(cmd_merge._do_preview): Finalize the TransformPreview or the
limbodir will stay in /tmp.

* bzrlib/transform.py:
(TreeTransformBase.__init__): Create the _deletiondir since it's
reffered to by finalize.
(TreeTransformBase.finalize): Delete the dir only if _deletiondir
is set.
(TreeTransform.__init__): Use a temp var for deletiondir and set
the attribute after the base class __init__ has been called.
(TransformPreview.__init__): Read locks the tree since finalize
wants to unlock it (as suggested by Aaron).

Show diffs side-by-side

added added

removed removed

Lines of Context:
7
7
----------------------------------------
8
8
 
9
9
:Authors: Michael Foord, Nicola Larosa
10
 
:Version: ConfigObj 4.2.0
11
 
:Date: 2006/02/16
 
10
:Version: ConfigObj 4.4.0
 
11
:Date: 2007/02/04
12
12
:Homepage: `ConfigObj Homepage`_
13
13
:Sourceforge: Sourceforge_
 
14
:Development: `SVN Repository`_
14
15
:License: `BSD License`_
15
16
:Support: `Mailing List`_
16
17
 
17
18
.. _Mailing List: http://lists.sourceforge.net/lists/listinfo/configobj-develop
 
19
.. _SVN Repository: http://svn.pythonutils.python-hosting.com
18
20
 
19
21
.. meta::
20
22
   :description: ConfigObj - a Python module for easy reading and writing of 
32
34
file round tripper*. Its main feature is that it is very easy to use, with a
33
35
straightforward programmer's interface and a simple syntax for config files.
34
36
It has lots of other features though :
35
 
 
36
 
.. sidebar:: ConfigObj in Bazaar
37
 
 
38
 
    **ConfigObj** is now used as the config file parser for `Bazaar <http://bazaar-vcs.org>`_.
39
 
    
40
 
    Bazaar is *the* Python  distributed {acro;VCS;Version Control System}. 
41
 
    ConfigObj is used to read ``bazaar.conf`` and ``branches.conf``.
42
 
    
43
 
    Other projects that use **ConfigObj** include :
44
 
    
45
 
    * `Planet Plus <http://planetplus.python-hosting.com/>`_
46
 
    
47
 
        A new web application version of `Planet <http://www.planetplanet.org/>`_, 
48
 
        the web aggregator.
49
 
        
50
 
    * `NeuroImaging in Python <http://projects.scipy.org/neuroimaging/ni/wiki>`_
51
 
    
52
 
        BrainSTAT is a project with the ultimate goal to produce a
53
 
        platform-independent python environment for the analysis of brain
54
 
        imaging data.
55
 
        
56
 
    * `Gruik <http://www.tracos.org/gruik/wiki>`_
57
 
    
58
 
        Gruik is a free software network packet sniffer.
59
 
 
 
37
    
60
38
* Nested sections (subsections), to any level
61
39
* List values
62
40
* Multiple line values
70
48
* All comments in the file are preserved
71
49
* The order of keys/sections is preserved
72
50
* No external dependencies
73
 
* Full unicode support.
 
51
* Full Unicode support
 
52
* A powerful ``unrepr`` mode for storing basic datatypes
74
53
 
75
 
ConfigObj 4 is a complete rewrite of ConfigObj. ConfigObj now has a barrage [#]_
76
 
of doctests built into it, testing almost every feature. Run ``python configobj.py -v``
77
 
to see them in action. Despite the tests, ConfigObj 4 is smaller than version 3
78
 
and has no external dependencies.
 
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.
79
56
 
80
57
For support and bug reports please use the ConfigObj `Mailing List`_.
81
58
 
82
 
.. hint::
83
 
 
84
 
    ConfigObj provides a convenient API for storing all sorts of data, not just
85
 
    config files. There is an article on using `ConfigObj for Data Persistence`_.
86
 
    
87
 
    The code from that article is available as ConfigPersist.py_.
88
59
 
89
60
.. _ConfigObj for Data Persistence: http://www.voidspace.org.uk/python/articles/configobj_for_data_persistence.shtml
90
61
.. _ConfigPersist.py: http://www.voidspace.org.uk/python/configpersist.html
93
64
Downloading
94
65
===========
95
66
 
96
 
The current version is **4.2.0**, dated 16th February 2006. ConfigObj 4 is
 
67
The current version is **4.4.0**, dated 4th February 2007. ConfigObj 4 is
97
68
now stable. We still expect to pick up a few bugs along the way though [#]_.
98
69
{sm;:-)}
99
70
 
135
106
various other useful modules, and is required by many of the `Voidspace Python
136
107
Projects`_.
137
108
 
 
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
 
138
115
.. _configobj.py: http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=configobj.py
139
 
.. _configobj.zip: http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=configobj-4.2.0.zip
 
116
.. _configobj.zip: http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=configobj-4.4.0.zip
140
117
.. _validate.py: http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=validate.py
141
118
.. _API Docs: http://www.voidspace.org.uk/python/configobj-api/
142
119
.. _this document:
143
120
.. _configobj homepage: http://www.voidspace.org.uk/python/configobj.html
144
 
.. _Subversion Repository: http://svn.rest2web.python-hosting.com/branches/configobj4
145
121
.. _Sourceforge: http://sourceforge.net/projects/configobj
146
122
.. _EpyDoc: http://epydoc.sourceforge.net
147
123
.. _pythonutils: http://www.voidspace.org.uk/python/pythonutils.html
148
124
.. _Voidspace Python Projects: http://www.voidspace.org.uk/python
149
125
 
150
126
 
 
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
 
151
172
Getting Started
152
173
===============
153
174
 
354
375
    values are not parsed for lists.
355
376
        
356
377
        If ``list_values = False`` then single line values are not quoted or
357
 
        unqouted when reading and writing.
 
378
        unquoted when reading and writing.
358
379
 
359
380
    Changing this value affects whether single line values will be quoted or 
360
381
    not when writing.
380
401
    default.
381
402
 
382
403
    You can set this attribute to change whether string interpolation is done
383
 
    when values are fetched. See the interpolation_ section for more details.
 
404
    when values are fetched. See the `String Interpolation`_ section for more details.
384
405
 
385
406
* 'configspec': ``None``
386
407
 
410
431
    non-string value [#]_ will raise a ``TypeError`` (no type conversion is
411
432
    done by validation).
412
433
 
413
 
* 'indent_type': ``' '``
 
434
* 'indent_type': ``'    '``
414
435
 
415
 
    Indentation is not significant; it can however be present in the output
416
 
    config. Allowable values are: ``''`` (no indentation), ``' '`` (indentation
417
 
    with spaces, fixed at four per level), or ``'\t'`` (indentation with tabs,
418
 
    one tab per level).
 
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).
419
441
 
420
442
    If this option is not specified, and the ConfigObj is initialised with a
421
443
    dictionary, the indentation used in the output is the default one, that is,
422
 
    spaces.
 
444
    four spaces.
423
445
 
424
446
    If this option is not specified, and the ConfigObj is initialised with a
425
447
    list of lines or a file, the indentation used in the first indented line is
458
480
 
459
481
    ``default_encoding``, if specified, is the encoding used to decode byte
460
482
    strings in the **ConfigObj** before writing. If this is ``None``, then
461
 
    the Python default encoding (``sys.defaultencoding`` - usually ascii) is
 
483
    the Python default encoding (``sys.defaultencoding`` - usually ASCII) is
462
484
    used.
463
485
    
464
486
    For most Western European users, a value of ``latin-1`` is sensible.
468
490
    Any characters in byte-strings that can't be decoded using the
469
491
    ``default_encoding`` will raise a ``UnicodeDecodeError``.
470
492
 
 
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.
471
506
 
472
507
Methods
473
508
-------
539
574
 
540
575
::
541
576
 
542
 
    validate(validator, preserve_errors=False)
 
577
    validate(validator, preserve_errors=False, copy=False)
543
578
 
544
579
.. raw:: html
545
580
 
581
616
 
582
617
.. hint::
583
618
 
584
 
    If your ConfigObj is only comprised of basic data types, then you can use
585
 
    a function from the ConfigPersist.py_ module to auto-generate your
586
 
    configspec.
587
 
    
588
 
    See `ConfigObj for Data Persistence`_.
589
 
 
 
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}
590
646
 
591
647
Return Value
592
648
############
612
668
Even if ``preserve_errors`` is ``True``, missing keys or sections will still be
613
669
represented by a ``False`` in the results dictionary.
614
670
 
615
 
 
616
671
Mentioning Default Values
617
672
#########################
618
673
 
698
753
 
699
754
    {-coloring}
700
755
 
 
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.
701
772
    
 
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
 
702
777
Attributes
703
778
----------
704
779
 
713
788
* list_values
714
789
* encoding
715
790
* default_encoding
 
791
* unrepr
 
792
* write_empty_values
716
793
 
717
794
.. note::
718
795
 
726
803
* create_empty
727
804
* file_error
728
805
 
729
 
interpolate
730
 
~~~~~~~~~~~
 
806
interpolation
 
807
~~~~~~~~~~~~~
731
808
 
732
809
ConfigObj can perform string interpolation in a *similar* way to
733
 
``ConfigParser``. See the interpolation_ section for full details.
 
810
``ConfigParser``. See the `String Interpolation`_ section for full details.
734
811
 
735
 
If ``interpolate`` is set to ``False``, then interpolation is *not* done when
 
812
If ``interpolation`` is set to ``False``, then interpolation is *not* done when
736
813
you fetch values.
737
814
 
738
815
stringify
818
895
~~~~~~~~~~~~~~~~
819
896
 
820
897
If encoding is set, any byte-strings in your ConfigObj instance (keys or
821
 
members) will first be decoded to unicode using the encoding specified by the
 
898
members) will first be decoded to Unicode using the encoding specified by the
822
899
``default_encoding`` attribute. This ensures that the output is in the encoding
823
900
specified.
824
901
 
825
902
If this value is ``None`` then ``sys.defaultencoding`` is used instead.
826
903
 
 
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
 
827
921
The Config File Format
828
922
======================
829
923
 
940
1034
 
941
1035
    {+coloring}
942
1036
 
943
 
    {
 
1037
    ConfigObj({
944
1038
        'keyword1': 'value1',
945
1039
        'keyword2': 'value2',
946
1040
        'section 1': {
963
1057
                'keyword2': 'value2',
964
1058
            },
965
1059
        },
966
 
    }
 
1060
    })
967
1061
 
968
1062
    {-coloring}
969
1063
 
970
1064
Sections are ordered: note how the structure of the resulting ConfigObj is in
971
1065
the same order as the original file.
972
1066
 
 
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
 
973
1080
Sections
974
1081
========
975
1082
 
1213
1320
    
1214
1321
        In ConfigObj 4.1.0, this method was called ``istrue``. That method is
1215
1322
        now deprecated and will issue a warning when used. It will go away
1216
 
        in the next release.
 
1323
        in a future release.
1217
1324
        
1218
1325
* **as_int**
1219
1326
 
1409
1516
    #
1410
1517
    cfg.walk(transform, call_on_sections=True)
1411
1518
    print cfg
1412
 
    {'CLIENT1key1': 'CLIENT1value1', 'CLIENT1key2': 'CLIENT1value2', 
 
1519
    ConfigObj({'CLIENT1key1': 'CLIENT1value1', 'CLIENT1key2': 'CLIENT1value2', 
1413
1520
    'CLIENT1key3': 'CLIENT1value3', 
1414
1521
    'CLIENT1section1': {'CLIENT1key1': 'CLIENT1value1', 
1415
1522
        'CLIENT1key2': 'CLIENT1value2', 'CLIENT1key3': 'CLIENT1value3'}, 
1416
1523
    'CLIENT1section2': {'CLIENT1key1': 'CLIENT1value1', 
1417
1524
        'CLIENT1key2': 'CLIENT1value2', 'CLIENT1key3': 'CLIENT1value3', 
1418
1525
        'CLIENT1section1': {'CLIENT1key1': 'CLIENT1value1', 
1419
 
            'CLIENT1key2': 'CLIENT1value2', 'CLIENT1key3': 'CLIENT1value3'}}}
 
1526
            'CLIENT1key2': 'CLIENT1value2', 'CLIENT1key3': 'CLIENT1value3'}}})
1420
1527
            
1421
1528
    {-coloring}
1422
1529
 
1445
1552
    (in a configspec), a ``RepeatSectionError`` will be raised.
1446
1553
 
1447
1554
Number 5 (which is actually two different types of exceptions) is documented
1448
 
    in interpolation_.
 
1555
    in `String Interpolation`_.
1449
1556
 
1450
1557
Number 6 is explained in the validation_ section.
1451
1558
 
1474
1581
 
1475
1582
* ``ConfigspecError``
1476
1583
 
1477
 
    An error occured whilst parsing a configspec.
 
1584
    An error occurred whilst parsing a configspec.
 
1585
 
 
1586
* ``UnreprError``
 
1587
 
 
1588
    An error occurred when parsing a value in `unrepr mode`_.
1478
1589
 
1479
1590
When parsing a configspec, ConfigObj will stop on the first error it
1480
1591
encounters.  It will raise a ``ConfigspecError``. This will have an ``error``
1481
1592
attribute, which is the actual error that was raised.
1482
1593
 
1483
 
Behavior when parsing a config file depends on the option ``raise_errors``.
 
1594
Behaviour when parsing a config file depends on the option ``raise_errors``.
1484
1595
If ConfigObj encounters an error while parsing a config file:
1485
1596
 
1486
1597
    If ``raise_errors=True`` then ConfigObj will raise the appropriate error
1489
1600
    If ``raise_errors=False`` (the default) then parsing will continue to the
1490
1601
    end and *all* errors will be collected.
1491
1602
 
1492
 
In the second case a ``ConfigObjError`` is raised after parsing has stopped.
1493
 
The error raised has a ``config`` attribute, which is the parts of the
1494
 
ConfigObj that parsed successfully. It also has an attribute ``errors``, which
1495
 
is a list of *all* the errors raised. Each entry in the list is an instance of
1496
 
the appropriate error type. Each one has the following attributes (useful for
1497
 
delivering a sensible error message to your user) :
 
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) :
1498
1609
 
1499
1610
* ``line``: the original line that caused the error.
1500
1611
 
1502
1613
 
1503
1614
* ``message``: the error message that accompanied the error.
1504
1615
 
 
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
 
1505
1623
.. note::
1506
1624
 
1507
1625
    One wrongly written line could break the basic structure of your config
1513
1631
Validation
1514
1632
==========
1515
1633
 
 
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
 
1516
1644
Validation is done through a combination of the configspec_ and a ``Validator``
1517
1645
object. For this you need *validate.py* [#]_. See downloading_ if you don't
1518
1646
have a copy.
1577
1705
    In order to allow this, checks in the 'DEFAULT' section (of the root level
1578
1706
    of your configspec) are *not* used.
1579
1707
 
 
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
 
1580
1721
.. _validate.py documentation: http://www.voidspace.org.uk/python/validate.html
1581
1722
 
1582
1723
Type Conversion
1670
1811
sub-sections. Defaults work in the normal way in repeated sections.
1671
1812
 
1672
1813
 
 
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
 
1673
1839
Validation and Interpolation
1674
1840
----------------------------
1675
1841
 
1734
1900
    {-coloring}
1735
1901
 
1736
1902
 
1737
 
Interpolation
1738
 
=============
 
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
====================
1739
1975
 
1740
1976
ConfigObj allows string interpolation *similar* to the way ``ConfigParser``
1741
 
 
1742
 
You specify a value to be substituted by including ``%(name)s`` in the value.
1743
 
 
1744
 
Interpolation checks first the 'DEFAULT' sub-section of the current section to
1745
 
see if ``name`` is the key to a value. ('name' is case sensitive).
1746
 
 
1747
 
If it doesn't find it, next it checks the 'DEFAULT' section of the parent
1748
 
section, last it checks the 'DEFAULT' section of the main section.
1749
 
 
1750
 
If the value specified isn't found then a ``MissingInterpolationOption`` error
1751
 
is raised (a subclass of ``ConfigObjError``).
 
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``).
1752
2013
 
1753
2014
If it is found then the returned value is also checked for substitutions. This
1754
2015
allows you to make up compound values (for example directory paths) that use
1755
2016
more than one default value. It also means it's possible to create circular
1756
 
references. If after ten replacements there are still values to substitute, an
1757
 
``InterpolationDepthError`` is raised.
 
2017
references. If there are any circular references which would cause an infinite
 
2018
interpolation loop, an ``InterpolationLoopError`` is raised.
1758
2019
 
1759
2020
Both of these errors are subclasses of ``InterpolationError``, which is a
1760
2021
subclass of ``ConfigObjError``.
1806
2067
failed.
1807
2068
 
1808
2069
``flatten_errors`` is an example function that turns a results dictionary into
1809
 
a flat list, that only contains vaues that *failed*.
 
2070
a flat list, that only contains values that *failed*.
1810
2071
 
1811
2072
``cfg`` is the ConfigObj instance being checked, ``res`` is the results
1812
2073
dictionary returned by ``validate``.
1926
2187
and which should be present) have gone. The configspec is no longer used to
1927
2188
specify order for the ``write`` method.
1928
2189
 
1929
 
Exceeding the maximum depth of recursion in string interpolation now raises an
1930
 
error ``InterpolationDepthError``.
 
2190
Infinite loops in string interpolation are now detected and raise an error
 
2191
``InterpolationLoopError``.
1931
2192
 
1932
2193
Specifying a value for interpolation which doesn't exist now raises a
1933
2194
``MissingInterpolationOption`` error (instead of merely being ignored).
2014
2275
TODO
2015
2276
====
2016
2277
 
2017
 
Fix any bugs (and resolvable issues).
2018
 
 
2019
 
Do an example for the 'walk' which removes uniform indentation in multiline
2020
 
values.
2021
 
 
2022
 
When initialising a section from a ConfigObj *or* an ``OrderedDictionary``
2023
 
we could preserve ordering.
2024
 
 
2025
 
Add an *odict* method which returns an ``OrderedDictionary``.
 
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).
2026
2300
 
2027
2301
 
2028
2302
ISSUES
2033
2307
    Please file any bug reports to `Michael Foord`_ or the **ConfigObj**
2034
2308
    `Mailing List`_.
2035
2309
 
2036
 
You can't have a keyword with the same name as a section (in the same section).
2037
 
They are both dictionary keys, so they would overlap.
2038
 
 
2039
 
Interpolation checks first the 'DEFAULT' sub-section of the current section,
2040
 
next it checks the 'DEFAULT' section of the parent section, last it checks the
2041
 
'DEFAULT' section of the main section.
 
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.
2042
2328
 
2043
2329
Logically a 'DEFAULT' section should apply to all subsections of the *same
2044
 
parent*: this means that checking the 'DEFAULT' sub-section in the *current
2045
 
section* is not necessarily logical ?
2046
 
 
2047
 
Does it matter that we don't support the ':' divider, which is supported by
2048
 
``ConfigParser`` ?
2049
 
 
2050
 
String interpolation and validation don't play well together. See 
2051
 
`Validation and Interpolation`_.
2052
 
 
2053
 
Validation is no longer done on the 'DEFAULT' section (on the root level). This
2054
 
allows interpolation from within your configspec - but also prevents you
2055
 
validating the 'DEFAULT' section.
 
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.
2056
2341
 
2057
2342
 
2058
2343
CHANGELOG
2060
2345
 
2061
2346
This is an abbreviated changelog showing the major releases up to version 4.
2062
2347
From version 4 it lists all releases and changes. *More* data on individual
2063
 
changes may be found in the source code.
 
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
 
2064
2478
 
2065
2479
2006/02/16 - Version 4.2.0
2066
2480
--------------------------
2068
2482
Removed ``BOM_UTF8`` from ``__all__``.
2069
2483
 
2070
2484
The ``BOM`` attribute has become a boolean. (Defaults to ``False``.) It is
2071
 
*only* ``True`` for the ``UTF16`` encoding.
 
2485
*only* ``True`` for the ``UTF16/UTF8`` encodings.
2072
2486
 
2073
2487
File like objects no longer need a ``seek`` attribute.
2074
2488
 
2086
2500
written out at the start of the file. (It will normally only be ``True`` if
2087
2501
the utf8 BOM was found when the file was read.)
2088
2502
 
 
2503
Thanks to Aaron Bentley for help and testing on the unicode issues.
 
2504
 
2089
2505
File paths are *not* converted to absolute paths, relative paths will
2090
2506
remain relative as the ``filename`` attribute.
2091
2507
 
2292
2708
-------
2293
2709
 
2294
2710
ConfigObj originated in a set of functions for reading config files in the
2295
 
atlantibots_ project. The original functions were written by Rob McNeur...
 
2711
`atlantibots <http://www.voidspace.org.uk/atlantibots/>`_ project. The original
 
2712
functions were written by Rob McNeur.
2296
2713
 
2297
 
.. _atlantibots: http://www.voidspace.org.uk/atlantibots
2298
2714
 
2299
2715
----------
2300
2716
 
2301
2717
Footnotes
2302
2718
=========
2303
2719
 
2304
 
.. [#] 253 of them, at the time of writing.
 
2720
.. [#] 315 of them, at the time of writing.
2305
2721
 
2306
2722
.. [#] And if you discover any bugs, let us know. We'll fix them quickly.
2307
2723
 
2308
2724
.. [#] If you specify a filename that doesn't exist, ConfigObj will assume you
2309
2725
    are creating a new one. See the *create_empty* and *file_error* options_.
2310
2726
 
2311
 
.. [#] They can be byte strings ('ordinary' strings) or Unicode.
 
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.
2312
2731
 
2313
2732
.. [#] This is a change in ConfigObj 4.2.0. Note that ConfigObj doesn't call
2314
2733
    the seek method of any file like object you pass in. You may want to call
2315
2734
    ``file_object.seek(0)`` yourself, first.
2316
2735
 
2317
 
.. [#] Except we don't support the RFC822 style line continuations, nor ':' as
2318
 
    a divider.
2319
 
 
2320
 
.. [#] For a file object that will depend what mode it was opened with. You
2321
 
    can read *and* write to a ``StringIO`` instance, but not always to a
2322
 
    ``cStringIO`` instance.
2323
 
 
2324
2736
.. [#] A side effect of this is that it enables you to copy a ConfigObj :
2325
2737
 
2326
2738
    .. raw:: html
2335
2747
 
2336
2748
    The order of values and sections will not be preserved, though.
2337
2749
 
 
2750
.. [#] Other than lists of strings.
 
2751
 
2338
2752
.. [#] The exception is if it detects a ``UTF16`` encoded file which it
2339
2753
    must decode before parsing.
2340
2754
     
2341
 
.. [#] Other than lists of strings.
2342
 
 
2343
2755
.. [#] The method signature in the API docs will show that this method takes
2344
2756
    two arguments. The second is the section to be written. This is because the
2345
2757
    ``write`` method is called recursively.
2355
2767
 
2356
2768
.. [#] Minimum required version of *validate.py* 0.2.0 .
2357
2769
 
2358
 
.. [#] There's nothing to stop you decoding the whole config file to Unicode
2359
 
    *first*.
2360
 
 
2361
2770
.. [#] It also makes ConfigObj a lot simpler to *use*.
2362
2771
 
2363
2772
.. note::
2369
2778
.. raw:: html
2370
2779
 
2371
2780
    <div align="center">
2372
 
        <a href="http://sourceforge.net/donate/index.php?group_id=123265">
2373
 
            <img src="http://images.sourceforge.net/images/project-support.jpg" width="88" height="32" border="0" alt="Support This Project" /> 
2374
 
        </a>
2375
 
        <a href="http://sourceforge.net">
2376
 
            <img src="http://sourceforge.net/sflogo.php?group_id=123265&amp;type=1" width="88" height="31" border="0" alt="SourceForge.net Logo" />
2377
 
        </a>
2378
 
        <br />
2379
 
        <a href="http://www.python.org">
2380
 
            <img src="images/powered_by_python.jpg" width="602" height="186" border="0" />
2381
 
        </a><br /><br />
2382
 
        <a href="http://www.opensource.org">
2383
 
            <img src="images/osi-certified-120x100.gif" width="120" height="100" border="0" />
2384
 
            <br /><strong>Certified Open Source</strong>
2385
 
        </a>
2386
 
        <br /><br />
2387
 
        <script type="text/javascript" language="JavaScript">var site="s16atlantibots"</script>
2388
 
        <script type="text/javascript" language="JavaScript1.2" src="http://s16.sitemeter.com/js/counter.js?site=s16atlantibots"></script>
2389
 
        <noscript>
2390
 
            <a href="http://s16.sitemeter.com/stats.asp?site=s16atlantibots">
2391
 
                <img src="http://s16.sitemeter.com/meter.asp?site=s16atlantibots" alt="Site Meter" border=0 />
2392
 
            </a>
2393
 
        </noscript>
 
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&amp;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
 
2394
2814
    </div>
2395
2815
 
2396
2816
.. _listquote: http://www.voidspace.org.uk/python/modules.shtml#listquote