2698 lines
318 KiB
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 — 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>
|
|
|
|
</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> »</li>
|
|
|
|
<li><a href="../../index.html">Module code</a> »</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'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">'utf_8'</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">'utf16_be'</span><span class="p">,</span> <span class="s">'utf_16'</span><span class="p">),</span>
|
|
<span class="n">BOM_UTF16_LE</span><span class="p">:</span> <span class="p">(</span><span class="s">'utf16_le'</span><span class="p">,</span> <span class="s">'utf_16'</span><span class="p">),</span>
|
|
<span class="n">BOM_UTF16</span><span class="p">:</span> <span class="p">(</span><span class="s">'utf_16'</span><span class="p">,</span> <span class="s">'utf_16'</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">'utf_16'</span><span class="p">:</span> <span class="s">'utf_16'</span><span class="p">,</span>
|
|
<span class="s">'u16'</span><span class="p">:</span> <span class="s">'utf_16'</span><span class="p">,</span>
|
|
<span class="s">'utf16'</span><span class="p">:</span> <span class="s">'utf_16'</span><span class="p">,</span>
|
|
<span class="s">'utf-16'</span><span class="p">:</span> <span class="s">'utf_16'</span><span class="p">,</span>
|
|
<span class="s">'utf16_be'</span><span class="p">:</span> <span class="s">'utf16_be'</span><span class="p">,</span>
|
|
<span class="s">'utf_16_be'</span><span class="p">:</span> <span class="s">'utf16_be'</span><span class="p">,</span>
|
|
<span class="s">'utf-16be'</span><span class="p">:</span> <span class="s">'utf16_be'</span><span class="p">,</span>
|
|
<span class="s">'utf16_le'</span><span class="p">:</span> <span class="s">'utf16_le'</span><span class="p">,</span>
|
|
<span class="s">'utf_16_le'</span><span class="p">:</span> <span class="s">'utf16_le'</span><span class="p">,</span>
|
|
<span class="s">'utf-16le'</span><span class="p">:</span> <span class="s">'utf16_le'</span><span class="p">,</span>
|
|
<span class="s">'utf_8'</span><span class="p">:</span> <span class="s">'utf_8'</span><span class="p">,</span>
|
|
<span class="s">'u8'</span><span class="p">:</span> <span class="s">'utf_8'</span><span class="p">,</span>
|
|
<span class="s">'utf'</span><span class="p">:</span> <span class="s">'utf_8'</span><span class="p">,</span>
|
|
<span class="s">'utf8'</span><span class="p">:</span> <span class="s">'utf_8'</span><span class="p">,</span>
|
|
<span class="s">'utf-8'</span><span class="p">:</span> <span class="s">'utf_8'</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">'utf_8'</span><span class="p">:</span> <span class="n">BOM_UTF8</span><span class="p">,</span>
|
|
<span class="s">'utf_16'</span><span class="p">:</span> <span class="n">BOM_UTF16</span><span class="p">,</span>
|
|
<span class="s">'utf16_be'</span><span class="p">:</span> <span class="n">BOM_UTF16_BE</span><span class="p">,</span>
|
|
<span class="s">'utf16_le'</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">'utf_8'</span>
|
|
|
|
|
|
<span class="c"># Quote strings used for writing values</span>
|
|
<span class="n">squot</span> <span class="o">=</span> <span class="s">"'</span><span class="si">%s</span><span class="s">'"</span>
|
|
<span class="n">dquot</span> <span class="o">=</span> <span class="s">'"</span><span class="si">%s</span><span class="s">"'</span>
|
|
<span class="n">noquot</span> <span class="o">=</span> <span class="s">"</span><span class="si">%s</span><span class="s">"</span>
|
|
<span class="n">wspace_plus</span> <span class="o">=</span> <span class="s">' </span><span class="se">\r\n\v\t\'</span><span class="s">"'</span>
|
|
<span class="n">tsquot</span> <span class="o">=</span> <span class="s">'"""</span><span class="si">%s</span><span class="s">"""'</span>
|
|
<span class="n">tdquot</span> <span class="o">=</span> <span class="s">"'''</span><span class="si">%s</span><span class="s">'''"</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">'4.7.2'</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">'__version__'</span><span class="p">,</span>
|
|
<span class="s">'DEFAULT_INDENT_TYPE'</span><span class="p">,</span>
|
|
<span class="s">'DEFAULT_INTERPOLATION'</span><span class="p">,</span>
|
|
<span class="s">'ConfigObjError'</span><span class="p">,</span>
|
|
<span class="s">'NestingError'</span><span class="p">,</span>
|
|
<span class="s">'ParseError'</span><span class="p">,</span>
|
|
<span class="s">'DuplicateError'</span><span class="p">,</span>
|
|
<span class="s">'ConfigspecError'</span><span class="p">,</span>
|
|
<span class="s">'ConfigObj'</span><span class="p">,</span>
|
|
<span class="s">'SimpleVal'</span><span class="p">,</span>
|
|
<span class="s">'InterpolationError'</span><span class="p">,</span>
|
|
<span class="s">'InterpolationLoopError'</span><span class="p">,</span>
|
|
<span class="s">'MissingInterpolationOption'</span><span class="p">,</span>
|
|
<span class="s">'RepeatSectionError'</span><span class="p">,</span>
|
|
<span class="s">'ReloadError'</span><span class="p">,</span>
|
|
<span class="s">'UnreprError'</span><span class="p">,</span>
|
|
<span class="s">'UnknownType'</span><span class="p">,</span>
|
|
<span class="s">'flatten_errors'</span><span class="p">,</span>
|
|
<span class="s">'get_extra_values'</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="n">DEFAULT_INTERPOLATION</span> <span class="o">=</span> <span class="s">'configparser'</span>
|
|
<span class="n">DEFAULT_INDENT_TYPE</span> <span class="o">=</span> <span class="s">' '</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">'interpolation'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
|
|
<span class="s">'raise_errors'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
|
|
<span class="s">'list_values'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
|
|
<span class="s">'create_empty'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
|
|
<span class="s">'file_error'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
|
|
<span class="s">'configspec'</span><span class="p">:</span> <span class="bp">None</span><span class="p">,</span>
|
|
<span class="s">'stringify'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
|
|
<span class="c"># option may be set to one of ('', ' ', '\t')</span>
|
|
<span class="s">'indent_type'</span><span class="p">:</span> <span class="bp">None</span><span class="p">,</span>
|
|
<span class="s">'encoding'</span><span class="p">:</span> <span class="bp">None</span><span class="p">,</span>
|
|
<span class="s">'default_encoding'</span><span class="p">:</span> <span class="bp">None</span><span class="p">,</span>
|
|
<span class="s">'unrepr'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
|
|
<span class="s">'write_empty_values'</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">"a="</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">'build_'</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">'None'</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">'True'</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">'False'</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">'Undefined Name'</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">'Add'</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">'Add'</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">"""</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"> """</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">''</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">''</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">"""</span>
|
|
<span class="sd"> This error indicates a level of nesting that doesn't match.</span>
|
|
<span class="sd"> """</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">"""</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"> """</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">"""</span>
|
|
<span class="sd"> A 'reload' operation failed.</span>
|
|
<span class="sd"> This exception is a subclass of ``IOError``.</span>
|
|
<span class="sd"> """</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">'reload failed, filename is not set.'</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">"""</span>
|
|
<span class="sd"> The keyword or section specified already exists.</span>
|
|
<span class="sd"> """</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">"""</span>
|
|
<span class="sd"> An error occured whilst parsing a configspec.</span>
|
|
<span class="sd"> """</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">"""Base class for the two interpolation errors."""</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">"""Maximum interpolation depth exceeded in string interpolation."""</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">'interpolation loop detected in value "</span><span class="si">%s</span><span class="s">".'</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">"""</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"> """</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">"""A value specified for interpolation was missing."""</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">'missing option "</span><span class="si">%s</span><span class="s">" in interpolation.'</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">"""An error parsing in unrepr mode."""</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">"""</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"> """</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"%\(([^)]*)\)s"</span><span class="p">)</span>
|
|
<span class="n">_cookie</span> <span class="o">=</span> <span class="s">'%'</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 "owns" 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">"""The function that does the actual work.</span>
|
|
|
|
<span class="sd"> ``value``: the string we'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'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"> """</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'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'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">''</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">"""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"> """</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 "owns" 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 "DEFAULT" 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">'DEFAULT'</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'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">"""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., "%(foo)s" or "$foo"). 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'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 "$$" and returned "$").</span>
|
|
<span class="sd"> """</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">"""Behaves like ConfigParser."""</span>
|
|
<span class="n">_cookie</span> <span class="o">=</span> <span class="s">'%'</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"%\(([^)]*)\)s"</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">"""Behaves like string.Template."""</span>
|
|
<span class="n">_cookie</span> <span class="o">=</span> <span class="s">'$'</span>
|
|
<span class="n">_delimiter</span> <span class="o">=</span> <span class="s">'$'</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"""</span>
|
|
<span class="s"> \$(?:</span>
|
|
<span class="s"> (?P<escaped>\$) | # Two $ signs</span>
|
|
<span class="s"> (?P<named>[_a-z][_a-z0-9]*) | # $name format</span>
|
|
<span class="s"> {(?P<braced>[^}]*)} # ${name} format</span>
|
|
<span class="s"> )</span>
|
|
<span class="s"> """</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">'named'</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">'braced'</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">'escaped'</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'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">'configparser'</span><span class="p">:</span> <span class="n">ConfigParserInterpolation</span><span class="p">,</span>
|
|
<span class="s">'template'</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">"""</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 'interpolation' attribute</span>
|
|
<span class="sd"> of the 'main' object is set to True.</span>
|
|
<span class="sd"> </span>
|
|
<span class="sd"> Interpolation is tried first from this object, then from the 'DEFAULT'</span>
|
|
<span class="sd"> section of this object, next from the parent and its 'DEFAULT' 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"> """</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">"""</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"> """</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 "if name:" 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 "Template", "template", 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'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">"""Fetch the item and do string interpolation."""</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">"""</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 'Section' 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"> """</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">'The key "</span><span class="si">%s</span><span class="s">" is not a string.'</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">''</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">'Value is not a string "</span><span class="si">%s</span><span class="s">".'</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">'Value is not a string "</span><span class="si">%s</span><span class="s">".'</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">"""Remove items from the sequence when deleting."""</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">"""A version of ``get`` that doesn't bypass string interpolation."""</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">"""</span>
|
|
<span class="sd"> A version of update that uses our ``__setitem__``.</span>
|
|
<span class="sd"> """</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">"""</span>
|
|
<span class="sd"> 'D.pop(k[,d]) -> 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'</span>
|
|
<span class="sd"> """</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">"""Pops the first (key,val)"""</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">": 'popitem(): dictionary is empty'"</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">"""</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"> """</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">"""A version of setdefault that sets sequence if appropriate."""</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">"""D.items() -> list of D's (key, value) pairs, as 2-tuples"""</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">"""D.keys() -> list of D's keys"""</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">"""D.values() -> list of D's values"""</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">"""D.iteritems() -> an iterator over the (key, value) items of D"""</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">"""D.iterkeys() -> an iterator over the keys of D"""</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">"""D.itervalues() -> an iterator over the values of D"""</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">"""x.__repr__() <==> repr(x)"""</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">'{</span><span class="si">%s</span><span class="s">}'</span> <span class="o">%</span> <span class="s">', '</span><span class="o">.</span><span class="n">join</span><span class="p">([(</span><span class="s">'</span><span class="si">%s</span><span class="s">: </span><span class="si">%s</span><span class="s">'</span> <span class="o">%</span> <span class="p">(</span><span class="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">"x.__str__() <==> str(x)"</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">"""</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"> >>> n = a.dict()</span>
|
|
<span class="sd"> >>> n == a</span>
|
|
<span class="sd"> 1</span>
|
|
<span class="sd"> >>> n is a</span>
|
|
<span class="sd"> 0</span>
|
|
<span class="sd"> """</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">"""</span>
|
|
<span class="sd"> A recursive update - useful for merging config files.</span>
|
|
<span class="sd"> </span>
|
|
<span class="sd"> >>> a = '''[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'''.splitlines()</span>
|
|
<span class="sd"> >>> b = '''# File is user.ini</span>
|
|
<span class="sd"> ... [section1]</span>
|
|
<span class="sd"> ... option1 = False</span>
|
|
<span class="sd"> ... # end of file'''.splitlines()</span>
|
|
<span class="sd"> >>> c1 = ConfigObj(b)</span>
|
|
<span class="sd"> >>> c2 = ConfigObj(a)</span>
|
|
<span class="sd"> >>> c2.merge(c1)</span>
|
|
<span class="sd"> >>> c2</span>
|
|
<span class="sd"> ConfigObj({'section1': {'option1': 'False', 'subsection': {'more_options': 'False'}}})</span>
|
|
<span class="sd"> """</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">"""</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"> """</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">'Key "</span><span class="si">%s</span><span class="s">" not found.'</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">"""</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'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't add or delete members.</span>
|
|
<span class="sd"> </span>
|
|
<span class="sd"> >>> config = '''[XXXXsection]</span>
|
|
<span class="sd"> ... XXXXkey = XXXXvalue'''.splitlines()</span>
|
|
<span class="sd"> >>> cfg = ConfigObj(config)</span>
|
|
<span class="sd"> >>> cfg</span>
|
|
<span class="sd"> ConfigObj({'XXXXsection': {'XXXXkey': 'XXXXvalue'}})</span>
|
|
<span class="sd"> >>> def transform(section, key):</span>
|
|
<span class="sd"> ... val = section[key]</span>
|
|
<span class="sd"> ... newkey = key.replace('XXXX', 'CLIENT1')</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('XXXX', 'CLIENT1')</span>
|
|
<span class="sd"> ... section[newkey] = val</span>
|
|
<span class="sd"> >>> cfg.walk(transform, call_on_sections=True)</span>
|
|
<span class="sd"> {'CLIENT1section': {'CLIENT1key': None}}</span>
|
|
<span class="sd"> >>> cfg</span>
|
|
<span class="sd"> ConfigObj({'CLIENT1section': {'CLIENT1key': 'CLIENT1value'}})</span>
|
|
<span class="sd"> """</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">"""</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"> >>> a = ConfigObj()</span>
|
|
<span class="sd"> >>> a['a'] = 'fish'</span>
|
|
<span class="sd"> >>> a.as_bool('a')</span>
|
|
<span class="sd"> Traceback (most recent call last):</span>
|
|
<span class="sd"> ValueError: Value "fish" is neither True nor False</span>
|
|
<span class="sd"> >>> a['b'] = 'True'</span>
|
|
<span class="sd"> >>> a.as_bool('b')</span>
|
|
<span class="sd"> 1</span>
|
|
<span class="sd"> >>> a['b'] = 'off'</span>
|
|
<span class="sd"> >>> a.as_bool('b')</span>
|
|
<span class="sd"> 0</span>
|
|
<span class="sd"> """</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">'Value "</span><span class="si">%s</span><span class="s">" is neither True nor False'</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">"""</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"> >>> a = ConfigObj()</span>
|
|
<span class="sd"> >>> a['a'] = 'fish'</span>
|
|
<span class="sd"> >>> a.as_int('a')</span>
|
|
<span class="sd"> Traceback (most recent call last):</span>
|
|
<span class="sd"> ValueError: invalid literal for int() with base 10: 'fish'</span>
|
|
<span class="sd"> >>> a['b'] = '1'</span>
|
|
<span class="sd"> >>> a.as_int('b')</span>
|
|
<span class="sd"> 1</span>
|
|
<span class="sd"> >>> a['b'] = '3.2'</span>
|
|
<span class="sd"> >>> a.as_int('b')</span>
|
|
<span class="sd"> Traceback (most recent call last):</span>
|
|
<span class="sd"> ValueError: invalid literal for int() with base 10: '3.2'</span>
|
|
<span class="sd"> """</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">"""</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"> >>> a = ConfigObj()</span>
|
|
<span class="sd"> >>> a['a'] = 'fish'</span>
|
|
<span class="sd"> >>> a.as_float('a')</span>
|
|
<span class="sd"> Traceback (most recent call last):</span>
|
|
<span class="sd"> ValueError: invalid literal for float(): fish</span>
|
|
<span class="sd"> >>> a['b'] = '1'</span>
|
|
<span class="sd"> >>> a.as_float('b')</span>
|
|
<span class="sd"> 1.0</span>
|
|
<span class="sd"> >>> a['b'] = '3.2'</span>
|
|
<span class="sd"> >>> a.as_float('b')</span>
|
|
<span class="sd"> 3.2000000000000002</span>
|
|
<span class="sd"> """</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">"""</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"> >>> a = ConfigObj()</span>
|
|
<span class="sd"> >>> a['a'] = 1</span>
|
|
<span class="sd"> >>> a.as_list('a')</span>
|
|
<span class="sd"> [1]</span>
|
|
<span class="sd"> >>> a['a'] = (1,)</span>
|
|
<span class="sd"> >>> a.as_list('a')</span>
|
|
<span class="sd"> [1]</span>
|
|
<span class="sd"> >>> a['a'] = [1]</span>
|
|
<span class="sd"> >>> a.as_list('a')</span>
|
|
<span class="sd"> [1]</span>
|
|
<span class="sd"> """</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">"""</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"> """</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">"""</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't delete or modify entries without default values.</span>
|
|
<span class="sd"> """</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">"""An object to read, create, and write config files."""</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'''^ # line start</span>
|
|
<span class="s"> (\s*) # indentation</span>
|
|
<span class="s"> ( # keyword</span>
|
|
<span class="s"> (?:".*?")| # double quotes</span>
|
|
<span class="s"> (?:'.*?')| # single quotes</span>
|
|
<span class="s"> (?:[^'"=].*?) # 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"> '''</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'''^</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"> (?:"\s*\S.*?\s*")| # at least one non-space with double quotes</span>
|
|
<span class="s"> (?:'\s*\S.*?\s*')| # at least one non-space with single quotes</span>
|
|
<span class="s"> (?:[^'"\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"> $'''</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 '' 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'''^</span>
|
|
<span class="s"> (?:</span>
|
|
<span class="s"> (?:</span>
|
|
<span class="s"> (</span>
|
|
<span class="s"> (?:</span>
|
|
<span class="s"> (?:</span>
|
|
<span class="s"> (?:".*?")| # double quotes</span>
|
|
<span class="s"> (?:'.*?')| # single quotes</span>
|
|
<span class="s"> (?:[^'",\#][^,\#]*?) # 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"> (?:".*?")| # double quotes</span>
|
|
<span class="s"> (?:'.*?')| # single quotes</span>
|
|
<span class="s"> (?:[^'",\#\s][^,]*?)| # unquoted</span>
|
|
<span class="s"> (?:(?<!,)) # 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"> $'''</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'''</span>
|
|
<span class="s"> (</span>
|
|
<span class="s"> (?:".*?")| # double quotes</span>
|
|
<span class="s"> (?:'.*?')| # single quotes</span>
|
|
<span class="s"> (?:[^'",\#]?.*?) # unquoted</span>
|
|
<span class="s"> )</span>
|
|
<span class="s"> \s*,\s* # comma</span>
|
|
<span class="s"> '''</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'''^</span>
|
|
<span class="s"> (</span>
|
|
<span class="s"> (?:".*?")| # double quotes</span>
|
|
<span class="s"> (?:'.*?')| # single quotes</span>
|
|
<span class="s"> (?:[^'"\#].*?)| # unquoted</span>
|
|
<span class="s"> (?:) # Empty value</span>
|
|
<span class="s"> )</span>
|
|
<span class="s"> \s*(\#.*)? # optional comment</span>
|
|
<span class="s"> $'''</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"^'''(.*?)'''\s*(#.*)?$"</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'^"""(.*?)"""\s*(#.*)?$'</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"^(.*?)'''\s*(#.*)?$"</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'^(.*?)"""\s*(#.*)?$'</span><span class="p">)</span>
|
|
|
|
<span class="n">_triple_quote</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="s">"'''"</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">'"""'</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">'yes'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span> <span class="s">'no'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
|
|
<span class="s">'on'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span> <span class="s">'off'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
|
|
<span class="s">'1'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span> <span class="s">'0'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
|
|
<span class="s">'true'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span> <span class="s">'false'</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">"""</span>
|
|
<span class="sd"> Parse a config file or create a config file object.</span>
|
|
<span class="sd"> """</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">'configspec'</span><span class="p">:</span> <span class="n">configspec</span><span class="p">,</span>
|
|
<span class="s">'encoding'</span><span class="p">:</span> <span class="n">encoding</span><span class="p">,</span> <span class="s">'interpolation'</span><span class="p">:</span> <span class="n">interpolation</span><span class="p">,</span>
|
|
<span class="s">'raise_errors'</span><span class="p">:</span> <span class="n">raise_errors</span><span class="p">,</span> <span class="s">'list_values'</span><span class="p">:</span> <span class="n">list_values</span><span class="p">,</span>
|
|
<span class="s">'create_empty'</span><span class="p">:</span> <span class="n">create_empty</span><span class="p">,</span> <span class="s">'file_error'</span><span class="p">:</span> <span class="n">file_error</span><span class="p">,</span>
|
|
<span class="s">'stringify'</span><span class="p">:</span> <span class="n">stringify</span><span class="p">,</span> <span class="s">'indent_type'</span><span class="p">:</span> <span class="n">indent_type</span><span class="p">,</span>
|
|
<span class="s">'default_encoding'</span><span class="p">:</span> <span class="n">default_encoding</span><span class="p">,</span> <span class="s">'unrepr'</span><span class="p">:</span> <span class="n">unrepr</span><span class="p">,</span>
|
|
<span class="s">'write_empty_values'</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">'Passing in an options dictionary to ConfigObj() is '</span>
|
|
<span class="s">'deprecated. Use **options instead.'</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">'Unrecognised option "</span><span class="si">%s</span><span class="s">".'</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">'list_values'</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">'configspec'</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">'rb'</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't exist</span>
|
|
<span class="k">raise</span> <span class="ne">IOError</span><span class="p">(</span><span class="s">'Config file not found: "</span><span class="si">%s</span><span class="s">".'</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'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'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">'w'</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">''</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">'read'</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'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">'infile must be a filename, file like object, or list of lines.'</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">infile</span><span class="p">:</span>
|
|
<span class="c"># don'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 '\n' or '\r' 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">'</span><span class="se">\r</span><span class="s">'</span><span class="p">,</span> <span class="s">'</span><span class="se">\n</span><span class="s">'</span><span class="p">,</span> <span class="s">'</span><span class="se">\r\n</span><span class="s">'</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">'</span><span class="se">\r\n</span><span class="s">'</span><span class="p">,</span> <span class="s">'</span><span class="se">\n</span><span class="s">'</span><span class="p">,</span> <span class="s">'</span><span class="se">\r</span><span class="s">'</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">'</span><span class="se">\r\n</span><span class="s">'</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">"at line </span><span class="si">%s</span><span class="s">."</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">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="s">"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">"</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'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">'raise_errors'</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">'interpolation'</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">'list_values'</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">'create_empty'</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">'file_error'</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">'stringify'</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">'indent_type'</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">'encoding'</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">'default_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">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">'write_empty_values'</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">'unrepr'</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">'ConfigObj({</span><span class="si">%s</span><span class="s">})'</span> <span class="o">%</span>
|
|
<span class="s">', '</span><span class="o">.</span><span class="n">join</span><span class="p">([(</span><span class="s">'</span><span class="si">%s</span><span class="s">: </span><span class="si">%s</span><span class="s">'</span> <span class="o">%</span> <span class="p">(</span><span class="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">"""</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'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"> """</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'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">'utf_16'</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'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'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'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">"""Decode ASCII strings to unicode if a self.encoding is specified."""</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">'ascii'</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">"""</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"> """</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'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">"""Decode element to unicode if necessary."""</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">"""</span>
|
|
<span class="sd"> Used by ``stringify`` within validate, to turn non-string values</span>
|
|
<span class="sd"> into strings.</span>
|
|
<span class="sd"> """</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">"""Actually parse the config file."""</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"><</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">'#'</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'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">'['</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">']'</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">"Cannot compute the section depth at line </span><span class="si">%s</span><span class="s">."</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"><</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">"Cannot compute nesting level at line </span><span class="si">%s</span><span class="s">."</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">"Section too nested at line </span><span class="si">%s</span><span class="s">."</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">'Duplicate section name at line </span><span class="si">%s</span><span class="s">.'</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'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">'Invalid line at line "</span><span class="si">%s</span><span class="s">".'</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">'"""'</span><span class="p">,</span> <span class="s">"'''"</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">'Parse error in value at line </span><span class="si">%s</span><span class="s">.'</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">''</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">'Unknown name or type in value at line </span><span class="si">%s</span><span class="s">.'</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="s">'Parse error in value at line </span><span class="si">%s</span><span class="s">.'</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">''</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">'Unknown name or type in value at line </span><span class="si">%s</span><span class="s">.'</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="s">'Parse error in value at line </span><span class="si">%s</span><span class="s">.'</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">'Parse error in value at line </span><span class="si">%s</span><span class="s">.'</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">'Duplicate keyword name at line </span><span class="si">%s</span><span class="s">.'</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">''</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">"""</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"> """</span>
|
|
<span class="k">while</span> <span class="n">depth</span> <span class="o"><</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'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'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">"""</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"> """</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">"""Return an unquoted version of a value"""</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">'"'</span><span class="p">,</span> <span class="s">"'"</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">"""</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't quote values that don'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 '#'.</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't be quoted.</span>
|
|
<span class="sd"> """</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">''</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">''</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">','</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">','</span>
|
|
<span class="k">return</span> <span class="s">', '</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">'Value "</span><span class="si">%s</span><span class="s">" is not a string.'</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">'""'</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">'</span><span class="se">\n</span><span class="s">'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">value</span> <span class="ow">and</span> <span class="s">'#'</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">"'"</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">'"'</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">'</span><span class="se">\n</span><span class="s">'</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">"'"</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">'"'</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">'#'</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'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">'</span><span class="se">\n</span><span class="s">'</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. '\n' in key</span>
|
|
<span class="k">raise</span> <span class="n">ConfigObjError</span><span class="p">(</span><span class="s">'Value "</span><span class="si">%s</span><span class="s">" cannot be safely quoted.'</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">','</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 '\n' or "'" *and* '"', 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">'#'</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">"'"</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">'"'</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">'Value "</span><span class="si">%s</span><span class="s">" cannot be safely quoted.'</span> <span class="o">%</span> <span class="n">value</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="s">'"'</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">'"""'</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">"'''"</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">'Value "</span><span class="si">%s</span><span class="s">" cannot be safely quoted.'</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">'"""'</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">"""</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"> """</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'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">''</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'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">''</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 '' is a workaround because our regex now matches</span>
|
|
<span class="c"># '' 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">'""'</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">''</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">"""Extract the value, where we are in a multiline situation."""</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"><</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">'</span><span class="se">\n</span><span class="s">'</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'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">"""Parse the configspec."""</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">'Parsing configspec failed: </span><span class="si">%s</span><span class="s">'</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">'Reading configspec failed: </span><span class="si">%s</span><span class="s">'</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">"""</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"> """</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">'__many__'</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">'__many__'</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">''</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">"""Write an individual line, for the write method"""</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">'</span><span class="si">%s%s%s%s%s</span><span class="s">'</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">' = '</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">"""Write a section marker line"""</span>
|
|
<span class="k">return</span> <span class="s">'</span><span class="si">%s%s%s%s%s</span><span class="s">'</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">'['</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">']'</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">"""Deal with a comment."""</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">''</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">'#'</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">' # '</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">"""</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"> >>> filename = a.filename</span>
|
|
<span class="sd"> >>> a.filename = 'test.ini'</span>
|
|
<span class="sd"> >>> a.write()</span>
|
|
<span class="sd"> >>> a.filename = filename</span>
|
|
<span class="sd"> >>> a == ConfigObj('test.ini', raise_errors=True)</span>
|
|
<span class="sd"> 1</span>
|
|
<span class="sd"> >>> import os</span>
|
|
<span class="sd"> >>> os.remove('test.ini')</span>
|
|
<span class="sd"> """</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">'#'</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">'# '</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">'default'</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">'default'</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">'default'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="s">'default'</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">'default'</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">'default'</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'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">'utf_8'</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">''</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">'mode'</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">'w'</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">'win32'</span> <span class="ow">and</span> <span class="n">newline</span> <span class="o">==</span> <span class="s">'</span><span class="se">\r\n</span><span class="s">'</span><span class="p">):</span>
|
|
<span class="c"># Windows specific hack to avoid writing '\r\r\n'</span>
|
|
<span class="n">newline</span> <span class="o">=</span> <span class="s">'</span><span class="se">\n</span><span class="s">'</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">'wb'</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">"""</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"> """</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">'No configspec supplied.'</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 'get_default_value'</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 ''</span>
|
|
<span class="n">check</span> <span class="o">=</span> <span class="s">''</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">'__many__'</span><span class="p">,</span> <span class="s">'___many___'</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">''</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">'__many__'</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">'__many__'</span><span class="p">]</span>
|
|
<span class="k">elif</span> <span class="s">'___many___'</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">'___many___'</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">'Value </span><span class="si">%r</span><span class="s"> was provided as a section'</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">'Section </span><span class="si">%r</span><span class="s"> was provided as a single value'</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">'DEFAULT'</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">''</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't created (i.e. it wasn't missing)</span>
|
|
<span class="c"># then we can'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">"""Clear ConfigObj instance and restore to 'freshly created' state."""</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 '_initialise', 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">"""</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't have</span>
|
|
<span class="sd"> a filename attribute pointing to a file.</span>
|
|
<span class="sd"> """</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">'configspec'</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">'configspec'</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">"""</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"> """</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">"""A dummy check method, always returns the value unchanged."""</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">"""</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'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 "3" is of the wrong type*.</span>
|
|
<span class="sd"> """</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">"""</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 'foo'</span>
|
|
<span class="sd"> section the first member will be ``('foo',)``. For members in the 'bar'</span>
|
|
<span class="sd"> subsection of the 'foo' section the first member will be ``('foo', 'bar')``.</span>
|
|
<span class="sd"> </span>
|
|
<span class="sd"> NOTE: If you call ``get_extra_values`` on a ConfigObj instance that hasn't</span>
|
|
<span class="sd"> been validated it will return an empty list.</span>
|
|
<span class="sd"> """</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">"""*A programming language is a medium of expression.* - Paul Graham"""</span>
|
|
</pre></div>
|
|
|
|
</div>
|
|
<footer>
|
|
|
|
|
|
<hr/>
|
|
|
|
<div role="contentinfo">
|
|
<p>
|
|
© 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> |