2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
3 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6 <html xmlns="http://www.w3.org/1999/xhtml">
8 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
10 <title>src.pyconf — salomeTools 5.0.0dev documentation</title>
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" />
16 <script type="text/javascript">
17 var DOCUMENTATION_OPTIONS = {
20 COLLAPSE_INDEX: false,
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" />
32 <link rel="stylesheet" href="../../_static/custom.css" type="text/css" />
35 <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
41 <div class="document">
42 <div class="documentwrapper">
43 <div class="bodywrapper">
44 <div class="body" role="main">
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>
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>
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>
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>
87 <span class="sd">"""</span>
88 <span class="sd">This is a configuration module for Python.</span>
90 <span class="sd">This module should work under Python versions >= 2.2, and cannot be used with</span>
91 <span class="sd">earlier versions since it uses new-style classes.</span>
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<http://www.red-dove.com/python_config.html|_blank>} (follow the</span>
96 <span class="sd">download link).</span>
98 <span class="sd">A simple example - with the example configuration file::</span>
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: 'Welcome'</span>
105 <span class="sd"> name: 'Harry'</span>
106 <span class="sd"> }</span>
107 <span class="sd"> {</span>
108 <span class="sd"> stream : `sys.stdout`</span>
109 <span class="sd"> message: 'Welkom'</span>
110 <span class="sd"> name: 'Ruud'</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: 'Bienvenue'</span>
115 <span class="sd"> name: Yves</span>
116 <span class="sd"> }</span>
117 <span class="sd"> ]</span>
119 <span class="sd">a program to read the configuration would be::</span>
121 <span class="sd"> from config import Config</span>
123 <span class="sd"> f = file('simple.cfg')</span>
124 <span class="sd"> cfg = Config(f)</span>
125 <span class="sd"> for m in cfg.messages:</span>
126 <span class="sd"> s = '%s, %s' % (m.message, m.name)</span>
127 <span class="sd"> try:</span>
128 <span class="sd"> print >> m.stream, s</span>
129 <span class="sd"> except IOError, e:</span>
130 <span class="sd"> print e</span>
132 <span class="sd">which, when run, would yield the console output::</span>
134 <span class="sd"> Welcome, Harry</span>
135 <span class="sd"> Welkom, Ruud</span>
136 <span class="sd"> Bienvenue, Yves</span>
138 <span class="sd">See U{this tutorial<http://www.red-dove.com/python_config.html|_blank>} for more</span>
139 <span class="sd">information.</span>
141 <span class="sd">#modified for salomeTools</span>
142 <span class="sd">@version: 0.3.7.1</span>
144 <span class="sd">@author: Vinay Sajip</span>
146 <span class="sd">@copyright: Copyright (C) 2004-2007 Vinay Sajip. All Rights Reserved.</span>
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>
153 <span class="sd">The default value of this variable is L{defaultStreamOpener}. For an example</span>
154 <span class="sd">of how it's used, see test_config.py (search for streamOpener).</span>
155 <span class="sd">"""</span>
157 <span class="n">__author__</span> <span class="o">=</span> <span class="s">"Vinay Sajip <vinay_sajip@red-dove.com>"</span>
158 <span class="n">__status__</span> <span class="o">=</span> <span class="s">"alpha"</span>
159 <span class="n">__version__</span> <span class="o">=</span> <span class="s">"0.3.7.1"</span> <span class="c">#modified for salomeTools</span>
160 <span class="n">__date__</span> <span class="o">=</span> <span class="s">"05 October 2007"</span>
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>
166 <span class="n">WORD</span> <span class="o">=</span> <span class="s">'a'</span>
167 <span class="n">NUMBER</span> <span class="o">=</span> <span class="s">'9'</span>
168 <span class="n">STRING</span> <span class="o">=</span> <span class="s">'"'</span>
169 <span class="n">EOF</span> <span class="o">=</span> <span class="s">''</span>
170 <span class="n">LCURLY</span> <span class="o">=</span> <span class="s">'{'</span>
171 <span class="n">RCURLY</span> <span class="o">=</span> <span class="s">'}'</span>
172 <span class="n">LBRACK</span> <span class="o">=</span> <span class="s">'['</span>
173 <span class="n">LBRACK2</span> <span class="o">=</span> <span class="s">'a['</span>
174 <span class="n">RBRACK</span> <span class="o">=</span> <span class="s">']'</span>
175 <span class="n">LPAREN</span> <span class="o">=</span> <span class="s">'('</span>
176 <span class="n">LPAREN2</span> <span class="o">=</span> <span class="s">'(('</span>
177 <span class="n">RPAREN</span> <span class="o">=</span> <span class="s">')'</span>
178 <span class="n">DOT</span> <span class="o">=</span> <span class="s">'.'</span>
179 <span class="n">COMMA</span> <span class="o">=</span> <span class="s">','</span>
180 <span class="n">COLON</span> <span class="o">=</span> <span class="s">':'</span>
181 <span class="n">AT</span> <span class="o">=</span> <span class="s">'@'</span>
182 <span class="n">PLUS</span> <span class="o">=</span> <span class="s">'+'</span>
183 <span class="n">MINUS</span> <span class="o">=</span> <span class="s">'-'</span>
184 <span class="n">STAR</span> <span class="o">=</span> <span class="s">'*'</span>
185 <span class="n">SLASH</span> <span class="o">=</span> <span class="s">'/'</span>
186 <span class="n">MOD</span> <span class="o">=</span> <span class="s">'%'</span>
187 <span class="n">BACKTICK</span> <span class="o">=</span> <span class="s">'`'</span>
188 <span class="n">DOLLAR</span> <span class="o">=</span> <span class="s">'$'</span>
189 <span class="n">TRUE</span> <span class="o">=</span> <span class="s">'True'</span>
190 <span class="n">FALSE</span> <span class="o">=</span> <span class="s">'False'</span>
191 <span class="n">NONE</span> <span class="o">=</span> <span class="s">'None'</span>
193 <span class="n">WORDCHARS</span> <span class="o">=</span> <span class="s">"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_"</span>
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">'win32'</span><span class="p">:</span>
196 <span class="n">NEWLINE</span> <span class="o">=</span> <span class="s">'</span><span class="se">\r\n</span><span class="s">'</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">'mac'</span><span class="p">:</span>
198 <span class="n">NEWLINE</span> <span class="o">=</span> <span class="s">'</span><span class="se">\r</span><span class="s">'</span>
199 <span class="k">else</span><span class="p">:</span>
200 <span class="n">NEWLINE</span> <span class="o">=</span> <span class="s">'</span><span class="se">\n</span><span class="s">'</span>
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>
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">"""</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>
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"> """</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">"""</span>
217 <span class="sd"> Initialize an instance.</span>
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"> """</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">'utf-32le'</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">'utf-32be'</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">'utf-8'</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">'utf-16le'</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">'utf-16be'</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">>=</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>
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''</span>
255 <span class="k">while</span> <span class="n">size</span> <span class="o">></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>
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>
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">''</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''</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">'</span><span class="se">\n</span><span class="s">'</span><span class="p">:</span>
275 <span class="k">break</span>
276 <span class="k">return</span> <span class="n">line</span>
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">"""</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>
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"> """</span>
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">"""</span>
289 <span class="sd"> Initialize an instance.</span>
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"> """</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">"utf-8"</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">"utf-16be"</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">"utf-16le"</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">"utf-32be"</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">"utf-32le"</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>
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>
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>
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>
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>
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">"""\</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>
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>
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"> """</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">'rb'</span><span class="p">))</span>
341 <span class="n">streamOpener</span> <span class="o">=</span> <span class="bp">None</span>
343 <span class="n">__resolveOverwrite__</span> <span class="o">=</span> <span class="bp">True</span>
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">"""</span>
347 <span class="sd"> This is the base class of exceptions raised by this module.</span>
348 <span class="sd"> """</span>
349 <span class="k">pass</span>
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">"""</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"> """</span>
356 <span class="k">pass</span>
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">"""</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"> """</span>
363 <span class="k">pass</span>
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">"""</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>
371 <span class="sd"> Examples::</span>
373 <span class="sd"> isWord('a word') ->False</span>
374 <span class="sd"> isWord('award') -> True</span>
375 <span class="sd"> isWord(9) -> False</span>
376 <span class="sd"> isWord('a_b_c_') ->True</span>
378 <span class="sd"> @note: isWord('9abc') will return True - not exactly correct, but adequate</span>
379 <span class="sd"> for the way it's used here.</span>
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"> """</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">''</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">'_'</span><span class="p">,</span> <span class="s">''</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>
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">"""\</span>
393 <span class="sd"> Make a path from a prefix and suffix.</span>
395 <span class="sd"> Examples:</span>
396 <span class="sd"> makePath('', 'suffix') -> 'suffix'</span>
397 <span class="sd"> makePath('prefix', 'suffix') -> 'prefix.suffix'</span>
398 <span class="sd"> makePath('prefix', '[1]') -> 'prefix[1]'</span>
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"> """</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">'['</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">'.'</span> <span class="o">+</span> <span class="n">suffix</span>
413 <span class="k">return</span> <span class="n">rv</span>
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">"""</span>
418 <span class="sd"> This internal class is the base class for mappings and sequences.</span>
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>
423 <span class="sd"> Example::</span>
425 <span class="sd"> a.list.of[1].or['more'].elements</span>
426 <span class="sd"> """</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">"""</span>
429 <span class="sd"> Initialize an instance.</span>
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"> """</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">'parent'</span><span class="p">,</span> <span class="n">parent</span><span class="p">)</span>
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">"""</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"> """</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">'path'</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span>
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">"""</span>
447 <span class="sd"> Evaluate items which are instances of L{Reference} or L{Expression}.</span>
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>
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"> """</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>
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">"""</span>
467 <span class="sd"> Write this instance to a stream at the specified indentation level.</span>
469 <span class="sd"> Should be redefined in subclasses.</span>
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"> """</span>
479 <span class="k">raise</span> <span class="ne">NotImplementedError</span>
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">' '</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">' '</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">'</span><span class="si">%s%r%s</span><span class="s">'</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">'</span><span class="si">%s%s%s</span><span class="s">'</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>
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">"""</span>
495 <span class="sd"> This internal class implements key-value mappings in configurations.</span>
496 <span class="sd"> """</span>
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">"""</span>
500 <span class="sd"> Initialize an instance.</span>
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"> """</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">'path'</span><span class="p">,</span> <span class="s">''</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">'data'</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">'order'</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">'comments'</span><span class="p">,</span> <span class="p">{})</span>
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">"""</span>
513 <span class="sd"> Remove an item</span>
514 <span class="sd"> """</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">'data'</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">'order'</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">'comments'</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>
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">'data'</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>
531 <span class="n">__getattr__</span> <span class="o">=</span> <span class="n">__getitem__</span>
533 <span class="sd">'''</span>
534 <span class="sd"> def __getattribute__(self, name):</span>
535 <span class="sd"> if name == "__dict__":</span>
536 <span class="sd"> return {}</span>
537 <span class="sd"> if name in ["__methods__", "__members__"]:</span>
538 <span class="sd"> return []</span>
539 <span class="sd"> #if name == "__class__":</span>
540 <span class="sd"> # return ''</span>
541 <span class="sd"> data = object.__getattribute__(self, "data")</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"> '''</span>
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>
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">'order'</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>
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">"""</span>
563 <span class="sd"> Add a key-value mapping with a comment.</span>
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"> """</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">'data'</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">'order'</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">'comments'</span><span class="p">)</span>
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">"repeated key: </span><span class="si">%s</span><span class="s">"</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>
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>
590 <span class="n">__setitem__</span> <span class="o">=</span> <span class="n">__setattr__</span>
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">"""</span>
594 <span class="sd"> Return the keys in a similar way to a dictionary.</span>
595 <span class="sd"> """</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">'order'</span><span class="p">)</span>
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">"""</span>
600 <span class="sd"> Allows a dictionary-style get operation.</span>
601 <span class="sd"> """</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>
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">'data'</span><span class="p">))</span>
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">'data'</span><span class="p">))</span>
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">'order'</span><span class="p">))</span>
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>
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">'order'</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>
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">"""</span>
624 <span class="sd"> Write this instance to a stream at the specified indentation level.</span>
626 <span class="sd"> Should be redefined in subclasses.</span>
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"> """</span>
635 <span class="n">indstr</span> <span class="o">=</span> <span class="n">indent</span> <span class="o">*</span> <span class="s">' '</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">' { }</span><span class="si">%s</span><span class="s">'</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">'</span><span class="si">%s</span><span class="s">{</span><span class="si">%s</span><span class="s">'</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">'</span><span class="si">%s</span><span class="s">}</span><span class="si">%s</span><span class="s">'</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>
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">"""</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"> """</span>
653 <span class="n">indstr</span> <span class="o">=</span> <span class="n">indent</span> <span class="o">*</span> <span class="s">' '</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">'order'</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">'data'</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">'</span><span class="si">%s</span><span class="s">#</span><span class="si">%s</span><span class="s">'</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">"u'"</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">'</span><span class="si">%s%-*s</span><span class="s"> :'</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>
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">"""</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"> """</span>
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">"""</span>
682 <span class="sd"> This internal class is used for implementing default namespaces.</span>
684 <span class="sd"> An instance acts as a namespace.</span>
685 <span class="sd"> """</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>
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">"""</span>
692 <span class="sd"> Initializes an instance.</span>
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"> """</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">'reader'</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">'namespaces'</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">"load"</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">""</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>
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">"""</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"> """</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">'reader'</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>
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">"""</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"> """</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">'namespaces'</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>
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">"""</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"> """</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">'namespaces'</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>
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">"""</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"> """</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>
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">"""</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"> """</span>
796 <span class="n">s</span> <span class="o">=</span> <span class="s">'self.'</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>
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">"""</span>
804 <span class="sd"> This internal class implements a value which is a sequence of other values.</span>
805 <span class="sd"> """</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">"""</span>
808 <span class="sd"> This internal class implements an iterator for a L{Sequence} instance.</span>
809 <span class="sd"> """</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">'data'</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>
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>
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">>=</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>
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">>=</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>
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">"""</span>
835 <span class="sd"> Initialize an instance.</span>
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"> """</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">'data'</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">'comments'</span><span class="p">,</span> <span class="p">[])</span>
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">"""</span>
846 <span class="sd"> Add an item to the sequence.</span>
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"> """</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">'data'</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">'comments'</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>
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">'data'</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">'</span><span class="si">%r</span><span class="s"> is not a valid index for </span><span class="si">%r</span><span class="s">'</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">'path'</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>
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>
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">'data'</span><span class="p">))</span>
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>
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">'data'</span><span class="p">))</span>
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">"""</span>
888 <span class="sd"> Write this instance to a stream at the specified indentation level.</span>
890 <span class="sd"> Should be redefined in subclasses.</span>
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"> """</span>
899 <span class="n">indstr</span> <span class="o">=</span> <span class="n">indent</span> <span class="o">*</span> <span class="s">' '</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">' [ ]</span><span class="si">%s</span><span class="s">'</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">'</span><span class="si">%s</span><span class="s">[</span><span class="si">%s</span><span class="s">'</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">'</span><span class="si">%s</span><span class="s">]</span><span class="si">%s</span><span class="s">'</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>
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">"""</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, > 0</span>
915 <span class="sd"> @type indent: int</span>
916 <span class="sd"> """</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">"sequence cannot be saved as a top-level item"</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">'data'</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">'comments'</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">' '</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">'</span><span class="si">%s</span><span class="s">#</span><span class="si">%s</span><span class="s">'</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>
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">"""</span>
934 <span class="sd"> This internal class implements a value which is a reference to another value.</span>
935 <span class="sd"> """</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">"""</span>
938 <span class="sd"> Initialize an instance.</span>
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"> """</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>
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">"""</span>
953 <span class="sd"> Add an element to the reference.</span>
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"> """</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>
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">"""</span>
964 <span class="sd"> Find the closest enclosing configuration to the specified container.</span>
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"> """</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">'parent'</span><span class="p">)</span>
973 <span class="k">return</span> <span class="n">container</span>
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">"""</span>
977 <span class="sd"> Resolve this instance in the context of a container.</span>
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"> """</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">'path'</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">'namespaces'</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">'parent'</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">"unable to evaluate </span><span class="si">%r</span><span class="s"> in the configuration </span><span class="si">%s</span><span class="s">"</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>
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">'.</span><span class="si">%s</span><span class="s">'</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">'[</span><span class="si">%r</span><span class="s">]'</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>
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>
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">"""</span>
1034 <span class="sd"> This internal class implements a value which is obtained by evaluating an expression.</span>
1035 <span class="sd"> """</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">"""</span>
1038 <span class="sd"> Initialize an instance.</span>
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"> """</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>
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">'</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">'</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>
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>
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">"""</span>
1059 <span class="sd"> Evaluate this instance in the context of a container.</span>
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"> """</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>
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">"""</span>
1095 <span class="sd"> This internal class implements a parser for configurations.</span>
1096 <span class="sd"> """</span>
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">'#'</span>
1106 <span class="bp">self</span><span class="o">.</span><span class="n">whitespace</span> <span class="o">=</span> <span class="s">' </span><span class="se">\t\r\n</span><span class="s">'</span>
1107 <span class="bp">self</span><span class="o">.</span><span class="n">quotes</span> <span class="o">=</span> <span class="s">'</span><span class="se">\'</span><span class="s">"'</span>
1108 <span class="bp">self</span><span class="o">.</span><span class="n">punct</span> <span class="o">=</span> <span class="s">':-+*/%,.{}[]()@`$'</span>
1109 <span class="bp">self</span><span class="o">.</span><span class="n">digits</span> <span class="o">=</span> <span class="s">'0123456789'</span>
1110 <span class="bp">self</span><span class="o">.</span><span class="n">wordchars</span> <span class="o">=</span> <span class="s">'</span><span class="si">%s</span><span class="s">'</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>
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">"""</span>
1118 <span class="sd"> Return the current location (filename, line, column) in the stream</span>
1119 <span class="sd"> as a string.</span>
1121 <span class="sd"> Used when printing error messages,</span>
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"> """</span>
1126 <span class="k">return</span> <span class="s">"</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">)"</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>
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">"""</span>
1130 <span class="sd"> Get the next char from the stream. Update line and column numbers</span>
1131 <span class="sd"> appropriately.</span>
1133 <span class="sd"> @return: The next character from the stream.</span>
1134 <span class="sd"> @rtype: str</span>
1135 <span class="sd"> """</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">'</span><span class="se">\n</span><span class="s">'</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>
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">"<ConfigReader at 0x</span><span class="si">%08x</span><span class="s">>"</span> <span class="o">%</span> <span class="nb">id</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
1153 <span class="n">__str__</span> <span class="o">=</span> <span class="n">__repr__</span>
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">"""</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>
1161 <span class="sd"> Multiline string tokenizing is thanks to David Janes (BlogMatrix)</span>
1163 <span class="sd"> @return: The next token.</span>
1164 <span class="sd"> @rtype: A token tuple.</span>
1165 <span class="sd"> """</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">''</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">'#'</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">'#'</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">>=</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">'</span><span class="se">\\</span><span class="s">'</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">'</span><span class="se">\\</span><span class="s">'</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">'</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">'</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">']'</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">'['</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">'('</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">'.'</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">'.'</span><span class="p">)</span> <span class="o"><</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">"True"</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">"False"</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">"None"</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">'</span><span class="si">%s</span><span class="s">: Unexpected character: </span><span class="si">%r</span><span class="s">'</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>
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">'ascii'</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>
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">"""</span>
1275 <span class="sd"> Load the configuration from the specified stream.</span>
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"> """</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">"internal error: load called with parent but no suffix"</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">'path'</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">'</span><span class="si">%s</span><span class="s">: expecting EOF, found </span><span class="si">%r</span><span class="s">'</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>
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">"""</span>
1300 <span class="sd"> Set the stream to the specified value, and prepare to read from it.</span>
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"> """</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">'name'</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">'?'</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>
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">"""</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>
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's expected.</span>
1325 <span class="sd"> """</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">"</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">"</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>
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">"""</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>
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"> """</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>
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">"""</span>
1345 <span class="sd"> Parse a key-value pair, and add it to the provided L{Mapping}.</span>
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"> """</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">'[</span><span class="si">%s</span><span class="s">]'</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">"</span><span class="si">%s</span><span class="s">: expecting word or string, found </span><span class="si">%r</span><span class="s">"</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">"</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">"</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">"</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">"</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>
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">"""</span>
1384 <span class="sd"> Parse a value.</span>
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"> """</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">"</span><span class="si">%s</span><span class="s">: unexpected input: </span><span class="si">%r</span><span class="s">"</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>
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">"""</span>
1409 <span class="sd"> Parse a sequence.</span>
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"> """</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">'path'</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">'[</span><span class="si">%d</span><span class="s">]'</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>
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">"""</span>
1441 <span class="sd"> Parse a mapping.</span>
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"> """</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">'path'</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>
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">"""</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>
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"> """</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>
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">"""</span>
1484 <span class="sd"> Parse a term in an additive expression (a + b, a - b)</span>
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"> """</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>
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">"""</span>
1501 <span class="sd"> Parse a factor in an multiplicative expression (a * b, a / b, a % b)</span>
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"> """</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">"</span><span class="si">%s</span><span class="s">: unexpected input: </span><span class="si">%r</span><span class="s">"</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>
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">"""</span>
1534 <span class="sd"> Parse a reference.</span>
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"> """</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>
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">"""</span>
1548 <span class="sd"> Parse a reference suffix.</span>
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"> """</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">"</span><span class="si">%s</span><span class="s">: expected number or string, found </span><span class="si">%r</span><span class="s">"</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>
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">"""\</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>
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>
1581 <span class="sd"> @return: One of "merge", "append", "mismatch" or "overwrite"</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 "merge" if the two objects</span>
1585 <span class="sd"> are instances of L{Sequence}.</span>
1587 <span class="sd"> @rtype: str</span>
1588 <span class="sd"> """</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">"merge"</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">"append"</span>
1595 <span class="k">else</span><span class="p">:</span>
1596 <span class="n">rv</span> <span class="o">=</span> <span class="s">"mismatch"</span>
1597 <span class="k">return</span> <span class="n">rv</span>
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">"""</span>
1601 <span class="sd"> An overwriting resolver for merge conflicts. Calls L{defaultMergeResolve},</span>
1602 <span class="sd"> but where a "mismatch" is detected, returns "overwrite" instead.</span>
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"> """</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">"mismatch"</span><span class="p">:</span>
1613 <span class="n">rv</span> <span class="o">=</span> <span class="s">"overwrite"</span>
1614 <span class="k">return</span> <span class="n">rv</span>
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>
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">"""</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"> """</span>
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">"""</span>
1633 <span class="sd"> Initialise an instance.</span>
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"> """</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>
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">"""</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>
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"> """</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>
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">"""</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"> """</span>
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">'data'</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">'parent'</span><span class="p">,</span> <span class="n">map1</span><span class="p">)</span>
1670 <span class="k">if</span> <span class="s">"__condition__"</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">"__condition__"</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">"__condition__"</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">'map1.'</span> <span class="o">+</span> <span class="n">key</span> <span class="o">+</span> <span class="s">" = "</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">'map1.'</span> <span class="o">+</span> <span class="n">key</span> <span class="o">+</span> <span class="s">" = "</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">'map1.'</span> <span class="o">+</span> <span class="n">key</span> <span class="o">+</span> <span class="s">" = "</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">'map1.'</span> <span class="o">+</span> <span class="n">key</span> <span class="o">+</span> <span class="s">" = "</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>
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">"""</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>
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"> """</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">"__overwrite__"</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>
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">'parent'</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">"merge"</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">"append"</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">"overwrite"</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">'parent'</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">"mismatch"</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">"unable to merge: don't know how to implement </span><span class="si">%r</span><span class="s">"</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>
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">"""</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>
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"> """</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">'data'</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">'data'</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">'comments'</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">'comments'</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>
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">"""</span>
1747 <span class="sd"> Handle a mismatch between two objects.</span>
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"> """</span>
1754 <span class="k">raise</span> <span class="n">ConfigError</span><span class="p">(</span><span class="s">"unable to merge </span><span class="si">%r</span><span class="s"> with </span><span class="si">%r</span><span class="s">"</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>
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">"""</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"> """</span>
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">"""</span>
1765 <span class="sd"> Obtain a value from the first configuration in the list which defines</span>
1766 <span class="sd"> it.</span>
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"> """</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">"unable to resolve </span><span class="si">%r</span><span class="s">"</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>
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>
1800 <li><a href="../../index.html">Documentation overview</a><ul>
1801 <li><a href="../index.html">Module code</a><ul>
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" />
1814 <p class="searchtip" style="font-size: 90%">
1815 Enter search terms or a module, class or function name.
1818 <script type="text/javascript">$('#searchbox').show(0);</script>
1821 <div class="clearer"></div>
1823 <div class="footer">
1827 Powered by <a href="http://sphinx-doc.org/">Sphinx 1.1.3</a>
1828 & <a href="https://github.com/bitprophet/alabaster">Alabaster </a>