terminator/doc/apidoc/_build/html/_modules/terminatorlib/configobj/configobj.html

2698 lines
318 KiB
HTML

<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>terminatorlib.configobj.configobj &mdash; terminatorlib 0.98 documentation</title>
<link rel="stylesheet" href="../../../_static/css/theme.css" type="text/css" />
<link rel="top" title="terminatorlib 0.98 documentation" href="../../../index.html"/>
<link rel="up" title="Module code" href="../../index.html"/>
<script src="_static/js/modernizr.min.js"></script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-nav-search">
<a href="../../../index.html" class="icon icon-home"> terminatorlib
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../terminatorlib.html">terminatorlib package</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#subpackages">Subpackages</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../../../terminatorlib.configobj.html">terminatorlib.configobj package</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../../../terminatorlib.configobj.html#submodules">Submodules</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../../terminatorlib.configobj.html#module-terminatorlib.configobj.configobj">terminatorlib.configobj.configobj module</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../../terminatorlib.configobj.html#module-terminatorlib.configobj.validate">terminatorlib.configobj.validate module</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../../terminatorlib.configobj.html#module-terminatorlib.configobj">Module contents</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../../../terminatorlib.plugins.html">terminatorlib.plugins package</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../../../terminatorlib.plugins.html#submodules">Submodules</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../../terminatorlib.plugins.html#module-terminatorlib.plugins.activitywatch">terminatorlib.plugins.activitywatch module</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../../terminatorlib.plugins.html#module-terminatorlib.plugins.custom_commands">terminatorlib.plugins.custom_commands module</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../../terminatorlib.plugins.html#module-terminatorlib.plugins.logger">terminatorlib.plugins.logger module</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../../terminatorlib.plugins.html#module-terminatorlib.plugins.maven">terminatorlib.plugins.maven module</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../../terminatorlib.plugins.html#module-terminatorlib.plugins.terminalshot">terminatorlib.plugins.terminalshot module</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../../terminatorlib.plugins.html#module-terminatorlib.plugins.testplugin">terminatorlib.plugins.testplugin module</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../../terminatorlib.plugins.html#module-terminatorlib.plugins.url_handlers">terminatorlib.plugins.url_handlers module</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../../terminatorlib.plugins.html#module-terminatorlib.plugins">Module contents</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#submodules">Submodules</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.borg">terminatorlib.borg module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.config">terminatorlib.config module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.container">terminatorlib.container module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.cwd">terminatorlib.cwd module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.debugserver">terminatorlib.debugserver module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.editablelabel">terminatorlib.editablelabel module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.encoding">terminatorlib.encoding module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.factory">terminatorlib.factory module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.freebsd">terminatorlib.freebsd module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.ipc">terminatorlib.ipc module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.keybindings">terminatorlib.keybindings module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.layoutlauncher">terminatorlib.layoutlauncher module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.notebook">terminatorlib.notebook module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.optionparse">terminatorlib.optionparse module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.paned">terminatorlib.paned module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.plugin">terminatorlib.plugin module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.prefseditor">terminatorlib.prefseditor module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.searchbar">terminatorlib.searchbar module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.signalman">terminatorlib.signalman module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.terminal">terminatorlib.terminal module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.terminal_popup_menu">terminatorlib.terminal_popup_menu module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.terminator">terminatorlib.terminator module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.titlebar">terminatorlib.titlebar module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.translation">terminatorlib.translation module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.util">terminatorlib.util module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.version">terminatorlib.version module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib.window">terminatorlib.window module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../terminatorlib.html#module-terminatorlib">Module contents</a></li>
</ul>
</li>
</ul>
</div>
&nbsp;
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../../index.html">terminatorlib</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../../index.html">Docs</a> &raquo;</li>
<li><a href="../../index.html">Module code</a> &raquo;</li>
<li>terminatorlib.configobj.configobj</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document">
<h1>Source code for terminatorlib.configobj.configobj</h1><div class="highlight"><pre>
<span class="c"># configobj.py</span>
<span class="c"># A config file reader/writer that supports nested sections in config files.</span>
<span class="c"># Copyright (C) 2005-2010 Michael Foord, Nicola Larosa</span>
<span class="c"># E-mail: fuzzyman AT voidspace DOT org DOT uk</span>
<span class="c"># nico AT tekNico DOT net</span>
<span class="c"># ConfigObj 4</span>
<span class="c"># http://www.voidspace.org.uk/python/configobj.html</span>
<span class="c"># Released subject to the BSD License</span>
<span class="c"># Please see http://www.voidspace.org.uk/python/license.shtml</span>
<span class="c"># Scripts maintained at http://www.voidspace.org.uk/python/index.shtml</span>
<span class="c"># For information about bugfixes, updates and support, please join the</span>
<span class="c"># ConfigObj mailing list:</span>
<span class="c"># http://lists.sourceforge.net/lists/listinfo/configobj-develop</span>
<span class="c"># Comments, suggestions and bug reports welcome.</span>
<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">generators</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">re</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">codecs</span> <span class="kn">import</span> <span class="n">BOM_UTF8</span><span class="p">,</span> <span class="n">BOM_UTF16</span><span class="p">,</span> <span class="n">BOM_UTF16_BE</span><span class="p">,</span> <span class="n">BOM_UTF16_LE</span>
<span class="c"># imported lazily to avoid startup performance hit if it isn&#39;t used</span>
<span class="n">compiler</span> <span class="o">=</span> <span class="bp">None</span>
<span class="c"># A dictionary mapping BOM to</span>
<span class="c"># the encoding to decode with, and what to set the</span>
<span class="c"># encoding attribute to.</span>
<span class="n">BOMS</span> <span class="o">=</span> <span class="p">{</span>
<span class="n">BOM_UTF8</span><span class="p">:</span> <span class="p">(</span><span class="s">&#39;utf_8&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">),</span>
<span class="n">BOM_UTF16_BE</span><span class="p">:</span> <span class="p">(</span><span class="s">&#39;utf16_be&#39;</span><span class="p">,</span> <span class="s">&#39;utf_16&#39;</span><span class="p">),</span>
<span class="n">BOM_UTF16_LE</span><span class="p">:</span> <span class="p">(</span><span class="s">&#39;utf16_le&#39;</span><span class="p">,</span> <span class="s">&#39;utf_16&#39;</span><span class="p">),</span>
<span class="n">BOM_UTF16</span><span class="p">:</span> <span class="p">(</span><span class="s">&#39;utf_16&#39;</span><span class="p">,</span> <span class="s">&#39;utf_16&#39;</span><span class="p">),</span>
<span class="p">}</span>
<span class="c"># All legal variants of the BOM codecs.</span>
<span class="c"># TODO: the list of aliases is not meant to be exhaustive, is there a</span>
<span class="c"># better way ?</span>
<span class="n">BOM_LIST</span> <span class="o">=</span> <span class="p">{</span>
<span class="s">&#39;utf_16&#39;</span><span class="p">:</span> <span class="s">&#39;utf_16&#39;</span><span class="p">,</span>
<span class="s">&#39;u16&#39;</span><span class="p">:</span> <span class="s">&#39;utf_16&#39;</span><span class="p">,</span>
<span class="s">&#39;utf16&#39;</span><span class="p">:</span> <span class="s">&#39;utf_16&#39;</span><span class="p">,</span>
<span class="s">&#39;utf-16&#39;</span><span class="p">:</span> <span class="s">&#39;utf_16&#39;</span><span class="p">,</span>
<span class="s">&#39;utf16_be&#39;</span><span class="p">:</span> <span class="s">&#39;utf16_be&#39;</span><span class="p">,</span>
<span class="s">&#39;utf_16_be&#39;</span><span class="p">:</span> <span class="s">&#39;utf16_be&#39;</span><span class="p">,</span>
<span class="s">&#39;utf-16be&#39;</span><span class="p">:</span> <span class="s">&#39;utf16_be&#39;</span><span class="p">,</span>
<span class="s">&#39;utf16_le&#39;</span><span class="p">:</span> <span class="s">&#39;utf16_le&#39;</span><span class="p">,</span>
<span class="s">&#39;utf_16_le&#39;</span><span class="p">:</span> <span class="s">&#39;utf16_le&#39;</span><span class="p">,</span>
<span class="s">&#39;utf-16le&#39;</span><span class="p">:</span> <span class="s">&#39;utf16_le&#39;</span><span class="p">,</span>
<span class="s">&#39;utf_8&#39;</span><span class="p">:</span> <span class="s">&#39;utf_8&#39;</span><span class="p">,</span>
<span class="s">&#39;u8&#39;</span><span class="p">:</span> <span class="s">&#39;utf_8&#39;</span><span class="p">,</span>
<span class="s">&#39;utf&#39;</span><span class="p">:</span> <span class="s">&#39;utf_8&#39;</span><span class="p">,</span>
<span class="s">&#39;utf8&#39;</span><span class="p">:</span> <span class="s">&#39;utf_8&#39;</span><span class="p">,</span>
<span class="s">&#39;utf-8&#39;</span><span class="p">:</span> <span class="s">&#39;utf_8&#39;</span><span class="p">,</span>
<span class="p">}</span>
<span class="c"># Map of encodings to the BOM to write.</span>
<span class="n">BOM_SET</span> <span class="o">=</span> <span class="p">{</span>
<span class="s">&#39;utf_8&#39;</span><span class="p">:</span> <span class="n">BOM_UTF8</span><span class="p">,</span>
<span class="s">&#39;utf_16&#39;</span><span class="p">:</span> <span class="n">BOM_UTF16</span><span class="p">,</span>
<span class="s">&#39;utf16_be&#39;</span><span class="p">:</span> <span class="n">BOM_UTF16_BE</span><span class="p">,</span>
<span class="s">&#39;utf16_le&#39;</span><span class="p">:</span> <span class="n">BOM_UTF16_LE</span><span class="p">,</span>
<span class="bp">None</span><span class="p">:</span> <span class="n">BOM_UTF8</span>
<span class="p">}</span>
<span class="k">def</span> <span class="nf">match_utf8</span><span class="p">(</span><span class="n">encoding</span><span class="p">):</span>
<span class="k">return</span> <span class="n">BOM_LIST</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">encoding</span><span class="o">.</span><span class="n">lower</span><span class="p">())</span> <span class="o">==</span> <span class="s">&#39;utf_8&#39;</span>
<span class="c"># Quote strings used for writing values</span>
<span class="n">squot</span> <span class="o">=</span> <span class="s">&quot;&#39;</span><span class="si">%s</span><span class="s">&#39;&quot;</span>
<span class="n">dquot</span> <span class="o">=</span> <span class="s">&#39;&quot;</span><span class="si">%s</span><span class="s">&quot;&#39;</span>
<span class="n">noquot</span> <span class="o">=</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s">&quot;</span>
<span class="n">wspace_plus</span> <span class="o">=</span> <span class="s">&#39; </span><span class="se">\r\n\v\t\&#39;</span><span class="s">&quot;&#39;</span>
<span class="n">tsquot</span> <span class="o">=</span> <span class="s">&#39;&quot;&quot;&quot;</span><span class="si">%s</span><span class="s">&quot;&quot;&quot;&#39;</span>
<span class="n">tdquot</span> <span class="o">=</span> <span class="s">&quot;&#39;&#39;&#39;</span><span class="si">%s</span><span class="s">&#39;&#39;&#39;&quot;</span>
<span class="c"># Sentinel for use in getattr calls to replace hasattr</span>
<span class="n">MISSING</span> <span class="o">=</span> <span class="nb">object</span><span class="p">()</span>
<span class="n">__version__</span> <span class="o">=</span> <span class="s">&#39;4.7.2&#39;</span>
<span class="k">try</span><span class="p">:</span>
<span class="nb">any</span>
<span class="k">except</span> <span class="ne">NameError</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">any</span><span class="p">(</span><span class="n">iterable</span><span class="p">):</span>
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">iterable</span><span class="p">:</span>
<span class="k">if</span> <span class="n">entry</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">True</span>
<span class="k">return</span> <span class="bp">False</span>
<span class="n">__all__</span> <span class="o">=</span> <span class="p">(</span>
<span class="s">&#39;__version__&#39;</span><span class="p">,</span>
<span class="s">&#39;DEFAULT_INDENT_TYPE&#39;</span><span class="p">,</span>
<span class="s">&#39;DEFAULT_INTERPOLATION&#39;</span><span class="p">,</span>
<span class="s">&#39;ConfigObjError&#39;</span><span class="p">,</span>
<span class="s">&#39;NestingError&#39;</span><span class="p">,</span>
<span class="s">&#39;ParseError&#39;</span><span class="p">,</span>
<span class="s">&#39;DuplicateError&#39;</span><span class="p">,</span>
<span class="s">&#39;ConfigspecError&#39;</span><span class="p">,</span>
<span class="s">&#39;ConfigObj&#39;</span><span class="p">,</span>
<span class="s">&#39;SimpleVal&#39;</span><span class="p">,</span>
<span class="s">&#39;InterpolationError&#39;</span><span class="p">,</span>
<span class="s">&#39;InterpolationLoopError&#39;</span><span class="p">,</span>
<span class="s">&#39;MissingInterpolationOption&#39;</span><span class="p">,</span>
<span class="s">&#39;RepeatSectionError&#39;</span><span class="p">,</span>
<span class="s">&#39;ReloadError&#39;</span><span class="p">,</span>
<span class="s">&#39;UnreprError&#39;</span><span class="p">,</span>
<span class="s">&#39;UnknownType&#39;</span><span class="p">,</span>
<span class="s">&#39;flatten_errors&#39;</span><span class="p">,</span>
<span class="s">&#39;get_extra_values&#39;</span>
<span class="p">)</span>
<span class="n">DEFAULT_INTERPOLATION</span> <span class="o">=</span> <span class="s">&#39;configparser&#39;</span>
<span class="n">DEFAULT_INDENT_TYPE</span> <span class="o">=</span> <span class="s">&#39; &#39;</span>
<span class="n">MAX_INTERPOL_DEPTH</span> <span class="o">=</span> <span class="mi">10</span>
<span class="n">OPTION_DEFAULTS</span> <span class="o">=</span> <span class="p">{</span>
<span class="s">&#39;interpolation&#39;</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
<span class="s">&#39;raise_errors&#39;</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
<span class="s">&#39;list_values&#39;</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
<span class="s">&#39;create_empty&#39;</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
<span class="s">&#39;file_error&#39;</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
<span class="s">&#39;configspec&#39;</span><span class="p">:</span> <span class="bp">None</span><span class="p">,</span>
<span class="s">&#39;stringify&#39;</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
<span class="c"># option may be set to one of (&#39;&#39;, &#39; &#39;, &#39;\t&#39;)</span>
<span class="s">&#39;indent_type&#39;</span><span class="p">:</span> <span class="bp">None</span><span class="p">,</span>
<span class="s">&#39;encoding&#39;</span><span class="p">:</span> <span class="bp">None</span><span class="p">,</span>
<span class="s">&#39;default_encoding&#39;</span><span class="p">:</span> <span class="bp">None</span><span class="p">,</span>
<span class="s">&#39;unrepr&#39;</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
<span class="s">&#39;write_empty_values&#39;</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
<span class="p">}</span>
<span class="k">def</span> <span class="nf">getObj</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
<span class="k">global</span> <span class="n">compiler</span>
<span class="k">if</span> <span class="n">compiler</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="kn">import</span> <span class="nn">compiler</span>
<span class="n">s</span> <span class="o">=</span> <span class="s">&quot;a=&quot;</span> <span class="o">+</span> <span class="n">s</span>
<span class="n">p</span> <span class="o">=</span> <span class="n">compiler</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="k">return</span> <span class="n">p</span><span class="o">.</span><span class="n">getChildren</span><span class="p">()[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">getChildren</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">getChildren</span><span class="p">()[</span><span class="mi">1</span><span class="p">]</span>
<div class="viewcode-block" id="UnknownType"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.UnknownType">[docs]</a><span class="k">class</span> <span class="nc">UnknownType</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
<span class="k">pass</span>
</div>
<span class="k">class</span> <span class="nc">Builder</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">build</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">o</span><span class="p">):</span>
<span class="n">m</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;build_&#39;</span> <span class="o">+</span> <span class="n">o</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
<span class="k">if</span> <span class="n">m</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">UnknownType</span><span class="p">(</span><span class="n">o</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">)</span>
<span class="k">return</span> <span class="n">m</span><span class="p">(</span><span class="n">o</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">build_List</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">o</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">map</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">build</span><span class="p">,</span> <span class="n">o</span><span class="o">.</span><span class="n">getChildren</span><span class="p">())</span>
<span class="k">def</span> <span class="nf">build_Const</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">o</span><span class="p">):</span>
<span class="k">return</span> <span class="n">o</span><span class="o">.</span><span class="n">value</span>
<span class="k">def</span> <span class="nf">build_Dict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">o</span><span class="p">):</span>
<span class="n">d</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">i</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">build</span><span class="p">,</span> <span class="n">o</span><span class="o">.</span><span class="n">getChildren</span><span class="p">()))</span>
<span class="k">for</span> <span class="n">el</span> <span class="ow">in</span> <span class="n">i</span><span class="p">:</span>
<span class="n">d</span><span class="p">[</span><span class="n">el</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span><span class="o">.</span><span class="n">next</span><span class="p">()</span>
<span class="k">return</span> <span class="n">d</span>
<span class="k">def</span> <span class="nf">build_Tuple</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">o</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">build_List</span><span class="p">(</span><span class="n">o</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">build_Name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">o</span><span class="p">):</span>
<span class="k">if</span> <span class="n">o</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s">&#39;None&#39;</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">None</span>
<span class="k">if</span> <span class="n">o</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s">&#39;True&#39;</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">True</span>
<span class="k">if</span> <span class="n">o</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s">&#39;False&#39;</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">False</span>
<span class="c"># An undefined Name</span>
<span class="k">raise</span> <span class="n">UnknownType</span><span class="p">(</span><span class="s">&#39;Undefined Name&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">build_Add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">o</span><span class="p">):</span>
<span class="n">real</span><span class="p">,</span> <span class="n">imag</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">build_Const</span><span class="p">,</span> <span class="n">o</span><span class="o">.</span><span class="n">getChildren</span><span class="p">())</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">real</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">real</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">UnknownType</span><span class="p">(</span><span class="s">&#39;Add&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">imag</span><span class="p">,</span> <span class="nb">complex</span><span class="p">)</span> <span class="ow">or</span> <span class="n">imag</span><span class="o">.</span><span class="n">real</span> <span class="o">!=</span> <span class="mf">0.0</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">UnknownType</span><span class="p">(</span><span class="s">&#39;Add&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">real</span><span class="o">+</span><span class="n">imag</span>
<span class="k">def</span> <span class="nf">build_Getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">o</span><span class="p">):</span>
<span class="n">parent</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">build</span><span class="p">(</span><span class="n">o</span><span class="o">.</span><span class="n">expr</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="n">o</span><span class="o">.</span><span class="n">attrname</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">build_UnarySub</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">o</span><span class="p">):</span>
<span class="k">return</span> <span class="o">-</span><span class="bp">self</span><span class="o">.</span><span class="n">build_Const</span><span class="p">(</span><span class="n">o</span><span class="o">.</span><span class="n">getChildren</span><span class="p">()[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">def</span> <span class="nf">build_UnaryAdd</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">o</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">build_Const</span><span class="p">(</span><span class="n">o</span><span class="o">.</span><span class="n">getChildren</span><span class="p">()[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">_builder</span> <span class="o">=</span> <span class="n">Builder</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">unrepr</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">s</span><span class="p">:</span>
<span class="k">return</span> <span class="n">s</span>
<span class="k">return</span> <span class="n">_builder</span><span class="o">.</span><span class="n">build</span><span class="p">(</span><span class="n">getObj</span><span class="p">(</span><span class="n">s</span><span class="p">))</span>
<div class="viewcode-block" id="ConfigObjError"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObjError">[docs]</a><span class="k">class</span> <span class="nc">ConfigObjError</span><span class="p">(</span><span class="ne">SyntaxError</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is the base class for all errors that ConfigObj raises.</span>
<span class="sd"> It is a subclass of SyntaxError.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="ConfigObjError.__init__"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObjError.__init__">[docs]</a> <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">message</span><span class="o">=</span><span class="s">&#39;&#39;</span><span class="p">,</span> <span class="n">line_number</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">line</span><span class="o">=</span><span class="s">&#39;&#39;</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">line</span> <span class="o">=</span> <span class="n">line</span>
<span class="bp">self</span><span class="o">.</span><span class="n">line_number</span> <span class="o">=</span> <span class="n">line_number</span>
<span class="ne">SyntaxError</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">message</span><span class="p">)</span>
</div></div>
<div class="viewcode-block" id="NestingError"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.NestingError">[docs]</a><span class="k">class</span> <span class="nc">NestingError</span><span class="p">(</span><span class="n">ConfigObjError</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This error indicates a level of nesting that doesn&#39;t match.</span>
<span class="sd"> &quot;&quot;&quot;</span>
</div>
<div class="viewcode-block" id="ParseError"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ParseError">[docs]</a><span class="k">class</span> <span class="nc">ParseError</span><span class="p">(</span><span class="n">ConfigObjError</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This error indicates that a line is badly written.</span>
<span class="sd"> It is neither a valid ``key = value`` line,</span>
<span class="sd"> nor a valid section marker line.</span>
<span class="sd"> &quot;&quot;&quot;</span>
</div>
<div class="viewcode-block" id="ReloadError"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ReloadError">[docs]</a><span class="k">class</span> <span class="nc">ReloadError</span><span class="p">(</span><span class="ne">IOError</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A &#39;reload&#39; operation failed.</span>
<span class="sd"> This exception is a subclass of ``IOError``.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="ReloadError.__init__"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ReloadError.__init__">[docs]</a> <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="ne">IOError</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="s">&#39;reload failed, filename is not set.&#39;</span><span class="p">)</span>
</div></div>
<div class="viewcode-block" id="DuplicateError"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.DuplicateError">[docs]</a><span class="k">class</span> <span class="nc">DuplicateError</span><span class="p">(</span><span class="n">ConfigObjError</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The keyword or section specified already exists.</span>
<span class="sd"> &quot;&quot;&quot;</span>
</div>
<div class="viewcode-block" id="ConfigspecError"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigspecError">[docs]</a><span class="k">class</span> <span class="nc">ConfigspecError</span><span class="p">(</span><span class="n">ConfigObjError</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> An error occured whilst parsing a configspec.</span>
<span class="sd"> &quot;&quot;&quot;</span>
</div>
<div class="viewcode-block" id="InterpolationError"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.InterpolationError">[docs]</a><span class="k">class</span> <span class="nc">InterpolationError</span><span class="p">(</span><span class="n">ConfigObjError</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Base class for the two interpolation errors.&quot;&quot;&quot;</span>
</div>
<div class="viewcode-block" id="InterpolationLoopError"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.InterpolationLoopError">[docs]</a><span class="k">class</span> <span class="nc">InterpolationLoopError</span><span class="p">(</span><span class="n">InterpolationError</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Maximum interpolation depth exceeded in string interpolation.&quot;&quot;&quot;</span>
<div class="viewcode-block" id="InterpolationLoopError.__init__"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.InterpolationLoopError.__init__">[docs]</a> <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">option</span><span class="p">):</span>
<span class="n">InterpolationError</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="s">&#39;interpolation loop detected in value &quot;</span><span class="si">%s</span><span class="s">&quot;.&#39;</span> <span class="o">%</span> <span class="n">option</span><span class="p">)</span>
</div></div>
<div class="viewcode-block" id="RepeatSectionError"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.RepeatSectionError">[docs]</a><span class="k">class</span> <span class="nc">RepeatSectionError</span><span class="p">(</span><span class="n">ConfigObjError</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This error indicates additional sections in a section with a</span>
<span class="sd"> ``__many__`` (repeated) section.</span>
<span class="sd"> &quot;&quot;&quot;</span>
</div>
<div class="viewcode-block" id="MissingInterpolationOption"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.MissingInterpolationOption">[docs]</a><span class="k">class</span> <span class="nc">MissingInterpolationOption</span><span class="p">(</span><span class="n">InterpolationError</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;A value specified for interpolation was missing.&quot;&quot;&quot;</span>
<div class="viewcode-block" id="MissingInterpolationOption.__init__"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.MissingInterpolationOption.__init__">[docs]</a> <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">option</span><span class="p">):</span>
<span class="n">msg</span> <span class="o">=</span> <span class="s">&#39;missing option &quot;</span><span class="si">%s</span><span class="s">&quot; in interpolation.&#39;</span> <span class="o">%</span> <span class="n">option</span>
<span class="n">InterpolationError</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">msg</span><span class="p">)</span>
</div></div>
<div class="viewcode-block" id="UnreprError"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.UnreprError">[docs]</a><span class="k">class</span> <span class="nc">UnreprError</span><span class="p">(</span><span class="n">ConfigObjError</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;An error parsing in unrepr mode.&quot;&quot;&quot;</span>
</div>
<span class="k">class</span> <span class="nc">InterpolationEngine</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A helper class to help perform string interpolation.</span>
<span class="sd"> This class is an abstract base class; its descendants perform</span>
<span class="sd"> the actual work.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c"># compiled regexp to use in self.interpolate()</span>
<span class="n">_KEYCRE</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">r&quot;%\(([^)]*)\)s&quot;</span><span class="p">)</span>
<span class="n">_cookie</span> <span class="o">=</span> <span class="s">&#39;%&#39;</span>
<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">section</span><span class="p">):</span>
<span class="c"># the Section instance that &quot;owns&quot; this engine</span>
<span class="bp">self</span><span class="o">.</span><span class="n">section</span> <span class="o">=</span> <span class="n">section</span>
<span class="k">def</span> <span class="nf">interpolate</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="c"># short-cut</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cookie</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">def</span> <span class="nf">recursive_interpolate</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">section</span><span class="p">,</span> <span class="n">backtrail</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The function that does the actual work.</span>
<span class="sd"> ``value``: the string we&#39;re trying to interpolate.</span>
<span class="sd"> ``section``: the section in which that string was found</span>
<span class="sd"> ``backtrail``: a dict to keep track of where we&#39;ve been,</span>
<span class="sd"> to detect and prevent infinite recursion loops</span>
<span class="sd"> This is similar to a depth-first-search algorithm.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c"># Have we been here already?</span>
<span class="k">if</span> <span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">section</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> <span class="ow">in</span> <span class="n">backtrail</span><span class="p">:</span>
<span class="c"># Yes - infinite loop detected</span>
<span class="k">raise</span> <span class="n">InterpolationLoopError</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="c"># Place a marker on our backtrail so we won&#39;t come back here again</span>
<span class="n">backtrail</span><span class="p">[(</span><span class="n">key</span><span class="p">,</span> <span class="n">section</span><span class="o">.</span><span class="n">name</span><span class="p">)]</span> <span class="o">=</span> <span class="mi">1</span>
<span class="c"># Now start the actual work</span>
<span class="n">match</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_KEYCRE</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">while</span> <span class="n">match</span><span class="p">:</span>
<span class="c"># The actual parsing of the match is implementation-dependent,</span>
<span class="c"># so delegate to our helper function</span>
<span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">s</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_match</span><span class="p">(</span><span class="n">match</span><span class="p">)</span>
<span class="k">if</span> <span class="n">k</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="c"># That&#39;s the signal that no further interpolation is needed</span>
<span class="n">replacement</span> <span class="o">=</span> <span class="n">v</span>
<span class="k">else</span><span class="p">:</span>
<span class="c"># Further interpolation may be needed to obtain final value</span>
<span class="n">replacement</span> <span class="o">=</span> <span class="n">recursive_interpolate</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="n">backtrail</span><span class="p">)</span>
<span class="c"># Replace the matched string with its final value</span>
<span class="n">start</span><span class="p">,</span> <span class="n">end</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">span</span><span class="p">()</span>
<span class="n">value</span> <span class="o">=</span> <span class="s">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">((</span><span class="n">value</span><span class="p">[:</span><span class="n">start</span><span class="p">],</span> <span class="n">replacement</span><span class="p">,</span> <span class="n">value</span><span class="p">[</span><span class="n">end</span><span class="p">:]))</span>
<span class="n">new_search_start</span> <span class="o">=</span> <span class="n">start</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">replacement</span><span class="p">)</span>
<span class="c"># Pick up the next interpolation key, if any, for next time</span>
<span class="c"># through the while loop</span>
<span class="n">match</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_KEYCRE</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">new_search_start</span><span class="p">)</span>
<span class="c"># Now safe to come back here again; remove marker from backtrail</span>
<span class="k">del</span> <span class="n">backtrail</span><span class="p">[(</span><span class="n">key</span><span class="p">,</span> <span class="n">section</span><span class="o">.</span><span class="n">name</span><span class="p">)]</span>
<span class="k">return</span> <span class="n">value</span>
<span class="c"># Back in interpolate(), all we have to do is kick off the recursive</span>
<span class="c"># function with appropriate starting values</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">recursive_interpolate</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="bp">self</span><span class="o">.</span><span class="n">section</span><span class="p">,</span> <span class="p">{})</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">def</span> <span class="nf">_fetch</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="sd">&quot;&quot;&quot;Helper function to fetch values from owning section.</span>
<span class="sd"> Returns a 2-tuple: the value, and the section where it was found.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c"># switch off interpolation before we try and fetch anything !</span>
<span class="n">save_interp</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">section</span><span class="o">.</span><span class="n">main</span><span class="o">.</span><span class="n">interpolation</span>
<span class="bp">self</span><span class="o">.</span><span class="n">section</span><span class="o">.</span><span class="n">main</span><span class="o">.</span><span class="n">interpolation</span> <span class="o">=</span> <span class="bp">False</span>
<span class="c"># Start at section that &quot;owns&quot; this InterpolationEngine</span>
<span class="n">current_section</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">section</span>
<span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
<span class="c"># try the current section first</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">current_section</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">Section</span><span class="p">):</span>
<span class="k">break</span>
<span class="c"># try &quot;DEFAULT&quot; next</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">current_section</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;DEFAULT&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">Section</span><span class="p">):</span>
<span class="k">break</span>
<span class="c"># move up to parent and try again</span>
<span class="c"># top-level&#39;s parent is itself</span>
<span class="k">if</span> <span class="n">current_section</span><span class="o">.</span><span class="n">parent</span> <span class="ow">is</span> <span class="n">current_section</span><span class="p">:</span>
<span class="c"># reached top level, time to give up</span>
<span class="k">break</span>
<span class="n">current_section</span> <span class="o">=</span> <span class="n">current_section</span><span class="o">.</span><span class="n">parent</span>
<span class="c"># restore interpolation to previous value before returning</span>
<span class="bp">self</span><span class="o">.</span><span class="n">section</span><span class="o">.</span><span class="n">main</span><span class="o">.</span><span class="n">interpolation</span> <span class="o">=</span> <span class="n">save_interp</span>
<span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">MissingInterpolationOption</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="k">return</span> <span class="n">val</span><span class="p">,</span> <span class="n">current_section</span>
<span class="k">def</span> <span class="nf">_parse_match</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">match</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Implementation-dependent helper function.</span>
<span class="sd"> Will be passed a match object corresponding to the interpolation</span>
<span class="sd"> key we just found (e.g., &quot;%(foo)s&quot; or &quot;$foo&quot;). Should look up that</span>
<span class="sd"> key in the appropriate config file section (using the ``_fetch()``</span>
<span class="sd"> helper function) and return a 3-tuple: (key, value, section)</span>
<span class="sd"> ``key`` is the name of the key we&#39;re looking for</span>
<span class="sd"> ``value`` is the value found for that key</span>
<span class="sd"> ``section`` is a reference to the section where it was found</span>
<span class="sd"> ``key`` and ``section`` should be None if no further</span>
<span class="sd"> interpolation should be performed on the resulting value</span>
<span class="sd"> (e.g., if we interpolated &quot;$$&quot; and returned &quot;$&quot;).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
<span class="k">class</span> <span class="nc">ConfigParserInterpolation</span><span class="p">(</span><span class="n">InterpolationEngine</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Behaves like ConfigParser.&quot;&quot;&quot;</span>
<span class="n">_cookie</span> <span class="o">=</span> <span class="s">&#39;%&#39;</span>
<span class="n">_KEYCRE</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">r&quot;%\(([^)]*)\)s&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_parse_match</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">match</span><span class="p">):</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">value</span><span class="p">,</span> <span class="n">section</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fetch</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="k">return</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">section</span>
<span class="k">class</span> <span class="nc">TemplateInterpolation</span><span class="p">(</span><span class="n">InterpolationEngine</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Behaves like string.Template.&quot;&quot;&quot;</span>
<span class="n">_cookie</span> <span class="o">=</span> <span class="s">&#39;$&#39;</span>
<span class="n">_delimiter</span> <span class="o">=</span> <span class="s">&#39;$&#39;</span>
<span class="n">_KEYCRE</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">r&quot;&quot;&quot;</span>
<span class="s"> \$(?:</span>
<span class="s"> (?P&lt;escaped&gt;\$) | # Two $ signs</span>
<span class="s"> (?P&lt;named&gt;[_a-z][_a-z0-9]*) | # $name format</span>
<span class="s"> {(?P&lt;braced&gt;[^}]*)} # ${name} format</span>
<span class="s"> )</span>
<span class="s"> &quot;&quot;&quot;</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">IGNORECASE</span> <span class="o">|</span> <span class="n">re</span><span class="o">.</span><span class="n">VERBOSE</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_parse_match</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">match</span><span class="p">):</span>
<span class="c"># Valid name (in or out of braces): fetch value from section</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s">&#39;named&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s">&#39;braced&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">key</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">value</span><span class="p">,</span> <span class="n">section</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fetch</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="k">return</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">section</span>
<span class="c"># Escaped delimiter (e.g., $$): return single delimiter</span>
<span class="k">if</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s">&#39;escaped&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="c"># Return None for key and section to indicate it&#39;s time to stop</span>
<span class="k">return</span> <span class="bp">None</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_delimiter</span><span class="p">,</span> <span class="bp">None</span>
<span class="c"># Anything else: ignore completely, just return it unchanged</span>
<span class="k">return</span> <span class="bp">None</span><span class="p">,</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(),</span> <span class="bp">None</span>
<span class="n">interpolation_engines</span> <span class="o">=</span> <span class="p">{</span>
<span class="s">&#39;configparser&#39;</span><span class="p">:</span> <span class="n">ConfigParserInterpolation</span><span class="p">,</span>
<span class="s">&#39;template&#39;</span><span class="p">:</span> <span class="n">TemplateInterpolation</span><span class="p">,</span>
<span class="p">}</span>
<span class="k">def</span> <span class="nf">__newobj__</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="c"># Hack for pickle</span>
<span class="k">return</span> <span class="n">cls</span><span class="o">.</span><span class="n">__new__</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">Section</span><span class="p">(</span><span class="nb">dict</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A dictionary-like object that represents a section in a config file.</span>
<span class="sd"> </span>
<span class="sd"> It does string interpolation if the &#39;interpolation&#39; attribute</span>
<span class="sd"> of the &#39;main&#39; object is set to True.</span>
<span class="sd"> </span>
<span class="sd"> Interpolation is tried first from this object, then from the &#39;DEFAULT&#39;</span>
<span class="sd"> section of this object, next from the parent and its &#39;DEFAULT&#39; section,</span>
<span class="sd"> and so on until the main object is reached.</span>
<span class="sd"> </span>
<span class="sd"> A Section will behave like an ordered dictionary - following the</span>
<span class="sd"> order of the ``scalars`` and ``sections`` attributes.</span>
<span class="sd"> You can use this to change the order of members.</span>
<span class="sd"> </span>
<span class="sd"> Iteration follows the order: scalars, then sections.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__setstate__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">state</span><span class="p">):</span>
<span class="nb">dict</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">state</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__dict__</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">state</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="k">def</span> <span class="nf">__reduce__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">state</span> <span class="o">=</span> <span class="p">(</span><span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">__dict__</span><span class="p">)</span>
<span class="k">return</span> <span class="p">(</span><span class="n">__newobj__</span><span class="p">,</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="p">,),</span> <span class="n">state</span><span class="p">)</span>
<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> <span class="n">depth</span><span class="p">,</span> <span class="n">main</span><span class="p">,</span> <span class="n">indict</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> * parent is the section above</span>
<span class="sd"> * depth is the depth level of this section</span>
<span class="sd"> * main is the main ConfigObj</span>
<span class="sd"> * indict is a dictionary to initialise the section with</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">indict</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">indict</span> <span class="o">=</span> <span class="p">{}</span>
<span class="nb">dict</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="c"># used for nesting level *and* interpolation</span>
<span class="bp">self</span><span class="o">.</span><span class="n">parent</span> <span class="o">=</span> <span class="n">parent</span>
<span class="c"># used for the interpolation attribute</span>
<span class="bp">self</span><span class="o">.</span><span class="n">main</span> <span class="o">=</span> <span class="n">main</span>
<span class="c"># level of nesting depth of this Section</span>
<span class="bp">self</span><span class="o">.</span><span class="n">depth</span> <span class="o">=</span> <span class="n">depth</span>
<span class="c"># purely for information</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
<span class="c">#</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_initialise</span><span class="p">()</span>
<span class="c"># we do this explicitly so that __setitem__ is used properly</span>
<span class="c"># (rather than just passing to ``dict.__init__``)</span>
<span class="k">for</span> <span class="n">entry</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">indict</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span>
<span class="bp">self</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
<span class="k">def</span> <span class="nf">_initialise</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c"># the sequence of scalar values in this Section</span>
<span class="bp">self</span><span class="o">.</span><span class="n">scalars</span> <span class="o">=</span> <span class="p">[]</span>
<span class="c"># the sequence of sections in this Section</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sections</span> <span class="o">=</span> <span class="p">[]</span>
<span class="c"># for comments :-)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">comments</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">inline_comments</span> <span class="o">=</span> <span class="p">{}</span>
<span class="c"># the configspec</span>
<span class="bp">self</span><span class="o">.</span><span class="n">configspec</span> <span class="o">=</span> <span class="bp">None</span>
<span class="c"># for defaults</span>
<span class="bp">self</span><span class="o">.</span><span class="n">defaults</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">default_values</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">extra_values</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_created</span> <span class="o">=</span> <span class="bp">False</span>
<span class="k">def</span> <span class="nf">_interpolate</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="k">try</span><span class="p">:</span>
<span class="c"># do we already have an interpolation engine?</span>
<span class="n">engine</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_interpolation_engine</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="c"># not yet: first time running _interpolate(), so pick the engine</span>
<span class="n">name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">main</span><span class="o">.</span><span class="n">interpolation</span>
<span class="k">if</span> <span class="n">name</span> <span class="o">==</span> <span class="bp">True</span><span class="p">:</span> <span class="c"># note that &quot;if name:&quot; would be incorrect here</span>
<span class="c"># backwards-compatibility: interpolation=True means use default</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">DEFAULT_INTERPOLATION</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="c"># so that &quot;Template&quot;, &quot;template&quot;, etc. all work</span>
<span class="n">class_</span> <span class="o">=</span> <span class="n">interpolation_engines</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
<span class="k">if</span> <span class="n">class_</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="c"># invalid value for self.main.interpolation</span>
<span class="bp">self</span><span class="o">.</span><span class="n">main</span><span class="o">.</span><span class="n">interpolation</span> <span class="o">=</span> <span class="bp">False</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">else</span><span class="p">:</span>
<span class="c"># save reference to engine so we don&#39;t have to do this again</span>
<span class="n">engine</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_interpolation_engine</span> <span class="o">=</span> <span class="n">class_</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="c"># let the engine do the actual work</span>
<span class="k">return</span> <span class="n">engine</span><span class="o">.</span><span class="n">interpolate</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="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>
<span class="sd">&quot;&quot;&quot;Fetch the item and do string interpolation.&quot;&quot;&quot;</span>
<span class="n">val</span> <span class="o">=</span> <span class="nb">dict</span><span class="o">.</span><span class="n">__getitem__</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="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">main</span><span class="o">.</span><span class="n">interpolation</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">basestring</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_interpolate</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">_check</span><span class="p">(</span><span class="n">entry</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="nb">basestring</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_interpolate</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">entry</span><span class="p">)</span>
<span class="k">return</span> <span class="n">entry</span>
<span class="n">new</span> <span class="o">=</span> <span class="p">[</span><span class="n">_check</span><span class="p">(</span><span class="n">entry</span><span class="p">)</span> <span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">val</span><span class="p">]</span>
<span class="k">if</span> <span class="n">new</span> <span class="o">!=</span> <span class="n">val</span><span class="p">:</span>
<span class="k">return</span> <span class="n">new</span>
<span class="k">return</span> <span class="n">val</span>
<span class="k">def</span> <span class="nf">__setitem__</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">unrepr</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Correctly set a value.</span>
<span class="sd"> </span>
<span class="sd"> Making dictionary values Section instances.</span>
<span class="sd"> (We have to special case &#39;Section&#39; instances - which are also dicts)</span>
<span class="sd"> </span>
<span class="sd"> Keys must be strings.</span>
<span class="sd"> Values need only be strings (or lists of strings) if</span>
<span class="sd"> ``main.stringify`` is set.</span>
<span class="sd"> </span>
<span class="sd"> ``unrepr`` must be set when setting a value to a dictionary, without</span>
<span class="sd"> creating a new sub-section.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="nb">basestring</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">&#39;The key &quot;</span><span class="si">%s</span><span class="s">&quot; is not a string.&#39;</span> <span class="o">%</span> <span class="n">key</span><span class="p">)</span>
<span class="c"># add the comment</span>
<span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">comments</span><span class="p">:</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> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">inline_comments</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
<span class="c"># remove the entry from defaults</span>
<span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">defaults</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">defaults</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="c">#</span>
<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">Section</span><span class="p">):</span>
<span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sections</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="nb">dict</span><span class="o">.</span><span class="n">__setitem__</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="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">dict</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">unrepr</span><span class="p">:</span>
<span class="c"># First create the new depth level,</span>
<span class="c"># then create the section</span>
<span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sections</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="n">new_depth</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">depth</span> <span class="o">+</span> <span class="mi">1</span>
<span class="nb">dict</span><span class="o">.</span><span class="n">__setitem__</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">Section</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">new_depth</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">main</span><span class="p">,</span>
<span class="n">indict</span><span class="o">=</span><span class="n">value</span><span class="p">,</span>
<span class="n">name</span><span class="o">=</span><span class="n">key</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">scalars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">main</span><span class="o">.</span><span class="n">stringify</span><span class="p">:</span>
<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">basestring</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span>
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="nb">basestring</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s">&#39;Value is not a string &quot;</span><span class="si">%s</span><span class="s">&quot;.&#39;</span> <span class="o">%</span> <span class="n">entry</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s">&#39;Value is not a string &quot;</span><span class="si">%s</span><span class="s">&quot;.&#39;</span> <span class="o">%</span> <span class="n">value</span><span class="p">)</span>
<span class="nb">dict</span><span class="o">.</span><span class="n">__setitem__</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="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>
<span class="sd">&quot;&quot;&quot;Remove items from the sequence when deleting.&quot;&quot;&quot;</span>
<span class="nb">dict</span><span class="o">.</span> <span class="n">__delitem__</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="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">scalars</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">scalars</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sections</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="k">del</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>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">inline_comments</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
<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>
<span class="sd">&quot;&quot;&quot;A version of ``get`` that doesn&#39;t bypass string interpolation.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="k">return</span> <span class="n">default</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">indict</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A version of update that uses our ``__setitem__``.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">indict</span><span class="p">:</span>
<span class="bp">self</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="n">indict</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">pop</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="n">MISSING</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> &#39;D.pop(k[,d]) -&gt; v, remove specified key and return the corresponding value.</span>
<span class="sd"> If key is not found, d is returned if given, otherwise KeyError is raised&#39;</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="k">if</span> <span class="n">default</span> <span class="ow">is</span> <span class="n">MISSING</span><span class="p">:</span>
<span class="k">raise</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">default</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">del</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
<span class="k">return</span> <span class="n">val</span>
<span class="k">def</span> <span class="nf">popitem</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Pops the first (key,val)&quot;&quot;&quot;</span>
<span class="n">sequence</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">scalars</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">sections</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">sequence</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">KeyError</span><span class="p">(</span><span class="s">&quot;: &#39;popitem(): dictionary is empty&#39;&quot;</span><span class="p">)</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">sequence</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
<span class="k">del</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
<span class="k">return</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span>
<span class="k">def</span> <span class="nf">clear</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A version of clear that also affects scalars/sections</span>
<span class="sd"> Also clears comments and configspec.</span>
<span class="sd"> </span>
<span class="sd"> Leaves other attributes alone :</span>
<span class="sd"> depth/main/parent are not affected</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nb">dict</span><span class="o">.</span><span class="n">clear</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">scalars</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sections</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">comments</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">inline_comments</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">configspec</span> <span class="o">=</span> <span class="bp">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">defaults</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">extra_values</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">def</span> <span class="nf">setdefault</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>
<span class="sd">&quot;&quot;&quot;A version of setdefault that sets sequence if appropriate.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">KeyError</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="o">=</span> <span class="n">default</span>
<span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">items</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;D.items() -&gt; list of D&#39;s (key, value) pairs, as 2-tuples&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">zip</span><span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">scalars</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">sections</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">())</span>
<span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;D.keys() -&gt; list of D&#39;s keys&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">scalars</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">sections</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">values</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;D.values() -&gt; list of D&#39;s values&quot;&quot;&quot;</span>
<span class="k">return</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="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">scalars</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">sections</span><span class="p">)]</span>
<span class="k">def</span> <span class="nf">iteritems</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;D.iteritems() -&gt; an iterator over the (key, value) items of D&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">items</span><span class="p">())</span>
<span class="k">def</span> <span class="nf">iterkeys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;D.iterkeys() -&gt; an iterator over the keys of D&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">iter</span><span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">scalars</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">sections</span><span class="p">))</span>
<span class="n">__iter__</span> <span class="o">=</span> <span class="n">iterkeys</span>
<span class="k">def</span> <span class="nf">itervalues</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;D.itervalues() -&gt; an iterator over the values of D&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">())</span>
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;x.__repr__() &lt;==&gt; repr(x)&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">_getval</span><span class="p">(</span><span class="n">key</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
<span class="k">except</span> <span class="n">MissingInterpolationOption</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">dict</span><span class="o">.</span><span class="n">__getitem__</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="k">return</span> <span class="s">&#39;{</span><span class="si">%s</span><span class="s">}&#39;</span> <span class="o">%</span> <span class="s">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([(</span><span class="s">&#39;</span><span class="si">%s</span><span class="s">: </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">key</span><span class="p">),</span> <span class="nb">repr</span><span class="p">(</span><span class="n">_getval</span><span class="p">(</span><span class="n">key</span><span class="p">))))</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">scalars</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">sections</span><span class="p">)])</span>
<span class="n">__str__</span> <span class="o">=</span> <span class="n">__repr__</span>
<span class="n">__str__</span><span class="o">.</span><span class="n">__doc__</span> <span class="o">=</span> <span class="s">&quot;x.__str__() &lt;==&gt; str(x)&quot;</span>
<span class="c"># Extra methods - not in a normal dictionary</span>
<span class="k">def</span> <span class="nf">dict</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return a deepcopy of self as a dictionary.</span>
<span class="sd"> </span>
<span class="sd"> All members that are ``Section`` instances are recursively turned to</span>
<span class="sd"> ordinary dictionaries - by calling their ``dict`` method.</span>
<span class="sd"> </span>
<span class="sd"> &gt;&gt;&gt; n = a.dict()</span>
<span class="sd"> &gt;&gt;&gt; n == a</span>
<span class="sd"> 1</span>
<span class="sd"> &gt;&gt;&gt; n is a</span>
<span class="sd"> 0</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">newdict</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
<span class="n">this_entry</span> <span class="o">=</span> <span class="bp">self</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">this_entry</span><span class="p">,</span> <span class="n">Section</span><span class="p">):</span>
<span class="n">this_entry</span> <span class="o">=</span> <span class="n">this_entry</span><span class="o">.</span><span class="n">dict</span><span class="p">()</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">this_entry</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
<span class="c"># create a copy rather than a reference</span>
<span class="n">this_entry</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">this_entry</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">this_entry</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
<span class="c"># create a copy rather than a reference</span>
<span class="n">this_entry</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">this_entry</span><span class="p">)</span>
<span class="n">newdict</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="n">this_entry</span>
<span class="k">return</span> <span class="n">newdict</span>
<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">indict</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A recursive update - useful for merging config files.</span>
<span class="sd"> </span>
<span class="sd"> &gt;&gt;&gt; a = &#39;&#39;&#39;[section1]</span>
<span class="sd"> ... option1 = True</span>
<span class="sd"> ... [[subsection]]</span>
<span class="sd"> ... more_options = False</span>
<span class="sd"> ... # end of file&#39;&#39;&#39;.splitlines()</span>
<span class="sd"> &gt;&gt;&gt; b = &#39;&#39;&#39;# File is user.ini</span>
<span class="sd"> ... [section1]</span>
<span class="sd"> ... option1 = False</span>
<span class="sd"> ... # end of file&#39;&#39;&#39;.splitlines()</span>
<span class="sd"> &gt;&gt;&gt; c1 = ConfigObj(b)</span>
<span class="sd"> &gt;&gt;&gt; c2 = ConfigObj(a)</span>
<span class="sd"> &gt;&gt;&gt; c2.merge(c1)</span>
<span class="sd"> &gt;&gt;&gt; c2</span>
<span class="sd"> ConfigObj({&#39;section1&#39;: {&#39;option1&#39;: &#39;False&#39;, &#39;subsection&#39;: {&#39;more_options&#39;: &#39;False&#39;}}})</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">indict</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="p">(</span><span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span> <span class="ow">and</span> <span class="nb">isinstance</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="nb">dict</span><span class="p">)</span> <span class="ow">and</span>
<span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">dict</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="o">.</span><span class="n">merge</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
<span class="k">else</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="o">=</span> <span class="n">val</span>
<span class="k">def</span> <span class="nf">rename</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">oldkey</span><span class="p">,</span> <span class="n">newkey</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Change a keyname to another, without changing position in sequence.</span>
<span class="sd"> </span>
<span class="sd"> Implemented so that transformations can be made on keys,</span>
<span class="sd"> as well as on values. (used by encode and decode)</span>
<span class="sd"> </span>
<span class="sd"> Also renames comments.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">oldkey</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">scalars</span><span class="p">:</span>
<span class="n">the_list</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">scalars</span>
<span class="k">elif</span> <span class="n">oldkey</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">sections</span><span class="p">:</span>
<span class="n">the_list</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sections</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">KeyError</span><span class="p">(</span><span class="s">&#39;Key &quot;</span><span class="si">%s</span><span class="s">&quot; not found.&#39;</span> <span class="o">%</span> <span class="n">oldkey</span><span class="p">)</span>
<span class="n">pos</span> <span class="o">=</span> <span class="n">the_list</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">oldkey</span><span class="p">)</span>
<span class="c">#</span>
<span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="p">[</span><span class="n">oldkey</span><span class="p">]</span>
<span class="nb">dict</span><span class="o">.</span><span class="n">__delitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">oldkey</span><span class="p">)</span>
<span class="nb">dict</span><span class="o">.</span><span class="n">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">newkey</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
<span class="n">the_list</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">oldkey</span><span class="p">)</span>
<span class="n">the_list</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="n">pos</span><span class="p">,</span> <span class="n">newkey</span><span class="p">)</span>
<span class="n">comm</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">oldkey</span><span class="p">]</span>
<span class="n">inline_comment</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">inline_comments</span><span class="p">[</span><span class="n">oldkey</span><span class="p">]</span>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">comments</span><span class="p">[</span><span class="n">oldkey</span><span class="p">]</span>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">inline_comments</span><span class="p">[</span><span class="n">oldkey</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">comments</span><span class="p">[</span><span class="n">newkey</span><span class="p">]</span> <span class="o">=</span> <span class="n">comm</span>
<span class="bp">self</span><span class="o">.</span><span class="n">inline_comments</span><span class="p">[</span><span class="n">newkey</span><span class="p">]</span> <span class="o">=</span> <span class="n">inline_comment</span>
<span class="k">def</span> <span class="nf">walk</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">function</span><span class="p">,</span> <span class="n">raise_errors</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
<span class="n">call_on_sections</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="o">**</span><span class="n">keywargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Walk every member and call a function on the keyword and value.</span>
<span class="sd"> </span>
<span class="sd"> Return a dictionary of the return values</span>
<span class="sd"> </span>
<span class="sd"> If the function raises an exception, raise the errror</span>
<span class="sd"> unless ``raise_errors=False``, in which case set the return value to</span>
<span class="sd"> ``False``.</span>
<span class="sd"> </span>
<span class="sd"> Any unrecognised keyword arguments you pass to walk, will be pased on</span>
<span class="sd"> to the function you pass in.</span>
<span class="sd"> </span>
<span class="sd"> Note: if ``call_on_sections`` is ``True`` then - on encountering a</span>
<span class="sd"> subsection, *first* the function is called for the *whole* subsection,</span>
<span class="sd"> and then recurses into it&#39;s members. This means your function must be</span>
<span class="sd"> able to handle strings, dictionaries and lists. This allows you</span>
<span class="sd"> to change the key of subsections as well as for ordinary members. The</span>
<span class="sd"> return value when called on the whole subsection has to be discarded.</span>
<span class="sd"> </span>
<span class="sd"> See the encode and decode methods for examples, including functions.</span>
<span class="sd"> </span>
<span class="sd"> .. admonition:: caution</span>
<span class="sd"> </span>
<span class="sd"> You can use ``walk`` to transform the names of members of a section</span>
<span class="sd"> but you mustn&#39;t add or delete members.</span>
<span class="sd"> </span>
<span class="sd"> &gt;&gt;&gt; config = &#39;&#39;&#39;[XXXXsection]</span>
<span class="sd"> ... XXXXkey = XXXXvalue&#39;&#39;&#39;.splitlines()</span>
<span class="sd"> &gt;&gt;&gt; cfg = ConfigObj(config)</span>
<span class="sd"> &gt;&gt;&gt; cfg</span>
<span class="sd"> ConfigObj({&#39;XXXXsection&#39;: {&#39;XXXXkey&#39;: &#39;XXXXvalue&#39;}})</span>
<span class="sd"> &gt;&gt;&gt; def transform(section, key):</span>
<span class="sd"> ... val = section[key]</span>
<span class="sd"> ... newkey = key.replace(&#39;XXXX&#39;, &#39;CLIENT1&#39;)</span>
<span class="sd"> ... section.rename(key, newkey)</span>
<span class="sd"> ... if isinstance(val, (tuple, list, dict)):</span>
<span class="sd"> ... pass</span>
<span class="sd"> ... else:</span>
<span class="sd"> ... val = val.replace(&#39;XXXX&#39;, &#39;CLIENT1&#39;)</span>
<span class="sd"> ... section[newkey] = val</span>
<span class="sd"> &gt;&gt;&gt; cfg.walk(transform, call_on_sections=True)</span>
<span class="sd"> {&#39;CLIENT1section&#39;: {&#39;CLIENT1key&#39;: None}}</span>
<span class="sd"> &gt;&gt;&gt; cfg</span>
<span class="sd"> ConfigObj({&#39;CLIENT1section&#39;: {&#39;CLIENT1key&#39;: &#39;CLIENT1value&#39;}})</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">out</span> <span class="o">=</span> <span class="p">{}</span>
<span class="c"># scalars first</span>
<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="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">scalars</span><span class="p">)):</span>
<span class="n">entry</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">scalars</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">entry</span><span class="p">,</span> <span class="o">**</span><span class="n">keywargs</span><span class="p">)</span>
<span class="c"># bound again in case name has changed</span>
<span class="n">entry</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">scalars</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="n">out</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="k">if</span> <span class="n">raise_errors</span><span class="p">:</span>
<span class="k">raise</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">entry</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">scalars</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="n">out</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="bp">False</span>
<span class="c"># then sections</span>
<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="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sections</span><span class="p">)):</span>
<span class="n">entry</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sections</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="k">if</span> <span class="n">call_on_sections</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">function</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">entry</span><span class="p">,</span> <span class="o">**</span><span class="n">keywargs</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="k">if</span> <span class="n">raise_errors</span><span class="p">:</span>
<span class="k">raise</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">entry</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sections</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="n">out</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="bp">False</span>
<span class="c"># bound again in case name has changed</span>
<span class="n">entry</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sections</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="c"># previous result is discarded</span>
<span class="n">out</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span><span class="o">.</span><span class="n">walk</span><span class="p">(</span>
<span class="n">function</span><span class="p">,</span>
<span class="n">raise_errors</span><span class="o">=</span><span class="n">raise_errors</span><span class="p">,</span>
<span class="n">call_on_sections</span><span class="o">=</span><span class="n">call_on_sections</span><span class="p">,</span>
<span class="o">**</span><span class="n">keywargs</span><span class="p">)</span>
<span class="k">return</span> <span class="n">out</span>
<span class="k">def</span> <span class="nf">as_bool</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Accepts a key as input. The corresponding value must be a string or</span>
<span class="sd"> the objects (``True`` or 1) or (``False`` or 0). We allow 0 and 1 to</span>
<span class="sd"> retain compatibility with Python 2.2.</span>
<span class="sd"> </span>
<span class="sd"> If the string is one of ``True``, ``On``, ``Yes``, or ``1`` it returns </span>
<span class="sd"> ``True``.</span>
<span class="sd"> </span>
<span class="sd"> If the string is one of ``False``, ``Off``, ``No``, or ``0`` it returns </span>
<span class="sd"> ``False``.</span>
<span class="sd"> </span>
<span class="sd"> ``as_bool`` is not case sensitive.</span>
<span class="sd"> </span>
<span class="sd"> Any other input will raise a ``ValueError``.</span>
<span class="sd"> </span>
<span class="sd"> &gt;&gt;&gt; a = ConfigObj()</span>
<span class="sd"> &gt;&gt;&gt; a[&#39;a&#39;] = &#39;fish&#39;</span>
<span class="sd"> &gt;&gt;&gt; a.as_bool(&#39;a&#39;)</span>
<span class="sd"> Traceback (most recent call last):</span>
<span class="sd"> ValueError: Value &quot;fish&quot; is neither True nor False</span>
<span class="sd"> &gt;&gt;&gt; a[&#39;b&#39;] = &#39;True&#39;</span>
<span class="sd"> &gt;&gt;&gt; a.as_bool(&#39;b&#39;)</span>
<span class="sd"> 1</span>
<span class="sd"> &gt;&gt;&gt; a[&#39;b&#39;] = &#39;off&#39;</span>
<span class="sd"> &gt;&gt;&gt; a.as_bool(&#39;b&#39;)</span>
<span class="sd"> 0</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
<span class="k">if</span> <span class="n">val</span> <span class="o">==</span> <span class="bp">True</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">True</span>
<span class="k">elif</span> <span class="n">val</span> <span class="o">==</span> <span class="bp">False</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">False</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">basestring</span><span class="p">):</span>
<span class="c"># TODO: Why do we raise a KeyError here?</span>
<span class="k">raise</span> <span class="ne">KeyError</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">main</span><span class="o">.</span><span class="n">_bools</span><span class="p">[</span><span class="n">val</span><span class="o">.</span><span class="n">lower</span><span class="p">()]</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">&#39;Value &quot;</span><span class="si">%s</span><span class="s">&quot; is neither True nor False&#39;</span> <span class="o">%</span> <span class="n">val</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">as_int</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> A convenience method which coerces the specified value to an integer.</span>
<span class="sd"> </span>
<span class="sd"> If the value is an invalid literal for ``int``, a ``ValueError`` will</span>
<span class="sd"> be raised.</span>
<span class="sd"> </span>
<span class="sd"> &gt;&gt;&gt; a = ConfigObj()</span>
<span class="sd"> &gt;&gt;&gt; a[&#39;a&#39;] = &#39;fish&#39;</span>
<span class="sd"> &gt;&gt;&gt; a.as_int(&#39;a&#39;)</span>
<span class="sd"> Traceback (most recent call last):</span>
<span class="sd"> ValueError: invalid literal for int() with base 10: &#39;fish&#39;</span>
<span class="sd"> &gt;&gt;&gt; a[&#39;b&#39;] = &#39;1&#39;</span>
<span class="sd"> &gt;&gt;&gt; a.as_int(&#39;b&#39;)</span>
<span class="sd"> 1</span>
<span class="sd"> &gt;&gt;&gt; a[&#39;b&#39;] = &#39;3.2&#39;</span>
<span class="sd"> &gt;&gt;&gt; a.as_int(&#39;b&#39;)</span>
<span class="sd"> Traceback (most recent call last):</span>
<span class="sd"> ValueError: invalid literal for int() with base 10: &#39;3.2&#39;</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">int</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="k">def</span> <span class="nf">as_float</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> A convenience method which coerces the specified value to a float.</span>
<span class="sd"> </span>
<span class="sd"> If the value is an invalid literal for ``float``, a ``ValueError`` will</span>
<span class="sd"> be raised.</span>
<span class="sd"> </span>
<span class="sd"> &gt;&gt;&gt; a = ConfigObj()</span>
<span class="sd"> &gt;&gt;&gt; a[&#39;a&#39;] = &#39;fish&#39;</span>
<span class="sd"> &gt;&gt;&gt; a.as_float(&#39;a&#39;)</span>
<span class="sd"> Traceback (most recent call last):</span>
<span class="sd"> ValueError: invalid literal for float(): fish</span>
<span class="sd"> &gt;&gt;&gt; a[&#39;b&#39;] = &#39;1&#39;</span>
<span class="sd"> &gt;&gt;&gt; a.as_float(&#39;b&#39;)</span>
<span class="sd"> 1.0</span>
<span class="sd"> &gt;&gt;&gt; a[&#39;b&#39;] = &#39;3.2&#39;</span>
<span class="sd"> &gt;&gt;&gt; a.as_float(&#39;b&#39;)</span>
<span class="sd"> 3.2000000000000002</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">float</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="k">def</span> <span class="nf">as_list</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> A convenience method which fetches the specified value, guaranteeing</span>
<span class="sd"> that it is a list.</span>
<span class="sd"> </span>
<span class="sd"> &gt;&gt;&gt; a = ConfigObj()</span>
<span class="sd"> &gt;&gt;&gt; a[&#39;a&#39;] = 1</span>
<span class="sd"> &gt;&gt;&gt; a.as_list(&#39;a&#39;)</span>
<span class="sd"> [1]</span>
<span class="sd"> &gt;&gt;&gt; a[&#39;a&#39;] = (1,)</span>
<span class="sd"> &gt;&gt;&gt; a.as_list(&#39;a&#39;)</span>
<span class="sd"> [1]</span>
<span class="sd"> &gt;&gt;&gt; a[&#39;a&#39;] = [1]</span>
<span class="sd"> &gt;&gt;&gt; a.as_list(&#39;a&#39;)</span>
<span class="sd"> [1]</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="p">(</span><span class="nb">tuple</span><span class="p">,</span> <span class="nb">list</span><span class="p">)):</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="k">return</span> <span class="p">[</span><span class="n">result</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">restore_default</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Restore (and return) default value for the specified key.</span>
<span class="sd"> </span>
<span class="sd"> This method will only work for a ConfigObj that was created</span>
<span class="sd"> with a configspec and has been validated.</span>
<span class="sd"> </span>
<span class="sd"> If there is no default value for this key, ``KeyError`` is raised.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">default</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">default_values</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
<span class="nb">dict</span><span class="o">.</span><span class="n">__setitem__</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="p">)</span>
<span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">defaults</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">defaults</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="k">return</span> <span class="n">default</span>
<span class="k">def</span> <span class="nf">restore_defaults</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Recursively restore default values to all members</span>
<span class="sd"> that have them.</span>
<span class="sd"> </span>
<span class="sd"> This method will only work for a ConfigObj that was created</span>
<span class="sd"> with a configspec and has been validated.</span>
<span class="sd"> </span>
<span class="sd"> It doesn&#39;t delete or modify entries without default values.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<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">default_values</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">restore_default</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="k">for</span> <span class="n">section</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">sections</span><span class="p">:</span>
<span class="bp">self</span><span class="p">[</span><span class="n">section</span><span class="p">]</span><span class="o">.</span><span class="n">restore_defaults</span><span class="p">()</span>
<div class="viewcode-block" id="ConfigObj"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj">[docs]</a><span class="k">class</span> <span class="nc">ConfigObj</span><span class="p">(</span><span class="n">Section</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;An object to read, create, and write config files.&quot;&quot;&quot;</span>
<span class="n">_keyword</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">r&#39;&#39;&#39;^ # line start</span>
<span class="s"> (\s*) # indentation</span>
<span class="s"> ( # keyword</span>
<span class="s"> (?:&quot;.*?&quot;)| # double quotes</span>
<span class="s"> (?:&#39;.*?&#39;)| # single quotes</span>
<span class="s"> (?:[^&#39;&quot;=].*?) # no quotes</span>
<span class="s"> )</span>
<span class="s"> \s*=\s* # divider</span>
<span class="s"> (.*) # value (including list values and comments)</span>
<span class="s"> $ # line end</span>
<span class="s"> &#39;&#39;&#39;</span><span class="p">,</span>
<span class="n">re</span><span class="o">.</span><span class="n">VERBOSE</span><span class="p">)</span>
<span class="n">_sectionmarker</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">r&#39;&#39;&#39;^</span>
<span class="s"> (\s*) # 1: indentation</span>
<span class="s"> ((?:\[\s*)+) # 2: section marker open</span>
<span class="s"> ( # 3: section name open</span>
<span class="s"> (?:&quot;\s*\S.*?\s*&quot;)| # at least one non-space with double quotes</span>
<span class="s"> (?:&#39;\s*\S.*?\s*&#39;)| # at least one non-space with single quotes</span>
<span class="s"> (?:[^&#39;&quot;\s].*?) # at least one non-space unquoted</span>
<span class="s"> ) # section name close</span>
<span class="s"> ((?:\s*\])+) # 4: section marker close</span>
<span class="s"> \s*(\#.*)? # 5: optional comment</span>
<span class="s"> $&#39;&#39;&#39;</span><span class="p">,</span>
<span class="n">re</span><span class="o">.</span><span class="n">VERBOSE</span><span class="p">)</span>
<span class="c"># this regexp pulls list values out as a single string</span>
<span class="c"># or single values and comments</span>
<span class="c"># FIXME: this regex adds a &#39;&#39; to the end of comma terminated lists</span>
<span class="c"># workaround in ``_handle_value``</span>
<span class="n">_valueexp</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">r&#39;&#39;&#39;^</span>
<span class="s"> (?:</span>
<span class="s"> (?:</span>
<span class="s"> (</span>
<span class="s"> (?:</span>
<span class="s"> (?:</span>
<span class="s"> (?:&quot;.*?&quot;)| # double quotes</span>
<span class="s"> (?:&#39;.*?&#39;)| # single quotes</span>
<span class="s"> (?:[^&#39;&quot;,\#][^,\#]*?) # unquoted</span>
<span class="s"> )</span>
<span class="s"> \s*,\s* # comma</span>
<span class="s"> )* # match all list items ending in a comma (if any)</span>
<span class="s"> )</span>
<span class="s"> (</span>
<span class="s"> (?:&quot;.*?&quot;)| # double quotes</span>
<span class="s"> (?:&#39;.*?&#39;)| # single quotes</span>
<span class="s"> (?:[^&#39;&quot;,\#\s][^,]*?)| # unquoted</span>
<span class="s"> (?:(?&lt;!,)) # Empty value</span>
<span class="s"> )? # last item in a list - or string value</span>
<span class="s"> )|</span>
<span class="s"> (,) # alternatively a single comma - empty list</span>
<span class="s"> )</span>
<span class="s"> \s*(\#.*)? # optional comment</span>
<span class="s"> $&#39;&#39;&#39;</span><span class="p">,</span>
<span class="n">re</span><span class="o">.</span><span class="n">VERBOSE</span><span class="p">)</span>
<span class="c"># use findall to get the members of a list value</span>
<span class="n">_listvalueexp</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">r&#39;&#39;&#39;</span>
<span class="s"> (</span>
<span class="s"> (?:&quot;.*?&quot;)| # double quotes</span>
<span class="s"> (?:&#39;.*?&#39;)| # single quotes</span>
<span class="s"> (?:[^&#39;&quot;,\#]?.*?) # unquoted</span>
<span class="s"> )</span>
<span class="s"> \s*,\s* # comma</span>
<span class="s"> &#39;&#39;&#39;</span><span class="p">,</span>
<span class="n">re</span><span class="o">.</span><span class="n">VERBOSE</span><span class="p">)</span>
<span class="c"># this regexp is used for the value</span>
<span class="c"># when lists are switched off</span>
<span class="n">_nolistvalue</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">r&#39;&#39;&#39;^</span>
<span class="s"> (</span>
<span class="s"> (?:&quot;.*?&quot;)| # double quotes</span>
<span class="s"> (?:&#39;.*?&#39;)| # single quotes</span>
<span class="s"> (?:[^&#39;&quot;\#].*?)| # unquoted</span>
<span class="s"> (?:) # Empty value</span>
<span class="s"> )</span>
<span class="s"> \s*(\#.*)? # optional comment</span>
<span class="s"> $&#39;&#39;&#39;</span><span class="p">,</span>
<span class="n">re</span><span class="o">.</span><span class="n">VERBOSE</span><span class="p">)</span>
<span class="c"># regexes for finding triple quoted values on one line</span>
<span class="n">_single_line_single</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">r&quot;^&#39;&#39;&#39;(.*?)&#39;&#39;&#39;\s*(#.*)?$&quot;</span><span class="p">)</span>
<span class="n">_single_line_double</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">r&#39;^&quot;&quot;&quot;(.*?)&quot;&quot;&quot;\s*(#.*)?$&#39;</span><span class="p">)</span>
<span class="n">_multi_line_single</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">r&quot;^(.*?)&#39;&#39;&#39;\s*(#.*)?$&quot;</span><span class="p">)</span>
<span class="n">_multi_line_double</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">r&#39;^(.*?)&quot;&quot;&quot;\s*(#.*)?$&#39;</span><span class="p">)</span>
<span class="n">_triple_quote</span> <span class="o">=</span> <span class="p">{</span>
<span class="s">&quot;&#39;&#39;&#39;&quot;</span><span class="p">:</span> <span class="p">(</span><span class="n">_single_line_single</span><span class="p">,</span> <span class="n">_multi_line_single</span><span class="p">),</span>
<span class="s">&#39;&quot;&quot;&quot;&#39;</span><span class="p">:</span> <span class="p">(</span><span class="n">_single_line_double</span><span class="p">,</span> <span class="n">_multi_line_double</span><span class="p">),</span>
<span class="p">}</span>
<span class="c"># Used by the ``istrue`` Section method</span>
<span class="n">_bools</span> <span class="o">=</span> <span class="p">{</span>
<span class="s">&#39;yes&#39;</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span> <span class="s">&#39;no&#39;</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
<span class="s">&#39;on&#39;</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span> <span class="s">&#39;off&#39;</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
<span class="s">&#39;1&#39;</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span> <span class="s">&#39;0&#39;</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
<span class="s">&#39;true&#39;</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span> <span class="s">&#39;false&#39;</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
<span class="p">}</span>
<div class="viewcode-block" id="ConfigObj.__init__"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj.__init__">[docs]</a> <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">infile</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">options</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">configspec</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
<span class="n">interpolation</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">raise_errors</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">list_values</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
<span class="n">create_empty</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">file_error</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">stringify</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
<span class="n">indent_type</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">default_encoding</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">unrepr</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
<span class="n">write_empty_values</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">_inspec</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Parse a config file or create a config file object.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_inspec</span> <span class="o">=</span> <span class="n">_inspec</span>
<span class="c"># init the superclass</span>
<span class="n">Section</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="bp">self</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
<span class="n">infile</span> <span class="o">=</span> <span class="n">infile</span> <span class="ow">or</span> <span class="p">[]</span>
<span class="n">_options</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;configspec&#39;</span><span class="p">:</span> <span class="n">configspec</span><span class="p">,</span>
<span class="s">&#39;encoding&#39;</span><span class="p">:</span> <span class="n">encoding</span><span class="p">,</span> <span class="s">&#39;interpolation&#39;</span><span class="p">:</span> <span class="n">interpolation</span><span class="p">,</span>
<span class="s">&#39;raise_errors&#39;</span><span class="p">:</span> <span class="n">raise_errors</span><span class="p">,</span> <span class="s">&#39;list_values&#39;</span><span class="p">:</span> <span class="n">list_values</span><span class="p">,</span>
<span class="s">&#39;create_empty&#39;</span><span class="p">:</span> <span class="n">create_empty</span><span class="p">,</span> <span class="s">&#39;file_error&#39;</span><span class="p">:</span> <span class="n">file_error</span><span class="p">,</span>
<span class="s">&#39;stringify&#39;</span><span class="p">:</span> <span class="n">stringify</span><span class="p">,</span> <span class="s">&#39;indent_type&#39;</span><span class="p">:</span> <span class="n">indent_type</span><span class="p">,</span>
<span class="s">&#39;default_encoding&#39;</span><span class="p">:</span> <span class="n">default_encoding</span><span class="p">,</span> <span class="s">&#39;unrepr&#39;</span><span class="p">:</span> <span class="n">unrepr</span><span class="p">,</span>
<span class="s">&#39;write_empty_values&#39;</span><span class="p">:</span> <span class="n">write_empty_values</span><span class="p">}</span>
<span class="k">if</span> <span class="n">options</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">options</span> <span class="o">=</span> <span class="n">_options</span>
<span class="k">else</span><span class="p">:</span>
<span class="kn">import</span> <span class="nn">warnings</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s">&#39;Passing in an options dictionary to ConfigObj() is &#39;</span>
<span class="s">&#39;deprecated. Use **options instead.&#39;</span><span class="p">,</span>
<span class="ne">DeprecationWarning</span><span class="p">,</span> <span class="n">stacklevel</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="c"># TODO: check the values too.</span>
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">options</span><span class="p">:</span>
<span class="k">if</span> <span class="n">entry</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">OPTION_DEFAULTS</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s">&#39;Unrecognised option &quot;</span><span class="si">%s</span><span class="s">&quot;.&#39;</span> <span class="o">%</span> <span class="n">entry</span><span class="p">)</span>
<span class="k">for</span> <span class="n">entry</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">OPTION_DEFAULTS</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="n">entry</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">options</span><span class="p">:</span>
<span class="n">options</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
<span class="n">keyword_value</span> <span class="o">=</span> <span class="n">_options</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span>
<span class="k">if</span> <span class="n">value</span> <span class="o">!=</span> <span class="n">keyword_value</span><span class="p">:</span>
<span class="n">options</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="n">keyword_value</span>
<span class="c"># XXXX this ignores an explicit list_values = True in combination</span>
<span class="c"># with _inspec. The user should *never* do that anyway, but still...</span>
<span class="k">if</span> <span class="n">_inspec</span><span class="p">:</span>
<span class="n">options</span><span class="p">[</span><span class="s">&#39;list_values&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">False</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_initialise</span><span class="p">(</span><span class="n">options</span><span class="p">)</span>
<span class="n">configspec</span> <span class="o">=</span> <span class="n">options</span><span class="p">[</span><span class="s">&#39;configspec&#39;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_original_configspec</span> <span class="o">=</span> <span class="n">configspec</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_load</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="n">configspec</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="ConfigObj._load"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj._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">infile</span><span class="p">,</span> <span class="n">configspec</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="nb">basestring</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="o">=</span> <span class="n">infile</span>
<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">infile</span><span class="p">):</span>
<span class="n">h</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="s">&#39;rb&#39;</span><span class="p">)</span>
<span class="n">infile</span> <span class="o">=</span> <span class="n">h</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> <span class="ow">or</span> <span class="p">[]</span>
<span class="n">h</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">file_error</span><span class="p">:</span>
<span class="c"># raise an error if the file doesn&#39;t exist</span>
<span class="k">raise</span> <span class="ne">IOError</span><span class="p">(</span><span class="s">&#39;Config file not found: &quot;</span><span class="si">%s</span><span class="s">&quot;.&#39;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">filename</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c"># file doesn&#39;t already exist</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_empty</span><span class="p">:</span>
<span class="c"># this is a good test that the filename specified</span>
<span class="c"># isn&#39;t impossible - like on a non-existent device</span>
<span class="n">h</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="s">&#39;w&#39;</span><span class="p">)</span>
<span class="n">h</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;&#39;</span><span class="p">)</span>
<span class="n">h</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="n">infile</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span>
<span class="n">infile</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">infile</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
<span class="c"># initialise self</span>
<span class="c"># the Section class handles creating subsections</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="n">ConfigObj</span><span class="p">):</span>
<span class="c"># get a copy of our ConfigObj</span>
<span class="k">def</span> <span class="nf">set_section</span><span class="p">(</span><span class="n">in_section</span><span class="p">,</span> <span class="n">this_section</span><span class="p">):</span>
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">in_section</span><span class="o">.</span><span class="n">scalars</span><span class="p">:</span>
<span class="n">this_section</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="n">in_section</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span>
<span class="k">for</span> <span class="n">section</span> <span class="ow">in</span> <span class="n">in_section</span><span class="o">.</span><span class="n">sections</span><span class="p">:</span>
<span class="n">this_section</span><span class="p">[</span><span class="n">section</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">set_section</span><span class="p">(</span><span class="n">in_section</span><span class="p">[</span><span class="n">section</span><span class="p">],</span> <span class="n">this_section</span><span class="p">[</span><span class="n">section</span><span class="p">])</span>
<span class="n">set_section</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">infile</span><span class="p">:</span>
<span class="bp">self</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="n">infile</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_errors</span>
<span class="k">if</span> <span class="n">configspec</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_handle_configspec</span><span class="p">(</span><span class="n">configspec</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">configspec</span> <span class="o">=</span> <span class="bp">None</span>
<span class="k">return</span>
<span class="k">elif</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="s">&#39;read&#39;</span><span class="p">,</span> <span class="n">MISSING</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">MISSING</span><span class="p">:</span>
<span class="c"># This supports file like objects</span>
<span class="n">infile</span> <span class="o">=</span> <span class="n">infile</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> <span class="ow">or</span> <span class="p">[]</span>
<span class="c"># needs splitting into lines - but needs doing *after* decoding</span>
<span class="c"># in case it&#39;s not an 8 bit encoding</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s">&#39;infile must be a filename, file like object, or list of lines.&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">infile</span><span class="p">:</span>
<span class="c"># don&#39;t do it for the empty ConfigObj</span>
<span class="n">infile</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handle_bom</span><span class="p">(</span><span class="n">infile</span><span class="p">)</span>
<span class="c"># infile is now *always* a list</span>
<span class="c">#</span>
<span class="c"># Set the newlines attribute (first line ending it finds)</span>
<span class="c"># and strip trailing &#39;\n&#39; or &#39;\r&#39; from lines</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">infile</span><span class="p">:</span>
<span class="k">if</span> <span class="p">(</span><span class="ow">not</span> <span class="n">line</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">line</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s">&#39;</span><span class="se">\r</span><span class="s">&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\r\n</span><span class="s">&#39;</span><span class="p">)):</span>
<span class="k">continue</span>
<span class="k">for</span> <span class="n">end</span> <span class="ow">in</span> <span class="p">(</span><span class="s">&#39;</span><span class="se">\r\n</span><span class="s">&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\r</span><span class="s">&#39;</span><span class="p">):</span>
<span class="k">if</span> <span class="n">line</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="n">end</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">newlines</span> <span class="o">=</span> <span class="n">end</span>
<span class="k">break</span>
<span class="k">break</span>
<span class="n">infile</span> <span class="o">=</span> <span class="p">[</span><span class="n">line</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\r\n</span><span class="s">&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">infile</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_parse</span><span class="p">(</span><span class="n">infile</span><span class="p">)</span>
<span class="c"># if we had any errors, now is the time to raise them</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_errors</span><span class="p">:</span>
<span class="n">info</span> <span class="o">=</span> <span class="s">&quot;at line </span><span class="si">%s</span><span class="s">.&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_errors</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">line_number</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_errors</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;Parsing failed with several errors.</span><span class="se">\n</span><span class="s">First error </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">info</span>
<span class="n">error</span> <span class="o">=</span> <span class="n">ConfigObjError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">error</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_errors</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="c"># set the errors attribute; it&#39;s a list of tuples:</span>
<span class="c"># (error_type, message, line_number)</span>
<span class="n">error</span><span class="o">.</span><span class="n">errors</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_errors</span>
<span class="c"># set the config attribute</span>
<span class="n">error</span><span class="o">.</span><span class="n">config</span> <span class="o">=</span> <span class="bp">self</span>
<span class="k">raise</span> <span class="n">error</span>
<span class="c"># delete private attributes</span>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_errors</span>
<span class="k">if</span> <span class="n">configspec</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">configspec</span> <span class="o">=</span> <span class="bp">None</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_handle_configspec</span><span class="p">(</span><span class="n">configspec</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="ConfigObj._initialise"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj._initialise">[docs]</a> <span class="k">def</span> <span class="nf">_initialise</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">options</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">options</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">options</span> <span class="o">=</span> <span class="n">OPTION_DEFAULTS</span>
<span class="c"># initialise a few variables</span>
<span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="o">=</span> <span class="bp">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">raise_errors</span> <span class="o">=</span> <span class="n">options</span><span class="p">[</span><span class="s">&#39;raise_errors&#39;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">interpolation</span> <span class="o">=</span> <span class="n">options</span><span class="p">[</span><span class="s">&#39;interpolation&#39;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">list_values</span> <span class="o">=</span> <span class="n">options</span><span class="p">[</span><span class="s">&#39;list_values&#39;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_empty</span> <span class="o">=</span> <span class="n">options</span><span class="p">[</span><span class="s">&#39;create_empty&#39;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">file_error</span> <span class="o">=</span> <span class="n">options</span><span class="p">[</span><span class="s">&#39;file_error&#39;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">stringify</span> <span class="o">=</span> <span class="n">options</span><span class="p">[</span><span class="s">&#39;stringify&#39;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">indent_type</span> <span class="o">=</span> <span class="n">options</span><span class="p">[</span><span class="s">&#39;indent_type&#39;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">encoding</span> <span class="o">=</span> <span class="n">options</span><span class="p">[</span><span class="s">&#39;encoding&#39;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">default_encoding</span> <span class="o">=</span> <span class="n">options</span><span class="p">[</span><span class="s">&#39;default_encoding&#39;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">BOM</span> <span class="o">=</span> <span class="bp">False</span>
<span class="bp">self</span><span class="o">.</span><span class="n">newlines</span> <span class="o">=</span> <span class="bp">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">write_empty_values</span> <span class="o">=</span> <span class="n">options</span><span class="p">[</span><span class="s">&#39;write_empty_values&#39;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">unrepr</span> <span class="o">=</span> <span class="n">options</span><span class="p">[</span><span class="s">&#39;unrepr&#39;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">initial_comment</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">final_comment</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">configspec</span> <span class="o">=</span> <span class="bp">None</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_inspec</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">list_values</span> <span class="o">=</span> <span class="bp">False</span>
<span class="c"># Clear section attributes as well</span>
<span class="n">Section</span><span class="o">.</span><span class="n">_initialise</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="ConfigObj.__repr__"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj.__repr__">[docs]</a> <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">_getval</span><span class="p">(</span><span class="n">key</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
<span class="k">except</span> <span class="n">MissingInterpolationOption</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">dict</span><span class="o">.</span><span class="n">__getitem__</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="k">return</span> <span class="p">(</span><span class="s">&#39;ConfigObj({</span><span class="si">%s</span><span class="s">})&#39;</span> <span class="o">%</span>
<span class="s">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([(</span><span class="s">&#39;</span><span class="si">%s</span><span class="s">: </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">key</span><span class="p">),</span> <span class="nb">repr</span><span class="p">(</span><span class="n">_getval</span><span class="p">(</span><span class="n">key</span><span class="p">))))</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">scalars</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">sections</span><span class="p">)]))</span>
</div>
<div class="viewcode-block" id="ConfigObj._handle_bom"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj._handle_bom">[docs]</a> <span class="k">def</span> <span class="nf">_handle_bom</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">infile</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Handle any BOM, and decode if necessary.</span>
<span class="sd"> </span>
<span class="sd"> If an encoding is specified, that *must* be used - but the BOM should</span>
<span class="sd"> still be removed (and the BOM attribute set).</span>
<span class="sd"> </span>
<span class="sd"> (If the encoding is wrongly specified, then a BOM for an alternative</span>
<span class="sd"> encoding won&#39;t be discovered or removed.)</span>
<span class="sd"> </span>
<span class="sd"> If an encoding is not specified, UTF8 or UTF16 BOM will be detected and</span>
<span class="sd"> removed. The BOM attribute will be set. UTF16 will be decoded to</span>
<span class="sd"> unicode.</span>
<span class="sd"> </span>
<span class="sd"> NOTE: This method must not be called with an empty ``infile``.</span>
<span class="sd"> </span>
<span class="sd"> Specifying the *wrong* encoding is likely to cause a</span>
<span class="sd"> ``UnicodeDecodeError``.</span>
<span class="sd"> </span>
<span class="sd"> ``infile`` must always be returned as a list of lines, but may be</span>
<span class="sd"> passed in as a single string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</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="ow">not</span> <span class="bp">None</span><span class="p">)</span> <span class="ow">and</span>
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">BOM_LIST</span><span class="p">)):</span>
<span class="c"># No need to check for a BOM</span>
<span class="c"># the encoding specified doesn&#39;t have one</span>
<span class="c"># just decode</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_decode</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">infile</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">infile</span>
<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="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="c"># encoding explicitly supplied</span>
<span class="c"># And it could have an associated BOM</span>
<span class="c"># TODO: if encoding is just UTF16 - we ought to check for both</span>
<span class="c"># TODO: big endian and little endian versions.</span>
<span class="n">enc</span> <span class="o">=</span> <span class="n">BOM_LIST</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="o">.</span><span class="n">lower</span><span class="p">()]</span>
<span class="k">if</span> <span class="n">enc</span> <span class="o">==</span> <span class="s">&#39;utf_16&#39;</span><span class="p">:</span>
<span class="c"># For UTF16 we try big endian and little endian</span>
<span class="k">for</span> <span class="n">BOM</span><span class="p">,</span> <span class="p">(</span><span class="n">encoding</span><span class="p">,</span> <span class="n">final_encoding</span><span class="p">)</span> <span class="ow">in</span> <span class="n">BOMS</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">final_encoding</span><span class="p">:</span>
<span class="c"># skip UTF8</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="n">infile</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">BOM</span><span class="p">):</span>
<span class="c">### BOM discovered</span>
<span class="c">##self.BOM = True</span>
<span class="c"># Don&#39;t need to remove BOM</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_decode</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="n">encoding</span><span class="p">)</span>
<span class="c"># If we get this far, will *probably* raise a DecodeError</span>
<span class="c"># As it doesn&#39;t appear to start with a BOM</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_decode</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">)</span>
<span class="c"># Must be UTF8</span>
<span class="n">BOM</span> <span class="o">=</span> <span class="n">BOM_SET</span><span class="p">[</span><span class="n">enc</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">BOM</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_decode</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">)</span>
<span class="n">newline</span> <span class="o">=</span> <span class="n">line</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">BOM</span><span class="p">):]</span>
<span class="c"># BOM removed</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span>
<span class="n">infile</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">newline</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">infile</span> <span class="o">=</span> <span class="n">newline</span>
<span class="bp">self</span><span class="o">.</span><span class="n">BOM</span> <span class="o">=</span> <span class="bp">True</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_decode</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">)</span>
<span class="c"># No encoding specified - so we need to check for UTF8/UTF16</span>
<span class="k">for</span> <span class="n">BOM</span><span class="p">,</span> <span class="p">(</span><span class="n">encoding</span><span class="p">,</span> <span class="n">final_encoding</span><span class="p">)</span> <span class="ow">in</span> <span class="n">BOMS</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">BOM</span><span class="p">):</span>
<span class="k">continue</span>
<span class="k">else</span><span class="p">:</span>
<span class="c"># BOM discovered</span>
<span class="bp">self</span><span class="o">.</span><span class="n">encoding</span> <span class="o">=</span> <span class="n">final_encoding</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">final_encoding</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">BOM</span> <span class="o">=</span> <span class="bp">True</span>
<span class="c"># UTF8</span>
<span class="c"># remove BOM</span>
<span class="n">newline</span> <span class="o">=</span> <span class="n">line</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">BOM</span><span class="p">):]</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span>
<span class="n">infile</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">newline</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">infile</span> <span class="o">=</span> <span class="n">newline</span>
<span class="c"># UTF8 - don&#39;t decode</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="nb">basestring</span><span class="p">):</span>
<span class="k">return</span> <span class="n">infile</span><span class="o">.</span><span class="n">splitlines</span><span class="p">(</span><span class="bp">True</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">infile</span>
<span class="c"># UTF16 - have to decode</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_decode</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="n">encoding</span><span class="p">)</span>
<span class="c"># No BOM discovered and no encoding specified, just return</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="nb">basestring</span><span class="p">):</span>
<span class="c"># infile read from a file will be a single string</span>
<span class="k">return</span> <span class="n">infile</span><span class="o">.</span><span class="n">splitlines</span><span class="p">(</span><span class="bp">True</span><span class="p">)</span>
<span class="k">return</span> <span class="n">infile</span>
</div>
<div class="viewcode-block" id="ConfigObj._a_to_u"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj._a_to_u">[docs]</a> <span class="k">def</span> <span class="nf">_a_to_u</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">aString</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Decode ASCII strings to unicode if a self.encoding is specified.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">:</span>
<span class="k">return</span> <span class="n">aString</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s">&#39;ascii&#39;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">aString</span>
</div>
<div class="viewcode-block" id="ConfigObj._decode"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj._decode">[docs]</a> <span class="k">def</span> <span class="nf">_decode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">infile</span><span class="p">,</span> <span class="n">encoding</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Decode infile to unicode. Using the specified encoding.</span>
<span class="sd"> </span>
<span class="sd"> if is a string, it also needs converting to a list.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="nb">basestring</span><span class="p">):</span>
<span class="c"># can&#39;t be unicode</span>
<span class="c"># NOTE: Could raise a ``UnicodeDecodeError``</span>
<span class="k">return</span> <span class="n">infile</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="n">encoding</span><span class="p">)</span><span class="o">.</span><span class="n">splitlines</span><span class="p">(</span><span class="bp">True</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">line</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">infile</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="nb">unicode</span><span class="p">):</span>
<span class="c"># NOTE: The isinstance test here handles mixed lists of unicode/string</span>
<span class="c"># NOTE: But the decode will break on any non-string values</span>
<span class="c"># NOTE: Or could raise a ``UnicodeDecodeError``</span>
<span class="n">infile</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="n">encoding</span><span class="p">)</span>
<span class="k">return</span> <span class="n">infile</span>
</div>
<div class="viewcode-block" id="ConfigObj._decode_element"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj._decode_element">[docs]</a> <span class="k">def</span> <span class="nf">_decode_element</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">line</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Decode element to unicode if necessary.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">:</span>
<span class="k">return</span> <span class="n">line</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">default_encoding</span><span class="p">:</span>
<span class="k">return</span> <span class="n">line</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">default_encoding</span><span class="p">)</span>
<span class="k">return</span> <span class="n">line</span>
</div>
<div class="viewcode-block" id="ConfigObj._str"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj._str">[docs]</a> <span class="k">def</span> <span class="nf">_str</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Used by ``stringify`` within validate, to turn non-string values</span>
<span class="sd"> into strings.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">basestring</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">value</span>
</div>
<div class="viewcode-block" id="ConfigObj._parse"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj._parse">[docs]</a> <span class="k">def</span> <span class="nf">_parse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">infile</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Actually parse the config file.&quot;&quot;&quot;</span>
<span class="n">temp_list_values</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">list_values</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">unrepr</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">list_values</span> <span class="o">=</span> <span class="bp">False</span>
<span class="n">comment_list</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">done_start</span> <span class="o">=</span> <span class="bp">False</span>
<span class="n">this_section</span> <span class="o">=</span> <span class="bp">self</span>
<span class="n">maxline</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">infile</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>
<span class="n">cur_index</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
<span class="n">reset_comment</span> <span class="o">=</span> <span class="bp">False</span>
<span class="k">while</span> <span class="n">cur_index</span> <span class="o">&lt;</span> <span class="n">maxline</span><span class="p">:</span>
<span class="k">if</span> <span class="n">reset_comment</span><span class="p">:</span>
<span class="n">comment_list</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">cur_index</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">infile</span><span class="p">[</span><span class="n">cur_index</span><span class="p">]</span>
<span class="n">sline</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="c"># do we have anything on the line ?</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">sline</span> <span class="ow">or</span> <span class="n">sline</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&#39;#&#39;</span><span class="p">):</span>
<span class="n">reset_comment</span> <span class="o">=</span> <span class="bp">False</span>
<span class="n">comment_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">done_start</span><span class="p">:</span>
<span class="c"># preserve initial comment</span>
<span class="bp">self</span><span class="o">.</span><span class="n">initial_comment</span> <span class="o">=</span> <span class="n">comment_list</span>
<span class="n">comment_list</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">done_start</span> <span class="o">=</span> <span class="bp">True</span>
<span class="n">reset_comment</span> <span class="o">=</span> <span class="bp">True</span>
<span class="c"># first we check if it&#39;s a section marker</span>
<span class="n">mat</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sectionmarker</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
<span class="k">if</span> <span class="n">mat</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="c"># is a section line</span>
<span class="p">(</span><span class="n">indent</span><span class="p">,</span> <span class="n">sect_open</span><span class="p">,</span> <span class="n">sect_name</span><span class="p">,</span> <span class="n">sect_close</span><span class="p">,</span> <span class="n">comment</span><span class="p">)</span> <span class="o">=</span> <span class="n">mat</span><span class="o">.</span><span class="n">groups</span><span class="p">()</span>
<span class="k">if</span> <span class="n">indent</span> <span class="ow">and</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">indent_type</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">indent_type</span> <span class="o">=</span> <span class="n">indent</span>
<span class="n">cur_depth</span> <span class="o">=</span> <span class="n">sect_open</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="s">&#39;[&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">cur_depth</span> <span class="o">!=</span> <span class="n">sect_close</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="s">&#39;]&#39;</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_handle_error</span><span class="p">(</span><span class="s">&quot;Cannot compute the section depth at line </span><span class="si">%s</span><span class="s">.&quot;</span><span class="p">,</span>
<span class="n">NestingError</span><span class="p">,</span> <span class="n">infile</span><span class="p">,</span> <span class="n">cur_index</span><span class="p">)</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="n">cur_depth</span> <span class="o">&lt;</span> <span class="n">this_section</span><span class="o">.</span><span class="n">depth</span><span class="p">:</span>
<span class="c"># the new section is dropping back to a previous level</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">parent</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match_depth</span><span class="p">(</span><span class="n">this_section</span><span class="p">,</span>
<span class="n">cur_depth</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span>
<span class="k">except</span> <span class="ne">SyntaxError</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_handle_error</span><span class="p">(</span><span class="s">&quot;Cannot compute nesting level at line </span><span class="si">%s</span><span class="s">.&quot;</span><span class="p">,</span>
<span class="n">NestingError</span><span class="p">,</span> <span class="n">infile</span><span class="p">,</span> <span class="n">cur_index</span><span class="p">)</span>
<span class="k">continue</span>
<span class="k">elif</span> <span class="n">cur_depth</span> <span class="o">==</span> <span class="n">this_section</span><span class="o">.</span><span class="n">depth</span><span class="p">:</span>
<span class="c"># the new section is a sibling of the current section</span>
<span class="n">parent</span> <span class="o">=</span> <span class="n">this_section</span><span class="o">.</span><span class="n">parent</span>
<span class="k">elif</span> <span class="n">cur_depth</span> <span class="o">==</span> <span class="n">this_section</span><span class="o">.</span><span class="n">depth</span> <span class="o">+</span> <span class="mi">1</span><span class="p">:</span>
<span class="c"># the new section is a child the current section</span>
<span class="n">parent</span> <span class="o">=</span> <span class="n">this_section</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_handle_error</span><span class="p">(</span><span class="s">&quot;Section too nested at line </span><span class="si">%s</span><span class="s">.&quot;</span><span class="p">,</span>
<span class="n">NestingError</span><span class="p">,</span> <span class="n">infile</span><span class="p">,</span> <span class="n">cur_index</span><span class="p">)</span>
<span class="n">sect_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_unquote</span><span class="p">(</span><span class="n">sect_name</span><span class="p">)</span>
<span class="k">if</span> <span class="n">sect_name</span> <span class="ow">in</span> <span class="n">parent</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_handle_error</span><span class="p">(</span><span class="s">&#39;Duplicate section name at line </span><span class="si">%s</span><span class="s">.&#39;</span><span class="p">,</span>
<span class="n">DuplicateError</span><span class="p">,</span> <span class="n">infile</span><span class="p">,</span> <span class="n">cur_index</span><span class="p">)</span>
<span class="k">continue</span>
<span class="c"># create the new section</span>
<span class="n">this_section</span> <span class="o">=</span> <span class="n">Section</span><span class="p">(</span>
<span class="n">parent</span><span class="p">,</span>
<span class="n">cur_depth</span><span class="p">,</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">name</span><span class="o">=</span><span class="n">sect_name</span><span class="p">)</span>
<span class="n">parent</span><span class="p">[</span><span class="n">sect_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">this_section</span>
<span class="n">parent</span><span class="o">.</span><span class="n">inline_comments</span><span class="p">[</span><span class="n">sect_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">comment</span>
<span class="n">parent</span><span class="o">.</span><span class="n">comments</span><span class="p">[</span><span class="n">sect_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">comment_list</span>
<span class="k">continue</span>
<span class="c">#</span>
<span class="c"># it&#39;s not a section marker,</span>
<span class="c"># so it should be a valid ``key = value`` line</span>
<span class="n">mat</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_keyword</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
<span class="k">if</span> <span class="n">mat</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="c"># it neither matched as a keyword</span>
<span class="c"># or a section marker</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_handle_error</span><span class="p">(</span>
<span class="s">&#39;Invalid line at line &quot;</span><span class="si">%s</span><span class="s">&quot;.&#39;</span><span class="p">,</span>
<span class="n">ParseError</span><span class="p">,</span> <span class="n">infile</span><span class="p">,</span> <span class="n">cur_index</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c"># is a keyword value</span>
<span class="c"># value will include any inline comment</span>
<span class="p">(</span><span class="n">indent</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="o">=</span> <span class="n">mat</span><span class="o">.</span><span class="n">groups</span><span class="p">()</span>
<span class="k">if</span> <span class="n">indent</span> <span class="ow">and</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">indent_type</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">indent_type</span> <span class="o">=</span> <span class="n">indent</span>
<span class="c"># check for a multiline value</span>
<span class="k">if</span> <span class="n">value</span><span class="p">[:</span><span class="mi">3</span><span class="p">]</span> <span class="ow">in</span> <span class="p">[</span><span class="s">&#39;&quot;&quot;&quot;&#39;</span><span class="p">,</span> <span class="s">&quot;&#39;&#39;&#39;&quot;</span><span class="p">]:</span>
<span class="k">try</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">cur_index</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_multiline</span><span class="p">(</span>
<span class="n">value</span><span class="p">,</span> <span class="n">infile</span><span class="p">,</span> <span class="n">cur_index</span><span class="p">,</span> <span class="n">maxline</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">SyntaxError</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_handle_error</span><span class="p">(</span>
<span class="s">&#39;Parse error in value at line </span><span class="si">%s</span><span class="s">.&#39;</span><span class="p">,</span>
<span class="n">ParseError</span><span class="p">,</span> <span class="n">infile</span><span class="p">,</span> <span class="n">cur_index</span><span class="p">)</span>
<span class="k">continue</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">unrepr</span><span class="p">:</span>
<span class="n">comment</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">unrepr</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="o">==</span> <span class="n">UnknownType</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="s">&#39;Unknown name or type in value at line </span><span class="si">%s</span><span class="s">.&#39;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="s">&#39;Parse error in value at line </span><span class="si">%s</span><span class="s">.&#39;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_handle_error</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">UnreprError</span><span class="p">,</span> <span class="n">infile</span><span class="p">,</span>
<span class="n">cur_index</span><span class="p">)</span>
<span class="k">continue</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">unrepr</span><span class="p">:</span>
<span class="n">comment</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">unrepr</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">UnknownType</span><span class="p">):</span>
<span class="n">msg</span> <span class="o">=</span> <span class="s">&#39;Unknown name or type in value at line </span><span class="si">%s</span><span class="s">.&#39;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="s">&#39;Parse error in value at line </span><span class="si">%s</span><span class="s">.&#39;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_handle_error</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">UnreprError</span><span class="p">,</span> <span class="n">infile</span><span class="p">,</span>
<span class="n">cur_index</span><span class="p">)</span>
<span class="k">continue</span>
<span class="k">else</span><span class="p">:</span>
<span class="c"># extract comment and lists</span>
<span class="k">try</span><span class="p">:</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="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handle_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">SyntaxError</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_handle_error</span><span class="p">(</span>
<span class="s">&#39;Parse error in value at line </span><span class="si">%s</span><span class="s">.&#39;</span><span class="p">,</span>
<span class="n">ParseError</span><span class="p">,</span> <span class="n">infile</span><span class="p">,</span> <span class="n">cur_index</span><span class="p">)</span>
<span class="k">continue</span>
<span class="c">#</span>
<span class="n">key</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_unquote</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">this_section</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_handle_error</span><span class="p">(</span>
<span class="s">&#39;Duplicate keyword name at line </span><span class="si">%s</span><span class="s">.&#39;</span><span class="p">,</span>
<span class="n">DuplicateError</span><span class="p">,</span> <span class="n">infile</span><span class="p">,</span> <span class="n">cur_index</span><span class="p">)</span>
<span class="k">continue</span>
<span class="c"># add the key.</span>
<span class="c"># we set unrepr because if we have got this far we will never</span>
<span class="c"># be creating a new section</span>
<span class="n">this_section</span><span class="o">.</span><span class="n">__setitem__</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">unrepr</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">this_section</span><span class="o">.</span><span class="n">inline_comments</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">comment</span>
<span class="n">this_section</span><span class="o">.</span><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_list</span>
<span class="k">continue</span>
<span class="c">#</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">indent_type</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="c"># no indentation used, set the type accordingly</span>
<span class="bp">self</span><span class="o">.</span><span class="n">indent_type</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
<span class="c"># preserve the final comment</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">initial_comment</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">initial_comment</span> <span class="o">=</span> <span class="n">comment_list</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="n">reset_comment</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">final_comment</span> <span class="o">=</span> <span class="n">comment_list</span>
<span class="bp">self</span><span class="o">.</span><span class="n">list_values</span> <span class="o">=</span> <span class="n">temp_list_values</span>
</div>
<div class="viewcode-block" id="ConfigObj._match_depth"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj._match_depth">[docs]</a> <span class="k">def</span> <span class="nf">_match_depth</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sect</span><span class="p">,</span> <span class="n">depth</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Given a section and a depth level, walk back through the sections</span>
<span class="sd"> parents to see if the depth level matches a previous section.</span>
<span class="sd"> </span>
<span class="sd"> Return a reference to the right section,</span>
<span class="sd"> or raise a SyntaxError.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">while</span> <span class="n">depth</span> <span class="o">&lt;</span> <span class="n">sect</span><span class="o">.</span><span class="n">depth</span><span class="p">:</span>
<span class="k">if</span> <span class="n">sect</span> <span class="ow">is</span> <span class="n">sect</span><span class="o">.</span><span class="n">parent</span><span class="p">:</span>
<span class="c"># we&#39;ve reached the top level already</span>
<span class="k">raise</span> <span class="ne">SyntaxError</span><span class="p">()</span>
<span class="n">sect</span> <span class="o">=</span> <span class="n">sect</span><span class="o">.</span><span class="n">parent</span>
<span class="k">if</span> <span class="n">sect</span><span class="o">.</span><span class="n">depth</span> <span class="o">==</span> <span class="n">depth</span><span class="p">:</span>
<span class="k">return</span> <span class="n">sect</span>
<span class="c"># shouldn&#39;t get here</span>
<span class="k">raise</span> <span class="ne">SyntaxError</span><span class="p">()</span>
</div>
<div class="viewcode-block" id="ConfigObj._handle_error"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj._handle_error">[docs]</a> <span class="k">def</span> <span class="nf">_handle_error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">ErrorClass</span><span class="p">,</span> <span class="n">infile</span><span class="p">,</span> <span class="n">cur_index</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Handle an error according to the error settings.</span>
<span class="sd"> </span>
<span class="sd"> Either raise the error or store it.</span>
<span class="sd"> The error will have occured at ``cur_index``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">infile</span><span class="p">[</span><span class="n">cur_index</span><span class="p">]</span>
<span class="n">cur_index</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">message</span> <span class="o">=</span> <span class="n">text</span> <span class="o">%</span> <span class="n">cur_index</span>
<span class="n">error</span> <span class="o">=</span> <span class="n">ErrorClass</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">cur_index</span><span class="p">,</span> <span class="n">line</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">raise_errors</span><span class="p">:</span>
<span class="c"># raise the error - parsing stops here</span>
<span class="k">raise</span> <span class="n">error</span>
<span class="c"># store the error</span>
<span class="c"># reraise when parsing has finished</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">error</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="ConfigObj._unquote"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj._unquote">[docs]</a> <span class="k">def</span> <span class="nf">_unquote</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="sd">&quot;&quot;&quot;Return an unquoted version of a value&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">value</span><span class="p">:</span>
<span class="c"># should only happen during parsing of lists</span>
<span class="k">raise</span> <span class="ne">SyntaxError</span>
<span class="k">if</span> <span class="p">(</span><span class="n">value</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">value</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="ow">and</span> <span class="p">(</span><span class="n">value</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="s">&#39;&quot;&#39;</span><span class="p">,</span> <span class="s">&quot;&#39;&quot;</span><span class="p">)):</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">value</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="k">return</span> <span class="n">value</span>
</div>
<div class="viewcode-block" id="ConfigObj._quote"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj._quote">[docs]</a> <span class="k">def</span> <span class="nf">_quote</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">multiline</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return a safely quoted version of a value.</span>
<span class="sd"> </span>
<span class="sd"> Raise a ConfigObjError if the value cannot be safely quoted.</span>
<span class="sd"> If multiline is ``True`` (default) then use triple quotes</span>
<span class="sd"> if necessary.</span>
<span class="sd"> </span>
<span class="sd"> * Don&#39;t quote values that don&#39;t need it.</span>
<span class="sd"> * Recursively quote members of a list and return a comma joined list.</span>
<span class="sd"> * Multiline is ``False`` for lists.</span>
<span class="sd"> * Obey list syntax for empty and single member lists.</span>
<span class="sd"> </span>
<span class="sd"> If ``list_values=False`` then the value is only quoted if it contains</span>
<span class="sd"> a ``\\n`` (is multiline) or &#39;#&#39;.</span>
<span class="sd"> </span>
<span class="sd"> If ``write_empty_values`` is set, and the value is an empty string, it</span>
<span class="sd"> won&#39;t be quoted.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">multiline</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_empty_values</span> <span class="ow">and</span> <span class="n">value</span> <span class="o">==</span> <span class="s">&#39;&#39;</span><span class="p">:</span>
<span class="c"># Only if multiline is set, so that it is used for values not</span>
<span class="c"># keys, and not values that are part of a list</span>
<span class="k">return</span> <span class="s">&#39;&#39;</span>
<span class="k">if</span> <span class="n">multiline</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">value</span><span class="p">:</span>
<span class="k">return</span> <span class="s">&#39;,&#39;</span>
<span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">value</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">multiline</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span> <span class="o">+</span> <span class="s">&#39;,&#39;</span>
<span class="k">return</span> <span class="s">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">multiline</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">value</span><span class="p">])</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">basestring</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">stringify</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s">&#39;Value &quot;</span><span class="si">%s</span><span class="s">&quot; is not a string.&#39;</span> <span class="o">%</span> <span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">value</span><span class="p">:</span>
<span class="k">return</span> <span class="s">&#39;&quot;&quot;&#39;</span>
<span class="n">no_lists_no_quotes</span> <span class="o">=</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">list_values</span> <span class="ow">and</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">value</span> <span class="ow">and</span> <span class="s">&#39;#&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">value</span>
<span class="n">need_triple</span> <span class="o">=</span> <span class="n">multiline</span> <span class="ow">and</span> <span class="p">(((</span><span class="s">&quot;&#39;&quot;</span> <span class="ow">in</span> <span class="n">value</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="s">&#39;&quot;&#39;</span> <span class="ow">in</span> <span class="n">value</span><span class="p">))</span> <span class="ow">or</span> <span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span> <span class="ow">in</span> <span class="n">value</span> <span class="p">))</span>
<span class="n">hash_triple_quote</span> <span class="o">=</span> <span class="n">multiline</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">need_triple</span> <span class="ow">and</span> <span class="p">(</span><span class="s">&quot;&#39;&quot;</span> <span class="ow">in</span> <span class="n">value</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="s">&#39;&quot;&#39;</span> <span class="ow">in</span> <span class="n">value</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="s">&#39;#&#39;</span> <span class="ow">in</span> <span class="n">value</span><span class="p">)</span>
<span class="n">check_for_single</span> <span class="o">=</span> <span class="p">(</span><span class="n">no_lists_no_quotes</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">need_triple</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">hash_triple_quote</span>
<span class="k">if</span> <span class="n">check_for_single</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">list_values</span><span class="p">:</span>
<span class="c"># we don&#39;t quote if ``list_values=False``</span>
<span class="n">quot</span> <span class="o">=</span> <span class="n">noquot</span>
<span class="c"># for normal values either single or double quotes will do</span>
<span class="k">elif</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
<span class="c"># will only happen if multiline is off - e.g. &#39;\n&#39; in key</span>
<span class="k">raise</span> <span class="n">ConfigObjError</span><span class="p">(</span><span class="s">&#39;Value &quot;</span><span class="si">%s</span><span class="s">&quot; cannot be safely quoted.&#39;</span> <span class="o">%</span> <span class="n">value</span><span class="p">)</span>
<span class="k">elif</span> <span class="p">((</span><span class="n">value</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">wspace_plus</span><span class="p">)</span> <span class="ow">and</span>
<span class="p">(</span><span class="n">value</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">wspace_plus</span><span class="p">)</span> <span class="ow">and</span>
<span class="p">(</span><span class="s">&#39;,&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">value</span><span class="p">)):</span>
<span class="n">quot</span> <span class="o">=</span> <span class="n">noquot</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">quot</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_single_quote</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c"># if value has &#39;\n&#39; or &quot;&#39;&quot; *and* &#39;&quot;&#39;, it will need triple quotes</span>
<span class="n">quot</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_triple_quote</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">quot</span> <span class="o">==</span> <span class="n">noquot</span> <span class="ow">and</span> <span class="s">&#39;#&#39;</span> <span class="ow">in</span> <span class="n">value</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">list_values</span><span class="p">:</span>
<span class="n">quot</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_single_quote</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="n">quot</span> <span class="o">%</span> <span class="n">value</span>
</div>
<div class="viewcode-block" id="ConfigObj._get_single_quote"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj._get_single_quote">[docs]</a> <span class="k">def</span> <span class="nf">_get_single_quote</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="k">if</span> <span class="p">(</span><span class="s">&quot;&#39;&quot;</span> <span class="ow">in</span> <span class="n">value</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="s">&#39;&quot;&#39;</span> <span class="ow">in</span> <span class="n">value</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">ConfigObjError</span><span class="p">(</span><span class="s">&#39;Value &quot;</span><span class="si">%s</span><span class="s">&quot; cannot be safely quoted.&#39;</span> <span class="o">%</span> <span class="n">value</span><span class="p">)</span>
<span class="k">elif</span> <span class="s">&#39;&quot;&#39;</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
<span class="n">quot</span> <span class="o">=</span> <span class="n">squot</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">quot</span> <span class="o">=</span> <span class="n">dquot</span>
<span class="k">return</span> <span class="n">quot</span>
</div>
<div class="viewcode-block" id="ConfigObj._get_triple_quote"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj._get_triple_quote">[docs]</a> <span class="k">def</span> <span class="nf">_get_triple_quote</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="k">if</span> <span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&#39;&quot;&quot;&quot;&#39;</span><span class="p">)</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&quot;&#39;&#39;&#39;&quot;</span><span class="p">)</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">ConfigObjError</span><span class="p">(</span><span class="s">&#39;Value &quot;</span><span class="si">%s</span><span class="s">&quot; cannot be safely quoted.&#39;</span> <span class="o">%</span> <span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&#39;&quot;&quot;&quot;&#39;</span><span class="p">)</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
<span class="n">quot</span> <span class="o">=</span> <span class="n">tdquot</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">quot</span> <span class="o">=</span> <span class="n">tsquot</span>
<span class="k">return</span> <span class="n">quot</span>
</div>
<div class="viewcode-block" id="ConfigObj._handle_value"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj._handle_value">[docs]</a> <span class="k">def</span> <span class="nf">_handle_value</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Given a value string, unquote, remove comment,</span>
<span class="sd"> handle lists. (including empty and single member lists)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_inspec</span><span class="p">:</span>
<span class="c"># Parsing a configspec so don&#39;t handle comments</span>
<span class="k">return</span> <span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">)</span>
<span class="c"># do we look for lists in values ?</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">list_values</span><span class="p">:</span>
<span class="n">mat</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_nolistvalue</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">mat</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">SyntaxError</span><span class="p">()</span>
<span class="c"># NOTE: we don&#39;t unquote here</span>
<span class="k">return</span> <span class="n">mat</span><span class="o">.</span><span class="n">groups</span><span class="p">()</span>
<span class="c">#</span>
<span class="n">mat</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_valueexp</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">mat</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="c"># the value is badly constructed, probably badly quoted,</span>
<span class="c"># or an invalid list</span>
<span class="k">raise</span> <span class="ne">SyntaxError</span><span class="p">()</span>
<span class="p">(</span><span class="n">list_values</span><span class="p">,</span> <span class="n">single</span><span class="p">,</span> <span class="n">empty_list</span><span class="p">,</span> <span class="n">comment</span><span class="p">)</span> <span class="o">=</span> <span class="n">mat</span><span class="o">.</span><span class="n">groups</span><span class="p">()</span>
<span class="k">if</span> <span class="p">(</span><span class="n">list_values</span> <span class="o">==</span> <span class="s">&#39;&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">single</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">):</span>
<span class="c"># change this if you want to accept empty values</span>
<span class="k">raise</span> <span class="ne">SyntaxError</span><span class="p">()</span>
<span class="c"># NOTE: note there is no error handling from here if the regex</span>
<span class="c"># is wrong: then incorrect values will slip through</span>
<span class="k">if</span> <span class="n">empty_list</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="c"># the single comma - meaning an empty list</span>
<span class="k">return</span> <span class="p">([],</span> <span class="n">comment</span><span class="p">)</span>
<span class="k">if</span> <span class="n">single</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="c"># handle empty values</span>
<span class="k">if</span> <span class="n">list_values</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">single</span><span class="p">:</span>
<span class="c"># FIXME: the &#39;&#39; is a workaround because our regex now matches</span>
<span class="c"># &#39;&#39; at the end of a list if it has a trailing comma</span>
<span class="n">single</span> <span class="o">=</span> <span class="bp">None</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">single</span> <span class="o">=</span> <span class="n">single</span> <span class="ow">or</span> <span class="s">&#39;&quot;&quot;&#39;</span>
<span class="n">single</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_unquote</span><span class="p">(</span><span class="n">single</span><span class="p">)</span>
<span class="k">if</span> <span class="n">list_values</span> <span class="o">==</span> <span class="s">&#39;&#39;</span><span class="p">:</span>
<span class="c"># not a list value</span>
<span class="k">return</span> <span class="p">(</span><span class="n">single</span><span class="p">,</span> <span class="n">comment</span><span class="p">)</span>
<span class="n">the_list</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_listvalueexp</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">list_values</span><span class="p">)</span>
<span class="n">the_list</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_unquote</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">the_list</span><span class="p">]</span>
<span class="k">if</span> <span class="n">single</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">the_list</span> <span class="o">+=</span> <span class="p">[</span><span class="n">single</span><span class="p">]</span>
<span class="k">return</span> <span class="p">(</span><span class="n">the_list</span><span class="p">,</span> <span class="n">comment</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="ConfigObj._multiline"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj._multiline">[docs]</a> <span class="k">def</span> <span class="nf">_multiline</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">infile</span><span class="p">,</span> <span class="n">cur_index</span><span class="p">,</span> <span class="n">maxline</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Extract the value, where we are in a multiline situation.&quot;&quot;&quot;</span>
<span class="n">quot</span> <span class="o">=</span> <span class="n">value</span><span class="p">[:</span><span class="mi">3</span><span class="p">]</span>
<span class="n">newvalue</span> <span class="o">=</span> <span class="n">value</span><span class="p">[</span><span class="mi">3</span><span class="p">:]</span>
<span class="n">single_line</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_triple_quote</span><span class="p">[</span><span class="n">quot</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="n">multi_line</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_triple_quote</span><span class="p">[</span><span class="n">quot</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span>
<span class="n">mat</span> <span class="o">=</span> <span class="n">single_line</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">mat</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">retval</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">mat</span><span class="o">.</span><span class="n">groups</span><span class="p">())</span>
<span class="n">retval</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cur_index</span><span class="p">)</span>
<span class="k">return</span> <span class="n">retval</span>
<span class="k">elif</span> <span class="n">newvalue</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">quot</span><span class="p">)</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
<span class="c"># somehow the triple quote is missing</span>
<span class="k">raise</span> <span class="ne">SyntaxError</span><span class="p">()</span>
<span class="c">#</span>
<span class="k">while</span> <span class="n">cur_index</span> <span class="o">&lt;</span> <span class="n">maxline</span><span class="p">:</span>
<span class="n">cur_index</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">newvalue</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">infile</span><span class="p">[</span><span class="n">cur_index</span><span class="p">]</span>
<span class="k">if</span> <span class="n">line</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">quot</span><span class="p">)</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
<span class="n">newvalue</span> <span class="o">+=</span> <span class="n">line</span>
<span class="k">else</span><span class="p">:</span>
<span class="c"># end of multiline, process it</span>
<span class="k">break</span>
<span class="k">else</span><span class="p">:</span>
<span class="c"># we&#39;ve got to the end of the config, oops...</span>
<span class="k">raise</span> <span class="ne">SyntaxError</span><span class="p">()</span>
<span class="n">mat</span> <span class="o">=</span> <span class="n">multi_line</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
<span class="k">if</span> <span class="n">mat</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="c"># a badly formed line</span>
<span class="k">raise</span> <span class="ne">SyntaxError</span><span class="p">()</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="o">=</span> <span class="n">mat</span><span class="o">.</span><span class="n">groups</span><span class="p">()</span>
<span class="k">return</span> <span class="p">(</span><span class="n">newvalue</span> <span class="o">+</span> <span class="n">value</span><span class="p">,</span> <span class="n">comment</span><span class="p">,</span> <span class="n">cur_index</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="ConfigObj._handle_configspec"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj._handle_configspec">[docs]</a> <span class="k">def</span> <span class="nf">_handle_configspec</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">configspec</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Parse the configspec.&quot;&quot;&quot;</span>
<span class="c"># FIXME: Should we check that the configspec was created with the </span>
<span class="c"># correct settings ? (i.e. ``list_values=False``)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">configspec</span><span class="p">,</span> <span class="n">ConfigObj</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">configspec</span> <span class="o">=</span> <span class="n">ConfigObj</span><span class="p">(</span><span class="n">configspec</span><span class="p">,</span>
<span class="n">raise_errors</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
<span class="n">file_error</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
<span class="n">_inspec</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="k">except</span> <span class="n">ConfigObjError</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span>
<span class="c"># FIXME: Should these errors have a reference</span>
<span class="c"># to the already parsed ConfigObj ?</span>
<span class="k">raise</span> <span class="n">ConfigspecError</span><span class="p">(</span><span class="s">&#39;Parsing configspec failed: </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">e</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">IOError</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">IOError</span><span class="p">(</span><span class="s">&#39;Reading configspec failed: </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">e</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">configspec</span> <span class="o">=</span> <span class="n">configspec</span>
</div>
<div class="viewcode-block" id="ConfigObj._set_configspec"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj._set_configspec">[docs]</a> <span class="k">def</span> <span class="nf">_set_configspec</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">section</span><span class="p">,</span> <span class="n">copy</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Called by validate. Handles setting the configspec on subsections</span>
<span class="sd"> including sections to be validated by __many__</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">configspec</span> <span class="o">=</span> <span class="n">section</span><span class="o">.</span><span class="n">configspec</span>
<span class="n">many</span> <span class="o">=</span> <span class="n">configspec</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;__many__&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">many</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">section</span><span class="o">.</span><span class="n">sections</span><span class="p">:</span>
<span class="k">if</span> <span class="n">entry</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">configspec</span><span class="p">:</span>
<span class="n">section</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span><span class="o">.</span><span class="n">configspec</span> <span class="o">=</span> <span class="n">many</span>
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">configspec</span><span class="o">.</span><span class="n">sections</span><span class="p">:</span>
<span class="k">if</span> <span class="n">entry</span> <span class="o">==</span> <span class="s">&#39;__many__&#39;</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="n">entry</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">section</span><span class="p">:</span>
<span class="n">section</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">section</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span><span class="o">.</span><span class="n">_created</span> <span class="o">=</span> <span class="bp">True</span>
<span class="k">if</span> <span class="n">copy</span><span class="p">:</span>
<span class="c"># copy comments</span>
<span class="n">section</span><span class="o">.</span><span class="n">comments</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="n">configspec</span><span class="o">.</span><span class="n">comments</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="p">[])</span>
<span class="n">section</span><span class="o">.</span><span class="n">inline_comments</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="n">configspec</span><span class="o">.</span><span class="n">inline_comments</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">)</span>
<span class="c"># Could be a scalar when we expect a section</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">section</span><span class="p">[</span><span class="n">entry</span><span class="p">],</span> <span class="n">Section</span><span class="p">):</span>
<span class="n">section</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span><span class="o">.</span><span class="n">configspec</span> <span class="o">=</span> <span class="n">configspec</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span>
</div>
<div class="viewcode-block" id="ConfigObj._write_line"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj._write_line">[docs]</a> <span class="k">def</span> <span class="nf">_write_line</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">indent_string</span><span class="p">,</span> <span class="n">entry</span><span class="p">,</span> <span class="n">this_entry</span><span class="p">,</span> <span class="n">comment</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Write an individual line, for the write method&quot;&quot;&quot;</span>
<span class="c"># NOTE: the calls to self._quote here handles non-StringType values.</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">unrepr</span><span class="p">:</span>
<span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_decode_element</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">this_entry</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">val</span> <span class="o">=</span> <span class="nb">repr</span><span class="p">(</span><span class="n">this_entry</span><span class="p">)</span>
<span class="k">return</span> <span class="s">&#39;</span><span class="si">%s%s%s%s%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">indent_string</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_decode_element</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="n">multiline</span><span class="o">=</span><span class="bp">False</span><span class="p">)),</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_a_to_u</span><span class="p">(</span><span class="s">&#39; = &#39;</span><span class="p">),</span>
<span class="n">val</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_decode_element</span><span class="p">(</span><span class="n">comment</span><span class="p">))</span>
</div>
<div class="viewcode-block" id="ConfigObj._write_marker"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj._write_marker">[docs]</a> <span class="k">def</span> <span class="nf">_write_marker</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">indent_string</span><span class="p">,</span> <span class="n">depth</span><span class="p">,</span> <span class="n">entry</span><span class="p">,</span> <span class="n">comment</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Write a section marker line&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="s">&#39;</span><span class="si">%s%s%s%s%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">indent_string</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_a_to_u</span><span class="p">(</span><span class="s">&#39;[&#39;</span> <span class="o">*</span> <span class="n">depth</span><span class="p">),</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_decode_element</span><span class="p">(</span><span class="n">entry</span><span class="p">),</span> <span class="n">multiline</span><span class="o">=</span><span class="bp">False</span><span class="p">),</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_a_to_u</span><span class="p">(</span><span class="s">&#39;]&#39;</span> <span class="o">*</span> <span class="n">depth</span><span class="p">),</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_decode_element</span><span class="p">(</span><span class="n">comment</span><span class="p">))</span>
</div>
<div class="viewcode-block" id="ConfigObj._handle_comment"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj._handle_comment">[docs]</a> <span class="k">def</span> <span class="nf">_handle_comment</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">comment</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Deal with a comment.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">comment</span><span class="p">:</span>
<span class="k">return</span> <span class="s">&#39;&#39;</span>
<span class="n">start</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">indent_type</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">comment</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&#39;#&#39;</span><span class="p">):</span>
<span class="n">start</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_a_to_u</span><span class="p">(</span><span class="s">&#39; # &#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="p">(</span><span class="n">start</span> <span class="o">+</span> <span class="n">comment</span><span class="p">)</span>
<span class="c"># Public methods</span>
</div>
<div class="viewcode-block" id="ConfigObj.write"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj.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">outfile</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">section</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Write the current ConfigObj as a file</span>
<span class="sd"> </span>
<span class="sd"> tekNico: FIXME: use StringIO instead of real files</span>
<span class="sd"> </span>
<span class="sd"> &gt;&gt;&gt; filename = a.filename</span>
<span class="sd"> &gt;&gt;&gt; a.filename = &#39;test.ini&#39;</span>
<span class="sd"> &gt;&gt;&gt; a.write()</span>
<span class="sd"> &gt;&gt;&gt; a.filename = filename</span>
<span class="sd"> &gt;&gt;&gt; a == ConfigObj(&#39;test.ini&#39;, raise_errors=True)</span>
<span class="sd"> 1</span>
<span class="sd"> &gt;&gt;&gt; import os</span>
<span class="sd"> &gt;&gt;&gt; os.remove(&#39;test.ini&#39;)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">indent_type</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="c"># this can be true if initialised from a dictionary</span>
<span class="bp">self</span><span class="o">.</span><span class="n">indent_type</span> <span class="o">=</span> <span class="n">DEFAULT_INDENT_TYPE</span>
<span class="n">out</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">cs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_a_to_u</span><span class="p">(</span><span class="s">&#39;#&#39;</span><span class="p">)</span>
<span class="n">csp</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_a_to_u</span><span class="p">(</span><span class="s">&#39;# &#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">section</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">int_val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">interpolation</span>
<span class="bp">self</span><span class="o">.</span><span class="n">interpolation</span> <span class="o">=</span> <span class="bp">False</span>
<span class="n">section</span> <span class="o">=</span> <span class="bp">self</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">initial_comment</span><span class="p">:</span>
<span class="n">line</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_decode_element</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
<span class="n">stripped_line</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="k">if</span> <span class="n">stripped_line</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">stripped_line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">cs</span><span class="p">):</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">csp</span> <span class="o">+</span> <span class="n">line</span>
<span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
<span class="n">indent_string</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">indent_type</span> <span class="o">*</span> <span class="n">section</span><span class="o">.</span><span class="n">depth</span>
<span class="c"># Do a little sorting for convenience</span>
<span class="n">section</span><span class="o">.</span><span class="n">scalars</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">section</span><span class="o">.</span><span class="n">scalars</span><span class="p">)</span>
<span class="n">section</span><span class="o">.</span><span class="n">sections</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">section</span><span class="o">.</span><span class="n">sections</span><span class="p">)</span>
<span class="k">if</span> <span class="s">&#39;default&#39;</span> <span class="ow">in</span> <span class="n">section</span><span class="o">.</span><span class="n">scalars</span><span class="p">:</span>
<span class="c"># pop it and move to front</span>
<span class="n">section</span><span class="o">.</span><span class="n">scalars</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="s">&#39;default&#39;</span><span class="p">)</span>
<span class="n">section</span><span class="o">.</span><span class="n">scalars</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="s">&#39;default&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="s">&#39;default&#39;</span> <span class="ow">in</span> <span class="n">section</span><span class="o">.</span><span class="n">sections</span><span class="p">:</span>
<span class="n">section</span><span class="o">.</span><span class="n">sections</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="s">&#39;default&#39;</span><span class="p">)</span>
<span class="n">section</span><span class="o">.</span><span class="n">sections</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="s">&#39;default&#39;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="p">(</span><span class="n">section</span><span class="o">.</span><span class="n">scalars</span> <span class="o">+</span> <span class="n">section</span><span class="o">.</span><span class="n">sections</span><span class="p">):</span>
<span class="k">if</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">section</span><span class="o">.</span><span class="n">defaults</span><span class="p">:</span>
<span class="c"># don&#39;t write out default values</span>
<span class="k">continue</span>
<span class="k">for</span> <span class="n">comment_line</span> <span class="ow">in</span> <span class="n">section</span><span class="o">.</span><span class="n">comments</span><span class="p">[</span><span class="n">entry</span><span class="p">]:</span>
<span class="n">comment_line</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_decode_element</span><span class="p">(</span><span class="n">comment_line</span><span class="o">.</span><span class="n">lstrip</span><span class="p">())</span>
<span class="k">if</span> <span class="n">comment_line</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">comment_line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">cs</span><span class="p">):</span>
<span class="n">comment_line</span> <span class="o">=</span> <span class="n">csp</span> <span class="o">+</span> <span class="n">comment_line</span>
<span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">indent_string</span> <span class="o">+</span> <span class="n">comment_line</span><span class="p">)</span>
<span class="n">this_entry</span> <span class="o">=</span> <span class="n">section</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span>
<span class="n">comment</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handle_comment</span><span class="p">(</span><span class="n">section</span><span class="o">.</span><span class="n">inline_comments</span><span class="p">[</span><span class="n">entry</span><span class="p">])</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">this_entry</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
<span class="c"># a section</span>
<span class="n">out</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">_write_marker</span><span class="p">(</span>
<span class="n">indent_string</span><span class="p">,</span>
<span class="n">this_entry</span><span class="o">.</span><span class="n">depth</span><span class="p">,</span>
<span class="n">entry</span><span class="p">,</span>
<span class="n">comment</span><span class="p">))</span>
<span class="n">out</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">section</span><span class="o">=</span><span class="n">this_entry</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">out</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">_write_line</span><span class="p">(</span>
<span class="n">indent_string</span><span class="p">,</span>
<span class="n">entry</span><span class="p">,</span>
<span class="n">this_entry</span><span class="p">,</span>
<span class="n">comment</span><span class="p">))</span>
<span class="k">if</span> <span class="n">section</span> <span class="ow">is</span> <span class="bp">self</span><span class="p">:</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">final_comment</span><span class="p">:</span>
<span class="n">line</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_decode_element</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
<span class="n">stripped_line</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="k">if</span> <span class="n">stripped_line</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">stripped_line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">cs</span><span class="p">):</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">csp</span> <span class="o">+</span> <span class="n">line</span>
<span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">interpolation</span> <span class="o">=</span> <span class="n">int_val</span>
<span class="k">if</span> <span class="n">section</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">self</span><span class="p">:</span>
<span class="k">return</span> <span class="n">out</span>
<span class="k">if</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">outfile</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">):</span>
<span class="c"># output a list of lines</span>
<span class="c"># might need to encode</span>
<span class="c"># NOTE: This will *screw* UTF16, each line will start with the BOM</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">:</span>
<span class="n">out</span> <span class="o">=</span> <span class="p">[</span><span class="n">l</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">)</span> <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">out</span><span class="p">]</span>
<span class="k">if</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">BOM</span> <span class="ow">and</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> <span class="ow">or</span>
<span class="p">(</span><span class="n">BOM_LIST</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="o">.</span><span class="n">lower</span><span class="p">())</span> <span class="o">==</span> <span class="s">&#39;utf_8&#39;</span><span class="p">))):</span>
<span class="c"># Add the UTF8 BOM</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">out</span><span class="p">:</span>
<span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">&#39;&#39;</span><span class="p">)</span>
<span class="n">out</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">BOM_UTF8</span> <span class="o">+</span> <span class="n">out</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">return</span> <span class="n">out</span>
<span class="c"># Turn the list to a string, joined with correct newlines</span>
<span class="n">newline</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">newlines</span> <span class="ow">or</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">outfile</span><span class="p">,</span> <span class="s">&#39;mode&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">outfile</span><span class="o">.</span><span class="n">mode</span> <span class="o">==</span> <span class="s">&#39;w&#39;</span>
<span class="ow">and</span> <span class="n">sys</span><span class="o">.</span><span class="n">platform</span> <span class="o">==</span> <span class="s">&#39;win32&#39;</span> <span class="ow">and</span> <span class="n">newline</span> <span class="o">==</span> <span class="s">&#39;</span><span class="se">\r\n</span><span class="s">&#39;</span><span class="p">):</span>
<span class="c"># Windows specific hack to avoid writing &#39;\r\r\n&#39;</span>
<span class="n">newline</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span>
<span class="n">output</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_a_to_u</span><span class="p">(</span><span class="n">newline</span><span class="p">)</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">:</span>
<span class="n">output</span> <span class="o">=</span> <span class="n">output</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">BOM</span> <span class="ow">and</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> <span class="ow">or</span> <span class="n">match_utf8</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">)):</span>
<span class="c"># Add the UTF8 BOM</span>
<span class="n">output</span> <span class="o">=</span> <span class="n">BOM_UTF8</span> <span class="o">+</span> <span class="n">output</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">output</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="n">newline</span><span class="p">):</span>
<span class="n">output</span> <span class="o">+=</span> <span class="n">newline</span>
<span class="k">if</span> <span class="n">outfile</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">outfile</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">output</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">h</span> <span class="o">=</span> <span class="nb">open</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="s">&#39;wb&#39;</span><span class="p">)</span>
<span class="n">h</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">output</span><span class="p">)</span>
<span class="n">h</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</div>
<div class="viewcode-block" id="ConfigObj.validate"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj.validate">[docs]</a> <span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">validator</span><span class="p">,</span> <span class="n">preserve_errors</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
<span class="n">section</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test the ConfigObj against a configspec.</span>
<span class="sd"> </span>
<span class="sd"> It uses the ``validator`` object from *validate.py*.</span>
<span class="sd"> </span>
<span class="sd"> To run ``validate`` on the current ConfigObj, call: ::</span>
<span class="sd"> </span>
<span class="sd"> test = config.validate(validator)</span>
<span class="sd"> </span>
<span class="sd"> (Normally having previously passed in the configspec when the ConfigObj</span>
<span class="sd"> was created - you can dynamically assign a dictionary of checks to the</span>
<span class="sd"> ``configspec`` attribute of a section though).</span>
<span class="sd"> </span>
<span class="sd"> It returns ``True`` if everything passes, or a dictionary of</span>
<span class="sd"> pass/fails (True/False). If every member of a subsection passes, it</span>
<span class="sd"> will just have the value ``True``. (It also returns ``False`` if all</span>
<span class="sd"> members fail).</span>
<span class="sd"> </span>
<span class="sd"> In addition, it converts the values from strings to their native</span>
<span class="sd"> types if their checks pass (and ``stringify`` is set).</span>
<span class="sd"> </span>
<span class="sd"> If ``preserve_errors`` is ``True`` (``False`` is default) then instead</span>
<span class="sd"> of a marking a fail with a ``False``, it will preserve the actual</span>
<span class="sd"> exception object. This can contain info about the reason for failure.</span>
<span class="sd"> For example the ``VdtValueTooSmallError`` indicates that the value</span>
<span class="sd"> supplied was too small. If a value (or section) is missing it will</span>
<span class="sd"> still be marked as ``False``.</span>
<span class="sd"> </span>
<span class="sd"> You must have the validate module to use ``preserve_errors=True``.</span>
<span class="sd"> </span>
<span class="sd"> You can then use the ``flatten_errors`` function to turn your nested</span>
<span class="sd"> results dictionary into a flattened list of failures - useful for</span>
<span class="sd"> displaying meaningful error messages.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">section</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">configspec</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">&#39;No configspec supplied.&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">preserve_errors</span><span class="p">:</span>
<span class="c"># We do this once to remove a top level dependency on the validate module</span>
<span class="c"># Which makes importing configobj faster</span>
<span class="kn">from</span> <span class="nn">validate</span> <span class="kn">import</span> <span class="n">VdtMissingValue</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_vdtMissingValue</span> <span class="o">=</span> <span class="n">VdtMissingValue</span>
<span class="n">section</span> <span class="o">=</span> <span class="bp">self</span>
<span class="k">if</span> <span class="n">copy</span><span class="p">:</span>
<span class="n">section</span><span class="o">.</span><span class="n">initial_comment</span> <span class="o">=</span> <span class="n">section</span><span class="o">.</span><span class="n">configspec</span><span class="o">.</span><span class="n">initial_comment</span>
<span class="n">section</span><span class="o">.</span><span class="n">final_comment</span> <span class="o">=</span> <span class="n">section</span><span class="o">.</span><span class="n">configspec</span><span class="o">.</span><span class="n">final_comment</span>
<span class="n">section</span><span class="o">.</span><span class="n">encoding</span> <span class="o">=</span> <span class="n">section</span><span class="o">.</span><span class="n">configspec</span><span class="o">.</span><span class="n">encoding</span>
<span class="n">section</span><span class="o">.</span><span class="n">BOM</span> <span class="o">=</span> <span class="n">section</span><span class="o">.</span><span class="n">configspec</span><span class="o">.</span><span class="n">BOM</span>
<span class="n">section</span><span class="o">.</span><span class="n">newlines</span> <span class="o">=</span> <span class="n">section</span><span class="o">.</span><span class="n">configspec</span><span class="o">.</span><span class="n">newlines</span>
<span class="n">section</span><span class="o">.</span><span class="n">indent_type</span> <span class="o">=</span> <span class="n">section</span><span class="o">.</span><span class="n">configspec</span><span class="o">.</span><span class="n">indent_type</span>
<span class="c">#</span>
<span class="c"># section.default_values.clear() #??</span>
<span class="n">configspec</span> <span class="o">=</span> <span class="n">section</span><span class="o">.</span><span class="n">configspec</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_set_configspec</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">copy</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">validate_entry</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="n">spec</span><span class="p">,</span> <span class="n">val</span><span class="p">,</span> <span class="n">missing</span><span class="p">,</span> <span class="n">ret_true</span><span class="p">,</span> <span class="n">ret_false</span><span class="p">):</span>
<span class="n">section</span><span class="o">.</span><span class="n">default_values</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">section</span><span class="o">.</span><span class="n">default_values</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="n">validator</span><span class="o">.</span><span class="n">get_default_value</span><span class="p">(</span><span class="n">configspec</span><span class="p">[</span><span class="n">entry</span><span class="p">])</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">KeyError</span><span class="p">,</span> <span class="ne">AttributeError</span><span class="p">,</span> <span class="n">validator</span><span class="o">.</span><span class="n">baseErrorClass</span><span class="p">):</span>
<span class="c"># No default, bad default or validator has no &#39;get_default_value&#39;</span>
<span class="c"># (e.g. SimpleVal)</span>
<span class="k">pass</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">check</span> <span class="o">=</span> <span class="n">validator</span><span class="o">.</span><span class="n">check</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span>
<span class="n">val</span><span class="p">,</span>
<span class="n">missing</span><span class="o">=</span><span class="n">missing</span>
<span class="p">)</span>
<span class="k">except</span> <span class="n">validator</span><span class="o">.</span><span class="n">baseErrorClass</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">preserve_errors</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_vdtMissingValue</span><span class="p">):</span>
<span class="n">out</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="bp">False</span>
<span class="k">else</span><span class="p">:</span>
<span class="c"># preserve the error</span>
<span class="n">out</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="n">e</span>
<span class="n">ret_false</span> <span class="o">=</span> <span class="bp">False</span>
<span class="n">ret_true</span> <span class="o">=</span> <span class="bp">False</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">ret_false</span> <span class="o">=</span> <span class="bp">False</span>
<span class="n">out</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">stringify</span> <span class="ow">or</span> <span class="n">missing</span><span class="p">:</span>
<span class="c"># if we are doing type conversion</span>
<span class="c"># or the value is a supplied default</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">stringify</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">check</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span>
<span class="c"># preserve lists</span>
<span class="n">check</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_str</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">check</span><span class="p">]</span>
<span class="k">elif</span> <span class="n">missing</span> <span class="ow">and</span> <span class="n">check</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="c"># convert the None from a default to a &#39;&#39;</span>
<span class="n">check</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">check</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_str</span><span class="p">(</span><span class="n">check</span><span class="p">)</span>
<span class="k">if</span> <span class="p">(</span><span class="n">check</span> <span class="o">!=</span> <span class="n">val</span><span class="p">)</span> <span class="ow">or</span> <span class="n">missing</span><span class="p">:</span>
<span class="n">section</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="n">check</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">copy</span> <span class="ow">and</span> <span class="n">missing</span> <span class="ow">and</span> <span class="n">entry</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">section</span><span class="o">.</span><span class="n">defaults</span><span class="p">:</span>
<span class="n">section</span><span class="o">.</span><span class="n">defaults</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">entry</span><span class="p">)</span>
<span class="k">return</span> <span class="n">ret_true</span><span class="p">,</span> <span class="n">ret_false</span>
<span class="c">#</span>
<span class="n">out</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">ret_true</span> <span class="o">=</span> <span class="bp">True</span>
<span class="n">ret_false</span> <span class="o">=</span> <span class="bp">True</span>
<span class="n">unvalidated</span> <span class="o">=</span> <span class="p">[</span><span class="n">k</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">section</span><span class="o">.</span><span class="n">scalars</span> <span class="k">if</span> <span class="n">k</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">configspec</span><span class="p">]</span>
<span class="n">incorrect_sections</span> <span class="o">=</span> <span class="p">[</span><span class="n">k</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">configspec</span><span class="o">.</span><span class="n">sections</span> <span class="k">if</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">section</span><span class="o">.</span><span class="n">scalars</span><span class="p">]</span>
<span class="n">incorrect_scalars</span> <span class="o">=</span> <span class="p">[</span><span class="n">k</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">configspec</span><span class="o">.</span><span class="n">scalars</span> <span class="k">if</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">section</span><span class="o">.</span><span class="n">sections</span><span class="p">]</span>
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">configspec</span><span class="o">.</span><span class="n">scalars</span><span class="p">:</span>
<span class="k">if</span> <span class="n">entry</span> <span class="ow">in</span> <span class="p">(</span><span class="s">&#39;__many__&#39;</span><span class="p">,</span> <span class="s">&#39;___many___&#39;</span><span class="p">):</span>
<span class="c"># reserved names</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="p">(</span><span class="ow">not</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">section</span><span class="o">.</span><span class="n">scalars</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">entry</span> <span class="ow">in</span> <span class="n">section</span><span class="o">.</span><span class="n">defaults</span><span class="p">):</span>
<span class="c"># missing entries</span>
<span class="c"># or entries from defaults</span>
<span class="n">missing</span> <span class="o">=</span> <span class="bp">True</span>
<span class="n">val</span> <span class="o">=</span> <span class="bp">None</span>
<span class="k">if</span> <span class="n">copy</span> <span class="ow">and</span> <span class="n">entry</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">section</span><span class="o">.</span><span class="n">scalars</span><span class="p">:</span>
<span class="c"># copy comments</span>
<span class="n">section</span><span class="o">.</span><span class="n">comments</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">configspec</span><span class="o">.</span><span class="n">comments</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="p">[]))</span>
<span class="n">section</span><span class="o">.</span><span class="n">inline_comments</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">configspec</span><span class="o">.</span><span class="n">inline_comments</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">))</span>
<span class="c">#</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">missing</span> <span class="o">=</span> <span class="bp">False</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">section</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span>
<span class="n">ret_true</span><span class="p">,</span> <span class="n">ret_false</span> <span class="o">=</span> <span class="n">validate_entry</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="n">configspec</span><span class="p">[</span><span class="n">entry</span><span class="p">],</span> <span class="n">val</span><span class="p">,</span>
<span class="n">missing</span><span class="p">,</span> <span class="n">ret_true</span><span class="p">,</span> <span class="n">ret_false</span><span class="p">)</span>
<span class="n">many</span> <span class="o">=</span> <span class="bp">None</span>
<span class="k">if</span> <span class="s">&#39;__many__&#39;</span> <span class="ow">in</span> <span class="n">configspec</span><span class="o">.</span><span class="n">scalars</span><span class="p">:</span>
<span class="n">many</span> <span class="o">=</span> <span class="n">configspec</span><span class="p">[</span><span class="s">&#39;__many__&#39;</span><span class="p">]</span>
<span class="k">elif</span> <span class="s">&#39;___many___&#39;</span> <span class="ow">in</span> <span class="n">configspec</span><span class="o">.</span><span class="n">scalars</span><span class="p">:</span>
<span class="n">many</span> <span class="o">=</span> <span class="n">configspec</span><span class="p">[</span><span class="s">&#39;___many___&#39;</span><span class="p">]</span>
<span class="k">if</span> <span class="n">many</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">unvalidated</span><span class="p">:</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">section</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span>
<span class="n">ret_true</span><span class="p">,</span> <span class="n">ret_false</span> <span class="o">=</span> <span class="n">validate_entry</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="n">many</span><span class="p">,</span> <span class="n">val</span><span class="p">,</span> <span class="bp">False</span><span class="p">,</span>
<span class="n">ret_true</span><span class="p">,</span> <span class="n">ret_false</span><span class="p">)</span>
<span class="n">unvalidated</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">incorrect_scalars</span><span class="p">:</span>
<span class="n">ret_true</span> <span class="o">=</span> <span class="bp">False</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">preserve_errors</span><span class="p">:</span>
<span class="n">out</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="bp">False</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">ret_false</span> <span class="o">=</span> <span class="bp">False</span>
<span class="n">msg</span> <span class="o">=</span> <span class="s">&#39;Value </span><span class="si">%r</span><span class="s"> was provided as a section&#39;</span> <span class="o">%</span> <span class="n">entry</span>
<span class="n">out</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="n">validator</span><span class="o">.</span><span class="n">baseErrorClass</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">incorrect_sections</span><span class="p">:</span>
<span class="n">ret_true</span> <span class="o">=</span> <span class="bp">False</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">preserve_errors</span><span class="p">:</span>
<span class="n">out</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="bp">False</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">ret_false</span> <span class="o">=</span> <span class="bp">False</span>
<span class="n">msg</span> <span class="o">=</span> <span class="s">&#39;Section </span><span class="si">%r</span><span class="s"> was provided as a single value&#39;</span> <span class="o">%</span> <span class="n">entry</span>
<span class="n">out</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="n">validator</span><span class="o">.</span><span class="n">baseErrorClass</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="c"># Missing sections will have been created as empty ones when the</span>
<span class="c"># configspec was read.</span>
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">section</span><span class="o">.</span><span class="n">sections</span><span class="p">:</span>
<span class="c"># FIXME: this means DEFAULT is not copied in copy mode</span>
<span class="k">if</span> <span class="n">section</span> <span class="ow">is</span> <span class="bp">self</span> <span class="ow">and</span> <span class="n">entry</span> <span class="o">==</span> <span class="s">&#39;DEFAULT&#39;</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="n">section</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span><span class="o">.</span><span class="n">configspec</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">unvalidated</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">entry</span><span class="p">)</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="n">copy</span><span class="p">:</span>
<span class="n">section</span><span class="o">.</span><span class="n">comments</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="n">configspec</span><span class="o">.</span><span class="n">comments</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="p">[])</span>
<span class="n">section</span><span class="o">.</span><span class="n">inline_comments</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="n">configspec</span><span class="o">.</span><span class="n">inline_comments</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">)</span>
<span class="n">check</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">validator</span><span class="p">,</span> <span class="n">preserve_errors</span><span class="o">=</span><span class="n">preserve_errors</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="n">copy</span><span class="p">,</span> <span class="n">section</span><span class="o">=</span><span class="n">section</span><span class="p">[</span><span class="n">entry</span><span class="p">])</span>
<span class="n">out</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="n">check</span>
<span class="k">if</span> <span class="n">check</span> <span class="o">==</span> <span class="bp">False</span><span class="p">:</span>
<span class="n">ret_true</span> <span class="o">=</span> <span class="bp">False</span>
<span class="k">elif</span> <span class="n">check</span> <span class="o">==</span> <span class="bp">True</span><span class="p">:</span>
<span class="n">ret_false</span> <span class="o">=</span> <span class="bp">False</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">ret_true</span> <span class="o">=</span> <span class="bp">False</span>
<span class="n">section</span><span class="o">.</span><span class="n">extra_values</span> <span class="o">=</span> <span class="n">unvalidated</span>
<span class="k">if</span> <span class="n">preserve_errors</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">section</span><span class="o">.</span><span class="n">_created</span><span class="p">:</span>
<span class="c"># If the section wasn&#39;t created (i.e. it wasn&#39;t missing)</span>
<span class="c"># then we can&#39;t return False, we need to preserve errors</span>
<span class="n">ret_false</span> <span class="o">=</span> <span class="bp">False</span>
<span class="c">#</span>
<span class="k">if</span> <span class="n">ret_false</span> <span class="ow">and</span> <span class="n">preserve_errors</span> <span class="ow">and</span> <span class="n">out</span><span class="p">:</span>
<span class="c"># If we are preserving errors, but all</span>
<span class="c"># the failures are from missing sections / values</span>
<span class="c"># then we can return False. Otherwise there is a</span>
<span class="c"># real failure that we need to preserve.</span>
<span class="n">ret_false</span> <span class="o">=</span> <span class="ow">not</span> <span class="nb">any</span><span class="p">(</span><span class="n">out</span><span class="o">.</span><span class="n">values</span><span class="p">())</span>
<span class="k">if</span> <span class="n">ret_true</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">True</span>
<span class="k">elif</span> <span class="n">ret_false</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">False</span>
<span class="k">return</span> <span class="n">out</span>
</div>
<div class="viewcode-block" id="ConfigObj.reset"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj.reset">[docs]</a> <span class="k">def</span> <span class="nf">reset</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Clear ConfigObj instance and restore to &#39;freshly created&#39; state.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_initialise</span><span class="p">()</span>
<span class="c"># FIXME: Should be done by &#39;_initialise&#39;, but ConfigObj constructor (and reload)</span>
<span class="c"># requires an empty dictionary</span>
<span class="bp">self</span><span class="o">.</span><span class="n">configspec</span> <span class="o">=</span> <span class="bp">None</span>
<span class="c"># Just to be sure ;-)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_original_configspec</span> <span class="o">=</span> <span class="bp">None</span>
</div>
<div class="viewcode-block" id="ConfigObj.reload"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.ConfigObj.reload">[docs]</a> <span class="k">def</span> <span class="nf">reload</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Reload a ConfigObj from file.</span>
<span class="sd"> </span>
<span class="sd"> This method raises a ``ReloadError`` if the ConfigObj doesn&#39;t have</span>
<span class="sd"> a filename attribute pointing to a file.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</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="nb">basestring</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">ReloadError</span><span class="p">()</span>
<span class="n">filename</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">filename</span>
<span class="n">current_options</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">OPTION_DEFAULTS</span><span class="p">:</span>
<span class="k">if</span> <span class="n">entry</span> <span class="o">==</span> <span class="s">&#39;configspec&#39;</span><span class="p">:</span>
<span class="k">continue</span>
<span class="n">current_options</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">entry</span><span class="p">)</span>
<span class="n">configspec</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_original_configspec</span>
<span class="n">current_options</span><span class="p">[</span><span class="s">&#39;configspec&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">configspec</span>
<span class="bp">self</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_initialise</span><span class="p">(</span><span class="n">current_options</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_load</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">configspec</span><span class="p">)</span>
</div></div>
<div class="viewcode-block" id="SimpleVal"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.SimpleVal">[docs]</a><span class="k">class</span> <span class="nc">SimpleVal</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A simple validator.</span>
<span class="sd"> Can be used to check that all members expected are present.</span>
<span class="sd"> </span>
<span class="sd"> To use it, provide a configspec with all your members in (the value given</span>
<span class="sd"> will be ignored). Pass an instance of ``SimpleVal`` to the ``validate``</span>
<span class="sd"> method of your ``ConfigObj``. ``validate`` will return ``True`` if all</span>
<span class="sd"> members are present, or a dictionary with True/False meaning</span>
<span class="sd"> present/missing. (Whole missing sections will be replaced with ``False``)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="SimpleVal.__init__"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.SimpleVal.__init__">[docs]</a> <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="bp">self</span><span class="o">.</span><span class="n">baseErrorClass</span> <span class="o">=</span> <span class="n">ConfigObjError</span>
</div>
<div class="viewcode-block" id="SimpleVal.check"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.SimpleVal.check">[docs]</a> <span class="k">def</span> <span class="nf">check</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">check</span><span class="p">,</span> <span class="n">member</span><span class="p">,</span> <span class="n">missing</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;A dummy check method, always returns the value unchanged.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">missing</span><span class="p">:</span>
<span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">baseErrorClass</span><span class="p">()</span>
<span class="k">return</span> <span class="n">member</span>
</div></div>
<div class="viewcode-block" id="flatten_errors"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.flatten_errors">[docs]</a><span class="k">def</span> <span class="nf">flatten_errors</span><span class="p">(</span><span class="n">cfg</span><span class="p">,</span> <span class="n">res</span><span class="p">,</span> <span class="n">levels</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">results</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> An example function that will turn a nested dictionary of results</span>
<span class="sd"> (as returned by ``ConfigObj.validate``) into a flat list.</span>
<span class="sd"> </span>
<span class="sd"> ``cfg`` is the ConfigObj instance being checked, ``res`` is the results</span>
<span class="sd"> dictionary returned by ``validate``.</span>
<span class="sd"> </span>
<span class="sd"> (This is a recursive function, so you shouldn&#39;t use the ``levels`` or</span>
<span class="sd"> ``results`` arguments - they are used by the function.)</span>
<span class="sd"> </span>
<span class="sd"> Returns a list of keys that failed. Each member of the list is a tuple::</span>
<span class="sd"> </span>
<span class="sd"> ([list of sections...], key, result)</span>
<span class="sd"> </span>
<span class="sd"> If ``validate`` was called with ``preserve_errors=False`` (the default)</span>
<span class="sd"> then ``result`` will always be ``False``.</span>
<span class="sd"> *list of sections* is a flattened list of sections that the key was found</span>
<span class="sd"> in.</span>
<span class="sd"> </span>
<span class="sd"> If the section was missing (or a section was expected and a scalar provided</span>
<span class="sd"> - or vice-versa) then key will be ``None``.</span>
<span class="sd"> </span>
<span class="sd"> If the value (or section) was missing then ``result`` will be ``False``.</span>
<span class="sd"> </span>
<span class="sd"> If ``validate`` was called with ``preserve_errors=True`` and a value</span>
<span class="sd"> was present, but failed the check, then ``result`` will be the exception</span>
<span class="sd"> object returned. You can use this as a string that describes the failure.</span>
<span class="sd"> </span>
<span class="sd"> For example *The value &quot;3&quot; is of the wrong type*.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">levels</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="c"># first time called</span>
<span class="n">levels</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="bp">True</span><span class="p">:</span>
<span class="k">return</span> <span class="n">results</span>
<span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="bp">False</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="ne">Exception</span><span class="p">):</span>
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">levels</span><span class="p">[:],</span> <span class="bp">None</span><span class="p">,</span> <span class="n">res</span><span class="p">))</span>
<span class="k">if</span> <span class="n">levels</span><span class="p">:</span>
<span class="n">levels</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
<span class="k">return</span> <span class="n">results</span>
<span class="k">for</span> <span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span> <span class="ow">in</span> <span class="n">res</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="n">val</span> <span class="o">==</span> <span class="bp">True</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">cfg</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">),</span> <span class="nb">dict</span><span class="p">):</span>
<span class="c"># Go down one level</span>
<span class="n">levels</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="n">flatten_errors</span><span class="p">(</span><span class="n">cfg</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="n">val</span><span class="p">,</span> <span class="n">levels</span><span class="p">,</span> <span class="n">results</span><span class="p">)</span>
<span class="k">continue</span>
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">levels</span><span class="p">[:],</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">))</span>
<span class="c">#</span>
<span class="c"># Go up one level</span>
<span class="k">if</span> <span class="n">levels</span><span class="p">:</span>
<span class="n">levels</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
<span class="c">#</span>
<span class="k">return</span> <span class="n">results</span>
</div>
<div class="viewcode-block" id="get_extra_values"><a class="viewcode-back" href="../../../terminatorlib.configobj.html#terminatorlib.configobj.configobj.get_extra_values">[docs]</a><span class="k">def</span> <span class="nf">get_extra_values</span><span class="p">(</span><span class="n">conf</span><span class="p">,</span> <span class="n">_prepend</span><span class="o">=</span><span class="p">()):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Find all the values and sections not in the configspec from a validated</span>
<span class="sd"> ConfigObj.</span>
<span class="sd"> </span>
<span class="sd"> ``get_extra_values`` returns a list of tuples where each tuple represents</span>
<span class="sd"> either an extra section, or an extra value.</span>
<span class="sd"> </span>
<span class="sd"> The tuples contain two values, a tuple representing the section the value </span>
<span class="sd"> is in and the name of the extra values. For extra values in the top level</span>
<span class="sd"> section the first member will be an empty tuple. For values in the &#39;foo&#39;</span>
<span class="sd"> section the first member will be ``(&#39;foo&#39;,)``. For members in the &#39;bar&#39;</span>
<span class="sd"> subsection of the &#39;foo&#39; section the first member will be ``(&#39;foo&#39;, &#39;bar&#39;)``.</span>
<span class="sd"> </span>
<span class="sd"> NOTE: If you call ``get_extra_values`` on a ConfigObj instance that hasn&#39;t</span>
<span class="sd"> been validated it will return an empty list.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">out</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">out</span><span class="o">.</span><span class="n">extend</span><span class="p">([(</span><span class="n">_prepend</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">conf</span><span class="o">.</span><span class="n">extra_values</span><span class="p">])</span>
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">conf</span><span class="o">.</span><span class="n">sections</span><span class="p">:</span>
<span class="k">if</span> <span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">conf</span><span class="o">.</span><span class="n">extra_values</span><span class="p">:</span>
<span class="n">out</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">get_extra_values</span><span class="p">(</span><span class="n">conf</span><span class="p">[</span><span class="n">name</span><span class="p">],</span> <span class="n">_prepend</span> <span class="o">+</span> <span class="p">(</span><span class="n">name</span><span class="p">,)))</span>
<span class="k">return</span> <span class="n">out</span>
</div>
<span class="sd">&quot;&quot;&quot;*A programming language is a medium of expression.* - Paul Graham&quot;&quot;&quot;</span>
</pre></div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2015, Stephen Boddy, licensed under the CC-BY-SA..
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT:'../../../',
VERSION:'0.98',
COLLAPSE_INDEX:false,
FILE_SUFFIX:'.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
<script type="text/javascript" src="../../../_static/js/theme.js"></script>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.StickyNav.enable();
});
</script>
</body>
</html>