Changeset - 5764ebb6040e
[Not reviewed]
0 1 51
Joar Wandborg - 10 years ago 2013-12-17 08:42:53
joar@wandborg.se
Add compiled documentation to tree
52 files changed with 7786 insertions and 0 deletions:
0 comments (0 inline, 0 general)
doc/build/html/.buildinfo
Show inline comments
 
new file 100644
 
# Sphinx build info version 1
 
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
 
config: b1e0a7a37d51c2c1ffe67d5d69a96004
 
tags: 645f666f9bcd5a90fca523b33c5a78b7
doc/build/html/_modules/accounting.html
Show inline comments
 
new file 100644
 
<!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>accounting &mdash; Accounting API 0.1-beta 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:     '0.1-beta',
 
        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>
 
    <link rel="top" title="Accounting API 0.1-beta documentation" href="../index.html" />
 
    <link rel="up" title="Module code" href="index.html" /> 
 
  </head>
 
  <body>
 
    <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><a href="../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="index.html" accesskey="U">Module code</a> &raquo;</li> 
 
      </ul>
 
    </div>  
 

	
 
    <div class="document">
 
      <div class="documentwrapper">
 
        <div class="bodywrapper">
 
          <div class="body">
 
            
 
  <h1>Source code for accounting</h1><div class="highlight"><pre>
 
<span class="kn">import</span> <span class="nn">sys</span>
 
<span class="kn">import</span> <span class="nn">subprocess</span>
 
<span class="kn">import</span> <span class="nn">logging</span>
 
<span class="kn">import</span> <span class="nn">time</span>
 

	
 
<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
 
<span class="kn">from</span> <span class="nn">xml.etree</span> <span class="kn">import</span> <span class="n">ElementTree</span>
 
<span class="kn">from</span> <span class="nn">contextlib</span> <span class="kn">import</span> <span class="n">contextmanager</span>
 

	
 
<span class="kn">from</span> <span class="nn">accounting.models</span> <span class="kn">import</span> <span class="n">Account</span><span class="p">,</span> <span class="n">Transaction</span><span class="p">,</span> <span class="n">Posting</span><span class="p">,</span> <span class="n">Amount</span>
 

	
 
<span class="n">_log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
 

	
 
<div class="viewcode-block" id="Ledger"><a class="viewcode-back" href="../api/accounting.html#accounting.Ledger">[docs]</a><span class="k">class</span> <span class="nc">Ledger</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">ledger_file</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">ledger_bin</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
 
        <span class="k">if</span> <span class="n">ledger_file</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
 
            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">&#39;ledger_file cannot be None&#39;</span><span class="p">)</span>
 

	
 
        <span class="bp">self</span><span class="o">.</span><span class="n">ledger_bin</span> <span class="o">=</span> <span class="n">ledger_bin</span> <span class="ow">or</span> <span class="s">&#39;ledger&#39;</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">ledger_file</span> <span class="o">=</span> <span class="n">ledger_file</span>
 
        <span class="n">_log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&#39;ledger file: </span><span class="si">%s</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">ledger_file</span><span class="p">)</span>
 

	
 
        <span class="bp">self</span><span class="o">.</span><span class="n">locked</span> <span class="o">=</span> <span class="bp">False</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">ledger_process</span> <span class="o">=</span> <span class="bp">None</span>
 

	
 
    <span class="nd">@contextmanager</span>
 
<div class="viewcode-block" id="Ledger.locked_process"><a class="viewcode-back" href="../api/accounting.html#accounting.Ledger.locked_process">[docs]</a>    <span class="k">def</span> <span class="nf">locked_process</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 
        <span class="sd">r&#39;&#39;&#39;</span>
 
<span class="sd">        Context manager that checks that the ledger process is not already</span>
 
<span class="sd">        locked, then &quot;locks&quot; the process and yields the process handle and</span>
 
<span class="sd">        unlocks the process when execution is returned.</span>
 

	
 
<span class="sd">        Since this decorated as a :func:`contextlib.contextmanager` the</span>
 
<span class="sd">        recommended use is with the ``with``-statement.</span>
 

	
 
<span class="sd">        .. code-block:: python</span>
 

	
 
<span class="sd">            with self.locked_process() as p:</span>
 
<span class="sd">                p.stdin.write(b&#39;bal\n&#39;)</span>
 

	
 
<span class="sd">                output = self.read_until_prompt(p)</span>
 

	
 
<span class="sd">        &#39;&#39;&#39;</span>
 
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">locked</span><span class="p">:</span>
 
            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s">&#39;The process has already been locked,&#39;</span>
 
                               <span class="s">&#39; something</span><span class="se">\&#39;</span><span class="s">s out of order.&#39;</span><span class="p">)</span>
 

	
 
            <span class="c"># XXX: This code has no purpose in a single-threaded process</span>
 
            <span class="n">timeout</span> <span class="o">=</span> <span class="mi">5</span>  <span class="c"># Seconds</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="mi">1</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">+</span> <span class="mi">2</span><span class="p">):</span>
 
                <span class="k">if</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="n">timeout</span><span class="p">:</span>
 
                    <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s">&#39;Ledger process is already locked&#39;</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">locked</span><span class="p">:</span>
 
                    <span class="k">break</span>
 
                <span class="k">else</span><span class="p">:</span>
 
                    <span class="n">_log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&#39;Waiting for one second... </span><span class="si">%d</span><span class="s">/</span><span class="si">%d</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
 
                    <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
 

	
 
        <span class="n">process</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_process</span><span class="p">()</span>
 

	
 
        <span class="bp">self</span><span class="o">.</span><span class="n">locked</span> <span class="o">=</span> <span class="bp">True</span>
 
        <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Lock enabled&#39;</span><span class="p">)</span>
 

	
 
        <span class="k">yield</span> <span class="n">process</span>
 

	
 
        <span class="bp">self</span><span class="o">.</span><span class="n">locked</span> <span class="o">=</span> <span class="bp">False</span>
 
        <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Lock disabled&#39;</span><span class="p">)</span>
 
</div>
 
<div class="viewcode-block" id="Ledger.assemble_arguments"><a class="viewcode-back" href="../api/accounting.html#accounting.Ledger.assemble_arguments">[docs]</a>    <span class="k">def</span> <span class="nf">assemble_arguments</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 
        <span class="sd">&#39;&#39;&#39;</span>
 
<span class="sd">        Returns a list of arguments suitable for :class:`subprocess.Popen` based on</span>
 
<span class="sd">        :attr:`self.ledger_bin` and :attr:`self.ledger_file`.</span>
 
<span class="sd">        &#39;&#39;&#39;</span>
 
        <span class="k">return</span> <span class="p">[</span>
 
            <span class="bp">self</span><span class="o">.</span><span class="n">ledger_bin</span><span class="p">,</span>
 
            <span class="s">&#39;-f&#39;</span><span class="p">,</span>
 
            <span class="bp">self</span><span class="o">.</span><span class="n">ledger_file</span><span class="p">,</span>
 
        <span class="p">]</span>
 
</div>
 
<div class="viewcode-block" id="Ledger.init_process"><a class="viewcode-back" href="../api/accounting.html#accounting.Ledger.init_process">[docs]</a>    <span class="k">def</span> <span class="nf">init_process</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 
        <span class="sd">&#39;&#39;&#39;</span>
 
<span class="sd">        Creates a new (presumably) ledger subprocess based on the args from</span>
 
<span class="sd">        :meth:`Ledger.assemble_arguments()` and then runs</span>
 
<span class="sd">        :meth:`Ledger.read_until_prompt()` once (which should return the banner</span>
 
<span class="sd">        text) and discards the output.</span>
 
<span class="sd">        &#39;&#39;&#39;</span>
 
        <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Starting ledger process...&#39;</span><span class="p">)</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">ledger_process</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">(</span>
 
            <span class="bp">self</span><span class="o">.</span><span class="n">assemble_arguments</span><span class="p">(),</span>
 
            <span class="n">stdout</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span>
 
            <span class="n">stdin</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span>
 
            <span class="n">stderr</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">)</span>
 

	
 
        <span class="c"># Swallow the banner</span>
 
        <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">locked_process</span><span class="p">()</span> <span class="k">as</span> <span class="n">p</span><span class="p">:</span>
 
            <span class="bp">self</span><span class="o">.</span><span class="n">read_until_prompt</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
 

	
 
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">ledger_process</span>
 
</div>
 
<div class="viewcode-block" id="Ledger.get_process"><a class="viewcode-back" href="../api/accounting.html#accounting.Ledger.get_process">[docs]</a>    <span class="k">def</span> <span class="nf">get_process</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 
        <span class="sd">&#39;&#39;&#39;</span>
 
<span class="sd">        Returns :attr:`self.ledger_process` if it evaluates to ``True``. If</span>
 
<span class="sd">        :attr:`self.ledger_process` is not set the result of</span>
 
<span class="sd">        :meth:`self.init_process() &lt;Ledger.init_process&gt;` is returned.</span>
 
<span class="sd">        &#39;&#39;&#39;</span>
 
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">ledger_process</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">init_process</span><span class="p">()</span>
 
</div>
 
<div class="viewcode-block" id="Ledger.read_until_prompt"><a class="viewcode-back" href="../api/accounting.html#accounting.Ledger.read_until_prompt">[docs]</a>    <span class="k">def</span> <span class="nf">read_until_prompt</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">process</span><span class="p">):</span>
 
        <span class="sd">r&#39;&#39;&#39;</span>
 
<span class="sd">        Reads from the subprocess instance :data:`process` until it finds a</span>
 
<span class="sd">        combination of ``\n]\x20`` (the prompt), then returns the output</span>
 
<span class="sd">        without the prompt.</span>
 
<span class="sd">        &#39;&#39;&#39;</span>
 
        <span class="n">output</span> <span class="o">=</span> <span class="n">b</span><span class="s">&#39;&#39;</span>
 

	
 
        <span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
 
            <span class="n">line</span> <span class="o">=</span> <span class="n">process</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>  <span class="c"># XXX: This is a hack</span>
 

	
 
            <span class="n">output</span> <span class="o">+=</span> <span class="n">line</span>
 

	
 
            <span class="k">if</span> <span class="n">b</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">] &#39;</span> <span class="ow">in</span> <span class="n">output</span><span class="p">:</span>
 
                <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Found prompt!&#39;</span><span class="p">)</span>
 
                <span class="k">break</span>
 

	
 
        <span class="n">output</span> <span class="o">=</span> <span class="n">output</span><span class="p">[:</span><span class="o">-</span><span class="mi">3</span><span class="p">]</span>  <span class="c"># Cut away the prompt</span>
 

	
 
        <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;output: </span><span class="si">%s</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">output</span><span class="p">)</span>
 

	
 
        <span class="k">return</span> <span class="n">output</span>
 
</div>
 
<div class="viewcode-block" id="Ledger.send_command"><a class="viewcode-back" href="../api/accounting.html#accounting.Ledger.send_command">[docs]</a>    <span class="k">def</span> <span class="nf">send_command</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">command</span><span class="p">):</span>
 
        <span class="n">output</span> <span class="o">=</span> <span class="bp">None</span>
 

	
 
        <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">locked_process</span><span class="p">()</span> <span class="k">as</span> <span class="n">p</span><span class="p">:</span>
 
            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
 
                <span class="n">command</span> <span class="o">=</span> <span class="n">command</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&#39;utf8&#39;</span><span class="p">)</span>
 

	
 
            <span class="n">p</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">command</span> <span class="o">+</span> <span class="n">b</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">)</span>
 
            <span class="n">p</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
 

	
 
            <span class="n">output</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">read_until_prompt</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
 

	
 
            <span class="bp">self</span><span class="o">.</span><span class="n">ledger_process</span><span class="o">.</span><span class="n">send_signal</span><span class="p">(</span><span class="n">subprocess</span><span class="o">.</span><span class="n">signal</span><span class="o">.</span><span class="n">SIGTERM</span><span class="p">)</span>
 
            <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Waiting for ledger to shut down&#39;</span><span class="p">)</span>
 
            <span class="bp">self</span><span class="o">.</span><span class="n">ledger_process</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
 
            <span class="bp">self</span><span class="o">.</span><span class="n">ledger_process</span> <span class="o">=</span> <span class="bp">None</span>
 

	
 
            <span class="k">return</span> <span class="n">output</span>
 
</div>
 
<div class="viewcode-block" id="Ledger.add_transaction"><a class="viewcode-back" href="../api/accounting.html#accounting.Ledger.add_transaction">[docs]</a>    <span class="k">def</span> <span class="nf">add_transaction</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">transaction</span><span class="p">):</span>
 
        <span class="sd">&#39;&#39;&#39;</span>
 
<span class="sd">        Writes a transaction to the ledger file by opening it in &#39;ab&#39; mode and</span>
 
<span class="sd">        writing a ledger transaction based on the</span>
 
<span class="sd">        :class:`~accounting.models.Transaction` instance in :data:`transaction`.</span>
 
<span class="sd">        &#39;&#39;&#39;</span>
 
        <span class="k">if</span> <span class="ow">not</span> <span class="n">transaction</span><span class="o">.</span><span class="n">metadata</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;Id&#39;</span><span class="p">):</span>
 
            <span class="n">transaction</span><span class="o">.</span><span class="n">generate_id</span><span class="p">()</span>
 

	
 
        <span class="n">transaction_template</span> <span class="o">=</span> <span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">{date} {t.payee}</span><span class="se">\n</span><span class="s">&#39;</span>
 
                                <span class="s">&#39;{tags}&#39;</span>
 
                                <span class="s">&#39;{postings}&#39;</span><span class="p">)</span>
 

	
 
        <span class="n">metadata_template</span> <span class="o">=</span> <span class="s">&#39;   ;{0}: {1}</span><span class="se">\n</span><span class="s">&#39;</span>
 

	
 
        <span class="c"># TODO: Generate metadata for postings</span>
 
        <span class="n">posting_template</span> <span class="o">=</span> <span class="p">(</span><span class="s">&#39;  {account} {p.amount.symbol}&#39;</span>
 
                            <span class="s">&#39; {p.amount.amount}</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">)</span>
 

	
 
        <span class="n">output</span>  <span class="o">=</span> <span class="n">b</span><span class="s">&#39;&#39;</span>
 

	
 
        <span class="c"># XXX: Even I hardly understands what this does, however I indent it it</span>
 
        <span class="c"># stays unreadable.</span>
 
        <span class="n">output</span> <span class="o">+=</span> <span class="n">transaction_template</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
 
            <span class="n">date</span><span class="o">=</span><span class="n">transaction</span><span class="o">.</span><span class="n">date</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s">&#39;%Y-%m-</span><span class="si">%d</span><span class="s">&#39;</span><span class="p">),</span>
 
            <span class="n">t</span><span class="o">=</span><span class="n">transaction</span><span class="p">,</span>
 
            <span class="n">tags</span><span class="o">=</span><span class="s">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span>
 
                <span class="n">metadata_template</span><span class="o">.</span><span class="n">format</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="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">transaction</span><span class="o">.</span><span class="n">metadata</span><span class="o">.</span><span class="n">items</span><span class="p">()]),</span>
 
            <span class="n">postings</span><span class="o">=</span><span class="s">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">posting_template</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
 
                <span class="n">p</span><span class="o">=</span><span class="n">p</span><span class="p">,</span>
 
                <span class="n">account</span><span class="o">=</span><span class="n">p</span><span class="o">.</span><span class="n">account</span> <span class="o">+</span> <span class="s">&#39; &#39;</span> <span class="o">*</span> <span class="p">(</span>
 
                    <span class="mi">80</span> <span class="o">-</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">account</span><span class="p">)</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">amount</span><span class="o">.</span><span class="n">symbol</span><span class="p">)</span> <span class="o">+</span>
 
                    <span class="nb">len</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">amount</span><span class="o">.</span><span class="n">amount</span><span class="p">))</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">+</span> <span class="mi">2</span><span class="p">)</span>
 
                <span class="p">))</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">transaction</span><span class="o">.</span><span class="n">postings</span>
 
            <span class="p">])</span>
 
        <span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&#39;utf8&#39;</span><span class="p">)</span>
 

	
 
        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ledger_file</span><span class="p">,</span> <span class="s">&#39;ab&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
 
            <span class="n">f</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">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;written to file: </span><span class="si">%s</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">output</span><span class="p">)</span>
 
</div>
 
<div class="viewcode-block" id="Ledger.bal"><a class="viewcode-back" href="../api/accounting.html#accounting.Ledger.bal">[docs]</a>    <span class="k">def</span> <span class="nf">bal</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 
        <span class="n">output</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_command</span><span class="p">(</span><span class="s">&#39;xml&#39;</span><span class="p">)</span>
 

	
 
        <span class="k">if</span> <span class="n">output</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
 
            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s">&#39;bal call returned no output&#39;</span><span class="p">)</span>
 

	
 
        <span class="n">accounts</span> <span class="o">=</span> <span class="p">[]</span>
 

	
 
        <span class="n">xml</span> <span class="o">=</span> <span class="n">ElementTree</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">output</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s">&#39;utf8&#39;</span><span class="p">))</span>
 

	
 
        <span class="n">accounts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_recurse_accounts</span><span class="p">(</span><span class="n">xml</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&#39;./accounts&#39;</span><span class="p">))</span>
 

	
 
        <span class="k">return</span> <span class="n">accounts</span>
 
</div>
 
    <span class="k">def</span> <span class="nf">_recurse_accounts</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">root</span><span class="p">):</span>
 
        <span class="n">accounts</span> <span class="o">=</span> <span class="p">[]</span>
 

	
 
        <span class="k">for</span> <span class="n">account</span> <span class="ow">in</span> <span class="n">root</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="s">&#39;./account&#39;</span><span class="p">):</span>
 
            <span class="n">name</span> <span class="o">=</span> <span class="n">account</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&#39;./fullname&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
 

	
 
            <span class="n">amounts</span> <span class="o">=</span> <span class="p">[]</span>
 

	
 
            <span class="c"># Try to find an account total value, then try to find the account</span>
 
            <span class="c"># balance</span>
 
            <span class="n">account_amounts</span> <span class="o">=</span> <span class="n">account</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span>
 
                <span class="s">&#39;./account-total/balance/amount&#39;</span><span class="p">)</span> <span class="ow">or</span> \
 
                    <span class="n">account</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="s">&#39;./account-amount/amount&#39;</span><span class="p">)</span> <span class="ow">or</span> \
 
                    <span class="n">account</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="s">&#39;./account-total/amount&#39;</span><span class="p">)</span>
 

	
 
            <span class="k">if</span> <span class="n">account_amounts</span><span class="p">:</span>
 
                <span class="k">for</span> <span class="n">amount</span> <span class="ow">in</span> <span class="n">account_amounts</span><span class="p">:</span>
 
                    <span class="n">quantity</span> <span class="o">=</span> <span class="n">amount</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&#39;./quantity&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
 
                    <span class="n">symbol</span> <span class="o">=</span> <span class="n">amount</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&#39;./commodity/symbol&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
 

	
 
                    <span class="n">amounts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Amount</span><span class="p">(</span><span class="n">amount</span><span class="o">=</span><span class="n">quantity</span><span class="p">,</span> <span class="n">symbol</span><span class="o">=</span><span class="n">symbol</span><span class="p">))</span>
 
            <span class="k">else</span><span class="p">:</span>
 
                <span class="n">_log</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s">&#39;Account </span><span class="si">%s</span><span class="s"> does not have any amounts&#39;</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
 

	
 
            <span class="n">accounts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Account</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span>
 
                                    <span class="n">amounts</span><span class="o">=</span><span class="n">amounts</span><span class="p">,</span>
 
                                    <span class="n">accounts</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_recurse_accounts</span><span class="p">(</span><span class="n">account</span><span class="p">)))</span>
 

	
 
        <span class="k">return</span> <span class="n">accounts</span>
 

	
 
<div class="viewcode-block" id="Ledger.reg"><a class="viewcode-back" href="../api/accounting.html#accounting.Ledger.reg">[docs]</a>    <span class="k">def</span> <span class="nf">reg</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 
        <span class="n">output</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_command</span><span class="p">(</span><span class="s">&#39;xml&#39;</span><span class="p">)</span>
 

	
 
        <span class="k">if</span> <span class="n">output</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
 
            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s">&#39;reg call returned no output&#39;</span><span class="p">)</span>
 

	
 
        <span class="n">entries</span> <span class="o">=</span> <span class="p">[]</span>
 

	
 
        <span class="n">reg_xml</span> <span class="o">=</span> <span class="n">ElementTree</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">output</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s">&#39;utf8&#39;</span><span class="p">))</span>
 

	
 
        <span class="k">for</span> <span class="n">transaction</span> <span class="ow">in</span> <span class="n">reg_xml</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="s">&#39;./transactions/transaction&#39;</span><span class="p">):</span>
 
            <span class="n">date</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">transaction</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&#39;./date&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span><span class="p">,</span>
 
                                     <span class="s">&#39;%Y/%m/</span><span class="si">%d</span><span class="s">&#39;</span><span class="p">)</span>
 
            <span class="n">payee</span> <span class="o">=</span> <span class="n">transaction</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&#39;./payee&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
 

	
 
            <span class="n">postings</span> <span class="o">=</span> <span class="p">[]</span>
 

	
 
            <span class="k">for</span> <span class="n">posting</span> <span class="ow">in</span> <span class="n">transaction</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="s">&#39;./postings/posting&#39;</span><span class="p">):</span>
 
                <span class="n">account</span> <span class="o">=</span> <span class="n">posting</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&#39;./account/name&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
 
                <span class="n">amount</span> <span class="o">=</span> <span class="n">posting</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&#39;./post-amount/amount/quantity&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
 
                <span class="n">symbol</span> <span class="o">=</span> <span class="n">posting</span><span class="o">.</span><span class="n">find</span><span class="p">(</span>
 
                    <span class="s">&#39;./post-amount/amount/commodity/symbol&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
 

	
 
                <span class="c"># Get the posting metadata</span>
 
                <span class="n">metadata</span> <span class="o">=</span> <span class="p">{}</span>
 

	
 
                <span class="n">values</span> <span class="o">=</span> <span class="n">posting</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="s">&#39;./metadata/value&#39;</span><span class="p">)</span>
 
                <span class="k">if</span> <span class="n">values</span><span class="p">:</span>
 
                    <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
 
                        <span class="n">key</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;key&#39;</span><span class="p">)</span>
 
                        <span class="n">value</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&#39;./string&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
 

	
 
                        <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;metadata: </span><span class="si">%s</span><span class="s">: </span><span class="si">%s</span><span class="s">&#39;</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">metadata</span><span class="o">.</span><span class="n">update</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">postings</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
 
                    <span class="n">Posting</span><span class="p">(</span><span class="n">account</span><span class="o">=</span><span class="n">account</span><span class="p">,</span>
 
                            <span class="n">metadata</span><span class="o">=</span><span class="n">metadata</span><span class="p">,</span>
 
                            <span class="n">amount</span><span class="o">=</span><span class="n">Amount</span><span class="p">(</span><span class="n">amount</span><span class="o">=</span><span class="n">amount</span><span class="p">,</span> <span class="n">symbol</span><span class="o">=</span><span class="n">symbol</span><span class="p">)))</span>
 

	
 
            <span class="c"># Get the transaction metadata</span>
 
            <span class="n">metadata</span> <span class="o">=</span> <span class="p">{}</span>
 

	
 
            <span class="n">values</span> <span class="o">=</span> <span class="n">transaction</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="s">&#39;./metadata/value&#39;</span><span class="p">)</span>
 
            <span class="k">if</span> <span class="n">values</span><span class="p">:</span>
 
                <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
 
                    <span class="n">key</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;key&#39;</span><span class="p">)</span>
 
                    <span class="n">value</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&#39;./string&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
 

	
 
                    <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;metadata: </span><span class="si">%s</span><span class="s">: </span><span class="si">%s</span><span class="s">&#39;</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">metadata</span><span class="o">.</span><span class="n">update</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"># Add a Transaction instance to the list</span>
 
            <span class="n">entries</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
 
                <span class="n">Transaction</span><span class="p">(</span><span class="n">date</span><span class="o">=</span><span class="n">date</span><span class="p">,</span> <span class="n">payee</span><span class="o">=</span><span class="n">payee</span><span class="p">,</span> <span class="n">postings</span><span class="o">=</span><span class="n">postings</span><span class="p">,</span>
 
                            <span class="n">metadata</span><span class="o">=</span><span class="n">metadata</span><span class="p">))</span>
 

	
 
        <span class="k">return</span> <span class="n">entries</span>
 

	
 
</div></div>
 
<div class="viewcode-block" id="main"><a class="viewcode-back" href="../api/accounting.html#accounting.main">[docs]</a><span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="n">argv</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
 
    <span class="kn">import</span> <span class="nn">argparse</span>
 
    <span class="k">if</span> <span class="n">argv</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
 
        <span class="n">argv</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span>
 

	
 
    <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">()</span>
 
    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&#39;-v&#39;</span><span class="p">,</span> <span class="s">&#39;--verbosity&#39;</span><span class="p">,</span>
 
                        <span class="n">default</span><span class="o">=</span><span class="s">&#39;INFO&#39;</span><span class="p">,</span>
 
                        <span class="n">help</span><span class="o">=</span><span class="p">(</span><span class="s">&#39;Filter logging output. Possible values:&#39;</span> <span class="o">+</span>
 
                        <span class="s">&#39; CRITICAL, ERROR, WARNING, INFO, DEBUG&#39;</span><span class="p">))</span>
 

	
 
    <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
 
    <span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span><span class="n">level</span><span class="o">=</span><span class="nb">getattr</span><span class="p">(</span><span class="n">logging</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">verbosity</span><span class="p">,</span> <span class="s">&#39;INFO&#39;</span><span class="p">))</span>
 
    <span class="n">ledger</span> <span class="o">=</span> <span class="n">Ledger</span><span class="p">(</span><span class="n">ledger_file</span><span class="o">=</span><span class="s">&#39;non-profit-test-data.ledger&#39;</span><span class="p">)</span>
 
    <span class="k">print</span><span class="p">(</span><span class="n">ledger</span><span class="o">.</span><span class="n">bal</span><span class="p">())</span>
 
    <span class="k">print</span><span class="p">(</span><span class="n">ledger</span><span class="o">.</span><span class="n">reg</span><span class="p">())</span>
 

	
 
</div>
 
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
 
    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="n">main</span><span class="p">())</span>
 
</pre></div>
 

	
 
          </div>
 
        </div>
 
      </div>
 
      <div class="sphinxsidebar">
 
        <div class="sphinxsidebarwrapper">
 
<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><a href="../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="index.html" >Module code</a> &raquo;</li> 
 
      </ul>
 
    </div>
 
    <div class="footer">
 
        &copy; Copyright 2013, Joar Wandborg.
 
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.
 
    </div>
 
  </body>
 
</html>
...
 
\ No newline at end of file
doc/build/html/_modules/accounting/client.html
Show inline comments
 
new file 100644
 
<!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>accounting.client &mdash; Accounting API 0.1-beta 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:     '0.1-beta',
 
        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>
 
    <link rel="top" title="Accounting API 0.1-beta documentation" href="../../index.html" />
 
    <link rel="up" title="accounting" href="../accounting.html" /> 
 
  </head>
 
  <body>
 
    <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><a href="../../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="../index.html" >Module code</a> &raquo;</li>
 
          <li><a href="../accounting.html" accesskey="U">accounting</a> &raquo;</li> 
 
      </ul>
 
    </div>  
 

	
 
    <div class="document">
 
      <div class="documentwrapper">
 
        <div class="bodywrapper">
 
          <div class="body">
 
            
 
  <h1>Source code for accounting.client</h1><div class="highlight"><pre>
 
<span class="kn">import</span> <span class="nn">sys</span>
 
<span class="kn">import</span> <span class="nn">argparse</span>
 
<span class="kn">import</span> <span class="nn">json</span>
 
<span class="kn">import</span> <span class="nn">logging</span>
 

	
 
<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
 
<span class="kn">from</span> <span class="nn">decimal</span> <span class="kn">import</span> <span class="n">Decimal</span>
 

	
 
<span class="kn">import</span> <span class="nn">requests</span>
 

	
 
<span class="kn">from</span> <span class="nn">accounting.models</span> <span class="kn">import</span> <span class="n">Transaction</span><span class="p">,</span> <span class="n">Posting</span><span class="p">,</span> <span class="n">Amount</span>
 
<span class="kn">from</span> <span class="nn">accounting.transport</span> <span class="kn">import</span> <span class="n">AccountingDecoder</span><span class="p">,</span> <span class="n">AccountingEncoder</span>
 

	
 
<span class="n">_log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
 

	
 

	
 
<div class="viewcode-block" id="Client"><a class="viewcode-back" href="../../api/accounting.html#accounting.client.Client">[docs]</a><span class="k">class</span> <span class="nc">Client</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">host</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">json_encoder</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
 
                 <span class="n">json_decoder</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">host</span> <span class="o">=</span> <span class="n">host</span> <span class="ow">or</span> <span class="s">&#39;http://localhost:5000&#39;</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">json_encoder</span> <span class="o">=</span> <span class="n">json_encoder</span> <span class="ow">or</span> <span class="n">AccountingEncoder</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">json_decoder</span> <span class="o">=</span> <span class="n">json_decoder</span> <span class="ow">or</span> <span class="n">AccountingDecoder</span>
 

	
 
<div class="viewcode-block" id="Client.get_balance"><a class="viewcode-back" href="../../api/accounting.html#accounting.client.Client.get_balance">[docs]</a>    <span class="k">def</span> <span class="nf">get_balance</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 
        <span class="n">balance</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;/balance&#39;</span><span class="p">)</span>
 
        <span class="k">return</span> <span class="n">balance</span><span class="p">[</span><span class="s">&#39;balance_report&#39;</span><span class="p">]</span>
 
</div>
 
<div class="viewcode-block" id="Client.get"><a class="viewcode-back" href="../../api/accounting.html#accounting.client.Client.get">[docs]</a>    <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">):</span>
 
        <span class="n">response</span> <span class="o">=</span> <span class="n">requests</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">host</span> <span class="o">+</span> <span class="n">path</span><span class="p">)</span>
 

	
 
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_decode_response</span><span class="p">(</span><span class="n">response</span><span class="p">)</span>
 
</div>
 
    <span class="k">def</span> <span class="nf">_decode_response</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">response</span><span class="p">):</span>
 
        <span class="n">response_data</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">(</span><span class="n">cls</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">json_decoder</span><span class="p">)</span>
 

	
 
        <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;response_data: </span><span class="si">%s</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">response_data</span><span class="p">)</span>
 

	
 
        <span class="k">return</span> <span class="n">response_data</span>
 

	
 
<div class="viewcode-block" id="Client.post"><a class="viewcode-back" href="../../api/accounting.html#accounting.client.Client.post">[docs]</a>    <span class="k">def</span> <span class="nf">post</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">payload</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
 
        <span class="n">kw</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="s">&#39;headers&#39;</span><span class="p">:</span> <span class="p">{</span><span class="s">&#39;Content-Type&#39;</span><span class="p">:</span> <span class="s">&#39;application/json&#39;</span><span class="p">}})</span>
 
        <span class="n">kw</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="s">&#39;data&#39;</span><span class="p">:</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">payload</span><span class="p">,</span> <span class="n">cls</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">json_encoder</span><span class="p">)})</span>
 

	
 
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_decode_response</span><span class="p">(</span><span class="n">requests</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">host</span> <span class="o">+</span> <span class="n">path</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">))</span>
 
</div>
 
<div class="viewcode-block" id="Client.simple_transaction"><a class="viewcode-back" href="../../api/accounting.html#accounting.client.Client.simple_transaction">[docs]</a>    <span class="k">def</span> <span class="nf">simple_transaction</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">from_acc</span><span class="p">,</span> <span class="n">to_acc</span><span class="p">,</span> <span class="n">amount</span><span class="p">):</span>
 
        <span class="n">t</span> <span class="o">=</span> <span class="n">Transaction</span><span class="p">(</span>
 
            <span class="n">date</span><span class="o">=</span><span class="n">datetime</span><span class="o">.</span><span class="n">today</span><span class="p">(),</span>
 
            <span class="n">payee</span><span class="o">=</span><span class="s">&#39;PayPal donation&#39;</span><span class="p">,</span>
 
            <span class="n">postings</span><span class="o">=</span><span class="p">[</span>
 
                <span class="n">Posting</span><span class="p">(</span><span class="n">account</span><span class="o">=</span><span class="n">from_acc</span><span class="p">,</span>
 
                        <span class="n">amount</span><span class="o">=</span><span class="n">Amount</span><span class="p">(</span><span class="n">symbol</span><span class="o">=</span><span class="s">&#39;$&#39;</span><span class="p">,</span> <span class="n">amount</span><span class="o">=-</span><span class="n">amount</span><span class="p">)),</span>
 
                <span class="n">Posting</span><span class="p">(</span><span class="n">account</span><span class="o">=</span><span class="n">to_acc</span><span class="p">,</span>
 
                        <span class="n">amount</span><span class="o">=</span><span class="n">Amount</span><span class="p">(</span><span class="n">symbol</span><span class="o">=</span><span class="s">&#39;$&#39;</span><span class="p">,</span> <span class="n">amount</span><span class="o">=</span><span class="n">amount</span><span class="p">))</span>
 
            <span class="p">]</span>
 
        <span class="p">)</span>
 

	
 
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s">&#39;/transaction&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s">&#39;transactions&#39;</span><span class="p">:</span> <span class="p">[</span><span class="n">t</span><span class="p">]})</span>
 
</div>
 
<div class="viewcode-block" id="Client.get_register"><a class="viewcode-back" href="../../api/accounting.html#accounting.client.Client.get_register">[docs]</a>    <span class="k">def</span> <span class="nf">get_register</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 
        <span class="n">register</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;/register&#39;</span><span class="p">)</span>
 

	
 
        <span class="k">return</span> <span class="n">register</span><span class="p">[</span><span class="s">&#39;register_report&#39;</span><span class="p">]</span>
 

	
 
</div></div>
 
<div class="viewcode-block" id="print_transactions"><a class="viewcode-back" href="../../api/accounting.html#accounting.client.print_transactions">[docs]</a><span class="k">def</span> <span class="nf">print_transactions</span><span class="p">(</span><span class="n">transactions</span><span class="p">):</span>
 
    <span class="k">for</span> <span class="n">transaction</span> <span class="ow">in</span> <span class="n">transactions</span><span class="p">:</span>
 
        <span class="k">print</span><span class="p">(</span><span class="s">&#39;{date} {t.payee:.&lt;69}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
 
            <span class="n">date</span><span class="o">=</span><span class="n">transaction</span><span class="o">.</span><span class="n">date</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s">&#39;%Y-%m-</span><span class="si">%d</span><span class="s">&#39;</span><span class="p">),</span>
 
            <span class="n">t</span><span class="o">=</span><span class="n">transaction</span><span class="p">))</span>
 

	
 
        <span class="k">for</span> <span class="n">posting</span> <span class="ow">in</span> <span class="n">transaction</span><span class="o">.</span><span class="n">postings</span><span class="p">:</span>
 
            <span class="k">print</span><span class="p">(</span><span class="s">&#39; &#39;</span> <span class="o">+</span> <span class="n">posting</span><span class="o">.</span><span class="n">account</span> <span class="o">+</span>
 
                <span class="s">&#39; &#39;</span> <span class="o">*</span> <span class="p">(</span><span class="mi">80</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">posting</span><span class="o">.</span><span class="n">account</span><span class="p">)</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">posting</span><span class="o">.</span><span class="n">amount</span><span class="o">.</span><span class="n">symbol</span><span class="p">)</span> <span class="o">-</span>
 
                        <span class="nb">len</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">posting</span><span class="o">.</span><span class="n">amount</span><span class="o">.</span><span class="n">amount</span><span class="p">))</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span>
 
                <span class="n">posting</span><span class="o">.</span><span class="n">amount</span><span class="o">.</span><span class="n">symbol</span> <span class="o">+</span> <span class="s">&#39; &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">posting</span><span class="o">.</span><span class="n">amount</span><span class="o">.</span><span class="n">amount</span><span class="p">))</span>
 

	
 
</div>
 
<div class="viewcode-block" id="print_balance_accounts"><a class="viewcode-back" href="../../api/accounting.html#accounting.client.print_balance_accounts">[docs]</a><span class="k">def</span> <span class="nf">print_balance_accounts</span><span class="p">(</span><span class="n">accounts</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
 
    <span class="k">for</span> <span class="n">account</span> <span class="ow">in</span> <span class="n">accounts</span><span class="p">:</span>
 
        <span class="k">print</span><span class="p">(</span><span class="s">&#39; &#39;</span> <span class="o">*</span> <span class="n">level</span> <span class="o">+</span> <span class="s">&#39; + {account.name}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">account</span><span class="o">=</span><span class="n">account</span><span class="p">)</span> <span class="o">+</span>
 
              <span class="s">&#39; &#39;</span> <span class="o">+</span> <span class="s">&#39;-&#39;</span> <span class="o">*</span> <span class="p">(</span><span class="mi">80</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">account</span><span class="o">.</span><span class="n">name</span><span class="p">))</span> <span class="o">-</span> <span class="n">level</span><span class="p">))</span>
 
        <span class="k">for</span> <span class="n">amount</span> <span class="ow">in</span> <span class="n">account</span><span class="o">.</span><span class="n">amounts</span><span class="p">:</span>
 
            <span class="k">print</span><span class="p">(</span><span class="s">&#39; &#39;</span> <span class="o">*</span> <span class="n">level</span> <span class="o">+</span> <span class="s">&#39;   {amount.symbol} {amount.amount}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
 
                <span class="n">amount</span><span class="o">=</span><span class="n">amount</span><span class="p">))</span>
 
        <span class="n">print_balance_accounts</span><span class="p">(</span><span class="n">account</span><span class="o">.</span><span class="n">accounts</span><span class="p">,</span> <span class="n">level</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span>
 

	
 
</div>
 
<div class="viewcode-block" id="main"><a class="viewcode-back" href="../../api/accounting.html#accounting.client.main">[docs]</a><span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="n">argv</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">prog</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
 
    <span class="k">global</span> <span class="n">HOST</span>
 
    <span class="k">if</span> <span class="n">argv</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
 
        <span class="n">prog</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
 
        <span class="n">argv</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
 

	
 
    <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">prog</span><span class="o">=</span><span class="n">prog</span><span class="p">)</span>
 
    <span class="n">actions</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_subparsers</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">&#39;Actions&#39;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&#39;action&#39;</span><span class="p">)</span>
 

	
 
    <span class="n">insert</span> <span class="o">=</span> <span class="n">actions</span><span class="o">.</span><span class="n">add_parser</span><span class="p">(</span><span class="s">&#39;insert&#39;</span><span class="p">,</span>
 
                                <span class="n">aliases</span><span class="o">=</span><span class="p">[</span><span class="s">&#39;in&#39;</span><span class="p">])</span>
 
    <span class="n">insert</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&#39;from_account&#39;</span><span class="p">)</span>
 
    <span class="n">insert</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&#39;to_account&#39;</span><span class="p">)</span>
 
    <span class="n">insert</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&#39;amount&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">Decimal</span><span class="p">)</span>
 

	
 
    <span class="n">balance</span> <span class="o">=</span> <span class="n">actions</span><span class="o">.</span><span class="n">add_parser</span><span class="p">(</span><span class="s">&#39;balance&#39;</span><span class="p">,</span> <span class="n">aliases</span><span class="o">=</span><span class="p">[</span><span class="s">&#39;bal&#39;</span><span class="p">])</span>
 

	
 
    <span class="n">register</span> <span class="o">=</span> <span class="n">actions</span><span class="o">.</span><span class="n">add_parser</span><span class="p">(</span><span class="s">&#39;register&#39;</span><span class="p">,</span> <span class="n">aliases</span><span class="o">=</span><span class="p">[</span><span class="s">&#39;reg&#39;</span><span class="p">])</span>
 

	
 
    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&#39;-v&#39;</span><span class="p">,</span> <span class="s">&#39;--verbosity&#39;</span><span class="p">,</span>
 
                        <span class="n">default</span><span class="o">=</span><span class="s">&#39;WARNING&#39;</span><span class="p">,</span>
 
                        <span class="n">help</span><span class="o">=</span><span class="p">(</span><span class="s">&#39;Filter logging output. Possible values:&#39;</span> <span class="o">+</span>
 
                        <span class="s">&#39; CRITICAL, ERROR, WARNING, INFO, DEBUG&#39;</span><span class="p">))</span>
 
    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&#39;--host&#39;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s">&#39;http://localhost:5000&#39;</span><span class="p">)</span>
 

	
 
    <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">(</span><span class="n">argv</span><span class="p">)</span>
 

	
 
    <span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span><span class="n">level</span><span class="o">=</span><span class="nb">getattr</span><span class="p">(</span><span class="n">logging</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">verbosity</span><span class="p">))</span>
 

	
 
    <span class="n">client</span> <span class="o">=</span> <span class="n">Client</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">host</span><span class="p">)</span>
 

	
 
    <span class="k">if</span> <span class="n">args</span><span class="o">.</span><span class="n">action</span> <span class="ow">in</span> <span class="p">[</span><span class="s">&#39;insert&#39;</span><span class="p">,</span> <span class="s">&#39;in&#39;</span><span class="p">]:</span>
 
        <span class="k">print</span><span class="p">(</span><span class="n">client</span><span class="o">.</span><span class="n">simple_transaction</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">from_account</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">to_account</span><span class="p">,</span>
 
                                        <span class="n">args</span><span class="o">.</span><span class="n">amount</span><span class="p">))</span>
 
    <span class="k">elif</span> <span class="n">args</span><span class="o">.</span><span class="n">action</span> <span class="ow">in</span> <span class="p">[</span><span class="s">&#39;balance&#39;</span><span class="p">,</span> <span class="s">&#39;bal&#39;</span><span class="p">]:</span>
 
        <span class="n">print_balance_accounts</span><span class="p">(</span><span class="n">client</span><span class="o">.</span><span class="n">get_balance</span><span class="p">())</span>
 
    <span class="k">elif</span> <span class="n">args</span><span class="o">.</span><span class="n">action</span> <span class="ow">in</span> <span class="p">[</span><span class="s">&#39;register&#39;</span><span class="p">,</span> <span class="s">&#39;reg&#39;</span><span class="p">]:</span>
 
        <span class="n">print_transactions</span><span class="p">(</span><span class="n">client</span><span class="o">.</span><span class="n">get_register</span><span class="p">())</span>
 
    <span class="k">else</span><span class="p">:</span>
 
        <span class="n">parser</span><span class="o">.</span><span class="n">print_help</span><span class="p">()</span>
 
</div>
 
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
 
    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="n">main</span><span class="p">())</span>
 
</pre></div>
 

	
 
          </div>
 
        </div>
 
      </div>
 
      <div class="sphinxsidebar">
 
        <div class="sphinxsidebarwrapper">
 
<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><a href="../../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="../index.html" >Module code</a> &raquo;</li>
 
          <li><a href="../accounting.html" >accounting</a> &raquo;</li> 
 
      </ul>
 
    </div>
 
    <div class="footer">
 
        &copy; Copyright 2013, Joar Wandborg.
 
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.
 
    </div>
 
  </body>
 
</html>
...
 
\ No newline at end of file
doc/build/html/_modules/accounting/decorators.html
Show inline comments
 
new file 100644
 
<!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>accounting.decorators &mdash; Accounting API 0.1-beta 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:     '0.1-beta',
 
        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>
 
    <link rel="top" title="Accounting API 0.1-beta documentation" href="../../index.html" />
 
    <link rel="up" title="accounting" href="../accounting.html" /> 
 
  </head>
 
  <body>
 
    <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><a href="../../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="../index.html" >Module code</a> &raquo;</li>
 
          <li><a href="../accounting.html" accesskey="U">accounting</a> &raquo;</li> 
 
      </ul>
 
    </div>  
 

	
 
    <div class="document">
 
      <div class="documentwrapper">
 
        <div class="bodywrapper">
 
          <div class="body">
 
            
 
  <h1>Source code for accounting.decorators</h1><div class="highlight"><pre>
 
<span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="n">wraps</span>
 

	
 
<span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">jsonify</span>
 

	
 
<span class="kn">from</span> <span class="nn">accounting.exceptions</span> <span class="kn">import</span> <span class="n">AccountingException</span>
 

	
 

	
 
<div class="viewcode-block" id="jsonify_exceptions"><a class="viewcode-back" href="../../api/accounting.html#accounting.decorators.jsonify_exceptions">[docs]</a><span class="k">def</span> <span class="nf">jsonify_exceptions</span><span class="p">(</span><span class="n">func</span><span class="p">):</span>
 
    <span class="sd">&#39;&#39;&#39;</span>
 
<span class="sd">    Wraps a Flask endpoint and catches any AccountingException-based</span>
 
<span class="sd">    exceptions which are returned to the client as JSON.</span>
 
<span class="sd">    &#39;&#39;&#39;</span>
 
    <span class="nd">@wraps</span><span class="p">(</span><span class="n">func</span><span class="p">)</span>
 
    <span class="k">def</span> <span class="nf">wrapper</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
 
        <span class="k">try</span><span class="p">:</span>
 
            <span class="k">return</span> <span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
 
        <span class="k">except</span> <span class="n">AccountingException</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
 
            <span class="k">return</span> <span class="n">jsonify</span><span class="p">(</span><span class="n">error</span><span class="o">=</span><span class="n">exc</span><span class="p">)</span>
 

	
 
    <span class="k">return</span> <span class="n">wrapper</span></div>
 
</pre></div>
 

	
 
          </div>
 
        </div>
 
      </div>
 
      <div class="sphinxsidebar">
 
        <div class="sphinxsidebarwrapper">
 
<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><a href="../../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="../index.html" >Module code</a> &raquo;</li>
 
          <li><a href="../accounting.html" >accounting</a> &raquo;</li> 
 
      </ul>
 
    </div>
 
    <div class="footer">
 
        &copy; Copyright 2013, Joar Wandborg.
 
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.
 
    </div>
 
  </body>
 
</html>
...
 
\ No newline at end of file
doc/build/html/_modules/accounting/exceptions.html
Show inline comments
 
new file 100644
 
<!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>accounting.exceptions &mdash; Accounting API 0.1-beta 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:     '0.1-beta',
 
        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>
 
    <link rel="top" title="Accounting API 0.1-beta documentation" href="../../index.html" />
 
    <link rel="up" title="accounting" href="../accounting.html" /> 
 
  </head>
 
  <body>
 
    <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><a href="../../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="../index.html" >Module code</a> &raquo;</li>
 
          <li><a href="../accounting.html" accesskey="U">accounting</a> &raquo;</li> 
 
      </ul>
 
    </div>  
 

	
 
    <div class="document">
 
      <div class="documentwrapper">
 
        <div class="bodywrapper">
 
          <div class="body">
 
            
 
  <h1>Source code for accounting.exceptions</h1><div class="highlight"><pre>
 
<div class="viewcode-block" id="AccountingException"><a class="viewcode-back" href="../../api/accounting.html#accounting.exceptions.AccountingException">[docs]</a><span class="k">class</span> <span class="nc">AccountingException</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
 
    <span class="sd">&#39;&#39;&#39;</span>
 
<span class="sd">    Used as a base for exceptions that are returned to the caller via the</span>
 
<span class="sd">    jsonify_exceptions decorator</span>
 
<span class="sd">    &#39;&#39;&#39;</span>
 
    <span class="k">pass</span></div>
 
</pre></div>
 

	
 
          </div>
 
        </div>
 
      </div>
 
      <div class="sphinxsidebar">
 
        <div class="sphinxsidebarwrapper">
 
<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><a href="../../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="../index.html" >Module code</a> &raquo;</li>
 
          <li><a href="../accounting.html" >accounting</a> &raquo;</li> 
 
      </ul>
 
    </div>
 
    <div class="footer">
 
        &copy; Copyright 2013, Joar Wandborg.
 
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.
 
    </div>
 
  </body>
 
</html>
...
 
\ No newline at end of file
doc/build/html/_modules/accounting/gtkclient.html
Show inline comments
 
new file 100644
 
<!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>accounting.gtkclient &mdash; Accounting API 0.1-beta 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:     '0.1-beta',
 
        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>
 
    <link rel="top" title="Accounting API 0.1-beta documentation" href="../../index.html" />
 
    <link rel="up" title="accounting" href="../accounting.html" /> 
 
  </head>
 
  <body>
 
    <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><a href="../../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="../index.html" >Module code</a> &raquo;</li>
 
          <li><a href="../accounting.html" accesskey="U">accounting</a> &raquo;</li> 
 
      </ul>
 
    </div>  
 

	
 
    <div class="document">
 
      <div class="documentwrapper">
 
        <div class="bodywrapper">
 
          <div class="body">
 
            
 
  <h1>Source code for accounting.gtkclient</h1><div class="highlight"><pre>
 
<span class="kn">import</span> <span class="nn">sys</span>
 
<span class="kn">import</span> <span class="nn">logging</span>
 
<span class="kn">import</span> <span class="nn">threading</span>
 
<span class="kn">import</span> <span class="nn">pkg_resources</span>
 

	
 
<span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="n">wraps</span>
 
<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
 

	
 
<span class="kn">from</span> <span class="nn">gi.repository</span> <span class="kn">import</span> <span class="n">Gtk</span>
 
<span class="kn">from</span> <span class="nn">gi.repository</span> <span class="kn">import</span> <span class="n">GLib</span>
 
<span class="kn">from</span> <span class="nn">gi.repository</span> <span class="kn">import</span> <span class="n">GObject</span>
 

	
 
<span class="kn">from</span> <span class="nn">accounting.client</span> <span class="kn">import</span> <span class="n">Client</span>
 

	
 
<span class="n">_log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
 

	
 

	
 
<div class="viewcode-block" id="indicate_activity"><a class="viewcode-back" href="../../api/accounting.html#accounting.gtkclient.indicate_activity">[docs]</a><span class="k">def</span> <span class="nf">indicate_activity</span><span class="p">(</span><span class="n">func_or_str</span><span class="p">):</span>
 
    <span class="n">description</span> <span class="o">=</span> <span class="bp">None</span>
 

	
 
    <span class="k">def</span> <span class="nf">decorator</span><span class="p">(</span><span class="n">func</span><span class="p">):</span>
 
        <span class="nd">@wraps</span><span class="p">(</span><span class="n">func</span><span class="p">)</span>
 
        <span class="k">def</span> <span class="nf">wrapper</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
 
            <span class="bp">self</span><span class="o">.</span><span class="n">status_description</span><span class="o">.</span><span class="n">set_text</span><span class="p">(</span><span class="n">description</span><span class="p">)</span>
 
            <span class="bp">self</span><span class="o">.</span><span class="n">activity_indicator</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
 
            <span class="bp">self</span><span class="o">.</span><span class="n">activity_indicator</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
 

	
 
            <span class="k">return</span> <span class="n">func</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
 

	
 
        <span class="k">return</span> <span class="n">wrapper</span>
 

	
 
    <span class="k">if</span> <span class="nb">callable</span><span class="p">(</span><span class="n">func_or_str</span><span class="p">):</span>
 
        <span class="n">description</span> <span class="o">=</span> <span class="s">&#39;Working&#39;</span>
 
        <span class="k">return</span> <span class="n">decorator</span><span class="p">(</span><span class="n">func_or_str</span><span class="p">)</span>
 
    <span class="k">else</span><span class="p">:</span>
 
        <span class="n">description</span> <span class="o">=</span> <span class="n">func_or_str</span>
 
        <span class="k">return</span> <span class="n">decorator</span>
 

	
 
</div>
 
<div class="viewcode-block" id="indicate_activity_done"><a class="viewcode-back" href="../../api/accounting.html#accounting.gtkclient.indicate_activity_done">[docs]</a><span class="k">def</span> <span class="nf">indicate_activity_done</span><span class="p">(</span><span class="n">func</span><span class="p">):</span>
 
    <span class="nd">@wraps</span><span class="p">(</span><span class="n">func</span><span class="p">)</span>
 
    <span class="k">def</span> <span class="nf">wrapper</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">status_description</span><span class="o">.</span><span class="n">set_text</span><span class="p">(</span><span class="s">&#39;&#39;</span><span class="p">)</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">activity_indicator</span><span class="o">.</span><span class="n">stop</span><span class="p">()</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">activity_indicator</span><span class="o">.</span><span class="n">hide</span><span class="p">()</span>
 

	
 
        <span class="k">return</span> <span class="n">func</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
 

	
 
    <span class="k">return</span> <span class="n">wrapper</span>
 

	
 
</div>
 
<div class="viewcode-block" id="AccountingApplication"><a class="viewcode-back" href="../../api/accounting.html#accounting.gtkclient.AccountingApplication">[docs]</a><span class="k">class</span> <span class="nc">AccountingApplication</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="c">#Gtk.Window.__init__(self, title=&#39;Accounting Client&#39;)</span>
 

	
 
        <span class="bp">self</span><span class="o">.</span><span class="n">client</span> <span class="o">=</span> <span class="n">Client</span><span class="p">()</span>
 

	
 
        <span class="bp">self</span><span class="o">.</span><span class="n">load_ui</span><span class="p">(</span><span class="n">pkg_resources</span><span class="o">.</span><span class="n">resource_filename</span><span class="p">(</span>
 
            <span class="s">&#39;accounting&#39;</span><span class="p">,</span> <span class="s">&#39;res/client-ui.glade&#39;</span><span class="p">))</span>
 

	
 
        <span class="bp">self</span><span class="o">.</span><span class="n">aboutdialog</span><span class="o">.</span><span class="n">set_transient_for</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">accounting_window</span><span class="p">)</span>
 

	
 
        <span class="bp">self</span><span class="o">.</span><span class="n">accounting_window</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="s">&#39;delete-event&#39;</span><span class="p">,</span> <span class="n">Gtk</span><span class="o">.</span><span class="n">main_quit</span><span class="p">)</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">accounting_window</span><span class="o">.</span><span class="n">set_border_width</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">accounting_window</span><span class="o">.</span><span class="n">set_default_geometry</span><span class="p">(</span><span class="mi">640</span><span class="p">,</span> <span class="mi">360</span><span class="p">)</span>
 

	
 
        <span class="bp">self</span><span class="o">.</span><span class="n">accounting_window</span><span class="o">.</span><span class="n">show_all</span><span class="p">()</span>
 

	
 
<div class="viewcode-block" id="AccountingApplication.load_ui"><a class="viewcode-back" href="../../api/accounting.html#accounting.gtkclient.AccountingApplication.load_ui">[docs]</a>    <span class="k">def</span> <span class="nf">load_ui</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">):</span>
 
        <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Loading UI...&#39;</span><span class="p">)</span>
 
        <span class="n">builder</span> <span class="o">=</span> <span class="n">Gtk</span><span class="o">.</span><span class="n">Builder</span><span class="p">()</span>
 
        <span class="n">builder</span><span class="o">.</span><span class="n">add_from_file</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
 
        <span class="n">builder</span><span class="o">.</span><span class="n">connect_signals</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
 

	
 
        <span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="n">builder</span><span class="o">.</span><span class="n">get_objects</span><span class="p">():</span>
 
            <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Loaded </span><span class="si">%s</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">Gtk</span><span class="o">.</span><span class="n">Buildable</span><span class="o">.</span><span class="n">get_name</span><span class="p">(</span><span class="n">element</span><span class="p">))</span>
 
            <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">Gtk</span><span class="o">.</span><span class="n">Buildable</span><span class="o">.</span><span class="n">get_name</span><span class="p">(</span><span class="n">element</span><span class="p">),</span> <span class="n">element</span><span class="p">)</span>
 

	
 
        <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;UI loaded&#39;</span><span class="p">)</span>
 
</div>
 
<div class="viewcode-block" id="AccountingApplication.on_transaction_selected"><a class="viewcode-back" href="../../api/accounting.html#accounting.gtkclient.AccountingApplication.on_transaction_selected">[docs]</a>    <span class="k">def</span> <span class="nf">on_transaction_selected</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">widget</span><span class="p">):</span>
 
        <span class="n">selection</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">transaction_view</span><span class="o">.</span><span class="n">get_selection</span><span class="p">()</span>
 
        <span class="n">selection</span><span class="o">.</span><span class="n">set_mode</span><span class="p">(</span><span class="n">Gtk</span><span class="o">.</span><span class="n">SelectionMode</span><span class="o">.</span><span class="n">SINGLE</span><span class="p">)</span>
 
        <span class="n">xact_store</span><span class="p">,</span> <span class="n">xact_iter</span> <span class="o">=</span> <span class="n">selection</span><span class="o">.</span><span class="n">get_selected</span><span class="p">()</span>
 

	
 
        <span class="n">xact_id</span> <span class="o">=</span> <span class="n">xact_store</span><span class="o">.</span><span class="n">get_value</span><span class="p">(</span><span class="n">xact_iter</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
 
        <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;selection: </span><span class="si">%s</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">xact_id</span><span class="p">)</span>
 

	
 
        <span class="k">for</span> <span class="n">transaction</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">transaction_data</span><span class="p">:</span>
 
            <span class="k">if</span> <span class="n">transaction</span><span class="o">.</span><span class="n">id</span> <span class="o">==</span> <span class="n">xact_id</span><span class="p">:</span>
 
                <span class="bp">self</span><span class="o">.</span><span class="n">lbl_payee</span><span class="o">.</span><span class="n">set_text</span><span class="p">(</span><span class="n">transaction</span><span class="o">.</span><span class="n">payee</span><span class="p">)</span>
 

	
 
                <span class="bp">self</span><span class="o">.</span><span class="n">posting_store</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
 

	
 
                <span class="k">for</span> <span class="n">posting</span> <span class="ow">in</span> <span class="n">transaction</span><span class="o">.</span><span class="n">postings</span><span class="p">:</span>
 
                    <span class="bp">self</span><span class="o">.</span><span class="n">posting_store</span><span class="o">.</span><span class="n">append</span><span class="p">([</span>
 
                        <span class="n">posting</span><span class="o">.</span><span class="n">account</span><span class="p">,</span>
 
                        <span class="nb">str</span><span class="p">(</span><span class="n">posting</span><span class="o">.</span><span class="n">amount</span><span class="o">.</span><span class="n">amount</span><span class="p">),</span>
 
                        <span class="n">posting</span><span class="o">.</span><span class="n">amount</span><span class="o">.</span><span class="n">symbol</span>
 
                    <span class="p">])</span>
 

	
 
                <span class="bp">self</span><span class="o">.</span><span class="n">detail_view</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
 
                <span class="k">break</span>
 
</div>
 
<div class="viewcode-block" id="AccountingApplication.on_show_about_activate"><a class="viewcode-back" href="../../api/accounting.html#accounting.gtkclient.AccountingApplication.on_show_about_activate">[docs]</a>    <span class="k">def</span> <span class="nf">on_show_about_activate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">widget</span><span class="p">):</span>
 
        <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Showing About&#39;</span><span class="p">)</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">aboutdialog</span><span class="o">.</span><span class="n">show_all</span><span class="p">()</span>
 
</div>
 
<div class="viewcode-block" id="AccountingApplication.on_aboutdialog_close"><a class="viewcode-back" href="../../api/accounting.html#accounting.gtkclient.AccountingApplication.on_aboutdialog_close">[docs]</a>    <span class="k">def</span> <span class="nf">on_aboutdialog_close</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">widget</span><span class="p">):</span>
 
        <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Closing About&#39;</span><span class="p">)</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">aboutdialog</span><span class="o">.</span><span class="n">hide_all</span><span class="p">()</span>
 
</div>
 
    <span class="nd">@indicate_activity</span><span class="p">(</span><span class="s">&#39;Refreshing Transactions&#39;</span><span class="p">)</span>
 
<div class="viewcode-block" id="AccountingApplication.on_refresh_transactions_activate"><a class="viewcode-back" href="../../api/accounting.html#accounting.gtkclient.AccountingApplication.on_refresh_transactions_activate">[docs]</a>    <span class="k">def</span> <span class="nf">on_refresh_transactions_activate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">widget</span><span class="p">):</span>
 
        <span class="k">def</span> <span class="nf">load_transactions</span><span class="p">():</span>
 
            <span class="n">transactions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">get_register</span><span class="p">()</span>
 
            <span class="n">GLib</span><span class="o">.</span><span class="n">idle_add</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">on_transactions_loaded</span><span class="p">,</span> <span class="n">transactions</span><span class="p">)</span>
 

	
 
        <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">load_transactions</span><span class="p">)</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
 
</div>
 
    <span class="nd">@indicate_activity_done</span>
 
<div class="viewcode-block" id="AccountingApplication.on_transactions_loaded"><a class="viewcode-back" href="../../api/accounting.html#accounting.gtkclient.AccountingApplication.on_transactions_loaded">[docs]</a>    <span class="k">def</span> <span class="nf">on_transactions_loaded</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">transactions</span><span class="p">):</span>
 
        <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;transactions: </span><span class="si">%s</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">transactions</span><span class="p">)</span>
 

	
 
        <span class="bp">self</span><span class="o">.</span><span class="n">transaction_data</span> <span class="o">=</span> <span class="n">transactions</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">transaction_store</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
 

	
 
        <span class="k">for</span> <span class="n">transaction</span> <span class="ow">in</span> <span class="n">transactions</span><span class="p">:</span>
 
            <span class="bp">self</span><span class="o">.</span><span class="n">transaction_store</span><span class="o">.</span><span class="n">append</span><span class="p">([</span>
 
                <span class="n">transaction</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
 
                <span class="n">transaction</span><span class="o">.</span><span class="n">date</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s">&#39;%Y-%m-</span><span class="si">%d</span><span class="s">&#39;</span><span class="p">),</span>
 
                <span class="n">transaction</span><span class="o">.</span><span class="n">payee</span>
 
            <span class="p">])</span>
 

	
 
</div></div>
 
<div class="viewcode-block" id="main"><a class="viewcode-back" href="../../api/accounting.html#accounting.gtkclient.main">[docs]</a><span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="n">argv</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
 
    <span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span><span class="n">level</span><span class="o">=</span><span class="n">logging</span><span class="o">.</span><span class="n">DEBUG</span><span class="p">)</span>
 

	
 
    <span class="n">GObject</span><span class="o">.</span><span class="n">threads_init</span><span class="p">()</span>
 

	
 
    <span class="n">accounting</span> <span class="o">=</span> <span class="n">AccountingApplication</span><span class="p">()</span>
 
    <span class="c">#accounting_win.connect(&#39;delete-event&#39;, Gtk.main_quit)</span>
 

	
 
    <span class="n">Gtk</span><span class="o">.</span><span class="n">main</span><span class="p">()</span>
 
</div>
 
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
 
    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="n">main</span><span class="p">())</span>
 
</pre></div>
 

	
 
          </div>
 
        </div>
 
      </div>
 
      <div class="sphinxsidebar">
 
        <div class="sphinxsidebarwrapper">
 
<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><a href="../../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="../index.html" >Module code</a> &raquo;</li>
 
          <li><a href="../accounting.html" >accounting</a> &raquo;</li> 
 
      </ul>
 
    </div>
 
    <div class="footer">
 
        &copy; Copyright 2013, Joar Wandborg.
 
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.
 
    </div>
 
  </body>
 
</html>
...
 
\ No newline at end of file
doc/build/html/_modules/accounting/models.html
Show inline comments
 
new file 100644
 
<!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>accounting.models &mdash; Accounting API 0.1-beta 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:     '0.1-beta',
 
        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>
 
    <link rel="top" title="Accounting API 0.1-beta documentation" href="../../index.html" />
 
    <link rel="up" title="accounting" href="../accounting.html" /> 
 
  </head>
 
  <body>
 
    <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><a href="../../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="../index.html" >Module code</a> &raquo;</li>
 
          <li><a href="../accounting.html" accesskey="U">accounting</a> &raquo;</li> 
 
      </ul>
 
    </div>  
 

	
 
    <div class="document">
 
      <div class="documentwrapper">
 
        <div class="bodywrapper">
 
          <div class="body">
 
            
 
  <h1>Source code for accounting.models</h1><div class="highlight"><pre>
 
<span class="kn">import</span> <span class="nn">uuid</span>
 
<span class="kn">from</span> <span class="nn">decimal</span> <span class="kn">import</span> <span class="n">Decimal</span>
 

	
 

	
 
<div class="viewcode-block" id="Transaction"><a class="viewcode-back" href="../../api/accounting.html#accounting.models.Transaction">[docs]</a><span class="k">class</span> <span class="nc">Transaction</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">date</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">payee</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">postings</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">metadata</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
 
                 <span class="n">_generate_id</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">date</span> <span class="o">=</span> <span class="n">date</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">payee</span> <span class="o">=</span> <span class="n">payee</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">postings</span> <span class="o">=</span> <span class="n">postings</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">metadata</span> <span class="o">=</span> <span class="n">metadata</span> <span class="k">if</span> <span class="n">metadata</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="k">else</span> <span class="p">{}</span>
 

	
 
        <span class="k">if</span> <span class="n">_generate_id</span><span class="p">:</span>
 
            <span class="bp">self</span><span class="o">.</span><span class="n">generate_id</span><span class="p">()</span>
 

	
 
<div class="viewcode-block" id="Transaction.generate_id"><a class="viewcode-back" href="../../api/accounting.html#accounting.models.Transaction.generate_id">[docs]</a>    <span class="k">def</span> <span class="nf">generate_id</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">metadata</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="s">&#39;Id&#39;</span><span class="p">:</span> <span class="n">uuid</span><span class="o">.</span><span class="n">uuid4</span><span class="p">()})</span>
 
</div>
 
    <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">return</span> <span class="p">(</span><span class="s">&#39;&lt;{self.__class__.__name__} {date}&#39;</span> <span class="o">+</span>
 
                <span class="s">&#39; {self.payee} {self.postings}&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
 
                    <span class="bp">self</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
 
                    <span class="n">date</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">date</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s">&#39;%Y-%m-</span><span class="si">%d</span><span class="s">&#39;</span><span class="p">))</span>
 

	
 
</div>
 
<div class="viewcode-block" id="Posting"><a class="viewcode-back" href="../../api/accounting.html#accounting.models.Posting">[docs]</a><span class="k">class</span> <span class="nc">Posting</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">account</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">amount</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">metadata</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">account</span> <span class="o">=</span> <span class="n">account</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">amount</span> <span class="o">=</span> <span class="n">amount</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">metadata</span> <span class="o">=</span> <span class="n">metadata</span> <span class="k">if</span> <span class="n">metadata</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="k">else</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="k">return</span> <span class="p">(</span><span class="s">&#39;&lt;{self.__class__.__name__} &quot;{self.account}&quot;&#39;</span> <span class="o">+</span>
 
                <span class="s">&#39; {self.amount}&gt;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
 

	
 
</div>
 
<div class="viewcode-block" id="Amount"><a class="viewcode-back" href="../../api/accounting.html#accounting.models.Amount">[docs]</a><span class="k">class</span> <span class="nc">Amount</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">amount</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">symbol</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">amount</span> <span class="o">=</span> <span class="n">Decimal</span><span class="p">(</span><span class="n">amount</span><span class="p">)</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">symbol</span> <span class="o">=</span> <span class="n">symbol</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="k">return</span> <span class="p">(</span><span class="s">&#39;&lt;{self.__class__.__name__} {self.symbol}&#39;</span> <span class="o">+</span>
 
                <span class="s">&#39; {self.amount}&gt;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
 

	
 
</div>
 
<div class="viewcode-block" id="Account"><a class="viewcode-back" href="../../api/accounting.html#accounting.models.Account">[docs]</a><span class="k">class</span> <span class="nc">Account</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">name</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">amounts</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">accounts</span><span class="o">=</span><span class="bp">None</span><span class="p">):</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="bp">self</span><span class="o">.</span><span class="n">amounts</span> <span class="o">=</span> <span class="n">amounts</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">accounts</span> <span class="o">=</span> <span class="n">accounts</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="k">return</span> <span class="p">(</span><span class="s">&#39;&lt;{self.__class__.__name__} &quot;{self.name}&quot; {self.amounts}&#39;</span> <span class="o">+</span>
 
                <span class="s">&#39; {self.accounts}&gt;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span></div>
 
</pre></div>
 

	
 
          </div>
 
        </div>
 
      </div>
 
      <div class="sphinxsidebar">
 
        <div class="sphinxsidebarwrapper">
 
<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><a href="../../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="../index.html" >Module code</a> &raquo;</li>
 
          <li><a href="../accounting.html" >accounting</a> &raquo;</li> 
 
      </ul>
 
    </div>
 
    <div class="footer">
 
        &copy; Copyright 2013, Joar Wandborg.
 
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.
 
    </div>
 
  </body>
 
</html>
...
 
\ No newline at end of file
doc/build/html/_modules/accounting/storage.html
Show inline comments
 
new file 100644
 
<!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>accounting.storage &mdash; Accounting API 0.1-beta 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:     '0.1-beta',
 
        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>
 
    <link rel="top" title="Accounting API 0.1-beta documentation" href="../../index.html" />
 
    <link rel="up" title="accounting" href="../accounting.html" /> 
 
  </head>
 
  <body>
 
    <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><a href="../../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="../index.html" >Module code</a> &raquo;</li>
 
          <li><a href="../accounting.html" accesskey="U">accounting</a> &raquo;</li> 
 
      </ul>
 
    </div>  
 

	
 
    <div class="document">
 
      <div class="documentwrapper">
 
        <div class="bodywrapper">
 
          <div class="body">
 
            
 
  <h1>Source code for accounting.storage</h1><div class="highlight"><pre>
 
<span class="k">class</span> <span class="nc">Storage</span><span class="p">:</span>
 
<div class="viewcode-block" id="Storage"><a class="viewcode-back" href="../../api/accounting.storage.html#accounting.storage.Storage">[docs]</a>    <span class="sd">&#39;&#39;&#39;</span>
 
<span class="sd">    ABC for accounting storage</span>
 
<span class="sd">    &#39;&#39;&#39;</span>
 
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
 
        <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
 

	
 
    <span class="k">def</span> <span class="nf">get_transactions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
 
<div class="viewcode-block" id="Storage.get_transactions"><a class="viewcode-back" href="../../api/accounting.storage.html#accounting.storage.Storage.get_transactions">[docs]</a>        <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
 

	
 
    <span class="k">def</span> <span class="nf">get_transaction</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span></div>
 
<div class="viewcode-block" id="Storage.get_transaction"><a class="viewcode-back" href="../../api/accounting.storage.html#accounting.storage.Storage.get_transaction">[docs]</a>        <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
 

	
 
    <span class="k">def</span> <span class="nf">get_account</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span></div>
 
<div class="viewcode-block" id="Storage.get_account"><a class="viewcode-back" href="../../api/accounting.storage.html#accounting.storage.Storage.get_account">[docs]</a>        <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
 

	
 
    <span class="k">def</span> <span class="nf">get_accounts</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span></div>
 
<div class="viewcode-block" id="Storage.get_accounts"><a class="viewcode-back" href="../../api/accounting.storage.html#accounting.storage.Storage.get_accounts">[docs]</a>        <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
 
</pre></div></div></div>
 

	
 
          </div>
 
        </div>
 
      </div>
 
      <div class="sphinxsidebar">
 
        <div class="sphinxsidebarwrapper">
 
<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><a href="../../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="../index.html" >Module code</a> &raquo;</li>
 
          <li><a href="../accounting.html" >accounting</a> &raquo;</li> 
 
      </ul>
 
    </div>
 
    <div class="footer">
 
        &copy; Copyright 2013, Joar Wandborg.
 
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.
 
    </div>
 
  </body>
 
</html>
...
 
\ No newline at end of file
doc/build/html/_modules/accounting/storage/ledgercli.html
Show inline comments
 
new file 100644
 
<!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>accounting.storage.ledgercli &mdash; Accounting API 0.1-beta 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:     '0.1-beta',
 
        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>
 
    <link rel="top" title="Accounting API 0.1-beta documentation" href="../../../index.html" />
 
    <link rel="up" title="accounting.storage" href="../storage.html" /> 
 
  </head>
 
  <body>
 
    <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><a href="../../../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="../../index.html" >Module code</a> &raquo;</li>
 
          <li><a href="../../accounting.html" >accounting</a> &raquo;</li>
 
          <li><a href="../storage.html" accesskey="U">accounting.storage</a> &raquo;</li> 
 
      </ul>
 
    </div>  
 

	
 
    <div class="document">
 
      <div class="documentwrapper">
 
        <div class="bodywrapper">
 
          <div class="body">
 
            
 
  <h1>Source code for accounting.storage.ledgercli</h1><div class="highlight"><pre>
 
<span class="kn">import</span> <span class="nn">sys</span>
 
<span class="kn">import</span> <span class="nn">subprocess</span>
 
<span class="kn">import</span> <span class="nn">logging</span>
 
<span class="kn">import</span> <span class="nn">time</span>
 

	
 
<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
 
<span class="kn">from</span> <span class="nn">xml.etree</span> <span class="kn">import</span> <span class="n">ElementTree</span>
 
<span class="kn">from</span> <span class="nn">contextlib</span> <span class="kn">import</span> <span class="n">contextmanager</span>
 

	
 
<span class="kn">from</span> <span class="nn">accounting.models</span> <span class="kn">import</span> <span class="n">Account</span><span class="p">,</span> <span class="n">Transaction</span><span class="p">,</span> <span class="n">Posting</span><span class="p">,</span> <span class="n">Amount</span>
 
<span class="kn">from</span> <span class="nn">accounting.storage</span> <span class="kn">import</span> <span class="n">Storage</span>
 

	
 
<span class="n">_log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
 

	
 

	
 
<div class="viewcode-block" id="Ledger"><a class="viewcode-back" href="../../../api/accounting.storage.html#accounting.storage.ledgercli.Ledger">[docs]</a><span class="k">class</span> <span class="nc">Ledger</span><span class="p">(</span><span class="n">Storage</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">app</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">ledger_file</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">ledger_bin</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
 
        <span class="k">if</span> <span class="n">app</span><span class="p">:</span>
 
            <span class="n">ledger_file</span> <span class="o">=</span> <span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s">&#39;LEDGER_FILE&#39;</span><span class="p">]</span>
 

	
 
        <span class="k">if</span> <span class="n">ledger_file</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
 
            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">&#39;ledger_file cannot be None&#39;</span><span class="p">)</span>
 

	
 
        <span class="bp">self</span><span class="o">.</span><span class="n">ledger_bin</span> <span class="o">=</span> <span class="n">ledger_bin</span> <span class="ow">or</span> <span class="s">&#39;ledger&#39;</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">ledger_file</span> <span class="o">=</span> <span class="n">ledger_file</span>
 
        <span class="n">_log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&#39;ledger file: </span><span class="si">%s</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">ledger_file</span><span class="p">)</span>
 

	
 
        <span class="bp">self</span><span class="o">.</span><span class="n">locked</span> <span class="o">=</span> <span class="bp">False</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">ledger_process</span> <span class="o">=</span> <span class="bp">None</span>
 

	
 
    <span class="nd">@contextmanager</span>
 
<div class="viewcode-block" id="Ledger.locked_process"><a class="viewcode-back" href="../../../api/accounting.storage.html#accounting.storage.ledgercli.Ledger.locked_process">[docs]</a>    <span class="k">def</span> <span class="nf">locked_process</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 
        <span class="sd">r&#39;&#39;&#39;</span>
 
<span class="sd">        Context manager that checks that the ledger process is not already</span>
 
<span class="sd">        locked, then &quot;locks&quot; the process and yields the process handle and</span>
 
<span class="sd">        unlocks the process when execution is returned.</span>
 

	
 
<span class="sd">        Since this decorated as a :func:`contextlib.contextmanager` the</span>
 
<span class="sd">        recommended use is with the ``with``-statement.</span>
 

	
 
<span class="sd">        .. code-block:: python</span>
 

	
 
<span class="sd">            with self.locked_process() as p:</span>
 
<span class="sd">                p.stdin.write(b&#39;bal\n&#39;)</span>
 

	
 
<span class="sd">                output = self.read_until_prompt(p)</span>
 

	
 
<span class="sd">        &#39;&#39;&#39;</span>
 
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">locked</span><span class="p">:</span>
 
            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s">&#39;The process has already been locked,&#39;</span>
 
                               <span class="s">&#39; something</span><span class="se">\&#39;</span><span class="s">s out of order.&#39;</span><span class="p">)</span>
 

	
 
            <span class="c"># XXX: This code has no purpose in a single-threaded process</span>
 
            <span class="n">timeout</span> <span class="o">=</span> <span class="mi">5</span>  <span class="c"># Seconds</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="mi">1</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">+</span> <span class="mi">2</span><span class="p">):</span>
 
                <span class="k">if</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="n">timeout</span><span class="p">:</span>
 
                    <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s">&#39;Ledger process is already locked&#39;</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">locked</span><span class="p">:</span>
 
                    <span class="k">break</span>
 
                <span class="k">else</span><span class="p">:</span>
 
                    <span class="n">_log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&#39;Waiting for one second... </span><span class="si">%d</span><span class="s">/</span><span class="si">%d</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
 
                    <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
 

	
 
        <span class="n">process</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_process</span><span class="p">()</span>
 

	
 
        <span class="bp">self</span><span class="o">.</span><span class="n">locked</span> <span class="o">=</span> <span class="bp">True</span>
 
        <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Lock enabled&#39;</span><span class="p">)</span>
 

	
 
        <span class="k">yield</span> <span class="n">process</span>
 

	
 
        <span class="bp">self</span><span class="o">.</span><span class="n">locked</span> <span class="o">=</span> <span class="bp">False</span>
 
        <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Lock disabled&#39;</span><span class="p">)</span>
 
</div>
 
<div class="viewcode-block" id="Ledger.assemble_arguments"><a class="viewcode-back" href="../../../api/accounting.storage.html#accounting.storage.ledgercli.Ledger.assemble_arguments">[docs]</a>    <span class="k">def</span> <span class="nf">assemble_arguments</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 
        <span class="sd">&#39;&#39;&#39;</span>
 
<span class="sd">        Returns a list of arguments suitable for :class:`subprocess.Popen`</span>
 
<span class="sd">        based on :attr:`self.ledger_bin` and :attr:`self.ledger_file`.</span>
 
<span class="sd">        &#39;&#39;&#39;</span>
 
        <span class="k">return</span> <span class="p">[</span>
 
            <span class="bp">self</span><span class="o">.</span><span class="n">ledger_bin</span><span class="p">,</span>
 
            <span class="s">&#39;-f&#39;</span><span class="p">,</span>
 
            <span class="bp">self</span><span class="o">.</span><span class="n">ledger_file</span><span class="p">,</span>
 
        <span class="p">]</span>
 
</div>
 
<div class="viewcode-block" id="Ledger.init_process"><a class="viewcode-back" href="../../../api/accounting.storage.html#accounting.storage.ledgercli.Ledger.init_process">[docs]</a>    <span class="k">def</span> <span class="nf">init_process</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 
        <span class="sd">&#39;&#39;&#39;</span>
 
<span class="sd">        Creates a new (presumably) ledger subprocess based on the args from</span>
 
<span class="sd">        :meth:`Ledger.assemble_arguments()` and then runs</span>
 
<span class="sd">        :meth:`Ledger.read_until_prompt()` once (which should return the banner</span>
 
<span class="sd">        text) and discards the output.</span>
 
<span class="sd">        &#39;&#39;&#39;</span>
 
        <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Starting ledger process...&#39;</span><span class="p">)</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">ledger_process</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">(</span>
 
            <span class="bp">self</span><span class="o">.</span><span class="n">assemble_arguments</span><span class="p">(),</span>
 
            <span class="n">stdout</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span>
 
            <span class="n">stdin</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span>
 
            <span class="n">stderr</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">)</span>
 

	
 
        <span class="c"># Swallow the banner</span>
 
        <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">locked_process</span><span class="p">()</span> <span class="k">as</span> <span class="n">p</span><span class="p">:</span>
 
            <span class="bp">self</span><span class="o">.</span><span class="n">read_until_prompt</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
 

	
 
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">ledger_process</span>
 
</div>
 
<div class="viewcode-block" id="Ledger.get_process"><a class="viewcode-back" href="../../../api/accounting.storage.html#accounting.storage.ledgercli.Ledger.get_process">[docs]</a>    <span class="k">def</span> <span class="nf">get_process</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 
        <span class="sd">&#39;&#39;&#39;</span>
 
<span class="sd">        Returns :attr:`self.ledger_process` if it evaluates to ``True``. If</span>
 
<span class="sd">        :attr:`self.ledger_process` is not set the result of</span>
 
<span class="sd">        :meth:`self.init_process() &lt;Ledger.init_process&gt;` is returned.</span>
 
<span class="sd">        &#39;&#39;&#39;</span>
 
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">ledger_process</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">init_process</span><span class="p">()</span>
 
</div>
 
<div class="viewcode-block" id="Ledger.read_until_prompt"><a class="viewcode-back" href="../../../api/accounting.storage.html#accounting.storage.ledgercli.Ledger.read_until_prompt">[docs]</a>    <span class="k">def</span> <span class="nf">read_until_prompt</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">process</span><span class="p">):</span>
 
        <span class="sd">r&#39;&#39;&#39;</span>
 
<span class="sd">        Reads from the subprocess instance :data:`process` until it finds a</span>
 
<span class="sd">        combination of ``\n]\x20`` (the prompt), then returns the output</span>
 
<span class="sd">        without the prompt.</span>
 
<span class="sd">        &#39;&#39;&#39;</span>
 
        <span class="n">output</span> <span class="o">=</span> <span class="n">b</span><span class="s">&#39;&#39;</span>
 

	
 
        <span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
 
            <span class="n">line</span> <span class="o">=</span> <span class="n">process</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>  <span class="c"># XXX: This is a hack</span>
 

	
 
            <span class="n">output</span> <span class="o">+=</span> <span class="n">line</span>
 

	
 
            <span class="k">if</span> <span class="n">b</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">] &#39;</span> <span class="ow">in</span> <span class="n">output</span><span class="p">:</span>
 
                <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Found prompt!&#39;</span><span class="p">)</span>
 
                <span class="k">break</span>
 

	
 
        <span class="n">output</span> <span class="o">=</span> <span class="n">output</span><span class="p">[:</span><span class="o">-</span><span class="mi">3</span><span class="p">]</span>  <span class="c"># Cut away the prompt</span>
 

	
 
        <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;output: </span><span class="si">%s</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">output</span><span class="p">)</span>
 

	
 
        <span class="k">return</span> <span class="n">output</span>
 
</div>
 
<div class="viewcode-block" id="Ledger.send_command"><a class="viewcode-back" href="../../../api/accounting.storage.html#accounting.storage.ledgercli.Ledger.send_command">[docs]</a>    <span class="k">def</span> <span class="nf">send_command</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">command</span><span class="p">):</span>
 
        <span class="n">output</span> <span class="o">=</span> <span class="bp">None</span>
 

	
 
        <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">locked_process</span><span class="p">()</span> <span class="k">as</span> <span class="n">p</span><span class="p">:</span>
 
            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
 
                <span class="n">command</span> <span class="o">=</span> <span class="n">command</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&#39;utf8&#39;</span><span class="p">)</span>
 

	
 
            <span class="n">p</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">command</span> <span class="o">+</span> <span class="n">b</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">)</span>
 
            <span class="n">p</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
 

	
 
            <span class="n">output</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">read_until_prompt</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
 

	
 
            <span class="bp">self</span><span class="o">.</span><span class="n">ledger_process</span><span class="o">.</span><span class="n">send_signal</span><span class="p">(</span><span class="n">subprocess</span><span class="o">.</span><span class="n">signal</span><span class="o">.</span><span class="n">SIGTERM</span><span class="p">)</span>
 
            <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Waiting for ledger to shut down&#39;</span><span class="p">)</span>
 
            <span class="bp">self</span><span class="o">.</span><span class="n">ledger_process</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
 
            <span class="bp">self</span><span class="o">.</span><span class="n">ledger_process</span> <span class="o">=</span> <span class="bp">None</span>
 

	
 
            <span class="k">return</span> <span class="n">output</span>
 
</div>
 
<div class="viewcode-block" id="Ledger.add_transaction"><a class="viewcode-back" href="../../../api/accounting.storage.html#accounting.storage.ledgercli.Ledger.add_transaction">[docs]</a>    <span class="k">def</span> <span class="nf">add_transaction</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">transaction</span><span class="p">):</span>
 
        <span class="sd">&#39;&#39;&#39;</span>
 
<span class="sd">        Writes a transaction to the ledger file by opening it in &#39;ab&#39; mode and</span>
 
<span class="sd">        writing a ledger transaction based on the</span>
 
<span class="sd">        :class:`~accounting.models.Transaction` instance in</span>
 
<span class="sd">        :data:`transaction`.</span>
 
<span class="sd">        &#39;&#39;&#39;</span>
 
        <span class="k">if</span> <span class="ow">not</span> <span class="n">transaction</span><span class="o">.</span><span class="n">metadata</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;Id&#39;</span><span class="p">):</span>
 
            <span class="n">transaction</span><span class="o">.</span><span class="n">generate_id</span><span class="p">()</span>
 

	
 
        <span class="n">transaction_template</span> <span class="o">=</span> <span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">{date} {t.payee}</span><span class="se">\n</span><span class="s">&#39;</span>
 
                                <span class="s">&#39;{tags}&#39;</span>
 
                                <span class="s">&#39;{postings}&#39;</span><span class="p">)</span>
 

	
 
        <span class="n">metadata_template</span> <span class="o">=</span> <span class="s">&#39;   ;{0}: {1}</span><span class="se">\n</span><span class="s">&#39;</span>
 

	
 
        <span class="c"># TODO: Generate metadata for postings</span>
 
        <span class="n">posting_template</span> <span class="o">=</span> <span class="p">(</span><span class="s">&#39;  {account} {p.amount.symbol}&#39;</span>
 
                            <span class="s">&#39; {p.amount.amount}</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">)</span>
 

	
 
        <span class="n">output</span> <span class="o">=</span> <span class="n">b</span><span class="s">&#39;&#39;</span>
 

	
 
        <span class="c"># XXX: Even I hardly understands what this does, however I indent it it</span>
 
        <span class="c"># stays unreadable.</span>
 
        <span class="n">output</span> <span class="o">+=</span> <span class="n">transaction_template</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
 
            <span class="n">date</span><span class="o">=</span><span class="n">transaction</span><span class="o">.</span><span class="n">date</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s">&#39;%Y-%m-</span><span class="si">%d</span><span class="s">&#39;</span><span class="p">),</span>
 
            <span class="n">t</span><span class="o">=</span><span class="n">transaction</span><span class="p">,</span>
 
            <span class="n">tags</span><span class="o">=</span><span class="s">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span>
 
                <span class="n">metadata_template</span><span class="o">.</span><span class="n">format</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="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">transaction</span><span class="o">.</span><span class="n">metadata</span><span class="o">.</span><span class="n">items</span><span class="p">()]),</span>
 
            <span class="n">postings</span><span class="o">=</span><span class="s">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">posting_template</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
 
                <span class="n">p</span><span class="o">=</span><span class="n">p</span><span class="p">,</span>
 
                <span class="n">account</span><span class="o">=</span><span class="n">p</span><span class="o">.</span><span class="n">account</span> <span class="o">+</span> <span class="s">&#39; &#39;</span> <span class="o">*</span> <span class="p">(</span>
 
                    <span class="mi">80</span> <span class="o">-</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">account</span><span class="p">)</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">amount</span><span class="o">.</span><span class="n">symbol</span><span class="p">)</span> <span class="o">+</span>
 
                          <span class="nb">len</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">amount</span><span class="o">.</span><span class="n">amount</span><span class="p">))</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">+</span> <span class="mi">2</span><span class="p">)</span>
 
                <span class="p">))</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">transaction</span><span class="o">.</span><span class="n">postings</span>
 
            <span class="p">])</span>
 
        <span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&#39;utf8&#39;</span><span class="p">)</span>
 

	
 
        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ledger_file</span><span class="p">,</span> <span class="s">&#39;ab&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
 
            <span class="n">f</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">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;written to file: </span><span class="si">%s</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">output</span><span class="p">)</span>
 
</div>
 
<div class="viewcode-block" id="Ledger.bal"><a class="viewcode-back" href="../../../api/accounting.storage.html#accounting.storage.ledgercli.Ledger.bal">[docs]</a>    <span class="k">def</span> <span class="nf">bal</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 
        <span class="n">output</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_command</span><span class="p">(</span><span class="s">&#39;xml&#39;</span><span class="p">)</span>
 

	
 
        <span class="k">if</span> <span class="n">output</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
 
            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s">&#39;bal call returned no output&#39;</span><span class="p">)</span>
 

	
 
        <span class="n">accounts</span> <span class="o">=</span> <span class="p">[]</span>
 

	
 
        <span class="n">xml</span> <span class="o">=</span> <span class="n">ElementTree</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">output</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s">&#39;utf8&#39;</span><span class="p">))</span>
 

	
 
        <span class="n">accounts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_recurse_accounts</span><span class="p">(</span><span class="n">xml</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&#39;./accounts&#39;</span><span class="p">))</span>
 

	
 
        <span class="k">return</span> <span class="n">accounts</span>
 
</div>
 
    <span class="k">def</span> <span class="nf">_recurse_accounts</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">root</span><span class="p">):</span>
 
        <span class="n">accounts</span> <span class="o">=</span> <span class="p">[]</span>
 

	
 
        <span class="k">for</span> <span class="n">account</span> <span class="ow">in</span> <span class="n">root</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="s">&#39;./account&#39;</span><span class="p">):</span>
 
            <span class="n">name</span> <span class="o">=</span> <span class="n">account</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&#39;./fullname&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
 

	
 
            <span class="n">amounts</span> <span class="o">=</span> <span class="p">[]</span>
 

	
 
            <span class="c"># Try to find an account total value, then try to find the account</span>
 
            <span class="c"># balance</span>
 
            <span class="n">account_amounts</span> <span class="o">=</span> <span class="n">account</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span>
 
                <span class="s">&#39;./account-total/balance/amount&#39;</span><span class="p">)</span> <span class="ow">or</span> \
 
                <span class="n">account</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="s">&#39;./account-amount/amount&#39;</span><span class="p">)</span> <span class="ow">or</span> \
 
                <span class="n">account</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="s">&#39;./account-total/amount&#39;</span><span class="p">)</span>
 

	
 
            <span class="k">if</span> <span class="n">account_amounts</span><span class="p">:</span>
 
                <span class="k">for</span> <span class="n">amount</span> <span class="ow">in</span> <span class="n">account_amounts</span><span class="p">:</span>
 
                    <span class="n">quantity</span> <span class="o">=</span> <span class="n">amount</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&#39;./quantity&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
 
                    <span class="n">symbol</span> <span class="o">=</span> <span class="n">amount</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&#39;./commodity/symbol&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
 

	
 
                    <span class="n">amounts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Amount</span><span class="p">(</span><span class="n">amount</span><span class="o">=</span><span class="n">quantity</span><span class="p">,</span> <span class="n">symbol</span><span class="o">=</span><span class="n">symbol</span><span class="p">))</span>
 
            <span class="k">else</span><span class="p">:</span>
 
                <span class="n">_log</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s">&#39;Account </span><span class="si">%s</span><span class="s"> does not have any amounts&#39;</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
 

	
 
            <span class="n">accounts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Account</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span>
 
                                    <span class="n">amounts</span><span class="o">=</span><span class="n">amounts</span><span class="p">,</span>
 
                                    <span class="n">accounts</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_recurse_accounts</span><span class="p">(</span><span class="n">account</span><span class="p">)))</span>
 

	
 
        <span class="k">return</span> <span class="n">accounts</span>
 

	
 
<div class="viewcode-block" id="Ledger.get_transactions"><a class="viewcode-back" href="../../../api/accounting.storage.html#accounting.storage.ledgercli.Ledger.get_transactions">[docs]</a>    <span class="k">def</span> <span class="nf">get_transactions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">reg</span><span class="p">()</span>
 
</div>
 
<div class="viewcode-block" id="Ledger.reg"><a class="viewcode-back" href="../../../api/accounting.storage.html#accounting.storage.ledgercli.Ledger.reg">[docs]</a>    <span class="k">def</span> <span class="nf">reg</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 
        <span class="n">output</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_command</span><span class="p">(</span><span class="s">&#39;xml&#39;</span><span class="p">)</span>
 

	
 
        <span class="k">if</span> <span class="n">output</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
 
            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s">&#39;reg call returned no output&#39;</span><span class="p">)</span>
 

	
 
        <span class="n">entries</span> <span class="o">=</span> <span class="p">[]</span>
 

	
 
        <span class="n">reg_xml</span> <span class="o">=</span> <span class="n">ElementTree</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">output</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s">&#39;utf8&#39;</span><span class="p">))</span>
 

	
 
        <span class="k">for</span> <span class="n">transaction</span> <span class="ow">in</span> <span class="n">reg_xml</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="s">&#39;./transactions/transaction&#39;</span><span class="p">):</span>
 
            <span class="n">date</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">transaction</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&#39;./date&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span><span class="p">,</span>
 
                                     <span class="s">&#39;%Y/%m/</span><span class="si">%d</span><span class="s">&#39;</span><span class="p">)</span>
 
            <span class="n">payee</span> <span class="o">=</span> <span class="n">transaction</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&#39;./payee&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
 

	
 
            <span class="n">postings</span> <span class="o">=</span> <span class="p">[]</span>
 

	
 
            <span class="k">for</span> <span class="n">posting</span> <span class="ow">in</span> <span class="n">transaction</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="s">&#39;./postings/posting&#39;</span><span class="p">):</span>
 
                <span class="n">account</span> <span class="o">=</span> <span class="n">posting</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&#39;./account/name&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
 
                <span class="n">amount</span> <span class="o">=</span> <span class="n">posting</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&#39;./post-amount/amount/quantity&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
 
                <span class="n">symbol</span> <span class="o">=</span> <span class="n">posting</span><span class="o">.</span><span class="n">find</span><span class="p">(</span>
 
                    <span class="s">&#39;./post-amount/amount/commodity/symbol&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
 

	
 
                <span class="c"># Get the posting metadata</span>
 
                <span class="n">metadata</span> <span class="o">=</span> <span class="p">{}</span>
 

	
 
                <span class="n">values</span> <span class="o">=</span> <span class="n">posting</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="s">&#39;./metadata/value&#39;</span><span class="p">)</span>
 
                <span class="k">if</span> <span class="n">values</span><span class="p">:</span>
 
                    <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
 
                        <span class="n">key</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;key&#39;</span><span class="p">)</span>
 
                        <span class="n">value</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&#39;./string&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
 

	
 
                        <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;metadata: </span><span class="si">%s</span><span class="s">: </span><span class="si">%s</span><span class="s">&#39;</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">metadata</span><span class="o">.</span><span class="n">update</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">postings</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
 
                    <span class="n">Posting</span><span class="p">(</span><span class="n">account</span><span class="o">=</span><span class="n">account</span><span class="p">,</span>
 
                            <span class="n">metadata</span><span class="o">=</span><span class="n">metadata</span><span class="p">,</span>
 
                            <span class="n">amount</span><span class="o">=</span><span class="n">Amount</span><span class="p">(</span><span class="n">amount</span><span class="o">=</span><span class="n">amount</span><span class="p">,</span> <span class="n">symbol</span><span class="o">=</span><span class="n">symbol</span><span class="p">)))</span>
 

	
 
            <span class="c"># Get the transaction metadata</span>
 
            <span class="n">metadata</span> <span class="o">=</span> <span class="p">{}</span>
 

	
 
            <span class="n">values</span> <span class="o">=</span> <span class="n">transaction</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="s">&#39;./metadata/value&#39;</span><span class="p">)</span>
 
            <span class="k">if</span> <span class="n">values</span><span class="p">:</span>
 
                <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
 
                    <span class="n">key</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;key&#39;</span><span class="p">)</span>
 
                    <span class="n">value</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&#39;./string&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">text</span>
 

	
 
                    <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;metadata: </span><span class="si">%s</span><span class="s">: </span><span class="si">%s</span><span class="s">&#39;</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">metadata</span><span class="o">.</span><span class="n">update</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"># Add a Transaction instance to the list</span>
 
            <span class="nb">id</span> <span class="o">=</span> <span class="n">metadata</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&#39;Id&#39;</span><span class="p">)</span>
 
            <span class="n">entries</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
 
                <span class="n">Transaction</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="nb">id</span><span class="p">,</span> <span class="n">date</span><span class="o">=</span><span class="n">date</span><span class="p">,</span> <span class="n">payee</span><span class="o">=</span><span class="n">payee</span><span class="p">,</span> <span class="n">postings</span><span class="o">=</span><span class="n">postings</span><span class="p">,</span>
 
                            <span class="n">metadata</span><span class="o">=</span><span class="n">metadata</span><span class="p">))</span>
 

	
 
        <span class="k">return</span> <span class="n">entries</span>
 
</div>
 
<div class="viewcode-block" id="Ledger.update_transaction"><a class="viewcode-back" href="../../../api/accounting.storage.html#accounting.storage.ledgercli.Ledger.update_transaction">[docs]</a>    <span class="k">def</span> <span class="nf">update_transaction</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">transaction</span><span class="p">):</span>
 
        <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;DUMMY: Updated transaction: </span><span class="si">%s</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">transaction</span><span class="p">)</span>
 

	
 
</div></div>
 
<div class="viewcode-block" id="main"><a class="viewcode-back" href="../../../api/accounting.storage.html#accounting.storage.ledgercli.main">[docs]</a><span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="n">argv</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
 
    <span class="kn">import</span> <span class="nn">argparse</span>
 
    <span class="k">if</span> <span class="n">argv</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
 
        <span class="n">argv</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span>
 

	
 
    <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">()</span>
 
    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&#39;-v&#39;</span><span class="p">,</span> <span class="s">&#39;--verbosity&#39;</span><span class="p">,</span>
 
                        <span class="n">default</span><span class="o">=</span><span class="s">&#39;INFO&#39;</span><span class="p">,</span>
 
                        <span class="n">help</span><span class="o">=</span><span class="p">(</span><span class="s">&#39;Filter logging output. Possible values:&#39;</span> <span class="o">+</span>
 
                              <span class="s">&#39; CRITICAL, ERROR, WARNING, INFO, DEBUG&#39;</span><span class="p">))</span>
 

	
 
    <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
 
    <span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span><span class="n">level</span><span class="o">=</span><span class="nb">getattr</span><span class="p">(</span><span class="n">logging</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">verbosity</span><span class="p">,</span> <span class="s">&#39;INFO&#39;</span><span class="p">))</span>
 
    <span class="n">ledger</span> <span class="o">=</span> <span class="n">Ledger</span><span class="p">(</span><span class="n">ledger_file</span><span class="o">=</span><span class="s">&#39;non-profit-test-data.ledger&#39;</span><span class="p">)</span>
 
    <span class="k">print</span><span class="p">(</span><span class="n">ledger</span><span class="o">.</span><span class="n">bal</span><span class="p">())</span>
 
    <span class="k">print</span><span class="p">(</span><span class="n">ledger</span><span class="o">.</span><span class="n">reg</span><span class="p">())</span>
 

	
 
</div>
 
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
 
    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="n">main</span><span class="p">())</span>
 
</pre></div>
 

	
 
          </div>
 
        </div>
 
      </div>
 
      <div class="sphinxsidebar">
 
        <div class="sphinxsidebarwrapper">
 
<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><a href="../../../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="../../index.html" >Module code</a> &raquo;</li>
 
          <li><a href="../../accounting.html" >accounting</a> &raquo;</li>
 
          <li><a href="../storage.html" >accounting.storage</a> &raquo;</li> 
 
      </ul>
 
    </div>
 
    <div class="footer">
 
        &copy; Copyright 2013, Joar Wandborg.
 
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.
 
    </div>
 
  </body>
 
</html>
...
 
\ No newline at end of file
doc/build/html/_modules/accounting/storage/sql.html
Show inline comments
 
new file 100644
 
<!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>accounting.storage.sql &mdash; Accounting API 0.1-beta 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:     '0.1-beta',
 
        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>
 
    <link rel="top" title="Accounting API 0.1-beta documentation" href="../../../index.html" />
 
    <link rel="up" title="accounting.storage" href="../storage.html" /> 
 
  </head>
 
  <body>
 
    <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><a href="../../../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="../../index.html" >Module code</a> &raquo;</li>
 
          <li><a href="../../accounting.html" >accounting</a> &raquo;</li>
 
          <li><a href="../storage.html" accesskey="U">accounting.storage</a> &raquo;</li> 
 
      </ul>
 
    </div>  
 

	
 
    <div class="document">
 
      <div class="documentwrapper">
 
        <div class="bodywrapper">
 
          <div class="body">
 
            
 
  <h1>Source code for accounting.storage.sql</h1><div class="highlight"><pre>
 
<span class="kn">import</span> <span class="nn">logging</span>
 
<span class="kn">import</span> <span class="nn">json</span>
 

	
 
<span class="kn">from</span> <span class="nn">flask.ext.sqlalchemy</span> <span class="kn">import</span> <span class="n">SQLAlchemy</span>
 

	
 
<span class="kn">from</span> <span class="nn">accounting.exceptions</span> <span class="kn">import</span> <span class="n">AccountingException</span>
 
<span class="kn">from</span> <span class="nn">accounting.storage</span> <span class="kn">import</span> <span class="n">Storage</span>
 
<span class="kn">from</span> <span class="nn">accounting.models</span> <span class="kn">import</span> <span class="n">Transaction</span><span class="p">,</span> <span class="n">Posting</span><span class="p">,</span> <span class="n">Amount</span>
 

	
 
<span class="n">_log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
 
<span class="n">db</span> <span class="o">=</span> <span class="bp">None</span>
 

	
 

	
 
<div class="viewcode-block" id="SQLStorage"><a class="viewcode-back" href="../../../api/accounting.storage.sql.html#accounting.storage.sql.SQLStorage">[docs]</a><span class="k">class</span> <span class="nc">SQLStorage</span><span class="p">(</span><span class="n">Storage</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">app</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
 
        <span class="k">global</span> <span class="n">db</span>
 

	
 
        <span class="k">if</span> <span class="ow">not</span> <span class="n">app</span><span class="p">:</span>
 
            <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s">&#39;Missing app keyword argument&#39;</span><span class="p">)</span>
 

	
 
        <span class="bp">self</span><span class="o">.</span><span class="n">app</span> <span class="o">=</span> <span class="n">app</span>
 
        <span class="n">db</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span> <span class="o">=</span> <span class="n">SQLAlchemy</span><span class="p">(</span><span class="n">app</span><span class="p">)</span>
 

	
 
        <span class="kn">from</span> <span class="nn">.models</span> <span class="kn">import</span> <span class="n">Transaction</span> <span class="k">as</span> <span class="n">SQLTransaction</span><span class="p">,</span> \
 
            <span class="n">Posting</span> <span class="k">as</span> <span class="n">SQLPosting</span><span class="p">,</span> <span class="n">Amount</span> <span class="k">as</span> <span class="n">SQLAmount</span>
 

	
 
        <span class="n">db</span><span class="o">.</span><span class="n">create_all</span><span class="p">()</span>
 

	
 
        <span class="bp">self</span><span class="o">.</span><span class="n">Transaction</span> <span class="o">=</span> <span class="n">SQLTransaction</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">Posting</span> <span class="o">=</span> <span class="n">SQLPosting</span>
 
        <span class="bp">self</span><span class="o">.</span><span class="n">Amount</span> <span class="o">=</span> <span class="n">SQLAmount</span>
 

	
 
<div class="viewcode-block" id="SQLStorage.get_transactions"><a class="viewcode-back" href="../../../api/accounting.storage.sql.html#accounting.storage.sql.SQLStorage.get_transactions">[docs]</a>    <span class="k">def</span> <span class="nf">get_transactions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
 
        <span class="n">transactions</span> <span class="o">=</span> <span class="p">[]</span>
 

	
 
        <span class="k">for</span> <span class="n">transaction</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">Transaction</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">all</span><span class="p">():</span>
 
            <span class="n">dict_transaction</span> <span class="o">=</span> <span class="n">transaction</span><span class="o">.</span><span class="n">as_dict</span><span class="p">()</span>
 
            <span class="n">dict_postings</span> <span class="o">=</span> <span class="n">dict_transaction</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&#39;postings&#39;</span><span class="p">)</span>
 

	
 
            <span class="n">postings</span> <span class="o">=</span> <span class="p">[]</span>
 

	
 
            <span class="k">for</span> <span class="n">dict_posting</span> <span class="ow">in</span> <span class="n">dict_postings</span><span class="p">:</span>
 
                <span class="n">dict_amount</span> <span class="o">=</span> <span class="n">dict_posting</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&#39;amount&#39;</span><span class="p">)</span>
 
                <span class="n">posting</span> <span class="o">=</span> <span class="n">Posting</span><span class="p">(</span><span class="o">**</span><span class="n">dict_posting</span><span class="p">)</span>
 
                <span class="n">posting</span><span class="o">.</span><span class="n">amount</span> <span class="o">=</span> <span class="n">Amount</span><span class="p">(</span><span class="o">**</span><span class="n">dict_amount</span><span class="p">)</span>
 

	
 
                <span class="n">postings</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">posting</span><span class="p">)</span>
 

	
 
            <span class="n">dict_transaction</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="s">&#39;postings&#39;</span><span class="p">:</span> <span class="n">postings</span><span class="p">})</span>
 

	
 
            <span class="n">transactions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Transaction</span><span class="p">(</span><span class="o">**</span><span class="n">dict_transaction</span><span class="p">))</span>
 

	
 
        <span class="k">return</span> <span class="n">transactions</span>
 
</div>
 
<div class="viewcode-block" id="SQLStorage.update_transaction"><a class="viewcode-back" href="../../../api/accounting.storage.sql.html#accounting.storage.sql.SQLStorage.update_transaction">[docs]</a>    <span class="k">def</span> <span class="nf">update_transaction</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">transaction</span><span class="p">):</span>
 
        <span class="k">if</span> <span class="n">transaction</span><span class="o">.</span><span class="n">id</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
 
            <span class="k">raise</span> <span class="n">AccountingException</span><span class="p">(</span><span class="s">&#39;The transaction id must be set for&#39;</span>
 
                                      <span class="s">&#39; update_transaction calls&#39;</span><span class="p">)</span>
 

	
 
        <span class="n">_log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;DUMMY: Update transaction: </span><span class="si">%s</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">transaction</span><span class="p">)</span>
 
</div>
 
<div class="viewcode-block" id="SQLStorage.add_transaction"><a class="viewcode-back" href="../../../api/accounting.storage.sql.html#accounting.storage.sql.SQLStorage.add_transaction">[docs]</a>    <span class="k">def</span> <span class="nf">add_transaction</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">transaction</span><span class="p">):</span>
 
        <span class="k">if</span> <span class="n">transaction</span><span class="o">.</span><span class="n">id</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
 
            <span class="n">transaction</span><span class="o">.</span><span class="n">generate_id</span><span class="p">()</span>
 

	
 
        <span class="n">_t</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">Transaction</span><span class="p">()</span>
 
        <span class="n">_t</span><span class="o">.</span><span class="n">uuid</span> <span class="o">=</span> <span class="n">transaction</span><span class="o">.</span><span class="n">id</span>
 
        <span class="n">_t</span><span class="o">.</span><span class="n">date</span> <span class="o">=</span> <span class="n">transaction</span><span class="o">.</span><span class="n">date</span>
 
        <span class="n">_t</span><span class="o">.</span><span class="n">payee</span> <span class="o">=</span> <span class="n">transaction</span><span class="o">.</span><span class="n">payee</span>
 
        <span class="n">_t</span><span class="o">.</span><span class="n">meta</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">transaction</span><span class="o">.</span><span class="n">metadata</span><span class="p">)</span>
 

	
 
        <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">_t</span><span class="p">)</span>
 

	
 
        <span class="k">for</span> <span class="n">posting</span> <span class="ow">in</span> <span class="n">transaction</span><span class="o">.</span><span class="n">postings</span><span class="p">:</span>
 
            <span class="n">_p</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">Posting</span><span class="p">()</span>
 
            <span class="n">_p</span><span class="o">.</span><span class="n">transaction_uuid</span> <span class="o">=</span> <span class="n">transaction</span><span class="o">.</span><span class="n">id</span>
 
            <span class="n">_p</span><span class="o">.</span><span class="n">account</span> <span class="o">=</span> <span class="n">posting</span><span class="o">.</span><span class="n">account</span>
 
            <span class="n">_p</span><span class="o">.</span><span class="n">meta</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">posting</span><span class="o">.</span><span class="n">metadata</span><span class="p">)</span>
 
            <span class="n">_p</span><span class="o">.</span><span class="n">amount</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">Amount</span><span class="p">(</span><span class="n">symbol</span><span class="o">=</span><span class="n">posting</span><span class="o">.</span><span class="n">amount</span><span class="o">.</span><span class="n">symbol</span><span class="p">,</span>
 
                                    <span class="n">amount</span><span class="o">=</span><span class="n">posting</span><span class="o">.</span><span class="n">amount</span><span class="o">.</span><span class="n">amount</span><span class="p">)</span>
 

	
 
            <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">_p</span><span class="p">)</span>
 

	
 
        <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span></div></div>
 
</pre></div>
 

	
 
          </div>
 
        </div>
 
      </div>
 
      <div class="sphinxsidebar">
 
        <div class="sphinxsidebarwrapper">
 
<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><a href="../../../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="../../index.html" >Module code</a> &raquo;</li>
 
          <li><a href="../../accounting.html" >accounting</a> &raquo;</li>
 
          <li><a href="../storage.html" >accounting.storage</a> &raquo;</li> 
 
      </ul>
 
    </div>
 
    <div class="footer">
 
        &copy; Copyright 2013, Joar Wandborg.
 
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.
 
    </div>
 
  </body>
 
</html>
...
 
\ No newline at end of file
doc/build/html/_modules/accounting/storage/sql/models.html
Show inline comments
 
new file 100644
 
<!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>accounting.storage.sql.models &mdash; Accounting API 0.1-beta 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:     '0.1-beta',
 
        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>
 
    <link rel="top" title="Accounting API 0.1-beta documentation" href="../../../../index.html" />
 
    <link rel="up" title="accounting.storage.sql" href="../sql.html" /> 
 
  </head>
 
  <body>
 
    <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><a href="../../../../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="../../../index.html" >Module code</a> &raquo;</li>
 
          <li><a href="../../../accounting.html" >accounting</a> &raquo;</li>
 
          <li><a href="../../storage.html" >accounting.storage</a> &raquo;</li>
 
          <li><a href="../sql.html" accesskey="U">accounting.storage.sql</a> &raquo;</li> 
 
      </ul>
 
    </div>  
 

	
 
    <div class="document">
 
      <div class="documentwrapper">
 
        <div class="bodywrapper">
 
          <div class="body">
 
            
 
  <h1>Source code for accounting.storage.sql.models</h1><div class="highlight"><pre>
 
<span class="kn">import</span> <span class="nn">json</span>
 

	
 
<span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">db</span>
 

	
 

	
 
<div class="viewcode-block" id="Transaction"><a class="viewcode-back" href="../../../../api/accounting.storage.sql.html#accounting.storage.sql.models.Transaction">[docs]</a><span class="k">class</span> <span class="nc">Transaction</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
 
    <span class="nb">id</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Integer</span><span class="p">(),</span> <span class="n">primary_key</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
 
    <span class="n">uuid</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">String</span><span class="p">,</span> <span class="n">unique</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">nullable</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
 
    <span class="n">date</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">DateTime</span><span class="p">)</span>
 
    <span class="n">payee</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">String</span><span class="p">())</span>
 
    <span class="n">meta</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">String</span><span class="p">())</span>
 

	
 
<div class="viewcode-block" id="Transaction.as_dict"><a class="viewcode-back" href="../../../../api/accounting.storage.sql.html#accounting.storage.sql.models.Transaction.as_dict">[docs]</a>    <span class="k">def</span> <span class="nf">as_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 
        <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span>
 
            <span class="nb">id</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">uuid</span><span class="p">,</span>
 
            <span class="n">date</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">date</span><span class="p">,</span>
 
            <span class="n">payee</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">payee</span><span class="p">,</span>
 
            <span class="n">postings</span><span class="o">=</span><span class="p">[</span><span class="n">p</span><span class="o">.</span><span class="n">as_dict</span><span class="p">()</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">postings</span><span class="p">],</span>
 
            <span class="n">metadata</span><span class="o">=</span><span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">meta</span><span class="p">)</span>
 
        <span class="p">)</span>
 

	
 
</div></div>
 
<div class="viewcode-block" id="Posting"><a class="viewcode-back" href="../../../../api/accounting.storage.sql.html#accounting.storage.sql.models.Posting">[docs]</a><span class="k">class</span> <span class="nc">Posting</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
 
    <span class="nb">id</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Integer</span><span class="p">(),</span> <span class="n">primary_key</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
 

	
 
    <span class="n">transaction_uuid</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">String</span><span class="p">,</span> <span class="n">db</span><span class="o">.</span><span class="n">ForeignKey</span><span class="p">(</span><span class="s">&#39;transaction.uuid&#39;</span><span class="p">))</span>
 
    <span class="n">transaction</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">relationship</span><span class="p">(</span><span class="s">&#39;Transaction&#39;</span><span class="p">,</span> <span class="n">backref</span><span class="o">=</span><span class="s">&#39;postings&#39;</span><span class="p">)</span>
 

	
 
    <span class="n">account</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">String</span><span class="p">,</span> <span class="n">nullable</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
 

	
 
    <span class="n">amount_id</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Integer</span><span class="p">,</span> <span class="n">db</span><span class="o">.</span><span class="n">ForeignKey</span><span class="p">(</span><span class="s">&#39;amount.id&#39;</span><span class="p">))</span>
 
    <span class="n">amount</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">relationship</span><span class="p">(</span><span class="s">&#39;Amount&#39;</span><span class="p">)</span>
 

	
 
    <span class="n">meta</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">String</span><span class="p">)</span>
 

	
 
<div class="viewcode-block" id="Posting.as_dict"><a class="viewcode-back" href="../../../../api/accounting.storage.sql.html#accounting.storage.sql.models.Posting.as_dict">[docs]</a>    <span class="k">def</span> <span class="nf">as_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 
        <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span>
 
            <span class="n">account</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="p">,</span>
 
            <span class="n">amount</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">amount</span><span class="o">.</span><span class="n">as_dict</span><span class="p">(),</span>
 
            <span class="n">metadata</span><span class="o">=</span><span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">meta</span><span class="p">)</span>
 
        <span class="p">)</span>
 

	
 
</div></div>
 
<div class="viewcode-block" id="Amount"><a class="viewcode-back" href="../../../../api/accounting.storage.sql.html#accounting.storage.sql.models.Amount">[docs]</a><span class="k">class</span> <span class="nc">Amount</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
 
    <span class="nb">id</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Integer</span><span class="p">,</span> <span class="n">primary_key</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
 
    <span class="n">symbol</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">String</span><span class="p">)</span>
 
    <span class="n">amount</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Numeric</span><span class="p">)</span>
 

	
 
<div class="viewcode-block" id="Amount.as_dict"><a class="viewcode-back" href="../../../../api/accounting.storage.sql.html#accounting.storage.sql.models.Amount.as_dict">[docs]</a>    <span class="k">def</span> <span class="nf">as_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 
        <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span>
 
            <span class="n">symbol</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">symbol</span><span class="p">,</span>
 
            <span class="n">amount</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">amount</span>
 
        <span class="p">)</span></div></div>
 
</pre></div>
 

	
 
          </div>
 
        </div>
 
      </div>
 
      <div class="sphinxsidebar">
 
        <div class="sphinxsidebarwrapper">
 
<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><a href="../../../../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="../../../index.html" >Module code</a> &raquo;</li>
 
          <li><a href="../../../accounting.html" >accounting</a> &raquo;</li>
 
          <li><a href="../../storage.html" >accounting.storage</a> &raquo;</li>
 
          <li><a href="../sql.html" >accounting.storage.sql</a> &raquo;</li> 
 
      </ul>
 
    </div>
 
    <div class="footer">
 
        &copy; Copyright 2013, Joar Wandborg.
 
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.
 
    </div>
 
  </body>
 
</html>
...
 
\ No newline at end of file
doc/build/html/_modules/accounting/transport.html
Show inline comments
 
new file 100644
 
<!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>accounting.transport &mdash; Accounting API 0.1-beta 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:     '0.1-beta',
 
        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>
 
    <link rel="top" title="Accounting API 0.1-beta documentation" href="../../index.html" />
 
    <link rel="up" title="accounting" href="../accounting.html" /> 
 
  </head>
 
  <body>
 
    <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><a href="../../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="../index.html" >Module code</a> &raquo;</li>
 
          <li><a href="../accounting.html" accesskey="U">accounting</a> &raquo;</li> 
 
      </ul>
 
    </div>  
 

	
 
    <div class="document">
 
      <div class="documentwrapper">
 
        <div class="bodywrapper">
 
          <div class="body">
 
            
 
  <h1>Source code for accounting.transport</h1><div class="highlight"><pre>
 
<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
 

	
 
<span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">json</span>
 

	
 
<span class="kn">from</span> <span class="nn">accounting.models</span> <span class="kn">import</span> <span class="n">Amount</span><span class="p">,</span> <span class="n">Transaction</span><span class="p">,</span> <span class="n">Posting</span><span class="p">,</span> <span class="n">Account</span>
 

	
 
<div class="viewcode-block" id="AccountingEncoder"><a class="viewcode-back" href="../../api/accounting.html#accounting.transport.AccountingEncoder">[docs]</a><span class="k">class</span> <span class="nc">AccountingEncoder</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">JSONEncoder</span><span class="p">):</span>
 
<div class="viewcode-block" id="AccountingEncoder.default"><a class="viewcode-back" href="../../api/accounting.html#accounting.transport.AccountingEncoder.default">[docs]</a>    <span class="k">def</span> <span class="nf">default</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="nb">isinstance</span><span class="p">(</span><span class="n">o</span><span class="p">,</span> <span class="n">Account</span><span class="p">):</span>
 
            <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span>
 
                <span class="n">__type__</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="n">name</span><span class="o">=</span><span class="n">o</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
 
                <span class="n">amounts</span><span class="o">=</span><span class="n">o</span><span class="o">.</span><span class="n">amounts</span><span class="p">,</span>
 
                <span class="n">accounts</span><span class="o">=</span><span class="n">o</span><span class="o">.</span><span class="n">accounts</span>
 
            <span class="p">)</span>
 
        <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">o</span><span class="p">,</span> <span class="n">Transaction</span><span class="p">):</span>
 
            <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span>
 
                <span class="n">__type__</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="n">date</span><span class="o">=</span><span class="n">o</span><span class="o">.</span><span class="n">date</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s">&#39;%Y-%m-</span><span class="si">%d</span><span class="s">&#39;</span><span class="p">),</span>
 
                <span class="n">payee</span><span class="o">=</span><span class="n">o</span><span class="o">.</span><span class="n">payee</span><span class="p">,</span>
 
                <span class="n">postings</span><span class="o">=</span><span class="n">o</span><span class="o">.</span><span class="n">postings</span><span class="p">,</span>
 
                <span class="n">metadata</span><span class="o">=</span><span class="n">o</span><span class="o">.</span><span class="n">metadata</span>
 
            <span class="p">)</span>
 
        <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">o</span><span class="p">,</span> <span class="n">Posting</span><span class="p">):</span>
 
            <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span>
 
                <span class="n">__type__</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="n">account</span><span class="o">=</span><span class="n">o</span><span class="o">.</span><span class="n">account</span><span class="p">,</span>
 
                <span class="n">amount</span><span class="o">=</span><span class="n">o</span><span class="o">.</span><span class="n">amount</span><span class="p">,</span>
 
                <span class="n">metadata</span><span class="o">=</span><span class="n">o</span><span class="o">.</span><span class="n">metadata</span>
 
            <span class="p">)</span>
 
        <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">o</span><span class="p">,</span> <span class="n">Amount</span><span class="p">):</span>
 
            <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span>
 
                <span class="n">__type__</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="n">amount</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">o</span><span class="o">.</span><span class="n">amount</span><span class="p">),</span>
 
                <span class="n">symbol</span><span class="o">=</span><span class="n">o</span><span class="o">.</span><span class="n">symbol</span>
 
            <span class="p">)</span>
 
        <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">o</span><span class="p">,</span> <span class="ne">Exception</span><span class="p">):</span>
 
            <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span>
 
                <span class="n">__type__</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="n">args</span><span class="o">=</span><span class="n">o</span><span class="o">.</span><span class="n">args</span>
 
            <span class="p">)</span>
 

	
 
        <span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">JSONEncoder</span><span class="o">.</span><span class="n">default</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">o</span><span class="p">)</span>
 
</div></div>
 
<div class="viewcode-block" id="AccountingDecoder"><a class="viewcode-back" href="../../api/accounting.html#accounting.transport.AccountingDecoder">[docs]</a><span class="k">class</span> <span class="nc">AccountingDecoder</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">JSONDecoder</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">json</span><span class="o">.</span><span class="n">JSONDecoder</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">object_hook</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">dict_to_object</span><span class="p">)</span>
 

	
 
<div class="viewcode-block" id="AccountingDecoder.dict_to_object"><a class="viewcode-back" href="../../api/accounting.html#accounting.transport.AccountingDecoder.dict_to_object">[docs]</a>    <span class="k">def</span> <span class="nf">dict_to_object</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">d</span><span class="p">):</span>
 
        <span class="k">if</span> <span class="s">&#39;__type__&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">d</span><span class="p">:</span>
 
            <span class="k">return</span> <span class="n">d</span>
 

	
 
        <span class="n">types</span> <span class="o">=</span> <span class="p">{</span><span class="n">c</span><span class="o">.</span><span class="n">__name__</span> <span class="p">:</span> <span class="n">c</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="p">[</span><span class="n">Amount</span><span class="p">,</span> <span class="n">Transaction</span><span class="p">,</span> <span class="n">Posting</span><span class="p">,</span>
 
                                          <span class="n">Account</span><span class="p">]}</span>
 

	
 
        <span class="n">_type</span> <span class="o">=</span> <span class="n">d</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&#39;__type__&#39;</span><span class="p">)</span>
 

	
 
        <span class="k">if</span> <span class="n">_type</span> <span class="o">==</span> <span class="s">&#39;Transaction&#39;</span><span class="p">:</span>
 
            <span class="n">d</span><span class="p">[</span><span class="s">&#39;date&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="s">&#39;date&#39;</span><span class="p">],</span> <span class="s">&#39;%Y-%m-</span><span class="si">%d</span><span class="s">&#39;</span><span class="p">)</span>
 

	
 
        <span class="k">return</span> <span class="n">types</span><span class="p">[</span><span class="n">_type</span><span class="p">](</span><span class="o">**</span><span class="n">d</span><span class="p">)</span></div></div>
 
</pre></div>
 

	
 
          </div>
 
        </div>
 
      </div>
 
      <div class="sphinxsidebar">
 
        <div class="sphinxsidebarwrapper">
 
<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><a href="../../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="../index.html" >Module code</a> &raquo;</li>
 
          <li><a href="../accounting.html" >accounting</a> &raquo;</li> 
 
      </ul>
 
    </div>
 
    <div class="footer">
 
        &copy; Copyright 2013, Joar Wandborg.
 
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.
 
    </div>
 
  </body>
 
</html>
...
 
\ No newline at end of file
doc/build/html/_modules/accounting/web.html
Show inline comments
 
new file 100644
 
<!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>accounting.web &mdash; Accounting API 0.1-beta 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:     '0.1-beta',
 
        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>
 
    <link rel="top" title="Accounting API 0.1-beta documentation" href="../../index.html" />
 
    <link rel="up" title="accounting" href="../accounting.html" /> 
 
  </head>
 
  <body>
 
    <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><a href="../../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="../index.html" >Module code</a> &raquo;</li>
 
          <li><a href="../accounting.html" accesskey="U">accounting</a> &raquo;</li> 
 
      </ul>
 
    </div>  
 

	
 
    <div class="document">
 
      <div class="documentwrapper">
 
        <div class="bodywrapper">
 
          <div class="body">
 
            
 
  <h1>Source code for accounting.web</h1><div class="highlight"><pre>
 
<span class="sd">&#39;&#39;&#39;</span>
 
<span class="sd">This module contains the high-level webservice logic such as the Flask setup</span>
 
<span class="sd">and the Flask endpoints.</span>
 
<span class="sd">&#39;&#39;&#39;</span>
 
<span class="kn">import</span> <span class="nn">sys</span>
 
<span class="kn">import</span> <span class="nn">logging</span>
 
<span class="kn">import</span> <span class="nn">argparse</span>
 

	
 
<span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">Flask</span><span class="p">,</span> <span class="n">jsonify</span><span class="p">,</span> <span class="n">request</span>
 

	
 
<span class="kn">from</span> <span class="nn">accounting</span> <span class="kn">import</span> <span class="n">Ledger</span>
 
<span class="kn">from</span> <span class="nn">accounting.transport</span> <span class="kn">import</span> <span class="n">AccountingEncoder</span><span class="p">,</span> <span class="n">AccountingDecoder</span>
 
<span class="kn">from</span> <span class="nn">accounting.exceptions</span> <span class="kn">import</span> <span class="n">AccountingException</span>
 
<span class="kn">from</span> <span class="nn">accounting.decorators</span> <span class="kn">import</span> <span class="n">jsonify_exceptions</span>
 

	
 

	
 
<span class="n">app</span> <span class="o">=</span> <span class="n">Flask</span><span class="p">(</span><span class="s">&#39;accounting&#39;</span><span class="p">)</span>
 
<span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">from_pyfile</span><span class="p">(</span><span class="s">&#39;config.py&#39;</span><span class="p">)</span>
 

	
 
<span class="n">ledger</span> <span class="o">=</span> <span class="bp">None</span>
 

	
 
<span class="nd">@app.before_request</span>
 
<div class="viewcode-block" id="init_ledger"><a class="viewcode-back" href="../../api/accounting.html#accounting.web.init_ledger">[docs]</a><span class="k">def</span> <span class="nf">init_ledger</span><span class="p">():</span>
 
    <span class="sd">&#39;&#39;&#39;</span>
 
<span class="sd">    :py:meth:`flask.Flask.before_request`-decorated method that initializes an</span>
 
<span class="sd">    :py:class:`accounting.Ledger` object.</span>
 
<span class="sd">    &#39;&#39;&#39;</span>
 
    <span class="k">global</span> <span class="n">ledger</span>
 
    <span class="n">ledger</span> <span class="o">=</span> <span class="n">Ledger</span><span class="p">(</span><span class="n">ledger_file</span><span class="o">=</span><span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s">&#39;LEDGER_FILE&#39;</span><span class="p">])</span>
 

	
 

	
 
<span class="c"># These will convert output from our internal classes to JSON and back</span></div>
 
<span class="n">app</span><span class="o">.</span><span class="n">json_encoder</span> <span class="o">=</span> <span class="n">AccountingEncoder</span>
 
<span class="n">app</span><span class="o">.</span><span class="n">json_decoder</span> <span class="o">=</span> <span class="n">AccountingDecoder</span>
 

	
 

	
 
<span class="nd">@app.route</span><span class="p">(</span><span class="s">&#39;/&#39;</span><span class="p">)</span>
 
<div class="viewcode-block" id="index"><a class="viewcode-back" href="../../api/accounting.html#accounting.web.index">[docs]</a><span class="k">def</span> <span class="nf">index</span><span class="p">():</span>
 
    <span class="sd">&#39;&#39;&#39; Hello World! &#39;&#39;&#39;</span>
 
    <span class="k">return</span> <span class="s">&#39;Hello World!&#39;</span>
 

	
 
</div>
 
<span class="nd">@app.route</span><span class="p">(</span><span class="s">&#39;/balance&#39;</span><span class="p">)</span>
 
<div class="viewcode-block" id="balance_report"><a class="viewcode-back" href="../../api/accounting.html#accounting.web.balance_report">[docs]</a><span class="k">def</span> <span class="nf">balance_report</span><span class="p">():</span>
 
    <span class="sd">&#39;&#39;&#39;</span>
 
<span class="sd">    Returns the JSON-serialized result of :meth:`accounting.Ledger.bal`</span>
 
<span class="sd">    &#39;&#39;&#39;</span>
 
    <span class="n">report_data</span> <span class="o">=</span> <span class="n">ledger</span><span class="o">.</span><span class="n">bal</span><span class="p">()</span>
 

	
 
    <span class="k">return</span> <span class="n">jsonify</span><span class="p">(</span><span class="n">balance_report</span><span class="o">=</span><span class="n">report_data</span><span class="p">)</span>
 
</div>
 
<span class="nd">@app.route</span><span class="p">(</span><span class="s">&#39;/transaction&#39;</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s">&#39;GET&#39;</span><span class="p">])</span>
 
<div class="viewcode-block" id="transaction_get"><a class="viewcode-back" href="../../api/accounting.html#accounting.web.transaction_get">[docs]</a><span class="k">def</span> <span class="nf">transaction_get</span><span class="p">():</span>
 
    <span class="sd">&#39;&#39;&#39;</span>
 
<span class="sd">    Returns the JSON-serialized output of :meth:`accounting.Ledger.reg`</span>
 
<span class="sd">    &#39;&#39;&#39;</span>
 
    <span class="k">return</span> <span class="n">jsonify</span><span class="p">(</span><span class="n">transactions</span><span class="o">=</span><span class="n">ledger</span><span class="o">.</span><span class="n">reg</span><span class="p">())</span>
 
</div>
 
<span class="nd">@app.route</span><span class="p">(</span><span class="s">&#39;/transaction&#39;</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s">&#39;POST&#39;</span><span class="p">])</span>
 
<span class="nd">@jsonify_exceptions</span>
 
<div class="viewcode-block" id="transaction_post"><a class="viewcode-back" href="../../api/accounting.html#accounting.web.transaction_post">[docs]</a><span class="k">def</span> <span class="nf">transaction_post</span><span class="p">():</span>
 
    <span class="sd">&#39;&#39;&#39;</span>
 
<span class="sd">    REST/JSON endpoint for transactions.</span>
 

	
 
<span class="sd">    Current state:</span>
 

	
 
<span class="sd">    Takes a POST request with a ``transactions`` JSON payload and writes it to</span>
 
<span class="sd">    the ledger file.</span>
 

	
 
<span class="sd">    Requires the ``transactions`` payload to be __type__-annotated:</span>
 

	
 
<span class="sd">    .. code-block:: json</span>
 

	
 
<span class="sd">        {</span>
 
<span class="sd">          &quot;transactions&quot;: [</span>
 
<span class="sd">            {</span>
 
<span class="sd">              &quot;__type__&quot;: &quot;Transaction&quot;,</span>
 
<span class="sd">              &quot;date&quot;: &quot;2013-01-01&quot;,</span>
 
<span class="sd">              &quot;payee&quot;: &quot;Kindly T. Donor&quot;,</span>
 
<span class="sd">              &quot;postings&quot;: [</span>
 
<span class="sd">                {</span>
 
<span class="sd">                  &quot;__type__&quot;: &quot;Posting&quot;,</span>
 
<span class="sd">                  &quot;account&quot;: &quot;Income:Foo:Donation&quot;,</span>
 
<span class="sd">                  &quot;amount&quot;: {</span>
 
<span class="sd">                    &quot;__type__&quot;: &quot;Amount&quot;,</span>
 
<span class="sd">                    &quot;amount&quot;: &quot;-100&quot;,</span>
 
<span class="sd">                    &quot;symbol&quot;: &quot;$&quot;</span>
 
<span class="sd">                  }</span>
 
<span class="sd">                },</span>
 
<span class="sd">                {</span>
 
<span class="sd">                  &quot;__type__&quot;: &quot;Posting&quot;,</span>
 
<span class="sd">                  &quot;account&quot;: &quot;Assets:Checking&quot;,</span>
 
<span class="sd">                  &quot;amount&quot;: {</span>
 
<span class="sd">                    &quot;__type__&quot;: &quot;Amount&quot;,</span>
 
<span class="sd">                    &quot;amount&quot;: &quot;100&quot;,</span>
 
<span class="sd">                    &quot;symbol&quot;: &quot;$&quot;</span>
 
<span class="sd">                  }</span>
 
<span class="sd">                }</span>
 
<span class="sd">              ]</span>
 
<span class="sd">            }</span>
 
<span class="sd">        }</span>
 

	
 
<span class="sd">    becomes::</span>
 

	
 
<span class="sd">        2013-01-01 Kindly T. Donor</span>
 
<span class="sd">          Income:Foo:Donation                                         $ -100</span>
 
<span class="sd">          Assets:Checking                                              $ 100</span>
 
<span class="sd">    &#39;&#39;&#39;</span>
 
    <span class="n">transactions</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">json</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;transactions&#39;</span><span class="p">)</span>
 

	
 
    <span class="k">if</span> <span class="ow">not</span> <span class="n">transactions</span><span class="p">:</span>
 
        <span class="k">raise</span> <span class="n">AccountingException</span><span class="p">(</span><span class="s">&#39;No transaction data provided&#39;</span><span class="p">)</span>
 

	
 
    <span class="k">for</span> <span class="n">transaction</span> <span class="ow">in</span> <span class="n">transactions</span><span class="p">:</span>
 
        <span class="n">ledger</span><span class="o">.</span><span class="n">add_transaction</span><span class="p">(</span><span class="n">transaction</span><span class="p">)</span>
 

	
 
    <span class="k">return</span> <span class="n">jsonify</span><span class="p">(</span><span class="n">foo</span><span class="o">=</span><span class="s">&#39;bar&#39;</span><span class="p">)</span>
 

	
 
</div>
 
<span class="nd">@app.route</span><span class="p">(</span><span class="s">&#39;/parse-json&#39;</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s">&#39;POST&#39;</span><span class="p">])</span>
 
<div class="viewcode-block" id="parse_json"><a class="viewcode-back" href="../../api/accounting.html#accounting.web.parse_json">[docs]</a><span class="k">def</span> <span class="nf">parse_json</span><span class="p">():</span>
 
    <span class="sd">r&#39;&#39;&#39;</span>
 
<span class="sd">    Parses a __type__-annotated JSON payload and debug-logs the decoded version</span>
 
<span class="sd">    of it.</span>
 

	
 
<span class="sd">    Example:</span>
 

	
 
<span class="sd">    .. code-block:: bash</span>
 

	
 
<span class="sd">        wget http://127.0.0.1:5000/balance -O balance.json</span>
 
<span class="sd">        curl -X POST -H &#39;Content-Type: application/json&#39; -d @balance.json \</span>
 
<span class="sd">            http://127.0.0.1/parse-json</span>
 
<span class="sd">        # Logging output (linebreaks added for clarity)</span>
 
<span class="sd">        # DEBUG:accounting:json data: {&#39;balance_report&#39;:</span>
 
<span class="sd">        #    [&lt;Account &quot;None&quot; [</span>
 
<span class="sd">        #        &lt;Amount $ 0&gt;, &lt;Amount KARMA 0&gt;]</span>
 
<span class="sd">        #        [&lt;Account &quot;Assets&quot; [</span>
 
<span class="sd">        #            &lt;Amount $ 50&gt;, &lt;Amount KARMA 10&gt;]</span>
 
<span class="sd">        #            [&lt;Account &quot;Assets:Checking&quot; [</span>
 
<span class="sd">        #                &lt;Amount $ 50&gt;] []&gt;,</span>
 
<span class="sd">        #             &lt;Account &quot;Assets:Karma Account&quot; [</span>
 
<span class="sd">        #                &lt;Amount KARMA 10&gt;] []&gt;]&gt;,</span>
 
<span class="sd">        #         &lt;Account &quot;Expenses&quot; [</span>
 
<span class="sd">        #            &lt;Amount $ 500&gt;]</span>
 
<span class="sd">        #            [&lt;Account &quot;Expenses:Blah&quot; [</span>
 
<span class="sd">        #                &lt;Amount $ 250&gt;]</span>
 
<span class="sd">        #                [&lt;Account &quot;Expenses:Blah:Hosting&quot; [</span>
 
<span class="sd">        #                    &lt;Amount $ 250&gt;] []&gt;]&gt;,</span>
 
<span class="sd">        #             &lt;Account &quot;Expenses:Foo&quot; [</span>
 
<span class="sd">        #                &lt;Amount $ 250&gt;] [</span>
 
<span class="sd">        #                &lt;Account &quot;Expenses:Foo:Hosting&quot; [</span>
 
<span class="sd">        #                    &lt;Amount $ 250&gt;] []&gt;]&gt;]&gt;,</span>
 
<span class="sd">        #         &lt;Account &quot;Income&quot; [</span>
 
<span class="sd">        #            &lt;Amount $ -550&gt;,</span>
 
<span class="sd">        #            &lt;Amount KARMA -10&gt;]</span>
 
<span class="sd">        #            [&lt;Account &quot;Income:Donation&quot; [</span>
 
<span class="sd">        #                &lt;Amount $ -50&gt;] []&gt;,</span>
 
<span class="sd">        #             &lt;Account &quot;Income:Foo&quot; [</span>
 
<span class="sd">        #                &lt;Amount $ -500&gt;]</span>
 
<span class="sd">        #                [&lt;Account &quot;Income:Foo:Donation&quot; [</span>
 
<span class="sd">        #                    &lt;Amount $ -500&gt;] []&gt;]&gt;,</span>
 
<span class="sd">        #             &lt;Account &quot;Income:Karma&quot; [</span>
 
<span class="sd">        #             &lt;Amount KARMA -10&gt;] []&gt;]&gt;]&gt;]}</span>
 
<span class="sd">    &#39;&#39;&#39;</span>
 
    <span class="n">app</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;json data: </span><span class="si">%s</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">request</span><span class="o">.</span><span class="n">json</span><span class="p">)</span>
 
    <span class="k">return</span> <span class="n">jsonify</span><span class="p">(</span><span class="n">foo</span><span class="o">=</span><span class="s">&#39;bar&#39;</span><span class="p">)</span>
 

	
 
</div>
 
<span class="nd">@app.route</span><span class="p">(</span><span class="s">&#39;/register&#39;</span><span class="p">)</span>
 
<div class="viewcode-block" id="register_report"><a class="viewcode-back" href="../../api/accounting.html#accounting.web.register_report">[docs]</a><span class="k">def</span> <span class="nf">register_report</span><span class="p">():</span>
 
    <span class="sd">&#39;&#39;&#39;</span>
 
<span class="sd">    Returns the JSON-serialized output of :py:meth:`accounting.Ledger.reg`</span>
 
<span class="sd">    &#39;&#39;&#39;</span>
 
    <span class="n">report_data</span> <span class="o">=</span> <span class="n">ledger</span><span class="o">.</span><span class="n">reg</span><span class="p">()</span>
 

	
 
    <span class="k">return</span> <span class="n">jsonify</span><span class="p">(</span><span class="n">register_report</span><span class="o">=</span><span class="n">report_data</span><span class="p">)</span>
 

	
 
</div>
 
<div class="viewcode-block" id="main"><a class="viewcode-back" href="../../api/accounting.html#accounting.web.main">[docs]</a><span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="n">argv</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
 
    <span class="n">prog</span> <span class="o">=</span> <span class="n">__name__</span>
 
    <span class="k">if</span> <span class="n">argv</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
 
        <span class="n">prog</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
 
        <span class="n">argv</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
 

	
 
    <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">prog</span><span class="o">=</span><span class="n">prog</span><span class="p">)</span>
 
    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&#39;-v&#39;</span><span class="p">,</span> <span class="s">&#39;--verbosity&#39;</span><span class="p">,</span>
 
                        <span class="n">default</span><span class="o">=</span><span class="s">&#39;INFO&#39;</span><span class="p">,</span>
 
                        <span class="n">help</span><span class="o">=</span><span class="p">(</span><span class="s">&#39;Filter logging output. Possible values:&#39;</span> <span class="o">+</span>
 
                        <span class="s">&#39; CRITICAL, ERROR, WARNING, INFO, DEBUG&#39;</span><span class="p">))</span>
 

	
 
    <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">(</span><span class="n">argv</span><span class="p">)</span>
 

	
 
    <span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span><span class="n">level</span><span class="o">=</span><span class="nb">getattr</span><span class="p">(</span><span class="n">logging</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">verbosity</span><span class="p">,</span> <span class="s">&#39;INFO&#39;</span><span class="p">))</span>
 

	
 
    <span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s">&#39;HOST&#39;</span><span class="p">],</span> <span class="n">port</span><span class="o">=</span><span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s">&#39;PORT&#39;</span><span class="p">])</span>
 
</div>
 
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
 
    <span class="n">main</span><span class="p">()</span>
 
</pre></div>
 

	
 
          </div>
 
        </div>
 
      </div>
 
      <div class="sphinxsidebar">
 
        <div class="sphinxsidebarwrapper">
 
<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><a href="../../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="../index.html" >Module code</a> &raquo;</li>
 
          <li><a href="../accounting.html" >accounting</a> &raquo;</li> 
 
      </ul>
 
    </div>
 
    <div class="footer">
 
        &copy; Copyright 2013, Joar Wandborg.
 
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.
 
    </div>
 
  </body>
 
</html>
...
 
\ No newline at end of file
doc/build/html/_modules/index.html
Show inline comments
 
new file 100644
 
<!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>Overview: module code &mdash; Accounting API 0.1-beta 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:     '0.1-beta',
 
        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>
 
    <link rel="top" title="Accounting API 0.1-beta documentation" href="../index.html" /> 
 
  </head>
 
  <body>
 
    <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><a href="../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li> 
 
      </ul>
 
    </div>  
 

	
 
    <div class="document">
 
      <div class="documentwrapper">
 
        <div class="bodywrapper">
 
          <div class="body">
 
            
 
  <h1>All modules for which code is available</h1>
 
<ul><li><a href="accounting.html">accounting</a></li>
 
<ul><li><a href="accounting/client.html">accounting.client</a></li>
 
<li><a href="accounting/decorators.html">accounting.decorators</a></li>
 
<li><a href="accounting/exceptions.html">accounting.exceptions</a></li>
 
<li><a href="accounting/gtkclient.html">accounting.gtkclient</a></li>
 
<li><a href="accounting/models.html">accounting.models</a></li>
 
<li><a href="accounting/storage.html">accounting.storage</a></li>
 
<ul><li><a href="accounting/storage/ledgercli.html">accounting.storage.ledgercli</a></li>
 
<li><a href="accounting/storage/sql.html">accounting.storage.sql</a></li>
 
<ul><li><a href="accounting/storage/sql/models.html">accounting.storage.sql.models</a></li>
 
</ul></ul><li><a href="accounting/transport.html">accounting.transport</a></li>
 
<li><a href="accounting/web.html">accounting.web</a></li>
 
</ul></ul>
 

	
 
          </div>
 
        </div>
 
      </div>
 
      <div class="sphinxsidebar">
 
        <div class="sphinxsidebarwrapper">
 
<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><a href="../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li> 
 
      </ul>
 
    </div>
 
    <div class="footer">
 
        &copy; Copyright 2013, Joar Wandborg.
 
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.
 
    </div>
 
  </body>
 
</html>
...
 
\ No newline at end of file
doc/build/html/_sources/api/accounting.storage.sql.txt
Show inline comments
 
new file 100644
 
accounting.storage.sql package
 
==============================
 

	
 
Submodules
 
----------
 

	
 
accounting.storage.sql.models module
 
------------------------------------
 

	
 
.. automodule:: accounting.storage.sql.models
 
    :members:
 
    :undoc-members:
 
    :show-inheritance:
 

	
 

	
 
Module contents
 
---------------
 

	
 
.. automodule:: accounting.storage.sql
 
    :members:
 
    :undoc-members:
 
    :show-inheritance:
doc/build/html/_sources/api/accounting.storage.txt
Show inline comments
 
new file 100644
 
accounting.storage package
 
==========================
 

	
 
Subpackages
 
-----------
 

	
 
.. toctree::
 

	
 
    accounting.storage.sql
 

	
 
Submodules
 
----------
 

	
 
accounting.storage.ledgercli module
 
-----------------------------------
 

	
 
.. automodule:: accounting.storage.ledgercli
 
    :members:
 
    :undoc-members:
 
    :show-inheritance:
 

	
 

	
 
Module contents
 
---------------
 

	
 
.. automodule:: accounting.storage
 
    :members:
 
    :undoc-members:
 
    :show-inheritance:
doc/build/html/_sources/api/accounting.txt
Show inline comments
 
new file 100644
 
accounting package
 
==================
 

	
 
Subpackages
 
-----------
 

	
 
.. toctree::
 

	
 
    accounting.storage
 

	
 
Submodules
 
----------
 

	
 
accounting.client module
 
------------------------
 

	
 
.. automodule:: accounting.client
 
    :members:
 
    :undoc-members:
 
    :show-inheritance:
 

	
 
accounting.config module
 
------------------------
 

	
 
.. automodule:: accounting.config
 
    :members:
 
    :undoc-members:
 
    :show-inheritance:
 

	
 
accounting.decorators module
 
----------------------------
 

	
 
.. automodule:: accounting.decorators
 
    :members:
 
    :undoc-members:
 
    :show-inheritance:
 

	
 
accounting.exceptions module
 
----------------------------
 

	
 
.. automodule:: accounting.exceptions
 
    :members:
 
    :undoc-members:
 
    :show-inheritance:
 

	
 
accounting.gtkclient module
 
---------------------------
 

	
 
.. automodule:: accounting.gtkclient
 
    :members:
 
    :undoc-members:
 
    :show-inheritance:
 

	
 
accounting.models module
 
------------------------
 

	
 
.. automodule:: accounting.models
 
    :members:
 
    :undoc-members:
 
    :show-inheritance:
 

	
 
accounting.transport module
 
---------------------------
 

	
 
.. automodule:: accounting.transport
 
    :members:
 
    :undoc-members:
 
    :show-inheritance:
 

	
 
accounting.web module
 
---------------------
 

	
 
.. automodule:: accounting.web
 
    :members:
 
    :undoc-members:
 
    :show-inheritance:
 

	
 

	
 
Module contents
 
---------------
 

	
 
.. automodule:: accounting
 
    :members:
 
    :undoc-members:
 
    :show-inheritance:
doc/build/html/_sources/api/asyncio-test.txt
Show inline comments
 
new file 100644
 
asyncio-test Module
 
===================
 

	
 
.. automodule:: asyncio-test
 
    :members:
 
    :undoc-members:
 
    :show-inheritance:
doc/build/html/_sources/api/modules.txt
Show inline comments
 
new file 100644
 
accounting
 
==========
 

	
 
.. toctree::
 
   :maxdepth: 4
 

	
 
   accounting
doc/build/html/_sources/index.txt
Show inline comments
 
new file 100644
 
.. Accounting API documentation master file, created by
 
   sphinx-quickstart on Thu Dec 12 14:02:01 2013.
 
   You can adapt this file completely to your liking, but it should at least
 
   contain the root `toctree` directive.
 

	
 
Welcome to Accounting API's documentation!
 
==========================================
 

	
 
Contents:
 

	
 
.. toctree::
 
   :maxdepth: 2
 

	
 
   api/accounting.rst
 

	
 

	
 

	
 
Indices and tables
 
==================
 

	
 
* :ref:`genindex`
 
* :ref:`modindex`
 
* :ref:`search`
doc/build/html/_static/ajax-loader.gif
Show inline comments
 
new file 100644
 
binary diff not shown
Show images
doc/build/html/_static/basic.css
Show inline comments
 
new file 100644
 
/*
 
 * basic.css
 
 * ~~~~~~~~~
 
 *
 
 * Sphinx stylesheet -- basic theme.
 
 *
 
 * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
 
 * :license: BSD, see LICENSE for details.
 
 *
 
 */
 

	
 
/* -- main layout ----------------------------------------------------------- */
 

	
 
div.clearer {
 
    clear: both;
 
}
 

	
 
/* -- relbar ---------------------------------------------------------------- */
 

	
 
div.related {
 
    width: 100%;
 
    font-size: 90%;
 
}
 

	
 
div.related h3 {
 
    display: none;
 
}
 

	
 
div.related ul {
 
    margin: 0;
 
    padding: 0 0 0 10px;
 
    list-style: none;
 
}
 

	
 
div.related li {
 
    display: inline;
 
}
 

	
 
div.related li.right {
 
    float: right;
 
    margin-right: 5px;
 
}
 

	
 
/* -- sidebar --------------------------------------------------------------- */
 

	
 
div.sphinxsidebarwrapper {
 
    padding: 10px 5px 0 10px;
 
}
 

	
 
div.sphinxsidebar {
 
    float: left;
 
    width: 230px;
 
    margin-left: -100%;
 
    font-size: 90%;
 
}
 

	
 
div.sphinxsidebar ul {
 
    list-style: none;
 
}
 

	
 
div.sphinxsidebar ul ul,
 
div.sphinxsidebar ul.want-points {
 
    margin-left: 20px;
 
    list-style: square;
 
}
 

	
 
div.sphinxsidebar ul ul {
 
    margin-top: 0;
 
    margin-bottom: 0;
 
}
 

	
 
div.sphinxsidebar form {
 
    margin-top: 10px;
 
}
 

	
 
div.sphinxsidebar input {
 
    border: 1px solid #98dbcc;
 
    font-family: sans-serif;
 
    font-size: 1em;
 
}
 

	
 
div.sphinxsidebar #searchbox input[type="text"] {
 
    width: 170px;
 
}
 

	
 
div.sphinxsidebar #searchbox input[type="submit"] {
 
    width: 30px;
 
}
 

	
 
img {
 
    border: 0;
 
}
 

	
 
/* -- search page ----------------------------------------------------------- */
 

	
 
ul.search {
 
    margin: 10px 0 0 20px;
 
    padding: 0;
 
}
 

	
 
ul.search li {
 
    padding: 5px 0 5px 20px;
 
    background-image: url(file.png);
 
    background-repeat: no-repeat;
 
    background-position: 0 7px;
 
}
 

	
 
ul.search li a {
 
    font-weight: bold;
 
}
 

	
 
ul.search li div.context {
 
    color: #888;
 
    margin: 2px 0 0 30px;
 
    text-align: left;
 
}
 

	
 
ul.keywordmatches li.goodmatch a {
 
    font-weight: bold;
 
}
 

	
 
/* -- index page ------------------------------------------------------------ */
 

	
 
table.contentstable {
 
    width: 90%;
 
}
 

	
 
table.contentstable p.biglink {
 
    line-height: 150%;
 
}
 

	
 
a.biglink {
 
    font-size: 1.3em;
 
}
 

	
 
span.linkdescr {
 
    font-style: italic;
 
    padding-top: 5px;
 
    font-size: 90%;
 
}
 

	
 
/* -- general index --------------------------------------------------------- */
 

	
 
table.indextable {
 
    width: 100%;
 
}
 

	
 
table.indextable td {
 
    text-align: left;
 
    vertical-align: top;
 
}
 

	
 
table.indextable dl, table.indextable dd {
 
    margin-top: 0;
 
    margin-bottom: 0;
 
}
 

	
 
table.indextable tr.pcap {
 
    height: 10px;
 
}
 

	
 
table.indextable tr.cap {
 
    margin-top: 10px;
 
    background-color: #f2f2f2;
 
}
 

	
 
img.toggler {
 
    margin-right: 3px;
 
    margin-top: 3px;
 
    cursor: pointer;
 
}
 

	
 
div.modindex-jumpbox {
 
    border-top: 1px solid #ddd;
 
    border-bottom: 1px solid #ddd;
 
    margin: 1em 0 1em 0;
 
    padding: 0.4em;
 
}
 

	
 
div.genindex-jumpbox {
 
    border-top: 1px solid #ddd;
 
    border-bottom: 1px solid #ddd;
 
    margin: 1em 0 1em 0;
 
    padding: 0.4em;
 
}
 

	
 
/* -- general body styles --------------------------------------------------- */
 

	
 
a.headerlink {
 
    visibility: hidden;
 
}
 

	
 
h1:hover > a.headerlink,
 
h2:hover > a.headerlink,
 
h3:hover > a.headerlink,
 
h4:hover > a.headerlink,
 
h5:hover > a.headerlink,
 
h6:hover > a.headerlink,
 
dt:hover > a.headerlink {
 
    visibility: visible;
 
}
 

	
 
div.body p.caption {
 
    text-align: inherit;
 
}
 

	
 
div.body td {
 
    text-align: left;
 
}
 

	
 
.field-list ul {
 
    padding-left: 1em;
 
}
 

	
 
.first {
 
    margin-top: 0 !important;
 
}
 

	
 
p.rubric {
 
    margin-top: 30px;
 
    font-weight: bold;
 
}
 

	
 
img.align-left, .figure.align-left, object.align-left {
 
    clear: left;
 
    float: left;
 
    margin-right: 1em;
 
}
 

	
 
img.align-right, .figure.align-right, object.align-right {
 
    clear: right;
 
    float: right;
 
    margin-left: 1em;
 
}
 

	
 
img.align-center, .figure.align-center, object.align-center {
 
  display: block;
 
  margin-left: auto;
 
  margin-right: auto;
 
}
 

	
 
.align-left {
 
    text-align: left;
 
}
 

	
 
.align-center {
 
    text-align: center;
 
}
 

	
 
.align-right {
 
    text-align: right;
 
}
 

	
 
/* -- sidebars -------------------------------------------------------------- */
 

	
 
div.sidebar {
 
    margin: 0 0 0.5em 1em;
 
    border: 1px solid #ddb;
 
    padding: 7px 7px 0 7px;
 
    background-color: #ffe;
 
    width: 40%;
 
    float: right;
 
}
 

	
 
p.sidebar-title {
 
    font-weight: bold;
 
}
 

	
 
/* -- topics ---------------------------------------------------------------- */
 

	
 
div.topic {
 
    border: 1px solid #ccc;
 
    padding: 7px 7px 0 7px;
 
    margin: 10px 0 10px 0;
 
}
 

	
 
p.topic-title {
 
    font-size: 1.1em;
 
    font-weight: bold;
 
    margin-top: 10px;
 
}
 

	
 
/* -- admonitions ----------------------------------------------------------- */
 

	
 
div.admonition {
 
    margin-top: 10px;
 
    margin-bottom: 10px;
 
    padding: 7px;
 
}
 

	
 
div.admonition dt {
 
    font-weight: bold;
 
}
 

	
 
div.admonition dl {
 
    margin-bottom: 0;
 
}
 

	
 
p.admonition-title {
 
    margin: 0px 10px 5px 0px;
 
    font-weight: bold;
 
}
 

	
 
div.body p.centered {
 
    text-align: center;
 
    margin-top: 25px;
 
}
 

	
 
/* -- tables ---------------------------------------------------------------- */
 

	
 
table.docutils {
 
    border: 0;
 
    border-collapse: collapse;
 
}
 

	
 
table.docutils td, table.docutils th {
 
    padding: 1px 8px 1px 5px;
 
    border-top: 0;
 
    border-left: 0;
 
    border-right: 0;
 
    border-bottom: 1px solid #aaa;
 
}
 

	
 
table.field-list td, table.field-list th {
 
    border: 0 !important;
 
}
 

	
 
table.footnote td, table.footnote th {
 
    border: 0 !important;
 
}
 

	
 
th {
 
    text-align: left;
 
    padding-right: 5px;
 
}
 

	
 
table.citation {
 
    border-left: solid 1px gray;
 
    margin-left: 1px;
 
}
 

	
 
table.citation td {
 
    border-bottom: none;
 
}
 

	
 
/* -- other body styles ----------------------------------------------------- */
 

	
 
ol.arabic {
 
    list-style: decimal;
 
}
 

	
 
ol.loweralpha {
 
    list-style: lower-alpha;
 
}
 

	
 
ol.upperalpha {
 
    list-style: upper-alpha;
 
}
 

	
 
ol.lowerroman {
 
    list-style: lower-roman;
 
}
 

	
 
ol.upperroman {
 
    list-style: upper-roman;
 
}
 

	
 
dl {
 
    margin-bottom: 15px;
 
}
 

	
 
dd p {
 
    margin-top: 0px;
 
}
 

	
 
dd ul, dd table {
 
    margin-bottom: 10px;
 
}
 

	
 
dd {
 
    margin-top: 3px;
 
    margin-bottom: 10px;
 
    margin-left: 30px;
 
}
 

	
 
dt:target, .highlighted {
 
    background-color: #fbe54e;
 
}
 

	
 
dl.glossary dt {
 
    font-weight: bold;
 
    font-size: 1.1em;
 
}
 

	
 
.field-list ul {
 
    margin: 0;
 
    padding-left: 1em;
 
}
 

	
 
.field-list p {
 
    margin: 0;
 
}
 

	
 
.optional {
 
    font-size: 1.3em;
 
}
 

	
 
.versionmodified {
 
    font-style: italic;
 
}
 

	
 
.system-message {
 
    background-color: #fda;
 
    padding: 5px;
 
    border: 3px solid red;
 
}
 

	
 
.footnote:target  {
 
    background-color: #ffa;
 
}
 

	
 
.line-block {
 
    display: block;
 
    margin-top: 1em;
 
    margin-bottom: 1em;
 
}
 

	
 
.line-block .line-block {
 
    margin-top: 0;
 
    margin-bottom: 0;
 
    margin-left: 1.5em;
 
}
 

	
 
.guilabel, .menuselection {
 
    font-family: sans-serif;
 
}
 

	
 
.accelerator {
 
    text-decoration: underline;
 
}
 

	
 
.classifier {
 
    font-style: oblique;
 
}
 

	
 
abbr, acronym {
 
    border-bottom: dotted 1px;
 
    cursor: help;
 
}
 

	
 
/* -- code displays --------------------------------------------------------- */
 

	
 
pre {
 
    overflow: auto;
 
    overflow-y: hidden;  /* fixes display issues on Chrome browsers */
 
}
 

	
 
td.linenos pre {
 
    padding: 5px 0px;
 
    border: 0;
 
    background-color: transparent;
 
    color: #aaa;
 
}
 

	
 
table.highlighttable {
 
    margin-left: 0.5em;
 
}
 

	
 
table.highlighttable td {
 
    padding: 0 0.5em 0 0.5em;
 
}
 

	
 
tt.descname {
 
    background-color: transparent;
 
    font-weight: bold;
 
    font-size: 1.2em;
 
}
 

	
 
tt.descclassname {
 
    background-color: transparent;
 
}
 

	
 
tt.xref, a tt {
 
    background-color: transparent;
 
    font-weight: bold;
 
}
 

	
 
h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
 
    background-color: transparent;
 
}
 

	
 
.viewcode-link {
 
    float: right;
 
}
 

	
 
.viewcode-back {
 
    float: right;
 
    font-family: sans-serif;
 
}
 

	
 
div.viewcode-block:target {
 
    margin: -1px -10px;
 
    padding: 0 10px;
 
}
 

	
 
/* -- math display ---------------------------------------------------------- */
 

	
 
img.math {
 
    vertical-align: middle;
 
}
 

	
 
div.body div.math p {
 
    text-align: center;
 
}
 

	
 
span.eqno {
 
    float: right;
 
}
 

	
 
/* -- printout stylesheet --------------------------------------------------- */
 

	
 
@media print {
 
    div.document,
 
    div.documentwrapper,
 
    div.bodywrapper {
 
        margin: 0 !important;
 
        width: 100%;
 
    }
 

	
 
    div.sphinxsidebar,
 
    div.related,
 
    div.footer,
 
    #top-link {
 
        display: none;
 
    }
 
}
...
 
\ No newline at end of file
doc/build/html/_static/comment-bright.png
Show inline comments
 
new file 100644
 
binary diff not shown
Show images
doc/build/html/_static/comment-close.png
Show inline comments
 
new file 100644
 
binary diff not shown
Show images
doc/build/html/_static/comment.png
Show inline comments
 
new file 100644
 
binary diff not shown
Show images
doc/build/html/_static/default.css
Show inline comments
 
new file 100644
 
/*
 
 * default.css_t
 
 * ~~~~~~~~~~~~~
 
 *
 
 * Sphinx stylesheet -- default theme.
 
 *
 
 * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
 
 * :license: BSD, see LICENSE for details.
 
 *
 
 */
 

	
 
@import url("basic.css");
 

	
 
/* -- page layout ----------------------------------------------------------- */
 

	
 
body {
 
    font-family: sans-serif;
 
    font-size: 100%;
 
    background-color: #11303d;
 
    color: #000;
 
    margin: 0;
 
    padding: 0;
 
}
 

	
 
div.document {
 
    background-color: #1c4e63;
 
}
 

	
 
div.documentwrapper {
 
    float: left;
 
    width: 100%;
 
}
 

	
 
div.bodywrapper {
 
    margin: 0 0 0 230px;
 
}
 

	
 
div.body {
 
    background-color: #ffffff;
 
    color: #000000;
 
    padding: 0 20px 30px 20px;
 
}
 

	
 
div.footer {
 
    color: #ffffff;
 
    width: 100%;
 
    padding: 9px 0 9px 0;
 
    text-align: center;
 
    font-size: 75%;
 
}
 

	
 
div.footer a {
 
    color: #ffffff;
 
    text-decoration: underline;
 
}
 

	
 
div.related {
 
    background-color: #133f52;
 
    line-height: 30px;
 
    color: #ffffff;
 
}
 

	
 
div.related a {
 
    color: #ffffff;
 
}
 

	
 
div.sphinxsidebar {
 
}
 

	
 
div.sphinxsidebar h3 {
 
    font-family: 'Trebuchet MS', sans-serif;
 
    color: #ffffff;
 
    font-size: 1.4em;
 
    font-weight: normal;
 
    margin: 0;
 
    padding: 0;
 
}
 

	
 
div.sphinxsidebar h3 a {
 
    color: #ffffff;
 
}
 

	
 
div.sphinxsidebar h4 {
 
    font-family: 'Trebuchet MS', sans-serif;
 
    color: #ffffff;
 
    font-size: 1.3em;
 
    font-weight: normal;
 
    margin: 5px 0 0 0;
 
    padding: 0;
 
}
 

	
 
div.sphinxsidebar p {
 
    color: #ffffff;
 
}
 

	
 
div.sphinxsidebar p.topless {
 
    margin: 5px 10px 10px 10px;
 
}
 

	
 
div.sphinxsidebar ul {
 
    margin: 10px;
 
    padding: 0;
 
    color: #ffffff;
 
}
 

	
 
div.sphinxsidebar a {
 
    color: #98dbcc;
 
}
 

	
 
div.sphinxsidebar input {
 
    border: 1px solid #98dbcc;
 
    font-family: sans-serif;
 
    font-size: 1em;
 
}
 

	
 

	
 

	
 
/* -- hyperlink styles ------------------------------------------------------ */
 

	
 
a {
 
    color: #355f7c;
 
    text-decoration: none;
 
}
 

	
 
a:visited {
 
    color: #355f7c;
 
    text-decoration: none;
 
}
 

	
 
a:hover {
 
    text-decoration: underline;
 
}
 

	
 

	
 

	
 
/* -- body styles ----------------------------------------------------------- */
 

	
 
div.body h1,
 
div.body h2,
 
div.body h3,
 
div.body h4,
 
div.body h5,
 
div.body h6 {
 
    font-family: 'Trebuchet MS', sans-serif;
 
    background-color: #f2f2f2;
 
    font-weight: normal;
 
    color: #20435c;
 
    border-bottom: 1px solid #ccc;
 
    margin: 20px -20px 10px -20px;
 
    padding: 3px 0 3px 10px;
 
}
 

	
 
div.body h1 { margin-top: 0; font-size: 200%; }
 
div.body h2 { font-size: 160%; }
 
div.body h3 { font-size: 140%; }
 
div.body h4 { font-size: 120%; }
 
div.body h5 { font-size: 110%; }
 
div.body h6 { font-size: 100%; }
 

	
 
a.headerlink {
 
    color: #c60f0f;
 
    font-size: 0.8em;
 
    padding: 0 4px 0 4px;
 
    text-decoration: none;
 
}
 

	
 
a.headerlink:hover {
 
    background-color: #c60f0f;
 
    color: white;
 
}
 

	
 
div.body p, div.body dd, div.body li {
 
    text-align: justify;
 
    line-height: 130%;
 
}
 

	
 
div.admonition p.admonition-title + p {
 
    display: inline;
 
}
 

	
 
div.admonition p {
 
    margin-bottom: 5px;
 
}
 

	
 
div.admonition pre {
 
    margin-bottom: 5px;
 
}
 

	
 
div.admonition ul, div.admonition ol {
 
    margin-bottom: 5px;
 
}
 

	
 
div.note {
 
    background-color: #eee;
 
    border: 1px solid #ccc;
 
}
 

	
 
div.seealso {
 
    background-color: #ffc;
 
    border: 1px solid #ff6;
 
}
 

	
 
div.topic {
 
    background-color: #eee;
 
}
 

	
 
div.warning {
 
    background-color: #ffe4e4;
 
    border: 1px solid #f66;
 
}
 

	
 
p.admonition-title {
 
    display: inline;
 
}
 

	
 
p.admonition-title:after {
 
    content: ":";
 
}
 

	
 
pre {
 
    padding: 5px;
 
    background-color: #eeffcc;
 
    color: #333333;
 
    line-height: 120%;
 
    border: 1px solid #ac9;
 
    border-left: none;
 
    border-right: none;
 
}
 

	
 
tt {
 
    background-color: #ecf0f3;
 
    padding: 0 1px 0 1px;
 
    font-size: 0.95em;
 
}
 

	
 
th {
 
    background-color: #ede;
 
}
 

	
 
.warning tt {
 
    background: #efc2c2;
 
}
 

	
 
.note tt {
 
    background: #d6d6d6;
 
}
 

	
 
.viewcode-back {
 
    font-family: sans-serif;
 
}
 

	
 
div.viewcode-block:target {
 
    background-color: #f4debf;
 
    border-top: 1px solid #ac9;
 
    border-bottom: 1px solid #ac9;
 
}
...
 
\ No newline at end of file
doc/build/html/_static/doctools.js
Show inline comments
 
new file 100644
 
/*
 
 * doctools.js
 
 * ~~~~~~~~~~~
 
 *
 
 * Sphinx JavaScript utilities for all documentation.
 
 *
 
 * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
 
 * :license: BSD, see LICENSE for details.
 
 *
 
 */
 

	
 
/**
 
 * select a different prefix for underscore
 
 */
 
$u = _.noConflict();
 

	
 
/**
 
 * make the code below compatible with browsers without
 
 * an installed firebug like debugger
 
if (!window.console || !console.firebug) {
 
  var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
 
    "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
 
    "profile", "profileEnd"];
 
  window.console = {};
 
  for (var i = 0; i < names.length; ++i)
 
    window.console[names[i]] = function() {};
 
}
 
 */
 

	
 
/**
 
 * small helper function to urldecode strings
 
 */
 
jQuery.urldecode = function(x) {
 
  return decodeURIComponent(x).replace(/\+/g, ' ');
 
};
 

	
 
/**
 
 * small helper function to urlencode strings
 
 */
 
jQuery.urlencode = encodeURIComponent;
 

	
 
/**
 
 * This function returns the parsed url parameters of the
 
 * current request. Multiple values per key are supported,
 
 * it will always return arrays of strings for the value parts.
 
 */
 
jQuery.getQueryParameters = function(s) {
 
  if (typeof s == 'undefined')
 
    s = document.location.search;
 
  var parts = s.substr(s.indexOf('?') + 1).split('&');
 
  var result = {};
 
  for (var i = 0; i < parts.length; i++) {
 
    var tmp = parts[i].split('=', 2);
 
    var key = jQuery.urldecode(tmp[0]);
 
    var value = jQuery.urldecode(tmp[1]);
 
    if (key in result)
 
      result[key].push(value);
 
    else
 
      result[key] = [value];
 
  }
 
  return result;
 
};
 

	
 
/**
 
 * highlight a given string on a jquery object by wrapping it in
 
 * span elements with the given class name.
 
 */
 
jQuery.fn.highlightText = function(text, className) {
 
  function highlight(node) {
 
    if (node.nodeType == 3) {
 
      var val = node.nodeValue;
 
      var pos = val.toLowerCase().indexOf(text);
 
      if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) {
 
        var span = document.createElement("span");
 
        span.className = className;
 
        span.appendChild(document.createTextNode(val.substr(pos, text.length)));
 
        node.parentNode.insertBefore(span, node.parentNode.insertBefore(
 
          document.createTextNode(val.substr(pos + text.length)),
 
          node.nextSibling));
 
        node.nodeValue = val.substr(0, pos);
 
      }
 
    }
 
    else if (!jQuery(node).is("button, select, textarea")) {
 
      jQuery.each(node.childNodes, function() {
 
        highlight(this);
 
      });
 
    }
 
  }
 
  return this.each(function() {
 
    highlight(this);
 
  });
 
};
 

	
 
/**
 
 * Small JavaScript module for the documentation.
 
 */
 
var Documentation = {
 

	
 
  init : function() {
 
    this.fixFirefoxAnchorBug();
 
    this.highlightSearchWords();
 
    this.initIndexTable();
 
  },
 

	
 
  /**
 
   * i18n support
 
   */
 
  TRANSLATIONS : {},
 
  PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
 
  LOCALE : 'unknown',
 

	
 
  // gettext and ngettext don't access this so that the functions
 
  // can safely bound to a different name (_ = Documentation.gettext)
 
  gettext : function(string) {
 
    var translated = Documentation.TRANSLATIONS[string];
 
    if (typeof translated == 'undefined')
 
      return string;
 
    return (typeof translated == 'string') ? translated : translated[0];
 
  },
 

	
 
  ngettext : function(singular, plural, n) {
 
    var translated = Documentation.TRANSLATIONS[singular];
 
    if (typeof translated == 'undefined')
 
      return (n == 1) ? singular : plural;
 
    return translated[Documentation.PLURALEXPR(n)];
 
  },
 

	
 
  addTranslations : function(catalog) {
 
    for (var key in catalog.messages)
 
      this.TRANSLATIONS[key] = catalog.messages[key];
 
    this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
 
    this.LOCALE = catalog.locale;
 
  },
 

	
 
  /**
 
   * add context elements like header anchor links
 
   */
 
  addContextElements : function() {
 
    $('div[id] > :header:first').each(function() {
 
      $('<a class="headerlink">\u00B6</a>').
 
      attr('href', '#' + this.id).
 
      attr('title', _('Permalink to this headline')).
 
      appendTo(this);
 
    });
 
    $('dt[id]').each(function() {
 
      $('<a class="headerlink">\u00B6</a>').
 
      attr('href', '#' + this.id).
 
      attr('title', _('Permalink to this definition')).
 
      appendTo(this);
 
    });
 
  },
 

	
 
  /**
 
   * workaround a firefox stupidity
 
   */
 
  fixFirefoxAnchorBug : function() {
 
    if (document.location.hash && $.browser.mozilla)
 
      window.setTimeout(function() {
 
        document.location.href += '';
 
      }, 10);
 
  },
 

	
 
  /**
 
   * highlight the search words provided in the url in the text
 
   */
 
  highlightSearchWords : function() {
 
    var params = $.getQueryParameters();
 
    var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
 
    if (terms.length) {
 
      var body = $('div.body');
 
      window.setTimeout(function() {
 
        $.each(terms, function() {
 
          body.highlightText(this.toLowerCase(), 'highlighted');
 
        });
 
      }, 10);
 
      $('<p class="highlight-link"><a href="javascript:Documentation.' +
 
        'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
 
          .appendTo($('#searchbox'));
 
    }
 
  },
 

	
 
  /**
 
   * init the domain index toggle buttons
 
   */
 
  initIndexTable : function() {
 
    var togglers = $('img.toggler').click(function() {
 
      var src = $(this).attr('src');
 
      var idnum = $(this).attr('id').substr(7);
 
      $('tr.cg-' + idnum).toggle();
 
      if (src.substr(-9) == 'minus.png')
 
        $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
 
      else
 
        $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
 
    }).css('display', '');
 
    if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
 
        togglers.click();
 
    }
 
  },
 

	
 
  /**
 
   * helper function to hide the search marks again
 
   */
 
  hideSearchWords : function() {
 
    $('#searchbox .highlight-link').fadeOut(300);
 
    $('span.highlighted').removeClass('highlighted');
 
  },
 

	
 
  /**
 
   * make the url absolute
 
   */
 
  makeURL : function(relativeURL) {
 
    return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
 
  },
 

	
 
  /**
 
   * get the current relative url
 
   */
 
  getCurrentURL : function() {
 
    var path = document.location.pathname;
 
    var parts = path.split(/\//);
 
    $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
 
      if (this == '..')
 
        parts.pop();
 
    });
 
    var url = parts.join('/');
 
    return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
 
  }
 
};
 

	
 
// quick alias for translations
 
_ = Documentation.gettext;
 

	
 
$(document).ready(function() {
 
  Documentation.init();
 
});
doc/build/html/_static/down-pressed.png
Show inline comments
 
new file 100644
 
binary diff not shown
Show images
doc/build/html/_static/down.png
Show inline comments
 
new file 100644
 
binary diff not shown
Show images
doc/build/html/_static/file.png
Show inline comments
 
new file 100644
 
binary diff not shown
Show images
doc/build/html/_static/jquery.js
Show inline comments
 
new file 100644
 
/*! jQuery v1.8.3 jquery.com | jquery.org/license */
 
(function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){return!1}function tt(){return!0}function ut(e){return!e||!e.parentNode||e.parentNode.nodeType===11}function at(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function ft(e,t,n){t=t||0;if(v.isFunction(t))return v.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return v.grep(e,function(e,r){return e===t===n});if(typeof t=="string"){var r=v.grep(e,function(e){return e.nodeType===1});if(it.test(t))return v.filter(t,r,!n);t=v.filter(t,r)}return v.grep(e,function(e,r){return v.inArray(e,t)>=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r<i;r++)v.event.add(t,n,u[n][r])}o.data&&(o.data=v.extend({},o.data))}function Ot(e,t){var n;if(t.nodeType!==1)return;t.clearAttributes&&t.clearAttributes(),t.mergeAttributes&&t.mergeAttributes(e),n=t.nodeName.toLowerCase(),n==="object"?(t.parentNode&&(t.outerHTML=e.outerHTML),v.support.html5Clone&&e.innerHTML&&!v.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):n==="input"&&Et.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):n==="option"?t.selected=e.defaultSelected:n==="input"||n==="textarea"?t.defaultValue=e.defaultValue:n==="script"&&t.text!==e.text&&(t.text=e.text),t.removeAttribute(v.expando)}function Mt(e){return typeof e.getElementsByTagName!="undefined"?e.getElementsByTagName("*"):typeof e.querySelectorAll!="undefined"?e.querySelectorAll("*"):[]}function _t(e){Et.test(e.type)&&(e.defaultChecked=e.checked)}function Qt(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Jt.length;while(i--){t=Jt[i]+n;if(t in e)return t}return r}function Gt(e,t){return e=t||e,v.css(e,"display")==="none"||!v.contains(e.ownerDocument,e)}function Yt(e,t){var n,r,i=[],s=0,o=e.length;for(;s<o;s++){n=e[s];if(!n.style)continue;i[s]=v._data(n,"olddisplay"),t?(!i[s]&&n.style.display==="none"&&(n.style.display=""),n.style.display===""&&Gt(n)&&(i[s]=v._data(n,"olddisplay",nn(n.nodeName)))):(r=Dt(n,"display"),!i[s]&&r!=="none"&&v._data(n,"olddisplay",r))}for(s=0;s<o;s++){n=e[s];if(!n.style)continue;if(!t||n.style.display==="none"||n.style.display==="")n.style.display=t?i[s]||"":"none"}return e}function Zt(e,t,n){var r=Rt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function en(e,t,n,r){var i=n===(r?"border":"content")?4:t==="width"?1:0,s=0;for(;i<4;i+=2)n==="margin"&&(s+=v.css(e,n+$t[i],!0)),r?(n==="content"&&(s-=parseFloat(Dt(e,"padding"+$t[i]))||0),n!=="margin"&&(s-=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0)):(s+=parseFloat(Dt(e,"padding"+$t[i]))||0,n!=="padding"&&(s+=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0));return s}function tn(e,t,n){var r=t==="width"?e.offsetWidth:e.offsetHeight,i=!0,s=v.support.boxSizing&&v.css(e,"boxSizing")==="border-box";if(r<=0||r==null){r=Dt(e,t);if(r<0||r==null)r=e.style[t];if(Ut.test(r))return r;i=s&&(v.support.boxSizingReliable||r===e.style[t]),r=parseFloat(r)||0}return r+en(e,t,n||(s?"border":"content"),i)+"px"}function nn(e){if(Wt[e])return Wt[e];var t=v("<"+e+">").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write("<!doctype html><html><body>"),Ht.close();t=Ht.body.appendChild(Ht.createElement(e)),n=Dt(t,"display"),i.body.removeChild(Pt)}return Wt[e]=n,n}function fn(e,t,n,r){var i;if(v.isArray(t))v.each(t,function(t,i){n||sn.test(e)?r(e,i):fn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&v.type(t)==="object")for(i in t)fn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Cn(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i,s,o=t.toLowerCase().split(y),u=0,a=o.length;if(v.isFunction(n))for(;u<a;u++)r=o[u],s=/^\+/.test(r),s&&(r=r.substr(1)||"*"),i=e[r]=e[r]||[],i[s?"unshift":"push"](n)}}function kn(e,n,r,i,s,o){s=s||n.dataTypes[0],o=o||{},o[s]=!0;var u,a=e[s],f=0,l=a?a.length:0,c=e===Sn;for(;f<l&&(c||!u);f++)u=a[f](n,r,i),typeof u=="string"&&(!c||o[u]?u=t:(n.dataTypes.unshift(u),u=kn(e,n,r,i,u,o)));return(c||!u)&&!o["*"]&&(u=kn(e,n,r,i,"*",o)),u}function Ln(e,n){var r,i,s=v.ajaxSettings.flatOptions||{};for(r in n)n[r]!==t&&((s[r]?e:i||(i={}))[r]=n[r]);i&&v.extend(!0,e,i)}function An(e,n,r){var i,s,o,u,a=e.contents,f=e.dataTypes,l=e.responseFields;for(s in l)s in r&&(n[l[s]]=r[s]);while(f[0]==="*")f.shift(),i===t&&(i=e.mimeType||n.getResponseHeader("content-type"));if(i)for(s in a)if(a[s]&&a[s].test(i)){f.unshift(s);break}if(f[0]in r)o=f[0];else{for(s in r){if(!f[0]||e.converters[s+" "+f[0]]){o=s;break}u||(u=s)}o=o||u}if(o)return o!==f[0]&&f.unshift(o),r[o]}function On(e,t){var n,r,i,s,o=e.dataTypes.slice(),u=o[0],a={},f=0;e.dataFilter&&(t=e.dataFilter(t,e.dataType));if(o[1])for(n in e.converters)a[n.toLowerCase()]=e.converters[n];for(;i=o[++f];)if(i!=="*"){if(u!=="*"&&u!==i){n=a[u+" "+i]||a["* "+i];if(!n)for(r in a){s=r.split(" ");if(s[1]===i){n=a[u+" "+s[0]]||a["* "+s[0]];if(n){n===!0?n=a[r]:a[r]!==!0&&(i=s[0],o.splice(f--,0,i));break}}}if(n!==!0)if(n&&e["throws"])t=n(t);else try{t=n(t)}catch(l){return{state:"parsererror",error:n?l:"No conversion from "+u+" to "+i}}}u=i}return{state:"success",data:t}}function Fn(){try{return new e.XMLHttpRequest}catch(t){}}function In(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function $n(){return setTimeout(function(){qn=t},0),qn=v.now()}function Jn(e,t){v.each(t,function(t,n){var r=(Vn[t]||[]).concat(Vn["*"]),i=0,s=r.length;for(;i<s;i++)if(r[i].call(e,t,n))return})}function Kn(e,t,n){var r,i=0,s=0,o=Xn.length,u=v.Deferred().always(function(){delete a.elem}),a=function(){var t=qn||$n(),n=Math.max(0,f.startTime+f.duration-t),r=n/f.duration||0,i=1-r,s=0,o=f.tweens.length;for(;s<o;s++)f.tweens[s].run(i);return u.notifyWith(e,[f,i,n]),i<1&&o?n:(u.resolveWith(e,[f]),!1)},f=u.promise({elem:e,props:v.extend({},t),opts:v.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:qn||$n(),duration:n.duration,tweens:[],createTween:function(t,n,r){var i=v.Tween(e,f.opts,t,n,f.opts.specialEasing[t]||f.opts.easing);return f.tweens.push(i),i},stop:function(t){var n=0,r=t?f.tweens.length:0;for(;n<r;n++)f.tweens[n].run(1);return t?u.resolveWith(e,[f,t]):u.rejectWith(e,[f,t]),this}}),l=f.props;Qn(l,f.opts.specialEasing);for(;i<o;i++){r=Xn[i].call(f,e,l,f.opts);if(r)return r}return Jn(f,l),v.isFunction(f.opts.start)&&f.opts.start.call(e,f),v.fx.timer(v.extend(a,{anim:f,queue:f.opts.queue,elem:e})),f.progress(f.opts.progress).done(f.opts.done,f.opts.complete).fail(f.opts.fail).always(f.opts.always)}function Qn(e,t){var n,r,i,s,o;for(n in e){r=v.camelCase(n),i=t[r],s=e[n],v.isArray(s)&&(i=s[1],s=e[n]=s[0]),n!==r&&(e[r]=s,delete e[n]),o=v.cssHooks[r];if(o&&"expand"in o){s=o.expand(s),delete e[r];for(n in s)n in e||(e[n]=s[n],t[n]=i)}else t[r]=i}}function Gn(e,t,n){var r,i,s,o,u,a,f,l,c,h=this,p=e.style,d={},m=[],g=e.nodeType&&Gt(e);n.queue||(l=v._queueHooks(e,"fx"),l.unqueued==null&&(l.unqueued=0,c=l.empty.fire,l.empty.fire=function(){l.unqueued||c()}),l.unqueued++,h.always(function(){h.always(function(){l.unqueued--,v.queue(e,"fx").length||l.empty.fire()})})),e.nodeType===1&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],v.css(e,"display")==="inline"&&v.css(e,"float")==="none"&&(!v.support.inlineBlockNeedsLayout||nn(e.nodeName)==="inline"?p.display="inline-block":p.zoom=1)),n.overflow&&(p.overflow="hidden",v.support.shrinkWrapBlocks||h.done(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t){s=t[r];if(Un.exec(s)){delete t[r],a=a||s==="toggle";if(s===(g?"hide":"show"))continue;m.push(r)}}o=m.length;if(o){u=v._data(e,"fxshow")||v._data(e,"fxshow",{}),"hidden"in u&&(g=u.hidden),a&&(u.hidden=!g),g?v(e).show():h.done(function(){v(e).hide()}),h.done(function(){var t;v.removeData(e,"fxshow",!0);for(t in d)v.style(e,t,d[t])});for(r=0;r<o;r++)i=m[r],f=h.createTween(i,g?u[i]:0),d[i]=u[i]||v.style(e,i),i in u||(u[i]=f.start,g&&(f.end=f.start,f.start=i==="width"||i==="height"?1:0))}}function Yn(e,t,n,r,i){return new Yn.prototype.init(e,t,n,r,i)}function Zn(e,t){var n,r={height:e},i=0;t=t?1:0;for(;i<4;i+=2-t)n=$t[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function tr(e){return v.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:!1}var n,r,i=e.document,s=e.location,o=e.navigator,u=e.jQuery,a=e.$,f=Array.prototype.push,l=Array.prototype.slice,c=Array.prototype.indexOf,h=Object.prototype.toString,p=Object.prototype.hasOwnProperty,d=String.prototype.trim,v=function(e,t){return new v.fn.init(e,t,n)},m=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,g=/\S/,y=/\s+/,b=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,w=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,T=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,N=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,C=/^-ms-/,k=/-([\da-z])/gi,L=function(e,t){return(t+"").toUpperCase()},A=function(){i.addEventListener?(i.removeEventListener("DOMContentLoaded",A,!1),v.ready()):i.readyState==="complete"&&(i.detachEvent("onreadystatechange",A),v.ready())},O={};v.fn=v.prototype={constructor:v,init:function(e,n,r){var s,o,u,a;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?s=[null,e,null]:s=w.exec(e);if(s&&(s[1]||!n)){if(s[1])return n=n instanceof v?n[0]:n,a=n&&n.nodeType?n.ownerDocument||n:i,e=v.parseHTML(s[1],a,!0),E.test(s[1])&&v.isPlainObject(n)&&this.attr.call(e,n,!0),v.merge(this,e);o=i.getElementById(s[2]);if(o&&o.parentNode){if(o.id!==s[2])return r.find(e);this.length=1,this[0]=o}return this.context=i,this.selector=e,this}return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e)}return v.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),v.makeArray(e,this))},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return l.call(this)},get:function(e){return e==null?this.toArray():e<0?this[this.length+e]:this[e]},pushStack:function(e,t,n){var r=v.merge(this.constructor(),e);return r.prevObject=this,r.context=this.context,t==="find"?r.selector=this.selector+(this.selector?" ":"")+n:t&&(r.selector=this.selector+"."+t+"("+n+")"),r},each:function(e,t){return v.each(this,e,t)},ready:function(e){return v.ready.promise().done(e),this},eq:function(e){return e=+e,e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(l.apply(this,arguments),"slice",l.call(arguments).join(","))},map:function(e){return this.pushStack(v.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:[].sort,splice:[].splice},v.fn.init.prototype=v.fn,v.extend=v.fn.extend=function(){var e,n,r,i,s,o,u=arguments[0]||{},a=1,f=arguments.length,l=!1;typeof u=="boolean"&&(l=u,u=arguments[1]||{},a=2),typeof u!="object"&&!v.isFunction(u)&&(u={}),f===a&&(u=this,--a);for(;a<f;a++)if((e=arguments[a])!=null)for(n in e){r=u[n],i=e[n];if(u===i)continue;l&&i&&(v.isPlainObject(i)||(s=v.isArray(i)))?(s?(s=!1,o=r&&v.isArray(r)?r:[]):o=r&&v.isPlainObject(r)?r:{},u[n]=v.extend(l,o,i)):i!==t&&(u[n]=i)}return u},v.extend({noConflict:function(t){return e.$===v&&(e.$=a),t&&e.jQuery===v&&(e.jQuery=u),v},isReady:!1,readyWait:1,holdReady:function(e){e?v.readyWait++:v.ready(!0)},ready:function(e){if(e===!0?--v.readyWait:v.isReady)return;if(!i.body)return setTimeout(v.ready,1);v.isReady=!0;if(e!==!0&&--v.readyWait>0)return;r.resolveWith(i,[v]),v.fn.trigger&&v(i).trigger("ready").off("ready")},isFunction:function(e){return v.type(e)==="function"},isArray:Array.isArray||function(e){return v.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):O[h.call(e)]||"object"},isPlainObject:function(e){if(!e||v.type(e)!=="object"||e.nodeType||v.isWindow(e))return!1;try{if(e.constructor&&!p.call(e,"constructor")&&!p.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||p.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return!e||typeof e!="string"?null:(typeof t=="boolean"&&(n=t,t=0),t=t||i,(r=E.exec(e))?[t.createElement(r[1])]:(r=v.buildFragment([e],t,n?null:[]),v.merge([],(r.cacheable?v.clone(r.fragment):r.fragment).childNodes)))},parseJSON:function(t){if(!t||typeof t!="string")return null;t=v.trim(t);if(e.JSON&&e.JSON.parse)return e.JSON.parse(t);if(S.test(t.replace(T,"@").replace(N,"]").replace(x,"")))return(new Function("return "+t))();v.error("Invalid JSON: "+t)},parseXML:function(n){var r,i;if(!n||typeof n!="string")return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(s){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&v.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&g.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(C,"ms-").replace(k,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,n,r){var i,s=0,o=e.length,u=o===t||v.isFunction(e);if(r){if(u){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;s<o;)if(n.apply(e[s++],r)===!1)break}else if(u){for(i in e)if(n.call(e[i],i,e[i])===!1)break}else for(;s<o;)if(n.call(e[s],s,e[s++])===!1)break;return e},trim:d&&!d.call("\ufeff\u00a0")?function(e){return e==null?"":d.call(e)}:function(e){return e==null?"":(e+"").replace(b,"")},makeArray:function(e,t){var n,r=t||[];return e!=null&&(n=v.type(e),e.length==null||n==="string"||n==="function"||n==="regexp"||v.isWindow(e)?f.call(r,e):v.merge(r,e)),r},inArray:function(e,t,n){var r;if(t){if(c)return c.call(t,e,n);r=t.length,n=n?n<0?Math.max(0,r+n):n:0;for(;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,s=0;if(typeof r=="number")for(;s<r;s++)e[i++]=n[s];else while(n[s]!==t)e[i++]=n[s++];return e.length=i,e},grep:function(e,t,n){var r,i=[],s=0,o=e.length;n=!!n;for(;s<o;s++)r=!!t(e[s],s),n!==r&&i.push(e[s]);return i},map:function(e,n,r){var i,s,o=[],u=0,a=e.length,f=e instanceof v||a!==t&&typeof a=="number"&&(a>0&&e[0]&&e[a-1]||a===0||v.isArray(e));if(f)for(;u<a;u++)i=n(e[u],u,r),i!=null&&(o[o.length]=i);else for(s in e)i=n(e[s],s,r),i!=null&&(o[o.length]=i);return o.concat.apply([],o)},guid:1,proxy:function(e,n){var r,i,s;return typeof n=="string"&&(r=e[n],n=e,e=r),v.isFunction(e)?(i=l.call(arguments,2),s=function(){return e.apply(n,i.concat(l.call(arguments)))},s.guid=e.guid=e.guid||v.guid++,s):t},access:function(e,n,r,i,s,o,u){var a,f=r==null,l=0,c=e.length;if(r&&typeof r=="object"){for(l in r)v.access(e,n,l,r[l],1,o,i);s=1}else if(i!==t){a=u===t&&v.isFunction(i),f&&(a?(a=n,n=function(e,t,n){return a.call(v(e),n)}):(n.call(e,i),n=null));if(n)for(;l<c;l++)n(e[l],r,a?i.call(e[l],l,n(e[l],r)):i,u);s=1}return s?e:f?n.call(e):c?n(e[0],r):o},now:function(){return(new Date).getTime()}}),v.ready.promise=function(t){if(!r){r=v.Deferred();if(i.readyState==="complete")setTimeout(v.ready,1);else if(i.addEventListener)i.addEventListener("DOMContentLoaded",A,!1),e.addEventListener("load",v.ready,!1);else{i.attachEvent("onreadystatechange",A),e.attachEvent("onload",v.ready);var n=!1;try{n=e.frameElement==null&&i.documentElement}catch(s){}n&&n.doScroll&&function o(){if(!v.isReady){try{n.doScroll("left")}catch(e){return setTimeout(o,50)}v.ready()}}()}}return r.promise(t)},v.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(e,t){O["[object "+t+"]"]=t.toLowerCase()}),n=v(i);var M={};v.Callbacks=function(e){e=typeof e=="string"?M[e]||_(e):v.extend({},e);var n,r,i,s,o,u,a=[],f=!e.once&&[],l=function(t){n=e.memory&&t,r=!0,u=s||0,s=0,o=a.length,i=!0;for(;a&&u<o;u++)if(a[u].apply(t[0],t[1])===!1&&e.stopOnFalse){n=!1;break}i=!1,a&&(f?f.length&&l(f.shift()):n?a=[]:c.disable())},c={add:function(){if(a){var t=a.length;(function r(t){v.each(t,function(t,n){var i=v.type(n);i==="function"?(!e.unique||!c.has(n))&&a.push(n):n&&n.length&&i!=="string"&&r(n)})})(arguments),i?o=a.length:n&&(s=t,l(n))}return this},remove:function(){return a&&v.each(arguments,function(e,t){var n;while((n=v.inArray(t,a,n))>-1)a.splice(n,1),i&&(n<=o&&o--,n<=u&&u--)}),this},has:function(e){return v.inArray(e,a)>-1},empty:function(){return a=[],this},disable:function(){return a=f=n=t,this},disabled:function(){return!a},lock:function(){return f=t,n||c.disable(),this},locked:function(){return!f},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],a&&(!r||f)&&(i?f.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},v.extend({Deferred:function(e){var t=[["resolve","done",v.Callbacks("once memory"),"resolved"],["reject","fail",v.Callbacks("once memory"),"rejected"],["notify","progress",v.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return v.Deferred(function(n){v.each(t,function(t,r){var s=r[0],o=e[t];i[r[1]](v.isFunction(o)?function(){var e=o.apply(this,arguments);e&&v.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===i?n:this,[e])}:n[s])}),e=null}).promise()},promise:function(e){return e!=null?v.extend(e,r):r}},i={};return r.pipe=r.then,v.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=o.fire,i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=l.call(arguments),r=n.length,i=r!==1||e&&v.isFunction(e.promise)?r:0,s=i===1?e:v.Deferred(),o=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?l.call(arguments):r,n===u?s.notifyWith(t,n):--i||s.resolveWith(t,n)}},u,a,f;if(r>1){u=new Array(r),a=new Array(r),f=new Array(r);for(;t<r;t++)n[t]&&v.isFunction(n[t].promise)?n[t].promise().done(o(t,f,n)).fail(s.reject).progress(o(t,a,u)):--i}return i||s.resolveWith(f,n),s.promise()}}),v.support=function(){var t,n,r,s,o,u,a,f,l,c,h,p=i.createElement("div");p.setAttribute("className","t"),p.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0];if(!n||!r||!n.length)return{};s=i.createElement("select"),o=s.appendChild(i.createElement("option")),u=p.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:r.getAttribute("href")==="/a",opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:u.value==="on",optSelected:o.selected,getSetAttribute:p.className!=="t",enctype:!!i.createElement("form").enctype,html5Clone:i.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:i.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},u.checked=!0,t.noCloneChecked=u.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",h=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",h)),u=i.createElement("input"),u.value="t",u.setAttribute("type","radio"),t.radioValue=u.value==="t",u.setAttribute("checked","checked"),u.setAttribute("name","t"),p.appendChild(u),a=i.createDocumentFragment(),a.appendChild(p.lastChild),t.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=u.checked,a.removeChild(u),a.appendChild(p);if(p.attachEvent)for(l in{submit:!0,change:!0,focusin:!0})f="on"+l,c=f in p,c||(p.setAttribute(f,"return;"),c=typeof p[f]=="function"),t[l+"Bubbles"]=c;return v(function(){var n,r,s,o,u="padding:0;margin:0;border:0;display:block;overflow:hidden;",a=i.getElementsByTagName("body")[0];if(!a)return;n=i.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",a.insertBefore(n,a.firstChild),r=i.createElement("div"),n.appendChild(r),r.innerHTML="<table><tr><td></td><td>t</td></tr></table>",s=r.getElementsByTagName("td"),s[0].style.cssText="padding:0;margin:0;border:0;display:none",c=s[0].offsetHeight===0,s[0].style.display="",s[1].style.display="none",t.reliableHiddenOffsets=c&&s[0].offsetHeight===0,r.innerHTML="",r.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=r.offsetWidth===4,t.doesNotIncludeMarginInBodyOffset=a.offsetTop!==1,e.getComputedStyle&&(t.pixelPosition=(e.getComputedStyle(r,null)||{}).top!=="1%",t.boxSizingReliable=(e.getComputedStyle(r,null)||{width:"4px"}).width==="4px",o=i.createElement("div"),o.style.cssText=r.style.cssText=u,o.style.marginRight=o.style.width="0",r.style.width="1px",r.appendChild(o),t.reliableMarginRight=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight)),typeof r.style.zoom!="undefined"&&(r.innerHTML="",r.style.cssText=u+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=r.offsetWidth===3,r.style.display="block",r.style.overflow="visible",r.innerHTML="<div></div>",r.firstChild.style.width="5px",t.shrinkWrapBlocks=r.offsetWidth!==3,n.style.zoom=1),a.removeChild(n),n=r=s=o=null}),a.removeChild(p),n=r=s=o=u=a=p=null,t}();var D=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;v.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(v.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?v.cache[e[v.expando]]:e[v.expando],!!e&&!B(e)},data:function(e,n,r,i){if(!v.acceptData(e))return;var s,o,u=v.expando,a=typeof n=="string",f=e.nodeType,l=f?v.cache:e,c=f?e[u]:e[u]&&u;if((!c||!l[c]||!i&&!l[c].data)&&a&&r===t)return;c||(f?e[u]=c=v.deletedIds.pop()||v.guid++:c=u),l[c]||(l[c]={},f||(l[c].toJSON=v.noop));if(typeof n=="object"||typeof n=="function")i?l[c]=v.extend(l[c],n):l[c].data=v.extend(l[c].data,n);return s=l[c],i||(s.data||(s.data={}),s=s.data),r!==t&&(s[v.camelCase(n)]=r),a?(o=s[n],o==null&&(o=s[v.camelCase(n)])):o=s,o},removeData:function(e,t,n){if(!v.acceptData(e))return;var r,i,s,o=e.nodeType,u=o?v.cache:e,a=o?e[v.expando]:v.expando;if(!u[a])return;if(t){r=n?u[a]:u[a].data;if(r){v.isArray(t)||(t in r?t=[t]:(t=v.camelCase(t),t in r?t=[t]:t=t.split(" ")));for(i=0,s=t.length;i<s;i++)delete r[t[i]];if(!(n?B:v.isEmptyObject)(r))return}}if(!n){delete u[a].data;if(!B(u[a]))return}o?v.cleanData([e],!0):v.support.deleteExpando||u!=u.window?delete u[a]:u[a]=null},_data:function(e,t,n){return v.data(e,t,n,!0)},acceptData:function(e){var t=e.nodeName&&v.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),v.fn.extend({data:function(e,n){var r,i,s,o,u,a=this[0],f=0,l=null;if(e===t){if(this.length){l=v.data(a);if(a.nodeType===1&&!v._data(a,"parsedAttrs")){s=a.attributes;for(u=s.length;f<u;f++)o=s[f].name,o.indexOf("data-")||(o=v.camelCase(o.substring(5)),H(a,o,l[o]));v._data(a,"parsedAttrs",!0)}}return l}return typeof e=="object"?this.each(function(){v.data(this,e)}):(r=e.split(".",2),r[1]=r[1]?"."+r[1]:"",i=r[1]+"!",v.access(this,function(n){if(n===t)return l=this.triggerHandler("getData"+i,[r[0]]),l===t&&a&&(l=v.data(a,e),l=H(a,e,l)),l===t&&r[1]?this.data(r[0]):l;r[1]=n,this.each(function(){var t=v(this);t.triggerHandler("setData"+i,r),v.data(this,e,n),t.triggerHandler("changeData"+i,r)})},null,n,arguments.length>1,null,!1))},removeData:function(e){return this.each(function(){v.removeData(this,e)})}}),v.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=v._data(e,t),n&&(!r||v.isArray(n)?r=v._data(e,t,v.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=v.queue(e,t),r=n.length,i=n.shift(),s=v._queueHooks(e,t),o=function(){v.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return v._data(e,n)||v._data(e,n,{empty:v.Callbacks("once memory").add(function(){v.removeData(e,t+"queue",!0),v.removeData(e,n,!0)})})}}),v.fn.extend({queue:function(e,n){var r=2;return typeof e!="string"&&(n=e,e="fx",r--),arguments.length<r?v.queue(this[0],e):n===t?this:this.each(function(){var t=v.queue(this,e,n);v._queueHooks(this,e),e==="fx"&&t[0]!=="inprogress"&&v.dequeue(this,e)})},dequeue:function(e){return this.each(function(){v.dequeue(this,e)})},delay:function(e,t){return e=v.fx?v.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,s=v.Deferred(),o=this,u=this.length,a=function(){--i||s.resolveWith(o,[o])};typeof e!="string"&&(n=e,e=t),e=e||"fx";while(u--)r=v._data(o[u],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(a));return a(),s.promise(n)}});var j,F,I,q=/[\t\r\n]/g,R=/\r/g,U=/^(?:button|input)$/i,z=/^(?:button|input|object|select|textarea)$/i,W=/^a(?:rea|)$/i,X=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,V=v.support.getSetAttribute;v.fn.extend({attr:function(e,t){return v.access(this,v.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){v.removeAttr(this,e)})},prop:function(e,t){return v.access(this,v.prop,e,t,arguments.length>1)},removeProp:function(e){return e=v.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,s,o,u;if(v.isFunction(e))return this.each(function(t){v(this).addClass(e.call(this,t,this.className))});if(e&&typeof e=="string"){t=e.split(y);for(n=0,r=this.length;n<r;n++){i=this[n];if(i.nodeType===1)if(!i.className&&t.length===1)i.className=e;else{s=" "+i.className+" ";for(o=0,u=t.length;o<u;o++)s.indexOf(" "+t[o]+" ")<0&&(s+=t[o]+" ");i.className=v.trim(s)}}}return this},removeClass:function(e){var n,r,i,s,o,u,a;if(v.isFunction(e))return this.each(function(t){v(this).removeClass(e.call(this,t,this.className))});if(e&&typeof e=="string"||e===t){n=(e||"").split(y);for(u=0,a=this.length;u<a;u++){i=this[u];if(i.nodeType===1&&i.className){r=(" "+i.className+" ").replace(q," ");for(s=0,o=n.length;s<o;s++)while(r.indexOf(" "+n[s]+" ")>=0)r=r.replace(" "+n[s]+" "," ");i.className=e?v.trim(r):""}}}return this},toggleClass:function(e,t){var n=typeof e,r=typeof t=="boolean";return v.isFunction(e)?this.each(function(n){v(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var i,s=0,o=v(this),u=t,a=e.split(y);while(i=a[s++])u=r?u:!o.hasClass(i),o[u?"addClass":"removeClass"](i)}else if(n==="undefined"||n==="boolean")this.className&&v._data(this,"__className__",this.className),this.className=this.className||e===!1?"":v._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n<r;n++)if(this[n].nodeType===1&&(" "+this[n].className+" ").replace(q," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,s=this[0];if(!arguments.length){if(s)return n=v.valHooks[s.type]||v.valHooks[s.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(s,"value"))!==t?r:(r=s.value,typeof r=="string"?r.replace(R,""):r==null?"":r);return}return i=v.isFunction(e),this.each(function(r){var s,o=v(this);if(this.nodeType!==1)return;i?s=e.call(this,r,o.val()):s=e,s==null?s="":typeof s=="number"?s+="":v.isArray(s)&&(s=v.map(s,function(e){return e==null?"":e+""})),n=v.valHooks[this.type]||v.valHooks[this.nodeName.toLowerCase()];if(!n||!("set"in n)||n.set(this,s,"value")===t)this.value=s})}}),v.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a<u;a++){n=r[a];if((n.selected||a===i)&&(v.support.optDisabled?!n.disabled:n.getAttribute("disabled")===null)&&(!n.parentNode.disabled||!v.nodeName(n.parentNode,"optgroup"))){t=v(n).val();if(s)return t;o.push(t)}}return o},set:function(e,t){var n=v.makeArray(t);return v(e).find("option").each(function(){this.selected=v.inArray(v(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{},attr:function(e,n,r,i){var s,o,u,a=e.nodeType;if(!e||a===3||a===8||a===2)return;if(i&&v.isFunction(v.fn[n]))return v(e)[n](r);if(typeof e.getAttribute=="undefined")return v.prop(e,n,r);u=a!==1||!v.isXMLDoc(e),u&&(n=n.toLowerCase(),o=v.attrHooks[n]||(X.test(n)?F:j));if(r!==t){if(r===null){v.removeAttr(e,n);return}return o&&"set"in o&&u&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r)}return o&&"get"in o&&u&&(s=o.get(e,n))!==null?s:(s=e.getAttribute(n),s===null?t:s)},removeAttr:function(e,t){var n,r,i,s,o=0;if(t&&e.nodeType===1){r=t.split(y);for(;o<r.length;o++)i=r[o],i&&(n=v.propFix[i]||i,s=X.test(i),s||v.attr(e,i,""),e.removeAttribute(V?i:n),s&&n in e&&(e[n]=!1))}},attrHooks:{type:{set:function(e,t){if(U.test(e.nodeName)&&e.parentNode)v.error("type property can't be changed");else if(!v.support.radioValue&&t==="radio"&&v.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}},value:{get:function(e,t){return j&&v.nodeName(e,"button")?j.get(e,t):t in e?e.value:null},set:function(e,t,n){if(j&&v.nodeName(e,"button"))return j.set(e,t,n);e.value=t}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,s,o,u=e.nodeType;if(!e||u===3||u===8||u===2)return;return o=u!==1||!v.isXMLDoc(e),o&&(n=v.propFix[n]||n,s=v.propHooks[n]),r!==t?s&&"set"in s&&(i=s.set(e,r,n))!==t?i:e[n]=r:s&&"get"in s&&(i=s.get(e,n))!==null?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):z.test(e.nodeName)||W.test(e.nodeName)&&e.href?0:t}}}}),F={get:function(e,n){var r,i=v.prop(e,n);return i===!0||typeof i!="boolean"&&(r=e.getAttributeNode(n))&&r.nodeValue!==!1?n.toLowerCase():t},set:function(e,t,n){var r;return t===!1?v.removeAttr(e,n):(r=v.propFix[n]||n,r in e&&(e[r]=!0),e.setAttribute(n,n.toLowerCase())),n}},V||(I={name:!0,id:!0,coords:!0},j=v.valHooks.button={get:function(e,n){var r;return r=e.getAttributeNode(n),r&&(I[n]?r.value!=="":r.specified)?r.value:t},set:function(e,t,n){var r=e.getAttributeNode(n);return r||(r=i.createAttribute(n),e.setAttributeNode(r)),r.value=t+""}},v.each(["width","height"],function(e,t){v.attrHooks[t]=v.extend(v.attrHooks[t],{set:function(e,n){if(n==="")return e.setAttribute(t,"auto"),n}})}),v.attrHooks.contenteditable={get:j.get,set:function(e,t,n){t===""&&(t="false"),j.set(e,t,n)}}),v.support.hrefNormalized||v.each(["href","src","width","height"],function(e,n){v.attrHooks[n]=v.extend(v.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return r===null?t:r}})}),v.support.style||(v.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||t},set:function(e,t){return e.style.cssText=t+""}}),v.support.optSelected||(v.propHooks.selected=v.extend(v.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),v.support.enctype||(v.propFix.enctype="encoding"),v.support.checkOn||v.each(["radio","checkbox"],function(){v.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}}),v.each(["radio","checkbox"],function(){v.valHooks[this]=v.extend(v.valHooks[this],{set:function(e,t){if(v.isArray(t))return e.checked=v.inArray(v(e).val(),t)>=0}})});var $=/^(?:textarea|input|select)$/i,J=/^([^\.]*|)(?:\.(.+)|)$/,K=/(?:^|\s)hover(\.\S+|)\b/,Q=/^key/,G=/^(?:mouse|contextmenu)|click/,Y=/^(?:focusinfocus|focusoutblur)$/,Z=function(e){return v.event.special.hover?e:e.replace(K,"mouseenter$1 mouseleave$1")};v.event={add:function(e,n,r,i,s){var o,u,a,f,l,c,h,p,d,m,g;if(e.nodeType===3||e.nodeType===8||!n||!r||!(o=v._data(e)))return;r.handler&&(d=r,r=d.handler,s=d.selector),r.guid||(r.guid=v.guid++),a=o.events,a||(o.events=a={}),u=o.handle,u||(o.handle=u=function(e){return typeof v=="undefined"||!!e&&v.event.triggered===e.type?t:v.event.dispatch.apply(u.elem,arguments)},u.elem=e),n=v.trim(Z(n)).split(" ");for(f=0;f<n.length;f++){l=J.exec(n[f])||[],c=l[1],h=(l[2]||"").split(".").sort(),g=v.event.special[c]||{},c=(s?g.delegateType:g.bindType)||c,g=v.event.special[c]||{},p=v.extend({type:c,origType:l[1],data:i,handler:r,guid:r.guid,selector:s,needsContext:s&&v.expr.match.needsContext.test(s),namespace:h.join(".")},d),m=a[c];if(!m){m=a[c]=[],m.delegateCount=0;if(!g.setup||g.setup.call(e,i,h,u)===!1)e.addEventListener?e.addEventListener(c,u,!1):e.attachEvent&&e.attachEvent("on"+c,u)}g.add&&(g.add.call(e,p),p.handler.guid||(p.handler.guid=r.guid)),s?m.splice(m.delegateCount++,0,p):m.push(p),v.event.global[c]=!0}e=null},global:{},remove:function(e,t,n,r,i){var s,o,u,a,f,l,c,h,p,d,m,g=v.hasData(e)&&v._data(e);if(!g||!(h=g.events))return;t=v.trim(Z(t||"")).split(" ");for(s=0;s<t.length;s++){o=J.exec(t[s])||[],u=a=o[1],f=o[2];if(!u){for(u in h)v.event.remove(e,u+t[s],n,r,!0);continue}p=v.event.special[u]||{},u=(r?p.delegateType:p.bindType)||u,d=h[u]||[],l=d.length,f=f?new RegExp("(^|\\.)"+f.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(c=0;c<d.length;c++)m=d[c],(i||a===m.origType)&&(!n||n.guid===m.guid)&&(!f||f.test(m.namespace))&&(!r||r===m.selector||r==="**"&&m.selector)&&(d.splice(c--,1),m.selector&&d.delegateCount--,p.remove&&p.remove.call(e,m));d.length===0&&l!==d.length&&((!p.teardown||p.teardown.call(e,f,g.handle)===!1)&&v.removeEvent(e,u,g.handle),delete h[u])}v.isEmptyObject(h)&&(delete g.handle,v.removeData(e,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(n,r,s,o){if(!s||s.nodeType!==3&&s.nodeType!==8){var u,a,f,l,c,h,p,d,m,g,y=n.type||n,b=[];if(Y.test(y+v.event.triggered))return;y.indexOf("!")>=0&&(y=y.slice(0,-1),a=!0),y.indexOf(".")>=0&&(b=y.split("."),y=b.shift(),b.sort());if((!s||v.event.customEvent[y])&&!v.event.global[y])return;n=typeof n=="object"?n[v.expando]?n:new v.Event(y,n):new v.Event(y),n.type=y,n.isTrigger=!0,n.exclusive=a,n.namespace=b.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,h=y.indexOf(":")<0?"on"+y:"";if(!s){u=v.cache;for(f in u)u[f].events&&u[f].events[y]&&v.event.trigger(n,r,u[f].handle.elem,!0);return}n.result=t,n.target||(n.target=s),r=r!=null?v.makeArray(r):[],r.unshift(n),p=v.event.special[y]||{};if(p.trigger&&p.trigger.apply(s,r)===!1)return;m=[[s,p.bindType||y]];if(!o&&!p.noBubble&&!v.isWindow(s)){g=p.delegateType||y,l=Y.test(g+y)?s:s.parentNode;for(c=s;l;l=l.parentNode)m.push([l,g]),c=l;c===(s.ownerDocument||i)&&m.push([c.defaultView||c.parentWindow||e,g])}for(f=0;f<m.length&&!n.isPropagationStopped();f++)l=m[f][0],n.type=m[f][1],d=(v._data(l,"events")||{})[n.type]&&v._data(l,"handle"),d&&d.apply(l,r),d=h&&l[h],d&&v.acceptData(l)&&d.apply&&d.apply(l,r)===!1&&n.preventDefault();return n.type=y,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(s.ownerDocument,r)===!1)&&(y!=="click"||!v.nodeName(s,"a"))&&v.acceptData(s)&&h&&s[y]&&(y!=="focus"&&y!=="blur"||n.target.offsetWidth!==0)&&!v.isWindow(s)&&(c=s[h],c&&(s[h]=null),v.event.triggered=y,s[y](),v.event.triggered=t,c&&(s[h]=c)),n.result}return},dispatch:function(n){n=v.event.fix(n||e.event);var r,i,s,o,u,a,f,c,h,p,d=(v._data(this,"events")||{})[n.type]||[],m=d.delegateCount,g=l.call(arguments),y=!n.exclusive&&!n.namespace,b=v.event.special[n.type]||{},w=[];g[0]=n,n.delegateTarget=this;if(b.preDispatch&&b.preDispatch.call(this,n)===!1)return;if(m&&(!n.button||n.type!=="click"))for(s=n.target;s!=this;s=s.parentNode||this)if(s.disabled!==!0||n.type!=="click"){u={},f=[];for(r=0;r<m;r++)c=d[r],h=c.selector,u[h]===t&&(u[h]=c.needsContext?v(h,this).index(s)>=0:v.find(h,this,null,[s]).length),u[h]&&f.push(c);f.length&&w.push({elem:s,matches:f})}d.length>m&&w.push({elem:this,matches:d.slice(m)});for(r=0;r<w.length&&!n.isPropagationStopped();r++){a=w[r],n.currentTarget=a.elem;for(i=0;i<a.matches.length&&!n.isImmediatePropagationStopped();i++){c=a.matches[i];if(y||!n.namespace&&!c.namespace||n.namespace_re&&n.namespace_re.test(c.namespace))n.data=c.data,n.handleObj=c,o=((v.event.special[c.origType]||{}).handle||c.handler).apply(a.elem,g),o!==t&&(n.result=o,o===!1&&(n.preventDefault(),n.stopPropagation()))}}return b.postDispatch&&b.postDispatch.call(this,n),n.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return e.which==null&&(e.which=t.charCode!=null?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,s,o,u=n.button,a=n.fromElement;return e.pageX==null&&n.clientX!=null&&(r=e.target.ownerDocument||i,s=r.documentElement,o=r.body,e.pageX=n.clientX+(s&&s.scrollLeft||o&&o.scrollLeft||0)-(s&&s.clientLeft||o&&o.clientLeft||0),e.pageY=n.clientY+(s&&s.scrollTop||o&&o.scrollTop||0)-(s&&s.clientTop||o&&o.clientTop||0)),!e.relatedTarget&&a&&(e.relatedTarget=a===e.target?n.toElement:a),!e.which&&u!==t&&(e.which=u&1?1:u&2?3:u&4?2:0),e}},fix:function(e){if(e[v.expando])return e;var t,n,r=e,s=v.event.fixHooks[e.type]||{},o=s.props?this.props.concat(s.props):this.props;e=v.Event(r);for(t=o.length;t;)n=o[--t],e[n]=r[n];return e.target||(e.target=r.srcElement||i),e.target.nodeType===3&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,r):e},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(e,t,n){v.isWindow(this)&&(this.onbeforeunload=n)},teardown:function(e,t){this.onbeforeunload===t&&(this.onbeforeunload=null)}}},simulate:function(e,t,n,r){var i=v.extend(new v.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?v.event.trigger(i,null,t):v.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},v.event.handle=v.event.dispatch,v.removeEvent=i.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]=="undefined"&&(e[r]=null),e.detachEvent(r,n))},v.Event=function(e,t){if(!(this instanceof v.Event))return new v.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?tt:et):this.type=e,t&&v.extend(this,t),this.timeStamp=e&&e.timeStamp||v.now(),this[v.expando]=!0},v.Event.prototype={preventDefault:function(){this.isDefaultPrevented=tt;var e=this.originalEvent;if(!e)return;e.preventDefault?e.preventDefault():e.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=tt;var e=this.originalEvent;if(!e)return;e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=tt,this.stopPropagation()},isDefaultPrevented:et,isPropagationStopped:et,isImmediatePropagationStopped:et},v.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){v.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,s=e.handleObj,o=s.selector;if(!i||i!==r&&!v.contains(r,i))e.type=s.origType,n=s.handler.apply(this,arguments),e.type=t;return n}}}),v.support.submitBubbles||(v.event.special.submit={setup:function(){if(v.nodeName(this,"form"))return!1;v.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=v.nodeName(n,"input")||v.nodeName(n,"button")?n.form:t;r&&!v._data(r,"_submit_attached")&&(v.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),v._data(r,"_submit_attached",!0))})},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&v.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){if(v.nodeName(this,"form"))return!1;v.event.remove(this,"._submit")}}),v.support.changeBubbles||(v.event.special.change={setup:function(){if($.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")v.event.add(this,"propertychange._change",function(e){e.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),v.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),v.event.simulate("change",this,e,!0)});return!1}v.event.add(this,"beforeactivate._change",function(e){var t=e.target;$.test(t.nodeName)&&!v._data(t,"_change_attached")&&(v.event.add(t,"change._change",function(e){this.parentNode&&!e.isSimulated&&!e.isTrigger&&v.event.simulate("change",this.parentNode,e,!0)}),v._data(t,"_change_attached",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||t.type!=="radio"&&t.type!=="checkbox")return e.handleObj.handler.apply(this,arguments)},teardown:function(){return v.event.remove(this,"._change"),!$.test(this.nodeName)}}),v.support.focusinBubbles||v.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){v.event.simulate(t,e.target,v.event.fix(e),!0)};v.event.special[t]={setup:function(){n++===0&&i.addEventListener(e,r,!0)},teardown:function(){--n===0&&i.removeEventListener(e,r,!0)}}}),v.fn.extend({on:function(e,n,r,i,s){var o,u;if(typeof e=="object"){typeof n!="string"&&(r=r||n,n=t);for(u in e)this.on(u,n,r,e[u],s);return this}r==null&&i==null?(i=n,r=n=t):i==null&&(typeof n=="string"?(i=r,r=t):(i=r,r=n,n=t));if(i===!1)i=et;else if(!i)return this;return s===1&&(o=i,i=function(e){return v().off(e),o.apply(this,arguments)},i.guid=o.guid||(o.guid=v.guid++)),this.each(function(){v.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,s;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,v(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if(typeof e=="object"){for(s in e)this.off(s,n,e[s]);return this}if(n===!1||typeof n=="function")r=n,n=t;return r===!1&&(r=et),this.each(function(){v.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},live:function(e,t,n){return v(this.context).on(e,this.selector,t,n),this},die:function(e,t){return v(this.context).off(e,this.selector||"**",t),this},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return arguments.length===1?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){v.event.trigger(e,t,this)})},triggerHandler:function(e,t){if(this[0])return v.event.trigger(e,t,this[0],!0)},toggle:function(e){var t=arguments,n=e.guid||v.guid++,r=0,i=function(n){var i=(v._data(this,"lastToggle"+e.guid)||0)%r;return v._data(this,"lastToggle"+e.guid,i+1),n.preventDefault(),t[i].apply(this,arguments)||!1};i.guid=n;while(r<t.length)t[r++].guid=n;return this.click(i)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),v.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){v.fn[t]=function(e,n){return n==null&&(n=e,e=null),arguments.length>0?this.on(t,null,e,n):this.trigger(t)},Q.test(t)&&(v.event.fixHooks[t]=v.event.keyHooks),G.test(t)&&(v.event.fixHooks[t]=v.event.mouseHooks)}),function(e,t){function nt(e,t,n,r){n=n||[],t=t||g;var i,s,a,f,l=t.nodeType;if(!e||typeof e!="string")return n;if(l!==1&&l!==9)return[];a=o(t);if(!a&&!r)if(i=R.exec(e))if(f=i[1]){if(l===9){s=t.getElementById(f);if(!s||!s.parentNode)return n;if(s.id===f)return n.push(s),n}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(f))&&u(t,s)&&s.id===f)return n.push(s),n}else{if(i[2])return S.apply(n,x.call(t.getElementsByTagName(e),0)),n;if((f=i[3])&&Z&&t.getElementsByClassName)return S.apply(n,x.call(t.getElementsByClassName(f),0)),n}return vt(e.replace(j,"$1"),t,n,r,a)}function rt(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function it(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function st(e){return N(function(t){return t=+t,N(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ot(e,t,n){if(e===t)return n;var r=e.nextSibling;while(r){if(r===t)return-1;r=r.nextSibling}return 1}function ut(e,t){var n,r,s,o,u,a,f,l=L[d][e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=i.preFilter;while(u){if(!n||(r=F.exec(u)))r&&(u=u.slice(r[0].length)||u),a.push(s=[]);n=!1;if(r=I.exec(u))s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=r[0].replace(j," ");for(o in i.filter)(r=J[o].exec(u))&&(!f[o]||(r=f[o](r)))&&(s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=o,n.matches=r);if(!n)break}return t?u.length:u?nt.error(e):L(e,a).slice(0)}function at(e,t,r){var i=t.dir,s=r&&t.dir==="parentNode",o=w++;return t.first?function(t,n,r){while(t=t[i])if(s||t.nodeType===1)return e(t,n,r)}:function(t,r,u){if(!u){var a,f=b+" "+o+" ",l=f+n;while(t=t[i])if(s||t.nodeType===1){if((a=t[d])===l)return t.sizset;if(typeof a=="string"&&a.indexOf(f)===0){if(t.sizset)return t}else{t[d]=l;if(e(t,r,u))return t.sizset=!0,t;t.sizset=!1}}}else while(t=t[i])if(s||t.nodeType===1)if(e(t,r,u))return t}}function ft(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function lt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u<a;u++)if(s=e[u])if(!n||n(s,r,i))o.push(s),f&&t.push(u);return o}function ct(e,t,n,r,i,s){return r&&!r[d]&&(r=ct(r)),i&&!i[d]&&(i=ct(i,s)),N(function(s,o,u,a){var f,l,c,h=[],p=[],d=o.length,v=s||dt(t||"*",u.nodeType?[u]:u,[]),m=e&&(s||!t)?lt(v,h,e,u,a):v,g=n?i||(s?e:d||r)?[]:o:m;n&&n(m,g,u,a);if(r){f=lt(g,p),r(f,[],u,a),l=f.length;while(l--)if(c=f[l])g[p[l]]=!(m[p[l]]=c)}if(s){if(i||e){if(i){f=[],l=g.length;while(l--)(c=g[l])&&f.push(m[l]=c);i(null,g=[],f,a)}l=g.length;while(l--)(c=g[l])&&(f=i?T.call(s,c):h[l])>-1&&(s[f]=!(o[f]=c))}}else g=lt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):S.apply(o,g)})}function ht(e){var t,n,r,s=e.length,o=i.relative[e[0].type],u=o||i.relative[" "],a=o?1:0,f=at(function(e){return e===t},u,!0),l=at(function(e){return T.call(t,e)>-1},u,!0),h=[function(e,n,r){return!o&&(r||n!==c)||((t=n).nodeType?f(e,n,r):l(e,n,r))}];for(;a<s;a++)if(n=i.relative[e[a].type])h=[at(ft(h),n)];else{n=i.filter[e[a].type].apply(null,e[a].matches);if(n[d]){r=++a;for(;r<s;r++)if(i.relative[e[r].type])break;return ct(a>1&&ft(h),a>1&&e.slice(0,a-1).join("").replace(j,"$1"),n,a<r&&ht(e.slice(a,r)),r<s&&ht(e=e.slice(r)),r<s&&e.join(""))}h.push(n)}return ft(h)}function pt(e,t){var r=t.length>0,s=e.length>0,o=function(u,a,f,l,h){var p,d,v,m=[],y=0,w="0",x=u&&[],T=h!=null,N=c,C=u||s&&i.find.TAG("*",h&&a.parentNode||a),k=b+=N==null?1:Math.E;T&&(c=a!==g&&a,n=o.el);for(;(p=C[w])!=null;w++){if(s&&p){for(d=0;v=e[d];d++)if(v(p,a,f)){l.push(p);break}T&&(b=k,n=++o.el)}r&&((p=!v&&p)&&y--,u&&x.push(p))}y+=w;if(r&&w!==y){for(d=0;v=t[d];d++)v(x,m,a,f);if(u){if(y>0)while(w--)!x[w]&&!m[w]&&(m[w]=E.call(l));m=lt(m)}S.apply(l,m),T&&!u&&m.length>0&&y+t.length>1&&nt.uniqueSort(l)}return T&&(b=k,c=N),x};return o.el=0,r?N(o):o}function dt(e,t,n){var r=0,i=t.length;for(;r<i;r++)nt(e,t[r],n);return n}function vt(e,t,n,r,s){var o,u,f,l,c,h=ut(e),p=h.length;if(!r&&h.length===1){u=h[0]=h[0].slice(0);if(u.length>2&&(f=u[0]).type==="ID"&&t.nodeType===9&&!s&&i.relative[u[1].type]){t=i.find.ID(f.matches[0].replace($,""),t,s)[0];if(!t)return n;e=e.slice(u.shift().length)}for(o=J.POS.test(e)?-1:u.length-1;o>=0;o--){f=u[o];if(i.relative[l=f.type])break;if(c=i.find[l])if(r=c(f.matches[0].replace($,""),z.test(u[0].type)&&t.parentNode||t,s)){u.splice(o,1),e=r.length&&u.join("");if(!e)return S.apply(n,x.call(r,0)),n;break}}}return a(e,h)(r,t,s,n,z.test(e)),n}function mt(){}var n,r,i,s,o,u,a,f,l,c,h=!0,p="undefined",d=("sizcache"+Math.random()).replace(".",""),m=String,g=e.document,y=g.documentElement,b=0,w=0,E=[].pop,S=[].push,x=[].slice,T=[].indexOf||function(e){var t=0,n=this.length;for(;t<n;t++)if(this[t]===e)return t;return-1},N=function(e,t){return e[d]=t==null||t,e},C=function(){var e={},t=[];return N(function(n,r){return t.push(n)>i.cacheLength&&delete e[t.shift()],e[n+" "]=r},e)},k=C(),L=C(),A=C(),O="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",_=M.replace("w","w#"),D="([*^$|!~]?=)",P="\\["+O+"*("+M+")"+O+"*(?:"+D+O+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+_+")|)|)"+O+"*\\]",H=":("+M+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+P+")|[^:]|\\\\.)*|.*))\\)|)",B=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)",j=new RegExp("^"+O+"+|((?:^|[^\\\\])(?:\\\\.)*)"+O+"+$","g"),F=new RegExp("^"+O+"*,"+O+"*"),I=new RegExp("^"+O+"*([\\x20\\t\\r\\n\\f>+~])"+O+"*"),q=new RegExp(H),R=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,U=/^:not/,z=/[\x20\t\r\n\f]*[+~]/,W=/:not\($/,X=/h\d/i,V=/input|select|textarea|button/i,$=/\\(?!\\)/g,J={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),NAME:new RegExp("^\\[name=['\"]?("+M+")['\"]?\\]"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+H),POS:new RegExp(B,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),needsContext:new RegExp("^"+O+"*[>+~]|"+B,"i")},K=function(e){var t=g.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}},Q=K(function(e){return e.appendChild(g.createComment("")),!e.getElementsByTagName("*").length}),G=K(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==p&&e.firstChild.getAttribute("href")==="#"}),Y=K(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return t!=="boolean"&&t!=="string"}),Z=K(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!e.getElementsByClassName||!e.getElementsByClassName("e").length?!1:(e.lastChild.className="e",e.getElementsByClassName("e").length===2)}),et=K(function(e){e.id=d+0,e.innerHTML="<a name='"+d+"'></a><div name='"+d+"'></div>",y.insertBefore(e,y.firstChild);var t=g.getElementsByName&&g.getElementsByName(d).length===2+g.getElementsByName(d+0).length;return r=!g.getElementById(d),y.removeChild(e),t});try{x.call(y.childNodes,0)[0].nodeType}catch(tt){x=function(e){var t,n=[];for(;t=this[e];e++)n.push(t);return n}}nt.matches=function(e,t){return nt(e,null,null,t)},nt.matchesSelector=function(e,t){return nt(t,null,null,[e]).length>0},s=nt.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(i===1||i===9||i===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=s(e)}else if(i===3||i===4)return e.nodeValue}else for(;t=e[r];r++)n+=s(t);return n},o=nt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},u=nt.contains=y.contains?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!(r&&r.nodeType===1&&n.contains&&n.contains(r))}:y.compareDocumentPosition?function(e,t){return t&&!!(e.compareDocumentPosition(t)&16)}:function(e,t){while(t=t.parentNode)if(t===e)return!0;return!1},nt.attr=function(e,t){var n,r=o(e);return r||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):r||Y?e.getAttribute(t):(n=e.getAttributeNode(t),n?typeof e[t]=="boolean"?e[t]?t:null:n.specified?n.value:null:null)},i=nt.selectors={cacheLength:50,createPseudo:N,match:J,attrHandle:G?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},find:{ID:r?function(e,t,n){if(typeof t.getElementById!==p&&!n){var r=t.getElementById(e);return r&&r.parentNode?[r]:[]}}:function(e,n,r){if(typeof n.getElementById!==p&&!r){var i=n.getElementById(e);return i?i.id===e||typeof i.getAttributeNode!==p&&i.getAttributeNode("id").value===e?[i]:t:[]}},TAG:Q?function(e,t){if(typeof t.getElementsByTagName!==p)return t.getElementsByTagName(e)}:function(e,t){var n=t.getElementsByTagName(e);if(e==="*"){var r,i=[],s=0;for(;r=n[s];s++)r.nodeType===1&&i.push(r);return i}return n},NAME:et&&function(e,t){if(typeof t.getElementsByName!==p)return t.getElementsByName(name)},CLASS:Z&&function(e,t,n){if(typeof t.getElementsByClassName!==p&&!n)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace($,""),e[3]=(e[4]||e[5]||"").replace($,""),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1]==="nth"?(e[2]||nt.error(e[0]),e[3]=+(e[3]?e[4]+(e[5]||1):2*(e[2]==="even"||e[2]==="odd")),e[4]=+(e[6]+e[7]||e[2]==="odd")):e[2]&&nt.error(e[0]),e},PSEUDO:function(e){var t,n;if(J.CHILD.test(e[0]))return null;if(e[3])e[2]=e[3];else if(t=e[4])q.test(t)&&(n=ut(t,!0))&&(n=t.indexOf(")",t.length-n)-t.length)&&(t=t.slice(0,n),e[0]=e[0].slice(0,n)),e[2]=t;return e.slice(0,3)}},filter:{ID:r?function(e){return e=e.replace($,""),function(t){return t.getAttribute("id")===e}}:function(e){return e=e.replace($,""),function(t){var n=typeof t.getAttributeNode!==p&&t.getAttributeNode("id");return n&&n.value===e}},TAG:function(e){return e==="*"?function(){return!0}:(e=e.replace($,"").toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[d][e+" "];return t||(t=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==p&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r,i){var s=nt.attr(r,e);return s==null?t==="!=":t?(s+="",t==="="?s===n:t==="!="?s!==n:t==="^="?n&&s.indexOf(n)===0:t==="*="?n&&s.indexOf(n)>-1:t==="$="?n&&s.substr(s.length-n.length)===n:t==="~="?(" "+s+" ").indexOf(n)>-1:t==="|="?s===n||s.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r){return e==="nth"?function(e){var t,i,s=e.parentNode;if(n===1&&r===0)return!0;if(s){i=0;for(t=s.firstChild;t;t=t.nextSibling)if(t.nodeType===1){i++;if(e===t)break}}return i-=r,i===n||i%n===0&&i/n>=0}:function(t){var n=t;switch(e){case"only":case"first":while(n=n.previousSibling)if(n.nodeType===1)return!1;if(e==="first")return!0;n=t;case"last":while(n=n.nextSibling)if(n.nodeType===1)return!1;return!0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||nt.error("unsupported pseudo: "+e);return r[d]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?N(function(e,n){var i,s=r(e,t),o=s.length;while(o--)i=T.call(e,s[o]),e[i]=!(n[i]=s[o])}):function(e){return r(e,0,n)}):r}},pseudos:{not:N(function(e){var t=[],n=[],r=a(e.replace(j,"$1"));return r[d]?N(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:N(function(e){return function(t){return nt(e,t).length>0}}),contains:N(function(e){return function(t){return(t.textContent||t.innerText||s(t)).indexOf(e)>-1}}),enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!i.pseudos.empty(e)},empty:function(e){var t;e=e.firstChild;while(e){if(e.nodeName>"@"||(t=e.nodeType)===3||t===4)return!1;e=e.nextSibling}return!0},header:function(e){return X.test(e.nodeName)},text:function(e){var t,n;return e.nodeName.toLowerCase()==="input"&&(t=e.type)==="text"&&((n=e.getAttribute("type"))==null||n.toLowerCase()===t)},radio:rt("radio"),checkbox:rt("checkbox"),file:rt("file"),password:rt("password"),image:rt("image"),submit:it("submit"),reset:it("reset"),button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},input:function(e){return V.test(e.nodeName)},focus:function(e){var t=e.ownerDocument;return e===t.activeElement&&(!t.hasFocus||t.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},active:function(e){return e===e.ownerDocument.activeElement},first:st(function(){return[0]}),last:st(function(e,t){return[t-1]}),eq:st(function(e,t,n){return[n<0?n+t:n]}),even:st(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:st(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:st(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:st(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},f=y.compareDocumentPosition?function(e,t){return e===t?(l=!0,0):(!e.compareDocumentPosition||!t.compareDocumentPosition?e.compareDocumentPosition:e.compareDocumentPosition(t)&4)?-1:1}:function(e,t){if(e===t)return l=!0,0;if(e.sourceIndex&&t.sourceIndex)return e.sourceIndex-t.sourceIndex;var n,r,i=[],s=[],o=e.parentNode,u=t.parentNode,a=o;if(o===u)return ot(e,t);if(!o)return-1;if(!u)return 1;while(a)i.unshift(a),a=a.parentNode;a=u;while(a)s.unshift(a),a=a.parentNode;n=i.length,r=s.length;for(var f=0;f<n&&f<r;f++)if(i[f]!==s[f])return ot(i[f],s[f]);return f===n?ot(e,s[f],-1):ot(i[f],t,1)},[0,0].sort(f),h=!l,nt.uniqueSort=function(e){var t,n=[],r=1,i=0;l=h,e.sort(f);if(l){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e},nt.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},a=nt.compile=function(e,t){var n,r=[],i=[],s=A[d][e+" "];if(!s){t||(t=ut(e)),n=t.length;while(n--)s=ht(t[n]),s[d]?r.push(s):i.push(s);s=A(e,pt(i,r))}return s},g.querySelectorAll&&function(){var e,t=vt,n=/'|\\/g,r=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,i=[":focus"],s=[":active"],u=y.matchesSelector||y.mozMatchesSelector||y.webkitMatchesSelector||y.oMatchesSelector||y.msMatchesSelector;K(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||i.push("\\["+O+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||i.push(":checked")}),K(function(e){e.innerHTML="<p test=''></p>",e.querySelectorAll("[test^='']").length&&i.push("[*^$]="+O+"*(?:\"\"|'')"),e.innerHTML="<input type='hidden'/>",e.querySelectorAll(":enabled").length||i.push(":enabled",":disabled")}),i=new RegExp(i.join("|")),vt=function(e,r,s,o,u){if(!o&&!u&&!i.test(e)){var a,f,l=!0,c=d,h=r,p=r.nodeType===9&&e;if(r.nodeType===1&&r.nodeName.toLowerCase()!=="object"){a=ut(e),(l=r.getAttribute("id"))?c=l.replace(n,"\\$&"):r.setAttribute("id",c),c="[id='"+c+"'] ",f=a.length;while(f--)a[f]=c+a[f].join("");h=z.test(e)&&r.parentNode||r,p=a.join(",")}if(p)try{return S.apply(s,x.call(h.querySelectorAll(p),0)),s}catch(v){}finally{l||r.removeAttribute("id")}}return t(e,r,s,o,u)},u&&(K(function(t){e=u.call(t,"div");try{u.call(t,"[test!='']:sizzle"),s.push("!=",H)}catch(n){}}),s=new RegExp(s.join("|")),nt.matchesSelector=function(t,n){n=n.replace(r,"='$1']");if(!o(t)&&!s.test(n)&&!i.test(n))try{var a=u.call(t,n);if(a||e||t.document&&t.document.nodeType!==11)return a}catch(f){}return nt(n,null,null,[t]).length>0})}(),i.pseudos.nth=i.pseudos.eq,i.filters=mt.prototype=i.pseudos,i.setFilters=new mt,nt.attr=v.attr,v.find=nt,v.expr=nt.selectors,v.expr[":"]=v.expr.pseudos,v.unique=nt.uniqueSort,v.text=nt.getText,v.isXMLDoc=nt.isXML,v.contains=nt.contains}(e);var nt=/Until$/,rt=/^(?:parents|prev(?:Until|All))/,it=/^.[^:#\[\.,]*$/,st=v.expr.match.needsContext,ot={children:!0,contents:!0,next:!0,prev:!0};v.fn.extend({find:function(e){var t,n,r,i,s,o,u=this;if(typeof e!="string")return v(e).filter(function(){for(t=0,n=u.length;t<n;t++)if(v.contains(u[t],this))return!0});o=this.pushStack("","find",e);for(t=0,n=this.length;t<n;t++){r=o.length,v.find(e,this[t],o);if(t>0)for(i=r;i<o.length;i++)for(s=0;s<r;s++)if(o[s]===o[i]){o.splice(i--,1);break}}return o},has:function(e){var t,n=v(e,this),r=n.length;return this.filter(function(){for(t=0;t<r;t++)if(v.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1),"not",e)},filter:function(e){return this.pushStack(ft(this,e,!0),"filter",e)},is:function(e){return!!e&&(typeof e=="string"?st.test(e)?v(e,this.context).index(this[0])>=0:v.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,s=[],o=st.test(e)||typeof e!="string"?v(e,t||this.context):0;for(;r<i;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&n.nodeType!==11){if(o?o.index(n)>-1:v.find.matchesSelector(n,e)){s.push(n);break}n=n.parentNode}}return s=s.length>1?v.unique(s):s,this.pushStack(s,"closest",e)},index:function(e){return e?typeof e=="string"?v.inArray(this[0],v(e)):v.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n=typeof e=="string"?v(e,t):v.makeArray(e&&e.nodeType?[e]:e),r=v.merge(this.get(),n);return this.pushStack(ut(n[0])||ut(r[0])?r:v.unique(r))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),v.fn.andSelf=v.fn.addBack,v.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return v.dir(e,"parentNode")},parentsUntil:function(e,t,n){return v.dir(e,"parentNode",n)},next:function(e){return at(e,"nextSibling")},prev:function(e){return at(e,"previousSibling")},nextAll:function(e){return v.dir(e,"nextSibling")},prevAll:function(e){return v.dir(e,"previousSibling")},nextUntil:function(e,t,n){return v.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return v.dir(e,"previousSibling",n)},siblings:function(e){return v.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return v.sibling(e.firstChild)},contents:function(e){return v.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:v.merge([],e.childNodes)}},function(e,t){v.fn[e]=function(n,r){var i=v.map(this,t,n);return nt.test(e)||(r=n),r&&typeof r=="string"&&(i=v.filter(r,i)),i=this.length>1&&!ot[e]?v.unique(i):i,this.length>1&&rt.test(e)&&(i=i.reverse()),this.pushStack(i,e,l.call(arguments).join(","))}}),v.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),t.length===1?v.find.matchesSelector(t[0],e)?[t[0]]:[]:v.find.matches(e,t)},dir:function(e,n,r){var i=[],s=e[n];while(s&&s.nodeType!==9&&(r===t||s.nodeType!==1||!v(s).is(r)))s.nodeType===1&&i.push(s),s=s[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}});var ct="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ht=/ jQuery\d+="(?:null|\d+)"/g,pt=/^\s+/,dt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,vt=/<([\w:]+)/,mt=/<tbody/i,gt=/<|&#?\w+;/,yt=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,wt=new RegExp("<(?:"+ct+")[\\s/>]","i"),Et=/^(?:checkbox|radio)$/,St=/checked\s*(?:[^=]|=\s*.checked.)/i,xt=/\/(java|ecma)script/i,Tt=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,Nt={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},Ct=lt(i),kt=Ct.appendChild(i.createElement("div"));Nt.optgroup=Nt.option,Nt.tbody=Nt.tfoot=Nt.colgroup=Nt.caption=Nt.thead,Nt.th=Nt.td,v.support.htmlSerialize||(Nt._default=[1,"X<div>","</div>"]),v.fn.extend({text:function(e){return v.access(this,function(e){return e===t?v.text(this):this.empty().append((this[0]&&this[0].ownerDocument||i).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(v.isFunction(e))return this.each(function(t){v(this).wrapAll(e.call(this,t))});if(this[0]){var t=v(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return v.isFunction(e)?this.each(function(t){v(this).wrapInner(e.call(this,t))}):this.each(function(){var t=v(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=v.isFunction(e);return this.each(function(n){v(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){v.nodeName(this,"body")||v(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(e,this.firstChild)})},before:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(e,this),"before",this.selector)}},after:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(this,e),"after",this.selector)}},remove:function(e,t){var n,r=0;for(;(n=this[r])!=null;r++)if(!e||v.filter(e,[n]).length)!t&&n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),v.cleanData([n])),n.parentNode&&n.parentNode.removeChild(n);return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&v.cleanData(e.getElementsByTagName("*"));while(e.firstChild)e.removeChild(e.firstChild)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return v.clone(this,e,t)})},html:function(e){return v.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return n.nodeType===1?n.innerHTML.replace(ht,""):t;if(typeof e=="string"&&!yt.test(e)&&(v.support.htmlSerialize||!wt.test(e))&&(v.support.leadingWhitespace||!pt.test(e))&&!Nt[(vt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(dt,"<$1></$2>");try{for(;r<i;r++)n=this[r]||{},n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),n.innerHTML=e);n=0}catch(s){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){return ut(this[0])?this.length?this.pushStack(v(v.isFunction(e)?e():e),"replaceWith",e):this:v.isFunction(e)?this.each(function(t){var n=v(this),r=n.html();n.replaceWith(e.call(this,t,r))}):(typeof e!="string"&&(e=v(e).detach()),this.each(function(){var t=this.nextSibling,n=this.parentNode;v(this).remove(),t?v(t).before(e):v(n).append(e)}))},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=[].concat.apply([],e);var i,s,o,u,a=0,f=e[0],l=[],c=this.length;if(!v.support.checkClone&&c>1&&typeof f=="string"&&St.test(f))return this.each(function(){v(this).domManip(e,n,r)});if(v.isFunction(f))return this.each(function(i){var s=v(this);e[0]=f.call(this,i,n?s.html():t),s.domManip(e,n,r)});if(this[0]){i=v.buildFragment(e,this,l),o=i.fragment,s=o.firstChild,o.childNodes.length===1&&(o=s);if(s){n=n&&v.nodeName(s,"tr");for(u=i.cacheable||c-1;a<c;a++)r.call(n&&v.nodeName(this[a],"table")?Lt(this[a],"tbody"):this[a],a===u?o:v.clone(o,!0,!0))}o=s=null,l.length&&v.each(l,function(e,t){t.src?v.ajax?v.ajax({url:t.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):v.error("no ajax"):v.globalEval((t.text||t.textContent||t.innerHTML||"").replace(Tt,"")),t.parentNode&&t.parentNode.removeChild(t)})}return this}}),v.buildFragment=function(e,n,r){var s,o,u,a=e[0];return n=n||i,n=!n.nodeType&&n[0]||n,n=n.ownerDocument||n,e.length===1&&typeof a=="string"&&a.length<512&&n===i&&a.charAt(0)==="<"&&!bt.test(a)&&(v.support.checkClone||!St.test(a))&&(v.support.html5Clone||!wt.test(a))&&(o=!0,s=v.fragments[a],u=s!==t),s||(s=n.createDocumentFragment(),v.clean(e,n,s,r),o&&(v.fragments[a]=u&&s)),{fragment:s,cacheable:o}},v.fragments={},v.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){v.fn[e]=function(n){var r,i=0,s=[],o=v(n),u=o.length,a=this.length===1&&this[0].parentNode;if((a==null||a&&a.nodeType===11&&a.childNodes.length===1)&&u===1)return o[t](this[0]),this;for(;i<u;i++)r=(i>0?this.clone(!0):this).get(),v(o[i])[t](r),s=s.concat(r);return this.pushStack(s,e,o.selector)}}),v.extend({clone:function(e,t,n){var r,i,s,o;v.support.html5Clone||v.isXMLDoc(e)||!wt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(kt.innerHTML=e.outerHTML,kt.removeChild(o=kt.firstChild));if((!v.support.noCloneEvent||!v.support.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!v.isXMLDoc(e)){Ot(e,o),r=Mt(e),i=Mt(o);for(s=0;r[s];++s)i[s]&&Ot(r[s],i[s])}if(t){At(e,o);if(n){r=Mt(e),i=Mt(o);for(s=0;r[s];++s)At(r[s],i[s])}}return r=i=null,o},clean:function(e,t,n,r){var s,o,u,a,f,l,c,h,p,d,m,g,y=t===i&&Ct,b=[];if(!t||typeof t.createDocumentFragment=="undefined")t=i;for(s=0;(u=e[s])!=null;s++){typeof u=="number"&&(u+="");if(!u)continue;if(typeof u=="string")if(!gt.test(u))u=t.createTextNode(u);else{y=y||lt(t),c=t.createElement("div"),y.appendChild(c),u=u.replace(dt,"<$1></$2>"),a=(vt.exec(u)||["",""])[1].toLowerCase(),f=Nt[a]||Nt._default,l=f[0],c.innerHTML=f[1]+u+f[2];while(l--)c=c.lastChild;if(!v.support.tbody){h=mt.test(u),p=a==="table"&&!h?c.firstChild&&c.firstChild.childNodes:f[1]==="<table>"&&!h?c.childNodes:[];for(o=p.length-1;o>=0;--o)v.nodeName(p[o],"tbody")&&!p[o].childNodes.length&&p[o].parentNode.removeChild(p[o])}!v.support.leadingWhitespace&&pt.test(u)&&c.insertBefore(t.createTextNode(pt.exec(u)[0]),c.firstChild),u=c.childNodes,c.parentNode.removeChild(c)}u.nodeType?b.push(u):v.merge(b,u)}c&&(u=c=y=null);if(!v.support.appendChecked)for(s=0;(u=b[s])!=null;s++)v.nodeName(u,"input")?_t(u):typeof u.getElementsByTagName!="undefined"&&v.grep(u.getElementsByTagName("input"),_t);if(n){m=function(e){if(!e.type||xt.test(e.type))return r?r.push(e.parentNode?e.parentNode.removeChild(e):e):n.appendChild(e)};for(s=0;(u=b[s])!=null;s++)if(!v.nodeName(u,"script")||!m(u))n.appendChild(u),typeof u.getElementsByTagName!="undefined"&&(g=v.grep(v.merge([],u.getElementsByTagName("script")),m),b.splice.apply(b,[s+1,0].concat(g)),s+=g.length)}return b},cleanData:function(e,t){var n,r,i,s,o=0,u=v.expando,a=v.cache,f=v.support.deleteExpando,l=v.event.special;for(;(i=e[o])!=null;o++)if(t||v.acceptData(i)){r=i[u],n=r&&a[r];if(n){if(n.events)for(s in n.events)l[s]?v.event.remove(i,s):v.removeEvent(i,s,n.handle);a[r]&&(delete a[r],f?delete i[u]:i.removeAttribute?i.removeAttribute(u):i[u]=null,v.deletedIds.push(r))}}}}),function(){var e,t;v.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e=v.uaMatch(o.userAgent),t={},e.browser&&(t[e.browser]=!0,t.version=e.version),t.chrome?t.webkit=!0:t.webkit&&(t.safari=!0),v.browser=t,v.sub=function(){function e(t,n){return new e.fn.init(t,n)}v.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function(r,i){return i&&i instanceof v&&!(i instanceof e)&&(i=e(i)),v.fn.init.call(this,r,i,t)},e.fn.init.prototype=e.fn;var t=e(i);return e}}();var Dt,Pt,Ht,Bt=/alpha\([^)]*\)/i,jt=/opacity=([^)]*)/,Ft=/^(top|right|bottom|left)$/,It=/^(none|table(?!-c[ea]).+)/,qt=/^margin/,Rt=new RegExp("^("+m+")(.*)$","i"),Ut=new RegExp("^("+m+")(?!px)[a-z%]+$","i"),zt=new RegExp("^([-+])=("+m+")","i"),Wt={BODY:"block"},Xt={position:"absolute",visibility:"hidden",display:"block"},Vt={letterSpacing:0,fontWeight:400},$t=["Top","Right","Bottom","Left"],Jt=["Webkit","O","Moz","ms"],Kt=v.fn.toggle;v.fn.extend({css:function(e,n){return v.access(this,function(e,n,r){return r!==t?v.style(e,n,r):v.css(e,n)},e,n,arguments.length>1)},show:function(){return Yt(this,!0)},hide:function(){return Yt(this)},toggle:function(e,t){var n=typeof e=="boolean";return v.isFunction(e)&&v.isFunction(t)?Kt.apply(this,arguments):this.each(function(){(n?e:Gt(this))?v(this).show():v(this).hide()})}}),v.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Dt(e,"opacity");return n===""?"1":n}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":v.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var s,o,u,a=v.camelCase(n),f=e.style;n=v.cssProps[a]||(v.cssProps[a]=Qt(f,a)),u=v.cssHooks[n]||v.cssHooks[a];if(r===t)return u&&"get"in u&&(s=u.get(e,!1,i))!==t?s:f[n];o=typeof r,o==="string"&&(s=zt.exec(r))&&(r=(s[1]+1)*s[2]+parseFloat(v.css(e,n)),o="number");if(r==null||o==="number"&&isNaN(r))return;o==="number"&&!v.cssNumber[a]&&(r+="px");if(!u||!("set"in u)||(r=u.set(e,r,i))!==t)try{f[n]=r}catch(l){}},css:function(e,n,r,i){var s,o,u,a=v.camelCase(n);return n=v.cssProps[a]||(v.cssProps[a]=Qt(e.style,a)),u=v.cssHooks[n]||v.cssHooks[a],u&&"get"in u&&(s=u.get(e,!0,i)),s===t&&(s=Dt(e,n)),s==="normal"&&n in Vt&&(s=Vt[n]),r||i!==t?(o=parseFloat(s),r||v.isNumeric(o)?o||0:s):s},swap:function(e,t,n){var r,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];r=n.call(e);for(i in t)e.style[i]=s[i];return r}}),e.getComputedStyle?Dt=function(t,n){var r,i,s,o,u=e.getComputedStyle(t,null),a=t.style;return u&&(r=u.getPropertyValue(n)||u[n],r===""&&!v.contains(t.ownerDocument,t)&&(r=v.style(t,n)),Ut.test(r)&&qt.test(n)&&(i=a.width,s=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=r,r=u.width,a.width=i,a.minWidth=s,a.maxWidth=o)),r}:i.documentElement.currentStyle&&(Dt=function(e,t){var n,r,i=e.currentStyle&&e.currentStyle[t],s=e.style;return i==null&&s&&s[t]&&(i=s[t]),Ut.test(i)&&!Ft.test(t)&&(n=s.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),s.left=t==="fontSize"?"1em":i,i=s.pixelLeft+"px",s.left=n,r&&(e.runtimeStyle.left=r)),i===""?"auto":i}),v.each(["height","width"],function(e,t){v.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&It.test(Dt(e,"display"))?v.swap(e,Xt,function(){return tn(e,t,r)}):tn(e,t,r)},set:function(e,n,r){return Zt(e,n,r?en(e,t,r,v.support.boxSizing&&v.css(e,"boxSizing")==="border-box"):0)}}}),v.support.opacity||(v.cssHooks.opacity={get:function(e,t){return jt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=v.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if(t>=1&&v.trim(s.replace(Bt,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(r&&!r.filter)return}n.filter=Bt.test(s)?s.replace(Bt,i):s+" "+i}}),v(function(){v.support.reliableMarginRight||(v.cssHooks.marginRight={get:function(e,t){return v.swap(e,{display:"inline-block"},function(){if(t)return Dt(e,"marginRight")})}}),!v.support.pixelPosition&&v.fn.position&&v.each(["top","left"],function(e,t){v.cssHooks[t]={get:function(e,n){if(n){var r=Dt(e,t);return Ut.test(r)?v(e).position()[t]+"px":r}}}})}),v.expr&&v.expr.filters&&(v.expr.filters.hidden=function(e){return e.offsetWidth===0&&e.offsetHeight===0||!v.support.reliableHiddenOffsets&&(e.style&&e.style.display||Dt(e,"display"))==="none"},v.expr.filters.visible=function(e){return!v.expr.filters.hidden(e)}),v.each({margin:"",padding:"",border:"Width"},function(e,t){v.cssHooks[e+t]={expand:function(n){var r,i=typeof n=="string"?n.split(" "):[n],s={};for(r=0;r<4;r++)s[e+$t[r]+t]=i[r]||i[r-2]||i[0];return s}},qt.test(e)||(v.cssHooks[e+t].set=Zt)});var rn=/%20/g,sn=/\[\]$/,on=/\r?\n/g,un=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,an=/^(?:select|textarea)/i;v.fn.extend({serialize:function(){return v.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?v.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||an.test(this.nodeName)||un.test(this.type))}).map(function(e,t){var n=v(this).val();return n==null?null:v.isArray(n)?v.map(n,function(e,n){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),v.param=function(e,n){var r,i=[],s=function(e,t){t=v.isFunction(t)?t():t==null?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};n===t&&(n=v.ajaxSettings&&v.ajaxSettings.traditional);if(v.isArray(e)||e.jquery&&!v.isPlainObject(e))v.each(e,function(){s(this.name,this.value)});else for(r in e)fn(r,e[r],n,s);return i.join("&").replace(rn,"+")};var ln,cn,hn=/#.*$/,pn=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,dn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,vn=/^(?:GET|HEAD)$/,mn=/^\/\//,gn=/\?/,yn=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bn=/([?&])_=[^&]*/,wn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,En=v.fn.load,Sn={},xn={},Tn=["*/"]+["*"];try{cn=s.href}catch(Nn){cn=i.createElement("a"),cn.href="",cn=cn.href}ln=wn.exec(cn.toLowerCase())||[],v.fn.load=function(e,n,r){if(typeof e!="string"&&En)return En.apply(this,arguments);if(!this.length)return this;var i,s,o,u=this,a=e.indexOf(" ");return a>=0&&(i=e.slice(a,e.length),e=e.slice(0,a)),v.isFunction(n)?(r=n,n=t):n&&typeof n=="object"&&(s="POST"),v.ajax({url:e,type:s,dataType:"html",data:n,complete:function(e,t){r&&u.each(r,o||[e.responseText,t,e])}}).done(function(e){o=arguments,u.html(i?v("<div>").append(e.replace(yn,"")).find(i):e)}),this},v.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){v.fn[t]=function(e){return this.on(t,e)}}),v.each(["get","post"],function(e,n){v[n]=function(e,r,i,s){return v.isFunction(r)&&(s=s||i,i=r,r=t),v.ajax({type:n,url:e,data:r,success:i,dataType:s})}}),v.extend({getScript:function(e,n){return v.get(e,t,n,"script")},getJSON:function(e,t,n){return v.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?Ln(e,v.ajaxSettings):(t=e,e=v.ajaxSettings),Ln(e,t),e},ajaxSettings:{url:cn,isLocal:dn.test(ln[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":Tn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":v.parseJSON,"text xml":v.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:Cn(Sn),ajaxTransport:Cn(xn),ajax:function(e,n){function T(e,n,s,a){var l,y,b,w,S,T=n;if(E===2)return;E=2,u&&clearTimeout(u),o=t,i=a||"",x.readyState=e>0?4:0,s&&(w=An(c,x,s));if(e>=200&&e<300||e===304)c.ifModified&&(S=x.getResponseHeader("Last-Modified"),S&&(v.lastModified[r]=S),S=x.getResponseHeader("Etag"),S&&(v.etag[r]=S)),e===304?(T="notmodified",l=!0):(l=On(c,w),T=l.state,y=l.data,b=l.error,l=!b);else{b=T;if(!T||e)T="error",e<0&&(e=0)}x.status=e,x.statusText=(n||T)+"",l?d.resolveWith(h,[y,T,x]):d.rejectWith(h,[x,T,b]),x.statusCode(g),g=t,f&&p.trigger("ajax"+(l?"Success":"Error"),[x,c,l?y:b]),m.fireWith(h,[x,T]),f&&(p.trigger("ajaxComplete",[x,c]),--v.active||v.event.trigger("ajaxStop"))}typeof e=="object"&&(n=e,e=t),n=n||{};var r,i,s,o,u,a,f,l,c=v.ajaxSetup({},n),h=c.context||c,p=h!==c&&(h.nodeType||h instanceof v)?v(h):v.event,d=v.Deferred(),m=v.Callbacks("once memory"),g=c.statusCode||{},b={},w={},E=0,S="canceled",x={readyState:0,setRequestHeader:function(e,t){if(!E){var n=e.toLowerCase();e=w[n]=w[n]||e,b[e]=t}return this},getAllResponseHeaders:function(){return E===2?i:null},getResponseHeader:function(e){var n;if(E===2){if(!s){s={};while(n=pn.exec(i))s[n[1].toLowerCase()]=n[2]}n=s[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return E||(c.mimeType=e),this},abort:function(e){return e=e||S,o&&o.abort(e),T(0,e),this}};d.promise(x),x.success=x.done,x.error=x.fail,x.complete=m.add,x.statusCode=function(e){if(e){var t;if(E<2)for(t in e)g[t]=[g[t],e[t]];else t=e[x.status],x.always(t)}return this},c.url=((e||c.url)+"").replace(hn,"").replace(mn,ln[1]+"//"),c.dataTypes=v.trim(c.dataType||"*").toLowerCase().split(y),c.crossDomain==null&&(a=wn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===ln[1]&&a[2]===ln[2]&&(a[3]||(a[1]==="http:"?80:443))==(ln[3]||(ln[1]==="http:"?80:443)))),c.data&&c.processData&&typeof c.data!="string"&&(c.data=v.param(c.data,c.traditional)),kn(Sn,c,n,x);if(E===2)return x;f=c.global,c.type=c.type.toUpperCase(),c.hasContent=!vn.test(c.type),f&&v.active++===0&&v.event.trigger("ajaxStart");if(!c.hasContent){c.data&&(c.url+=(gn.test(c.url)?"&":"?")+c.data,delete c.data),r=c.url;if(c.cache===!1){var N=v.now(),C=c.url.replace(bn,"$1_="+N);c.url=C+(C===c.url?(gn.test(c.url)?"&":"?")+"_="+N:"")}}(c.data&&c.hasContent&&c.contentType!==!1||n.contentType)&&x.setRequestHeader("Content-Type",c.contentType),c.ifModified&&(r=r||c.url,v.lastModified[r]&&x.setRequestHeader("If-Modified-Since",v.lastModified[r]),v.etag[r]&&x.setRequestHeader("If-None-Match",v.etag[r])),x.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(c.dataTypes[0]!=="*"?", "+Tn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)x.setRequestHeader(l,c.headers[l]);if(!c.beforeSend||c.beforeSend.call(h,x,c)!==!1&&E!==2){S="abort";for(l in{success:1,error:1,complete:1})x[l](c[l]);o=kn(xn,c,n,x);if(!o)T(-1,"No Transport");else{x.readyState=1,f&&p.trigger("ajaxSend",[x,c]),c.async&&c.timeout>0&&(u=setTimeout(function(){x.abort("timeout")},c.timeout));try{E=1,o.send(b,T)}catch(k){if(!(E<2))throw k;T(-1,k)}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var Mn=[],_n=/\?/,Dn=/(=)\?(?=&|$)|\?\?/,Pn=v.now();v.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Mn.pop()||v.expando+"_"+Pn++;return this[e]=!0,e}}),v.ajaxPrefilter("json jsonp",function(n,r,i){var s,o,u,a=n.data,f=n.url,l=n.jsonp!==!1,c=l&&Dn.test(f),h=l&&!c&&typeof a=="string"&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Dn.test(a);if(n.dataTypes[0]==="jsonp"||c||h)return s=n.jsonpCallback=v.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,o=e[s],c?n.url=f.replace(Dn,"$1"+s):h?n.data=a.replace(Dn,"$1"+s):l&&(n.url+=(_n.test(f)?"&":"?")+n.jsonp+"="+s),n.converters["script json"]=function(){return u||v.error(s+" was not called"),u[0]},n.dataTypes[0]="json",e[s]=function(){u=arguments},i.always(function(){e[s]=o,n[s]&&(n.jsonpCallback=r.jsonpCallback,Mn.push(s)),u&&v.isFunction(o)&&o(u[0]),u=o=t}),"script"}),v.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return v.globalEval(e),e}}}),v.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),v.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=i.head||i.getElementsByTagName("head")[0]||i.documentElement;return{send:function(s,o){n=i.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){if(i||!n.readyState||/loaded|complete/.test(n.readyState))n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success")},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var Hn,Bn=e.ActiveXObject?function(){for(var e in Hn)Hn[e](0,1)}:!1,jn=0;v.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&Fn()||In()}:Fn,function(e){v.extend(v.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(v.ajaxSettings.xhr()),v.support.ajax&&v.ajaxTransport(function(n){if(!n.crossDomain||v.support.cors){var r;return{send:function(i,s){var o,u,a=n.xhr();n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async);if(n.xhrFields)for(u in n.xhrFields)a[u]=n.xhrFields[u];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),!n.crossDomain&&!i["X-Requested-With"]&&(i["X-Requested-With"]="XMLHttpRequest");try{for(u in i)a.setRequestHeader(u,i[u])}catch(f){}a.send(n.hasContent&&n.data||null),r=function(e,i){var u,f,l,c,h;try{if(r&&(i||a.readyState===4)){r=t,o&&(a.onreadystatechange=v.noop,Bn&&delete Hn[o]);if(i)a.readyState!==4&&a.abort();else{u=a.status,l=a.getAllResponseHeaders(),c={},h=a.responseXML,h&&h.documentElement&&(c.xml=h);try{c.text=a.responseText}catch(p){}try{f=a.statusText}catch(p){f=""}!u&&n.isLocal&&!n.crossDomain?u=c.text?200:404:u===1223&&(u=204)}}}catch(d){i||s(-1,d)}c&&s(u,f,c,l)},n.async?a.readyState===4?setTimeout(r,0):(o=++jn,Bn&&(Hn||(Hn={},v(e).unload(Bn)),Hn[o]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var qn,Rn,Un=/^(?:toggle|show|hide)$/,zn=new RegExp("^(?:([-+])=|)("+m+")([a-z%]*)$","i"),Wn=/queueHooks$/,Xn=[Gn],Vn={"*":[function(e,t){var n,r,i=this.createTween(e,t),s=zn.exec(t),o=i.cur(),u=+o||0,a=1,f=20;if(s){n=+s[2],r=s[3]||(v.cssNumber[e]?"":"px");if(r!=="px"&&u){u=v.css(i.elem,e,!0)||n||1;do a=a||".5",u/=a,v.style(i.elem,e,u+r);while(a!==(a=i.cur()/o)&&a!==1&&--f)}i.unit=r,i.start=u,i.end=s[1]?u+(s[1]+1)*n:n}return i}]};v.Animation=v.extend(Kn,{tweener:function(e,t){v.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r<i;r++)n=e[r],Vn[n]=Vn[n]||[],Vn[n].unshift(t)},prefilter:function(e,t){t?Xn.unshift(e):Xn.push(e)}}),v.Tween=Yn,Yn.prototype={constructor:Yn,init:function(e,t,n,r,i,s){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=s||(v.cssNumber[n]?"":"px")},cur:function(){var e=Yn.propHooks[this.prop];return e&&e.get?e.get(this):Yn.propHooks._default.get(this)},run:function(e){var t,n=Yn.propHooks[this.prop];return this.options.duration?this.pos=t=v.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Yn.propHooks._default.set(this),this}},Yn.prototype.init.prototype=Yn.prototype,Yn.propHooks={_default:{get:function(e){var t;return e.elem[e.prop]==null||!!e.elem.style&&e.elem.style[e.prop]!=null?(t=v.css(e.elem,e.prop,!1,""),!t||t==="auto"?0:t):e.elem[e.prop]},set:function(e){v.fx.step[e.prop]?v.fx.step[e.prop](e):e.elem.style&&(e.elem.style[v.cssProps[e.prop]]!=null||v.cssHooks[e.prop])?v.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Yn.propHooks.scrollTop=Yn.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},v.each(["toggle","show","hide"],function(e,t){var n=v.fn[t];v.fn[t]=function(r,i,s){return r==null||typeof r=="boolean"||!e&&v.isFunction(r)&&v.isFunction(i)?n.apply(this,arguments):this.animate(Zn(t,!0),r,i,s)}}),v.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Gt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=v.isEmptyObject(e),s=v.speed(t,n,r),o=function(){var t=Kn(this,v.extend({},e),s);i&&t.stop(!0)};return i||s.queue===!1?this.each(o):this.queue(s.queue,o)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return typeof e!="string"&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=e!=null&&e+"queueHooks",s=v.timers,o=v._data(this);if(n)o[n]&&o[n].stop&&i(o[n]);else for(n in o)o[n]&&o[n].stop&&Wn.test(n)&&i(o[n]);for(n=s.length;n--;)s[n].elem===this&&(e==null||s[n].queue===e)&&(s[n].anim.stop(r),t=!1,s.splice(n,1));(t||!r)&&v.dequeue(this,e)})}}),v.each({slideDown:Zn("show"),slideUp:Zn("hide"),slideToggle:Zn("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){v.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),v.speed=function(e,t,n){var r=e&&typeof e=="object"?v.extend({},e):{complete:n||!n&&t||v.isFunction(e)&&e,duration:e,easing:n&&t||t&&!v.isFunction(t)&&t};r.duration=v.fx.off?0:typeof r.duration=="number"?r.duration:r.duration in v.fx.speeds?v.fx.speeds[r.duration]:v.fx.speeds._default;if(r.queue==null||r.queue===!0)r.queue="fx";return r.old=r.complete,r.complete=function(){v.isFunction(r.old)&&r.old.call(this),r.queue&&v.dequeue(this,r.queue)},r},v.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},v.timers=[],v.fx=Yn.prototype.init,v.fx.tick=function(){var e,n=v.timers,r=0;qn=v.now();for(;r<n.length;r++)e=n[r],!e()&&n[r]===e&&n.splice(r--,1);n.length||v.fx.stop(),qn=t},v.fx.timer=function(e){e()&&v.timers.push(e)&&!Rn&&(Rn=setInterval(v.fx.tick,v.fx.interval))},v.fx.interval=13,v.fx.stop=function(){clearInterval(Rn),Rn=null},v.fx.speeds={slow:600,fast:200,_default:400},v.fx.step={},v.expr&&v.expr.filters&&(v.expr.filters.animated=function(e){return v.grep(v.timers,function(t){return e===t.elem}).length});var er=/^(?:body|html)$/i;v.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){v.offset.setOffset(this,e,t)});var n,r,i,s,o,u,a,f={top:0,left:0},l=this[0],c=l&&l.ownerDocument;if(!c)return;return(r=c.body)===l?v.offset.bodyOffset(l):(n=c.documentElement,v.contains(n,l)?(typeof l.getBoundingClientRect!="undefined"&&(f=l.getBoundingClientRect()),i=tr(c),s=n.clientTop||r.clientTop||0,o=n.clientLeft||r.clientLeft||0,u=i.pageYOffset||n.scrollTop,a=i.pageXOffset||n.scrollLeft,{top:f.top+u-s,left:f.left+a-o}):f)},v.offset={bodyOffset:function(e){var t=e.offsetTop,n=e.offsetLeft;return v.support.doesNotIncludeMarginInBodyOffset&&(t+=parseFloat(v.css(e,"marginTop"))||0,n+=parseFloat(v.css(e,"marginLeft"))||0),{top:t,left:n}},setOffset:function(e,t,n){var r=v.css(e,"position");r==="static"&&(e.style.position="relative");var i=v(e),s=i.offset(),o=v.css(e,"top"),u=v.css(e,"left"),a=(r==="absolute"||r==="fixed")&&v.inArray("auto",[o,u])>-1,f={},l={},c,h;a?(l=i.position(),c=l.top,h=l.left):(c=parseFloat(o)||0,h=parseFloat(u)||0),v.isFunction(t)&&(t=t.call(e,n,s)),t.top!=null&&(f.top=t.top-s.top+c),t.left!=null&&(f.left=t.left-s.left+h),"using"in t?t.using.call(e,f):i.css(f)}},v.fn.extend({position:function(){if(!this[0])return;var e=this[0],t=this.offsetParent(),n=this.offset(),r=er.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(v.css(e,"marginTop"))||0,n.left-=parseFloat(v.css(e,"marginLeft"))||0,r.top+=parseFloat(v.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(v.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||i.body;while(e&&!er.test(e.nodeName)&&v.css(e,"position")==="static")e=e.offsetParent;return e||i.body})}}),v.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);v.fn[e]=function(i){return v.access(this,function(e,i,s){var o=tr(e);if(s===t)return o?n in o?o[n]:o.document.documentElement[i]:e[i];o?o.scrollTo(r?v(o).scrollLeft():s,r?s:v(o).scrollTop()):e[i]=s},e,i,arguments.length,null)}}),v.each({Height:"height",Width:"width"},function(e,n){v.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){v.fn[i]=function(i,s){var o=arguments.length&&(r||typeof i!="boolean"),u=r||(i===!0||s===!0?"margin":"border");return v.access(this,function(n,r,i){var s;return v.isWindow(n)?n.document.documentElement["client"+e]:n.nodeType===9?(s=n.documentElement,Math.max(n.body["scroll"+e],s["scroll"+e],n.body["offset"+e],s["offset"+e],s["client"+e])):i===t?v.css(n,r,i,u):v.style(n,r,i,u)},n,o?i:t,o,null)}})}),e.jQuery=e.$=v,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return v})})(window);
...
 
\ No newline at end of file
doc/build/html/_static/minus.png
Show inline comments
 
new file 100644
 
binary diff not shown
Show images
doc/build/html/_static/plus.png
Show inline comments
 
new file 100644
 
binary diff not shown
Show images
doc/build/html/_static/pygments.css
Show inline comments
 
new file 100644
 
.highlight .hll { background-color: #ffffcc }
 
.highlight  { background: #eeffcc; }
 
.highlight .c { color: #408090; font-style: italic } /* Comment */
 
.highlight .err { border: 1px solid #FF0000 } /* Error */
 
.highlight .k { color: #007020; font-weight: bold } /* Keyword */
 
.highlight .o { color: #666666 } /* Operator */
 
.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */
 
.highlight .cp { color: #007020 } /* Comment.Preproc */
 
.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */
 
.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
 
.highlight .gd { color: #A00000 } /* Generic.Deleted */
 
.highlight .ge { font-style: italic } /* Generic.Emph */
 
.highlight .gr { color: #FF0000 } /* Generic.Error */
 
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
 
.highlight .gi { color: #00A000 } /* Generic.Inserted */
 
.highlight .go { color: #333333 } /* Generic.Output */
 
.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
 
.highlight .gs { font-weight: bold } /* Generic.Strong */
 
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
 
.highlight .gt { color: #0044DD } /* Generic.Traceback */
 
.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
 
.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
 
.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
 
.highlight .kp { color: #007020 } /* Keyword.Pseudo */
 
.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
 
.highlight .kt { color: #902000 } /* Keyword.Type */
 
.highlight .m { color: #208050 } /* Literal.Number */
 
.highlight .s { color: #4070a0 } /* Literal.String */
 
.highlight .na { color: #4070a0 } /* Name.Attribute */
 
.highlight .nb { color: #007020 } /* Name.Builtin */
 
.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
 
.highlight .no { color: #60add5 } /* Name.Constant */
 
.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */
 
.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */
 
.highlight .ne { color: #007020 } /* Name.Exception */
 
.highlight .nf { color: #06287e } /* Name.Function */
 
.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */
 
.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
 
.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */
 
.highlight .nv { color: #bb60d5 } /* Name.Variable */
 
.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */
 
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
 
.highlight .mf { color: #208050 } /* Literal.Number.Float */
 
.highlight .mh { color: #208050 } /* Literal.Number.Hex */
 
.highlight .mi { color: #208050 } /* Literal.Number.Integer */
 
.highlight .mo { color: #208050 } /* Literal.Number.Oct */
 
.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */
 
.highlight .sc { color: #4070a0 } /* Literal.String.Char */
 
.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
 
.highlight .s2 { color: #4070a0 } /* Literal.String.Double */
 
.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
 
.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */
 
.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
 
.highlight .sx { color: #c65d09 } /* Literal.String.Other */
 
.highlight .sr { color: #235388 } /* Literal.String.Regex */
 
.highlight .s1 { color: #4070a0 } /* Literal.String.Single */
 
.highlight .ss { color: #517918 } /* Literal.String.Symbol */
 
.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */
 
.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */
 
.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
 
.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
 
.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */
...
 
\ No newline at end of file
doc/build/html/_static/searchtools.js
Show inline comments
 
new file 100644
 
/*
 
 * searchtools.js_t
 
 * ~~~~~~~~~~~~~~~~
 
 *
 
 * Sphinx JavaScript utilties for the full-text search.
 
 *
 
 * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
 
 * :license: BSD, see LICENSE for details.
 
 *
 
 */
 

	
 

	
 
/**
 
 * Porter Stemmer
 
 */
 
var Stemmer = function() {
 

	
 
  var step2list = {
 
    ational: 'ate',
 
    tional: 'tion',
 
    enci: 'ence',
 
    anci: 'ance',
 
    izer: 'ize',
 
    bli: 'ble',
 
    alli: 'al',
 
    entli: 'ent',
 
    eli: 'e',
 
    ousli: 'ous',
 
    ization: 'ize',
 
    ation: 'ate',
 
    ator: 'ate',
 
    alism: 'al',
 
    iveness: 'ive',
 
    fulness: 'ful',
 
    ousness: 'ous',
 
    aliti: 'al',
 
    iviti: 'ive',
 
    biliti: 'ble',
 
    logi: 'log'
 
  };
 

	
 
  var step3list = {
 
    icate: 'ic',
 
    ative: '',
 
    alize: 'al',
 
    iciti: 'ic',
 
    ical: 'ic',
 
    ful: '',
 
    ness: ''
 
  };
 

	
 
  var c = "[^aeiou]";          // consonant
 
  var v = "[aeiouy]";          // vowel
 
  var C = c + "[^aeiouy]*";    // consonant sequence
 
  var V = v + "[aeiou]*";      // vowel sequence
 

	
 
  var mgr0 = "^(" + C + ")?" + V + C;                      // [C]VC... is m>0
 
  var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$";    // [C]VC[V] is m=1
 
  var mgr1 = "^(" + C + ")?" + V + C + V + C;              // [C]VCVC... is m>1
 
  var s_v   = "^(" + C + ")?" + v;                         // vowel in stem
 

	
 
  this.stemWord = function (w) {
 
    var stem;
 
    var suffix;
 
    var firstch;
 
    var origword = w;
 

	
 
    if (w.length < 3)
 
      return w;
 

	
 
    var re;
 
    var re2;
 
    var re3;
 
    var re4;
 

	
 
    firstch = w.substr(0,1);
 
    if (firstch == "y")
 
      w = firstch.toUpperCase() + w.substr(1);
 

	
 
    // Step 1a
 
    re = /^(.+?)(ss|i)es$/;
 
    re2 = /^(.+?)([^s])s$/;
 

	
 
    if (re.test(w))
 
      w = w.replace(re,"$1$2");
 
    else if (re2.test(w))
 
      w = w.replace(re2,"$1$2");
 

	
 
    // Step 1b
 
    re = /^(.+?)eed$/;
 
    re2 = /^(.+?)(ed|ing)$/;
 
    if (re.test(w)) {
 
      var fp = re.exec(w);
 
      re = new RegExp(mgr0);
 
      if (re.test(fp[1])) {
 
        re = /.$/;
 
        w = w.replace(re,"");
 
      }
 
    }
 
    else if (re2.test(w)) {
 
      var fp = re2.exec(w);
 
      stem = fp[1];
 
      re2 = new RegExp(s_v);
 
      if (re2.test(stem)) {
 
        w = stem;
 
        re2 = /(at|bl|iz)$/;
 
        re3 = new RegExp("([^aeiouylsz])\\1$");
 
        re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
 
        if (re2.test(w))
 
          w = w + "e";
 
        else if (re3.test(w)) {
 
          re = /.$/;
 
          w = w.replace(re,"");
 
        }
 
        else if (re4.test(w))
 
          w = w + "e";
 
      }
 
    }
 

	
 
    // Step 1c
 
    re = /^(.+?)y$/;
 
    if (re.test(w)) {
 
      var fp = re.exec(w);
 
      stem = fp[1];
 
      re = new RegExp(s_v);
 
      if (re.test(stem))
 
        w = stem + "i";
 
    }
 

	
 
    // Step 2
 
    re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
 
    if (re.test(w)) {
 
      var fp = re.exec(w);
 
      stem = fp[1];
 
      suffix = fp[2];
 
      re = new RegExp(mgr0);
 
      if (re.test(stem))
 
        w = stem + step2list[suffix];
 
    }
 

	
 
    // Step 3
 
    re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
 
    if (re.test(w)) {
 
      var fp = re.exec(w);
 
      stem = fp[1];
 
      suffix = fp[2];
 
      re = new RegExp(mgr0);
 
      if (re.test(stem))
 
        w = stem + step3list[suffix];
 
    }
 

	
 
    // Step 4
 
    re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
 
    re2 = /^(.+?)(s|t)(ion)$/;
 
    if (re.test(w)) {
 
      var fp = re.exec(w);
 
      stem = fp[1];
 
      re = new RegExp(mgr1);
 
      if (re.test(stem))
 
        w = stem;
 
    }
 
    else if (re2.test(w)) {
 
      var fp = re2.exec(w);
 
      stem = fp[1] + fp[2];
 
      re2 = new RegExp(mgr1);
 
      if (re2.test(stem))
 
        w = stem;
 
    }
 

	
 
    // Step 5
 
    re = /^(.+?)e$/;
 
    if (re.test(w)) {
 
      var fp = re.exec(w);
 
      stem = fp[1];
 
      re = new RegExp(mgr1);
 
      re2 = new RegExp(meq1);
 
      re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
 
      if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
 
        w = stem;
 
    }
 
    re = /ll$/;
 
    re2 = new RegExp(mgr1);
 
    if (re.test(w) && re2.test(w)) {
 
      re = /.$/;
 
      w = w.replace(re,"");
 
    }
 

	
 
    // and turn initial Y back to y
 
    if (firstch == "y")
 
      w = firstch.toLowerCase() + w.substr(1);
 
    return w;
 
  }
 
}
 

	
 

	
 

	
 
/**
 
 * Simple result scoring code.
 
 */
 
var Scorer = {
 
  // Implement the following function to further tweak the score for each result
 
  // The function takes a result array [filename, title, anchor, descr, score]
 
  // and returns the new score.
 
  /*
 
  score: function(result) {
 
    return result[4];
 
  },
 
  */
 

	
 
  // query matches the full name of an object
 
  objNameMatch: 11,
 
  // or matches in the last dotted part of the object name
 
  objPartialMatch: 6,
 
  // Additive scores depending on the priority of the object
 
  objPrio: {0:  15,   // used to be importantResults
 
            1:  5,   // used to be objectResults
 
            2: -5},  // used to be unimportantResults
 
  //  Used when the priority is not in the mapping.
 
  objPrioDefault: 0,
 

	
 
  // query found in title
 
  title: 15,
 
  // query found in terms
 
  term: 5
 
};
 

	
 

	
 
/**
 
 * Search Module
 
 */
 
var Search = {
 

	
 
  _index : null,
 
  _queued_query : null,
 
  _pulse_status : -1,
 

	
 
  init : function() {
 
      var params = $.getQueryParameters();
 
      if (params.q) {
 
          var query = params.q[0];
 
          $('input[name="q"]')[0].value = query;
 
          this.performSearch(query);
 
      }
 
  },
 

	
 
  loadIndex : function(url) {
 
    $.ajax({type: "GET", url: url, data: null,
 
            dataType: "script", cache: true,
 
            complete: function(jqxhr, textstatus) {
 
              if (textstatus != "success") {
 
                document.getElementById("searchindexloader").src = url;
 
              }
 
            }});
 
  },
 

	
 
  setIndex : function(index) {
 
    var q;
 
    this._index = index;
 
    if ((q = this._queued_query) !== null) {
 
      this._queued_query = null;
 
      Search.query(q);
 
    }
 
  },
 

	
 
  hasIndex : function() {
 
      return this._index !== null;
 
  },
 

	
 
  deferQuery : function(query) {
 
      this._queued_query = query;
 
  },
 

	
 
  stopPulse : function() {
 
      this._pulse_status = 0;
 
  },
 

	
 
  startPulse : function() {
 
    if (this._pulse_status >= 0)
 
        return;
 
    function pulse() {
 
      var i;
 
      Search._pulse_status = (Search._pulse_status + 1) % 4;
 
      var dotString = '';
 
      for (i = 0; i < Search._pulse_status; i++)
 
        dotString += '.';
 
      Search.dots.text(dotString);
 
      if (Search._pulse_status > -1)
 
        window.setTimeout(pulse, 500);
 
    }
 
    pulse();
 
  },
 

	
 
  /**
 
   * perform a search for something (or wait until index is loaded)
 
   */
 
  performSearch : function(query) {
 
    // create the required interface elements
 
    this.out = $('#search-results');
 
    this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
 
    this.dots = $('<span></span>').appendTo(this.title);
 
    this.status = $('<p style="display: none"></p>').appendTo(this.out);
 
    this.output = $('<ul class="search"/>').appendTo(this.out);
 

	
 
    $('#search-progress').text(_('Preparing search...'));
 
    this.startPulse();
 

	
 
    // index already loaded, the browser was quick!
 
    if (this.hasIndex())
 
      this.query(query);
 
    else
 
      this.deferQuery(query);
 
  },
 

	
 
  /**
 
   * execute search (requires search index to be loaded)
 
   */
 
  query : function(query) {
 
    var i;
 
    var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"];
 

	
 
    // stem the searchterms and add them to the correct list
 
    var stemmer = new Stemmer();
 
    var searchterms = [];
 
    var excluded = [];
 
    var hlterms = [];
 
    var tmp = query.split(/\s+/);
 
    var objectterms = [];
 
    for (i = 0; i < tmp.length; i++) {
 
      if (tmp[i] !== "") {
 
          objectterms.push(tmp[i].toLowerCase());
 
      }
 

	
 
      if ($u.indexOf(stopwords, tmp[i]) != -1 || tmp[i].match(/^\d+$/) ||
 
          tmp[i] === "") {
 
        // skip this "word"
 
        continue;
 
      }
 
      // stem the word
 
      var word = stemmer.stemWord(tmp[i]).toLowerCase();
 
      var toAppend;
 
      // select the correct list
 
      if (word[0] == '-') {
 
        toAppend = excluded;
 
        word = word.substr(1);
 
      }
 
      else {
 
        toAppend = searchterms;
 
        hlterms.push(tmp[i].toLowerCase());
 
      }
 
      // only add if not already in the list
 
      if (!$u.contains(toAppend, word))
 
        toAppend.push(word);
 
    }
 
    var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
 

	
 
    // console.debug('SEARCH: searching for:');
 
    // console.info('required: ', searchterms);
 
    // console.info('excluded: ', excluded);
 

	
 
    // prepare search
 
    var terms = this._index.terms;
 
    var titleterms = this._index.titleterms;
 

	
 
    // array of [filename, title, anchor, descr, score]
 
    var results = [];
 
    $('#search-progress').empty();
 

	
 
    // lookup as object
 
    for (i = 0; i < objectterms.length; i++) {
 
      var others = [].concat(objectterms.slice(0, i),
 
                             objectterms.slice(i+1, objectterms.length));
 
      results = results.concat(this.performObjectSearch(objectterms[i], others));
 
    }
 

	
 
    // lookup as search terms in fulltext
 
    results = results.concat(this.performTermsSearch(searchterms, excluded, terms, Scorer.term))
 
                     .concat(this.performTermsSearch(searchterms, excluded, titleterms, Scorer.title));
 

	
 
    // let the scorer override scores with a custom scoring function
 
    if (Scorer.score) {
 
      for (i = 0; i < results.length; i++)
 
        results[i][4] = Scorer.score(results[i]);
 
    }
 

	
 
    // now sort the results by score (in opposite order of appearance, since the
 
    // display function below uses pop() to retrieve items) and then
 
    // alphabetically
 
    results.sort(function(a, b) {
 
      var left = a[4];
 
      var right = b[4];
 
      if (left > right) {
 
        return 1;
 
      } else if (left < right) {
 
        return -1;
 
      } else {
 
        // same score: sort alphabetically
 
        left = a[1].toLowerCase();
 
        right = b[1].toLowerCase();
 
        return (left > right) ? -1 : ((left < right) ? 1 : 0);
 
      }
 
    });
 

	
 
    // for debugging
 
    //Search.lastresults = results.slice();  // a copy
 
    //console.info('search results:', Search.lastresults);
 

	
 
    // print the results
 
    var resultCount = results.length;
 
    function displayNextItem() {
 
      // results left, load the summary and display it
 
      if (results.length) {
 
        var item = results.pop();
 
        var listItem = $('<li style="display:none"></li>');
 
        if (DOCUMENTATION_OPTIONS.FILE_SUFFIX === '') {
 
          // dirhtml builder
 
          var dirname = item[0] + '/';
 
          if (dirname.match(/\/index\/$/)) {
 
            dirname = dirname.substring(0, dirname.length-6);
 
          } else if (dirname == 'index/') {
 
            dirname = '';
 
          }
 
          listItem.append($('<a/>').attr('href',
 
            DOCUMENTATION_OPTIONS.URL_ROOT + dirname +
 
            highlightstring + item[2]).html(item[1]));
 
        } else {
 
          // normal html builders
 
          listItem.append($('<a/>').attr('href',
 
            item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX +
 
            highlightstring + item[2]).html(item[1]));
 
        }
 
        if (item[3]) {
 
          listItem.append($('<span> (' + item[3] + ')</span>'));
 
          Search.output.append(listItem);
 
          listItem.slideDown(5, function() {
 
            displayNextItem();
 
          });
 
        } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
 
          $.ajax({url: DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' + item[0] + '.txt',
 
                  dataType: "text",
 
                  complete: function(jqxhr, textstatus) {
 
                    var data = jqxhr.responseText;
 
                    if (data !== '') {
 
                      listItem.append(Search.makeSearchSummary(data, searchterms, hlterms));
 
                    }
 
                    Search.output.append(listItem);
 
                    listItem.slideDown(5, function() {
 
                      displayNextItem();
 
                    });
 
                  }});
 
        } else {
 
          // no source available, just display title
 
          Search.output.append(listItem);
 
          listItem.slideDown(5, function() {
 
            displayNextItem();
 
          });
 
        }
 
      }
 
      // search finished, update title and status message
 
      else {
 
        Search.stopPulse();
 
        Search.title.text(_('Search Results'));
 
        if (!resultCount)
 
          Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
 
        else
 
            Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
 
        Search.status.fadeIn(500);
 
      }
 
    }
 
    displayNextItem();
 
  },
 

	
 
  /**
 
   * search for object names
 
   */
 
  performObjectSearch : function(object, otherterms) {
 
    var filenames = this._index.filenames;
 
    var objects = this._index.objects;
 
    var objnames = this._index.objnames;
 
    var titles = this._index.titles;
 

	
 
    var i;
 
    var results = [];
 

	
 
    for (var prefix in objects) {
 
      for (var name in objects[prefix]) {
 
        var fullname = (prefix ? prefix + '.' : '') + name;
 
        if (fullname.toLowerCase().indexOf(object) > -1) {
 
          var score = 0;
 
          var parts = fullname.split('.');
 
          // check for different match types: exact matches of full name or
 
          // "last name" (i.e. last dotted part)
 
          if (fullname == object || parts[parts.length - 1] == object) {
 
            score += Scorer.objNameMatch;
 
          // matches in last name
 
          } else if (parts[parts.length - 1].indexOf(object) > -1) {
 
            score += Scorer.objPartialMatch;
 
          }
 
          var match = objects[prefix][name];
 
          var objname = objnames[match[1]][2];
 
          var title = titles[match[0]];
 
          // If more than one term searched for, we require other words to be
 
          // found in the name/title/description
 
          if (otherterms.length > 0) {
 
            var haystack = (prefix + ' ' + name + ' ' +
 
                            objname + ' ' + title).toLowerCase();
 
            var allfound = true;
 
            for (i = 0; i < otherterms.length; i++) {
 
              if (haystack.indexOf(otherterms[i]) == -1) {
 
                allfound = false;
 
                break;
 
              }
 
            }
 
            if (!allfound) {
 
              continue;
 
            }
 
          }
 
          var descr = objname + _(', in ') + title;
 

	
 
          var anchor = match[3];
 
          if (anchor === '')
 
            anchor = fullname;
 
          else if (anchor == '-')
 
            anchor = objnames[match[1]][1] + '-' + fullname;
 
          // add custom score for some objects according to scorer
 
          if (Scorer.objPrio.hasOwnProperty(match[2])) {
 
            score += Scorer.objPrio[match[2]];
 
          } else {
 
            score += Scorer.objPrioDefault;
 
          }
 
          results.push([filenames[match[0]], fullname, '#'+anchor, descr, score]);
 
        }
 
      }
 
    }
 

	
 
    return results;
 
  },
 

	
 
  /**
 
   * search for full-text terms in the index
 
   */
 
  performTermsSearch : function(searchterms, excluded, terms, score) {
 
    var filenames = this._index.filenames;
 
    var titles = this._index.titles;
 

	
 
    var i, j, file, files;
 
    var fileMap = {};
 
    var results = [];
 

	
 
    // perform the search on the required terms
 
    for (i = 0; i < searchterms.length; i++) {
 
      var word = searchterms[i];
 
      // no match but word was a required one
 
      if ((files = terms[word]) === undefined)
 
        break;
 
      if (files.length === undefined) {
 
        files = [files];
 
      }
 
      // create the mapping
 
      for (j = 0; j < files.length; j++) {
 
        file = files[j];
 
        if (file in fileMap)
 
          fileMap[file].push(word);
 
        else
 
          fileMap[file] = [word];
 
      }
 
    }
 

	
 
    // now check if the files don't contain excluded terms
 
    for (file in fileMap) {
 
      var valid = true;
 

	
 
      // check if all requirements are matched
 
      if (fileMap[file].length != searchterms.length)
 
          continue;
 

	
 
      // ensure that none of the excluded terms is in the search result
 
      for (i = 0; i < excluded.length; i++) {
 
        if (terms[excluded[i]] == file ||
 
          $u.contains(terms[excluded[i]] || [], file)) {
 
          valid = false;
 
          break;
 
        }
 
      }
 

	
 
      // if we have still a valid result we can add it to the result list
 
      if (valid) {
 
        results.push([filenames[file], titles[file], '', null, score]);
 
      }
 
    }
 
    return results;
 
  },
 

	
 
  /**
 
   * helper function to return a node containing the
 
   * search summary for a given text. keywords is a list
 
   * of stemmed words, hlwords is the list of normal, unstemmed
 
   * words. the first one is used to find the occurance, the
 
   * latter for highlighting it.
 
   */
 
  makeSearchSummary : function(text, keywords, hlwords) {
 
    var textLower = text.toLowerCase();
 
    var start = 0;
 
    $.each(keywords, function() {
 
      var i = textLower.indexOf(this.toLowerCase());
 
      if (i > -1)
 
        start = i;
 
    });
 
    start = Math.max(start - 120, 0);
 
    var excerpt = ((start > 0) ? '...' : '') +
 
      $.trim(text.substr(start, 240)) +
 
      ((start + 240 - text.length) ? '...' : '');
 
    var rv = $('<div class="context"></div>').text(excerpt);
 
    $.each(hlwords, function() {
 
      rv = rv.highlightText(this, 'highlighted');
 
    });
 
    return rv;
 
  }
 
};
 

	
 
$(document).ready(function() {
 
  Search.init();
 
});
...
 
\ No newline at end of file
doc/build/html/_static/sidebar.js
Show inline comments
 
new file 100644
 
/*
 
 * sidebar.js
 
 * ~~~~~~~~~~
 
 *
 
 * This script makes the Sphinx sidebar collapsible.
 
 *
 
 * .sphinxsidebar contains .sphinxsidebarwrapper.  This script adds
 
 * in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton
 
 * used to collapse and expand the sidebar.
 
 *
 
 * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden
 
 * and the width of the sidebar and the margin-left of the document
 
 * are decreased. When the sidebar is expanded the opposite happens.
 
 * This script saves a per-browser/per-session cookie used to
 
 * remember the position of the sidebar among the pages.
 
 * Once the browser is closed the cookie is deleted and the position
 
 * reset to the default (expanded).
 
 *
 
 * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
 
 * :license: BSD, see LICENSE for details.
 
 *
 
 */
 

	
 
$(function() {
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 

	
 
  // global elements used by the functions.
 
  // the 'sidebarbutton' element is defined as global after its
 
  // creation, in the add_sidebar_button function
 
  var bodywrapper = $('.bodywrapper');
 
  var sidebar = $('.sphinxsidebar');
 
  var sidebarwrapper = $('.sphinxsidebarwrapper');
 

	
 
  // for some reason, the document has no sidebar; do not run into errors
 
  if (!sidebar.length) return;
 

	
 
  // original margin-left of the bodywrapper and width of the sidebar
 
  // with the sidebar expanded
 
  var bw_margin_expanded = bodywrapper.css('margin-left');
 
  var ssb_width_expanded = sidebar.width();
 

	
 
  // margin-left of the bodywrapper and width of the sidebar
 
  // with the sidebar collapsed
 
  var bw_margin_collapsed = '.8em';
 
  var ssb_width_collapsed = '.8em';
 

	
 
  // colors used by the current theme
 
  var dark_color = $('.related').css('background-color');
 
  var light_color = $('.document').css('background-color');
 

	
 
  function sidebar_is_collapsed() {
 
    return sidebarwrapper.is(':not(:visible)');
 
  }
 

	
 
  function toggle_sidebar() {
 
    if (sidebar_is_collapsed())
 
      expand_sidebar();
 
    else
 
      collapse_sidebar();
 
  }
 

	
 
  function collapse_sidebar() {
 
    sidebarwrapper.hide();
 
    sidebar.css('width', ssb_width_collapsed);
 
    bodywrapper.css('margin-left', bw_margin_collapsed);
 
    sidebarbutton.css({
 
        'margin-left': '0',
 
        'height': bodywrapper.height()
 
    });
 
    sidebarbutton.find('span').text('»');
 
    sidebarbutton.attr('title', _('Expand sidebar'));
 
    document.cookie = 'sidebar=collapsed';
 
  }
 

	
 
  function expand_sidebar() {
 
    bodywrapper.css('margin-left', bw_margin_expanded);
 
    sidebar.css('width', ssb_width_expanded);
 
    sidebarwrapper.show();
 
    sidebarbutton.css({
 
        'margin-left': ssb_width_expanded-12,
 
        'height': bodywrapper.height()
 
    });
 
    sidebarbutton.find('span').text('«');
 
    sidebarbutton.attr('title', _('Collapse sidebar'));
 
    document.cookie = 'sidebar=expanded';
 
  }
 

	
 
  function add_sidebar_button() {
 
    sidebarwrapper.css({
 
        'float': 'left',
 
        'margin-right': '0',
 
        'width': ssb_width_expanded - 28
 
    });
 
    // create the button
 
    sidebar.append(
 
        '<div id="sidebarbutton"><span>&laquo;</span></div>'
 
    );
 
    var sidebarbutton = $('#sidebarbutton');
 
    light_color = sidebarbutton.css('background-color');
 
    // find the height of the viewport to center the '<<' in the page
 
    var viewport_height;
 
    if (window.innerHeight)
 
 	  viewport_height = window.innerHeight;
 
    else
 
	  viewport_height = $(window).height();
 
    sidebarbutton.find('span').css({
 
        'display': 'block',
 
        'margin-top': (viewport_height - sidebar.position().top - 20) / 2
 
    });
 

	
 
    sidebarbutton.click(toggle_sidebar);
 
    sidebarbutton.attr('title', _('Collapse sidebar'));
 
    sidebarbutton.css({
 
        'color': '#FFFFFF',
 
        'border-left': '1px solid ' + dark_color,
 
        'font-size': '1.2em',
 
        'cursor': 'pointer',
 
        'height': bodywrapper.height(),
 
        'padding-top': '1px',
 
        'margin-left': ssb_width_expanded - 12
 
    });
 

	
 
    sidebarbutton.hover(
 
      function () {
 
          $(this).css('background-color', dark_color);
 
      },
 
      function () {
 
          $(this).css('background-color', light_color);
 
      }
 
    );
 
  }
 

	
 
  function set_position_from_cookie() {
 
    if (!document.cookie)
 
      return;
 
    var items = document.cookie.split(';');
 
    for(var k=0; k<items.length; k++) {
 
      var key_val = items[k].split('=');
 
      var key = key_val[0].replace(/ /, "");  // strip leading spaces
 
      if (key == 'sidebar') {
 
        var value = key_val[1];
 
        if ((value == 'collapsed') && (!sidebar_is_collapsed()))
 
          collapse_sidebar();
 
        else if ((value == 'expanded') && (sidebar_is_collapsed()))
 
          expand_sidebar();
 
      }
 
    }
 
  }
 

	
 
  add_sidebar_button();
 
  var sidebarbutton = $('#sidebarbutton');
 
  set_position_from_cookie();
 
});
...
 
\ No newline at end of file
doc/build/html/_static/underscore.js
Show inline comments
 
new file 100644
 
// Underscore.js 1.3.1
 
// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
 
// Underscore is freely distributable under the MIT license.
 
// Portions of Underscore are inspired or borrowed from Prototype,
 
// Oliver Steele's Functional, and John Resig's Micro-Templating.
 
// For all details and documentation:
 
// http://documentcloud.github.com/underscore
 
(function(){function q(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case "[object String]":return a==String(c);case "[object Number]":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source==
 
c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!="object"||typeof c!="object")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e=="[object Array]"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&q(a[f],c[f],d)))break}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return false;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&q(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c,
 
h)&&!f--)break;g=!f}}d.pop();return g}var r=this,G=r._,n={},k=Array.prototype,o=Object.prototype,i=k.slice,H=k.unshift,l=o.toString,I=o.hasOwnProperty,w=k.forEach,x=k.map,y=k.reduce,z=k.reduceRight,A=k.filter,B=k.every,C=k.some,p=k.indexOf,D=k.lastIndexOf,o=Array.isArray,J=Object.keys,s=Function.prototype.bind,b=function(a){return new m(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=b;exports._=b}else r._=b;b.VERSION="1.3.1";var j=b.each=
 
b.forEach=function(a,c,d){if(a!=null)if(w&&a.forEach===w)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e<f;e++){if(e in a&&c.call(d,a[e],e,a)===n)break}else for(e in a)if(b.has(a,e)&&c.call(d,a[e],e,a)===n)break};b.map=b.collect=function(a,c,b){var e=[];if(a==null)return e;if(x&&a.map===x)return a.map(c,b);j(a,function(a,g,h){e[e.length]=c.call(b,a,g,h)});if(a.length===+a.length)e.length=a.length;return e};b.reduce=b.foldl=b.inject=function(a,c,d,e){var f=arguments.length>2;a==
 
null&&(a=[]);if(y&&a.reduce===y)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(z&&a.reduceRight===z)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect=
 
function(a,c,b){var e;E(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(A&&a.filter===A)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(B&&a.every===B)return a.every(c,b);j(a,function(a,g,h){if(!(e=
 
e&&c.call(b,a,g,h)))return n});return e};var E=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(C&&a.some===C)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return n});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return p&&a.indexOf===p?a.indexOf(c)!=-1:b=E(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck=
 
function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b<e.computed&&(e={value:a,computed:b})});
 
return e.value};b.shuffle=function(a){var b=[],d;j(a,function(a,f){f==0?b[0]=a:(d=Math.floor(Math.random()*(f+1)),b[f]=b[d],b[d]=a)});return b};b.sortBy=function(a,c,d){return b.pluck(b.map(a,function(a,b,g){return{value:a,criteria:c.call(d,a,b,g)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;return c<d?-1:c>d?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a,
 
c,d){d||(d=b.identity);for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?e=g+1:f=g}return e};b.toArray=function(a){return!a?[]:a.toArray?a.toArray():b.isArray(a)?i.call(a):b.isArguments(a)?i.call(a):b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=b.head=function(a,b,d){return b!=null&&!d?i.call(a,0,b):a[0]};b.initial=function(a,b,d){return i.call(a,0,a.length-(b==null||d?1:b))};b.last=function(a,b,d){return b!=null&&!d?i.call(a,Math.max(a.length-b,0)):a[a.length-1]};b.rest=
 
b.tail=function(a,b,d){return i.call(a,b==null||d?1:b)};b.compact=function(a){return b.filter(a,function(a){return!!a})};b.flatten=function(a,c){return b.reduce(a,function(a,e){if(b.isArray(e))return a.concat(c?e:b.flatten(e));a[a.length]=e;return a},[])};b.without=function(a){return b.difference(a,i.call(arguments,1))};b.uniq=b.unique=function(a,c,d){var d=d?b.map(a,d):a,e=[];b.reduce(d,function(d,g,h){if(0==h||(c===true?b.last(d)!=g:!b.include(d,g)))d[d.length]=g,e[e.length]=a[h];return d},[]);
 
return e};b.union=function(){return b.uniq(b.flatten(arguments,true))};b.intersection=b.intersect=function(a){var c=i.call(arguments,1);return b.filter(b.uniq(a),function(a){return b.every(c,function(c){return b.indexOf(c,a)>=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e<c;e++)d[e]=b.pluck(a,""+e);return d};b.indexOf=function(a,c,
 
d){if(a==null)return-1;var e;if(d)return d=b.sortedIndex(a,c),a[d]===c?d:-1;if(p&&a.indexOf===p)return a.indexOf(c);for(d=0,e=a.length;d<e;d++)if(d in a&&a[d]===c)return d;return-1};b.lastIndexOf=function(a,b){if(a==null)return-1;if(D&&a.lastIndexOf===D)return a.lastIndexOf(b);for(var d=a.length;d--;)if(d in a&&a[d]===b)return d;return-1};b.range=function(a,b,d){arguments.length<=1&&(b=a||0,a=0);for(var d=arguments[2]||1,e=Math.max(Math.ceil((b-a)/d),0),f=0,g=Array(e);f<e;)g[f++]=a,a+=d;return g};
 
var F=function(){};b.bind=function(a,c){var d,e;if(a.bind===s&&s)return s.apply(a,i.call(arguments,1));if(!b.isFunction(a))throw new TypeError;e=i.call(arguments,2);return d=function(){if(!(this instanceof d))return a.apply(c,e.concat(i.call(arguments)));F.prototype=a.prototype;var b=new F,g=a.apply(b,e.concat(i.call(arguments)));return Object(g)===g?g:b}};b.bindAll=function(a){var c=i.call(arguments,1);c.length==0&&(c=b.functions(a));j(c,function(c){a[c]=b.bind(a[c],a)});return a};b.memoize=function(a,
 
c){var d={};c||(c=b.identity);return function(){var e=c.apply(this,arguments);return b.has(d,e)?d[e]:d[e]=a.apply(this,arguments)}};b.delay=function(a,b){var d=i.call(arguments,2);return setTimeout(function(){return a.apply(a,d)},b)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(i.call(arguments,1)))};b.throttle=function(a,c){var d,e,f,g,h,i=b.debounce(function(){h=g=false},c);return function(){d=this;e=arguments;var b;f||(f=setTimeout(function(){f=null;h&&a.apply(d,e);i()},c));g?h=true:
 
a.apply(d,e);i();g=true}};b.debounce=function(a,b){var d;return function(){var e=this,f=arguments;clearTimeout(d);d=setTimeout(function(){d=null;a.apply(e,f)},b)}};b.once=function(a){var b=false,d;return function(){if(b)return d;b=true;return d=a.apply(this,arguments)}};b.wrap=function(a,b){return function(){var d=[a].concat(i.call(arguments,0));return b.apply(this,d)}};b.compose=function(){var a=arguments;return function(){for(var b=arguments,d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)];return b[0]}};
 
b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=J||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.defaults=function(a){j(i.call(arguments,
 
1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return q(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=o||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)};
 
b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!b.has(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"};
 
b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,b){return I.call(a,b)};b.noConflict=function(){r._=G;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e<a;e++)b.call(d,e)};b.escape=function(a){return(""+a).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;").replace(/\//g,"&#x2F;")};b.mixin=function(a){j(b.functions(a),
 
function(c){K(c,b[c]=a[c])})};var L=0;b.uniqueId=function(a){var b=L++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var t=/.^/,u=function(a){return a.replace(/\\\\/g,"\\").replace(/\\'/g,"'")};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape||t,function(a,b){return"',_.escape("+
 
u(b)+"),'"}).replace(d.interpolate||t,function(a,b){return"',"+u(b)+",'"}).replace(d.evaluate||t,function(a,b){return"');"+u(b).replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var v=function(a,c){return c?b(a).chain():a},K=function(a,c){m.prototype[a]=
 
function(){var a=i.call(arguments);H.call(a,this._wrapped);return v(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return v(d,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return v(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain=
 
true;return this};m.prototype.value=function(){return this._wrapped}}).call(this);
doc/build/html/_static/up-pressed.png
Show inline comments
 
new file 100644
 
binary diff not shown
Show images
doc/build/html/_static/up.png
Show inline comments
 
new file 100644
 
binary diff not shown
Show images
doc/build/html/_static/websupport.js
Show inline comments
 
new file 100644
 
/*
 
 * websupport.js
 
 * ~~~~~~~~~~~~~
 
 *
 
 * sphinx.websupport utilties for all documentation.
 
 *
 
 * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
 
 * :license: BSD, see LICENSE for details.
 
 *
 
 */
 

	
 
(function($) {
 
  $.fn.autogrow = function() {
 
    return this.each(function() {
 
    var textarea = this;
 

	
 
    $.fn.autogrow.resize(textarea);
 

	
 
    $(textarea)
 
      .focus(function() {
 
        textarea.interval = setInterval(function() {
 
          $.fn.autogrow.resize(textarea);
 
        }, 500);
 
      })
 
      .blur(function() {
 
        clearInterval(textarea.interval);
 
      });
 
    });
 
  };
 

	
 
  $.fn.autogrow.resize = function(textarea) {
 
    var lineHeight = parseInt($(textarea).css('line-height'), 10);
 
    var lines = textarea.value.split('\n');
 
    var columns = textarea.cols;
 
    var lineCount = 0;
 
    $.each(lines, function() {
 
      lineCount += Math.ceil(this.length / columns) || 1;
 
    });
 
    var height = lineHeight * (lineCount + 1);
 
    $(textarea).css('height', height);
 
  };
 
})(jQuery);
 

	
 
(function($) {
 
  var comp, by;
 

	
 
  function init() {
 
    initEvents();
 
    initComparator();
 
  }
 

	
 
  function initEvents() {
 
    $('a.comment-close').live("click", function(event) {
 
      event.preventDefault();
 
      hide($(this).attr('id').substring(2));
 
    });
 
    $('a.vote').live("click", function(event) {
 
      event.preventDefault();
 
      handleVote($(this));
 
    });
 
    $('a.reply').live("click", function(event) {
 
      event.preventDefault();
 
      openReply($(this).attr('id').substring(2));
 
    });
 
    $('a.close-reply').live("click", function(event) {
 
      event.preventDefault();
 
      closeReply($(this).attr('id').substring(2));
 
    });
 
    $('a.sort-option').live("click", function(event) {
 
      event.preventDefault();
 
      handleReSort($(this));
 
    });
 
    $('a.show-proposal').live("click", function(event) {
 
      event.preventDefault();
 
      showProposal($(this).attr('id').substring(2));
 
    });
 
    $('a.hide-proposal').live("click", function(event) {
 
      event.preventDefault();
 
      hideProposal($(this).attr('id').substring(2));
 
    });
 
    $('a.show-propose-change').live("click", function(event) {
 
      event.preventDefault();
 
      showProposeChange($(this).attr('id').substring(2));
 
    });
 
    $('a.hide-propose-change').live("click", function(event) {
 
      event.preventDefault();
 
      hideProposeChange($(this).attr('id').substring(2));
 
    });
 
    $('a.accept-comment').live("click", function(event) {
 
      event.preventDefault();
 
      acceptComment($(this).attr('id').substring(2));
 
    });
 
    $('a.delete-comment').live("click", function(event) {
 
      event.preventDefault();
 
      deleteComment($(this).attr('id').substring(2));
 
    });
 
    $('a.comment-markup').live("click", function(event) {
 
      event.preventDefault();
 
      toggleCommentMarkupBox($(this).attr('id').substring(2));
 
    });
 
  }
 

	
 
  /**
 
   * Set comp, which is a comparator function used for sorting and
 
   * inserting comments into the list.
 
   */
 
  function setComparator() {
 
    // If the first three letters are "asc", sort in ascending order
 
    // and remove the prefix.
 
    if (by.substring(0,3) == 'asc') {
 
      var i = by.substring(3);
 
      comp = function(a, b) { return a[i] - b[i]; };
 
    } else {
 
      // Otherwise sort in descending order.
 
      comp = function(a, b) { return b[by] - a[by]; };
 
    }
 

	
 
    // Reset link styles and format the selected sort option.
 
    $('a.sel').attr('href', '#').removeClass('sel');
 
    $('a.by' + by).removeAttr('href').addClass('sel');
 
  }
 

	
 
  /**
 
   * Create a comp function. If the user has preferences stored in
 
   * the sortBy cookie, use those, otherwise use the default.
 
   */
 
  function initComparator() {
 
    by = 'rating'; // Default to sort by rating.
 
    // If the sortBy cookie is set, use that instead.
 
    if (document.cookie.length > 0) {
 
      var start = document.cookie.indexOf('sortBy=');
 
      if (start != -1) {
 
        start = start + 7;
 
        var end = document.cookie.indexOf(";", start);
 
        if (end == -1) {
 
          end = document.cookie.length;
 
          by = unescape(document.cookie.substring(start, end));
 
        }
 
      }
 
    }
 
    setComparator();
 
  }
 

	
 
  /**
 
   * Show a comment div.
 
   */
 
  function show(id) {
 
    $('#ao' + id).hide();
 
    $('#ah' + id).show();
 
    var context = $.extend({id: id}, opts);
 
    var popup = $(renderTemplate(popupTemplate, context)).hide();
 
    popup.find('textarea[name="proposal"]').hide();
 
    popup.find('a.by' + by).addClass('sel');
 
    var form = popup.find('#cf' + id);
 
    form.submit(function(event) {
 
      event.preventDefault();
 
      addComment(form);
 
    });
 
    $('#s' + id).after(popup);
 
    popup.slideDown('fast', function() {
 
      getComments(id);
 
    });
 
  }
 

	
 
  /**
 
   * Hide a comment div.
 
   */
 
  function hide(id) {
 
    $('#ah' + id).hide();
 
    $('#ao' + id).show();
 
    var div = $('#sc' + id);
 
    div.slideUp('fast', function() {
 
      div.remove();
 
    });
 
  }
 

	
 
  /**
 
   * Perform an ajax request to get comments for a node
 
   * and insert the comments into the comments tree.
 
   */
 
  function getComments(id) {
 
    $.ajax({
 
     type: 'GET',
 
     url: opts.getCommentsURL,
 
     data: {node: id},
 
     success: function(data, textStatus, request) {
 
       var ul = $('#cl' + id);
 
       var speed = 100;
 
       $('#cf' + id)
 
         .find('textarea[name="proposal"]')
 
         .data('source', data.source);
 

	
 
       if (data.comments.length === 0) {
 
         ul.html('<li>No comments yet.</li>');
 
         ul.data('empty', true);
 
       } else {
 
         // If there are comments, sort them and put them in the list.
 
         var comments = sortComments(data.comments);
 
         speed = data.comments.length * 100;
 
         appendComments(comments, ul);
 
         ul.data('empty', false);
 
       }
 
       $('#cn' + id).slideUp(speed + 200);
 
       ul.slideDown(speed);
 
     },
 
     error: function(request, textStatus, error) {
 
       showError('Oops, there was a problem retrieving the comments.');
 
     },
 
     dataType: 'json'
 
    });
 
  }
 

	
 
  /**
 
   * Add a comment via ajax and insert the comment into the comment tree.
 
   */
 
  function addComment(form) {
 
    var node_id = form.find('input[name="node"]').val();
 
    var parent_id = form.find('input[name="parent"]').val();
 
    var text = form.find('textarea[name="comment"]').val();
 
    var proposal = form.find('textarea[name="proposal"]').val();
 

	
 
    if (text == '') {
 
      showError('Please enter a comment.');
 
      return;
 
    }
 

	
 
    // Disable the form that is being submitted.
 
    form.find('textarea,input').attr('disabled', 'disabled');
 

	
 
    // Send the comment to the server.
 
    $.ajax({
 
      type: "POST",
 
      url: opts.addCommentURL,
 
      dataType: 'json',
 
      data: {
 
        node: node_id,
 
        parent: parent_id,
 
        text: text,
 
        proposal: proposal
 
      },
 
      success: function(data, textStatus, error) {
 
        // Reset the form.
 
        if (node_id) {
 
          hideProposeChange(node_id);
 
        }
 
        form.find('textarea')
 
          .val('')
 
          .add(form.find('input'))
 
          .removeAttr('disabled');
 
	var ul = $('#cl' + (node_id || parent_id));
 
        if (ul.data('empty')) {
 
          $(ul).empty();
 
          ul.data('empty', false);
 
        }
 
        insertComment(data.comment);
 
        var ao = $('#ao' + node_id);
 
        ao.find('img').attr({'src': opts.commentBrightImage});
 
        if (node_id) {
 
          // if this was a "root" comment, remove the commenting box
 
          // (the user can get it back by reopening the comment popup)
 
          $('#ca' + node_id).slideUp();
 
        }
 
      },
 
      error: function(request, textStatus, error) {
 
        form.find('textarea,input').removeAttr('disabled');
 
        showError('Oops, there was a problem adding the comment.');
 
      }
 
    });
 
  }
 

	
 
  /**
 
   * Recursively append comments to the main comment list and children
 
   * lists, creating the comment tree.
 
   */
 
  function appendComments(comments, ul) {
 
    $.each(comments, function() {
 
      var div = createCommentDiv(this);
 
      ul.append($(document.createElement('li')).html(div));
 
      appendComments(this.children, div.find('ul.comment-children'));
 
      // To avoid stagnating data, don't store the comments children in data.
 
      this.children = null;
 
      div.data('comment', this);
 
    });
 
  }
 

	
 
  /**
 
   * After adding a new comment, it must be inserted in the correct
 
   * location in the comment tree.
 
   */
 
  function insertComment(comment) {
 
    var div = createCommentDiv(comment);
 

	
 
    // To avoid stagnating data, don't store the comments children in data.
 
    comment.children = null;
 
    div.data('comment', comment);
 

	
 
    var ul = $('#cl' + (comment.node || comment.parent));
 
    var siblings = getChildren(ul);
 

	
 
    var li = $(document.createElement('li'));
 
    li.hide();
 

	
 
    // Determine where in the parents children list to insert this comment.
 
    for(i=0; i < siblings.length; i++) {
 
      if (comp(comment, siblings[i]) <= 0) {
 
        $('#cd' + siblings[i].id)
 
          .parent()
 
          .before(li.html(div));
 
        li.slideDown('fast');
 
        return;
 
      }
 
    }
 

	
 
    // If we get here, this comment rates lower than all the others,
 
    // or it is the only comment in the list.
 
    ul.append(li.html(div));
 
    li.slideDown('fast');
 
  }
 

	
 
  function acceptComment(id) {
 
    $.ajax({
 
      type: 'POST',
 
      url: opts.acceptCommentURL,
 
      data: {id: id},
 
      success: function(data, textStatus, request) {
 
        $('#cm' + id).fadeOut('fast');
 
        $('#cd' + id).removeClass('moderate');
 
      },
 
      error: function(request, textStatus, error) {
 
        showError('Oops, there was a problem accepting the comment.');
 
      }
 
    });
 
  }
 

	
 
  function deleteComment(id) {
 
    $.ajax({
 
      type: 'POST',
 
      url: opts.deleteCommentURL,
 
      data: {id: id},
 
      success: function(data, textStatus, request) {
 
        var div = $('#cd' + id);
 
        if (data == 'delete') {
 
          // Moderator mode: remove the comment and all children immediately
 
          div.slideUp('fast', function() {
 
            div.remove();
 
          });
 
          return;
 
        }
 
        // User mode: only mark the comment as deleted
 
        div
 
          .find('span.user-id:first')
 
          .text('[deleted]').end()
 
          .find('div.comment-text:first')
 
          .text('[deleted]').end()
 
          .find('#cm' + id + ', #dc' + id + ', #ac' + id + ', #rc' + id +
 
                ', #sp' + id + ', #hp' + id + ', #cr' + id + ', #rl' + id)
 
          .remove();
 
        var comment = div.data('comment');
 
        comment.username = '[deleted]';
 
        comment.text = '[deleted]';
 
        div.data('comment', comment);
 
      },
 
      error: function(request, textStatus, error) {
 
        showError('Oops, there was a problem deleting the comment.');
 
      }
 
    });
 
  }
 

	
 
  function showProposal(id) {
 
    $('#sp' + id).hide();
 
    $('#hp' + id).show();
 
    $('#pr' + id).slideDown('fast');
 
  }
 

	
 
  function hideProposal(id) {
 
    $('#hp' + id).hide();
 
    $('#sp' + id).show();
 
    $('#pr' + id).slideUp('fast');
 
  }
 

	
 
  function showProposeChange(id) {
 
    $('#pc' + id).hide();
 
    $('#hc' + id).show();
 
    var textarea = $('#pt' + id);
 
    textarea.val(textarea.data('source'));
 
    $.fn.autogrow.resize(textarea[0]);
 
    textarea.slideDown('fast');
 
  }
 

	
 
  function hideProposeChange(id) {
 
    $('#hc' + id).hide();
 
    $('#pc' + id).show();
 
    var textarea = $('#pt' + id);
 
    textarea.val('').removeAttr('disabled');
 
    textarea.slideUp('fast');
 
  }
 

	
 
  function toggleCommentMarkupBox(id) {
 
    $('#mb' + id).toggle();
 
  }
 

	
 
  /** Handle when the user clicks on a sort by link. */
 
  function handleReSort(link) {
 
    var classes = link.attr('class').split(/\s+/);
 
    for (var i=0; i<classes.length; i++) {
 
      if (classes[i] != 'sort-option') {
 
	by = classes[i].substring(2);
 
      }
 
    }
 
    setComparator();
 
    // Save/update the sortBy cookie.
 
    var expiration = new Date();
 
    expiration.setDate(expiration.getDate() + 365);
 
    document.cookie= 'sortBy=' + escape(by) +
 
                     ';expires=' + expiration.toUTCString();
 
    $('ul.comment-ul').each(function(index, ul) {
 
      var comments = getChildren($(ul), true);
 
      comments = sortComments(comments);
 
      appendComments(comments, $(ul).empty());
 
    });
 
  }
 

	
 
  /**
 
   * Function to process a vote when a user clicks an arrow.
 
   */
 
  function handleVote(link) {
 
    if (!opts.voting) {
 
      showError("You'll need to login to vote.");
 
      return;
 
    }
 

	
 
    var id = link.attr('id');
 
    if (!id) {
 
      // Didn't click on one of the voting arrows.
 
      return;
 
    }
 
    // If it is an unvote, the new vote value is 0,
 
    // Otherwise it's 1 for an upvote, or -1 for a downvote.
 
    var value = 0;
 
    if (id.charAt(1) != 'u') {
 
      value = id.charAt(0) == 'u' ? 1 : -1;
 
    }
 
    // The data to be sent to the server.
 
    var d = {
 
      comment_id: id.substring(2),
 
      value: value
 
    };
 

	
 
    // Swap the vote and unvote links.
 
    link.hide();
 
    $('#' + id.charAt(0) + (id.charAt(1) == 'u' ? 'v' : 'u') + d.comment_id)
 
      .show();
 

	
 
    // The div the comment is displayed in.
 
    var div = $('div#cd' + d.comment_id);
 
    var data = div.data('comment');
 

	
 
    // If this is not an unvote, and the other vote arrow has
 
    // already been pressed, unpress it.
 
    if ((d.value !== 0) && (data.vote === d.value * -1)) {
 
      $('#' + (d.value == 1 ? 'd' : 'u') + 'u' + d.comment_id).hide();
 
      $('#' + (d.value == 1 ? 'd' : 'u') + 'v' + d.comment_id).show();
 
    }
 

	
 
    // Update the comments rating in the local data.
 
    data.rating += (data.vote === 0) ? d.value : (d.value - data.vote);
 
    data.vote = d.value;
 
    div.data('comment', data);
 

	
 
    // Change the rating text.
 
    div.find('.rating:first')
 
      .text(data.rating + ' point' + (data.rating == 1 ? '' : 's'));
 

	
 
    // Send the vote information to the server.
 
    $.ajax({
 
      type: "POST",
 
      url: opts.processVoteURL,
 
      data: d,
 
      error: function(request, textStatus, error) {
 
        showError('Oops, there was a problem casting that vote.');
 
      }
 
    });
 
  }
 

	
 
  /**
 
   * Open a reply form used to reply to an existing comment.
 
   */
 
  function openReply(id) {
 
    // Swap out the reply link for the hide link
 
    $('#rl' + id).hide();
 
    $('#cr' + id).show();
 

	
 
    // Add the reply li to the children ul.
 
    var div = $(renderTemplate(replyTemplate, {id: id})).hide();
 
    $('#cl' + id)
 
      .prepend(div)
 
      // Setup the submit handler for the reply form.
 
      .find('#rf' + id)
 
      .submit(function(event) {
 
        event.preventDefault();
 
        addComment($('#rf' + id));
 
        closeReply(id);
 
      })
 
      .find('input[type=button]')
 
      .click(function() {
 
        closeReply(id);
 
      });
 
    div.slideDown('fast', function() {
 
      $('#rf' + id).find('textarea').focus();
 
    });
 
  }
 

	
 
  /**
 
   * Close the reply form opened with openReply.
 
   */
 
  function closeReply(id) {
 
    // Remove the reply div from the DOM.
 
    $('#rd' + id).slideUp('fast', function() {
 
      $(this).remove();
 
    });
 

	
 
    // Swap out the hide link for the reply link
 
    $('#cr' + id).hide();
 
    $('#rl' + id).show();
 
  }
 

	
 
  /**
 
   * Recursively sort a tree of comments using the comp comparator.
 
   */
 
  function sortComments(comments) {
 
    comments.sort(comp);
 
    $.each(comments, function() {
 
      this.children = sortComments(this.children);
 
    });
 
    return comments;
 
  }
 

	
 
  /**
 
   * Get the children comments from a ul. If recursive is true,
 
   * recursively include childrens' children.
 
   */
 
  function getChildren(ul, recursive) {
 
    var children = [];
 
    ul.children().children("[id^='cd']")
 
      .each(function() {
 
        var comment = $(this).data('comment');
 
        if (recursive)
 
          comment.children = getChildren($(this).find('#cl' + comment.id), true);
 
        children.push(comment);
 
      });
 
    return children;
 
  }
 

	
 
  /** Create a div to display a comment in. */
 
  function createCommentDiv(comment) {
 
    if (!comment.displayed && !opts.moderator) {
 
      return $('<div class="moderate">Thank you!  Your comment will show up '
 
               + 'once it is has been approved by a moderator.</div>');
 
    }
 
    // Prettify the comment rating.
 
    comment.pretty_rating = comment.rating + ' point' +
 
      (comment.rating == 1 ? '' : 's');
 
    // Make a class (for displaying not yet moderated comments differently)
 
    comment.css_class = comment.displayed ? '' : ' moderate';
 
    // Create a div for this comment.
 
    var context = $.extend({}, opts, comment);
 
    var div = $(renderTemplate(commentTemplate, context));
 

	
 
    // If the user has voted on this comment, highlight the correct arrow.
 
    if (comment.vote) {
 
      var direction = (comment.vote == 1) ? 'u' : 'd';
 
      div.find('#' + direction + 'v' + comment.id).hide();
 
      div.find('#' + direction + 'u' + comment.id).show();
 
    }
 

	
 
    if (opts.moderator || comment.text != '[deleted]') {
 
      div.find('a.reply').show();
 
      if (comment.proposal_diff)
 
        div.find('#sp' + comment.id).show();
 
      if (opts.moderator && !comment.displayed)
 
        div.find('#cm' + comment.id).show();
 
      if (opts.moderator || (opts.username == comment.username))
 
        div.find('#dc' + comment.id).show();
 
    }
 
    return div;
 
  }
 

	
 
  /**
 
   * A simple template renderer. Placeholders such as <%id%> are replaced
 
   * by context['id'] with items being escaped. Placeholders such as <#id#>
 
   * are not escaped.
 
   */
 
  function renderTemplate(template, context) {
 
    var esc = $(document.createElement('div'));
 

	
 
    function handle(ph, escape) {
 
      var cur = context;
 
      $.each(ph.split('.'), function() {
 
        cur = cur[this];
 
      });
 
      return escape ? esc.text(cur || "").html() : cur;
 
    }
 

	
 
    return template.replace(/<([%#])([\w\.]*)\1>/g, function() {
 
      return handle(arguments[2], arguments[1] == '%' ? true : false);
 
    });
 
  }
 

	
 
  /** Flash an error message briefly. */
 
  function showError(message) {
 
    $(document.createElement('div')).attr({'class': 'popup-error'})
 
      .append($(document.createElement('div'))
 
               .attr({'class': 'error-message'}).text(message))
 
      .appendTo('body')
 
      .fadeIn("slow")
 
      .delay(2000)
 
      .fadeOut("slow");
 
  }
 

	
 
  /** Add a link the user uses to open the comments popup. */
 
  $.fn.comment = function() {
 
    return this.each(function() {
 
      var id = $(this).attr('id').substring(1);
 
      var count = COMMENT_METADATA[id];
 
      var title = count + ' comment' + (count == 1 ? '' : 's');
 
      var image = count > 0 ? opts.commentBrightImage : opts.commentImage;
 
      var addcls = count == 0 ? ' nocomment' : '';
 
      $(this)
 
        .append(
 
          $(document.createElement('a')).attr({
 
            href: '#',
 
            'class': 'sphinx-comment-open' + addcls,
 
            id: 'ao' + id
 
          })
 
            .append($(document.createElement('img')).attr({
 
              src: image,
 
              alt: 'comment',
 
              title: title
 
            }))
 
            .click(function(event) {
 
              event.preventDefault();
 
              show($(this).attr('id').substring(2));
 
            })
 
        )
 
        .append(
 
          $(document.createElement('a')).attr({
 
            href: '#',
 
            'class': 'sphinx-comment-close hidden',
 
            id: 'ah' + id
 
          })
 
            .append($(document.createElement('img')).attr({
 
              src: opts.closeCommentImage,
 
              alt: 'close',
 
              title: 'close'
 
            }))
 
            .click(function(event) {
 
              event.preventDefault();
 
              hide($(this).attr('id').substring(2));
 
            })
 
        );
 
    });
 
  };
 

	
 
  var opts = {
 
    processVoteURL: '/_process_vote',
 
    addCommentURL: '/_add_comment',
 
    getCommentsURL: '/_get_comments',
 
    acceptCommentURL: '/_accept_comment',
 
    deleteCommentURL: '/_delete_comment',
 
    commentImage: '/static/_static/comment.png',
 
    closeCommentImage: '/static/_static/comment-close.png',
 
    loadingImage: '/static/_static/ajax-loader.gif',
 
    commentBrightImage: '/static/_static/comment-bright.png',
 
    upArrow: '/static/_static/up.png',
 
    downArrow: '/static/_static/down.png',
 
    upArrowPressed: '/static/_static/up-pressed.png',
 
    downArrowPressed: '/static/_static/down-pressed.png',
 
    voting: false,
 
    moderator: false
 
  };
 

	
 
  if (typeof COMMENT_OPTIONS != "undefined") {
 
    opts = jQuery.extend(opts, COMMENT_OPTIONS);
 
  }
 

	
 
  var popupTemplate = '\
 
    <div class="sphinx-comments" id="sc<%id%>">\
 
      <p class="sort-options">\
 
        Sort by:\
 
        <a href="#" class="sort-option byrating">best rated</a>\
 
        <a href="#" class="sort-option byascage">newest</a>\
 
        <a href="#" class="sort-option byage">oldest</a>\
 
      </p>\
 
      <div class="comment-header">Comments</div>\
 
      <div class="comment-loading" id="cn<%id%>">\
 
        loading comments... <img src="<%loadingImage%>" alt="" /></div>\
 
      <ul id="cl<%id%>" class="comment-ul"></ul>\
 
      <div id="ca<%id%>">\
 
      <p class="add-a-comment">Add a comment\
 
        (<a href="#" class="comment-markup" id="ab<%id%>">markup</a>):</p>\
 
      <div class="comment-markup-box" id="mb<%id%>">\
 
        reStructured text markup: <i>*emph*</i>, <b>**strong**</b>, \
 
        <tt>``code``</tt>, \
 
        code blocks: <tt>::</tt> and an indented block after blank line</div>\
 
      <form method="post" id="cf<%id%>" class="comment-form" action="">\
 
        <textarea name="comment" cols="80"></textarea>\
 
        <p class="propose-button">\
 
          <a href="#" id="pc<%id%>" class="show-propose-change">\
 
            Propose a change &#9657;\
 
          </a>\
 
          <a href="#" id="hc<%id%>" class="hide-propose-change">\
 
            Propose a change &#9663;\
 
          </a>\
 
        </p>\
 
        <textarea name="proposal" id="pt<%id%>" cols="80"\
 
                  spellcheck="false"></textarea>\
 
        <input type="submit" value="Add comment" />\
 
        <input type="hidden" name="node" value="<%id%>" />\
 
        <input type="hidden" name="parent" value="" />\
 
      </form>\
 
      </div>\
 
    </div>';
 

	
 
  var commentTemplate = '\
 
    <div id="cd<%id%>" class="sphinx-comment<%css_class%>">\
 
      <div class="vote">\
 
        <div class="arrow">\
 
          <a href="#" id="uv<%id%>" class="vote" title="vote up">\
 
            <img src="<%upArrow%>" />\
 
          </a>\
 
          <a href="#" id="uu<%id%>" class="un vote" title="vote up">\
 
            <img src="<%upArrowPressed%>" />\
 
          </a>\
 
        </div>\
 
        <div class="arrow">\
 
          <a href="#" id="dv<%id%>" class="vote" title="vote down">\
 
            <img src="<%downArrow%>" id="da<%id%>" />\
 
          </a>\
 
          <a href="#" id="du<%id%>" class="un vote" title="vote down">\
 
            <img src="<%downArrowPressed%>" />\
 
          </a>\
 
        </div>\
 
      </div>\
 
      <div class="comment-content">\
 
        <p class="tagline comment">\
 
          <span class="user-id"><%username%></span>\
 
          <span class="rating"><%pretty_rating%></span>\
 
          <span class="delta"><%time.delta%></span>\
 
        </p>\
 
        <div class="comment-text comment"><#text#></div>\
 
        <p class="comment-opts comment">\
 
          <a href="#" class="reply hidden" id="rl<%id%>">reply &#9657;</a>\
 
          <a href="#" class="close-reply" id="cr<%id%>">reply &#9663;</a>\
 
          <a href="#" id="sp<%id%>" class="show-proposal">proposal &#9657;</a>\
 
          <a href="#" id="hp<%id%>" class="hide-proposal">proposal &#9663;</a>\
 
          <a href="#" id="dc<%id%>" class="delete-comment hidden">delete</a>\
 
          <span id="cm<%id%>" class="moderation hidden">\
 
            <a href="#" id="ac<%id%>" class="accept-comment">accept</a>\
 
          </span>\
 
        </p>\
 
        <pre class="proposal" id="pr<%id%>">\
 
<#proposal_diff#>\
 
        </pre>\
 
          <ul class="comment-children" id="cl<%id%>"></ul>\
 
        </div>\
 
        <div class="clearleft"></div>\
 
      </div>\
 
    </div>';
 

	
 
  var replyTemplate = '\
 
    <li>\
 
      <div class="reply-div" id="rd<%id%>">\
 
        <form id="rf<%id%>">\
 
          <textarea name="comment" cols="80"></textarea>\
 
          <input type="submit" value="Add reply" />\
 
          <input type="button" value="Cancel" />\
 
          <input type="hidden" name="parent" value="<%id%>" />\
 
          <input type="hidden" name="node" value="" />\
 
        </form>\
 
      </div>\
 
    </li>';
 

	
 
  $(document).ready(function() {
 
    init();
 
  });
 
})(jQuery);
 

	
 
$(document).ready(function() {
 
  // add comment anchors for all paragraphs that are commentable
 
  $('.sphinx-has-comment').comment();
 

	
 
  // highlight search words in search results
 
  $("div.context").each(function() {
 
    var params = $.getQueryParameters();
 
    var terms = (params.q) ? params.q[0].split(/\s+/) : [];
 
    var result = $(this);
 
    $.each(terms, function() {
 
      result.highlightText(this.toLowerCase(), 'highlighted');
 
    });
 
  });
 

	
 
  // directly open comment window if requested
 
  var anchor = document.location.hash;
 
  if (anchor.substring(0, 9) == '#comment-') {
 
    $('#ao' + anchor.substring(9)).click();
 
    document.location.hash = '#s' + anchor.substring(9);
 
  }
 
});
doc/build/html/api/accounting.html
Show inline comments
 
new file 100644
 
<!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>accounting package &mdash; Accounting API 0.1-beta 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:     '0.1-beta',
 
        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>
 
    <link rel="top" title="Accounting API 0.1-beta documentation" href="../index.html" />
 
    <link rel="next" title="accounting.storage package" href="accounting.storage.html" />
 
    <link rel="prev" title="Welcome to Accounting API’s documentation!" href="../index.html" /> 
 
  </head>
 
  <body>
 
    <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="accounting.storage.html" title="accounting.storage package"
 
             accesskey="N">next</a> |</li>
 
        <li class="right" >
 
          <a href="../index.html" title="Welcome to Accounting API’s documentation!"
 
             accesskey="P">previous</a> |</li>
 
        <li><a href="../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li> 
 
      </ul>
 
    </div>  
 

	
 
    <div class="document">
 
      <div class="documentwrapper">
 
        <div class="bodywrapper">
 
          <div class="body">
 
            
 
  <div class="section" id="accounting-package">
 
<h1>accounting package<a class="headerlink" href="#accounting-package" title="Permalink to this headline">¶</a></h1>
 
<div class="section" id="subpackages">
 
<h2>Subpackages<a class="headerlink" href="#subpackages" title="Permalink to this headline">¶</a></h2>
 
<div class="toctree-wrapper compound">
 
<ul>
 
<li class="toctree-l1"><a class="reference internal" href="accounting.storage.html">accounting.storage package</a><ul>
 
<li class="toctree-l2"><a class="reference internal" href="accounting.storage.html#subpackages">Subpackages</a><ul>
 
<li class="toctree-l3"><a class="reference internal" href="accounting.storage.sql.html">accounting.storage.sql package</a><ul>
 
<li class="toctree-l4"><a class="reference internal" href="accounting.storage.sql.html#submodules">Submodules</a></li>
 
<li class="toctree-l4"><a class="reference internal" href="accounting.storage.sql.html#module-accounting.storage.sql.models">accounting.storage.sql.models module</a></li>
 
<li class="toctree-l4"><a class="reference internal" href="accounting.storage.sql.html#module-accounting.storage.sql">Module contents</a></li>
 
</ul>
 
</li>
 
</ul>
 
</li>
 
<li class="toctree-l2"><a class="reference internal" href="accounting.storage.html#submodules">Submodules</a></li>
 
<li class="toctree-l2"><a class="reference internal" href="accounting.storage.html#module-accounting.storage.ledgercli">accounting.storage.ledgercli module</a></li>
 
<li class="toctree-l2"><a class="reference internal" href="accounting.storage.html#module-accounting.storage">Module contents</a></li>
 
</ul>
 
</li>
 
</ul>
 
</div>
 
</div>
 
<div class="section" id="submodules">
 
<h2>Submodules<a class="headerlink" href="#submodules" title="Permalink to this headline">¶</a></h2>
 
</div>
 
<div class="section" id="module-accounting.client">
 
<span id="accounting-client-module"></span><h2>accounting.client module<a class="headerlink" href="#module-accounting.client" title="Permalink to this headline">¶</a></h2>
 
<dl class="class">
 
<dt id="accounting.client.Client">
 
<em class="property">class </em><tt class="descclassname">accounting.client.</tt><tt class="descname">Client</tt><big>(</big><em>host=None</em>, <em>json_encoder=None</em>, <em>json_decoder=None</em><big>)</big><a class="reference internal" href="../_modules/accounting/client.html#Client"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.client.Client" title="Permalink to this definition">¶</a></dt>
 
<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">builtins.object</span></tt></p>
 
<dl class="method">
 
<dt id="accounting.client.Client.get">
 
<tt class="descname">get</tt><big>(</big><em>path</em><big>)</big><a class="reference internal" href="../_modules/accounting/client.html#Client.get"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.client.Client.get" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.client.Client.get_balance">
 
<tt class="descname">get_balance</tt><big>(</big><big>)</big><a class="reference internal" href="../_modules/accounting/client.html#Client.get_balance"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.client.Client.get_balance" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.client.Client.get_register">
 
<tt class="descname">get_register</tt><big>(</big><big>)</big><a class="reference internal" href="../_modules/accounting/client.html#Client.get_register"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.client.Client.get_register" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.client.Client.post">
 
<tt class="descname">post</tt><big>(</big><em>path</em>, <em>payload</em>, <em>**kw</em><big>)</big><a class="reference internal" href="../_modules/accounting/client.html#Client.post"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.client.Client.post" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.client.Client.simple_transaction">
 
<tt class="descname">simple_transaction</tt><big>(</big><em>from_acc</em>, <em>to_acc</em>, <em>amount</em>, <em>symbol=None</em>, <em>payee=None</em><big>)</big><a class="reference internal" href="../_modules/accounting/client.html#Client.simple_transaction"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.client.Client.simple_transaction" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
</dd></dl>
 

	
 
<dl class="function">
 
<dt id="accounting.client.main">
 
<tt class="descclassname">accounting.client.</tt><tt class="descname">main</tt><big>(</big><em>argv=None</em>, <em>prog=None</em><big>)</big><a class="reference internal" href="../_modules/accounting/client.html#main"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.client.main" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="function">
 
<dt id="accounting.client.print_balance_accounts">
 
<tt class="descclassname">accounting.client.</tt><tt class="descname">print_balance_accounts</tt><big>(</big><em>accounts</em>, <em>level=0</em><big>)</big><a class="reference internal" href="../_modules/accounting/client.html#print_balance_accounts"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.client.print_balance_accounts" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="function">
 
<dt id="accounting.client.print_transactions">
 
<tt class="descclassname">accounting.client.</tt><tt class="descname">print_transactions</tt><big>(</big><em>transactions</em><big>)</big><a class="reference internal" href="../_modules/accounting/client.html#print_transactions"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.client.print_transactions" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
</div>
 
<div class="section" id="module-accounting.config">
 
<span id="accounting-config-module"></span><h2>accounting.config module<a class="headerlink" href="#module-accounting.config" title="Permalink to this headline">¶</a></h2>
 
</div>
 
<div class="section" id="module-accounting.decorators">
 
<span id="accounting-decorators-module"></span><h2>accounting.decorators module<a class="headerlink" href="#module-accounting.decorators" title="Permalink to this headline">¶</a></h2>
 
<dl class="function">
 
<dt id="accounting.decorators.jsonify_exceptions">
 
<tt class="descclassname">accounting.decorators.</tt><tt class="descname">jsonify_exceptions</tt><big>(</big><em>func</em><big>)</big><a class="reference internal" href="../_modules/accounting/decorators.html#jsonify_exceptions"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.decorators.jsonify_exceptions" title="Permalink to this definition">¶</a></dt>
 
<dd><p>Wraps a Flask endpoint and catches any AccountingException-based
 
exceptions which are returned to the client as JSON.</p>
 
</dd></dl>
 

	
 
</div>
 
<div class="section" id="module-accounting.exceptions">
 
<span id="accounting-exceptions-module"></span><h2>accounting.exceptions module<a class="headerlink" href="#module-accounting.exceptions" title="Permalink to this headline">¶</a></h2>
 
<dl class="exception">
 
<dt id="accounting.exceptions.AccountingException">
 
<em class="property">exception </em><tt class="descclassname">accounting.exceptions.</tt><tt class="descname">AccountingException</tt><a class="reference internal" href="../_modules/accounting/exceptions.html#AccountingException"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.exceptions.AccountingException" title="Permalink to this definition">¶</a></dt>
 
<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">builtins.Exception</span></tt></p>
 
<p>Used as a base for exceptions that are returned to the caller via the
 
jsonify_exceptions decorator</p>
 
</dd></dl>
 

	
 
</div>
 
<div class="section" id="module-accounting.gtkclient">
 
<span id="accounting-gtkclient-module"></span><h2>accounting.gtkclient module<a class="headerlink" href="#module-accounting.gtkclient" title="Permalink to this headline">¶</a></h2>
 
<dl class="class">
 
<dt id="accounting.gtkclient.AccountingApplication">
 
<em class="property">class </em><tt class="descclassname">accounting.gtkclient.</tt><tt class="descname">AccountingApplication</tt><a class="reference internal" href="../_modules/accounting/gtkclient.html#AccountingApplication"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.gtkclient.AccountingApplication" title="Permalink to this definition">¶</a></dt>
 
<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">builtins.object</span></tt></p>
 
<dl class="method">
 
<dt id="accounting.gtkclient.AccountingApplication.load_ui">
 
<tt class="descname">load_ui</tt><big>(</big><em>path</em><big>)</big><a class="reference internal" href="../_modules/accounting/gtkclient.html#AccountingApplication.load_ui"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.gtkclient.AccountingApplication.load_ui" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.gtkclient.AccountingApplication.on_aboutdialog_close">
 
<tt class="descname">on_aboutdialog_close</tt><big>(</big><em>widget</em><big>)</big><a class="reference internal" href="../_modules/accounting/gtkclient.html#AccountingApplication.on_aboutdialog_close"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.gtkclient.AccountingApplication.on_aboutdialog_close" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.gtkclient.AccountingApplication.on_refresh_transactions_activate">
 
<tt class="descname">on_refresh_transactions_activate</tt><big>(</big><em>widget</em><big>)</big><a class="reference internal" href="../_modules/accounting/gtkclient.html#AccountingApplication.on_refresh_transactions_activate"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.gtkclient.AccountingApplication.on_refresh_transactions_activate" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.gtkclient.AccountingApplication.on_show_about_activate">
 
<tt class="descname">on_show_about_activate</tt><big>(</big><em>widget</em><big>)</big><a class="reference internal" href="../_modules/accounting/gtkclient.html#AccountingApplication.on_show_about_activate"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.gtkclient.AccountingApplication.on_show_about_activate" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.gtkclient.AccountingApplication.on_transaction_selected">
 
<tt class="descname">on_transaction_selected</tt><big>(</big><em>widget</em><big>)</big><a class="reference internal" href="../_modules/accounting/gtkclient.html#AccountingApplication.on_transaction_selected"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.gtkclient.AccountingApplication.on_transaction_selected" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.gtkclient.AccountingApplication.on_transactions_loaded">
 
<tt class="descname">on_transactions_loaded</tt><big>(</big><em>transactions</em><big>)</big><a class="reference internal" href="../_modules/accounting/gtkclient.html#AccountingApplication.on_transactions_loaded"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.gtkclient.AccountingApplication.on_transactions_loaded" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
</dd></dl>
 

	
 
<dl class="function">
 
<dt id="accounting.gtkclient.indicate_activity">
 
<tt class="descclassname">accounting.gtkclient.</tt><tt class="descname">indicate_activity</tt><big>(</big><em>func_or_str</em><big>)</big><a class="reference internal" href="../_modules/accounting/gtkclient.html#indicate_activity"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.gtkclient.indicate_activity" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="function">
 
<dt id="accounting.gtkclient.indicate_activity_done">
 
<tt class="descclassname">accounting.gtkclient.</tt><tt class="descname">indicate_activity_done</tt><big>(</big><em>func</em><big>)</big><a class="reference internal" href="../_modules/accounting/gtkclient.html#indicate_activity_done"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.gtkclient.indicate_activity_done" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="function">
 
<dt id="accounting.gtkclient.main">
 
<tt class="descclassname">accounting.gtkclient.</tt><tt class="descname">main</tt><big>(</big><em>argv=None</em><big>)</big><a class="reference internal" href="../_modules/accounting/gtkclient.html#main"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.gtkclient.main" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
</div>
 
<div class="section" id="module-accounting.models">
 
<span id="accounting-models-module"></span><h2>accounting.models module<a class="headerlink" href="#module-accounting.models" title="Permalink to this headline">¶</a></h2>
 
<dl class="class">
 
<dt id="accounting.models.Account">
 
<em class="property">class </em><tt class="descclassname">accounting.models.</tt><tt class="descname">Account</tt><big>(</big><em>name=None</em>, <em>amounts=None</em>, <em>accounts=None</em><big>)</big><a class="reference internal" href="../_modules/accounting/models.html#Account"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.models.Account" title="Permalink to this definition">¶</a></dt>
 
<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">builtins.object</span></tt></p>
 
</dd></dl>
 

	
 
<dl class="class">
 
<dt id="accounting.models.Amount">
 
<em class="property">class </em><tt class="descclassname">accounting.models.</tt><tt class="descname">Amount</tt><big>(</big><em>amount=None</em>, <em>symbol=None</em><big>)</big><a class="reference internal" href="../_modules/accounting/models.html#Amount"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.models.Amount" title="Permalink to this definition">¶</a></dt>
 
<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">builtins.object</span></tt></p>
 
</dd></dl>
 

	
 
<dl class="class">
 
<dt id="accounting.models.Posting">
 
<em class="property">class </em><tt class="descclassname">accounting.models.</tt><tt class="descname">Posting</tt><big>(</big><em>account=None</em>, <em>amount=None</em>, <em>metadata=None</em><big>)</big><a class="reference internal" href="../_modules/accounting/models.html#Posting"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.models.Posting" title="Permalink to this definition">¶</a></dt>
 
<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">builtins.object</span></tt></p>
 
</dd></dl>
 

	
 
<dl class="class">
 
<dt id="accounting.models.Transaction">
 
<em class="property">class </em><tt class="descclassname">accounting.models.</tt><tt class="descname">Transaction</tt><big>(</big><em>id=None</em>, <em>date=None</em>, <em>payee=None</em>, <em>postings=None</em>, <em>metadata=None</em>, <em>_generate_id=False</em><big>)</big><a class="reference internal" href="../_modules/accounting/models.html#Transaction"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.models.Transaction" title="Permalink to this definition">¶</a></dt>
 
<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">builtins.object</span></tt></p>
 
<dl class="method">
 
<dt id="accounting.models.Transaction.generate_id">
 
<tt class="descname">generate_id</tt><big>(</big><big>)</big><a class="reference internal" href="../_modules/accounting/models.html#Transaction.generate_id"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.models.Transaction.generate_id" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
</dd></dl>
 

	
 
</div>
 
<div class="section" id="module-accounting.transport">
 
<span id="accounting-transport-module"></span><h2>accounting.transport module<a class="headerlink" href="#module-accounting.transport" title="Permalink to this headline">¶</a></h2>
 
<dl class="class">
 
<dt id="accounting.transport.AccountingDecoder">
 
<em class="property">class </em><tt class="descclassname">accounting.transport.</tt><tt class="descname">AccountingDecoder</tt><a class="reference internal" href="../_modules/accounting/transport.html#AccountingDecoder"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.transport.AccountingDecoder" title="Permalink to this definition">¶</a></dt>
 
<dd><p>Bases: <a class="reference external" href="http://flask.pocoo.org/docs/api/#flask.json.JSONDecoder" title="(in Flask v0.10)"><tt class="xref py py-class docutils literal"><span class="pre">flask.json.JSONDecoder</span></tt></a></p>
 
<dl class="method">
 
<dt id="accounting.transport.AccountingDecoder.dict_to_object">
 
<tt class="descname">dict_to_object</tt><big>(</big><em>d</em><big>)</big><a class="reference internal" href="../_modules/accounting/transport.html#AccountingDecoder.dict_to_object"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.transport.AccountingDecoder.dict_to_object" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
</dd></dl>
 

	
 
<dl class="class">
 
<dt id="accounting.transport.AccountingEncoder">
 
<em class="property">class </em><tt class="descclassname">accounting.transport.</tt><tt class="descname">AccountingEncoder</tt><big>(</big><em>skipkeys=False</em>, <em>ensure_ascii=True</em>, <em>check_circular=True</em>, <em>allow_nan=True</em>, <em>sort_keys=False</em>, <em>indent=None</em>, <em>separators=None</em>, <em>default=None</em><big>)</big><a class="reference internal" href="../_modules/accounting/transport.html#AccountingEncoder"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.transport.AccountingEncoder" title="Permalink to this definition">¶</a></dt>
 
<dd><p>Bases: <a class="reference external" href="http://flask.pocoo.org/docs/api/#flask.json.JSONEncoder" title="(in Flask v0.10)"><tt class="xref py py-class docutils literal"><span class="pre">flask.json.JSONEncoder</span></tt></a></p>
 
<dl class="method">
 
<dt id="accounting.transport.AccountingEncoder.default">
 
<tt class="descname">default</tt><big>(</big><em>o</em><big>)</big><a class="reference internal" href="../_modules/accounting/transport.html#AccountingEncoder.default"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.transport.AccountingEncoder.default" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
</dd></dl>
 

	
 
</div>
 
<div class="section" id="module-accounting.web">
 
<span id="accounting-web-module"></span><h2>accounting.web module<a class="headerlink" href="#module-accounting.web" title="Permalink to this headline">¶</a></h2>
 
<p>This module contains the high-level webservice logic such as the Flask setup
 
and the Flask endpoints.</p>
 
<dl class="function">
 
<dt id="accounting.web.index">
 
<tt class="descclassname">accounting.web.</tt><tt class="descname">index</tt><big>(</big><big>)</big><a class="reference internal" href="../_modules/accounting/web.html#index"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.web.index" title="Permalink to this definition">¶</a></dt>
 
<dd><p>Hello World!</p>
 
</dd></dl>
 

	
 
<dl class="function">
 
<dt id="accounting.web.init_ledger">
 
<tt class="descclassname">accounting.web.</tt><tt class="descname">init_ledger</tt><big>(</big><big>)</big><a class="reference internal" href="../_modules/accounting/web.html#init_ledger"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.web.init_ledger" title="Permalink to this definition">¶</a></dt>
 
<dd><p><a class="reference external" href="http://flask.pocoo.org/docs/api/#flask.Flask.before_request" title="(in Flask v0.10)"><tt class="xref py py-meth docutils literal"><span class="pre">flask.Flask.before_request()</span></tt></a>-decorated method that initializes an
 
<tt class="xref py py-class docutils literal"><span class="pre">accounting.Ledger</span></tt> object.</p>
 
</dd></dl>
 

	
 
<dl class="function">
 
<dt id="accounting.web.main">
 
<tt class="descclassname">accounting.web.</tt><tt class="descname">main</tt><big>(</big><em>argv=None</em><big>)</big><a class="reference internal" href="../_modules/accounting/web.html#main"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.web.main" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="function">
 
<dt id="accounting.web.transaction_get">
 
<tt class="descclassname">accounting.web.</tt><tt class="descname">transaction_get</tt><big>(</big><big>)</big><a class="reference internal" href="../_modules/accounting/web.html#transaction_get"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.web.transaction_get" title="Permalink to this definition">¶</a></dt>
 
<dd><p>Returns the JSON-serialized output of <tt class="xref py py-meth docutils literal"><span class="pre">accounting.Ledger.reg()</span></tt></p>
 
</dd></dl>
 

	
 
<dl class="function">
 
<dt id="accounting.web.transaction_post">
 
<tt class="descclassname">accounting.web.</tt><tt class="descname">transaction_post</tt><big>(</big><big>)</big><a class="reference internal" href="../_modules/accounting/web.html#transaction_post"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.web.transaction_post" title="Permalink to this definition">¶</a></dt>
 
<dd><p>REST/JSON endpoint for transactions.</p>
 
<p>Current state:</p>
 
<p>Takes a POST request with a <tt class="docutils literal"><span class="pre">transactions</span></tt> JSON payload and writes it to
 
the ledger file.</p>
 
<p>Requires the <tt class="docutils literal"><span class="pre">transactions</span></tt> payload to be __type__-annotated:</p>
 
<div class="highlight-json"><pre>{
 
  &quot;transactions&quot;: [
 
    {
 
      &quot;__type__&quot;: &quot;Transaction&quot;,
 
      &quot;date&quot;: &quot;2013-01-01&quot;,
 
      &quot;payee&quot;: &quot;Kindly T. Donor&quot;,
 
      &quot;postings&quot;: [
 
        {
 
          &quot;__type__&quot;: &quot;Posting&quot;,
 
          &quot;account&quot;: &quot;Income:Foo:Donation&quot;,
 
          &quot;amount&quot;: {
 
            &quot;__type__&quot;: &quot;Amount&quot;,
 
            &quot;amount&quot;: &quot;-100&quot;,
 
            &quot;symbol&quot;: &quot;$&quot;
 
          }
 
        },
 
        {
 
          &quot;__type__&quot;: &quot;Posting&quot;,
 
          &quot;account&quot;: &quot;Assets:Checking&quot;,
 
          &quot;amount&quot;: {
 
            &quot;__type__&quot;: &quot;Amount&quot;,
 
            &quot;amount&quot;: &quot;100&quot;,
 
            &quot;symbol&quot;: &quot;$&quot;
 
          }
 
        }
 
      ]
 
    }
 
}</pre>
 
</div>
 
<p>becomes:</p>
 
<div class="highlight-python"><pre>2013-01-01 Kindly T. Donor
 
  Income:Foo:Donation                                         $ -100
 
  Assets:Checking                                              $ 100</pre>
 
</div>
 
</dd></dl>
 

	
 
<dl class="function">
 
<dt id="accounting.web.transaction_update">
 
<tt class="descclassname">accounting.web.</tt><tt class="descname">transaction_update</tt><big>(</big><em>transaction_id=None</em><big>)</big><a class="headerlink" href="#accounting.web.transaction_update" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
</div>
 
<div class="section" id="module-accounting">
 
<span id="module-contents"></span><h2>Module contents<a class="headerlink" href="#module-accounting" title="Permalink to this headline">¶</a></h2>
 
</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="#">accounting package</a><ul>
 
<li><a class="reference internal" href="#subpackages">Subpackages</a><ul>
 
</ul>
 
</li>
 
<li><a class="reference internal" href="#submodules">Submodules</a></li>
 
<li><a class="reference internal" href="#module-accounting.client">accounting.client module</a></li>
 
<li><a class="reference internal" href="#module-accounting.config">accounting.config module</a></li>
 
<li><a class="reference internal" href="#module-accounting.decorators">accounting.decorators module</a></li>
 
<li><a class="reference internal" href="#module-accounting.exceptions">accounting.exceptions module</a></li>
 
<li><a class="reference internal" href="#module-accounting.gtkclient">accounting.gtkclient module</a></li>
 
<li><a class="reference internal" href="#module-accounting.models">accounting.models module</a></li>
 
<li><a class="reference internal" href="#module-accounting.transport">accounting.transport module</a></li>
 
<li><a class="reference internal" href="#module-accounting.web">accounting.web module</a></li>
 
<li><a class="reference internal" href="#module-accounting">Module contents</a></li>
 
</ul>
 
</li>
 
</ul>
 

	
 
  <h4>Previous topic</h4>
 
  <p class="topless"><a href="../index.html"
 
                        title="previous chapter">Welcome to Accounting API&#8217;s documentation!</a></p>
 
  <h4>Next topic</h4>
 
  <p class="topless"><a href="accounting.storage.html"
 
                        title="next chapter">accounting.storage package</a></p>
 
  <h3>This Page</h3>
 
  <ul class="this-page-menu">
 
    <li><a href="../_sources/api/accounting.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="accounting.storage.html" title="accounting.storage package"
 
             >next</a> |</li>
 
        <li class="right" >
 
          <a href="../index.html" title="Welcome to Accounting API’s documentation!"
 
             >previous</a> |</li>
 
        <li><a href="../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li> 
 
      </ul>
 
    </div>
 
    <div class="footer">
 
        &copy; Copyright 2013, Joar Wandborg.
 
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.
 
    </div>
 
  </body>
 
</html>
...
 
\ No newline at end of file
doc/build/html/api/accounting.storage.html
Show inline comments
 
new file 100644
 
<!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>accounting.storage package &mdash; Accounting API 0.1-beta 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:     '0.1-beta',
 
        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>
 
    <link rel="top" title="Accounting API 0.1-beta documentation" href="../index.html" />
 
    <link rel="up" title="accounting package" href="accounting.html" />
 
    <link rel="next" title="accounting.storage.sql package" href="accounting.storage.sql.html" />
 
    <link rel="prev" title="accounting package" href="accounting.html" /> 
 
  </head>
 
  <body>
 
    <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="accounting.storage.sql.html" title="accounting.storage.sql package"
 
             accesskey="N">next</a> |</li>
 
        <li class="right" >
 
          <a href="accounting.html" title="accounting package"
 
             accesskey="P">previous</a> |</li>
 
        <li><a href="../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="accounting.html" accesskey="U">accounting package</a> &raquo;</li> 
 
      </ul>
 
    </div>  
 

	
 
    <div class="document">
 
      <div class="documentwrapper">
 
        <div class="bodywrapper">
 
          <div class="body">
 
            
 
  <div class="section" id="accounting-storage-package">
 
<h1>accounting.storage package<a class="headerlink" href="#accounting-storage-package" title="Permalink to this headline">¶</a></h1>
 
<div class="section" id="subpackages">
 
<h2>Subpackages<a class="headerlink" href="#subpackages" title="Permalink to this headline">¶</a></h2>
 
<div class="toctree-wrapper compound">
 
<ul>
 
<li class="toctree-l1"><a class="reference internal" href="accounting.storage.sql.html">accounting.storage.sql package</a><ul>
 
<li class="toctree-l2"><a class="reference internal" href="accounting.storage.sql.html#submodules">Submodules</a></li>
 
<li class="toctree-l2"><a class="reference internal" href="accounting.storage.sql.html#module-accounting.storage.sql.models">accounting.storage.sql.models module</a></li>
 
<li class="toctree-l2"><a class="reference internal" href="accounting.storage.sql.html#module-accounting.storage.sql">Module contents</a></li>
 
</ul>
 
</li>
 
</ul>
 
</div>
 
</div>
 
<div class="section" id="submodules">
 
<h2>Submodules<a class="headerlink" href="#submodules" title="Permalink to this headline">¶</a></h2>
 
</div>
 
<div class="section" id="module-accounting.storage.ledgercli">
 
<span id="accounting-storage-ledgercli-module"></span><h2>accounting.storage.ledgercli module<a class="headerlink" href="#module-accounting.storage.ledgercli" title="Permalink to this headline">¶</a></h2>
 
<dl class="class">
 
<dt id="accounting.storage.ledgercli.Ledger">
 
<em class="property">class </em><tt class="descclassname">accounting.storage.ledgercli.</tt><tt class="descname">Ledger</tt><big>(</big><em>app=None</em>, <em>ledger_file=None</em>, <em>ledger_bin=None</em><big>)</big><a class="reference internal" href="../_modules/accounting/storage/ledgercli.html#Ledger"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.ledgercli.Ledger" title="Permalink to this definition">¶</a></dt>
 
<dd><p>Bases: <a class="reference internal" href="#accounting.storage.Storage" title="accounting.storage.Storage"><tt class="xref py py-class docutils literal"><span class="pre">accounting.storage.Storage</span></tt></a></p>
 
<dl class="method">
 
<dt id="accounting.storage.ledgercli.Ledger.add_transaction">
 
<tt class="descname">add_transaction</tt><big>(</big><em>transaction</em><big>)</big><a class="reference internal" href="../_modules/accounting/storage/ledgercli.html#Ledger.add_transaction"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.ledgercli.Ledger.add_transaction" title="Permalink to this definition">¶</a></dt>
 
<dd><p>Writes a transaction to the ledger file by opening it in &#8216;ab&#8217; mode and
 
writing a ledger transaction based on the
 
<a class="reference internal" href="accounting.html#accounting.models.Transaction" title="accounting.models.Transaction"><tt class="xref py py-class docutils literal"><span class="pre">Transaction</span></tt></a> instance in
 
<tt class="xref py py-data docutils literal"><span class="pre">transaction</span></tt>.</p>
 
</dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.storage.ledgercli.Ledger.assemble_arguments">
 
<tt class="descname">assemble_arguments</tt><big>(</big><big>)</big><a class="reference internal" href="../_modules/accounting/storage/ledgercli.html#Ledger.assemble_arguments"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.ledgercli.Ledger.assemble_arguments" title="Permalink to this definition">¶</a></dt>
 
<dd><p>Returns a list of arguments suitable for <a class="reference external" href="http://docs.python.org/3.3/library/subprocess.html#subprocess.Popen" title="(in Python v3.3)"><tt class="xref py py-class docutils literal"><span class="pre">subprocess.Popen</span></tt></a>
 
based on <tt class="xref py py-attr docutils literal"><span class="pre">self.ledger_bin</span></tt> and <tt class="xref py py-attr docutils literal"><span class="pre">self.ledger_file</span></tt>.</p>
 
</dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.storage.ledgercli.Ledger.bal">
 
<tt class="descname">bal</tt><big>(</big><big>)</big><a class="reference internal" href="../_modules/accounting/storage/ledgercli.html#Ledger.bal"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.ledgercli.Ledger.bal" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.storage.ledgercli.Ledger.get_process">
 
<tt class="descname">get_process</tt><big>(</big><big>)</big><a class="reference internal" href="../_modules/accounting/storage/ledgercli.html#Ledger.get_process"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.ledgercli.Ledger.get_process" title="Permalink to this definition">¶</a></dt>
 
<dd><p>Returns <tt class="xref py py-attr docutils literal"><span class="pre">self.ledger_process</span></tt> if it evaluates to <tt class="docutils literal"><span class="pre">True</span></tt>. If
 
<tt class="xref py py-attr docutils literal"><span class="pre">self.ledger_process</span></tt> is not set the result of
 
<a class="reference internal" href="#accounting.storage.ledgercli.Ledger.init_process" title="accounting.storage.ledgercli.Ledger.init_process"><tt class="xref py py-meth docutils literal"><span class="pre">self.init_process()</span></tt></a> is returned.</p>
 
</dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.storage.ledgercli.Ledger.get_transactions">
 
<tt class="descname">get_transactions</tt><big>(</big><big>)</big><a class="reference internal" href="../_modules/accounting/storage/ledgercli.html#Ledger.get_transactions"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.ledgercli.Ledger.get_transactions" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.storage.ledgercli.Ledger.init_process">
 
<tt class="descname">init_process</tt><big>(</big><big>)</big><a class="reference internal" href="../_modules/accounting/storage/ledgercli.html#Ledger.init_process"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.ledgercli.Ledger.init_process" title="Permalink to this definition">¶</a></dt>
 
<dd><p>Creates a new (presumably) ledger subprocess based on the args from
 
<a class="reference internal" href="#accounting.storage.ledgercli.Ledger.assemble_arguments" title="accounting.storage.ledgercli.Ledger.assemble_arguments"><tt class="xref py py-meth docutils literal"><span class="pre">Ledger.assemble_arguments()</span></tt></a> and then runs
 
<a class="reference internal" href="#accounting.storage.ledgercli.Ledger.read_until_prompt" title="accounting.storage.ledgercli.Ledger.read_until_prompt"><tt class="xref py py-meth docutils literal"><span class="pre">Ledger.read_until_prompt()</span></tt></a> once (which should return the banner
 
text) and discards the output.</p>
 
</dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.storage.ledgercli.Ledger.locked_process">
 
<tt class="descname">locked_process</tt><big>(</big><big>)</big><a class="reference internal" href="../_modules/accounting/storage/ledgercli.html#Ledger.locked_process"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.ledgercli.Ledger.locked_process" title="Permalink to this definition">¶</a></dt>
 
<dd><p>Context manager that checks that the ledger process is not already
 
locked, then &#8220;locks&#8221; the process and yields the process handle and
 
unlocks the process when execution is returned.</p>
 
<p>Since this decorated as a <a class="reference external" href="http://docs.python.org/3.3/library/contextlib.html#contextlib.contextmanager" title="(in Python v3.3)"><tt class="xref py py-func docutils literal"><span class="pre">contextlib.contextmanager()</span></tt></a> the
 
recommended use is with the <tt class="docutils literal"><span class="pre">with</span></tt>-statement.</p>
 
<div class="highlight-python"><div class="highlight"><pre><span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">locked_process</span><span class="p">()</span> <span class="k">as</span> <span class="n">p</span><span class="p">:</span>
 
    <span class="n">p</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">b</span><span class="s">&#39;bal</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">)</span>
 

	
 
    <span class="n">output</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">read_until_prompt</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
 
</pre></div>
 
</div>
 
</dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.storage.ledgercli.Ledger.read_until_prompt">
 
<tt class="descname">read_until_prompt</tt><big>(</big><em>process</em><big>)</big><a class="reference internal" href="../_modules/accounting/storage/ledgercli.html#Ledger.read_until_prompt"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.ledgercli.Ledger.read_until_prompt" title="Permalink to this definition">¶</a></dt>
 
<dd><p>Reads from the subprocess instance <tt class="xref py py-data docutils literal"><span class="pre">process</span></tt> until it finds a
 
combination of <tt class="docutils literal"><span class="pre">\n]\x20</span></tt> (the prompt), then returns the output
 
without the prompt.</p>
 
</dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.storage.ledgercli.Ledger.reg">
 
<tt class="descname">reg</tt><big>(</big><big>)</big><a class="reference internal" href="../_modules/accounting/storage/ledgercli.html#Ledger.reg"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.ledgercli.Ledger.reg" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.storage.ledgercli.Ledger.send_command">
 
<tt class="descname">send_command</tt><big>(</big><em>command</em><big>)</big><a class="reference internal" href="../_modules/accounting/storage/ledgercli.html#Ledger.send_command"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.ledgercli.Ledger.send_command" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.storage.ledgercli.Ledger.update_transaction">
 
<tt class="descname">update_transaction</tt><big>(</big><em>transaction</em><big>)</big><a class="reference internal" href="../_modules/accounting/storage/ledgercli.html#Ledger.update_transaction"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.ledgercli.Ledger.update_transaction" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
</dd></dl>
 

	
 
<dl class="function">
 
<dt id="accounting.storage.ledgercli.main">
 
<tt class="descclassname">accounting.storage.ledgercli.</tt><tt class="descname">main</tt><big>(</big><em>argv=None</em><big>)</big><a class="reference internal" href="../_modules/accounting/storage/ledgercli.html#main"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.ledgercli.main" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
</div>
 
<div class="section" id="module-accounting.storage">
 
<span id="module-contents"></span><h2>Module contents<a class="headerlink" href="#module-accounting.storage" title="Permalink to this headline">¶</a></h2>
 
<dl class="class">
 
<dt id="accounting.storage.Storage">
 
<em class="property">class </em><tt class="descclassname">accounting.storage.</tt><tt class="descname">Storage</tt><big>(</big><em>*args</em>, <em>**kw</em><big>)</big><a class="reference internal" href="../_modules/accounting/storage.html#Storage"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.Storage" title="Permalink to this definition">¶</a></dt>
 
<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">builtins.object</span></tt></p>
 
<p>ABC for accounting storage</p>
 
<dl class="method">
 
<dt id="accounting.storage.Storage.get_account">
 
<tt class="descname">get_account</tt><big>(</big><em>*args</em>, <em>**kw</em><big>)</big><a class="reference internal" href="../_modules/accounting/storage.html#Storage.get_account"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.Storage.get_account" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.storage.Storage.get_accounts">
 
<tt class="descname">get_accounts</tt><big>(</big><em>*args</em>, <em>**kw</em><big>)</big><a class="reference internal" href="../_modules/accounting/storage.html#Storage.get_accounts"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.Storage.get_accounts" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.storage.Storage.get_transaction">
 
<tt class="descname">get_transaction</tt><big>(</big><em>*args</em>, <em>**kw</em><big>)</big><a class="reference internal" href="../_modules/accounting/storage.html#Storage.get_transaction"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.Storage.get_transaction" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.storage.Storage.get_transactions">
 
<tt class="descname">get_transactions</tt><big>(</big><em>*args</em>, <em>**kw</em><big>)</big><a class="reference internal" href="../_modules/accounting/storage.html#Storage.get_transactions"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.Storage.get_transactions" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.storage.Storage.reverse_transaction">
 
<tt class="descname">reverse_transaction</tt><big>(</big><em>transaction_id</em><big>)</big><a class="headerlink" href="#accounting.storage.Storage.reverse_transaction" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.storage.Storage.update_transaction">
 
<tt class="descname">update_transaction</tt><big>(</big><em>transaction</em><big>)</big><a class="headerlink" href="#accounting.storage.Storage.update_transaction" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
</dd></dl>
 

	
 
</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="#">accounting.storage package</a><ul>
 
<li><a class="reference internal" href="#subpackages">Subpackages</a><ul>
 
</ul>
 
</li>
 
<li><a class="reference internal" href="#submodules">Submodules</a></li>
 
<li><a class="reference internal" href="#module-accounting.storage.ledgercli">accounting.storage.ledgercli module</a></li>
 
<li><a class="reference internal" href="#module-accounting.storage">Module contents</a></li>
 
</ul>
 
</li>
 
</ul>
 

	
 
  <h4>Previous topic</h4>
 
  <p class="topless"><a href="accounting.html"
 
                        title="previous chapter">accounting package</a></p>
 
  <h4>Next topic</h4>
 
  <p class="topless"><a href="accounting.storage.sql.html"
 
                        title="next chapter">accounting.storage.sql package</a></p>
 
  <h3>This Page</h3>
 
  <ul class="this-page-menu">
 
    <li><a href="../_sources/api/accounting.storage.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="accounting.storage.sql.html" title="accounting.storage.sql package"
 
             >next</a> |</li>
 
        <li class="right" >
 
          <a href="accounting.html" title="accounting package"
 
             >previous</a> |</li>
 
        <li><a href="../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="accounting.html" >accounting package</a> &raquo;</li> 
 
      </ul>
 
    </div>
 
    <div class="footer">
 
        &copy; Copyright 2013, Joar Wandborg.
 
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.
 
    </div>
 
  </body>
 
</html>
...
 
\ No newline at end of file
doc/build/html/api/accounting.storage.sql.html
Show inline comments
 
new file 100644
 
<!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>accounting.storage.sql package &mdash; Accounting API 0.1-beta 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:     '0.1-beta',
 
        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>
 
    <link rel="top" title="Accounting API 0.1-beta documentation" href="../index.html" />
 
    <link rel="up" title="accounting.storage package" href="accounting.storage.html" />
 
    <link rel="prev" title="accounting.storage package" href="accounting.storage.html" /> 
 
  </head>
 
  <body>
 
    <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="accounting.storage.html" title="accounting.storage package"
 
             accesskey="P">previous</a> |</li>
 
        <li><a href="../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="accounting.html" >accounting package</a> &raquo;</li>
 
          <li><a href="accounting.storage.html" accesskey="U">accounting.storage package</a> &raquo;</li> 
 
      </ul>
 
    </div>  
 

	
 
    <div class="document">
 
      <div class="documentwrapper">
 
        <div class="bodywrapper">
 
          <div class="body">
 
            
 
  <div class="section" id="accounting-storage-sql-package">
 
<h1>accounting.storage.sql package<a class="headerlink" href="#accounting-storage-sql-package" title="Permalink to this headline">¶</a></h1>
 
<div class="section" id="submodules">
 
<h2>Submodules<a class="headerlink" href="#submodules" title="Permalink to this headline">¶</a></h2>
 
</div>
 
<div class="section" id="module-accounting.storage.sql.models">
 
<span id="accounting-storage-sql-models-module"></span><h2>accounting.storage.sql.models module<a class="headerlink" href="#module-accounting.storage.sql.models" title="Permalink to this headline">¶</a></h2>
 
<dl class="class">
 
<dt id="accounting.storage.sql.models.Amount">
 
<em class="property">class </em><tt class="descclassname">accounting.storage.sql.models.</tt><tt class="descname">Amount</tt><big>(</big><em>**kwargs</em><big>)</big><a class="reference internal" href="../_modules/accounting/storage/sql/models.html#Amount"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.sql.models.Amount" title="Permalink to this definition">¶</a></dt>
 
<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">flask_sqlalchemy.Model</span></tt></p>
 
<dl class="attribute">
 
<dt id="accounting.storage.sql.models.Amount.amount">
 
<tt class="descname">amount</tt><a class="headerlink" href="#accounting.storage.sql.models.Amount.amount" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.storage.sql.models.Amount.as_dict">
 
<tt class="descname">as_dict</tt><big>(</big><big>)</big><a class="reference internal" href="../_modules/accounting/storage/sql/models.html#Amount.as_dict"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.sql.models.Amount.as_dict" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="attribute">
 
<dt id="accounting.storage.sql.models.Amount.id">
 
<tt class="descname">id</tt><a class="headerlink" href="#accounting.storage.sql.models.Amount.id" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="attribute">
 
<dt id="accounting.storage.sql.models.Amount.symbol">
 
<tt class="descname">symbol</tt><a class="headerlink" href="#accounting.storage.sql.models.Amount.symbol" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
</dd></dl>
 

	
 
<dl class="class">
 
<dt id="accounting.storage.sql.models.Posting">
 
<em class="property">class </em><tt class="descclassname">accounting.storage.sql.models.</tt><tt class="descname">Posting</tt><big>(</big><em>**kwargs</em><big>)</big><a class="reference internal" href="../_modules/accounting/storage/sql/models.html#Posting"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.sql.models.Posting" title="Permalink to this definition">¶</a></dt>
 
<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">flask_sqlalchemy.Model</span></tt></p>
 
<dl class="attribute">
 
<dt id="accounting.storage.sql.models.Posting.account">
 
<tt class="descname">account</tt><a class="headerlink" href="#accounting.storage.sql.models.Posting.account" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="attribute">
 
<dt id="accounting.storage.sql.models.Posting.amount">
 
<tt class="descname">amount</tt><a class="headerlink" href="#accounting.storage.sql.models.Posting.amount" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="attribute">
 
<dt id="accounting.storage.sql.models.Posting.amount_id">
 
<tt class="descname">amount_id</tt><a class="headerlink" href="#accounting.storage.sql.models.Posting.amount_id" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.storage.sql.models.Posting.as_dict">
 
<tt class="descname">as_dict</tt><big>(</big><big>)</big><a class="reference internal" href="../_modules/accounting/storage/sql/models.html#Posting.as_dict"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.sql.models.Posting.as_dict" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="attribute">
 
<dt id="accounting.storage.sql.models.Posting.id">
 
<tt class="descname">id</tt><a class="headerlink" href="#accounting.storage.sql.models.Posting.id" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="attribute">
 
<dt id="accounting.storage.sql.models.Posting.meta">
 
<tt class="descname">meta</tt><a class="headerlink" href="#accounting.storage.sql.models.Posting.meta" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="attribute">
 
<dt id="accounting.storage.sql.models.Posting.transaction">
 
<tt class="descname">transaction</tt><a class="headerlink" href="#accounting.storage.sql.models.Posting.transaction" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="attribute">
 
<dt id="accounting.storage.sql.models.Posting.transaction_uuid">
 
<tt class="descname">transaction_uuid</tt><a class="headerlink" href="#accounting.storage.sql.models.Posting.transaction_uuid" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
</dd></dl>
 

	
 
<dl class="class">
 
<dt id="accounting.storage.sql.models.Transaction">
 
<em class="property">class </em><tt class="descclassname">accounting.storage.sql.models.</tt><tt class="descname">Transaction</tt><big>(</big><em>**kwargs</em><big>)</big><a class="reference internal" href="../_modules/accounting/storage/sql/models.html#Transaction"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.sql.models.Transaction" title="Permalink to this definition">¶</a></dt>
 
<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">flask_sqlalchemy.Model</span></tt></p>
 
<dl class="method">
 
<dt id="accounting.storage.sql.models.Transaction.as_dict">
 
<tt class="descname">as_dict</tt><big>(</big><big>)</big><a class="reference internal" href="../_modules/accounting/storage/sql/models.html#Transaction.as_dict"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.sql.models.Transaction.as_dict" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="attribute">
 
<dt id="accounting.storage.sql.models.Transaction.date">
 
<tt class="descname">date</tt><a class="headerlink" href="#accounting.storage.sql.models.Transaction.date" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="attribute">
 
<dt id="accounting.storage.sql.models.Transaction.id">
 
<tt class="descname">id</tt><a class="headerlink" href="#accounting.storage.sql.models.Transaction.id" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="attribute">
 
<dt id="accounting.storage.sql.models.Transaction.meta">
 
<tt class="descname">meta</tt><a class="headerlink" href="#accounting.storage.sql.models.Transaction.meta" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="attribute">
 
<dt id="accounting.storage.sql.models.Transaction.payee">
 
<tt class="descname">payee</tt><a class="headerlink" href="#accounting.storage.sql.models.Transaction.payee" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="attribute">
 
<dt id="accounting.storage.sql.models.Transaction.uuid">
 
<tt class="descname">uuid</tt><a class="headerlink" href="#accounting.storage.sql.models.Transaction.uuid" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
</dd></dl>
 

	
 
</div>
 
<div class="section" id="module-accounting.storage.sql">
 
<span id="module-contents"></span><h2>Module contents<a class="headerlink" href="#module-accounting.storage.sql" title="Permalink to this headline">¶</a></h2>
 
<dl class="class">
 
<dt id="accounting.storage.sql.SQLStorage">
 
<em class="property">class </em><tt class="descclassname">accounting.storage.sql.</tt><tt class="descname">SQLStorage</tt><big>(</big><em>app=None</em><big>)</big><a class="reference internal" href="../_modules/accounting/storage/sql.html#SQLStorage"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.sql.SQLStorage" title="Permalink to this definition">¶</a></dt>
 
<dd><p>Bases: <a class="reference internal" href="accounting.storage.html#accounting.storage.Storage" title="accounting.storage.Storage"><tt class="xref py py-class docutils literal"><span class="pre">accounting.storage.Storage</span></tt></a></p>
 
<dl class="method">
 
<dt id="accounting.storage.sql.SQLStorage.add_transaction">
 
<tt class="descname">add_transaction</tt><big>(</big><em>transaction</em><big>)</big><a class="reference internal" href="../_modules/accounting/storage/sql.html#SQLStorage.add_transaction"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.sql.SQLStorage.add_transaction" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.storage.sql.SQLStorage.get_transactions">
 
<tt class="descname">get_transactions</tt><big>(</big><em>*args</em>, <em>**kw</em><big>)</big><a class="reference internal" href="../_modules/accounting/storage/sql.html#SQLStorage.get_transactions"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.sql.SQLStorage.get_transactions" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
<dl class="method">
 
<dt id="accounting.storage.sql.SQLStorage.update_transaction">
 
<tt class="descname">update_transaction</tt><big>(</big><em>transaction</em><big>)</big><a class="reference internal" href="../_modules/accounting/storage/sql.html#SQLStorage.update_transaction"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#accounting.storage.sql.SQLStorage.update_transaction" title="Permalink to this definition">¶</a></dt>
 
<dd></dd></dl>
 

	
 
</dd></dl>
 

	
 
</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="#">accounting.storage.sql package</a><ul>
 
<li><a class="reference internal" href="#submodules">Submodules</a></li>
 
<li><a class="reference internal" href="#module-accounting.storage.sql.models">accounting.storage.sql.models module</a></li>
 
<li><a class="reference internal" href="#module-accounting.storage.sql">Module contents</a></li>
 
</ul>
 
</li>
 
</ul>
 

	
 
  <h4>Previous topic</h4>
 
  <p class="topless"><a href="accounting.storage.html"
 
                        title="previous chapter">accounting.storage package</a></p>
 
  <h3>This Page</h3>
 
  <ul class="this-page-menu">
 
    <li><a href="../_sources/api/accounting.storage.sql.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="accounting.storage.html" title="accounting.storage package"
 
             >previous</a> |</li>
 
        <li><a href="../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li>
 
          <li><a href="accounting.html" >accounting package</a> &raquo;</li>
 
          <li><a href="accounting.storage.html" >accounting.storage package</a> &raquo;</li> 
 
      </ul>
 
    </div>
 
    <div class="footer">
 
        &copy; Copyright 2013, Joar Wandborg.
 
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.
 
    </div>
 
  </body>
 
</html>
...
 
\ No newline at end of file
doc/build/html/api/asyncio-test.html
Show inline comments
 
new file 100644
 
<!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>asyncio-test Module &mdash; Accounting API 0.1-beta 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:     '0.1-beta',
 
        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>
 
    <link rel="top" title="Accounting API 0.1-beta documentation" href="../index.html" /> 
 
  </head>
 
  <body>
 
    <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><a href="../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li> 
 
      </ul>
 
    </div>  
 

	
 
    <div class="document">
 
      <div class="documentwrapper">
 
        <div class="bodywrapper">
 
          <div class="body">
 
            
 
  <div class="section" id="asyncio-test-module">
 
<h1>asyncio-test Module<a class="headerlink" href="#asyncio-test-module" title="Permalink to this headline">¶</a></h1>
 
</div>
 

	
 

	
 
          </div>
 
        </div>
 
      </div>
 
      <div class="sphinxsidebar">
 
        <div class="sphinxsidebarwrapper">
 
  <h3>This Page</h3>
 
  <ul class="this-page-menu">
 
    <li><a href="../_sources/api/asyncio-test.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><a href="../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li> 
 
      </ul>
 
    </div>
 
    <div class="footer">
 
        &copy; Copyright 2013, Joar Wandborg.
 
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.
 
    </div>
 
  </body>
 
</html>
...
 
\ No newline at end of file
doc/build/html/api/modules.html
Show inline comments
 
new file 100644
 
<!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>accounting &mdash; Accounting API 0.1-beta 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:     '0.1-beta',
 
        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>
 
    <link rel="top" title="Accounting API 0.1-beta documentation" href="../index.html" /> 
 
  </head>
 
  <body>
 
    <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><a href="../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li> 
 
      </ul>
 
    </div>  
 

	
 
    <div class="document">
 
      <div class="documentwrapper">
 
        <div class="bodywrapper">
 
          <div class="body">
 
            
 
  <div class="section" id="accounting">
 
<h1>accounting<a class="headerlink" href="#accounting" title="Permalink to this headline">¶</a></h1>
 
<div class="toctree-wrapper compound">
 
<ul>
 
<li class="toctree-l1"><a class="reference internal" href="accounting.html">accounting package</a><ul>
 
<li class="toctree-l2"><a class="reference internal" href="accounting.html#subpackages">Subpackages</a><ul>
 
<li class="toctree-l3"><a class="reference internal" href="accounting.storage.html">accounting.storage package</a><ul>
 
<li class="toctree-l4"><a class="reference internal" href="accounting.storage.html#subpackages">Subpackages</a></li>
 
<li class="toctree-l4"><a class="reference internal" href="accounting.storage.html#submodules">Submodules</a></li>
 
<li class="toctree-l4"><a class="reference internal" href="accounting.storage.html#module-accounting.storage.ledgercli">accounting.storage.ledgercli module</a></li>
 
<li class="toctree-l4"><a class="reference internal" href="accounting.storage.html#module-accounting.storage">Module contents</a></li>
 
</ul>
 
</li>
 
</ul>
 
</li>
 
<li class="toctree-l2"><a class="reference internal" href="accounting.html#submodules">Submodules</a></li>
 
<li class="toctree-l2"><a class="reference internal" href="accounting.html#module-accounting.client">accounting.client module</a></li>
 
<li class="toctree-l2"><a class="reference internal" href="accounting.html#module-accounting.config">accounting.config module</a></li>
 
<li class="toctree-l2"><a class="reference internal" href="accounting.html#module-accounting.decorators">accounting.decorators module</a></li>
 
<li class="toctree-l2"><a class="reference internal" href="accounting.html#module-accounting.exceptions">accounting.exceptions module</a></li>
 
<li class="toctree-l2"><a class="reference internal" href="accounting.html#module-accounting.gtkclient">accounting.gtkclient module</a></li>
 
<li class="toctree-l2"><a class="reference internal" href="accounting.html#module-accounting.models">accounting.models module</a></li>
 
<li class="toctree-l2"><a class="reference internal" href="accounting.html#module-accounting.transport">accounting.transport module</a></li>
 
<li class="toctree-l2"><a class="reference internal" href="accounting.html#module-accounting.web">accounting.web module</a></li>
 
<li class="toctree-l2"><a class="reference internal" href="accounting.html#module-accounting">Module contents</a></li>
 
</ul>
 
</li>
 
</ul>
 
</div>
 
</div>
 

	
 

	
 
          </div>
 
        </div>
 
      </div>
 
      <div class="sphinxsidebar">
 
        <div class="sphinxsidebarwrapper">
 
  <h3>This Page</h3>
 
  <ul class="this-page-menu">
 
    <li><a href="../_sources/api/modules.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><a href="../index.html">Accounting API 0.1-beta documentation</a> &raquo;</li> 
 
      </ul>
 
    </div>
 
    <div class="footer">
 
        &copy; Copyright 2013, Joar Wandborg.
 
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.
 
    </div>
 
  </body>
 
</html>
...
 
\ No newline at end of file
doc/build/html/genindex.html
Show inline comments
 
new file 100644
 

	
 
<!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>Index &mdash; Accounting API 0.1-beta 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:     '0.1-beta',
 
        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>
 
    <link rel="top" title="Accounting API 0.1-beta documentation" href="index.html" /> 
 
  </head>
 
  <body>
 
    <div class="related">
 
      <h3>Navigation</h3>
 
      <ul>
 
        <li class="right" style="margin-right: 10px">
 
          <a href="#" title="General Index"
 
             accesskey="I">index</a></li>
 
        <li class="right" >
 
          <a href="py-modindex.html" title="Python Module Index"
 
             >modules</a> |</li>
 
        <li><a href="index.html">Accounting API 0.1-beta documentation</a> &raquo;</li> 
 
      </ul>
 
    </div>  
 

	
 
    <div class="document">
 
      <div class="documentwrapper">
 
        <div class="bodywrapper">
 
          <div class="body">
 
            
 

	
 
<h1 id="index">Index</h1>
 

	
 
<div class="genindex-jumpbox">
 
 <a href="#A"><strong>A</strong></a>
 
 | <a href="#B"><strong>B</strong></a>
 
 | <a href="#C"><strong>C</strong></a>
 
 | <a href="#D"><strong>D</strong></a>
 
 | <a href="#G"><strong>G</strong></a>
 
 | <a href="#I"><strong>I</strong></a>
 
 | <a href="#J"><strong>J</strong></a>
 
 | <a href="#L"><strong>L</strong></a>
 
 | <a href="#M"><strong>M</strong></a>
 
 | <a href="#O"><strong>O</strong></a>
 
 | <a href="#P"><strong>P</strong></a>
 
 | <a href="#R"><strong>R</strong></a>
 
 | <a href="#S"><strong>S</strong></a>
 
 | <a href="#T"><strong>T</strong></a>
 
 | <a href="#U"><strong>U</strong></a>
 
 
 
</div>
 
<h2 id="A">A</h2>
 
<table style="width: 100%" class="indextable genindextable"><tr>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.models.Posting.account">account (accounting.storage.sql.models.Posting attribute)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#accounting.models.Account">Account (class in accounting.models)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#module-accounting">accounting (module)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#module-accounting.client">accounting.client (module)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#module-accounting.config">accounting.config (module)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#module-accounting.decorators">accounting.decorators (module)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#module-accounting.exceptions">accounting.exceptions (module)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#module-accounting.gtkclient">accounting.gtkclient (module)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#module-accounting.models">accounting.models (module)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.storage.html#module-accounting.storage">accounting.storage (module)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.storage.html#module-accounting.storage.ledgercli">accounting.storage.ledgercli (module)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.storage.sql.html#module-accounting.storage.sql">accounting.storage.sql (module)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.storage.sql.html#module-accounting.storage.sql.models">accounting.storage.sql.models (module)</a>
 
  </dt>
 

	
 
  </dl></td>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.html#module-accounting.transport">accounting.transport (module)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#module-accounting.web">accounting.web (module)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#accounting.gtkclient.AccountingApplication">AccountingApplication (class in accounting.gtkclient)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#accounting.transport.AccountingDecoder">AccountingDecoder (class in accounting.transport)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#accounting.transport.AccountingEncoder">AccountingEncoder (class in accounting.transport)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#accounting.exceptions.AccountingException">AccountingException</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.storage.html#accounting.storage.ledgercli.Ledger.add_transaction">add_transaction() (accounting.storage.ledgercli.Ledger method)</a>
 
  </dt>
 

	
 
      <dd><dl>
 
        
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.SQLStorage.add_transaction">(accounting.storage.sql.SQLStorage method)</a>
 
  </dt>
 

	
 
      </dl></dd>
 
      
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.models.Amount.amount">amount (accounting.storage.sql.models.Amount attribute)</a>
 
  </dt>
 

	
 
      <dd><dl>
 
        
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.models.Posting.amount">(accounting.storage.sql.models.Posting attribute)</a>
 
  </dt>
 

	
 
      </dl></dd>
 
      
 
  <dt><a href="api/accounting.html#accounting.models.Amount">Amount (class in accounting.models)</a>
 
  </dt>
 

	
 
      <dd><dl>
 
        
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.models.Amount">(class in accounting.storage.sql.models)</a>
 
  </dt>
 

	
 
      </dl></dd>
 
      
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.models.Posting.amount_id">amount_id (accounting.storage.sql.models.Posting attribute)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.models.Amount.as_dict">as_dict() (accounting.storage.sql.models.Amount method)</a>
 
  </dt>
 

	
 
      <dd><dl>
 
        
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.models.Posting.as_dict">(accounting.storage.sql.models.Posting method)</a>
 
  </dt>
 

	
 
        
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.models.Transaction.as_dict">(accounting.storage.sql.models.Transaction method)</a>
 
  </dt>
 

	
 
      </dl></dd>
 
      
 
  <dt><a href="api/accounting.storage.html#accounting.storage.ledgercli.Ledger.assemble_arguments">assemble_arguments() (accounting.storage.ledgercli.Ledger method)</a>
 
  </dt>
 

	
 
  </dl></td>
 
</tr></table>
 

	
 
<h2 id="B">B</h2>
 
<table style="width: 100%" class="indextable genindextable"><tr>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.storage.html#accounting.storage.ledgercli.Ledger.bal">bal() (accounting.storage.ledgercli.Ledger method)</a>
 
  </dt>
 

	
 
  </dl></td>
 
</tr></table>
 

	
 
<h2 id="C">C</h2>
 
<table style="width: 100%" class="indextable genindextable"><tr>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.html#accounting.client.Client">Client (class in accounting.client)</a>
 
  </dt>
 

	
 
  </dl></td>
 
</tr></table>
 

	
 
<h2 id="D">D</h2>
 
<table style="width: 100%" class="indextable genindextable"><tr>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.models.Transaction.date">date (accounting.storage.sql.models.Transaction attribute)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#accounting.transport.AccountingEncoder.default">default() (accounting.transport.AccountingEncoder method)</a>
 
  </dt>
 

	
 
  </dl></td>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.html#accounting.transport.AccountingDecoder.dict_to_object">dict_to_object() (accounting.transport.AccountingDecoder method)</a>
 
  </dt>
 

	
 
  </dl></td>
 
</tr></table>
 

	
 
<h2 id="G">G</h2>
 
<table style="width: 100%" class="indextable genindextable"><tr>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.html#accounting.models.Transaction.generate_id">generate_id() (accounting.models.Transaction method)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#accounting.client.Client.get">get() (accounting.client.Client method)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.storage.html#accounting.storage.Storage.get_account">get_account() (accounting.storage.Storage method)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.storage.html#accounting.storage.Storage.get_accounts">get_accounts() (accounting.storage.Storage method)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#accounting.client.Client.get_balance">get_balance() (accounting.client.Client method)</a>
 
  </dt>
 

	
 
  </dl></td>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.storage.html#accounting.storage.ledgercli.Ledger.get_process">get_process() (accounting.storage.ledgercli.Ledger method)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#accounting.client.Client.get_register">get_register() (accounting.client.Client method)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.storage.html#accounting.storage.Storage.get_transaction">get_transaction() (accounting.storage.Storage method)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.storage.html#accounting.storage.ledgercli.Ledger.get_transactions">get_transactions() (accounting.storage.ledgercli.Ledger method)</a>
 
  </dt>
 

	
 
      <dd><dl>
 
        
 
  <dt><a href="api/accounting.storage.html#accounting.storage.Storage.get_transactions">(accounting.storage.Storage method)</a>
 
  </dt>
 

	
 
        
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.SQLStorage.get_transactions">(accounting.storage.sql.SQLStorage method)</a>
 
  </dt>
 

	
 
      </dl></dd>
 
  </dl></td>
 
</tr></table>
 

	
 
<h2 id="I">I</h2>
 
<table style="width: 100%" class="indextable genindextable"><tr>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.models.Amount.id">id (accounting.storage.sql.models.Amount attribute)</a>
 
  </dt>
 

	
 
      <dd><dl>
 
        
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.models.Posting.id">(accounting.storage.sql.models.Posting attribute)</a>
 
  </dt>
 

	
 
        
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.models.Transaction.id">(accounting.storage.sql.models.Transaction attribute)</a>
 
  </dt>
 

	
 
      </dl></dd>
 
      
 
  <dt><a href="api/accounting.html#accounting.web.index">index() (in module accounting.web)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#accounting.gtkclient.indicate_activity">indicate_activity() (in module accounting.gtkclient)</a>
 
  </dt>
 

	
 
  </dl></td>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.html#accounting.gtkclient.indicate_activity_done">indicate_activity_done() (in module accounting.gtkclient)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#accounting.web.init_ledger">init_ledger() (in module accounting.web)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.storage.html#accounting.storage.ledgercli.Ledger.init_process">init_process() (accounting.storage.ledgercli.Ledger method)</a>
 
  </dt>
 

	
 
  </dl></td>
 
</tr></table>
 

	
 
<h2 id="J">J</h2>
 
<table style="width: 100%" class="indextable genindextable"><tr>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.html#accounting.decorators.jsonify_exceptions">jsonify_exceptions() (in module accounting.decorators)</a>
 
  </dt>
 

	
 
  </dl></td>
 
</tr></table>
 

	
 
<h2 id="L">L</h2>
 
<table style="width: 100%" class="indextable genindextable"><tr>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.storage.html#accounting.storage.ledgercli.Ledger">Ledger (class in accounting.storage.ledgercli)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#accounting.gtkclient.AccountingApplication.load_ui">load_ui() (accounting.gtkclient.AccountingApplication method)</a>
 
  </dt>
 

	
 
  </dl></td>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.storage.html#accounting.storage.ledgercli.Ledger.locked_process">locked_process() (accounting.storage.ledgercli.Ledger method)</a>
 
  </dt>
 

	
 
  </dl></td>
 
</tr></table>
 

	
 
<h2 id="M">M</h2>
 
<table style="width: 100%" class="indextable genindextable"><tr>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.html#accounting.client.main">main() (in module accounting.client)</a>
 
  </dt>
 

	
 
      <dd><dl>
 
        
 
  <dt><a href="api/accounting.html#accounting.gtkclient.main">(in module accounting.gtkclient)</a>
 
  </dt>
 

	
 
        
 
  <dt><a href="api/accounting.storage.html#accounting.storage.ledgercli.main">(in module accounting.storage.ledgercli)</a>
 
  </dt>
 

	
 
        
 
  <dt><a href="api/accounting.html#accounting.web.main">(in module accounting.web)</a>
 
  </dt>
 

	
 
      </dl></dd>
 
  </dl></td>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.models.Posting.meta">meta (accounting.storage.sql.models.Posting attribute)</a>
 
  </dt>
 

	
 
      <dd><dl>
 
        
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.models.Transaction.meta">(accounting.storage.sql.models.Transaction attribute)</a>
 
  </dt>
 

	
 
      </dl></dd>
 
  </dl></td>
 
</tr></table>
 

	
 
<h2 id="O">O</h2>
 
<table style="width: 100%" class="indextable genindextable"><tr>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.html#accounting.gtkclient.AccountingApplication.on_aboutdialog_close">on_aboutdialog_close() (accounting.gtkclient.AccountingApplication method)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#accounting.gtkclient.AccountingApplication.on_refresh_transactions_activate">on_refresh_transactions_activate() (accounting.gtkclient.AccountingApplication method)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#accounting.gtkclient.AccountingApplication.on_show_about_activate">on_show_about_activate() (accounting.gtkclient.AccountingApplication method)</a>
 
  </dt>
 

	
 
  </dl></td>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.html#accounting.gtkclient.AccountingApplication.on_transaction_selected">on_transaction_selected() (accounting.gtkclient.AccountingApplication method)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#accounting.gtkclient.AccountingApplication.on_transactions_loaded">on_transactions_loaded() (accounting.gtkclient.AccountingApplication method)</a>
 
  </dt>
 

	
 
  </dl></td>
 
</tr></table>
 

	
 
<h2 id="P">P</h2>
 
<table style="width: 100%" class="indextable genindextable"><tr>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.models.Transaction.payee">payee (accounting.storage.sql.models.Transaction attribute)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#accounting.client.Client.post">post() (accounting.client.Client method)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#accounting.models.Posting">Posting (class in accounting.models)</a>
 
  </dt>
 

	
 
      <dd><dl>
 
        
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.models.Posting">(class in accounting.storage.sql.models)</a>
 
  </dt>
 

	
 
      </dl></dd>
 
  </dl></td>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.html#accounting.client.print_balance_accounts">print_balance_accounts() (in module accounting.client)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#accounting.client.print_transactions">print_transactions() (in module accounting.client)</a>
 
  </dt>
 

	
 
  </dl></td>
 
</tr></table>
 

	
 
<h2 id="R">R</h2>
 
<table style="width: 100%" class="indextable genindextable"><tr>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.storage.html#accounting.storage.ledgercli.Ledger.read_until_prompt">read_until_prompt() (accounting.storage.ledgercli.Ledger method)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.storage.html#accounting.storage.ledgercli.Ledger.reg">reg() (accounting.storage.ledgercli.Ledger method)</a>
 
  </dt>
 

	
 
  </dl></td>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.storage.html#accounting.storage.Storage.reverse_transaction">reverse_transaction() (accounting.storage.Storage method)</a>
 
  </dt>
 

	
 
  </dl></td>
 
</tr></table>
 

	
 
<h2 id="S">S</h2>
 
<table style="width: 100%" class="indextable genindextable"><tr>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.storage.html#accounting.storage.ledgercli.Ledger.send_command">send_command() (accounting.storage.ledgercli.Ledger method)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#accounting.client.Client.simple_transaction">simple_transaction() (accounting.client.Client method)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.SQLStorage">SQLStorage (class in accounting.storage.sql)</a>
 
  </dt>
 

	
 
  </dl></td>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.storage.html#accounting.storage.Storage">Storage (class in accounting.storage)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.models.Amount.symbol">symbol (accounting.storage.sql.models.Amount attribute)</a>
 
  </dt>
 

	
 
  </dl></td>
 
</tr></table>
 

	
 
<h2 id="T">T</h2>
 
<table style="width: 100%" class="indextable genindextable"><tr>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.models.Posting.transaction">transaction (accounting.storage.sql.models.Posting attribute)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#accounting.models.Transaction">Transaction (class in accounting.models)</a>
 
  </dt>
 

	
 
      <dd><dl>
 
        
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.models.Transaction">(class in accounting.storage.sql.models)</a>
 
  </dt>
 

	
 
      </dl></dd>
 
      
 
  <dt><a href="api/accounting.html#accounting.web.transaction_get">transaction_get() (in module accounting.web)</a>
 
  </dt>
 

	
 
  </dl></td>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.html#accounting.web.transaction_post">transaction_post() (in module accounting.web)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.html#accounting.web.transaction_update">transaction_update() (in module accounting.web)</a>
 
  </dt>
 

	
 
      
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.models.Posting.transaction_uuid">transaction_uuid (accounting.storage.sql.models.Posting attribute)</a>
 
  </dt>
 

	
 
  </dl></td>
 
</tr></table>
 

	
 
<h2 id="U">U</h2>
 
<table style="width: 100%" class="indextable genindextable"><tr>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.storage.html#accounting.storage.ledgercli.Ledger.update_transaction">update_transaction() (accounting.storage.ledgercli.Ledger method)</a>
 
  </dt>
 

	
 
      <dd><dl>
 
        
 
  <dt><a href="api/accounting.storage.html#accounting.storage.Storage.update_transaction">(accounting.storage.Storage method)</a>
 
  </dt>
 

	
 
        
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.SQLStorage.update_transaction">(accounting.storage.sql.SQLStorage method)</a>
 
  </dt>
 

	
 
      </dl></dd>
 
  </dl></td>
 
  <td style="width: 33%" valign="top"><dl>
 
      
 
  <dt><a href="api/accounting.storage.sql.html#accounting.storage.sql.models.Transaction.uuid">uuid (accounting.storage.sql.models.Transaction attribute)</a>
 
  </dt>
 

	
 
  </dl></td>
 
</tr></table>
 

	
 

	
 

	
 
          </div>
 
        </div>
 
      </div>
 
      <div class="sphinxsidebar">
 
        <div class="sphinxsidebarwrapper">
 

	
 
   
 

	
 
<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="#" title="General Index"
 
             >index</a></li>
 
        <li class="right" >
 
          <a href="py-modindex.html" title="Python Module Index"
 
             >modules</a> |</li>
 
        <li><a href="index.html">Accounting API 0.1-beta documentation</a> &raquo;</li> 
 
      </ul>
 
    </div>
 
    <div class="footer">
 
        &copy; Copyright 2013, Joar Wandborg.
 
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.
 
    </div>
 
  </body>
 
</html>
...
 
\ No newline at end of file
doc/build/html/index.html
Show inline comments
 
new file 100644
 
<!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>Welcome to Accounting API’s documentation! &mdash; Accounting API 0.1-beta 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:     '0.1-beta',
 
        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>
 
    <link rel="top" title="Accounting API 0.1-beta documentation" href="#" />
 
    <link rel="next" title="accounting package" href="api/accounting.html" /> 
 
  </head>
 
  <body>
 
    <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="api/accounting.html" title="accounting package"
 
             accesskey="N">next</a> |</li>
 
        <li><a href="#">Accounting API 0.1-beta documentation</a> &raquo;</li> 
 
      </ul>
 
    </div>  
 

	
 
    <div class="document">
 
      <div class="documentwrapper">
 
        <div class="bodywrapper">
 
          <div class="body">
 
            
 
  <div class="section" id="welcome-to-accounting-api-s-documentation">
 
<h1>Welcome to Accounting API&#8217;s documentation!<a class="headerlink" href="#welcome-to-accounting-api-s-documentation" title="Permalink to this headline">¶</a></h1>
 
<p>Contents:</p>
 
<div class="toctree-wrapper compound">
 
<ul>
 
<li class="toctree-l1"><a class="reference internal" href="api/accounting.html">accounting package</a><ul>
 
<li class="toctree-l2"><a class="reference internal" href="api/accounting.html#subpackages">Subpackages</a></li>
 
<li class="toctree-l2"><a class="reference internal" href="api/accounting.html#submodules">Submodules</a></li>
 
<li class="toctree-l2"><a class="reference internal" href="api/accounting.html#module-accounting.client">accounting.client module</a></li>
 
<li class="toctree-l2"><a class="reference internal" href="api/accounting.html#module-accounting.config">accounting.config module</a></li>
 
<li class="toctree-l2"><a class="reference internal" href="api/accounting.html#module-accounting.decorators">accounting.decorators module</a></li>
 
<li class="toctree-l2"><a class="reference internal" href="api/accounting.html#module-accounting.exceptions">accounting.exceptions module</a></li>
 
<li class="toctree-l2"><a class="reference internal" href="api/accounting.html#module-accounting.gtkclient">accounting.gtkclient module</a></li>
 
<li class="toctree-l2"><a class="reference internal" href="api/accounting.html#module-accounting.models">accounting.models module</a></li>
 
<li class="toctree-l2"><a class="reference internal" href="api/accounting.html#module-accounting.transport">accounting.transport module</a></li>
 
<li class="toctree-l2"><a class="reference internal" href="api/accounting.html#module-accounting.web">accounting.web module</a></li>
 
<li class="toctree-l2"><a class="reference internal" href="api/accounting.html#module-accounting">Module contents</a></li>
 
</ul>
 
</li>
 
</ul>
 
</div>
 
</div>
 
<div class="section" id="indices-and-tables">
 
<h1>Indices and tables<a class="headerlink" href="#indices-and-tables" title="Permalink to this headline">¶</a></h1>
 
<ul class="simple">
 
<li><a class="reference internal" href="genindex.html"><em>Index</em></a></li>
 
<li><a class="reference internal" href="py-modindex.html"><em>Module Index</em></a></li>
 
<li><a class="reference internal" href="search.html"><em>Search Page</em></a></li>
 
</ul>
 
</div>
 

	
 

	
 
          </div>
 
        </div>
 
      </div>
 
      <div class="sphinxsidebar">
 
        <div class="sphinxsidebarwrapper">
 
  <h3><a href="#">Table Of Contents</a></h3>
 
  <ul>
 
<li><a class="reference internal" href="#">Welcome to Accounting API&#8217;s documentation!</a><ul>
 
</ul>
 
</li>
 
<li><a class="reference internal" href="#indices-and-tables">Indices and tables</a></li>
 
</ul>
 

	
 
  <h4>Next topic</h4>
 
  <p class="topless"><a href="api/accounting.html"
 
                        title="next chapter">accounting package</a></p>
 
  <h3>This Page</h3>
 
  <ul class="this-page-menu">
 
    <li><a href="_sources/index.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="api/accounting.html" title="accounting package"
 
             >next</a> |</li>
 
        <li><a href="#">Accounting API 0.1-beta documentation</a> &raquo;</li> 
 
      </ul>
 
    </div>
 
    <div class="footer">
 
        &copy; Copyright 2013, Joar Wandborg.
 
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.
 
    </div>
 
  </body>
 
</html>
...
 
\ No newline at end of file
doc/build/html/objects.inv
Show inline comments
 
new file 100644
 
binary diff not shown
doc/build/html/py-modindex.html
Show inline comments
 
new file 100644
 
<!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 Module Index &mdash; Accounting API 0.1-beta 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:     '0.1-beta',
 
        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>
 
    <link rel="top" title="Accounting API 0.1-beta documentation" href="index.html" />
 
 
 

	
 

	
 
  </head>
 
  <body>
 
    <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="#" title="Python Module Index"
 
             >modules</a> |</li>
 
        <li><a href="index.html">Accounting API 0.1-beta documentation</a> &raquo;</li> 
 
      </ul>
 
    </div>  
 

	
 
    <div class="document">
 
      <div class="documentwrapper">
 
        <div class="bodywrapper">
 
          <div class="body">
 
            
 

	
 
   <h1>Python Module Index</h1>
 

	
 
   <div class="modindex-jumpbox">
 
   <a href="#cap-a"><strong>a</strong></a>
 
   </div>
 

	
 
   <table class="indextable modindextable" cellspacing="0" cellpadding="2">
 
     <tr class="pcap"><td></td><td>&nbsp;</td><td></td></tr>
 
     <tr class="cap" id="cap-a"><td></td><td>
 
       <strong>a</strong></td><td></td></tr>
 
     <tr>
 
       <td><img src="_static/minus.png" class="toggler"
 
              id="toggle-1" style="display: none" alt="-" /></td>
 
       <td>
 
       <a href="api/accounting.html#module-accounting"><tt class="xref">accounting</tt></a></td><td>
 
       <em></em></td></tr>
 
     <tr class="cg-1">
 
       <td></td>
 
       <td>&nbsp;&nbsp;&nbsp;
 
       <a href="api/accounting.html#module-accounting.client"><tt class="xref">accounting.client</tt></a></td><td>
 
       <em></em></td></tr>
 
     <tr class="cg-1">
 
       <td></td>
 
       <td>&nbsp;&nbsp;&nbsp;
 
       <a href="api/accounting.html#module-accounting.config"><tt class="xref">accounting.config</tt></a></td><td>
 
       <em></em></td></tr>
 
     <tr class="cg-1">
 
       <td></td>
 
       <td>&nbsp;&nbsp;&nbsp;
 
       <a href="api/accounting.html#module-accounting.decorators"><tt class="xref">accounting.decorators</tt></a></td><td>
 
       <em></em></td></tr>
 
     <tr class="cg-1">
 
       <td></td>
 
       <td>&nbsp;&nbsp;&nbsp;
 
       <a href="api/accounting.html#module-accounting.exceptions"><tt class="xref">accounting.exceptions</tt></a></td><td>
 
       <em></em></td></tr>
 
     <tr class="cg-1">
 
       <td></td>
 
       <td>&nbsp;&nbsp;&nbsp;
 
       <a href="api/accounting.html#module-accounting.gtkclient"><tt class="xref">accounting.gtkclient</tt></a></td><td>
 
       <em></em></td></tr>
 
     <tr class="cg-1">
 
       <td></td>
 
       <td>&nbsp;&nbsp;&nbsp;
 
       <a href="api/accounting.html#module-accounting.models"><tt class="xref">accounting.models</tt></a></td><td>
 
       <em></em></td></tr>
 
     <tr class="cg-1">
 
       <td></td>
 
       <td>&nbsp;&nbsp;&nbsp;
 
       <a href="api/accounting.storage.html#module-accounting.storage"><tt class="xref">accounting.storage</tt></a></td><td>
 
       <em></em></td></tr>
 
     <tr class="cg-1">
 
       <td></td>
 
       <td>&nbsp;&nbsp;&nbsp;
 
       <a href="api/accounting.storage.html#module-accounting.storage.ledgercli"><tt class="xref">accounting.storage.ledgercli</tt></a></td><td>
 
       <em></em></td></tr>
 
     <tr class="cg-1">
 
       <td></td>
 
       <td>&nbsp;&nbsp;&nbsp;
 
       <a href="api/accounting.storage.sql.html#module-accounting.storage.sql"><tt class="xref">accounting.storage.sql</tt></a></td><td>
 
       <em></em></td></tr>
 
     <tr class="cg-1">
 
       <td></td>
 
       <td>&nbsp;&nbsp;&nbsp;
 
       <a href="api/accounting.storage.sql.html#module-accounting.storage.sql.models"><tt class="xref">accounting.storage.sql.models</tt></a></td><td>
 
       <em></em></td></tr>
 
     <tr class="cg-1">
 
       <td></td>
 
       <td>&nbsp;&nbsp;&nbsp;
 
       <a href="api/accounting.html#module-accounting.transport"><tt class="xref">accounting.transport</tt></a></td><td>
 
       <em></em></td></tr>
 
     <tr class="cg-1">
 
       <td></td>
 
       <td>&nbsp;&nbsp;&nbsp;
 
       <a href="api/accounting.html#module-accounting.web"><tt class="xref">accounting.web</tt></a></td><td>
 
       <em></em></td></tr>
 
   </table>
 

	
 

	
 
          </div>
 
        </div>
 
      </div>
 
      <div class="sphinxsidebar">
 
        <div class="sphinxsidebarwrapper">
 
<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="#" title="Python Module Index"
 
             >modules</a> |</li>
 
        <li><a href="index.html">Accounting API 0.1-beta documentation</a> &raquo;</li> 
 
      </ul>
 
    </div>
 
    <div class="footer">
 
        &copy; Copyright 2013, Joar Wandborg.
 
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.
 
    </div>
 
  </body>
 
</html>
...
 
\ No newline at end of file
doc/build/html/search.html
Show inline comments
 
new file 100644
 
<!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>Search &mdash; Accounting API 0.1-beta 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:     '0.1-beta',
 
        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/searchtools.js"></script>
 
    <link rel="top" title="Accounting API 0.1-beta documentation" href="index.html" />
 
  <script type="text/javascript">
 
    jQuery(function() { Search.loadIndex("searchindex.js"); });
 
  </script>
 
  
 
  <script type="text/javascript" id="searchindexloader"></script>
 
   
 

	
 
  </head>
 
  <body>
 
    <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><a href="index.html">Accounting API 0.1-beta documentation</a> &raquo;</li> 
 
      </ul>
 
    </div>  
 

	
 
    <div class="document">
 
      <div class="documentwrapper">
 
        <div class="bodywrapper">
 
          <div class="body">
 
            
 
  <h1 id="search-documentation">Search</h1>
 
  <div id="fallback" class="admonition warning">
 
  <script type="text/javascript">$('#fallback').hide();</script>
 
  <p>
 
    Please activate JavaScript to enable the search
 
    functionality.
 
  </p>
 
  </div>
 
  <p>
 
    From here you can search these documents. Enter your search
 
    words into the box below and click "search". Note that the search
 
    function will automatically search for all of the words. Pages
 
    containing fewer words won't appear in the result list.
 
  </p>
 
  <form action="" method="get">
 
    <input type="text" name="q" value="" />
 
    <input type="submit" value="search" />
 
    <span id="search-progress" style="padding-left: 10px"></span>
 
  </form>
 
  
 
  <div id="search-results">
 
  
 
  </div>
 

	
 
          </div>
 
        </div>
 
      </div>
 
      <div class="sphinxsidebar">
 
        <div class="sphinxsidebarwrapper">
 
        </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><a href="index.html">Accounting API 0.1-beta documentation</a> &raquo;</li> 
 
      </ul>
 
    </div>
 
    <div class="footer">
 
        &copy; Copyright 2013, Joar Wandborg.
 
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.
 
    </div>
 
  </body>
 
</html>
...
 
\ No newline at end of file
doc/build/html/searchindex.js
Show inline comments
 
new file 100644
 
Search.setIndex({terms:{transaction_id:[4,3],skipkei:4,decod:[],get_transact:[2,3],init_ledg:4,locked_process:3,clariti:[],load_ui:4,on_show_about_activ:4,request:4,"true":[4,3],app:[2,3],reg:[4,3],donat:4,result:3,kwarg:2,high:4,content:[],sourc:[4,2,3],post:[4,2],until:3,sinc:3,set:3,before_request:4,index:[1,4],text:3,meta:2,write:[4,3],expens:[],init_process:3,"new":3,alreadi:3,read_until_prompt:3,setup:4,accountingexcept:4,recommend:3,separ:4,output:[4,3],execut:3,ledger:[4,3],unlock:3,"default":4,blah:[],name:4,get_account:3,command:3,to_acc:4,requir:4,contain:4,creat:3,amount_id:2,ensure_ascii:4,annot:4,run:3,accountingdecod:4,endpoint:4,flask:4,symbol:[4,2],sqlstorag:2,from:3,amount:[4,2],instanc:3,ani:4,argument:3,json:4,list:3,metadata:4,lock:3,http:[],storag:[],widget:4,get_bal:4,get_process:3,handl:3,as_dict:2,send_command:3,jsondecod:4,without:3,simple_transact:4,find:3,linebreak:[],subprocess:3,ledger_bin:3,json_encod:4,initi:4,"catch":4,uuid:2,"__type__":4,search:1,state:4,incom:4,"_generate_id":4,base:[4,2,3],logic:4,presum:3,evalu:3,world:4,page:1,ledger_fil:3,assemble_argu:3,ledgercli:[],func_or_str:4,contextmanag:3,generate_id:4,wget:[],jsonify_except:4,transaction_upd:4,transact:[4,2,3],read:3,"class":[4,2,3],accountingappl:4,json_decod:4,on_refresh_transactions_activ:4,update_transact:[2,3],prompt:3,version:[],dict_to_object:4,reverse_transact:3,self:3,contextlib:3,payload:4,take:4,yield:3,log:[],transaction_post:4,via:4,print_balance_account:4,wrap:4,exampl:[],on_transactions_load:4,object:[4,3],paye:[4,2],main:[4,3],file:[4,3],rest:4,pars:[],transaction_get:4,indent:4,discard:3,arg:[2,3],banner:3,caller:4,jsonencod:4,ledger_process:3,none:[4,2,3],host:4,sql:[],add_transact:[2,3],sort_kei:4,popen:3,argv:[4,3],register_report:[],hello:4,process:3,thi:[4,3],serial:4,applic:[],allow_nan:4,level:4,fals:4,suitabl:3,method:4,context:3,on_aboutdialog_clos:4,flask_sqlalchemi:2,"return":[4,3],donor:4,foo:4,mode:3,on_transaction_select:4,x20:3,prog:4,parse_json:[],karma:[],debug:[],statement:3,onc:3,func:4,webservic:4,when:3,from_acc:4,current:4,kindli:4,check_circular:4,abc:3,print_transact:4,manag:3,indicate_activity_don:4,asset:4,becom:4,combin:3,bal:3,should:3,transaction_uuid:2,get_regist:4,indicate_act:4,curl:[],which:[4,3],data:[],check:[4,3],path:4,date:[4,2],balance_report:[],get:4,stdin:3,open:3,type:[],balanc:[],accountingencod:4,builtin:[4,3]},envversion:43,titleterms:{subpackag:[4,3],model:[4,2],document:1,api:1,asyncio:[],transport:4,decor:4,except:4,gtkclient:4,config:4,tabl:1,indic:1,sql:2,account:[0,1,2,3,4],client:4,storag:[2,3],submodul:[4,2,3],ledgercli:3,content:[4,2,3],titl:[],test:[],packag:[4,2,3],modul:[4,2,3],web:4,welcom:1},objects:{"":{accounting:[4,0,0,"-"]},"accounting.storage.sql":{models:[2,0,0,"-"],SQLStorage:[2,5,1,""]},"accounting.storage.Storage":{get_accounts:[3,2,1,""],get_account:[3,2,1,""],get_transaction:[3,2,1,""],update_transaction:[3,2,1,""],reverse_transaction:[3,2,1,""],get_transactions:[3,2,1,""]},"accounting.storage.ledgercli":{main:[3,3,1,""],Ledger:[3,5,1,""]},"accounting.models":{Posting:[4,5,1,""],Transaction:[4,5,1,""],Account:[4,5,1,""],Amount:[4,5,1,""]},"accounting.storage.sql.models":{Posting:[2,5,1,""],Transaction:[2,5,1,""],Amount:[2,5,1,""]},"accounting.models.Transaction":{generate_id:[4,2,1,""]},"accounting.storage.sql.models.Posting":{amount_id:[2,1,1,""],as_dict:[2,2,1,""],transaction:[2,1,1,""],transaction_uuid:[2,1,1,""],id:[2,1,1,""],meta:[2,1,1,""],account:[2,1,1,""],amount:[2,1,1,""]},"accounting.gtkclient":{indicate_activity_done:[4,3,1,""],AccountingApplication:[4,5,1,""],main:[4,3,1,""],indicate_activity:[4,3,1,""]},"accounting.transport.AccountingDecoder":{dict_to_object:[4,2,1,""]},"accounting.storage.sql.models.Amount":{as_dict:[2,2,1,""],amount:[2,1,1,""],id:[2,1,1,""],symbol:[2,1,1,""]},"accounting.transport":{AccountingDecoder:[4,5,1,""],AccountingEncoder:[4,5,1,""]},"accounting.gtkclient.AccountingApplication":{on_show_about_activate:[4,2,1,""],on_aboutdialog_close:[4,2,1,""],on_transaction_selected:[4,2,1,""],on_refresh_transactions_activate:[4,2,1,""],on_transactions_loaded:[4,2,1,""],load_ui:[4,2,1,""]},"accounting.storage":{Storage:[3,5,1,""],sql:[2,0,0,"-"],ledgercli:[3,0,0,"-"]},"accounting.transport.AccountingEncoder":{"default":[4,2,1,""]},"accounting.storage.sql.models.Transaction":{meta:[2,1,1,""],as_dict:[2,2,1,""],payee:[2,1,1,""],id:[2,1,1,""],uuid:[2,1,1,""],date:[2,1,1,""]},"accounting.storage.sql.SQLStorage":{get_transactions:[2,2,1,""],add_transaction:[2,2,1,""],update_transaction:[2,2,1,""]},accounting:{decorators:[4,0,0,"-"],config:[4,0,0,"-"],web:[4,0,0,"-"],gtkclient:[4,0,0,"-"],storage:[3,0,0,"-"],models:[4,0,0,"-"],exceptions:[4,0,0,"-"],client:[4,0,0,"-"],transport:[4,0,0,"-"]},"accounting.client.Client":{get:[4,2,1,""],get_balance:[4,2,1,""],post:[4,2,1,""],simple_transaction:[4,2,1,""],get_register:[4,2,1,""]},"accounting.web":{index:[4,3,1,""],transaction_update:[4,3,1,""],transaction_post:[4,3,1,""],init_ledger:[4,3,1,""],main:[4,3,1,""],transaction_get:[4,3,1,""]},"accounting.decorators":{jsonify_exceptions:[4,3,1,""]},"accounting.storage.ledgercli.Ledger":{reg:[3,2,1,""],init_process:[3,2,1,""],assemble_arguments:[3,2,1,""],add_transaction:[3,2,1,""],read_until_prompt:[3,2,1,""],update_transaction:[3,2,1,""],locked_process:[3,2,1,""],bal:[3,2,1,""],get_transactions:[3,2,1,""],get_process:[3,2,1,""],send_command:[3,2,1,""]},"accounting.exceptions":{AccountingException:[4,4,1,""]},"accounting.client":{main:[4,3,1,""],print_balance_accounts:[4,3,1,""],Client:[4,5,1,""],print_transactions:[4,3,1,""]}},filenames:["api/modules","index","api/accounting.storage.sql","api/accounting.storage","api/accounting"],titles:["accounting","Welcome to Accounting API&#8217;s documentation!","accounting.storage.sql package","accounting.storage package","accounting package"],objtypes:{"0":"py:module","1":"py:attribute","2":"py:method","3":"py:function","4":"py:exception","5":"py:class"},objnames:{"0":["py","module","Python module"],"1":["py","attribute","Python attribute"],"2":["py","method","Python method"],"3":["py","function","Python function"],"4":["py","exception","Python exception"],"5":["py","class","Python class"]}})
...
 
\ No newline at end of file
doc/source/api/accounting.rst
Show inline comments
...
 
@@ -40,12 +40,20 @@ accounting.exceptions module
 

	
 
.. automodule:: accounting.exceptions
 
    :members:
 
    :undoc-members:
 
    :show-inheritance:
 

	
 
accounting.gtkclient module
 
---------------------------
 

	
 
.. automodule:: accounting.gtkclient
 
    :members:
 
    :undoc-members:
 
    :show-inheritance:
 

	
 
accounting.models module
 
------------------------
 

	
 
.. automodule:: accounting.models
 
    :members:
 
    :undoc-members:
0 comments (0 inline, 0 general)