Salome HOME
add doc/build for EZ direct html or pdf
[tools/sat.git] / doc / build / html / _modules / src / pyconf.html
1
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
3   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4
5
6 <html xmlns="http://www.w3.org/1999/xhtml">
7   <head>
8     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
9     
10     <title>src.pyconf &mdash; salomeTools 5.0.0dev documentation</title>
11     
12     <link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
13     <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
14     <link rel="stylesheet" href="/volatile/wambeke/SAT5/SAT5_S840_MATIX24/SAT/doc/src/custom.css" type="text/css" />
15     
16     <script type="text/javascript">
17       var DOCUMENTATION_OPTIONS = {
18         URL_ROOT:    '../../',
19         VERSION:     '5.0.0dev',
20         COLLAPSE_INDEX: false,
21         FILE_SUFFIX: '.html',
22         HAS_SOURCE:  true
23       };
24     </script>
25     <script type="text/javascript" src="../../_static/jquery.js"></script>
26     <script type="text/javascript" src="../../_static/underscore.js"></script>
27     <script type="text/javascript" src="../../_static/doctools.js"></script>
28     <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
29     <link rel="top" title="salomeTools 5.0.0dev documentation" href="../../index.html" />
30     <link rel="up" title="Module code" href="../index.html" />
31    
32   <link rel="stylesheet" href="../../_static/custom.css" type="text/css" />
33   
34   
35   <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
36
37   </head>
38   <body>
39   
40
41     <div class="document">
42       <div class="documentwrapper">
43         <div class="bodywrapper">
44           <div class="body" role="main">
45             
46   <h1>Source code for src.pyconf</h1><div class="highlight"><pre>
47 <span class="c">#!/usr/bin/env python</span>
48 <span class="c">#-*- coding:utf-8 -*-</span>
49
50 <span class="c"># Copyright 2004-2007 by Vinay Sajip. All Rights Reserved.</span>
51 <span class="c">#</span>
52 <span class="c"># Permission to use, copy, modify, and distribute this software and its</span>
53 <span class="c"># documentation for any purpose and without fee is hereby granted,</span>
54 <span class="c"># provided that the above copyright notice appear in all copies and that</span>
55 <span class="c"># both that copyright notice and this permission notice appear in</span>
56 <span class="c"># supporting documentation, and that the name of Vinay Sajip</span>
57 <span class="c"># not be used in advertising or publicity pertaining to distribution</span>
58 <span class="c"># of the software without specific, written prior permission.</span>
59 <span class="c"># VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING</span>
60 <span class="c"># ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL</span>
61 <span class="c"># VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR</span>
62 <span class="c"># ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER</span>
63 <span class="c"># IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT</span>
64 <span class="c"># OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.</span>
65
66 <span class="c">#  Copyright (C) 2010-2013  CEA/DEN</span>
67 <span class="c">#</span>
68 <span class="c">#  This library is free software; you can redistribute it and/or</span>
69 <span class="c">#  modify it under the terms of the GNU Lesser General Public</span>
70 <span class="c">#  License as published by the Free Software Foundation; either</span>
71 <span class="c">#  version 2.1 of the License.</span>
72 <span class="c">#</span>
73 <span class="c">#  This library is distributed in the hope that it will be useful,</span>
74 <span class="c">#  but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
75 <span class="c">#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</span>
76 <span class="c">#  Lesser General Public License for more details.</span>
77 <span class="c">#</span>
78 <span class="c">#  You should have received a copy of the GNU Lesser General Public</span>
79 <span class="c">#  License along with this library; if not, write to the Free Software</span>
80 <span class="c">#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA</span>
81
82 <span class="c"># CEA adds : </span>
83 <span class="c"># Possibility to overwrites value in a pyconf file</span>
84 <span class="c"># Python 3 porting</span>
85
86
87 <span class="sd">&quot;&quot;&quot;</span>
88 <span class="sd">This is a configuration module for Python.</span>
89
90 <span class="sd">This module should work under Python versions &gt;= 2.2, and cannot be used with</span>
91 <span class="sd">earlier versions since it uses new-style classes.</span>
92
93 <span class="sd">Development and testing has only been carried out (so far) on Python 2.3.4 and</span>
94 <span class="sd">Python 2.4.2. See the test module (test_config.py) included in the</span>
95 <span class="sd">U{distribution&lt;http://www.red-dove.com/python_config.html|_blank&gt;} (follow the</span>
96 <span class="sd">download link).</span>
97
98 <span class="sd">A simple example - with the example configuration file::</span>
99
100 <span class="sd">    messages:</span>
101 <span class="sd">    [</span>
102 <span class="sd">      {</span>
103 <span class="sd">        stream : `sys.stderr`</span>
104 <span class="sd">        message: &#39;Welcome&#39;</span>
105 <span class="sd">        name: &#39;Harry&#39;</span>
106 <span class="sd">      }</span>
107 <span class="sd">      {</span>
108 <span class="sd">        stream : `sys.stdout`</span>
109 <span class="sd">        message: &#39;Welkom&#39;</span>
110 <span class="sd">        name: &#39;Ruud&#39;</span>
111 <span class="sd">      }</span>
112 <span class="sd">      {</span>
113 <span class="sd">        stream : $messages[0].stream</span>
114 <span class="sd">        message: &#39;Bienvenue&#39;</span>
115 <span class="sd">        name: Yves</span>
116 <span class="sd">      }</span>
117 <span class="sd">    ]</span>
118
119 <span class="sd">a program to read the configuration would be::</span>
120
121 <span class="sd">    from config import Config</span>
122
123 <span class="sd">    f = file(&#39;simple.cfg&#39;)</span>
124 <span class="sd">    cfg = Config(f)</span>
125 <span class="sd">    for m in cfg.messages:</span>
126 <span class="sd">        s = &#39;%s, %s&#39; % (m.message, m.name)</span>
127 <span class="sd">        try:</span>
128 <span class="sd">            print &gt;&gt; m.stream, s</span>
129 <span class="sd">        except IOError, e:</span>
130 <span class="sd">            print e</span>
131
132 <span class="sd">which, when run, would yield the console output::</span>
133
134 <span class="sd">    Welcome, Harry</span>
135 <span class="sd">    Welkom, Ruud</span>
136 <span class="sd">    Bienvenue, Yves</span>
137
138 <span class="sd">See U{this tutorial&lt;http://www.red-dove.com/python_config.html|_blank&gt;} for more</span>
139 <span class="sd">information.</span>
140
141 <span class="sd">#modified for salomeTools</span>
142 <span class="sd">@version: 0.3.7.1</span>
143
144 <span class="sd">@author: Vinay Sajip</span>
145
146 <span class="sd">@copyright: Copyright (C) 2004-2007 Vinay Sajip. All Rights Reserved.</span>
147
148
149 <span class="sd">@var streamOpener: The default stream opener. This is a factory function which</span>
150 <span class="sd">takes a string (e.g. filename) and returns a stream suitable for reading. If</span>
151 <span class="sd">unable to open the stream, an IOError exception should be thrown.</span>
152
153 <span class="sd">The default value of this variable is L{defaultStreamOpener}. For an example</span>
154 <span class="sd">of how it&#39;s used, see test_config.py (search for streamOpener).</span>
155 <span class="sd">&quot;&quot;&quot;</span>
156
157 <span class="n">__author__</span>  <span class="o">=</span> <span class="s">&quot;Vinay Sajip &lt;vinay_sajip@red-dove.com&gt;&quot;</span>
158 <span class="n">__status__</span>  <span class="o">=</span> <span class="s">&quot;alpha&quot;</span>
159 <span class="n">__version__</span> <span class="o">=</span> <span class="s">&quot;0.3.7.1&quot;</span> <span class="c">#modified for salomeTools</span>
160 <span class="n">__date__</span>    <span class="o">=</span> <span class="s">&quot;05 October 2007&quot;</span>
161
162 <span class="kn">import</span> <span class="nn">codecs</span>
163 <span class="kn">import</span> <span class="nn">os</span>
164 <span class="kn">import</span> <span class="nn">sys</span>
165
166 <span class="n">WORD</span> <span class="o">=</span> <span class="s">&#39;a&#39;</span>
167 <span class="n">NUMBER</span> <span class="o">=</span> <span class="s">&#39;9&#39;</span>
168 <span class="n">STRING</span> <span class="o">=</span> <span class="s">&#39;&quot;&#39;</span>
169 <span class="n">EOF</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
170 <span class="n">LCURLY</span> <span class="o">=</span> <span class="s">&#39;{&#39;</span>
171 <span class="n">RCURLY</span> <span class="o">=</span> <span class="s">&#39;}&#39;</span>
172 <span class="n">LBRACK</span> <span class="o">=</span> <span class="s">&#39;[&#39;</span>
173 <span class="n">LBRACK2</span> <span class="o">=</span> <span class="s">&#39;a[&#39;</span>
174 <span class="n">RBRACK</span> <span class="o">=</span> <span class="s">&#39;]&#39;</span>
175 <span class="n">LPAREN</span> <span class="o">=</span> <span class="s">&#39;(&#39;</span>
176 <span class="n">LPAREN2</span> <span class="o">=</span> <span class="s">&#39;((&#39;</span>
177 <span class="n">RPAREN</span> <span class="o">=</span> <span class="s">&#39;)&#39;</span>
178 <span class="n">DOT</span> <span class="o">=</span> <span class="s">&#39;.&#39;</span>
179 <span class="n">COMMA</span> <span class="o">=</span> <span class="s">&#39;,&#39;</span>
180 <span class="n">COLON</span> <span class="o">=</span> <span class="s">&#39;:&#39;</span>
181 <span class="n">AT</span> <span class="o">=</span> <span class="s">&#39;@&#39;</span>
182 <span class="n">PLUS</span> <span class="o">=</span> <span class="s">&#39;+&#39;</span>
183 <span class="n">MINUS</span> <span class="o">=</span> <span class="s">&#39;-&#39;</span>
184 <span class="n">STAR</span> <span class="o">=</span> <span class="s">&#39;*&#39;</span>
185 <span class="n">SLASH</span> <span class="o">=</span> <span class="s">&#39;/&#39;</span>
186 <span class="n">MOD</span> <span class="o">=</span> <span class="s">&#39;%&#39;</span>
187 <span class="n">BACKTICK</span> <span class="o">=</span> <span class="s">&#39;`&#39;</span>
188 <span class="n">DOLLAR</span> <span class="o">=</span> <span class="s">&#39;$&#39;</span>
189 <span class="n">TRUE</span> <span class="o">=</span> <span class="s">&#39;True&#39;</span>
190 <span class="n">FALSE</span> <span class="o">=</span> <span class="s">&#39;False&#39;</span>
191 <span class="n">NONE</span> <span class="o">=</span> <span class="s">&#39;None&#39;</span>
192
193 <span class="n">WORDCHARS</span> <span class="o">=</span> <span class="s">&quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_&quot;</span>
194
195 <span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">platform</span> <span class="o">==</span> <span class="s">&#39;win32&#39;</span><span class="p">:</span>
196     <span class="n">NEWLINE</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\r\n</span><span class="s">&#39;</span>
197 <span class="k">elif</span> <span class="n">os</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s">&#39;mac&#39;</span><span class="p">:</span>
198     <span class="n">NEWLINE</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\r</span><span class="s">&#39;</span>
199 <span class="k">else</span><span class="p">:</span>
200     <span class="n">NEWLINE</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span>
201
202 <span class="k">try</span><span class="p">:</span>
203     <span class="n">has_utf32</span> <span class="o">=</span> <span class="bp">True</span>
204 <span class="k">except</span><span class="p">:</span>
205     <span class="n">has_utf32</span> <span class="o">=</span> <span class="bp">False</span>
206
207 <div class="viewcode-block" id="ConfigInputStream"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigInputStream">[docs]</a><span class="k">class</span> <span class="nc">ConfigInputStream</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
208     <span class="sd">&quot;&quot;&quot;</span>
209 <span class="sd">    An input stream which can read either ANSI files with default encoding</span>
210 <span class="sd">    or Unicode files with BOMs.</span>
211
212 <span class="sd">    Handles UTF-8, UTF-16LE, UTF-16BE. Could handle UTF-32 if Python had</span>
213 <span class="sd">    built-in support.</span>
214 <span class="sd">    &quot;&quot;&quot;</span>
215     <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stream</span><span class="p">):</span>
216         <span class="sd">&quot;&quot;&quot;</span>
217 <span class="sd">        Initialize an instance.</span>
218
219 <span class="sd">        @param stream: The underlying stream to be read. Should be seekable.</span>
220 <span class="sd">        @type stream: A stream (file-like object).</span>
221 <span class="sd">        &quot;&quot;&quot;</span>
222         <span class="n">encoding</span> <span class="o">=</span> <span class="bp">None</span>
223         <span class="n">signature</span> <span class="o">=</span> <span class="n">stream</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
224         <span class="n">used</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
225         <span class="k">if</span> <span class="n">has_utf32</span><span class="p">:</span>
226             <span class="k">if</span> <span class="n">signature</span> <span class="o">==</span> <span class="n">codecs</span><span class="o">.</span><span class="n">BOM_UTF32_LE</span><span class="p">:</span>
227                 <span class="n">encoding</span> <span class="o">=</span> <span class="s">&#39;utf-32le&#39;</span>
228             <span class="k">elif</span> <span class="n">signature</span> <span class="o">==</span> <span class="n">codecs</span><span class="o">.</span><span class="n">BOM_UTF32_BE</span><span class="p">:</span>
229                 <span class="n">encoding</span> <span class="o">=</span> <span class="s">&#39;utf-32be&#39;</span>
230         <span class="k">if</span> <span class="n">encoding</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
231             <span class="k">if</span> <span class="n">signature</span><span class="p">[:</span><span class="mi">3</span><span class="p">]</span> <span class="o">==</span> <span class="n">codecs</span><span class="o">.</span><span class="n">BOM_UTF8</span><span class="p">:</span>
232                 <span class="n">used</span> <span class="o">=</span> <span class="mi">3</span>
233                 <span class="n">encoding</span> <span class="o">=</span> <span class="s">&#39;utf-8&#39;</span>
234             <span class="k">elif</span> <span class="n">signature</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span> <span class="o">==</span> <span class="n">codecs</span><span class="o">.</span><span class="n">BOM_UTF16_LE</span><span class="p">:</span>
235                 <span class="n">used</span> <span class="o">=</span> <span class="mi">2</span>
236                 <span class="n">encoding</span> <span class="o">=</span> <span class="s">&#39;utf-16le&#39;</span>
237             <span class="k">elif</span> <span class="n">signature</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span> <span class="o">==</span> <span class="n">codecs</span><span class="o">.</span><span class="n">BOM_UTF16_BE</span><span class="p">:</span>
238                 <span class="n">used</span> <span class="o">=</span> <span class="mi">2</span>
239                 <span class="n">encoding</span> <span class="o">=</span> <span class="s">&#39;utf-16be&#39;</span>
240             <span class="k">else</span><span class="p">:</span>
241                 <span class="n">used</span> <span class="o">=</span> <span class="mi">0</span>
242         <span class="k">if</span> <span class="n">used</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span>
243             <span class="n">stream</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">used</span><span class="p">)</span>
244         <span class="k">if</span> <span class="n">encoding</span><span class="p">:</span>
245             <span class="n">reader</span> <span class="o">=</span> <span class="n">codecs</span><span class="o">.</span><span class="n">getreader</span><span class="p">(</span><span class="n">encoding</span><span class="p">)</span>
246             <span class="n">stream</span> <span class="o">=</span> <span class="n">reader</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
247         <span class="bp">self</span><span class="o">.</span><span class="n">stream</span> <span class="o">=</span> <span class="n">stream</span>
248         <span class="bp">self</span><span class="o">.</span><span class="n">encoding</span> <span class="o">=</span> <span class="n">encoding</span>
249
250 <div class="viewcode-block" id="ConfigInputStream.read"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigInputStream.read">[docs]</a>    <span class="k">def</span> <span class="nf">read</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
251         <span class="k">if</span> <span class="p">(</span><span class="n">size</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">encoding</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">):</span>
252             <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
253         <span class="k">else</span><span class="p">:</span>
254             <span class="n">rv</span> <span class="o">=</span> <span class="s">u&#39;&#39;</span>
255             <span class="k">while</span> <span class="n">size</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
256                 <span class="n">rv</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
257                 <span class="n">size</span> <span class="o">-=</span> <span class="mi">1</span>
258         <span class="k">return</span> <span class="n">rv</span>
259 </div>
260 <div class="viewcode-block" id="ConfigInputStream.close"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigInputStream.close">[docs]</a>    <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
261         <span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
262 </div>
263 <div class="viewcode-block" id="ConfigInputStream.readline"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigInputStream.readline">[docs]</a>    <span class="k">def</span> <span class="nf">readline</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
264         <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">encoding</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
265             <span class="n">line</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
266         <span class="k">else</span><span class="p">:</span>
267             <span class="n">line</span> <span class="o">=</span> <span class="s">u&#39;&#39;</span>
268         <span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
269             <span class="n">c</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
270             <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">):</span>
271                 <span class="n">c</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span>
272             <span class="k">if</span> <span class="n">c</span><span class="p">:</span>
273                 <span class="n">line</span> <span class="o">+=</span> <span class="n">c</span>
274             <span class="k">if</span> <span class="n">c</span> <span class="o">==</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">:</span>
275                 <span class="k">break</span>
276         <span class="k">return</span> <span class="n">line</span>
277 </div></div>
278 <div class="viewcode-block" id="ConfigOutputStream"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigOutputStream">[docs]</a><span class="k">class</span> <span class="nc">ConfigOutputStream</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
279     <span class="sd">&quot;&quot;&quot;</span>
280 <span class="sd">    An output stream which can write either ANSI files with default encoding</span>
281 <span class="sd">    or Unicode files with BOMs.</span>
282
283 <span class="sd">    Handles UTF-8, UTF-16LE, UTF-16BE. Could handle UTF-32 if Python had</span>
284 <span class="sd">    built-in support.</span>
285 <span class="sd">    &quot;&quot;&quot;</span>
286
287     <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stream</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
288         <span class="sd">&quot;&quot;&quot;</span>
289 <span class="sd">        Initialize an instance.</span>
290
291 <span class="sd">        @param stream: The underlying stream to be written.</span>
292 <span class="sd">        @type stream: A stream (file-like object).</span>
293 <span class="sd">        @param encoding: The desired encoding.</span>
294 <span class="sd">        @type encoding: str</span>
295 <span class="sd">        &quot;&quot;&quot;</span>
296         <span class="k">if</span> <span class="n">encoding</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
297             <span class="n">encoding</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">encoding</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
298         <span class="bp">self</span><span class="o">.</span><span class="n">encoding</span> <span class="o">=</span> <span class="n">encoding</span>
299         <span class="k">if</span> <span class="n">encoding</span> <span class="o">==</span> <span class="s">&quot;utf-8&quot;</span><span class="p">:</span>
300             <span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">codecs</span><span class="o">.</span><span class="n">BOM_UTF8</span><span class="p">)</span>
301         <span class="k">elif</span> <span class="n">encoding</span> <span class="o">==</span> <span class="s">&quot;utf-16be&quot;</span><span class="p">:</span>
302             <span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">codecs</span><span class="o">.</span><span class="n">BOM_UTF16_BE</span><span class="p">)</span>
303         <span class="k">elif</span> <span class="n">encoding</span> <span class="o">==</span> <span class="s">&quot;utf-16le&quot;</span><span class="p">:</span>
304             <span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">codecs</span><span class="o">.</span><span class="n">BOM_UTF16_LE</span><span class="p">)</span>
305         <span class="k">elif</span> <span class="n">encoding</span> <span class="o">==</span> <span class="s">&quot;utf-32be&quot;</span><span class="p">:</span>
306             <span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">codecs</span><span class="o">.</span><span class="n">BOM_UTF32_BE</span><span class="p">)</span>
307         <span class="k">elif</span> <span class="n">encoding</span> <span class="o">==</span> <span class="s">&quot;utf-32le&quot;</span><span class="p">:</span>
308             <span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">codecs</span><span class="o">.</span><span class="n">BOM_UTF32_LE</span><span class="p">)</span>
309
310         <span class="k">if</span> <span class="n">encoding</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
311             <span class="n">writer</span> <span class="o">=</span> <span class="n">codecs</span><span class="o">.</span><span class="n">getwriter</span><span class="p">(</span><span class="n">encoding</span><span class="p">)</span>
312             <span class="n">stream</span> <span class="o">=</span> <span class="n">writer</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
313         <span class="bp">self</span><span class="o">.</span><span class="n">stream</span> <span class="o">=</span> <span class="n">stream</span>
314
315 <div class="viewcode-block" id="ConfigOutputStream.write"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigOutputStream.write">[docs]</a>    <span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
316         <span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
317 </div>
318 <div class="viewcode-block" id="ConfigOutputStream.flush"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigOutputStream.flush">[docs]</a>    <span class="k">def</span> <span class="nf">flush</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
319         <span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
320 </div>
321 <div class="viewcode-block" id="ConfigOutputStream.close"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigOutputStream.close">[docs]</a>    <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
322         <span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
323 </div></div>
324 <div class="viewcode-block" id="defaultStreamOpener"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.defaultStreamOpener">[docs]</a><span class="k">def</span> <span class="nf">defaultStreamOpener</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
325     <span class="sd">&quot;&quot;&quot;\</span>
326 <span class="sd">    This function returns a read-only stream, given its name. The name passed</span>
327 <span class="sd">    in should correspond to an existing stream, otherwise an exception will be</span>
328 <span class="sd">    raised.</span>
329
330 <span class="sd">    This is the default value of L{streamOpener}; assign your own callable to</span>
331 <span class="sd">    streamOpener to return streams based on names. For example, you could use</span>
332 <span class="sd">    urllib2.urlopen().</span>
333
334 <span class="sd">    @param name: The name of a stream, most commonly a file name.</span>
335 <span class="sd">    @type name: str</span>
336 <span class="sd">    @return: A stream with the specified name.</span>
337 <span class="sd">    @rtype: A read-only stream (file-like object)</span>
338 <span class="sd">    &quot;&quot;&quot;</span>
339     <span class="k">return</span> <span class="n">ConfigInputStream</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s">&#39;rb&#39;</span><span class="p">))</span>
340 </div>
341 <span class="n">streamOpener</span> <span class="o">=</span> <span class="bp">None</span>
342
343 <span class="n">__resolveOverwrite__</span> <span class="o">=</span> <span class="bp">True</span>
344
345 <div class="viewcode-block" id="ConfigError"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigError">[docs]</a><span class="k">class</span> <span class="nc">ConfigError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
346     <span class="sd">&quot;&quot;&quot;</span>
347 <span class="sd">    This is the base class of exceptions raised by this module.</span>
348 <span class="sd">    &quot;&quot;&quot;</span>
349     <span class="k">pass</span>
350 </div>
351 <div class="viewcode-block" id="ConfigFormatError"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigFormatError">[docs]</a><span class="k">class</span> <span class="nc">ConfigFormatError</span><span class="p">(</span><span class="n">ConfigError</span><span class="p">):</span>
352     <span class="sd">&quot;&quot;&quot;</span>
353 <span class="sd">    This is the base class of exceptions raised due to syntax errors in</span>
354 <span class="sd">    configurations.</span>
355 <span class="sd">    &quot;&quot;&quot;</span>
356     <span class="k">pass</span>
357 </div>
358 <div class="viewcode-block" id="ConfigResolutionError"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigResolutionError">[docs]</a><span class="k">class</span> <span class="nc">ConfigResolutionError</span><span class="p">(</span><span class="n">ConfigError</span><span class="p">):</span>
359     <span class="sd">&quot;&quot;&quot;</span>
360 <span class="sd">    This is the base class of exceptions raised due to semantic errors in</span>
361 <span class="sd">    configurations.</span>
362 <span class="sd">    &quot;&quot;&quot;</span>
363     <span class="k">pass</span>
364 </div>
365 <div class="viewcode-block" id="isWord"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.isWord">[docs]</a><span class="k">def</span> <span class="nf">isWord</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
366     <span class="sd">&quot;&quot;&quot;</span>
367 <span class="sd">    See if a passed-in value is an identifier. If the value passed in is not a</span>
368 <span class="sd">    string, False is returned. An identifier consists of alphanumerics or</span>
369 <span class="sd">    underscore characters.</span>
370
371 <span class="sd">    Examples::</span>
372
373 <span class="sd">        isWord(&#39;a word&#39;) -&gt;False</span>
374 <span class="sd">        isWord(&#39;award&#39;) -&gt; True</span>
375 <span class="sd">        isWord(9) -&gt; False</span>
376 <span class="sd">        isWord(&#39;a_b_c_&#39;) -&gt;True</span>
377
378 <span class="sd">    @note: isWord(&#39;9abc&#39;) will return True - not exactly correct, but adequate</span>
379 <span class="sd">    for the way it&#39;s used here.</span>
380
381 <span class="sd">    @param s: The name to be tested</span>
382 <span class="sd">    @type s: any</span>
383 <span class="sd">    @return: True if a word, else False</span>
384 <span class="sd">    @rtype: bool</span>
385 <span class="sd">    &quot;&quot;&quot;</span>
386     <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">type</span><span class="p">(</span><span class="s">&#39;&#39;</span><span class="p">):</span>
387         <span class="k">return</span> <span class="bp">False</span>
388     <span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;_&#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">)</span>
389     <span class="k">return</span> <span class="n">s</span><span class="o">.</span><span class="n">isalnum</span><span class="p">()</span>
390 </div>
391 <div class="viewcode-block" id="makePath"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.makePath">[docs]</a><span class="k">def</span> <span class="nf">makePath</span><span class="p">(</span><span class="n">prefix</span><span class="p">,</span> <span class="n">suffix</span><span class="p">):</span>
392     <span class="sd">&quot;&quot;&quot;\</span>
393 <span class="sd">    Make a path from a prefix and suffix.</span>
394
395 <span class="sd">    Examples:</span>
396 <span class="sd">    makePath(&#39;&#39;, &#39;suffix&#39;) -&gt; &#39;suffix&#39;</span>
397 <span class="sd">    makePath(&#39;prefix&#39;, &#39;suffix&#39;) -&gt; &#39;prefix.suffix&#39;</span>
398 <span class="sd">    makePath(&#39;prefix&#39;, &#39;[1]&#39;) -&gt; &#39;prefix[1]&#39;</span>
399
400 <span class="sd">    @param prefix: The prefix to use. If it evaluates as false, the suffix is returned.</span>
401 <span class="sd">    @type prefix: str</span>
402 <span class="sd">    @param suffix: The suffix to use. It is either an identifier or an index in brackets.</span>
403 <span class="sd">    @type suffix: str</span>
404 <span class="sd">    @return: The path concatenation of prefix and suffix, with adot if the suffix is not a bracketed index.</span>
405 <span class="sd">    @rtype: str</span>
406 <span class="sd">    &quot;&quot;&quot;</span>
407     <span class="k">if</span> <span class="ow">not</span> <span class="n">prefix</span><span class="p">:</span>
408         <span class="n">rv</span> <span class="o">=</span> <span class="n">suffix</span>
409     <span class="k">elif</span> <span class="n">suffix</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;[&#39;</span><span class="p">:</span>
410         <span class="n">rv</span> <span class="o">=</span> <span class="n">prefix</span> <span class="o">+</span> <span class="n">suffix</span>
411     <span class="k">else</span><span class="p">:</span>
412         <span class="n">rv</span> <span class="o">=</span> <span class="n">prefix</span> <span class="o">+</span> <span class="s">&#39;.&#39;</span> <span class="o">+</span> <span class="n">suffix</span>
413     <span class="k">return</span> <span class="n">rv</span>
414
415 </div>
416 <div class="viewcode-block" id="Container"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Container">[docs]</a><span class="k">class</span> <span class="nc">Container</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
417     <span class="sd">&quot;&quot;&quot;</span>
418 <span class="sd">    This internal class is the base class for mappings and sequences.</span>
419
420 <span class="sd">    @ivar path: A string which describes how to get</span>
421 <span class="sd">    to this instance from the root of the hierarchy.</span>
422
423 <span class="sd">    Example::</span>
424
425 <span class="sd">        a.list.of[1].or[&#39;more&#39;].elements</span>
426 <span class="sd">    &quot;&quot;&quot;</span>
427     <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parent</span><span class="p">):</span>
428         <span class="sd">&quot;&quot;&quot;</span>
429 <span class="sd">        Initialize an instance.</span>
430
431 <span class="sd">        @param parent: The parent of this instance in the hierarchy.</span>
432 <span class="sd">        @type parent: A L{Container} instance.</span>
433 <span class="sd">        &quot;&quot;&quot;</span>
434         <span class="nb">object</span><span class="o">.</span><span class="n">__setattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;parent&#39;</span><span class="p">,</span> <span class="n">parent</span><span class="p">)</span>
435
436 <div class="viewcode-block" id="Container.setPath"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Container.setPath">[docs]</a>    <span class="k">def</span> <span class="nf">setPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">):</span>
437         <span class="sd">&quot;&quot;&quot;</span>
438 <span class="sd">        Set the path for this instance.</span>
439 <span class="sd">        @param path: The path - a string which describes how to get</span>
440 <span class="sd">        to this instance from the root of the hierarchy.</span>
441 <span class="sd">        @type path: str</span>
442 <span class="sd">        &quot;&quot;&quot;</span>
443         <span class="nb">object</span><span class="o">.</span><span class="n">__setattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;path&#39;</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span>
444 </div>
445 <div class="viewcode-block" id="Container.evaluate"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Container.evaluate">[docs]</a>    <span class="k">def</span> <span class="nf">evaluate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">):</span>
446         <span class="sd">&quot;&quot;&quot;</span>
447 <span class="sd">        Evaluate items which are instances of L{Reference} or L{Expression}.</span>
448
449 <span class="sd">        L{Reference} instances are evaluated using L{Reference.resolve},</span>
450 <span class="sd">        and L{Expression} instances are evaluated using</span>
451 <span class="sd">        L{Expression.evaluate}.</span>
452
453 <span class="sd">        @param item: The item to be evaluated.</span>
454 <span class="sd">        @type item: any</span>
455 <span class="sd">        @return: If the item is an instance of L{Reference} or L{Expression},</span>
456 <span class="sd">        the evaluated value is returned, otherwise the item is returned</span>
457 <span class="sd">        unchanged.</span>
458 <span class="sd">        &quot;&quot;&quot;</span>
459         <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">Reference</span><span class="p">):</span>
460             <span class="n">item</span> <span class="o">=</span> <span class="n">item</span><span class="o">.</span><span class="n">resolve</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
461         <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">Expression</span><span class="p">):</span>
462             <span class="n">item</span> <span class="o">=</span> <span class="n">item</span><span class="o">.</span><span class="n">evaluate</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
463         <span class="k">return</span> <span class="n">item</span>
464 </div>
465 <div class="viewcode-block" id="Container.writeToStream"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Container.writeToStream">[docs]</a>    <span class="k">def</span> <span class="nf">writeToStream</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stream</span><span class="p">,</span> <span class="n">indent</span><span class="p">,</span> <span class="n">container</span><span class="p">):</span>
466         <span class="sd">&quot;&quot;&quot;</span>
467 <span class="sd">        Write this instance to a stream at the specified indentation level.</span>
468
469 <span class="sd">        Should be redefined in subclasses.</span>
470
471 <span class="sd">        @param stream: The stream to write to</span>
472 <span class="sd">        @type stream: A writable stream (file-like object)</span>
473 <span class="sd">        @param indent: The indentation level</span>
474 <span class="sd">        @type indent: int</span>
475 <span class="sd">        @param container: The container of this instance</span>
476 <span class="sd">        @type container: L{Container}</span>
477 <span class="sd">        @raise NotImplementedError: If a subclass does not override this</span>
478 <span class="sd">        &quot;&quot;&quot;</span>
479         <span class="k">raise</span> <span class="ne">NotImplementedError</span>
480 </div>
481 <div class="viewcode-block" id="Container.writeValue"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Container.writeValue">[docs]</a>    <span class="k">def</span> <span class="nf">writeValue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">stream</span><span class="p">,</span> <span class="n">indent</span><span class="p">):</span>
482         <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">Mapping</span><span class="p">):</span>
483             <span class="n">indstr</span> <span class="o">=</span> <span class="s">&#39; &#39;</span>
484         <span class="k">else</span><span class="p">:</span>
485             <span class="n">indstr</span> <span class="o">=</span> <span class="n">indent</span> <span class="o">*</span> <span class="s">&#39;  &#39;</span>
486         <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">Reference</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">Expression</span><span class="p">):</span>
487             <span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;</span><span class="si">%s%r%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">indstr</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">NEWLINE</span><span class="p">))</span>
488         <span class="k">else</span><span class="p">:</span>
489             <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span> <span class="c"># and not isWord(value):</span>
490                 <span class="n">value</span> <span class="o">=</span> <span class="nb">repr</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
491             <span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;</span><span class="si">%s%s%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">indstr</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">NEWLINE</span><span class="p">))</span>
492 </div></div>
493 <div class="viewcode-block" id="Mapping"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Mapping">[docs]</a><span class="k">class</span> <span class="nc">Mapping</span><span class="p">(</span><span class="n">Container</span><span class="p">):</span>
494     <span class="sd">&quot;&quot;&quot;</span>
495 <span class="sd">    This internal class implements key-value mappings in configurations.</span>
496 <span class="sd">    &quot;&quot;&quot;</span>
497
498     <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
499         <span class="sd">&quot;&quot;&quot;</span>
500 <span class="sd">        Initialize an instance.</span>
501
502 <span class="sd">        @param parent: The parent of this instance in the hierarchy.</span>
503 <span class="sd">        @type parent: A L{Container} instance.</span>
504 <span class="sd">        &quot;&quot;&quot;</span>
505         <span class="n">Container</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parent</span><span class="p">)</span>
506         <span class="nb">object</span><span class="o">.</span><span class="n">__setattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;path&#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">)</span>
507         <span class="nb">object</span><span class="o">.</span><span class="n">__setattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;data&#39;</span><span class="p">,</span> <span class="p">{})</span>
508         <span class="nb">object</span><span class="o">.</span><span class="n">__setattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;order&#39;</span><span class="p">,</span> <span class="p">[])</span>   <span class="c"># to preserve ordering</span>
509         <span class="nb">object</span><span class="o">.</span><span class="n">__setattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;comments&#39;</span><span class="p">,</span> <span class="p">{})</span>
510
511     <span class="k">def</span> <span class="nf">__delitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
512         <span class="sd">&quot;&quot;&quot;</span>
513 <span class="sd">        Remove an item</span>
514 <span class="sd">        &quot;&quot;&quot;</span>
515         <span class="n">data</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;data&#39;</span><span class="p">)</span>
516         <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
517             <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
518         <span class="n">order</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;order&#39;</span><span class="p">)</span>
519         <span class="n">comments</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;comments&#39;</span><span class="p">)</span>
520         <span class="k">del</span> <span class="n">data</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
521         <span class="n">order</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
522         <span class="k">del</span> <span class="n">comments</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
523
524     <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
525         <span class="n">data</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;data&#39;</span><span class="p">)</span>
526         <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
527             <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
528         <span class="n">rv</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
529         <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">evaluate</span><span class="p">(</span><span class="n">rv</span><span class="p">)</span>
530
531     <span class="n">__getattr__</span> <span class="o">=</span> <span class="n">__getitem__</span>
532     
533     <span class="sd">&#39;&#39;&#39;</span>
534 <span class="sd">    def __getattribute__(self, name):</span>
535 <span class="sd">        if name == &quot;__dict__&quot;:</span>
536 <span class="sd">            return {}</span>
537 <span class="sd">        if name in [&quot;__methods__&quot;, &quot;__members__&quot;]:</span>
538 <span class="sd">            return []</span>
539 <span class="sd">        #if name == &quot;__class__&quot;:</span>
540 <span class="sd">        #    return &#39;&#39;</span>
541 <span class="sd">        data = object.__getattribute__(self, &quot;data&quot;)</span>
542 <span class="sd">        useData = data.has_key(name)</span>
543 <span class="sd">        if useData:</span>
544 <span class="sd">            rv = getattr(data, name)</span>
545 <span class="sd">        else:</span>
546 <span class="sd">            rv = object.__getattribute__(self, name)</span>
547 <span class="sd">            if rv is None:</span>
548 <span class="sd">                raise AttributeError(name)</span>
549 <span class="sd">        return rv</span>
550 <span class="sd">    &#39;&#39;&#39;</span>
551
552 <div class="viewcode-block" id="Mapping.iteritems"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Mapping.iteritems">[docs]</a>    <span class="k">def</span> <span class="nf">iteritems</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
553         <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span>
554             <span class="k">yield</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">])</span>
555         <span class="k">raise</span> <span class="ne">StopIteration</span>
556 </div>
557     <span class="k">def</span> <span class="nf">__contains__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">):</span>
558         <span class="n">order</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;order&#39;</span><span class="p">)</span>
559         <span class="k">return</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">order</span>
560
561 <div class="viewcode-block" id="Mapping.addMapping"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Mapping.addMapping">[docs]</a>    <span class="k">def</span> <span class="nf">addMapping</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">comment</span><span class="p">,</span> <span class="n">setting</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
562         <span class="sd">&quot;&quot;&quot;</span>
563 <span class="sd">        Add a key-value mapping with a comment.</span>
564
565 <span class="sd">        @param key: The key for the mapping.</span>
566 <span class="sd">        @type key: str</span>
567 <span class="sd">        @param value: The value for the mapping.</span>
568 <span class="sd">        @type value: any</span>
569 <span class="sd">        @param comment: The comment for the key (can be None).</span>
570 <span class="sd">        @type comment: str</span>
571 <span class="sd">        @param setting: If True, ignore clashes. This is set</span>
572 <span class="sd">        to true when called from L{__setattr__}.</span>
573 <span class="sd">        @raise ConfigFormatError: If an existing key is seen</span>
574 <span class="sd">        again and setting is False.</span>
575 <span class="sd">        &quot;&quot;&quot;</span>
576         <span class="n">data</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;data&#39;</span><span class="p">)</span>
577         <span class="n">order</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;order&#39;</span><span class="p">)</span>
578         <span class="n">comments</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;comments&#39;</span><span class="p">)</span>
579
580         <span class="n">data</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
581         <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">order</span><span class="p">:</span>
582             <span class="n">order</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
583         <span class="k">elif</span> <span class="ow">not</span> <span class="n">setting</span><span class="p">:</span>
584             <span class="k">raise</span> <span class="n">ConfigFormatError</span><span class="p">(</span><span class="s">&quot;repeated key: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">key</span><span class="p">)</span>
585         <span class="n">comments</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">comment</span>
586 </div>
587     <span class="k">def</span> <span class="nf">__setattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
588         <span class="bp">self</span><span class="o">.</span><span class="n">addMapping</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span>
589
590     <span class="n">__setitem__</span> <span class="o">=</span> <span class="n">__setattr__</span>
591
592 <div class="viewcode-block" id="Mapping.keys"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Mapping.keys">[docs]</a>    <span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
593         <span class="sd">&quot;&quot;&quot;</span>
594 <span class="sd">        Return the keys in a similar way to a dictionary.</span>
595 <span class="sd">        &quot;&quot;&quot;</span>
596         <span class="k">return</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;order&#39;</span><span class="p">)</span>
597 </div>
598 <div class="viewcode-block" id="Mapping.get"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Mapping.get">[docs]</a>    <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
599         <span class="sd">&quot;&quot;&quot;</span>
600 <span class="sd">        Allows a dictionary-style get operation.</span>
601 <span class="sd">        &quot;&quot;&quot;</span>
602         <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
603             <span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
604         <span class="k">return</span> <span class="n">default</span>
605 </div>
606     <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
607         <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;data&#39;</span><span class="p">))</span>
608
609     <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
610         <span class="k">return</span> <span class="nb">repr</span><span class="p">(</span><span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;data&#39;</span><span class="p">))</span>
611
612     <span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
613         <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;order&#39;</span><span class="p">))</span>
614
615     <span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
616         <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">iterkeys</span><span class="p">()</span>
617
618 <div class="viewcode-block" id="Mapping.iterkeys"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Mapping.iterkeys">[docs]</a>    <span class="k">def</span> <span class="nf">iterkeys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
619         <span class="n">order</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;order&#39;</span><span class="p">)</span>
620         <span class="k">return</span> <span class="n">order</span><span class="o">.</span><span class="n">__iter__</span><span class="p">()</span>
621 </div>
622 <div class="viewcode-block" id="Mapping.writeToStream"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Mapping.writeToStream">[docs]</a>    <span class="k">def</span> <span class="nf">writeToStream</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stream</span><span class="p">,</span> <span class="n">indent</span><span class="p">,</span> <span class="n">container</span><span class="p">):</span>
623         <span class="sd">&quot;&quot;&quot;</span>
624 <span class="sd">        Write this instance to a stream at the specified indentation level.</span>
625
626 <span class="sd">        Should be redefined in subclasses.</span>
627
628 <span class="sd">        @param stream: The stream to write to</span>
629 <span class="sd">        @type stream: A writable stream (file-like object)</span>
630 <span class="sd">        @param indent: The indentation level</span>
631 <span class="sd">        @type indent: int</span>
632 <span class="sd">        @param container: The container of this instance</span>
633 <span class="sd">        @type container: L{Container}</span>
634 <span class="sd">        &quot;&quot;&quot;</span>
635         <span class="n">indstr</span> <span class="o">=</span> <span class="n">indent</span> <span class="o">*</span> <span class="s">&#39;  &#39;</span>
636         <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
637             <span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39; { }</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">NEWLINE</span><span class="p">)</span>
638         <span class="k">else</span><span class="p">:</span>
639             <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">container</span><span class="p">,</span> <span class="n">Mapping</span><span class="p">):</span>
640                 <span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">NEWLINE</span><span class="p">)</span>
641             <span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;</span><span class="si">%s</span><span class="s">{</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">indstr</span><span class="p">,</span> <span class="n">NEWLINE</span><span class="p">))</span>
642             <span class="bp">self</span><span class="o">.</span><span class="n">__save__</span><span class="p">(</span><span class="n">stream</span><span class="p">,</span> <span class="n">indent</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
643             <span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;</span><span class="si">%s</span><span class="s">}</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">indstr</span><span class="p">,</span> <span class="n">NEWLINE</span><span class="p">))</span>
644 </div>
645     <span class="k">def</span> <span class="nf">__save__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stream</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
646         <span class="sd">&quot;&quot;&quot;</span>
647 <span class="sd">        Save this configuration to the specified stream.</span>
648 <span class="sd">        @param stream: A stream to which the configuration is written.</span>
649 <span class="sd">        @type stream: A write-only stream (file-like object).</span>
650 <span class="sd">        @param indent: The indentation level for the output.</span>
651 <span class="sd">        @type indent: int</span>
652 <span class="sd">        &quot;&quot;&quot;</span>
653         <span class="n">indstr</span> <span class="o">=</span> <span class="n">indent</span> <span class="o">*</span> <span class="s">&#39;  &#39;</span>
654         <span class="n">order</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;order&#39;</span><span class="p">)</span>
655         <span class="n">data</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;data&#39;</span><span class="p">)</span>
656         <span class="n">maxlen</span> <span class="o">=</span> <span class="mi">0</span> <span class="c"># max(map(lambda x: len(x), order))</span>
657         <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">order</span><span class="p">:</span>
658             <span class="n">comment</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">comments</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
659             <span class="k">if</span> <span class="n">isWord</span><span class="p">(</span><span class="n">key</span><span class="p">):</span>
660                 <span class="n">skey</span> <span class="o">=</span> <span class="n">key</span>
661             <span class="k">else</span><span class="p">:</span>
662                 <span class="n">skey</span> <span class="o">=</span> <span class="nb">repr</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
663             <span class="k">if</span> <span class="n">comment</span><span class="p">:</span>
664                 <span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;</span><span class="si">%s</span><span class="s">#</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">indstr</span><span class="p">,</span> <span class="n">comment</span><span class="p">))</span>
665             <span class="k">if</span> <span class="n">skey</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&quot;u&#39;&quot;</span><span class="p">):</span>
666                 <span class="n">skey</span> <span class="o">=</span> <span class="n">skey</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
667             <span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;</span><span class="si">%s%-*s</span><span class="s"> :&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">indstr</span><span class="p">,</span> <span class="n">maxlen</span><span class="p">,</span> <span class="n">skey</span><span class="p">))</span>
668             <span class="n">value</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
669             <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">Container</span><span class="p">):</span>
670                 <span class="n">value</span><span class="o">.</span><span class="n">writeToStream</span><span class="p">(</span><span class="n">stream</span><span class="p">,</span> <span class="n">indent</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
671             <span class="k">else</span><span class="p">:</span>
672                 <span class="bp">self</span><span class="o">.</span><span class="n">writeValue</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">stream</span><span class="p">,</span> <span class="n">indent</span><span class="p">)</span>
673 </div>
674 <div class="viewcode-block" id="Config"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Config">[docs]</a><span class="k">class</span> <span class="nc">Config</span><span class="p">(</span><span class="n">Mapping</span><span class="p">):</span>
675     <span class="sd">&quot;&quot;&quot;</span>
676 <span class="sd">    This class represents a configuration, and is the only one which clients</span>
677 <span class="sd">    need to interface to, under normal circumstances.</span>
678 <span class="sd">    &quot;&quot;&quot;</span>
679
680 <div class="viewcode-block" id="Config.Namespace"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Config.Namespace">[docs]</a>    <span class="k">class</span> <span class="nc">Namespace</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
681         <span class="sd">&quot;&quot;&quot;</span>
682 <span class="sd">        This internal class is used for implementing default namespaces.</span>
683
684 <span class="sd">        An instance acts as a namespace.</span>
685 <span class="sd">        &quot;&quot;&quot;</span>
686         <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
687             <span class="bp">self</span><span class="o">.</span><span class="n">sys</span> <span class="o">=</span> <span class="n">sys</span>
688             <span class="bp">self</span><span class="o">.</span><span class="n">os</span> <span class="o">=</span> <span class="n">os</span>
689 </div>
690     <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">streamOrFile</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">PWD</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
691         <span class="sd">&quot;&quot;&quot;</span>
692 <span class="sd">        Initializes an instance.</span>
693
694 <span class="sd">        @param streamOrFile: If specified, causes this instance to be loaded</span>
695 <span class="sd">        from the stream (by calling L{load}). If a string is provided, it is</span>
696 <span class="sd">        passed to L{streamOpener} to open a stream. Otherwise, the passed</span>
697 <span class="sd">        value is assumed to be a stream and used as is.</span>
698 <span class="sd">        @type streamOrFile: A readable stream (file-like object) or a name.</span>
699 <span class="sd">        @param parent: If specified, this becomes the parent of this instance</span>
700 <span class="sd">        in the configuration hierarchy.</span>
701 <span class="sd">        @type parent: a L{Container} instance.</span>
702 <span class="sd">        &quot;&quot;&quot;</span>
703         <span class="k">try</span><span class="p">:</span> <span class="c"># Python 3 compatibility</span>
704             <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">streamOrFile</span><span class="p">,</span> <span class="nb">unicode</span><span class="p">):</span>
705                 <span class="n">streamOrFile</span> <span class="o">=</span> <span class="n">streamOrFile</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span>
706         <span class="k">except</span> <span class="ne">NameError</span><span class="p">:</span>
707             <span class="k">pass</span>
708         <span class="n">Mapping</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parent</span><span class="p">)</span>
709         <span class="nb">object</span><span class="o">.</span><span class="n">__setattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;reader&#39;</span><span class="p">,</span> <span class="n">ConfigReader</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
710         <span class="nb">object</span><span class="o">.</span><span class="n">__setattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;namespaces&#39;</span><span class="p">,</span> <span class="p">[</span><span class="n">Config</span><span class="o">.</span><span class="n">Namespace</span><span class="p">()])</span>
711         <span class="k">if</span> <span class="n">streamOrFile</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
712             <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">streamOrFile</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">streamOrFile</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">):</span>
713                 <span class="k">global</span> <span class="n">streamOpener</span>
714                 <span class="k">if</span> <span class="n">streamOpener</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
715                     <span class="n">streamOpener</span> <span class="o">=</span> <span class="n">defaultStreamOpener</span>
716                 <span class="n">streamOrFile</span> <span class="o">=</span> <span class="n">streamOpener</span><span class="p">(</span><span class="n">streamOrFile</span><span class="p">)</span>
717             <span class="n">load</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&quot;load&quot;</span><span class="p">)</span>
718             <span class="n">load</span><span class="p">(</span><span class="n">streamOrFile</span><span class="p">)</span>
719             <span class="c"># Specific add for salomeTools : PWD</span>
720             <span class="k">if</span> <span class="n">PWD</span><span class="p">:</span>
721                 <span class="n">key</span><span class="p">,</span> <span class="n">pwd</span> <span class="o">=</span> <span class="n">PWD</span>
722                 <span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="s">&quot;&quot;</span><span class="p">:</span>
723                     <span class="bp">self</span><span class="o">.</span><span class="n">PWD</span> <span class="o">=</span> <span class="n">pwd</span>
724                 <span class="k">else</span><span class="p">:</span>
725                     <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span><span class="o">.</span><span class="n">PWD</span> <span class="o">=</span> <span class="n">pwd</span>
726
727 <div class="viewcode-block" id="Config.load"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Config.load">[docs]</a>    <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stream</span><span class="p">):</span>
728         <span class="sd">&quot;&quot;&quot;</span>
729 <span class="sd">        Load the configuration from the specified stream. Multiple streams can</span>
730 <span class="sd">        be used to populate the same instance, as long as there are no</span>
731 <span class="sd">        clashing keys. The stream is closed.</span>
732 <span class="sd">        @param stream: A stream from which the configuration is read.</span>
733 <span class="sd">        @type stream: A read-only stream (file-like object).</span>
734 <span class="sd">        @raise ConfigError: if keys in the loaded configuration clash with</span>
735 <span class="sd">        existing keys.</span>
736 <span class="sd">        @raise ConfigFormatError: if there is a syntax error in the stream.</span>
737 <span class="sd">        &quot;&quot;&quot;</span>
738         <span class="n">reader</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;reader&#39;</span><span class="p">)</span>
739         <span class="n">reader</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
740         <span class="n">stream</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
741 </div>
742 <div class="viewcode-block" id="Config.addNamespace"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Config.addNamespace">[docs]</a>    <span class="k">def</span> <span class="nf">addNamespace</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ns</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
743         <span class="sd">&quot;&quot;&quot;</span>
744 <span class="sd">        Add a namespace to this configuration which can be used to evaluate</span>
745 <span class="sd">        (resolve) dotted-identifier expressions.</span>
746 <span class="sd">        @param ns: The namespace to be added.</span>
747 <span class="sd">        @type ns: A module or other namespace suitable for passing as an</span>
748 <span class="sd">        argument to vars().</span>
749 <span class="sd">        @param name: A name for the namespace, which, if specified, provides</span>
750 <span class="sd">        an additional level of indirection.</span>
751 <span class="sd">        @type name: str</span>
752 <span class="sd">        &quot;&quot;&quot;</span>
753         <span class="n">namespaces</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;namespaces&#39;</span><span class="p">)</span>
754         <span class="k">if</span> <span class="n">name</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
755             <span class="n">namespaces</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">ns</span><span class="p">)</span>
756         <span class="k">else</span><span class="p">:</span>
757             <span class="nb">setattr</span><span class="p">(</span><span class="n">namespaces</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">name</span><span class="p">,</span> <span class="n">ns</span><span class="p">)</span>
758 </div>
759 <div class="viewcode-block" id="Config.removeNamespace"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Config.removeNamespace">[docs]</a>    <span class="k">def</span> <span class="nf">removeNamespace</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ns</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
760         <span class="sd">&quot;&quot;&quot;</span>
761 <span class="sd">        Remove a namespace added with L{addNamespace}.</span>
762 <span class="sd">        @param ns: The namespace to be removed.</span>
763 <span class="sd">        @param name: The name which was specified when L{addNamespace} was</span>
764 <span class="sd">        called.</span>
765 <span class="sd">        @type name: str</span>
766 <span class="sd">        &quot;&quot;&quot;</span>
767         <span class="n">namespaces</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;namespaces&#39;</span><span class="p">)</span>
768         <span class="k">if</span> <span class="n">name</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
769             <span class="n">namespaces</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">ns</span><span class="p">)</span>
770         <span class="k">else</span><span class="p">:</span>
771             <span class="nb">delattr</span><span class="p">(</span><span class="n">namespaces</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">name</span><span class="p">)</span>
772 </div>
773     <span class="k">def</span> <span class="nf">__save__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stream</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">no_close</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
774         <span class="sd">&quot;&quot;&quot;</span>
775 <span class="sd">        Save this configuration to the specified stream. The stream is</span>
776 <span class="sd">        closed if this is the top-level configuration in the hierarchy.</span>
777 <span class="sd">        L{Mapping.__save__} is called to do all the work.</span>
778 <span class="sd">        @param stream: A stream to which the configuration is written.</span>
779 <span class="sd">        @type stream: A write-only stream (file-like object).</span>
780 <span class="sd">        @param indent: The indentation level for the output.</span>
781 <span class="sd">        @type indent: int</span>
782 <span class="sd">        &quot;&quot;&quot;</span>
783         <span class="n">Mapping</span><span class="o">.</span><span class="n">__save__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stream</span><span class="p">,</span> <span class="n">indent</span><span class="p">)</span>
784         <span class="k">if</span> <span class="n">indent</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">no_close</span><span class="p">:</span>
785             <span class="n">stream</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
786
787 <div class="viewcode-block" id="Config.getByPath"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Config.getByPath">[docs]</a>    <span class="k">def</span> <span class="nf">getByPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">):</span>
788         <span class="sd">&quot;&quot;&quot;</span>
789 <span class="sd">        Obtain a value in the configuration via its path.</span>
790 <span class="sd">        @param path: The path of the required value</span>
791 <span class="sd">        @type path: str</span>
792 <span class="sd">        @return the value at the specified path.</span>
793 <span class="sd">        @rtype: any</span>
794 <span class="sd">        @raise ConfigError: If the path is invalid</span>
795 <span class="sd">        &quot;&quot;&quot;</span>
796         <span class="n">s</span> <span class="o">=</span> <span class="s">&#39;self.&#39;</span> <span class="o">+</span> <span class="n">path</span>
797         <span class="k">try</span><span class="p">:</span>
798             <span class="k">return</span> <span class="nb">eval</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
799         <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
800             <span class="k">raise</span> <span class="n">ConfigError</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
801 </div></div>
802 <div class="viewcode-block" id="Sequence"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Sequence">[docs]</a><span class="k">class</span> <span class="nc">Sequence</span><span class="p">(</span><span class="n">Container</span><span class="p">):</span>
803     <span class="sd">&quot;&quot;&quot;</span>
804 <span class="sd">    This internal class implements a value which is a sequence of other values.</span>
805 <span class="sd">    &quot;&quot;&quot;</span>
806 <div class="viewcode-block" id="Sequence.SeqIter"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Sequence.SeqIter">[docs]</a>    <span class="k">class</span> <span class="nc">SeqIter</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
807         <span class="sd">&quot;&quot;&quot;</span>
808 <span class="sd">        This internal class implements an iterator for a L{Sequence} instance.</span>
809 <span class="sd">        &quot;&quot;&quot;</span>
810         <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">seq</span><span class="p">):</span>
811             <span class="bp">self</span><span class="o">.</span><span class="n">seq</span> <span class="o">=</span> <span class="n">seq</span>
812             <span class="bp">self</span><span class="o">.</span><span class="n">limit</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="n">seq</span><span class="p">,</span> <span class="s">&#39;data&#39;</span><span class="p">))</span>
813             <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">=</span> <span class="mi">0</span>
814
815         <span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
816             <span class="k">return</span> <span class="bp">self</span>
817
818 <div class="viewcode-block" id="Sequence.SeqIter.next"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Sequence.SeqIter.next">[docs]</a>        <span class="k">def</span> <span class="nf">next</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
819             <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">&gt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">limit</span><span class="p">:</span>
820                 <span class="k">raise</span> <span class="ne">StopIteration</span>
821             <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">seq</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">index</span><span class="p">]</span>
822             <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">+=</span> <span class="mi">1</span>
823             <span class="k">return</span> <span class="n">rv</span>
824         
825         <span class="c"># This method is for python3 compatibility</span></div>
826         <span class="k">def</span> <span class="nf">__next__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> 
827             <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">&gt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">limit</span><span class="p">:</span>
828                 <span class="k">raise</span> <span class="ne">StopIteration</span>
829             <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">seq</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">index</span><span class="p">]</span>
830             <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">+=</span> <span class="mi">1</span>
831             <span class="k">return</span> <span class="n">rv</span>
832 </div>
833     <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
834         <span class="sd">&quot;&quot;&quot;</span>
835 <span class="sd">        Initialize an instance.</span>
836
837 <span class="sd">        @param parent: The parent of this instance in the hierarchy.</span>
838 <span class="sd">        @type parent: A L{Container} instance.</span>
839 <span class="sd">        &quot;&quot;&quot;</span>
840         <span class="n">Container</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parent</span><span class="p">)</span>
841         <span class="nb">object</span><span class="o">.</span><span class="n">__setattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;data&#39;</span><span class="p">,</span> <span class="p">[])</span>
842         <span class="nb">object</span><span class="o">.</span><span class="n">__setattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;comments&#39;</span><span class="p">,</span> <span class="p">[])</span>
843
844 <div class="viewcode-block" id="Sequence.append"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Sequence.append">[docs]</a>    <span class="k">def</span> <span class="nf">append</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">,</span> <span class="n">comment</span><span class="p">):</span>
845         <span class="sd">&quot;&quot;&quot;</span>
846 <span class="sd">        Add an item to the sequence.</span>
847
848 <span class="sd">        @param item: The item to add.</span>
849 <span class="sd">        @type item: any</span>
850 <span class="sd">        @param comment: A comment for the item.</span>
851 <span class="sd">        @type comment: str</span>
852 <span class="sd">        &quot;&quot;&quot;</span>
853         <span class="n">data</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;data&#39;</span><span class="p">)</span>
854         <span class="n">comments</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;comments&#39;</span><span class="p">)</span>
855         <span class="n">data</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
856         <span class="n">comments</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">comment</span><span class="p">)</span>
857 </div>
858     <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span>
859         <span class="n">data</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;data&#39;</span><span class="p">)</span>
860         <span class="k">try</span><span class="p">:</span>
861             <span class="n">rv</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
862         <span class="k">except</span> <span class="p">(</span><span class="ne">IndexError</span><span class="p">,</span> <span class="ne">KeyError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">):</span>
863             <span class="k">raise</span> <span class="n">ConfigResolutionError</span><span class="p">(</span><span class="s">&#39;</span><span class="si">%r</span><span class="s"> is not a valid index for </span><span class="si">%r</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;path&#39;</span><span class="p">)))</span>
864         <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">rv</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
865             <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">evaluate</span><span class="p">(</span><span class="n">rv</span><span class="p">)</span>
866         <span class="k">else</span><span class="p">:</span>
867             <span class="c"># deal with a slice</span>
868             <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
869             <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">rv</span><span class="p">:</span>
870                 <span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">evaluate</span><span class="p">(</span><span class="n">a</span><span class="p">))</span>
871             <span class="n">rv</span> <span class="o">=</span> <span class="n">result</span>
872         <span class="k">return</span> <span class="n">rv</span>
873
874     <span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
875         <span class="k">return</span> <span class="n">Sequence</span><span class="o">.</span><span class="n">SeqIter</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
876
877     <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
878         <span class="k">return</span> <span class="nb">repr</span><span class="p">(</span><span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;data&#39;</span><span class="p">))</span>
879
880     <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
881         <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">[:])</span> <span class="c"># using the slice evaluates the contents</span>
882
883     <span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
884         <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;data&#39;</span><span class="p">))</span>
885
886 <div class="viewcode-block" id="Sequence.writeToStream"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Sequence.writeToStream">[docs]</a>    <span class="k">def</span> <span class="nf">writeToStream</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stream</span><span class="p">,</span> <span class="n">indent</span><span class="p">,</span> <span class="n">container</span><span class="p">):</span>
887         <span class="sd">&quot;&quot;&quot;</span>
888 <span class="sd">        Write this instance to a stream at the specified indentation level.</span>
889
890 <span class="sd">        Should be redefined in subclasses.</span>
891
892 <span class="sd">        @param stream: The stream to write to</span>
893 <span class="sd">        @type stream: A writable stream (file-like object)</span>
894 <span class="sd">        @param indent: The indentation level</span>
895 <span class="sd">        @type indent: int</span>
896 <span class="sd">        @param container: The container of this instance</span>
897 <span class="sd">        @type container: L{Container}</span>
898 <span class="sd">        &quot;&quot;&quot;</span>
899         <span class="n">indstr</span> <span class="o">=</span> <span class="n">indent</span> <span class="o">*</span> <span class="s">&#39;  &#39;</span>
900         <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
901             <span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39; [ ]</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">NEWLINE</span><span class="p">)</span>
902         <span class="k">else</span><span class="p">:</span>
903             <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">container</span><span class="p">,</span> <span class="n">Mapping</span><span class="p">):</span>
904                 <span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">NEWLINE</span><span class="p">)</span>
905             <span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;</span><span class="si">%s</span><span class="s">[</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">indstr</span><span class="p">,</span> <span class="n">NEWLINE</span><span class="p">))</span>
906             <span class="bp">self</span><span class="o">.</span><span class="n">__save__</span><span class="p">(</span><span class="n">stream</span><span class="p">,</span> <span class="n">indent</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
907             <span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;</span><span class="si">%s</span><span class="s">]</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">indstr</span><span class="p">,</span> <span class="n">NEWLINE</span><span class="p">))</span>
908 </div>
909     <span class="k">def</span> <span class="nf">__save__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stream</span><span class="p">,</span> <span class="n">indent</span><span class="p">):</span>
910         <span class="sd">&quot;&quot;&quot;</span>
911 <span class="sd">        Save this instance to the specified stream.</span>
912 <span class="sd">        @param stream: A stream to which the configuration is written.</span>
913 <span class="sd">        @type stream: A write-only stream (file-like object).</span>
914 <span class="sd">        @param indent: The indentation level for the output, &gt; 0</span>
915 <span class="sd">        @type indent: int</span>
916 <span class="sd">        &quot;&quot;&quot;</span>
917         <span class="k">if</span> <span class="n">indent</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
918             <span class="k">raise</span> <span class="n">ConfigError</span><span class="p">(</span><span class="s">&quot;sequence cannot be saved as a top-level item&quot;</span><span class="p">)</span>
919         <span class="n">data</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;data&#39;</span><span class="p">)</span>
920         <span class="n">comments</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;comments&#39;</span><span class="p">)</span>
921         <span class="n">indstr</span> <span class="o">=</span> <span class="n">indent</span> <span class="o">*</span> <span class="s">&#39;  &#39;</span>
922         <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)):</span>
923             <span class="n">value</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
924             <span class="n">comment</span> <span class="o">=</span> <span class="n">comments</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
925             <span class="k">if</span> <span class="n">comment</span><span class="p">:</span>
926                 <span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;</span><span class="si">%s</span><span class="s">#</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">indstr</span><span class="p">,</span> <span class="n">comment</span><span class="p">))</span>
927             <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">Container</span><span class="p">):</span>
928                 <span class="n">value</span><span class="o">.</span><span class="n">writeToStream</span><span class="p">(</span><span class="n">stream</span><span class="p">,</span> <span class="n">indent</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
929             <span class="k">else</span><span class="p">:</span>
930                 <span class="bp">self</span><span class="o">.</span><span class="n">writeValue</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">stream</span><span class="p">,</span> <span class="n">indent</span><span class="p">)</span>
931 </div>
932 <div class="viewcode-block" id="Reference"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Reference">[docs]</a><span class="k">class</span> <span class="nc">Reference</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
933     <span class="sd">&quot;&quot;&quot;</span>
934 <span class="sd">    This internal class implements a value which is a reference to another value.</span>
935 <span class="sd">    &quot;&quot;&quot;</span>
936     <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">config</span><span class="p">,</span> <span class="nb">type</span><span class="p">,</span> <span class="n">ident</span><span class="p">):</span>
937         <span class="sd">&quot;&quot;&quot;</span>
938 <span class="sd">        Initialize an instance.</span>
939
940 <span class="sd">        @param config: The configuration which contains this reference.</span>
941 <span class="sd">        @type config: A L{Config} instance.</span>
942 <span class="sd">        @param type: The type of reference.</span>
943 <span class="sd">        @type type: BACKTICK or DOLLAR</span>
944 <span class="sd">        @param ident: The identifier which starts the reference.</span>
945 <span class="sd">        @type ident: str</span>
946 <span class="sd">        &quot;&quot;&quot;</span>
947         <span class="bp">self</span><span class="o">.</span><span class="n">config</span> <span class="o">=</span> <span class="n">config</span>
948         <span class="bp">self</span><span class="o">.</span><span class="n">type</span> <span class="o">=</span> <span class="nb">type</span>
949         <span class="bp">self</span><span class="o">.</span><span class="n">elements</span> <span class="o">=</span> <span class="p">[</span><span class="n">ident</span><span class="p">]</span>
950
951 <div class="viewcode-block" id="Reference.addElement"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Reference.addElement">[docs]</a>    <span class="k">def</span> <span class="nf">addElement</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">type</span><span class="p">,</span> <span class="n">ident</span><span class="p">):</span>
952         <span class="sd">&quot;&quot;&quot;</span>
953 <span class="sd">        Add an element to the reference.</span>
954
955 <span class="sd">        @param type: The type of reference.</span>
956 <span class="sd">        @type type: BACKTICK or DOLLAR</span>
957 <span class="sd">        @param ident: The identifier which continues the reference.</span>
958 <span class="sd">        @type ident: str</span>
959 <span class="sd">        &quot;&quot;&quot;</span>
960         <span class="bp">self</span><span class="o">.</span><span class="n">elements</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="nb">type</span><span class="p">,</span> <span class="n">ident</span><span class="p">))</span>
961 </div>
962 <div class="viewcode-block" id="Reference.findConfig"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Reference.findConfig">[docs]</a>    <span class="k">def</span> <span class="nf">findConfig</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">container</span><span class="p">):</span>
963         <span class="sd">&quot;&quot;&quot;</span>
964 <span class="sd">        Find the closest enclosing configuration to the specified container.</span>
965
966 <span class="sd">        @param container: The container to start from.</span>
967 <span class="sd">        @type container: L{Container}</span>
968 <span class="sd">        @return: The closest enclosing configuration, or None.</span>
969 <span class="sd">        @rtype: L{Config}</span>
970 <span class="sd">        &quot;&quot;&quot;</span>
971         <span class="k">while</span> <span class="p">(</span><span class="n">container</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">container</span><span class="p">,</span> <span class="n">Config</span><span class="p">):</span>
972             <span class="n">container</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="n">container</span><span class="p">,</span> <span class="s">&#39;parent&#39;</span><span class="p">)</span>
973         <span class="k">return</span> <span class="n">container</span>
974 </div>
975 <div class="viewcode-block" id="Reference.resolve"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Reference.resolve">[docs]</a>    <span class="k">def</span> <span class="nf">resolve</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">container</span><span class="p">):</span>
976         <span class="sd">&quot;&quot;&quot;</span>
977 <span class="sd">        Resolve this instance in the context of a container.</span>
978
979 <span class="sd">        @param container: The container to resolve from.</span>
980 <span class="sd">        @type container: L{Container}</span>
981 <span class="sd">        @return: The resolved value.</span>
982 <span class="sd">        @rtype: any</span>
983 <span class="sd">        @raise ConfigResolutionError: If resolution fails.</span>
984 <span class="sd">        &quot;&quot;&quot;</span>
985         <span class="n">rv</span> <span class="o">=</span> <span class="bp">None</span>
986         <span class="n">path</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="n">container</span><span class="p">,</span> <span class="s">&#39;path&#39;</span><span class="p">)</span>
987         <span class="n">current</span> <span class="o">=</span> <span class="n">container</span>
988         <span class="k">while</span> <span class="n">current</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
989             <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="n">BACKTICK</span><span class="p">:</span>
990                 <span class="n">namespaces</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="n">current</span><span class="p">,</span> <span class="s">&#39;namespaces&#39;</span><span class="p">)</span>
991                 <span class="n">found</span> <span class="o">=</span> <span class="bp">False</span>
992                 <span class="k">for</span> <span class="n">ns</span> <span class="ow">in</span> <span class="n">namespaces</span><span class="p">:</span>
993                     <span class="k">try</span><span class="p">:</span>
994                         <span class="n">rv</span> <span class="o">=</span> <span class="nb">eval</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">)[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="nb">vars</span><span class="p">(</span><span class="n">ns</span><span class="p">))</span>
995                         <span class="n">found</span> <span class="o">=</span> <span class="bp">True</span>
996                         <span class="k">break</span>
997                     <span class="k">except</span><span class="p">:</span>
998                         <span class="k">pass</span>
999                 <span class="k">if</span> <span class="n">found</span><span class="p">:</span>
1000                     <span class="k">break</span>
1001             <span class="k">else</span><span class="p">:</span>
1002                 <span class="n">key</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">elements</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
1003                 <span class="k">try</span><span class="p">:</span>
1004                     <span class="n">rv</span> <span class="o">=</span> <span class="n">current</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
1005                     <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">elements</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
1006                         <span class="n">key</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
1007                         <span class="n">rv</span> <span class="o">=</span> <span class="n">rv</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
1008                     <span class="k">break</span>
1009                 <span class="k">except</span><span class="p">:</span>
1010                     <span class="n">rv</span> <span class="o">=</span> <span class="bp">None</span>
1011                     <span class="k">pass</span>
1012             <span class="n">current</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="n">current</span><span class="p">,</span> <span class="s">&#39;parent&#39;</span><span class="p">)</span>
1013         <span class="k">if</span> <span class="n">current</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
1014             <span class="k">raise</span> <span class="n">ConfigResolutionError</span><span class="p">(</span><span class="s">&quot;unable to evaluate </span><span class="si">%r</span><span class="s"> in the configuration </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">))</span>
1015         <span class="k">return</span> <span class="n">rv</span>
1016 </div>
1017     <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
1018         <span class="n">s</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">elements</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
1019         <span class="k">for</span> <span class="n">tt</span><span class="p">,</span> <span class="n">tv</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">elements</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
1020             <span class="k">if</span> <span class="n">tt</span> <span class="o">==</span> <span class="n">DOT</span><span class="p">:</span>
1021                 <span class="n">s</span> <span class="o">+=</span> <span class="s">&#39;.</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">tv</span>
1022             <span class="k">else</span><span class="p">:</span>
1023                 <span class="n">s</span> <span class="o">+=</span> <span class="s">&#39;[</span><span class="si">%r</span><span class="s">]&#39;</span> <span class="o">%</span> <span class="n">tv</span>
1024         <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="n">BACKTICK</span><span class="p">:</span>
1025             <span class="k">return</span> <span class="n">BACKTICK</span> <span class="o">+</span> <span class="n">s</span> <span class="o">+</span> <span class="n">BACKTICK</span>
1026         <span class="k">else</span><span class="p">:</span>
1027             <span class="k">return</span> <span class="n">DOLLAR</span> <span class="o">+</span> <span class="n">s</span>
1028
1029     <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
1030         <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__str__</span><span class="p">()</span>
1031 </div>
1032 <div class="viewcode-block" id="Expression"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Expression">[docs]</a><span class="k">class</span> <span class="nc">Expression</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
1033     <span class="sd">&quot;&quot;&quot;</span>
1034 <span class="sd">    This internal class implements a value which is obtained by evaluating an expression.</span>
1035 <span class="sd">    &quot;&quot;&quot;</span>
1036     <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">op</span><span class="p">,</span> <span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span><span class="p">):</span>
1037         <span class="sd">&quot;&quot;&quot;</span>
1038 <span class="sd">        Initialize an instance.</span>
1039
1040 <span class="sd">        @param op: the operation expressed in the expression.</span>
1041 <span class="sd">        @type op: PLUS, MINUS, STAR, SLASH, MOD</span>
1042 <span class="sd">        @param lhs: the left-hand-side operand of the expression.</span>
1043 <span class="sd">        @type lhs: any Expression or primary value.</span>
1044 <span class="sd">        @param rhs: the right-hand-side operand of the expression.</span>
1045 <span class="sd">        @type rhs: any Expression or primary value.</span>
1046 <span class="sd">        &quot;&quot;&quot;</span>
1047         <span class="bp">self</span><span class="o">.</span><span class="n">op</span> <span class="o">=</span> <span class="n">op</span>
1048         <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span> <span class="o">=</span> <span class="n">lhs</span>
1049         <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span> <span class="o">=</span> <span class="n">rhs</span>
1050
1051     <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
1052         <span class="k">return</span> <span class="s">&#39;</span><span class="si">%r</span><span class="s"> </span><span class="si">%s</span><span class="s"> </span><span class="si">%r</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">op</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">)</span>
1053
1054     <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
1055         <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__str__</span><span class="p">()</span>
1056
1057 <div class="viewcode-block" id="Expression.evaluate"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.Expression.evaluate">[docs]</a>    <span class="k">def</span> <span class="nf">evaluate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">container</span><span class="p">):</span>
1058         <span class="sd">&quot;&quot;&quot;</span>
1059 <span class="sd">        Evaluate this instance in the context of a container.</span>
1060
1061 <span class="sd">        @param container: The container to evaluate in from.</span>
1062 <span class="sd">        @type container: L{Container}</span>
1063 <span class="sd">        @return: The evaluated value.</span>
1064 <span class="sd">        @rtype: any</span>
1065 <span class="sd">        @raise ConfigResolutionError: If evaluation fails.</span>
1066 <span class="sd">        @raise ZeroDivideError: If division by zero occurs.</span>
1067 <span class="sd">        @raise TypeError: If the operation is invalid, e.g.</span>
1068 <span class="sd">        subtracting one string from another.</span>
1069 <span class="sd">        &quot;&quot;&quot;</span>
1070         <span class="n">lhs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span>
1071         <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">lhs</span><span class="p">,</span> <span class="n">Reference</span><span class="p">):</span>
1072             <span class="n">lhs</span> <span class="o">=</span> <span class="n">lhs</span><span class="o">.</span><span class="n">resolve</span><span class="p">(</span><span class="n">container</span><span class="p">)</span>
1073         <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">lhs</span><span class="p">,</span> <span class="n">Expression</span><span class="p">):</span>
1074             <span class="n">lhs</span> <span class="o">=</span> <span class="n">lhs</span><span class="o">.</span><span class="n">evaluate</span><span class="p">(</span><span class="n">container</span><span class="p">)</span>
1075         <span class="n">rhs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span>
1076         <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">rhs</span><span class="p">,</span> <span class="n">Reference</span><span class="p">):</span>
1077             <span class="n">rhs</span> <span class="o">=</span> <span class="n">rhs</span><span class="o">.</span><span class="n">resolve</span><span class="p">(</span><span class="n">container</span><span class="p">)</span>
1078         <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">rhs</span><span class="p">,</span> <span class="n">Expression</span><span class="p">):</span>
1079             <span class="n">rhs</span> <span class="o">=</span> <span class="n">rhs</span><span class="o">.</span><span class="n">evaluate</span><span class="p">(</span><span class="n">container</span><span class="p">)</span>
1080         <span class="n">op</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">op</span>
1081         <span class="k">if</span> <span class="n">op</span> <span class="o">==</span> <span class="n">PLUS</span><span class="p">:</span>
1082             <span class="n">rv</span> <span class="o">=</span> <span class="n">lhs</span> <span class="o">+</span> <span class="n">rhs</span>
1083         <span class="k">elif</span> <span class="n">op</span> <span class="o">==</span> <span class="n">MINUS</span><span class="p">:</span>
1084             <span class="n">rv</span> <span class="o">=</span> <span class="n">lhs</span> <span class="o">-</span> <span class="n">rhs</span>
1085         <span class="k">elif</span> <span class="n">op</span> <span class="o">==</span> <span class="n">STAR</span><span class="p">:</span>
1086             <span class="n">rv</span> <span class="o">=</span> <span class="n">lhs</span> <span class="o">*</span> <span class="n">rhs</span>
1087         <span class="k">elif</span> <span class="n">op</span> <span class="o">==</span> <span class="n">SLASH</span><span class="p">:</span>
1088             <span class="n">rv</span> <span class="o">=</span> <span class="n">lhs</span> <span class="o">/</span> <span class="n">rhs</span>
1089         <span class="k">else</span><span class="p">:</span>
1090             <span class="n">rv</span> <span class="o">=</span> <span class="n">lhs</span> <span class="o">%</span> <span class="n">rhs</span>
1091         <span class="k">return</span> <span class="n">rv</span>
1092 </div></div>
1093 <div class="viewcode-block" id="ConfigReader"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigReader">[docs]</a><span class="k">class</span> <span class="nc">ConfigReader</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
1094     <span class="sd">&quot;&quot;&quot;</span>
1095 <span class="sd">    This internal class implements a parser for configurations.</span>
1096 <span class="sd">    &quot;&quot;&quot;</span>
1097
1098     <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">config</span><span class="p">):</span>
1099         <span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="o">=</span> <span class="bp">None</span>
1100         <span class="bp">self</span><span class="o">.</span><span class="n">config</span> <span class="o">=</span> <span class="n">config</span>
1101         <span class="bp">self</span><span class="o">.</span><span class="n">lineno</span> <span class="o">=</span> <span class="mi">0</span>
1102         <span class="bp">self</span><span class="o">.</span><span class="n">colno</span> <span class="o">=</span> <span class="mi">0</span>
1103         <span class="bp">self</span><span class="o">.</span><span class="n">lastc</span> <span class="o">=</span> <span class="bp">None</span>
1104         <span class="bp">self</span><span class="o">.</span><span class="n">last_token</span> <span class="o">=</span> <span class="bp">None</span>
1105         <span class="bp">self</span><span class="o">.</span><span class="n">commentchars</span> <span class="o">=</span> <span class="s">&#39;#&#39;</span>
1106         <span class="bp">self</span><span class="o">.</span><span class="n">whitespace</span> <span class="o">=</span> <span class="s">&#39; </span><span class="se">\t\r\n</span><span class="s">&#39;</span>
1107         <span class="bp">self</span><span class="o">.</span><span class="n">quotes</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\&#39;</span><span class="s">&quot;&#39;</span>
1108         <span class="bp">self</span><span class="o">.</span><span class="n">punct</span> <span class="o">=</span> <span class="s">&#39;:-+*/%,.{}[]()@`$&#39;</span>
1109         <span class="bp">self</span><span class="o">.</span><span class="n">digits</span> <span class="o">=</span> <span class="s">&#39;0123456789&#39;</span>
1110         <span class="bp">self</span><span class="o">.</span><span class="n">wordchars</span> <span class="o">=</span> <span class="s">&#39;</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">WORDCHARS</span> <span class="c"># make a copy</span>
1111         <span class="bp">self</span><span class="o">.</span><span class="n">identchars</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">wordchars</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">digits</span>
1112         <span class="bp">self</span><span class="o">.</span><span class="n">pbchars</span> <span class="o">=</span> <span class="p">[]</span>
1113         <span class="bp">self</span><span class="o">.</span><span class="n">pbtokens</span> <span class="o">=</span> <span class="p">[]</span>
1114         <span class="bp">self</span><span class="o">.</span><span class="n">comment</span> <span class="o">=</span> <span class="bp">None</span>
1115
1116 <div class="viewcode-block" id="ConfigReader.location"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigReader.location">[docs]</a>    <span class="k">def</span> <span class="nf">location</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
1117         <span class="sd">&quot;&quot;&quot;</span>
1118 <span class="sd">        Return the current location (filename, line, column) in the stream</span>
1119 <span class="sd">        as a string.</span>
1120
1121 <span class="sd">        Used when printing error messages,</span>
1122
1123 <span class="sd">        @return: A string representing a location in the stream being read.</span>
1124 <span class="sd">        @rtype: str</span>
1125 <span class="sd">        &quot;&quot;&quot;</span>
1126         <span class="k">return</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s">(</span><span class="si">%d</span><span class="s">,</span><span class="si">%d</span><span class="s">)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filename</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">lineno</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">colno</span><span class="p">)</span>
1127 </div>
1128 <div class="viewcode-block" id="ConfigReader.getChar"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigReader.getChar">[docs]</a>    <span class="k">def</span> <span class="nf">getChar</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
1129         <span class="sd">&quot;&quot;&quot;</span>
1130 <span class="sd">        Get the next char from the stream. Update line and column numbers</span>
1131 <span class="sd">        appropriately.</span>
1132
1133 <span class="sd">        @return: The next character from the stream.</span>
1134 <span class="sd">        @rtype: str</span>
1135 <span class="sd">        &quot;&quot;&quot;</span>
1136         <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">pbchars</span><span class="p">:</span>
1137             <span class="n">c</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">pbchars</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
1138             <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">c</span><span class="p">,</span><span class="nb">bytes</span><span class="p">):</span>
1139                 <span class="n">c</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span>
1140         <span class="k">else</span><span class="p">:</span>
1141             <span class="n">c</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
1142             <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">c</span><span class="p">,</span><span class="nb">bytes</span><span class="p">):</span>
1143                 <span class="n">c</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span>
1144             <span class="bp">self</span><span class="o">.</span><span class="n">colno</span> <span class="o">+=</span> <span class="mi">1</span>
1145             <span class="k">if</span> <span class="n">c</span> <span class="o">==</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">:</span>
1146                 <span class="bp">self</span><span class="o">.</span><span class="n">lineno</span> <span class="o">+=</span> <span class="mi">1</span>
1147                 <span class="bp">self</span><span class="o">.</span><span class="n">colno</span> <span class="o">=</span> <span class="mi">1</span>
1148         <span class="k">return</span> <span class="n">c</span>
1149 </div>
1150     <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
1151         <span class="k">return</span> <span class="s">&quot;&lt;ConfigReader at 0x</span><span class="si">%08x</span><span class="s">&gt;&quot;</span> <span class="o">%</span> <span class="nb">id</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
1152
1153     <span class="n">__str__</span> <span class="o">=</span> <span class="n">__repr__</span>
1154
1155 <div class="viewcode-block" id="ConfigReader.getToken"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigReader.getToken">[docs]</a>    <span class="k">def</span> <span class="nf">getToken</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
1156         <span class="sd">&quot;&quot;&quot;</span>
1157 <span class="sd">        Get a token from the stream. String values are returned in a form</span>
1158 <span class="sd">        where you need to eval() the returned value to get the actual</span>
1159 <span class="sd">        string. The return value is (token_type, token_value).</span>
1160
1161 <span class="sd">        Multiline string tokenizing is thanks to David Janes (BlogMatrix)</span>
1162
1163 <span class="sd">        @return: The next token.</span>
1164 <span class="sd">        @rtype: A token tuple.</span>
1165 <span class="sd">        &quot;&quot;&quot;</span>
1166         <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">pbtokens</span><span class="p">:</span>
1167             <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">pbtokens</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
1168         <span class="n">stream</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stream</span>
1169         <span class="bp">self</span><span class="o">.</span><span class="n">comment</span> <span class="o">=</span> <span class="bp">None</span>
1170         <span class="n">token</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
1171         <span class="n">tt</span> <span class="o">=</span> <span class="n">EOF</span>
1172         <span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
1173             <span class="n">c</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getChar</span><span class="p">()</span>
1174             <span class="k">if</span> <span class="ow">not</span> <span class="n">c</span><span class="p">:</span>
1175                 <span class="k">break</span>
1176             <span class="k">elif</span> <span class="n">c</span> <span class="o">==</span> <span class="s">&#39;#&#39;</span><span class="p">:</span>
1177                 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">comment</span> <span class="p">:</span>
1178                     <span class="bp">self</span><span class="o">.</span><span class="n">comment</span> <span class="o">+=</span> <span class="s">&#39;#&#39;</span> <span class="o">+</span> <span class="n">stream</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span>
1179                 <span class="k">else</span> <span class="p">:</span>
1180                     <span class="bp">self</span><span class="o">.</span><span class="n">comment</span> <span class="o">=</span> <span class="n">stream</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span>
1181                 <span class="bp">self</span><span class="o">.</span><span class="n">lineno</span> <span class="o">+=</span> <span class="mi">1</span>
1182                 <span class="k">continue</span>
1183             <span class="k">if</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">quotes</span><span class="p">:</span>
1184                 <span class="n">token</span> <span class="o">=</span> <span class="n">c</span>
1185                 <span class="n">quote</span> <span class="o">=</span> <span class="n">c</span>
1186                 <span class="n">tt</span> <span class="o">=</span> <span class="n">STRING</span>
1187                 <span class="n">escaped</span> <span class="o">=</span> <span class="bp">False</span>
1188                 <span class="n">multiline</span> <span class="o">=</span> <span class="bp">False</span>
1189                 <span class="n">c1</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getChar</span><span class="p">()</span>
1190                 <span class="k">if</span> <span class="n">c1</span> <span class="o">==</span> <span class="n">quote</span><span class="p">:</span>
1191                     <span class="n">c2</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getChar</span><span class="p">()</span>
1192                     <span class="k">if</span> <span class="n">c2</span> <span class="o">==</span> <span class="n">quote</span><span class="p">:</span>
1193                         <span class="n">multiline</span> <span class="o">=</span> <span class="bp">True</span>
1194                         <span class="n">token</span> <span class="o">+=</span> <span class="n">quote</span>
1195                         <span class="n">token</span> <span class="o">+=</span> <span class="n">quote</span>
1196                     <span class="k">else</span><span class="p">:</span>
1197                         <span class="bp">self</span><span class="o">.</span><span class="n">pbchars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c2</span><span class="p">)</span>
1198                         <span class="bp">self</span><span class="o">.</span><span class="n">pbchars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c1</span><span class="p">)</span>
1199                 <span class="k">else</span><span class="p">:</span>
1200                     <span class="bp">self</span><span class="o">.</span><span class="n">pbchars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c1</span><span class="p">)</span>
1201                 <span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
1202                     <span class="n">c</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getChar</span><span class="p">()</span>
1203                     <span class="k">if</span> <span class="ow">not</span> <span class="n">c</span><span class="p">:</span>
1204                         <span class="k">break</span>
1205                     <span class="n">token</span> <span class="o">+=</span> <span class="n">c</span>
1206                     <span class="k">if</span> <span class="p">(</span><span class="n">c</span> <span class="o">==</span> <span class="n">quote</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">escaped</span><span class="p">:</span>
1207                         <span class="k">if</span> <span class="ow">not</span> <span class="n">multiline</span> <span class="ow">or</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">token</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">6</span> <span class="ow">and</span> <span class="n">token</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="n">token</span><span class="p">[:</span><span class="mi">3</span><span class="p">])</span> <span class="ow">and</span> <span class="n">token</span><span class="p">[</span><span class="o">-</span><span class="mi">4</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">):</span>
1208                             <span class="k">break</span>
1209                     <span class="k">if</span> <span class="n">c</span> <span class="o">==</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">:</span>
1210                         <span class="n">escaped</span> <span class="o">=</span> <span class="ow">not</span> <span class="n">escaped</span>
1211                     <span class="k">else</span><span class="p">:</span>
1212                         <span class="n">escaped</span> <span class="o">=</span> <span class="bp">False</span>
1213                 <span class="k">if</span> <span class="ow">not</span> <span class="n">c</span><span class="p">:</span>
1214                     <span class="k">raise</span> <span class="n">ConfigFormatError</span><span class="p">(</span><span class="s">&#39;</span><span class="si">%s</span><span class="s">: Unterminated quoted string: </span><span class="si">%r</span><span class="s">, </span><span class="si">%r</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">(),</span> <span class="n">token</span><span class="p">,</span> <span class="n">c</span><span class="p">))</span>
1215                 <span class="k">break</span>
1216             <span class="k">if</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">whitespace</span><span class="p">:</span>
1217                 <span class="bp">self</span><span class="o">.</span><span class="n">lastc</span> <span class="o">=</span> <span class="n">c</span>
1218                 <span class="k">continue</span>
1219             <span class="k">elif</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">punct</span><span class="p">:</span>
1220                 <span class="n">token</span> <span class="o">=</span> <span class="n">c</span>
1221                 <span class="n">tt</span> <span class="o">=</span> <span class="n">c</span>
1222                 <span class="k">if</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lastc</span> <span class="o">==</span> <span class="s">&#39;]&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lastc</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">identchars</span><span class="p">):</span>
1223                     <span class="k">if</span> <span class="n">c</span> <span class="o">==</span> <span class="s">&#39;[&#39;</span><span class="p">:</span>
1224                         <span class="n">tt</span> <span class="o">=</span> <span class="n">LBRACK2</span>
1225                     <span class="k">elif</span> <span class="n">c</span> <span class="o">==</span> <span class="s">&#39;(&#39;</span><span class="p">:</span>
1226                         <span class="n">tt</span> <span class="o">=</span> <span class="n">LPAREN2</span>
1227                 <span class="k">break</span>
1228             <span class="k">elif</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">digits</span><span class="p">:</span>
1229                 <span class="n">token</span> <span class="o">=</span> <span class="n">c</span>
1230                 <span class="n">tt</span> <span class="o">=</span> <span class="n">NUMBER</span>
1231                 <span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
1232                     <span class="n">c</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getChar</span><span class="p">()</span>
1233                     <span class="k">if</span> <span class="ow">not</span> <span class="n">c</span><span class="p">:</span>
1234                         <span class="k">break</span>
1235                     <span class="k">if</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">digits</span><span class="p">:</span>
1236                         <span class="n">token</span> <span class="o">+=</span> <span class="n">c</span>
1237                     <span class="k">elif</span> <span class="p">(</span><span class="n">c</span> <span class="o">==</span> <span class="s">&#39;.&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">token</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&#39;.&#39;</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
1238                         <span class="n">token</span> <span class="o">+=</span> <span class="n">c</span>
1239                     <span class="k">else</span><span class="p">:</span>
1240                         <span class="k">if</span> <span class="n">c</span> <span class="ow">and</span> <span class="p">(</span><span class="n">c</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">whitespace</span><span class="p">):</span>
1241                             <span class="bp">self</span><span class="o">.</span><span class="n">pbchars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
1242                         <span class="k">break</span>
1243                 <span class="k">break</span>
1244             <span class="k">elif</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">wordchars</span><span class="p">:</span>
1245                 <span class="n">token</span> <span class="o">=</span> <span class="n">c</span>
1246                 <span class="n">tt</span> <span class="o">=</span> <span class="n">WORD</span>
1247                 <span class="n">c</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getChar</span><span class="p">()</span>
1248                 <span class="k">while</span> <span class="n">c</span> <span class="ow">and</span> <span class="p">(</span><span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">identchars</span><span class="p">):</span>
1249                     <span class="n">token</span> <span class="o">+=</span> <span class="n">c</span>
1250                     <span class="n">c</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getChar</span><span class="p">()</span>
1251                 <span class="k">if</span> <span class="n">c</span><span class="p">:</span> <span class="c"># and c not in self.whitespace:</span>
1252                     <span class="bp">self</span><span class="o">.</span><span class="n">pbchars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
1253                 <span class="k">if</span> <span class="n">token</span> <span class="o">==</span> <span class="s">&quot;True&quot;</span><span class="p">:</span>
1254                     <span class="n">tt</span> <span class="o">=</span> <span class="n">TRUE</span>
1255                 <span class="k">elif</span> <span class="n">token</span> <span class="o">==</span> <span class="s">&quot;False&quot;</span><span class="p">:</span>
1256                     <span class="n">tt</span> <span class="o">=</span> <span class="n">FALSE</span>
1257                 <span class="k">elif</span> <span class="n">token</span> <span class="o">==</span> <span class="s">&quot;None&quot;</span><span class="p">:</span>
1258                     <span class="n">tt</span> <span class="o">=</span> <span class="n">NONE</span>
1259                 <span class="k">break</span>
1260             <span class="k">else</span><span class="p">:</span>
1261                 <span class="k">raise</span> <span class="n">ConfigFormatError</span><span class="p">(</span><span class="s">&#39;</span><span class="si">%s</span><span class="s">: Unexpected character: </span><span class="si">%r</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">(),</span> <span class="n">c</span><span class="p">))</span>
1262         <span class="k">if</span> <span class="n">token</span><span class="p">:</span>
1263             <span class="bp">self</span><span class="o">.</span><span class="n">lastc</span> <span class="o">=</span> <span class="n">token</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
1264         <span class="k">else</span><span class="p">:</span>
1265             <span class="bp">self</span><span class="o">.</span><span class="n">lastc</span> <span class="o">=</span> <span class="bp">None</span>
1266         <span class="bp">self</span><span class="o">.</span><span class="n">last_token</span> <span class="o">=</span> <span class="n">tt</span>
1267         
1268         <span class="c"># Python 2.x specific unicode conversion</span>
1269         <span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">tt</span> <span class="o">==</span> <span class="n">WORD</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">token</span><span class="p">,</span> <span class="nb">unicode</span><span class="p">):</span>
1270             <span class="n">token</span> <span class="o">=</span> <span class="n">token</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&#39;ascii&#39;</span><span class="p">)</span>
1271         <span class="k">return</span> <span class="p">(</span><span class="n">tt</span><span class="p">,</span> <span class="n">token</span><span class="p">)</span>
1272 </div>
1273 <div class="viewcode-block" id="ConfigReader.load"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigReader.load">[docs]</a>    <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stream</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">suffix</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
1274         <span class="sd">&quot;&quot;&quot;</span>
1275 <span class="sd">        Load the configuration from the specified stream.</span>
1276
1277 <span class="sd">        @param stream: A stream from which to load the configuration.</span>
1278 <span class="sd">        @type stream: A stream (file-like object).</span>
1279 <span class="sd">        @param parent: The parent of the configuration (to which this reader</span>
1280 <span class="sd">        belongs) in the hierarchy. Specified when the configuration is</span>
1281 <span class="sd">        included in another one.</span>
1282 <span class="sd">        @type parent: A L{Container} instance.</span>
1283 <span class="sd">        @param suffix: The suffix of this configuration in the parent</span>
1284 <span class="sd">        configuration. Should be specified whenever the parent is not None.</span>
1285 <span class="sd">        @raise ConfigError: If parent is specified but suffix is not.</span>
1286 <span class="sd">        @raise ConfigFormatError: If there are syntax errors in the stream.</span>
1287 <span class="sd">        &quot;&quot;&quot;</span>
1288         <span class="k">if</span> <span class="n">parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
1289             <span class="k">if</span> <span class="n">suffix</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
1290                 <span class="k">raise</span> <span class="n">ConfigError</span><span class="p">(</span><span class="s">&quot;internal error: load called with parent but no suffix&quot;</span><span class="p">)</span>
1291             <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">setPath</span><span class="p">(</span><span class="n">makePath</span><span class="p">(</span><span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="s">&#39;path&#39;</span><span class="p">),</span> <span class="n">suffix</span><span class="p">))</span>
1292         <span class="bp">self</span><span class="o">.</span><span class="n">setStream</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
1293         <span class="bp">self</span><span class="o">.</span><span class="n">token</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getToken</span><span class="p">()</span>
1294         <span class="bp">self</span><span class="o">.</span><span class="n">parseMappingBody</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">)</span>
1295         <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="n">EOF</span><span class="p">:</span>
1296             <span class="k">raise</span> <span class="n">ConfigFormatError</span><span class="p">(</span><span class="s">&#39;</span><span class="si">%s</span><span class="s">: expecting EOF, found </span><span class="si">%r</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
1297 </div>
1298 <div class="viewcode-block" id="ConfigReader.setStream"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigReader.setStream">[docs]</a>    <span class="k">def</span> <span class="nf">setStream</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stream</span><span class="p">):</span>
1299         <span class="sd">&quot;&quot;&quot;</span>
1300 <span class="sd">        Set the stream to the specified value, and prepare to read from it.</span>
1301
1302 <span class="sd">        @param stream: A stream from which to load the configuration.</span>
1303 <span class="sd">        @type stream: A stream (file-like object).</span>
1304 <span class="sd">        &quot;&quot;&quot;</span>
1305         <span class="bp">self</span><span class="o">.</span><span class="n">stream</span> <span class="o">=</span> <span class="n">stream</span>
1306         <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">stream</span><span class="p">,</span> <span class="s">&#39;name&#39;</span><span class="p">):</span>
1307             <span class="n">filename</span> <span class="o">=</span> <span class="n">stream</span><span class="o">.</span><span class="n">name</span>
1308         <span class="k">else</span><span class="p">:</span>
1309             <span class="n">filename</span> <span class="o">=</span> <span class="s">&#39;?&#39;</span>
1310         <span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="o">=</span> <span class="n">filename</span>
1311         <span class="bp">self</span><span class="o">.</span><span class="n">lineno</span> <span class="o">=</span> <span class="mi">1</span>
1312         <span class="bp">self</span><span class="o">.</span><span class="n">colno</span> <span class="o">=</span> <span class="mi">1</span>
1313 </div>
1314 <div class="viewcode-block" id="ConfigReader.match"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigReader.match">[docs]</a>    <span class="k">def</span> <span class="nf">match</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">t</span><span class="p">):</span>
1315         <span class="sd">&quot;&quot;&quot;</span>
1316 <span class="sd">        Ensure that the current token type matches the specified value, and</span>
1317 <span class="sd">        advance to the next token.</span>
1318
1319 <span class="sd">        @param t: The token type to match.</span>
1320 <span class="sd">        @type t: A valid token type.</span>
1321 <span class="sd">        @return: The token which was last read from the stream before this</span>
1322 <span class="sd">        function is called.</span>
1323 <span class="sd">        @rtype: a token tuple - see L{getToken}.</span>
1324 <span class="sd">        @raise ConfigFormatError: If the token does not match what&#39;s expected.</span>
1325 <span class="sd">        &quot;&quot;&quot;</span>
1326         <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="n">t</span><span class="p">:</span>
1327             <span class="k">raise</span> <span class="n">ConfigFormatError</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%s</span><span class="s">: expecting </span><span class="si">%s</span><span class="s">, found </span><span class="si">%r</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">(),</span> <span class="n">t</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
1328         <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span>
1329         <span class="bp">self</span><span class="o">.</span><span class="n">token</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getToken</span><span class="p">()</span>
1330         <span class="k">return</span> <span class="n">rv</span>
1331 </div>
1332 <div class="viewcode-block" id="ConfigReader.parseMappingBody"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigReader.parseMappingBody">[docs]</a>    <span class="k">def</span> <span class="nf">parseMappingBody</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parent</span><span class="p">):</span>
1333         <span class="sd">&quot;&quot;&quot;</span>
1334 <span class="sd">        Parse the internals of a mapping, and add entries to the provided</span>
1335 <span class="sd">        L{Mapping}.</span>
1336
1337 <span class="sd">        @param parent: The mapping to add entries to.</span>
1338 <span class="sd">        @type parent: A L{Mapping} instance.</span>
1339 <span class="sd">        &quot;&quot;&quot;</span>
1340         <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="p">[</span><span class="n">WORD</span><span class="p">,</span> <span class="n">STRING</span><span class="p">]:</span>
1341             <span class="bp">self</span><span class="o">.</span><span class="n">parseKeyValuePair</span><span class="p">(</span><span class="n">parent</span><span class="p">)</span>
1342 </div>
1343 <div class="viewcode-block" id="ConfigReader.parseKeyValuePair"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigReader.parseKeyValuePair">[docs]</a>    <span class="k">def</span> <span class="nf">parseKeyValuePair</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parent</span><span class="p">):</span>
1344         <span class="sd">&quot;&quot;&quot;</span>
1345 <span class="sd">        Parse a key-value pair, and add it to the provided L{Mapping}.</span>
1346
1347 <span class="sd">        @param parent: The mapping to add entries to.</span>
1348 <span class="sd">        @type parent: A L{Mapping} instance.</span>
1349 <span class="sd">        @raise ConfigFormatError: if a syntax error is found.</span>
1350 <span class="sd">        &quot;&quot;&quot;</span>
1351         <span class="n">comment</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">comment</span>
1352         <span class="n">tt</span><span class="p">,</span> <span class="n">tv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span>
1353         <span class="k">if</span> <span class="n">tt</span> <span class="o">==</span> <span class="n">WORD</span><span class="p">:</span>
1354             <span class="n">key</span> <span class="o">=</span> <span class="n">tv</span>
1355             <span class="n">suffix</span> <span class="o">=</span> <span class="n">tv</span>
1356         <span class="k">elif</span> <span class="n">tt</span> <span class="o">==</span> <span class="n">STRING</span><span class="p">:</span>
1357             <span class="n">key</span> <span class="o">=</span> <span class="nb">eval</span><span class="p">(</span><span class="n">tv</span><span class="p">)</span>
1358             <span class="n">suffix</span> <span class="o">=</span> <span class="s">&#39;[</span><span class="si">%s</span><span class="s">]&#39;</span> <span class="o">%</span> <span class="n">tv</span>
1359         <span class="k">else</span><span class="p">:</span>
1360             <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s">: expecting word or string, found </span><span class="si">%r</span><span class="s">&quot;</span>
1361             <span class="k">raise</span> <span class="n">ConfigFormatError</span><span class="p">(</span><span class="n">msg</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">(),</span> <span class="n">tv</span><span class="p">))</span>
1362         <span class="bp">self</span><span class="o">.</span><span class="n">token</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getToken</span><span class="p">()</span>
1363         <span class="c"># for now, we allow key on its own as a short form of key : True</span>
1364         <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">COLON</span><span class="p">:</span>
1365             <span class="bp">self</span><span class="o">.</span><span class="n">token</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getToken</span><span class="p">()</span>
1366             <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parseValue</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="n">suffix</span><span class="p">)</span>
1367         <span class="k">else</span><span class="p">:</span>
1368             <span class="n">value</span> <span class="o">=</span> <span class="bp">True</span>
1369         <span class="k">try</span><span class="p">:</span>
1370             <span class="n">parent</span><span class="o">.</span><span class="n">addMapping</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">comment</span><span class="p">)</span>
1371         <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
1372             <span class="k">raise</span> <span class="n">ConfigFormatError</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%s</span><span class="s">: </span><span class="si">%s</span><span class="s">, </span><span class="si">%r</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">(),</span> <span class="n">e</span><span class="p">,</span>
1373                                     <span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
1374         <span class="n">tt</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
1375         <span class="k">if</span> <span class="n">tt</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="n">EOF</span><span class="p">,</span> <span class="n">WORD</span><span class="p">,</span> <span class="n">STRING</span><span class="p">,</span> <span class="n">RCURLY</span><span class="p">,</span> <span class="n">COMMA</span><span class="p">]:</span>
1376             <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s">: expecting one of EOF, WORD, STRING, </span><span class="se">\</span>
1377 <span class="s">RCURLY, COMMA, found </span><span class="si">%r</span><span class="s">&quot;</span>
1378             <span class="k">raise</span> <span class="n">ConfigFormatError</span><span class="p">(</span><span class="n">msg</span>  <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
1379         <span class="k">if</span> <span class="n">tt</span> <span class="o">==</span> <span class="n">COMMA</span><span class="p">:</span>
1380             <span class="bp">self</span><span class="o">.</span><span class="n">token</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getToken</span><span class="p">()</span>
1381 </div>
1382 <div class="viewcode-block" id="ConfigReader.parseValue"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigReader.parseValue">[docs]</a>    <span class="k">def</span> <span class="nf">parseValue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">suffix</span><span class="p">):</span>
1383         <span class="sd">&quot;&quot;&quot;</span>
1384 <span class="sd">        Parse a value.</span>
1385
1386 <span class="sd">        @param parent: The container to which the value will be added.</span>
1387 <span class="sd">        @type parent: A L{Container} instance.</span>
1388 <span class="sd">        @param suffix: The suffix for the value.</span>
1389 <span class="sd">        @type suffix: str</span>
1390 <span class="sd">        @return: The value</span>
1391 <span class="sd">        @rtype: any</span>
1392 <span class="sd">        @raise ConfigFormatError: if a syntax error is found.</span>
1393 <span class="sd">        &quot;&quot;&quot;</span>
1394         <span class="n">tt</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
1395         <span class="k">if</span> <span class="n">tt</span> <span class="ow">in</span> <span class="p">[</span><span class="n">STRING</span><span class="p">,</span> <span class="n">WORD</span><span class="p">,</span> <span class="n">NUMBER</span><span class="p">,</span> <span class="n">LPAREN</span><span class="p">,</span> <span class="n">DOLLAR</span><span class="p">,</span>
1396                   <span class="n">TRUE</span><span class="p">,</span> <span class="n">FALSE</span><span class="p">,</span> <span class="n">NONE</span><span class="p">,</span> <span class="n">BACKTICK</span><span class="p">,</span> <span class="n">MINUS</span><span class="p">]:</span>
1397             <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parseScalar</span><span class="p">()</span>
1398         <span class="k">elif</span> <span class="n">tt</span> <span class="o">==</span> <span class="n">LBRACK</span><span class="p">:</span>
1399             <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parseSequence</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="n">suffix</span><span class="p">)</span>
1400         <span class="k">elif</span> <span class="n">tt</span> <span class="ow">in</span> <span class="p">[</span><span class="n">LCURLY</span><span class="p">,</span> <span class="n">AT</span><span class="p">]:</span>
1401             <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parseMapping</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="n">suffix</span><span class="p">)</span>
1402         <span class="k">else</span><span class="p">:</span>
1403             <span class="k">raise</span> <span class="n">ConfigFormatError</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%s</span><span class="s">: unexpected input: </span><span class="si">%r</span><span class="s">&quot;</span> <span class="o">%</span>
1404                <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
1405         <span class="k">return</span> <span class="n">rv</span>
1406 </div>
1407 <div class="viewcode-block" id="ConfigReader.parseSequence"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigReader.parseSequence">[docs]</a>    <span class="k">def</span> <span class="nf">parseSequence</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">suffix</span><span class="p">):</span>
1408         <span class="sd">&quot;&quot;&quot;</span>
1409 <span class="sd">        Parse a sequence.</span>
1410
1411 <span class="sd">        @param parent: The container to which the sequence will be added.</span>
1412 <span class="sd">        @type parent: A L{Container} instance.</span>
1413 <span class="sd">        @param suffix: The suffix for the value.</span>
1414 <span class="sd">        @type suffix: str</span>
1415 <span class="sd">        @return: a L{Sequence} instance representing the sequence.</span>
1416 <span class="sd">        @rtype: L{Sequence}</span>
1417 <span class="sd">        @raise ConfigFormatError: if a syntax error is found.</span>
1418 <span class="sd">        &quot;&quot;&quot;</span>
1419         <span class="n">rv</span> <span class="o">=</span> <span class="n">Sequence</span><span class="p">(</span><span class="n">parent</span><span class="p">)</span>
1420         <span class="n">rv</span><span class="o">.</span><span class="n">setPath</span><span class="p">(</span><span class="n">makePath</span><span class="p">(</span><span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="s">&#39;path&#39;</span><span class="p">),</span> <span class="n">suffix</span><span class="p">))</span>
1421         <span class="bp">self</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">LBRACK</span><span class="p">)</span>
1422         <span class="n">comment</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">comment</span>
1423         <span class="n">tt</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
1424         <span class="k">while</span> <span class="n">tt</span> <span class="ow">in</span> <span class="p">[</span><span class="n">STRING</span><span class="p">,</span> <span class="n">WORD</span><span class="p">,</span> <span class="n">NUMBER</span><span class="p">,</span> <span class="n">LCURLY</span><span class="p">,</span> <span class="n">LBRACK</span><span class="p">,</span> <span class="n">LPAREN</span><span class="p">,</span> <span class="n">DOLLAR</span><span class="p">,</span>
1425                      <span class="n">TRUE</span><span class="p">,</span> <span class="n">FALSE</span><span class="p">,</span> <span class="n">NONE</span><span class="p">,</span> <span class="n">BACKTICK</span><span class="p">]:</span>
1426             <span class="n">suffix</span> <span class="o">=</span> <span class="s">&#39;[</span><span class="si">%d</span><span class="s">]&#39;</span> <span class="o">%</span> <span class="nb">len</span><span class="p">(</span><span class="n">rv</span><span class="p">)</span>
1427             <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parseValue</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="n">suffix</span><span class="p">)</span>
1428             <span class="n">rv</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">comment</span><span class="p">)</span>
1429             <span class="n">tt</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
1430             <span class="n">comment</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">comment</span>
1431             <span class="k">if</span> <span class="n">tt</span> <span class="o">==</span> <span class="n">COMMA</span><span class="p">:</span>
1432                 <span class="bp">self</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">COMMA</span><span class="p">)</span>
1433                 <span class="n">tt</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
1434                 <span class="n">comment</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">comment</span>
1435                 <span class="k">continue</span>
1436         <span class="bp">self</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">RBRACK</span><span class="p">)</span>
1437         <span class="k">return</span> <span class="n">rv</span>
1438 </div>
1439 <div class="viewcode-block" id="ConfigReader.parseMapping"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigReader.parseMapping">[docs]</a>    <span class="k">def</span> <span class="nf">parseMapping</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">suffix</span><span class="p">):</span>
1440         <span class="sd">&quot;&quot;&quot;</span>
1441 <span class="sd">        Parse a mapping.</span>
1442
1443 <span class="sd">        @param parent: The container to which the mapping will be added.</span>
1444 <span class="sd">        @type parent: A L{Container} instance.</span>
1445 <span class="sd">        @param suffix: The suffix for the value.</span>
1446 <span class="sd">        @type suffix: str</span>
1447 <span class="sd">        @return: a L{Mapping} instance representing the mapping.</span>
1448 <span class="sd">        @rtype: L{Mapping}</span>
1449 <span class="sd">        @raise ConfigFormatError: if a syntax error is found.</span>
1450 <span class="sd">        &quot;&quot;&quot;</span>
1451         <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">LCURLY</span><span class="p">:</span>
1452             <span class="bp">self</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">LCURLY</span><span class="p">)</span>
1453             <span class="n">rv</span> <span class="o">=</span> <span class="n">Mapping</span><span class="p">(</span><span class="n">parent</span><span class="p">)</span>
1454             <span class="n">rv</span><span class="o">.</span><span class="n">setPath</span><span class="p">(</span>
1455                <span class="n">makePath</span><span class="p">(</span><span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="s">&#39;path&#39;</span><span class="p">),</span> <span class="n">suffix</span><span class="p">))</span>
1456             <span class="bp">self</span><span class="o">.</span><span class="n">parseMappingBody</span><span class="p">(</span><span class="n">rv</span><span class="p">)</span>
1457             <span class="bp">self</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">RCURLY</span><span class="p">)</span>
1458         <span class="k">else</span><span class="p">:</span>
1459             <span class="bp">self</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">AT</span><span class="p">)</span>
1460             <span class="n">_</span><span class="p">,</span> <span class="n">fn</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">STRING</span><span class="p">)</span>
1461             <span class="n">rv</span> <span class="o">=</span> <span class="n">Config</span><span class="p">(</span><span class="nb">eval</span><span class="p">(</span><span class="n">fn</span><span class="p">),</span> <span class="n">parent</span><span class="p">)</span>
1462         <span class="k">return</span> <span class="n">rv</span>
1463 </div>
1464 <div class="viewcode-block" id="ConfigReader.parseScalar"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigReader.parseScalar">[docs]</a>    <span class="k">def</span> <span class="nf">parseScalar</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
1465         <span class="sd">&quot;&quot;&quot;</span>
1466 <span class="sd">        Parse a scalar - a terminal value such as a string or number, or</span>
1467 <span class="sd">        an L{Expression} or L{Reference}.</span>
1468
1469 <span class="sd">        @return: the parsed scalar</span>
1470 <span class="sd">        @rtype: any scalar</span>
1471 <span class="sd">        @raise ConfigFormatError: if a syntax error is found.</span>
1472 <span class="sd">        &quot;&quot;&quot;</span>
1473         <span class="n">lhs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parseTerm</span><span class="p">()</span>
1474         <span class="n">tt</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
1475         <span class="k">while</span> <span class="n">tt</span> <span class="ow">in</span> <span class="p">[</span><span class="n">PLUS</span><span class="p">,</span> <span class="n">MINUS</span><span class="p">]:</span>
1476             <span class="bp">self</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">tt</span><span class="p">)</span>
1477             <span class="n">rhs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parseTerm</span><span class="p">()</span>
1478             <span class="n">lhs</span> <span class="o">=</span> <span class="n">Expression</span><span class="p">(</span><span class="n">tt</span><span class="p">,</span> <span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span><span class="p">)</span>
1479             <span class="n">tt</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
1480         <span class="k">return</span> <span class="n">lhs</span>
1481 </div>
1482 <div class="viewcode-block" id="ConfigReader.parseTerm"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigReader.parseTerm">[docs]</a>    <span class="k">def</span> <span class="nf">parseTerm</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
1483         <span class="sd">&quot;&quot;&quot;</span>
1484 <span class="sd">        Parse a term in an additive expression (a + b, a - b)</span>
1485
1486 <span class="sd">        @return: the parsed term</span>
1487 <span class="sd">        @rtype: any scalar</span>
1488 <span class="sd">        @raise ConfigFormatError: if a syntax error is found.</span>
1489 <span class="sd">        &quot;&quot;&quot;</span>
1490         <span class="n">lhs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parseFactor</span><span class="p">()</span>
1491         <span class="n">tt</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
1492         <span class="k">while</span> <span class="n">tt</span> <span class="ow">in</span> <span class="p">[</span><span class="n">STAR</span><span class="p">,</span> <span class="n">SLASH</span><span class="p">,</span> <span class="n">MOD</span><span class="p">]:</span>
1493             <span class="bp">self</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">tt</span><span class="p">)</span>
1494             <span class="n">rhs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parseFactor</span><span class="p">()</span>
1495             <span class="n">lhs</span> <span class="o">=</span> <span class="n">Expression</span><span class="p">(</span><span class="n">tt</span><span class="p">,</span> <span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span><span class="p">)</span>
1496             <span class="n">tt</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
1497         <span class="k">return</span> <span class="n">lhs</span>
1498 </div>
1499 <div class="viewcode-block" id="ConfigReader.parseFactor"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigReader.parseFactor">[docs]</a>    <span class="k">def</span> <span class="nf">parseFactor</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
1500         <span class="sd">&quot;&quot;&quot;</span>
1501 <span class="sd">        Parse a factor in an multiplicative expression (a * b, a / b, a % b)</span>
1502
1503 <span class="sd">        @return: the parsed factor</span>
1504 <span class="sd">        @rtype: any scalar</span>
1505 <span class="sd">        @raise ConfigFormatError: if a syntax error is found.</span>
1506 <span class="sd">        &quot;&quot;&quot;</span>
1507         <span class="n">tt</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
1508         <span class="k">if</span> <span class="n">tt</span> <span class="ow">in</span> <span class="p">[</span><span class="n">NUMBER</span><span class="p">,</span> <span class="n">WORD</span><span class="p">,</span> <span class="n">STRING</span><span class="p">,</span> <span class="n">TRUE</span><span class="p">,</span> <span class="n">FALSE</span><span class="p">,</span> <span class="n">NONE</span><span class="p">]:</span>
1509             <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
1510             <span class="k">if</span> <span class="n">tt</span> <span class="o">!=</span> <span class="n">WORD</span><span class="p">:</span>
1511                 <span class="n">rv</span> <span class="o">=</span> <span class="nb">eval</span><span class="p">(</span><span class="n">rv</span><span class="p">)</span>
1512             <span class="bp">self</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">tt</span><span class="p">)</span>
1513         <span class="k">elif</span> <span class="n">tt</span> <span class="o">==</span> <span class="n">LPAREN</span><span class="p">:</span>
1514             <span class="bp">self</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">LPAREN</span><span class="p">)</span>
1515             <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parseScalar</span><span class="p">()</span>
1516             <span class="bp">self</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">RPAREN</span><span class="p">)</span>
1517         <span class="k">elif</span> <span class="n">tt</span> <span class="o">==</span> <span class="n">DOLLAR</span><span class="p">:</span>
1518             <span class="bp">self</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">DOLLAR</span><span class="p">)</span>
1519             <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parseReference</span><span class="p">(</span><span class="n">DOLLAR</span><span class="p">)</span>
1520         <span class="k">elif</span> <span class="n">tt</span> <span class="o">==</span> <span class="n">BACKTICK</span><span class="p">:</span>
1521             <span class="bp">self</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">BACKTICK</span><span class="p">)</span>
1522             <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parseReference</span><span class="p">(</span><span class="n">BACKTICK</span><span class="p">)</span>
1523             <span class="bp">self</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">BACKTICK</span><span class="p">)</span>
1524         <span class="k">elif</span> <span class="n">tt</span> <span class="o">==</span> <span class="n">MINUS</span><span class="p">:</span>
1525             <span class="bp">self</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">MINUS</span><span class="p">)</span>
1526             <span class="n">rv</span> <span class="o">=</span> <span class="o">-</span><span class="bp">self</span><span class="o">.</span><span class="n">parseScalar</span><span class="p">()</span>
1527         <span class="k">else</span><span class="p">:</span>
1528             <span class="k">raise</span> <span class="n">ConfigFormatError</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%s</span><span class="s">: unexpected input: </span><span class="si">%r</span><span class="s">&quot;</span> <span class="o">%</span>
1529                <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
1530         <span class="k">return</span> <span class="n">rv</span>
1531 </div>
1532 <div class="viewcode-block" id="ConfigReader.parseReference"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigReader.parseReference">[docs]</a>    <span class="k">def</span> <span class="nf">parseReference</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
1533         <span class="sd">&quot;&quot;&quot;</span>
1534 <span class="sd">        Parse a reference.</span>
1535
1536 <span class="sd">        @return: the parsed reference</span>
1537 <span class="sd">        @rtype: L{Reference}</span>
1538 <span class="sd">        @raise ConfigFormatError: if a syntax error is found.</span>
1539 <span class="sd">        &quot;&quot;&quot;</span>
1540         <span class="n">word</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">WORD</span><span class="p">)</span>
1541         <span class="n">rv</span> <span class="o">=</span> <span class="n">Reference</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">,</span> <span class="nb">type</span><span class="p">,</span> <span class="n">word</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
1542         <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="p">[</span><span class="n">DOT</span><span class="p">,</span> <span class="n">LBRACK2</span><span class="p">]:</span>
1543             <span class="bp">self</span><span class="o">.</span><span class="n">parseSuffix</span><span class="p">(</span><span class="n">rv</span><span class="p">)</span>
1544         <span class="k">return</span> <span class="n">rv</span>
1545 </div>
1546 <div class="viewcode-block" id="ConfigReader.parseSuffix"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigReader.parseSuffix">[docs]</a>    <span class="k">def</span> <span class="nf">parseSuffix</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ref</span><span class="p">):</span>
1547         <span class="sd">&quot;&quot;&quot;</span>
1548 <span class="sd">        Parse a reference suffix.</span>
1549
1550 <span class="sd">        @param ref: The reference of which this suffix is a part.</span>
1551 <span class="sd">        @type ref: L{Reference}.</span>
1552 <span class="sd">        @raise ConfigFormatError: if a syntax error is found.</span>
1553 <span class="sd">        &quot;&quot;&quot;</span>
1554         <span class="n">tt</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
1555         <span class="k">if</span> <span class="n">tt</span> <span class="o">==</span> <span class="n">DOT</span><span class="p">:</span>
1556             <span class="bp">self</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">DOT</span><span class="p">)</span>
1557             <span class="n">word</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">WORD</span><span class="p">)</span>
1558             <span class="n">ref</span><span class="o">.</span><span class="n">addElement</span><span class="p">(</span><span class="n">DOT</span><span class="p">,</span> <span class="n">word</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
1559         <span class="k">else</span><span class="p">:</span>
1560             <span class="bp">self</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">LBRACK2</span><span class="p">)</span>
1561             <span class="n">tt</span><span class="p">,</span> <span class="n">tv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">token</span>
1562             <span class="k">if</span> <span class="n">tt</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="n">NUMBER</span><span class="p">,</span> <span class="n">STRING</span><span class="p">]:</span>
1563                 <span class="k">raise</span> <span class="n">ConfigFormatError</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%s</span><span class="s">: expected number or string, found </span><span class="si">%r</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">(),</span> <span class="n">tv</span><span class="p">))</span>
1564             <span class="bp">self</span><span class="o">.</span><span class="n">token</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getToken</span><span class="p">()</span>
1565             <span class="n">tv</span> <span class="o">=</span> <span class="nb">eval</span><span class="p">(</span><span class="n">tv</span><span class="p">)</span>
1566             <span class="bp">self</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">RBRACK</span><span class="p">)</span>
1567             <span class="n">ref</span><span class="o">.</span><span class="n">addElement</span><span class="p">(</span><span class="n">LBRACK</span><span class="p">,</span> <span class="n">tv</span><span class="p">)</span>
1568 </div></div>
1569 <div class="viewcode-block" id="defaultMergeResolve"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.defaultMergeResolve">[docs]</a><span class="k">def</span> <span class="nf">defaultMergeResolve</span><span class="p">(</span><span class="n">map1</span><span class="p">,</span> <span class="n">map2</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
1570     <span class="sd">&quot;&quot;&quot;\</span>
1571 <span class="sd">    A default resolver for merge conflicts. </span>
1572 <span class="sd">    Returns a string indicating what action to take to resolve the conflict.</span>
1573
1574 <span class="sd">    @param map1: The map being merged into.</span>
1575 <span class="sd">    @type map1: L{Mapping}.</span>
1576 <span class="sd">    @param map2: The map being used as the merge operand.</span>
1577 <span class="sd">    @type map2: L{Mapping}.</span>
1578 <span class="sd">    @param key: The key in map2 (which also exists in map1).</span>
1579 <span class="sd">    @type key: str</span>
1580
1581 <span class="sd">    @return: One of &quot;merge&quot;, &quot;append&quot;, &quot;mismatch&quot; or &quot;overwrite&quot;</span>
1582 <span class="sd">             indicating what action should be taken. This should</span>
1583 <span class="sd">             be appropriate to the objects being merged - e.g.</span>
1584 <span class="sd">             there is no point returning &quot;merge&quot; if the two objects</span>
1585 <span class="sd">             are instances of L{Sequence}.</span>
1586
1587 <span class="sd">    @rtype: str</span>
1588 <span class="sd">    &quot;&quot;&quot;</span>
1589     <span class="n">obj1</span> <span class="o">=</span> <span class="n">map1</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
1590     <span class="n">obj2</span> <span class="o">=</span> <span class="n">map2</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
1591     <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj1</span><span class="p">,</span> <span class="n">Mapping</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj2</span><span class="p">,</span> <span class="n">Mapping</span><span class="p">):</span>
1592         <span class="n">rv</span> <span class="o">=</span> <span class="s">&quot;merge&quot;</span>
1593     <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj1</span><span class="p">,</span> <span class="n">Sequence</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj2</span><span class="p">,</span> <span class="n">Sequence</span><span class="p">):</span>
1594         <span class="n">rv</span> <span class="o">=</span> <span class="s">&quot;append&quot;</span>
1595     <span class="k">else</span><span class="p">:</span>
1596         <span class="n">rv</span> <span class="o">=</span> <span class="s">&quot;mismatch&quot;</span>
1597     <span class="k">return</span> <span class="n">rv</span>
1598 </div>
1599 <div class="viewcode-block" id="overwriteMergeResolve"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.overwriteMergeResolve">[docs]</a><span class="k">def</span> <span class="nf">overwriteMergeResolve</span><span class="p">(</span><span class="n">map1</span><span class="p">,</span> <span class="n">map2</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
1600     <span class="sd">&quot;&quot;&quot;</span>
1601 <span class="sd">    An overwriting resolver for merge conflicts. Calls L{defaultMergeResolve},</span>
1602 <span class="sd">    but where a &quot;mismatch&quot; is detected, returns &quot;overwrite&quot; instead.</span>
1603
1604 <span class="sd">    @param map1: The map being merged into.</span>
1605 <span class="sd">    @type map1: L{Mapping}.</span>
1606 <span class="sd">    @param map2: The map being used as the merge operand.</span>
1607 <span class="sd">    @type map2: L{Mapping}.</span>
1608 <span class="sd">    @param key: The key in map2 (which also exists in map1).</span>
1609 <span class="sd">    @type key: str</span>
1610 <span class="sd">    &quot;&quot;&quot;</span>
1611     <span class="n">rv</span> <span class="o">=</span> <span class="n">defaultMergeResolve</span><span class="p">(</span><span class="n">map1</span><span class="p">,</span> <span class="n">map2</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
1612     <span class="k">if</span> <span class="n">rv</span> <span class="o">==</span> <span class="s">&quot;mismatch&quot;</span><span class="p">:</span>
1613         <span class="n">rv</span> <span class="o">=</span> <span class="s">&quot;overwrite&quot;</span>
1614     <span class="k">return</span> <span class="n">rv</span>
1615 </div>
1616 <div class="viewcode-block" id="deepCopyMapping"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.deepCopyMapping">[docs]</a><span class="k">def</span> <span class="nf">deepCopyMapping</span><span class="p">(</span><span class="n">inMapping</span><span class="p">):</span>
1617     <span class="n">res</span> <span class="o">=</span> <span class="n">Mapping</span><span class="p">()</span>
1618     <span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="n">inMapping</span><span class="p">:</span>
1619         <span class="n">res</span><span class="p">[</span><span class="n">element</span><span class="p">]</span> <span class="o">=</span> <span class="n">inMapping</span><span class="p">[</span><span class="n">element</span><span class="p">]</span>
1620     <span class="k">return</span> <span class="n">res</span>
1621 </div>
1622 <div class="viewcode-block" id="ConfigMerger"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigMerger">[docs]</a><span class="k">class</span> <span class="nc">ConfigMerger</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
1623     <span class="sd">&quot;&quot;&quot;</span>
1624 <span class="sd">    This class is used for merging two configurations. If a key exists in the</span>
1625 <span class="sd">    merge operand but not the merge target, then the entry is copied from the</span>
1626 <span class="sd">    merge operand to the merge target. If a key exists in both configurations,</span>
1627 <span class="sd">    then a resolver (a callable) is called to decide how to handle the</span>
1628 <span class="sd">    conflict.</span>
1629 <span class="sd">    &quot;&quot;&quot;</span>
1630
1631     <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">resolver</span><span class="o">=</span><span class="n">defaultMergeResolve</span><span class="p">):</span>
1632         <span class="sd">&quot;&quot;&quot;</span>
1633 <span class="sd">        Initialise an instance.</span>
1634
1635 <span class="sd">        @param resolver:</span>
1636 <span class="sd">        @type resolver: A callable which takes the argument list</span>
1637 <span class="sd">        (map1, map2, key) where map1 is the mapping being merged into,</span>
1638 <span class="sd">        map2 is the merge operand and key is the clashing key. The callable</span>
1639 <span class="sd">        should return a string indicating how the conflict should be resolved.</span>
1640 <span class="sd">        For possible return values, see L{defaultMergeResolve}. The default</span>
1641 <span class="sd">        value preserves the old behaviour</span>
1642 <span class="sd">        &quot;&quot;&quot;</span>
1643         <span class="bp">self</span><span class="o">.</span><span class="n">resolver</span> <span class="o">=</span> <span class="n">resolver</span>
1644
1645 <div class="viewcode-block" id="ConfigMerger.merge"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigMerger.merge">[docs]</a>    <span class="k">def</span> <span class="nf">merge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">merged</span><span class="p">,</span> <span class="n">mergee</span><span class="p">):</span>
1646         <span class="sd">&quot;&quot;&quot;</span>
1647 <span class="sd">        Merge two configurations. The second configuration is unchanged,</span>
1648 <span class="sd">        and the first is changed to reflect the results of the merge.</span>
1649
1650 <span class="sd">        @param merged: The configuration to merge into.</span>
1651 <span class="sd">        @type merged: L{Config}.</span>
1652 <span class="sd">        @param mergee: The configuration to merge.</span>
1653 <span class="sd">        @type mergee: L{Config}.</span>
1654 <span class="sd">        &quot;&quot;&quot;</span>
1655         <span class="bp">self</span><span class="o">.</span><span class="n">mergeMapping</span><span class="p">(</span><span class="n">merged</span><span class="p">,</span> <span class="n">mergee</span><span class="p">)</span>
1656 </div>
1657 <div class="viewcode-block" id="ConfigMerger.overwriteKeys"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigMerger.overwriteKeys">[docs]</a>    <span class="k">def</span> <span class="nf">overwriteKeys</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">map1</span><span class="p">,</span> <span class="n">seq2</span><span class="p">):</span>
1658         <span class="sd">&quot;&quot;&quot;</span>
1659 <span class="sd">        Renint variables. The second mapping is unchanged,</span>
1660 <span class="sd">        and the first is changed depending the keys of the second mapping.</span>
1661 <span class="sd">        @param map1: The mapping to reinit keys into.</span>
1662 <span class="sd">        @type map1: L{Mapping}.</span>
1663 <span class="sd">        @param map2: The mapping container reinit information.</span>
1664 <span class="sd">        @type map2: L{Mapping}.</span>
1665 <span class="sd">        &quot;&quot;&quot;</span>
1666
1667         <span class="n">overwrite_list</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="n">seq2</span><span class="p">,</span> <span class="s">&#39;data&#39;</span><span class="p">)</span>
1668         <span class="k">for</span> <span class="n">overwrite_instruction</span> <span class="ow">in</span> <span class="n">overwrite_list</span><span class="p">:</span>
1669             <span class="nb">object</span><span class="o">.</span><span class="n">__setattr__</span><span class="p">(</span><span class="n">overwrite_instruction</span><span class="p">,</span> <span class="s">&#39;parent&#39;</span><span class="p">,</span> <span class="n">map1</span><span class="p">)</span>
1670             <span class="k">if</span> <span class="s">&quot;__condition__&quot;</span> <span class="ow">in</span> <span class="n">overwrite_instruction</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span>
1671                 <span class="n">overwrite_condition</span> <span class="o">=</span> <span class="n">overwrite_instruction</span><span class="p">[</span><span class="s">&quot;__condition__&quot;</span><span class="p">]</span>
1672                 <span class="k">if</span> <span class="nb">eval</span><span class="p">(</span><span class="n">overwrite_condition</span><span class="p">,</span> <span class="nb">globals</span><span class="p">(),</span> <span class="n">map1</span><span class="p">):</span>
1673                     <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">overwrite_instruction</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span>
1674                         <span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="s">&quot;__condition__&quot;</span><span class="p">:</span>
1675                             <span class="k">continue</span>
1676                         <span class="k">try</span><span class="p">:</span>
1677                             <span class="k">exec</span><span class="p">(</span> <span class="s">&#39;map1.&#39;</span> <span class="o">+</span> <span class="n">key</span> <span class="o">+</span> <span class="s">&quot; = &quot;</span> <span class="o">+</span> <span class="nb">repr</span><span class="p">(</span><span class="n">overwrite_instruction</span><span class="p">[</span><span class="n">key</span><span class="p">]))</span>
1678                         <span class="k">except</span><span class="p">:</span>
1679                             <span class="k">exec</span><span class="p">(</span><span class="s">&#39;map1.&#39;</span> <span class="o">+</span> <span class="n">key</span> <span class="o">+</span> <span class="s">&quot; = &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">overwrite_instruction</span><span class="p">[</span><span class="n">key</span><span class="p">]))</span>
1680             <span class="k">else</span><span class="p">:</span>
1681                 <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">overwrite_instruction</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span>
1682                     <span class="k">try</span><span class="p">:</span>
1683                         <span class="k">exec</span><span class="p">(</span><span class="s">&#39;map1.&#39;</span> <span class="o">+</span> <span class="n">key</span> <span class="o">+</span> <span class="s">&quot; = &quot;</span> <span class="o">+</span> <span class="nb">repr</span><span class="p">(</span><span class="n">overwrite_instruction</span><span class="p">[</span><span class="n">key</span><span class="p">]))</span>
1684                     <span class="k">except</span><span class="p">:</span>
1685                         <span class="k">exec</span><span class="p">(</span><span class="s">&#39;map1.&#39;</span> <span class="o">+</span> <span class="n">key</span> <span class="o">+</span> <span class="s">&quot; = &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">overwrite_instruction</span><span class="p">[</span><span class="n">key</span><span class="p">]))</span>
1686 </div>
1687 <div class="viewcode-block" id="ConfigMerger.mergeMapping"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigMerger.mergeMapping">[docs]</a>    <span class="k">def</span> <span class="nf">mergeMapping</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">map1</span><span class="p">,</span> <span class="n">map2</span><span class="p">):</span>
1688         <span class="sd">&quot;&quot;&quot;</span>
1689 <span class="sd">        Merge two mappings recursively. The second mapping is unchanged,</span>
1690 <span class="sd">        and the first is changed to reflect the results of the merge.</span>
1691
1692 <span class="sd">        @param map1: The mapping to merge into.</span>
1693 <span class="sd">        @type map1: L{Mapping}.</span>
1694 <span class="sd">        @param map2: The mapping to merge.</span>
1695 <span class="sd">        @type map2: L{Mapping}.</span>
1696 <span class="sd">        &quot;&quot;&quot;</span>
1697         <span class="n">keys</span> <span class="o">=</span> <span class="n">map1</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span>
1698         <span class="k">global</span> <span class="n">__resolveOverwrite__</span>
1699         <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">map2</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span>
1700             <span class="k">if</span> <span class="n">__resolveOverwrite__</span> <span class="ow">and</span> <span class="n">key</span> <span class="o">==</span> <span class="s">&quot;__overwrite__&quot;</span><span class="p">:</span>
1701                 <span class="bp">self</span><span class="o">.</span><span class="n">overwriteKeys</span><span class="p">(</span><span class="n">map1</span><span class="p">,</span><span class="n">map2</span><span class="p">[</span><span class="n">key</span><span class="p">])</span>
1702
1703             <span class="k">elif</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">keys</span><span class="p">:</span>
1704                 <span class="n">map1</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">map2</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
1705                 <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">map1</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="n">Container</span><span class="p">)</span> <span class="p">:</span>
1706                     <span class="nb">object</span><span class="o">.</span><span class="n">__setattr__</span><span class="p">(</span><span class="n">map1</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="s">&#39;parent&#39;</span><span class="p">,</span> <span class="n">map1</span><span class="p">)</span>
1707             <span class="k">else</span><span class="p">:</span>
1708                 <span class="n">obj1</span> <span class="o">=</span> <span class="n">map1</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
1709                 <span class="n">obj2</span> <span class="o">=</span> <span class="n">map2</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
1710                 <span class="n">decision</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">resolver</span><span class="p">(</span><span class="n">map1</span><span class="p">,</span> <span class="n">map2</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
1711                 <span class="k">if</span> <span class="n">decision</span> <span class="o">==</span> <span class="s">&quot;merge&quot;</span><span class="p">:</span>
1712                     <span class="bp">self</span><span class="o">.</span><span class="n">mergeMapping</span><span class="p">(</span><span class="n">obj1</span><span class="p">,</span> <span class="n">obj2</span><span class="p">)</span>
1713                 <span class="k">elif</span> <span class="n">decision</span> <span class="o">==</span> <span class="s">&quot;append&quot;</span><span class="p">:</span>
1714                     <span class="bp">self</span><span class="o">.</span><span class="n">mergeSequence</span><span class="p">(</span><span class="n">obj1</span><span class="p">,</span> <span class="n">obj2</span><span class="p">)</span>
1715                 <span class="k">elif</span> <span class="n">decision</span> <span class="o">==</span> <span class="s">&quot;overwrite&quot;</span><span class="p">:</span>
1716                     <span class="n">map1</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">obj2</span>
1717                     <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">map1</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="n">Container</span><span class="p">):</span>
1718                         <span class="nb">object</span><span class="o">.</span><span class="n">__setattr__</span><span class="p">(</span><span class="n">map1</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="s">&#39;parent&#39;</span><span class="p">,</span> <span class="n">map1</span><span class="p">)</span>
1719                 <span class="k">elif</span> <span class="n">decision</span> <span class="o">==</span> <span class="s">&quot;mismatch&quot;</span><span class="p">:</span>
1720                     <span class="bp">self</span><span class="o">.</span><span class="n">handleMismatch</span><span class="p">(</span><span class="n">obj1</span><span class="p">,</span> <span class="n">obj2</span><span class="p">)</span>
1721                 <span class="k">else</span><span class="p">:</span>
1722                     <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;unable to merge: don&#39;t know how to implement </span><span class="si">%r</span><span class="s">&quot;</span>
1723                     <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span> <span class="o">%</span> <span class="n">decision</span><span class="p">)</span>
1724 </div>
1725 <div class="viewcode-block" id="ConfigMerger.mergeSequence"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigMerger.mergeSequence">[docs]</a>    <span class="k">def</span> <span class="nf">mergeSequence</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">seq1</span><span class="p">,</span> <span class="n">seq2</span><span class="p">):</span>
1726         <span class="sd">&quot;&quot;&quot;</span>
1727 <span class="sd">        Merge two sequences. The second sequence is unchanged,</span>
1728 <span class="sd">        and the first is changed to have the elements of the second</span>
1729 <span class="sd">        appended to it.</span>
1730
1731 <span class="sd">        @param seq1: The sequence to merge into.</span>
1732 <span class="sd">        @type seq1: L{Sequence}.</span>
1733 <span class="sd">        @param seq2: The sequence to merge.</span>
1734 <span class="sd">        @type seq2: L{Sequence}.</span>
1735 <span class="sd">        &quot;&quot;&quot;</span>
1736         <span class="n">data1</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="n">seq1</span><span class="p">,</span> <span class="s">&#39;data&#39;</span><span class="p">)</span>
1737         <span class="n">data2</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="n">seq2</span><span class="p">,</span> <span class="s">&#39;data&#39;</span><span class="p">)</span>
1738         <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">data2</span><span class="p">:</span>
1739             <span class="n">data1</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
1740         <span class="n">comment1</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="n">seq1</span><span class="p">,</span> <span class="s">&#39;comments&#39;</span><span class="p">)</span>
1741         <span class="n">comment2</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__getattribute__</span><span class="p">(</span><span class="n">seq2</span><span class="p">,</span> <span class="s">&#39;comments&#39;</span><span class="p">)</span>
1742         <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">comment2</span><span class="p">:</span>
1743             <span class="n">comment1</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
1744 </div>
1745 <div class="viewcode-block" id="ConfigMerger.handleMismatch"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigMerger.handleMismatch">[docs]</a>    <span class="k">def</span> <span class="nf">handleMismatch</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj1</span><span class="p">,</span> <span class="n">obj2</span><span class="p">):</span>
1746         <span class="sd">&quot;&quot;&quot;</span>
1747 <span class="sd">        Handle a mismatch between two objects.</span>
1748
1749 <span class="sd">        @param obj1: The object to merge into.</span>
1750 <span class="sd">        @type obj1: any</span>
1751 <span class="sd">        @param obj2: The object to merge.</span>
1752 <span class="sd">        @type obj2: any</span>
1753 <span class="sd">        &quot;&quot;&quot;</span>
1754         <span class="k">raise</span> <span class="n">ConfigError</span><span class="p">(</span><span class="s">&quot;unable to merge </span><span class="si">%r</span><span class="s"> with </span><span class="si">%r</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj1</span><span class="p">,</span> <span class="n">obj2</span><span class="p">))</span>
1755 </div></div>
1756 <div class="viewcode-block" id="ConfigList"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigList">[docs]</a><span class="k">class</span> <span class="nc">ConfigList</span><span class="p">(</span><span class="nb">list</span><span class="p">):</span>
1757     <span class="sd">&quot;&quot;&quot;</span>
1758 <span class="sd">    This class implements an ordered list of configurations and allows you</span>
1759 <span class="sd">    to try getting the configuration from each entry in turn, returning</span>
1760 <span class="sd">    the first successfully obtained value.</span>
1761 <span class="sd">    &quot;&quot;&quot;</span>
1762
1763 <div class="viewcode-block" id="ConfigList.getByPath"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.pyconf.ConfigList.getByPath">[docs]</a>    <span class="k">def</span> <span class="nf">getByPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">):</span>
1764         <span class="sd">&quot;&quot;&quot;</span>
1765 <span class="sd">        Obtain a value from the first configuration in the list which defines</span>
1766 <span class="sd">        it.</span>
1767
1768 <span class="sd">        @param path: The path of the value to retrieve.</span>
1769 <span class="sd">        @type path: str</span>
1770 <span class="sd">        @return: The value from the earliest configuration in the list which</span>
1771 <span class="sd">        defines it.</span>
1772 <span class="sd">        @rtype: any</span>
1773 <span class="sd">        @raise ConfigError: If no configuration in the list has an entry with</span>
1774 <span class="sd">        the specified path.</span>
1775 <span class="sd">        &quot;&quot;&quot;</span>
1776         <span class="n">found</span> <span class="o">=</span> <span class="bp">False</span>
1777         <span class="n">rv</span> <span class="o">=</span> <span class="bp">None</span>
1778         <span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
1779             <span class="k">try</span><span class="p">:</span>
1780                 <span class="n">rv</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">getByPath</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
1781                 <span class="n">found</span> <span class="o">=</span> <span class="bp">True</span>
1782                 <span class="k">break</span>
1783             <span class="k">except</span> <span class="n">ConfigError</span><span class="p">:</span>
1784                 <span class="k">pass</span>
1785         <span class="k">if</span> <span class="ow">not</span> <span class="n">found</span><span class="p">:</span>
1786             <span class="k">raise</span> <span class="n">ConfigError</span><span class="p">(</span><span class="s">&quot;unable to resolve </span><span class="si">%r</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">path</span><span class="p">)</span>
1787         <span class="k">return</span> <span class="n">rv</span></div></div>
1788 </pre></div>
1789
1790           </div>
1791         </div>
1792       </div>
1793       <div class="sphinxsidebar">
1794         <div class="sphinxsidebarwrapper">
1795             <p class="logo"><a href="../../index.html">
1796               <img class="logo" src="../../_static/sat_v5.0.png" alt="Logo"/>
1797             </a></p><div class="relations">
1798 <h3>Related Topics</h3>
1799 <ul>
1800   <li><a href="../../index.html">Documentation overview</a><ul>
1801   <li><a href="../index.html">Module code</a><ul>
1802   </ul></li>
1803   </ul></li>
1804 </ul>
1805 </div>
1806 <div id="searchbox" style="display: none">
1807   <h3>Quick search</h3>
1808     <form class="search" action="../../search.html" method="get">
1809       <input type="text" name="q" />
1810       <input type="submit" value="Go" />
1811       <input type="hidden" name="check_keywords" value="yes" />
1812       <input type="hidden" name="area" value="default" />
1813     </form>
1814     <p class="searchtip" style="font-size: 90%">
1815     Enter search terms or a module, class or function name.
1816     </p>
1817 </div>
1818 <script type="text/javascript">$('#searchbox').show(0);</script>
1819         </div>
1820       </div>
1821       <div class="clearer"></div>
1822     </div>
1823     <div class="footer">
1824       &copy;2018, CEA.
1825       
1826       |
1827       Powered by <a href="http://sphinx-doc.org/">Sphinx 1.1.3</a>
1828       &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster </a>
1829       
1830     </div>
1831
1832     
1833
1834     
1835   </body>
1836 </html>