<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Python Compatibility — Bcfg2 1.3.0 documentation</title> <link rel="stylesheet" href="../_static/default.css" type="text/css" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: '../', VERSION: '1.3.0', 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/sidebar.js"></script> <link rel="shortcut icon" href="../_static/favicon.ico"/> <link rel="top" title="Bcfg2 1.3.0 documentation" href="../index.html" /> <link rel="up" title="Bcfg2 Development" href="index.html" /> <link rel="next" title="Server Core Development" href="core.html" /> <link rel="prev" title="Writing A Client Tool Driver" href="client-driver.html" /> <link rel="stylesheet" href="../_static/bcfg2.css" type=""/> </head> <body> <div style="text-align: left; padding: 10px 10px 15px 15px"> <a href="../index.html"><img src="../_static/bcfg2_logo.png" border="0" alt="sampledoc"/></a> </div> <div class="related"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="../genindex.html" title="General Index" accesskey="I">index</a></li> <li class="right" > <a href="../py-modindex.html" title="Python Module Index" >modules</a> |</li> <li class="right" > <a href="core.html" title="Server Core Development" accesskey="N">next</a> |</li> <li class="right" > <a href="client-driver.html" title="Writing A Client Tool Driver" accesskey="P">previous</a> |</li> <li><a href="../index.html">home</a> | </li> <!--<li><a href="../search.html">search</a> | </li>--> <li><a href="../help/index.html">help</a> | </li> <li><a href="../contents.html">documentation </a> »</li> <li><a href="../contents.html" >Bcfg2 documentation 1.3.0</a> »</li> <li><a href="index.html" accesskey="U">Bcfg2 Development</a> »</li> </ul> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body"> <div class="section" id="python-compatibility"> <span id="development-compat"></span><h1>Python Compatibility<a class="headerlink" href="#python-compatibility" title="Permalink to this headline">¶</a></h1> <p>Bcfg2 maintains compatibility with a wide range of Python versions – currently 2.4 through 3.2 This requires some (often significant) compatibility interfaces. This page documents the compatibility library, <tt class="docutils literal"><span class="pre">Bcfg2.Compat</span></tt>, and its contents.</p> <p>Note that, due to limitations in Sphinx (the Bcfg2 documentation tool), this documentation is <em>not</em> automatically generated. <tt class="docutils literal"><span class="pre">Compat.py</span></tt> should always be considered the authoritative source.</p> <p>There are several basic types of symbols found in <tt class="docutils literal"><span class="pre">Bcfg2.Compat</span></tt>:</p> <ul class="simple"> <li>Symbols whose names have changed, e.g., <tt class="docutils literal"><span class="pre">MutableMapping</span></tt>.</li> <li>Symbols whose modules have changed names, e.g., <tt class="docutils literal"><span class="pre">urljoin</span></tt>/<tt class="docutils literal"><span class="pre">urlparse</span></tt></li> <li>Symbols that have been added or removed, e.g., <tt class="docutils literal"><span class="pre">any</span></tt>/<tt class="docutils literal"><span class="pre">all</span></tt>, <tt class="docutils literal"><span class="pre">reduce</span></tt>, <tt class="docutils literal"><span class="pre">walk_packages</span></tt></li> <li>Symbols that need some significant workaround to function identically in all versions, e.g., <tt class="docutils literal"><span class="pre">b64encode</span></tt>/<tt class="docutils literal"><span class="pre">b64decode</span></tt>.</li> <li>Helper functions and classes for compatibility, e.g., <tt class="docutils literal"><span class="pre">CmpMixin</span></tt>.</li> </ul> <div class="section" id="using-bcfg2-compat"> <h2>Using <tt class="docutils literal"><span class="pre">Bcfg2.Compat</span></tt><a class="headerlink" href="#using-bcfg2-compat" title="Permalink to this headline">¶</a></h2> <p>To use the compatibility libraries, simply import them as such:</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">Bcfg2.Compat</span> <span class="kn">import</span> <span class="n">StringIO</span><span class="p">,</span> <span class="nb">all</span> </pre></div> </div> <p>The individual symbol import is preferred over just importing <tt class="docutils literal"><span class="pre">Bcfg2.Compat</span></tt> as a whole, since in the future we will be able to remove some items from the library and this makes that process easier. A wildcard import is definitely discouraged.</p> </div> <div class="section" id="bcfg2-compat-symbols"> <h2>Bcfg2.Compat symbols<a class="headerlink" href="#bcfg2-compat-symbols" title="Permalink to this headline">¶</a></h2> <p><tt class="docutils literal"><span class="pre">Bcfg2.Compat</span></tt> defines the following symbols:</p> <div class="section" id="py3k-compatibility-imports"> <h3>Py3K compatibility imports<a class="headerlink" href="#py3k-compatibility-imports" title="Permalink to this headline">¶</a></h3> <p>The following symbols are imported to provide compatibility with Python 3. In cases where the newer symbols has also been backported to Python 2, the older symbol will be used unless otherwise noted. This is to ensure that functions or modules with radically different behavior (e.g., <tt class="xref py py-func docutils literal"><span class="pre">input()</span></tt>) do not cause unexpected side-effects.</p> <table border="1" class="docutils"> <colgroup> <col width="24%" /> <col width="36%" /> <col width="41%" /> </colgroup> <thead valign="bottom"> <tr class="row-odd"><th class="head">Name</th> <th class="head">Python 2</th> <th class="head">Python 3</th> </tr> </thead> <tbody valign="top"> <tr class="row-even"><td>urljoin</td> <td><tt class="xref py py-func docutils literal"><span class="pre">urlparse.urljoin()</span></tt></td> <td><tt class="xref py py-func docutils literal"><span class="pre">urllib.parse.urljoin()</span></tt></td> </tr> <tr class="row-odd"><td>urlparse</td> <td><tt class="xref py py-func docutils literal"><span class="pre">urlparse.urlparse()</span></tt></td> <td><tt class="xref py py-func docutils literal"><span class="pre">urllib.parse.urlparse()</span></tt></td> </tr> <tr class="row-even"><td>HTTPBasicAuthHandler</td> <td><tt class="xref py py-class docutils literal"><span class="pre">urllib2.HTTPBasicAuthHandler</span></tt></td> <td><tt class="xref py py-class docutils literal"><span class="pre">urllib.request.HTTPBasicAuthHandler</span></tt></td> </tr> <tr class="row-odd"><td>HTTPPasswordMgrWithDefaultRealm</td> <td><tt class="xref py py-class docutils literal"><span class="pre">urllib2.HTTPPasswordMgrWithDefaultRealm</span></tt></td> <td><tt class="xref py py-class docutils literal"><span class="pre">urllib.request.HTTPPasswordMgrWithDefaultRealm</span></tt></td> </tr> <tr class="row-even"><td>build_opener</td> <td><tt class="xref py py-func docutils literal"><span class="pre">urllib2.build_opener()</span></tt></td> <td><tt class="xref py py-func docutils literal"><span class="pre">urllib.request.build_opener()</span></tt></td> </tr> <tr class="row-odd"><td>install_opener</td> <td><tt class="xref py py-func docutils literal"><span class="pre">urllib2.install_opener()</span></tt></td> <td><tt class="xref py py-func docutils literal"><span class="pre">urllib.request.install_opener()</span></tt></td> </tr> <tr class="row-even"><td>urlopen</td> <td><tt class="xref py py-func docutils literal"><span class="pre">urllib2.urlopen()</span></tt></td> <td><tt class="xref py py-func docutils literal"><span class="pre">urllib.request.urlopen()</span></tt></td> </tr> <tr class="row-odd"><td>HTTPError</td> <td><tt class="xref py py-exc docutils literal"><span class="pre">urllib2.HTTPError</span></tt></td> <td><tt class="xref py py-exc docutils literal"><span class="pre">urllib.error.HTTPError</span></tt></td> </tr> <tr class="row-even"><td>URLError</td> <td><tt class="xref py py-exc docutils literal"><span class="pre">urllib2.URLError</span></tt></td> <td><tt class="xref py py-exc docutils literal"><span class="pre">urllib.error.URLError</span></tt></td> </tr> <tr class="row-odd"><td>StringIO</td> <td><tt class="xref py py-func docutils literal"><span class="pre">cStringIO.StringIO()</span></tt></td> <td><tt class="xref py py-class docutils literal"><span class="pre">io.StringIO</span></tt></td> </tr> <tr class="row-even"><td>ConfigParser</td> <td><tt class="xref py py-mod docutils literal"><span class="pre">ConfigParser</span></tt></td> <td><tt class="xref py py-mod docutils literal"><span class="pre">configparser</span></tt></td> </tr> <tr class="row-odd"><td>cPickle</td> <td><tt class="xref py py-mod docutils literal"><span class="pre">cPickle</span></tt></td> <td><tt class="xref py py-mod docutils literal"><span class="pre">pickle</span></tt></td> </tr> <tr class="row-even"><td>Queue</td> <td><tt class="xref py py-class docutils literal"><span class="pre">Queue.Queue</span></tt></td> <td><tt class="xref py py-class docutils literal"><span class="pre">queue.Queue</span></tt></td> </tr> <tr class="row-odd"><td>Empty</td> <td><tt class="xref py py-exc docutils literal"><span class="pre">Queue.Empty</span></tt></td> <td><tt class="xref py py-exc docutils literal"><span class="pre">queue.Empty</span></tt></td> </tr> <tr class="row-even"><td>Full</td> <td><tt class="xref py py-exc docutils literal"><span class="pre">Queue.Full</span></tt></td> <td><tt class="xref py py-exc docutils literal"><span class="pre">queue.Full</span></tt></td> </tr> <tr class="row-odd"><td>xmlrpclib</td> <td><tt class="xref py py-mod docutils literal"><span class="pre">xmlrpclib</span></tt></td> <td><tt class="xref py py-mod docutils literal"><span class="pre">xmlrpc.client</span></tt></td> </tr> <tr class="row-even"><td>SimpleXMLRPCServer</td> <td><tt class="xref py py-mod docutils literal"><span class="pre">SimpleXMLRPCServer</span></tt></td> <td><tt class="xref py py-mod docutils literal"><span class="pre">xmlrpc.server</span></tt></td> </tr> <tr class="row-odd"><td>SocketServer</td> <td><tt class="xref py py-mod docutils literal"><span class="pre">SocketServer</span></tt></td> <td><tt class="xref py py-mod docutils literal"><span class="pre">socketserver</span></tt></td> </tr> <tr class="row-even"><td>httplib</td> <td><tt class="xref py py-mod docutils literal"><span class="pre">httplib</span></tt></td> <td><tt class="xref py py-mod docutils literal"><span class="pre">http.client</span></tt></td> </tr> <tr class="row-odd"><td>input</td> <td><tt class="xref py py-func docutils literal"><span class="pre">raw_input()</span></tt></td> <td><tt class="xref py py-func docutils literal"><span class="pre">input()</span></tt></td> </tr> <tr class="row-even"><td>reduce</td> <td><tt class="xref py py-func docutils literal"><span class="pre">reduce()</span></tt></td> <td><tt class="xref py py-func docutils literal"><span class="pre">functools.reduce()</span></tt></td> </tr> <tr class="row-odd"><td>long</td> <td><tt class="xref py py-func docutils literal"><span class="pre">long()</span></tt></td> <td><tt class="xref py py-func docutils literal"><span class="pre">int()</span></tt></td> </tr> </tbody> </table> </div> <div class="section" id="python-2-4-compatibility"> <h3>Python 2.4 compatibility<a class="headerlink" href="#python-2-4-compatibility" title="Permalink to this headline">¶</a></h3> <p>The following symbols are imported or defined to provide compatibility with Python 2.4 (and occasionally 2.5). Be sure to read the notes below, since some of these implementations may be feature-incomplete.</p> <table border="1" class="docutils"> <colgroup> <col width="17%" /> <col width="35%" /> <col width="48%" /> </colgroup> <thead valign="bottom"> <tr class="row-odd"><th class="head">Name</th> <th class="head">Python 2.4</th> <th class="head">Python 2.4+</th> </tr> </thead> <tbody valign="top"> <tr class="row-even"><td>formatdate</td> <td><tt class="xref py py-func docutils literal"><span class="pre">email.Utils.formatdate()</span></tt></td> <td><tt class="xref py py-func docutils literal"><span class="pre">email.utils.formatdate()</span></tt></td> </tr> <tr class="row-odd"><td>walk_packages</td> <td>Not implemented</td> <td><tt class="xref py py-func docutils literal"><span class="pre">pkgutil.walk_packages()</span></tt> (2.6+)</td> </tr> <tr class="row-even"><td>any</td> <td>Not implemented</td> <td><tt class="xref py py-func docutils literal"><span class="pre">any()</span></tt></td> </tr> <tr class="row-odd"><td>all</td> <td>Not implemented</td> <td><tt class="xref py py-func docutils literal"><span class="pre">all()</span></tt></td> </tr> <tr class="row-even"><td>wraps</td> <td>Not implemented</td> <td><tt class="xref py py-func docutils literal"><span class="pre">functools.wraps()</span></tt></td> </tr> <tr class="row-odd"><td>md5</td> <td><tt class="xref py py-func docutils literal"><span class="pre">md5.md5()</span></tt></td> <td><tt class="xref py py-class docutils literal"><span class="pre">hashlib.md5</span></tt></td> </tr> <tr class="row-even"><td>MutableMapping</td> <td><tt class="xref py py-class docutils literal"><span class="pre">UserDict.DictMixin</span></tt></td> <td><tt class="xref py py-class docutils literal"><span class="pre">collections.MutableMapping</span></tt> (2.6+)</td> </tr> </tbody> </table> <div class="section" id="walk-packages"> <h4>walk_packages<a class="headerlink" href="#walk-packages" title="Permalink to this headline">¶</a></h4> <p>The <tt class="docutils literal"><span class="pre">walk_packages</span></tt> implementation for Python 2.5 is feature-complete. The implementation for Python 2.4 is <em>not</em>. Differences:</p> <ul class="simple"> <li>Requires a full path, not a path relative to something in sys.path. Anywhere we care about that shouldn’t be an issue.</li> <li>The first element of each tuple is None instead of an importer object.</li> </ul> </div> <div class="section" id="wraps"> <h4>wraps<a class="headerlink" href="#wraps" title="Permalink to this headline">¶</a></h4> <p>The <tt class="docutils literal"><span class="pre">wraps</span></tt> implementation for Python 2.4 is a no-op. It does not attempt to copy the docstring or other details from the original function to the wrapped function.</p> </div> <div class="section" id="md5"> <h4>md5<a class="headerlink" href="#md5" title="Permalink to this headline">¶</a></h4> <p><tt class="xref py py-mod docutils literal"><span class="pre">hashlib</span></tt> is available for Python 2.4, but it is not part of the standard base. If it is installed, it will be used. If you are doing something fancy with MD5 sums, you may need to determine which object is in use, since they are not equivalent. For the majority of simple cases – finding the MD5 sum of a string – they are equivalent enough.</p> </div> <div class="section" id="mutablemapping"> <h4>MutableMapping<a class="headerlink" href="#mutablemapping" title="Permalink to this headline">¶</a></h4> <p><tt class="xref py py-class docutils literal"><span class="pre">collections.MutableMapping</span></tt> provides a subset of the functionality of <tt class="xref py py-class docutils literal"><span class="pre">UserDict.DictMixin</span></tt>; that is, any object that is written to work with <tt class="docutils literal"><span class="pre">MutableMapping</span></tt> will also work with <tt class="docutils literal"><span class="pre">DictMixin</span></tt>, so you should write classes with <tt class="docutils literal"><span class="pre">MutableMapping</span></tt> in mind.</p> <p><tt class="xref py py-class docutils literal"><span class="pre">collections.MutableMapping</span></tt> is available in Python 2.6+, and will be used if available.</p> </div> </div> <div class="section" id="other-symbols"> <h3>Other Symbols<a class="headerlink" href="#other-symbols" title="Permalink to this headline">¶</a></h3> <p>The following functions, classes, and symbols are provided for other miscellaneous reasons.</p> <div class="section" id="u-str"> <h4>u_str<a class="headerlink" href="#u-str" title="Permalink to this headline">¶</a></h4> <dl class="function"> <dt id="Bcfg2.Compat.u_str"> <tt class="descclassname">Bcfg2.Compat.</tt><tt class="descname">u_str</tt><big>(</big><em>string</em>, <em>encoding=None</em><big>)</big><a class="reference internal" href="../_modules/Bcfg2/Compat.html#u_str"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#Bcfg2.Compat.u_str" title="Permalink to this definition">¶</a></dt> <dd><p>print to file compatibility</p> </dd></dl> </div> <div class="section" id="b64encode-b64decode"> <h4>b64encode/b64decode<a class="headerlink" href="#b64encode-b64decode" title="Permalink to this headline">¶</a></h4> <p>In Python 2, <tt class="xref py py-func docutils literal"><span class="pre">base64.b64encode()</span></tt> and <tt class="xref py py-func docutils literal"><span class="pre">base64.b64decode()</span></tt> expect strings and return strings. In Python 3, they expect bytes and return bytes. For Python 3, <tt class="docutils literal"><span class="pre">Bcfg2.Compat</span></tt> provides <tt class="docutils literal"><span class="pre">b64encode</span></tt> and <tt class="docutils literal"><span class="pre">b64encode</span></tt> that transparently encode strings into bytes, then decode bytes into strings, so that those functions can be used identically to their use in Python 2.</p> </div> <div class="section" id="cmpmixin"> <h4>CmpMixin<a class="headerlink" href="#cmpmixin" title="Permalink to this headline">¶</a></h4> <dl class="class"> <dt id="Bcfg2.Compat.CmpMixin"> <em class="property">class </em><tt class="descclassname">Bcfg2.Compat.</tt><tt class="descname">CmpMixin</tt><a class="reference internal" href="../_modules/Bcfg2/Compat.html#CmpMixin"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#Bcfg2.Compat.CmpMixin" title="Permalink to this definition">¶</a></dt> <dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">object</span></tt></p> <p>In Py3K, <tt class="xref py py-meth docutils literal"><span class="pre">object.__cmp__()</span></tt> is no longer magical, so this mixin can be used to define the rich comparison operators from <tt class="docutils literal"><span class="pre">__cmp__</span></tt> – i.e., it makes <tt class="docutils literal"><span class="pre">__cmp__</span></tt> magical again.</p> </dd></dl> </div> <div class="section" id="unicode"> <h4>unicode<a class="headerlink" href="#unicode" title="Permalink to this headline">¶</a></h4> <p>In Py3k, the <tt class="xref py py-func docutils literal"><span class="pre">unicode()</span></tt> class is not defined, because all strings are unicode. <tt class="docutils literal"><span class="pre">Bcfg2.Compat</span></tt> defines <tt class="docutils literal"><span class="pre">unicode</span></tt> as equivalent to <tt class="xref py py-func docutils literal"><span class="pre">str()</span></tt> in Python 3.</p> </div> <div class="section" id="oct-mode"> <h4>oct_mode<a class="headerlink" href="#oct-mode" title="Permalink to this headline">¶</a></h4> <dl class="function"> <dt id="Bcfg2.Compat.oct_mode"> <tt class="descclassname">Bcfg2.Compat.</tt><tt class="descname">oct_mode</tt><big>(</big><em>mode</em><big>)</big><a class="reference internal" href="../_modules/Bcfg2/Compat.html#oct_mode"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#Bcfg2.Compat.oct_mode" title="Permalink to this definition">¶</a></dt> <dd><p>Convert a decimal number describing a POSIX permissions mode to a string giving the octal mode. In Python 2, this is a synonym for <tt class="xref py py-func docutils literal"><span class="pre">oct()</span></tt>, but in Python 3 the octal format has changed to <tt class="docutils literal"><span class="pre">0o000</span></tt>, which cannot be used as an octal permissions mode, so we need to strip the ‘o’ from the output. I.e., this function acts like the Python 2 <tt class="xref py py-func docutils literal"><span class="pre">oct()</span></tt> regardless of what version of Python is in use.</p> <table class="docutils field-list" frame="void" rules="none"> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>mode</strong> (<em>int</em>) – The decimal mode to convert to octal</td> </tr> <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">string</td> </tr> </tbody> </table> </dd></dl> </div> </div> </div> </div> </div> </div> </div> <div class="sphinxsidebar"> <div class="sphinxsidebarwrapper"> <h3><a href="../index.html">Table Of Contents</a></h3> <ul> <li><a class="reference internal" href="#">Python Compatibility</a><ul> <li><a class="reference internal" href="#using-bcfg2-compat">Using <tt class="docutils literal"><span class="pre">Bcfg2.Compat</span></tt></a></li> <li><a class="reference internal" href="#bcfg2-compat-symbols">Bcfg2.Compat symbols</a><ul> <li><a class="reference internal" href="#py3k-compatibility-imports">Py3K compatibility imports</a></li> <li><a class="reference internal" href="#python-2-4-compatibility">Python 2.4 compatibility</a><ul> <li><a class="reference internal" href="#walk-packages">walk_packages</a></li> <li><a class="reference internal" href="#wraps">wraps</a></li> <li><a class="reference internal" href="#md5">md5</a></li> <li><a class="reference internal" href="#mutablemapping">MutableMapping</a></li> </ul> </li> <li><a class="reference internal" href="#other-symbols">Other Symbols</a><ul> <li><a class="reference internal" href="#u-str">u_str</a></li> <li><a class="reference internal" href="#b64encode-b64decode">b64encode/b64decode</a></li> <li><a class="reference internal" href="#cmpmixin">CmpMixin</a></li> <li><a class="reference internal" href="#unicode">unicode</a></li> <li><a class="reference internal" href="#oct-mode">oct_mode</a></li> </ul> </li> </ul> </li> </ul> </li> </ul> <h4>Previous topic</h4> <p class="topless"><a href="client-driver.html" title="previous chapter">Writing A Client Tool Driver</a></p> <h4>Next topic</h4> <p class="topless"><a href="core.html" title="next chapter">Server Core Development</a></p> <h3>This Page</h3> <ul class="this-page-menu"> <li><a href="../_sources/development/compat.txt" rel="nofollow">Show Source</a></li> </ul> <div id="searchbox" style="display: none"> <h3>Quick search</h3> <form class="search" action="../search.html" method="get"> <input type="text" name="q" /> <input type="submit" value="Go" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> <p class="searchtip" style="font-size: 90%"> Enter search terms or a module, class or function name. </p> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <div class="clearer"></div> </div> <div class="related"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="../genindex.html" title="General Index" >index</a></li> <li class="right" > <a href="../py-modindex.html" title="Python Module Index" >modules</a> |</li> <li class="right" > <a href="core.html" title="Server Core Development" >next</a> |</li> <li class="right" > <a href="client-driver.html" title="Writing A Client Tool Driver" >previous</a> |</li> <li><a href="../index.html">home</a> | </li> <!--<li><a href="../search.html">search</a> | </li>--> <li><a href="../help/index.html">help</a> | </li> <li><a href="../contents.html">documentation </a> »</li> <li><a href="../contents.html" >Bcfg2 documentation 1.3.0</a> »</li> <li><a href="index.html" >Bcfg2 Development</a> »</li> </ul> </div> <div class="footer"> © Copyright 2009-2013, Narayan Desai. Last updated on Mar 20, 2013. Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3. </div> </body> </html>