Generated files by make
							
								
								
									
										
											BIN
										
									
								
								doctrees/agi.doctree
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								doctrees/agitb.doctree
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								doctrees/changes.doctree
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								doctrees/config.doctree
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								doctrees/environment.pickle
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								doctrees/fastagi.doctree
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								doctrees/index.doctree
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								doctrees/manager.doctree
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								doctrees/readme.doctree
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										808
									
								
								html/_modules/asterisk/agi.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,808 @@
 | 
				
			|||||||
 | 
					<!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>asterisk.agi — pyst2 0.4.9 documentation</title>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <link rel="stylesheet" href="../../_static/alabaster.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.4.9',
 | 
				
			||||||
 | 
					        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="pyst2 0.4.9 documentation" href="../../index.html" />
 | 
				
			||||||
 | 
					    <link rel="up" title="Module code" href="../index.html" />
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </head>
 | 
				
			||||||
 | 
					  <body role="document">  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div class="document">
 | 
				
			||||||
 | 
					      <div class="documentwrapper">
 | 
				
			||||||
 | 
					        <div class="bodywrapper">
 | 
				
			||||||
 | 
					          <div class="body" role="main">
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					  <h1>Source code for asterisk.agi</h1><div class="highlight"><pre>
 | 
				
			||||||
 | 
					<span></span><span class="ch">#!/usr/bin/env python2</span>
 | 
				
			||||||
 | 
					<span class="c1"># vim: set et sw=4:</span>
 | 
				
			||||||
 | 
					<span class="sd">"""</span>
 | 
				
			||||||
 | 
					<span class="sd">.. module:: agi</span>
 | 
				
			||||||
 | 
					<span class="sd">   :synopsis: This module contains functions and classes to implment AGI scripts in python. </span>
 | 
				
			||||||
 | 
					<span class="sd">   </span>
 | 
				
			||||||
 | 
					<span class="sd">pyvr</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">{'agi_callerid' : 'mars.putland.int',</span>
 | 
				
			||||||
 | 
					<span class="sd"> 'agi_channel'  : 'IAX[kputland@kputland]/119',</span>
 | 
				
			||||||
 | 
					<span class="sd"> 'agi_context'  : 'default',</span>
 | 
				
			||||||
 | 
					<span class="sd"> 'agi_dnid'     : '1000',</span>
 | 
				
			||||||
 | 
					<span class="sd"> 'agi_enhanced' : '0.0',</span>
 | 
				
			||||||
 | 
					<span class="sd"> 'agi_extension': '1000',</span>
 | 
				
			||||||
 | 
					<span class="sd"> 'agi_language' : 'en',</span>
 | 
				
			||||||
 | 
					<span class="sd"> 'agi_priority' : '1',</span>
 | 
				
			||||||
 | 
					<span class="sd"> 'agi_rdnis'    : '',</span>
 | 
				
			||||||
 | 
					<span class="sd"> 'agi_request'  : 'pyst',</span>
 | 
				
			||||||
 | 
					<span class="sd"> 'agi_type'     : 'IAX'}</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">Specification</span>
 | 
				
			||||||
 | 
					<span class="sd">-------------</span>
 | 
				
			||||||
 | 
					<span class="sd">"""</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="kn">import</span> <span class="nn">sys</span>
 | 
				
			||||||
 | 
					<span class="kn">import</span> <span class="nn">pprint</span>
 | 
				
			||||||
 | 
					<span class="kn">import</span> <span class="nn">re</span>
 | 
				
			||||||
 | 
					<span class="kn">import</span> <span class="nn">signal</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="n">DEFAULT_TIMEOUT</span> <span class="o">=</span> <span class="mi">2000</span>  <span class="c1"># 2sec timeout used as default for functions that take timeouts</span>
 | 
				
			||||||
 | 
					<span class="n">DEFAULT_RECORD</span> <span class="o">=</span> <span class="mi">20000</span>  <span class="c1"># 20sec record time</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="n">re_code</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">r'(^\d*)\s*(.*)'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					<span class="n">re_kv</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">r'(?P<key>\w+)=(?P<value>[^\s]+)\s*(?:\((?P<data>.*)\))*'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="k">class</span> <span class="nc">AGIException</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
 | 
				
			||||||
 | 
					    <span class="k">pass</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="k">class</span> <span class="nc">AGIError</span><span class="p">(</span><span class="n">AGIException</span><span class="p">):</span>
 | 
				
			||||||
 | 
					    <span class="k">pass</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="k">class</span> <span class="nc">AGIUnknownError</span><span class="p">(</span><span class="n">AGIError</span><span class="p">):</span>
 | 
				
			||||||
 | 
					    <span class="k">pass</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="k">class</span> <span class="nc">AGIAppError</span><span class="p">(</span><span class="n">AGIError</span><span class="p">):</span>
 | 
				
			||||||
 | 
					    <span class="k">pass</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="c1"># there are several different types of hangups we can detect</span>
 | 
				
			||||||
 | 
					<span class="c1"># they all are derrived from AGIHangup</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="k">class</span> <span class="nc">AGIHangup</span><span class="p">(</span><span class="n">AGIAppError</span><span class="p">):</span>
 | 
				
			||||||
 | 
					    <span class="k">pass</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="k">class</span> <span class="nc">AGISIGHUPHangup</span><span class="p">(</span><span class="n">AGIHangup</span><span class="p">):</span>
 | 
				
			||||||
 | 
					    <span class="k">pass</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="k">class</span> <span class="nc">AGISIGPIPEHangup</span><span class="p">(</span><span class="n">AGIHangup</span><span class="p">):</span>
 | 
				
			||||||
 | 
					    <span class="k">pass</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="k">class</span> <span class="nc">AGIResultHangup</span><span class="p">(</span><span class="n">AGIHangup</span><span class="p">):</span>
 | 
				
			||||||
 | 
					    <span class="k">pass</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="k">class</span> <span class="nc">AGIDBError</span><span class="p">(</span><span class="n">AGIAppError</span><span class="p">):</span>
 | 
				
			||||||
 | 
					    <span class="k">pass</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="k">class</span> <span class="nc">AGIUsageError</span><span class="p">(</span><span class="n">AGIError</span><span class="p">):</span>
 | 
				
			||||||
 | 
					    <span class="k">pass</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="k">class</span> <span class="nc">AGIInvalidCommand</span><span class="p">(</span><span class="n">AGIError</span><span class="p">):</span>
 | 
				
			||||||
 | 
					    <span class="k">pass</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI">[docs]</a><span class="k">class</span> <span class="nc">AGI</span><span class="p">:</span>
 | 
				
			||||||
 | 
					    <span class="sd">"""</span>
 | 
				
			||||||
 | 
					<span class="sd">    This class encapsulates communication between Asterisk an a python script.</span>
 | 
				
			||||||
 | 
					<span class="sd">    It handles encoding commands to Asterisk and parsing responses from</span>
 | 
				
			||||||
 | 
					<span class="sd">    Asterisk.</span>
 | 
				
			||||||
 | 
					<span class="sd">    """</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">stdin</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stdin</span><span class="p">,</span> <span class="n">stdout</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="p">,</span> <span class="n">stderr</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">stdin</span> <span class="o">=</span> <span class="n">stdin</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="n">stdout</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">stderr</span> <span class="o">=</span> <span class="n">stderr</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">_got_sighup</span> <span class="o">=</span> <span class="bp">False</span>
 | 
				
			||||||
 | 
					        <span class="n">signal</span><span class="o">.</span><span class="n">signal</span><span class="p">(</span><span class="n">signal</span><span class="o">.</span><span class="n">SIGHUP</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handle_sighup</span><span class="p">)</span>  <span class="c1"># handle SIGHUP</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'ARGS: '</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">))</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">env</span> <span class="o">=</span> <span class="p">{}</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">_get_agi_env</span><span class="p">()</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">_get_agi_env</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="k">while</span> <span class="mi">1</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">line</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
 | 
				
			||||||
 | 
					            <span class="bp">self</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'ENV LINE: '</span><span class="p">)</span>
 | 
				
			||||||
 | 
					            <span class="bp">self</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
 | 
				
			||||||
 | 
					            <span class="bp">self</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					            <span class="k">if</span> <span class="n">line</span> <span class="o">==</span> <span class="s1">''</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="c1">#blank line signals end</span>
 | 
				
			||||||
 | 
					                <span class="k">break</span>
 | 
				
			||||||
 | 
					            <span class="n">key</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">':'</span><span class="p">)[</span><span class="mi">0</span><span class="p">],</span> <span class="s1">':'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">':'</span><span class="p">)[</span><span class="mi">1</span><span class="p">:])</span>
 | 
				
			||||||
 | 
					            <span class="n">key</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
 | 
				
			||||||
 | 
					            <span class="n">data</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
 | 
				
			||||||
 | 
					            <span class="k">if</span> <span class="n">key</span> <span class="o">!=</span> <span class="s1">''</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">data</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'class AGI: self.env = '</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">pprint</span><span class="o">.</span><span class="n">pformat</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">))</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">_quote</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">string</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">""" provides double quotes to string, converts int/bool to string """</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
 | 
				
			||||||
 | 
					          <span class="n">string</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="nb">float</span><span class="p">):</span>
 | 
				
			||||||
 | 
					          <span class="n">string</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="s1">''</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s1">'"'</span><span class="p">,</span> <span class="n">string</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">'ascii'</span><span class="p">,</span> <span class="s1">'ignore'</span><span class="p">),</span> <span class="s1">'"'</span><span class="p">])</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">_handle_sighup</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">signum</span><span class="p">,</span> <span class="n">frame</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Handle the SIGHUP signal"""</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">_got_sighup</span> <span class="o">=</span> <span class="bp">True</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.test_hangup"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.test_hangup">[docs]</a>    <span class="k">def</span> <span class="nf">test_hangup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""This function throws AGIHangup if we have recieved a SIGHUP"""</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_got_sighup</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">raise</span> <span class="n">AGISIGHUPHangup</span><span class="p">(</span><span class="s2">"Received SIGHUP from Asterisk"</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">execute</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="o">*</span><span class="n">args</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">test_hangup</span><span class="p">()</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="bp">self</span><span class="o">.</span><span class="n">send_command</span><span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span>
 | 
				
			||||||
 | 
					            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_result</span><span class="p">()</span>
 | 
				
			||||||
 | 
					        <span class="k">except</span> <span class="ne">IOError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">errno</span> <span class="o">==</span> <span class="mi">32</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="c1"># Broken Pipe * let us go</span>
 | 
				
			||||||
 | 
					                <span class="k">raise</span> <span class="n">AGISIGPIPEHangup</span><span class="p">(</span><span class="s2">"Received SIGPIPE"</span><span class="p">)</span>
 | 
				
			||||||
 | 
					            <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">raise</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.send_command"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.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="o">*</span><span class="n">args</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Send a command to Asterisk"""</span>
 | 
				
			||||||
 | 
					        <span class="n">command</span> <span class="o">=</span> <span class="n">command</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
 | 
				
			||||||
 | 
					        <span class="n">command</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="s1">' '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">args</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">strip</span><span class="p">()</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">command</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">command</span> <span class="o">+=</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'    COMMAND: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">command</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">command</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.get_result"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.get_result">[docs]</a>    <span class="k">def</span> <span class="nf">get_result</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stdin</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stdin</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Read the result of a command from Asterisk"""</span>
 | 
				
			||||||
 | 
					        <span class="n">code</span> <span class="o">=</span> <span class="mi">0</span>
 | 
				
			||||||
 | 
					        <span class="n">result</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'result'</span><span class="p">:</span> <span class="p">(</span><span class="s1">''</span><span class="p">,</span> <span class="s1">''</span><span class="p">)}</span>
 | 
				
			||||||
 | 
					        <span class="n">line</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'    RESULT_LINE: </span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span> <span class="n">line</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">m</span> <span class="o">=</span> <span class="n">re_code</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">m</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">code</span><span class="p">,</span> <span class="n">response</span> <span class="o">=</span> <span class="n">m</span><span class="o">.</span><span class="n">groups</span><span class="p">()</span>
 | 
				
			||||||
 | 
					            <span class="n">code</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">code</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">data</span> <span class="ow">in</span> <span class="n">re_kv</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">response</span><span class="p">):</span>
 | 
				
			||||||
 | 
					                <span class="n">result</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <span class="c1"># If user hangs up... we get 'hangup' in the data</span>
 | 
				
			||||||
 | 
					                <span class="k">if</span> <span class="n">data</span> <span class="o">==</span> <span class="s1">'hangup'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                    <span class="k">raise</span> <span class="n">AGIResultHangup</span><span class="p">(</span><span class="s2">"User hungup during execution"</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'result'</span> <span class="ow">and</span> <span class="n">value</span> <span class="o">==</span> <span class="s1">'-1'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                    <span class="k">raise</span> <span class="n">AGIAppError</span><span class="p">(</span><span class="s2">"Error executing application, or hangup"</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <span class="bp">self</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'    RESULT_DICT: </span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span> <span class="n">pprint</span><span class="o">.</span><span class="n">pformat</span><span class="p">(</span><span class="n">result</span><span class="p">))</span>
 | 
				
			||||||
 | 
					            <span class="k">return</span> <span class="n">result</span>
 | 
				
			||||||
 | 
					        <span class="k">elif</span> <span class="n">code</span> <span class="o">==</span> <span class="mi">510</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">raise</span> <span class="n">AGIInvalidCommand</span><span class="p">(</span><span class="n">response</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="k">elif</span> <span class="n">code</span> <span class="o">==</span> <span class="mi">520</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">usage</span> <span class="o">=</span> <span class="p">[</span><span class="n">line</span><span class="p">]</span>
 | 
				
			||||||
 | 
					            <span class="n">line</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
 | 
				
			||||||
 | 
					            <span class="k">while</span> <span class="n">line</span><span class="p">[:</span><span class="mi">3</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">'520'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="n">usage</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
 | 
				
			||||||
 | 
					                <span class="n">line</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
 | 
				
			||||||
 | 
					            <span class="n">usage</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
 | 
				
			||||||
 | 
					            <span class="n">usage</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">usage</span><span class="p">)</span>
 | 
				
			||||||
 | 
					            <span class="k">raise</span> <span class="n">AGIUsageError</span><span class="p">(</span><span class="n">usage</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">raise</span> <span class="n">AGIUnknownError</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="s1">'Unhandled code or undefined response'</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">_process_digit_list</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">digits</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">digits</span><span class="p">)</span> <span class="ow">is</span> <span class="nb">list</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">digits</span> <span class="o">=</span> <span class="s1">''</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">digits</span><span class="p">))</span>
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">digits</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.answer"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.answer">[docs]</a>    <span class="k">def</span> <span class="nf">answer</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.answer() --> None</span>
 | 
				
			||||||
 | 
					<span class="sd">        Answer channel if not already in answer state.</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'ANSWER'</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.wait_for_digit"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.wait_for_digit">[docs]</a>    <span class="k">def</span> <span class="nf">wait_for_digit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">DEFAULT_TIMEOUT</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.wait_for_digit(timeout=DEFAULT_TIMEOUT) --> digit</span>
 | 
				
			||||||
 | 
					<span class="sd">        Waits for up to 'timeout' milliseconds for a channel to receive a DTMF</span>
 | 
				
			||||||
 | 
					<span class="sd">        digit.  Returns digit dialed</span>
 | 
				
			||||||
 | 
					<span class="sd">        Throws AGIError on channel falure</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'WAIT FOR DIGIT'</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">return</span> <span class="s1">''</span>
 | 
				
			||||||
 | 
					        <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
 | 
				
			||||||
 | 
					            <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to digit: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.send_text"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.send_text">[docs]</a>    <span class="k">def</span> <span class="nf">send_text</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.send_text(text='') --> None</span>
 | 
				
			||||||
 | 
					<span class="sd">        Sends the given text on a channel.  Most channels do not support the</span>
 | 
				
			||||||
 | 
					<span class="sd">        transmission of text.</span>
 | 
				
			||||||
 | 
					<span class="sd">        Throws AGIError on error/hangup</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'SEND TEXT'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">text</span><span class="p">))[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.receive_char"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.receive_char">[docs]</a>    <span class="k">def</span> <span class="nf">receive_char</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">DEFAULT_TIMEOUT</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.receive_char(timeout=DEFAULT_TIMEOUT) --> chr</span>
 | 
				
			||||||
 | 
					<span class="sd">        Receives a character of text on a channel.  Specify timeout to be the</span>
 | 
				
			||||||
 | 
					<span class="sd">        maximum time to wait for input in milliseconds, or 0 for infinite. Most channels</span>
 | 
				
			||||||
 | 
					<span class="sd">        do not support the reception of text.</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'RECEIVE CHAR'</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">return</span> <span class="s1">''</span>
 | 
				
			||||||
 | 
					        <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
 | 
				
			||||||
 | 
					            <span class="k">except</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to char: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.tdd_mode"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.tdd_mode">[docs]</a>    <span class="k">def</span> <span class="nf">tdd_mode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s1">'off'</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.tdd_mode(mode='on'|'off') --> None</span>
 | 
				
			||||||
 | 
					<span class="sd">        Enable/Disable TDD transmission/reception on a channel.</span>
 | 
				
			||||||
 | 
					<span class="sd">        Throws AGIAppError if channel is not TDD-capable.</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'TDD MODE'</span><span class="p">,</span> <span class="n">mode</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">raise</span> <span class="n">AGIAppError</span><span class="p">(</span><span class="s1">'Channel </span><span class="si">%s</span><span class="s1"> is not TDD-capable'</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.stream_file"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.stream_file">[docs]</a>    <span class="k">def</span> <span class="nf">stream_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">escape_digits</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">sample_offset</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.stream_file(filename, escape_digits='', sample_offset=0) --> digit</span>
 | 
				
			||||||
 | 
					<span class="sd">        Send the given file, allowing playback to be interrupted by the given</span>
 | 
				
			||||||
 | 
					<span class="sd">        digits, if any.  escape_digits is a string '12345' or a list  of</span>
 | 
				
			||||||
 | 
					<span class="sd">        ints [1,2,3,4,5] or strings ['1','2','3'] or mixed [1,'2',3,'4']</span>
 | 
				
			||||||
 | 
					<span class="sd">        If sample offset is provided then the audio will seek to sample</span>
 | 
				
			||||||
 | 
					<span class="sd">        offset before play starts.  Returns  digit if one was pressed.</span>
 | 
				
			||||||
 | 
					<span class="sd">        Throws AGIError if the channel was disconnected.  Remember, the file</span>
 | 
				
			||||||
 | 
					<span class="sd">        extension must not be included in the filename.</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="n">escape_digits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">escape_digits</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
 | 
				
			||||||
 | 
					            <span class="s1">'STREAM FILE'</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">escape_digits</span><span class="p">,</span> <span class="n">sample_offset</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">res</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">return</span> <span class="s1">''</span>
 | 
				
			||||||
 | 
					        <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
 | 
				
			||||||
 | 
					            <span class="k">except</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to char: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.control_stream_file"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.control_stream_file">[docs]</a>    <span class="k">def</span> <span class="nf">control_stream_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">escape_digits</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">skipms</span><span class="o">=</span><span class="mi">3000</span><span class="p">,</span> <span class="n">fwd</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">rew</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">pause</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""</span>
 | 
				
			||||||
 | 
					<span class="sd">        Send the given file, allowing playback to be interrupted by the given</span>
 | 
				
			||||||
 | 
					<span class="sd">        digits, if any.  escape_digits is a string '12345' or a list  of</span>
 | 
				
			||||||
 | 
					<span class="sd">        ints [1,2,3,4,5] or strings ['1','2','3'] or mixed [1,'2',3,'4']</span>
 | 
				
			||||||
 | 
					<span class="sd">        If sample offset is provided then the audio will seek to sample</span>
 | 
				
			||||||
 | 
					<span class="sd">        offset before play starts.  Returns  digit if one was pressed.</span>
 | 
				
			||||||
 | 
					<span class="sd">        Throws AGIError if the channel was disconnected.  Remember, the file</span>
 | 
				
			||||||
 | 
					<span class="sd">        extension must not be included in the filename.</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="n">escape_digits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">escape_digits</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'CONTROL STREAM FILE'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">filename</span><span class="p">),</span> <span class="n">escape_digits</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">skipms</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">fwd</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">rew</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">pause</span><span class="p">))</span>
 | 
				
			||||||
 | 
					        <span class="n">res</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">return</span> <span class="s1">''</span>
 | 
				
			||||||
 | 
					        <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
 | 
				
			||||||
 | 
					            <span class="k">except</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to char: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.send_image"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.send_image">[docs]</a>    <span class="k">def</span> <span class="nf">send_image</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.send_image(filename) --> None</span>
 | 
				
			||||||
 | 
					<span class="sd">        Sends the given image on a channel.  Most channels do not support the</span>
 | 
				
			||||||
 | 
					<span class="sd">        transmission of images.   Image names should not include extensions.</span>
 | 
				
			||||||
 | 
					<span class="sd">        Throws AGIError on channel failure</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'SEND IMAGE'</span><span class="p">,</span> <span class="n">filename</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">res</span> <span class="o">!=</span> <span class="s1">'0'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">raise</span> <span class="n">AGIAppError</span><span class="p">(</span><span class="s1">'Channel falure on channel </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span>
 | 
				
			||||||
 | 
					                              <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'agi_channel'</span><span class="p">,</span> <span class="s1">'UNKNOWN'</span><span class="p">))</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.say_digits"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.say_digits">[docs]</a>    <span class="k">def</span> <span class="nf">say_digits</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">digits</span><span class="p">,</span> <span class="n">escape_digits</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.say_digits(digits, escape_digits='') --> digit</span>
 | 
				
			||||||
 | 
					<span class="sd">        Say a given digit string, returning early if any of the given DTMF digits</span>
 | 
				
			||||||
 | 
					<span class="sd">        are received on the channel.</span>
 | 
				
			||||||
 | 
					<span class="sd">        Throws AGIError on channel failure</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="n">digits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">digits</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">escape_digits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">escape_digits</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'SAY DIGITS'</span><span class="p">,</span> <span class="n">digits</span><span class="p">,</span> <span class="n">escape_digits</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">return</span> <span class="s1">''</span>
 | 
				
			||||||
 | 
					        <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
 | 
				
			||||||
 | 
					            <span class="k">except</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to char: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.say_number"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.say_number">[docs]</a>    <span class="k">def</span> <span class="nf">say_number</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">number</span><span class="p">,</span> <span class="n">escape_digits</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.say_number(number, escape_digits='') --> digit</span>
 | 
				
			||||||
 | 
					<span class="sd">        Say a given digit string, returning early if any of the given DTMF digits</span>
 | 
				
			||||||
 | 
					<span class="sd">        are received on the channel.</span>
 | 
				
			||||||
 | 
					<span class="sd">        Throws AGIError on channel failure</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="n">number</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">number</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">escape_digits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">escape_digits</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'SAY NUMBER'</span><span class="p">,</span> <span class="n">number</span><span class="p">,</span> <span class="n">escape_digits</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">return</span> <span class="s1">''</span>
 | 
				
			||||||
 | 
					        <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
 | 
				
			||||||
 | 
					            <span class="k">except</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to char: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.say_alpha"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.say_alpha">[docs]</a>    <span class="k">def</span> <span class="nf">say_alpha</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">characters</span><span class="p">,</span> <span class="n">escape_digits</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.say_alpha(string, escape_digits='') --> digit</span>
 | 
				
			||||||
 | 
					<span class="sd">        Say a given character string, returning early if any of the given DTMF</span>
 | 
				
			||||||
 | 
					<span class="sd">        digits are received on the channel.</span>
 | 
				
			||||||
 | 
					<span class="sd">        Throws AGIError on channel failure</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="n">characters</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">characters</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">escape_digits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">escape_digits</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'SAY ALPHA'</span><span class="p">,</span> <span class="n">characters</span><span class="p">,</span> <span class="n">escape_digits</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">return</span> <span class="s1">''</span>
 | 
				
			||||||
 | 
					        <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
 | 
				
			||||||
 | 
					            <span class="k">except</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to char: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.say_phonetic"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.say_phonetic">[docs]</a>    <span class="k">def</span> <span class="nf">say_phonetic</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">characters</span><span class="p">,</span> <span class="n">escape_digits</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.say_phonetic(string, escape_digits='') --> digit</span>
 | 
				
			||||||
 | 
					<span class="sd">        Phonetically say a given character string, returning early if any of</span>
 | 
				
			||||||
 | 
					<span class="sd">        the given DTMF digits are received on the channel.</span>
 | 
				
			||||||
 | 
					<span class="sd">        Throws AGIError on channel failure</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="n">characters</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">characters</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">escape_digits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">escape_digits</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
 | 
				
			||||||
 | 
					            <span class="s1">'SAY PHONETIC'</span><span class="p">,</span> <span class="n">characters</span><span class="p">,</span> <span class="n">escape_digits</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">return</span> <span class="s1">''</span>
 | 
				
			||||||
 | 
					        <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
 | 
				
			||||||
 | 
					            <span class="k">except</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to char: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.say_date"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.say_date">[docs]</a>    <span class="k">def</span> <span class="nf">say_date</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">seconds</span><span class="p">,</span> <span class="n">escape_digits</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.say_date(seconds, escape_digits='') --> digit</span>
 | 
				
			||||||
 | 
					<span class="sd">        Say a given date, returning early if any of the given DTMF digits are</span>
 | 
				
			||||||
 | 
					<span class="sd">        pressed.  The date should be in seconds since the UNIX Epoch (Jan 1, 1970 00:00:00)</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="n">escape_digits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">escape_digits</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'SAY DATE'</span><span class="p">,</span> <span class="n">seconds</span><span class="p">,</span> <span class="n">escape_digits</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">return</span> <span class="s1">''</span>
 | 
				
			||||||
 | 
					        <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
 | 
				
			||||||
 | 
					            <span class="k">except</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to char: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.say_time"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.say_time">[docs]</a>    <span class="k">def</span> <span class="nf">say_time</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">seconds</span><span class="p">,</span> <span class="n">escape_digits</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.say_time(seconds, escape_digits='') --> digit</span>
 | 
				
			||||||
 | 
					<span class="sd">        Say a given time, returning early if any of the given DTMF digits are</span>
 | 
				
			||||||
 | 
					<span class="sd">        pressed.  The time should be in seconds since the UNIX Epoch (Jan 1, 1970 00:00:00)</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="n">escape_digits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">escape_digits</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'SAY TIME'</span><span class="p">,</span> <span class="n">seconds</span><span class="p">,</span> <span class="n">escape_digits</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">return</span> <span class="s1">''</span>
 | 
				
			||||||
 | 
					        <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
 | 
				
			||||||
 | 
					            <span class="k">except</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to char: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.say_datetime"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.say_datetime">[docs]</a>    <span class="k">def</span> <span class="nf">say_datetime</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">seconds</span><span class="p">,</span> <span class="n">escape_digits</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">zone</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.say_datetime(seconds, escape_digits='', format='', zone='') --> digit</span>
 | 
				
			||||||
 | 
					<span class="sd">        Say a given date in the format specfied (see voicemail.conf), returning</span>
 | 
				
			||||||
 | 
					<span class="sd">        early if any of the given DTMF digits are pressed.  The date should be</span>
 | 
				
			||||||
 | 
					<span class="sd">        in seconds since the UNIX Epoch (Jan 1, 1970 00:00:00).</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="n">escape_digits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">escape_digits</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">format</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">format</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">format</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
 | 
				
			||||||
 | 
					            <span class="s1">'SAY DATETIME'</span><span class="p">,</span> <span class="n">seconds</span><span class="p">,</span> <span class="n">escape_digits</span><span class="p">,</span> <span class="n">format</span><span class="p">,</span> <span class="n">zone</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">return</span> <span class="s1">''</span>
 | 
				
			||||||
 | 
					        <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
 | 
				
			||||||
 | 
					            <span class="k">except</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to char: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.get_data"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.get_data">[docs]</a>    <span class="k">def</span> <span class="nf">get_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">DEFAULT_TIMEOUT</span><span class="p">,</span> <span class="n">max_digits</span><span class="o">=</span><span class="mi">255</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.get_data(filename, timeout=DEFAULT_TIMEOUT, max_digits=255) --> digits</span>
 | 
				
			||||||
 | 
					<span class="sd">        Stream the given file and receive dialed digits</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'GET DATA'</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">max_digits</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">res</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s1">'result'</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="n">res</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.get_option"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.get_option">[docs]</a>    <span class="k">def</span> <span class="nf">get_option</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">escape_digits</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.get_option(filename, escape_digits='', timeout=0) --> digit</span>
 | 
				
			||||||
 | 
					<span class="sd">        Send the given file, allowing playback to be interrupted by the given</span>
 | 
				
			||||||
 | 
					<span class="sd">        digits, if any.  escape_digits is a string '12345' or a list  of</span>
 | 
				
			||||||
 | 
					<span class="sd">        ints [1,2,3,4,5] or strings ['1','2','3'] or mixed [1,'2',3,'4']</span>
 | 
				
			||||||
 | 
					<span class="sd">        Returns  digit if one was pressed.</span>
 | 
				
			||||||
 | 
					<span class="sd">        Throws AGIError if the channel was disconnected.  Remember, the file</span>
 | 
				
			||||||
 | 
					<span class="sd">        extension must not be included in the filename.</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="n">escape_digits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">escape_digits</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">timeout</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
 | 
				
			||||||
 | 
					                <span class="s1">'GET OPTION'</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">escape_digits</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'GET OPTION'</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">escape_digits</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="n">res</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">return</span> <span class="s1">''</span>
 | 
				
			||||||
 | 
					        <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
 | 
				
			||||||
 | 
					            <span class="k">except</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to char: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.set_context"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.set_context">[docs]</a>    <span class="k">def</span> <span class="nf">set_context</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.set_context(context)</span>
 | 
				
			||||||
 | 
					<span class="sd">        Sets the context for continuation upon exiting the application.</span>
 | 
				
			||||||
 | 
					<span class="sd">        No error appears to be produced.  Does not set exten or priority</span>
 | 
				
			||||||
 | 
					<span class="sd">        Use at your own risk.  Ensure that you specify a valid context.</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'SET CONTEXT'</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.set_extension"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.set_extension">[docs]</a>    <span class="k">def</span> <span class="nf">set_extension</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">extension</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.set_extension(extension)</span>
 | 
				
			||||||
 | 
					<span class="sd">        Sets the extension for continuation upon exiting the application.</span>
 | 
				
			||||||
 | 
					<span class="sd">        No error appears to be produced.  Does not set context or priority</span>
 | 
				
			||||||
 | 
					<span class="sd">        Use at your own risk.  Ensure that you specify a valid extension.</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'SET EXTENSION'</span><span class="p">,</span> <span class="n">extension</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.set_priority"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.set_priority">[docs]</a>    <span class="k">def</span> <span class="nf">set_priority</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">priority</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.set_priority(priority)</span>
 | 
				
			||||||
 | 
					<span class="sd">        Sets the priority for continuation upon exiting the application.</span>
 | 
				
			||||||
 | 
					<span class="sd">        No error appears to be produced.  Does not set exten or context</span>
 | 
				
			||||||
 | 
					<span class="sd">        Use at your own risk.  Ensure that you specify a valid priority.</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'set priority'</span><span class="p">,</span> <span class="n">priority</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">goto_on_exit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">extension</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">priority</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="n">context</span> <span class="o">=</span> <span class="n">context</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s1">'agi_context'</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="n">extension</span> <span class="o">=</span> <span class="n">extension</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s1">'agi_extension'</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="n">priority</span> <span class="o">=</span> <span class="n">priority</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s1">'agi_priority'</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">set_context</span><span class="p">(</span><span class="n">context</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">set_extension</span><span class="p">(</span><span class="n">extension</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">set_priority</span><span class="p">(</span><span class="n">priority</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.record_file"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.record_file">[docs]</a>    <span class="k">def</span> <span class="nf">record_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="s1">'gsm'</span><span class="p">,</span> <span class="n">escape_digits</span><span class="o">=</span><span class="s1">'#'</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">DEFAULT_RECORD</span><span class="p">,</span> <span class="n">offset</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">beep</span><span class="o">=</span><span class="s1">'beep'</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.record_file(filename, format, escape_digits, timeout=DEFAULT_TIMEOUT, offset=0, beep='beep') --> None</span>
 | 
				
			||||||
 | 
					<span class="sd">        Record to a file until a given dtmf digit in the sequence is received</span>
 | 
				
			||||||
 | 
					<span class="sd">        The format will specify what kind of file will be recorded.  The timeout</span>
 | 
				
			||||||
 | 
					<span class="sd">        is the maximum record time in milliseconds, or -1 for no timeout. Offset</span>
 | 
				
			||||||
 | 
					<span class="sd">        samples is optional, and if provided will seek to the offset without</span>
 | 
				
			||||||
 | 
					<span class="sd">        exceeding the end of the file</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="n">escape_digits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_digit_list</span><span class="p">(</span><span class="n">escape_digits</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'RECORD FILE'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">filename</span><span class="p">),</span> <span class="n">format</span><span class="p">,</span>
 | 
				
			||||||
 | 
					                           <span class="n">escape_digits</span><span class="p">,</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">beep</span><span class="p">)[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
 | 
				
			||||||
 | 
					        <span class="k">except</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unable to convert result to digit: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">res</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.set_autohangup"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.set_autohangup">[docs]</a>    <span class="k">def</span> <span class="nf">set_autohangup</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">secs</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.set_autohangup(secs) --> None</span>
 | 
				
			||||||
 | 
					<span class="sd">        Cause the channel to automatically hangup at <secs> seconds in the</span>
 | 
				
			||||||
 | 
					<span class="sd">        future.  Of course it can be hungup before then as well.   Setting to</span>
 | 
				
			||||||
 | 
					<span class="sd">        0 will cause the autohangup feature to be disabled on this channel.</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'SET AUTOHANGUP'</span><span class="p">,</span> <span class="n">secs</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.hangup"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.hangup">[docs]</a>    <span class="k">def</span> <span class="nf">hangup</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">channel</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.hangup(channel='')</span>
 | 
				
			||||||
 | 
					<span class="sd">        Hangs up the specified channel.</span>
 | 
				
			||||||
 | 
					<span class="sd">        If no channel name is given, hangs up the current channel</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'HANGUP'</span><span class="p">,</span> <span class="n">channel</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.appexec"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.appexec">[docs]</a>    <span class="k">def</span> <span class="nf">appexec</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">application</span><span class="p">,</span> <span class="n">options</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.appexec(application, options='')</span>
 | 
				
			||||||
 | 
					<span class="sd">        Executes <application> with given <options>.</span>
 | 
				
			||||||
 | 
					<span class="sd">        Returns whatever the application returns, or -2 on failure to find</span>
 | 
				
			||||||
 | 
					<span class="sd">        application</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'EXEC'</span><span class="p">,</span> <span class="n">application</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">options</span><span class="p">))</span>
 | 
				
			||||||
 | 
					        <span class="n">res</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'-2'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">raise</span> <span class="n">AGIAppError</span><span class="p">(</span><span class="s1">'Unable to find application: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">application</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="n">res</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.set_callerid"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.set_callerid">[docs]</a>    <span class="k">def</span> <span class="nf">set_callerid</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">number</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.set_callerid(number) --> None</span>
 | 
				
			||||||
 | 
					<span class="sd">        Changes the callerid of the current channel.</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'SET CALLERID'</span><span class="p">,</span> <span class="n">number</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.channel_status"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.channel_status">[docs]</a>    <span class="k">def</span> <span class="nf">channel_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">channel</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.channel_status(channel='') --> int</span>
 | 
				
			||||||
 | 
					<span class="sd">        Returns the status of the specified channel.  If no channel name is</span>
 | 
				
			||||||
 | 
					<span class="sd">        given the returns the status of the current channel.</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">        Return values:</span>
 | 
				
			||||||
 | 
					<span class="sd">        0 Channel is down and available</span>
 | 
				
			||||||
 | 
					<span class="sd">        1 Channel is down, but reserved</span>
 | 
				
			||||||
 | 
					<span class="sd">        2 Channel is off hook</span>
 | 
				
			||||||
 | 
					<span class="sd">        3 Digits (or equivalent) have been dialed</span>
 | 
				
			||||||
 | 
					<span class="sd">        4 Line is ringing</span>
 | 
				
			||||||
 | 
					<span class="sd">        5 Remote end is ringing</span>
 | 
				
			||||||
 | 
					<span class="sd">        6 Line is up</span>
 | 
				
			||||||
 | 
					<span class="sd">        7 Line is busy</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'CHANNEL STATUS'</span><span class="p">,</span> <span class="n">channel</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="k">except</span> <span class="n">AGIHangup</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">raise</span>
 | 
				
			||||||
 | 
					        <span class="k">except</span> <span class="n">AGIAppError</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">result</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'result'</span><span class="p">:</span> <span class="p">(</span><span class="s1">'-1'</span><span class="p">,</span> <span class="s1">''</span><span class="p">)}</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="s1">'result'</span><span class="p">][</span><span class="mi">0</span><span class="p">])</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.set_variable"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.set_variable">[docs]</a>    <span class="k">def</span> <span class="nf">set_variable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Set a channel variable.</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'SET VARIABLE'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">name</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">value</span><span class="p">))</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.get_variable"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.get_variable">[docs]</a>    <span class="k">def</span> <span class="nf">get_variable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Get a channel variable.</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">        This function returns the value of the indicated channel variable.  If</span>
 | 
				
			||||||
 | 
					<span class="sd">        the variable is not set, an empty string is returned.</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'GET VARIABLE'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
 | 
				
			||||||
 | 
					        <span class="k">except</span> <span class="n">AGIResultHangup</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">result</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'result'</span><span class="p">:</span> <span class="p">(</span><span class="s1">'1'</span><span class="p">,</span> <span class="s1">'hangup'</span><span class="p">)}</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="n">res</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s1">'result'</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="n">value</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.get_full_variable"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.get_full_variable">[docs]</a>    <span class="k">def</span> <span class="nf">get_full_variable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">channel</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Get a channel variable.</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">        This function returns the value of the indicated channel variable.  If</span>
 | 
				
			||||||
 | 
					<span class="sd">        the variable is not set, an empty string is returned.</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">if</span> <span class="n">channel</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'GET FULL VARIABLE'</span><span class="p">,</span>
 | 
				
			||||||
 | 
					                                      <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">name</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">channel</span><span class="p">))</span>
 | 
				
			||||||
 | 
					            <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'GET FULL VARIABLE'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">except</span> <span class="n">AGIResultHangup</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">result</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'result'</span><span class="p">:</span> <span class="p">(</span><span class="s1">'1'</span><span class="p">,</span> <span class="s1">'hangup'</span><span class="p">)}</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="n">res</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s1">'result'</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="n">value</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.verbose"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.verbose">[docs]</a>    <span class="k">def</span> <span class="nf">verbose</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.verbose(message='', level=1) --> None</span>
 | 
				
			||||||
 | 
					<span class="sd">        Sends <message> to the console via verbose message system.</span>
 | 
				
			||||||
 | 
					<span class="sd">        <level> is the the verbose level (1-4)</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'VERBOSE'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">message</span><span class="p">),</span> <span class="n">level</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.database_get"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.database_get">[docs]</a>    <span class="k">def</span> <span class="nf">database_get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">family</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.database_get(family, key) --> str</span>
 | 
				
			||||||
 | 
					<span class="sd">        Retrieves an entry in the Asterisk database for a given family and key.</span>
 | 
				
			||||||
 | 
					<span class="sd">        Returns 0 if <key> is not set.  Returns 1 if <key></span>
 | 
				
			||||||
 | 
					<span class="sd">        is set and returns the variable in parenthesis</span>
 | 
				
			||||||
 | 
					<span class="sd">        example return code: 200 result=1 (testvariable)</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="n">family</span> <span class="o">=</span> <span class="s1">'"</span><span class="si">%s</span><span class="s1">"'</span> <span class="o">%</span> <span class="n">family</span>
 | 
				
			||||||
 | 
					        <span class="n">key</span> <span class="o">=</span> <span class="s1">'"</span><span class="si">%s</span><span class="s1">"'</span> <span class="o">%</span> <span class="n">key</span>
 | 
				
			||||||
 | 
					        <span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
 | 
				
			||||||
 | 
					            <span class="s1">'DATABASE GET'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">family</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">key</span><span class="p">))</span>
 | 
				
			||||||
 | 
					        <span class="n">res</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s1">'result'</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">raise</span> <span class="n">AGIDBError</span><span class="p">(</span><span class="s1">'Key not found in database: family=</span><span class="si">%s</span><span class="s1">, key=</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span>
 | 
				
			||||||
 | 
					                             <span class="p">(</span><span class="n">family</span><span class="p">,</span> <span class="n">key</span><span class="p">))</span>
 | 
				
			||||||
 | 
					        <span class="k">elif</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'1'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">return</span> <span class="n">value</span>
 | 
				
			||||||
 | 
					        <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">raise</span> <span class="n">AGIError</span><span class="p">(</span><span class="s1">'Unknown exception for : family=</span><span class="si">%s</span><span class="s1">, key=</span><span class="si">%s</span><span class="s1">, result=</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">family</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">pprint</span><span class="o">.</span><span class="n">pformat</span><span class="p">(</span><span class="n">result</span><span class="p">)))</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.database_put"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.database_put">[docs]</a>    <span class="k">def</span> <span class="nf">database_put</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">family</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="sd">"""agi.database_put(family, key, value) --> None</span>
 | 
				
			||||||
 | 
					<span class="sd">        Adds or updates an entry in the Asterisk database for a</span>
 | 
				
			||||||
 | 
					<span class="sd">        given family, key, and value.</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'DATABASE PUT'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span>
 | 
				
			||||||
 | 
					            <span class="n">family</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">key</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
 | 
				
			||||||
 | 
					        <span class="n">res</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s1">'result'</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">raise</span> <span class="n">AGIDBError</span><span class="p">(</span><span class="s1">'Unable to put vaule in databale: family=</span><span class="si">%s</span><span class="s1">, key=</span><span class="si">%s</span><span class="s1">, value=</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">family</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.database_del"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.database_del">[docs]</a>    <span class="k">def</span> <span class="nf">database_del</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">family</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.database_del(family, key) --> None</span>
 | 
				
			||||||
 | 
					<span class="sd">        Deletes an entry in the Asterisk database for a</span>
 | 
				
			||||||
 | 
					<span class="sd">        given family and key.</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
 | 
				
			||||||
 | 
					            <span class="s1">'DATABASE DEL'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">family</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">key</span><span class="p">))</span>
 | 
				
			||||||
 | 
					        <span class="n">res</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s1">'result'</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">raise</span> <span class="n">AGIDBError</span><span class="p">(</span><span class="s1">'Unable to delete from database: family=</span><span class="si">%s</span><span class="s1">, key=</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">family</span><span class="p">,</span> <span class="n">key</span><span class="p">))</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.database_deltree"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.database_deltree">[docs]</a>    <span class="k">def</span> <span class="nf">database_deltree</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">family</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.database_deltree(family, key='') --> None</span>
 | 
				
			||||||
 | 
					<span class="sd">        Deletes a family or specific keytree with in a family</span>
 | 
				
			||||||
 | 
					<span class="sd">        in the Asterisk database.</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
 | 
				
			||||||
 | 
					            <span class="s1">'DATABASE DELTREE'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">family</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_quote</span><span class="p">(</span><span class="n">key</span><span class="p">))</span>
 | 
				
			||||||
 | 
					        <span class="n">res</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s1">'result'</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">res</span> <span class="o">==</span> <span class="s1">'0'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">raise</span> <span class="n">AGIDBError</span><span class="p">(</span><span class="s1">'Unable to delete tree from database: family=</span><span class="si">%s</span><span class="s1">, key=</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">family</span><span class="p">,</span> <span class="n">key</span><span class="p">))</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="AGI.noop"><a class="viewcode-back" href="../../agi.html#asterisk.agi.AGI.noop">[docs]</a>    <span class="k">def</span> <span class="nf">noop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""agi.noop() --> None</span>
 | 
				
			||||||
 | 
					<span class="sd">        Does nothing</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'NOOP'</span><span class="p">)</span></div></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					    <span class="n">agi</span> <span class="o">=</span> <span class="n">AGI</span><span class="p">()</span>
 | 
				
			||||||
 | 
					    <span class="c1">#agi.appexec('festival','Welcome to Klass Technologies.  Thank you for calling.')</span>
 | 
				
			||||||
 | 
					    <span class="c1">#agi.appexec('festival','This is a test of the text to speech engine.')</span>
 | 
				
			||||||
 | 
					    <span class="c1">#agi.appexec('festival','Press 1 for sales ')</span>
 | 
				
			||||||
 | 
					    <span class="c1">#agi.appexec('festival','Press 2 for customer support ')</span>
 | 
				
			||||||
 | 
					    <span class="c1">#agi.hangup()</span>
 | 
				
			||||||
 | 
					    <span class="c1">#agi.goto_on_exit(extension='1234', priority='1')</span>
 | 
				
			||||||
 | 
					    <span class="c1">#sys.exit(0)</span>
 | 
				
			||||||
 | 
					    <span class="c1">#agi.say_digits('123', [4,'5',6])</span>
 | 
				
			||||||
 | 
					    <span class="c1">#agi.say_digits([4,5,6])</span>
 | 
				
			||||||
 | 
					    <span class="c1">#agi.say_number('1234')</span>
 | 
				
			||||||
 | 
					    <span class="c1">#agi.say_number('01234')  # 668</span>
 | 
				
			||||||
 | 
					    <span class="c1">#agi.say_number('0xf5')   # 245</span>
 | 
				
			||||||
 | 
					    <span class="n">agi</span><span class="o">.</span><span class="n">get_data</span><span class="p">(</span><span class="s1">'demo-congrats'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					    <span class="n">agi</span><span class="o">.</span><span class="n">hangup</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="mi">0</span><span class="p">)</span>
 | 
				
			||||||
 | 
					    <span class="c1">#agi.record_file('pyst-test') #FAILS</span>
 | 
				
			||||||
 | 
					    <span class="c1">#agi.stream_file('demo-congrats', [1,2,3,4,5,6,7,8,9,0,'#','*'])</span>
 | 
				
			||||||
 | 
					    <span class="c1">#agi.appexec('background','demo-congrats')</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					        <span class="n">agi</span><span class="o">.</span><span class="n">appexec</span><span class="p">(</span><span class="s1">'backgrounder'</span><span class="p">,</span> <span class="s1">'demo-congrats'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					    <span class="k">except</span> <span class="n">AGIAppError</span><span class="p">:</span>
 | 
				
			||||||
 | 
					        <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span>
 | 
				
			||||||
 | 
					            <span class="s2">"Handled exception for missing application backgrounder</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="n">agi</span><span class="o">.</span><span class="n">set_variable</span><span class="p">(</span><span class="s1">'foo'</span><span class="p">,</span> <span class="s1">'bar'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					    <span class="n">agi</span><span class="o">.</span><span class="n">get_variable</span><span class="p">(</span><span class="s1">'foo'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					        <span class="n">agi</span><span class="o">.</span><span class="n">get_variable</span><span class="p">(</span><span class="s1">'foobar'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					    <span class="k">except</span> <span class="n">AGIAppError</span><span class="p">:</span>
 | 
				
			||||||
 | 
					        <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">"Handled exception for missing variable foobar</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					        <span class="n">agi</span><span class="o">.</span><span class="n">database_put</span><span class="p">(</span><span class="s1">'foo'</span><span class="p">,</span> <span class="s1">'bar'</span><span class="p">,</span> <span class="s1">'foobar'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">agi</span><span class="o">.</span><span class="n">database_put</span><span class="p">(</span><span class="s1">'foo'</span><span class="p">,</span> <span class="s1">'baz'</span><span class="p">,</span> <span class="s1">'foobaz'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">agi</span><span class="o">.</span><span class="n">database_put</span><span class="p">(</span><span class="s1">'foo'</span><span class="p">,</span> <span class="s1">'bat'</span><span class="p">,</span> <span class="s1">'foobat'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">v</span> <span class="o">=</span> <span class="n">agi</span><span class="o">.</span><span class="n">database_get</span><span class="p">(</span><span class="s1">'foo'</span><span class="p">,</span> <span class="s1">'bar'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'DBVALUE foo:bar = </span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span> <span class="n">v</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">v</span> <span class="o">=</span> <span class="n">agi</span><span class="o">.</span><span class="n">database_get</span><span class="p">(</span><span class="s1">'bar'</span><span class="p">,</span> <span class="s1">'foo'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'DBVALUE foo:bar = </span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span> <span class="n">v</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">agi</span><span class="o">.</span><span class="n">database_del</span><span class="p">(</span><span class="s1">'foo'</span><span class="p">,</span> <span class="s1">'bar'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">agi</span><span class="o">.</span><span class="n">database_deltree</span><span class="p">(</span><span class="s1">'foo'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					    <span class="k">except</span> <span class="n">AGIDBError</span><span class="p">:</span>
 | 
				
			||||||
 | 
					        <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span>
 | 
				
			||||||
 | 
					            <span class="s2">"Handled exception for missing database entry bar:foo</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="n">agi</span><span class="o">.</span><span class="n">hangup</span><span class="p">()</span>
 | 
				
			||||||
 | 
					</pre></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
 | 
				
			||||||
 | 
					        <div class="sphinxsidebarwrapper"><div class="relations">
 | 
				
			||||||
 | 
					<h3>Related Topics</h3>
 | 
				
			||||||
 | 
					<ul>
 | 
				
			||||||
 | 
					  <li><a href="../../index.html">Documentation overview</a><ul>
 | 
				
			||||||
 | 
					  <li><a href="../index.html">Module code</a><ul>
 | 
				
			||||||
 | 
					  </ul></li>
 | 
				
			||||||
 | 
					  </ul></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div id="searchbox" style="display: none" role="search">
 | 
				
			||||||
 | 
					  <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="footer">
 | 
				
			||||||
 | 
					      ©2016, Randall Degges.
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      |
 | 
				
			||||||
 | 
					      Powered by <a href="http://sphinx-doc.org/">Sphinx 1.3.6</a>
 | 
				
			||||||
 | 
					      & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.7</a>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  </body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
							
								
								
									
										334
									
								
								html/_modules/asterisk/agitb.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,334 @@
 | 
				
			|||||||
 | 
					<!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>asterisk.agitb — pyst2 0.4.9 documentation</title>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <link rel="stylesheet" href="../../_static/alabaster.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.4.9',
 | 
				
			||||||
 | 
					        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="pyst2 0.4.9 documentation" href="../../index.html" />
 | 
				
			||||||
 | 
					    <link rel="up" title="Module code" href="../index.html" />
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </head>
 | 
				
			||||||
 | 
					  <body role="document">  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div class="document">
 | 
				
			||||||
 | 
					      <div class="documentwrapper">
 | 
				
			||||||
 | 
					        <div class="bodywrapper">
 | 
				
			||||||
 | 
					          <div class="body" role="main">
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					  <h1>Source code for asterisk.agitb</h1><div class="highlight"><pre>
 | 
				
			||||||
 | 
					<span></span><span class="sd">"""</span>
 | 
				
			||||||
 | 
					<span class="sd">.. module:: agi</span>
 | 
				
			||||||
 | 
					<span class="sd">   :synopsis: More comprehensive traceback formatting for Python scripts.</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">Example</span>
 | 
				
			||||||
 | 
					<span class="sd">-------</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">To enable this module, do:</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">.. code-block:: python</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">   import asterisk.agitb, asterisk.agi</span>
 | 
				
			||||||
 | 
					<span class="sd">   asterisk.agitb.enable(display = False, logdir = '/var/log/asterisk/')</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">   agi = asterisk.agi.AGI()</span>
 | 
				
			||||||
 | 
					<span class="sd">   asterisk.agitb.enable(agi, False, '/var/log/asterisk')</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">at the top of your script.  The optional arguments to enable() are:</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">* agi         - the agi handle to write verbose messages to</span>
 | 
				
			||||||
 | 
					<span class="sd">* display     - if true, tracebacks are displayed on the asterisk console</span>
 | 
				
			||||||
 | 
					<span class="sd">  (used with the agi option)</span>
 | 
				
			||||||
 | 
					<span class="sd">* logdir      - if set, tracebacks are written to files in this directory</span>
 | 
				
			||||||
 | 
					<span class="sd">* context     - number of lines of source code to show for each stack frame</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">By default, tracebacks are displayed but not saved, and the context is 5 lines.</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">You may want to add a logdir if you call agitb.enable() before you have</span>
 | 
				
			||||||
 | 
					<span class="sd">an agi.AGI() handle.</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">Alternatively, if you have caught an exception and want agitb to display it</span>
 | 
				
			||||||
 | 
					<span class="sd">for you, call agitb.handler().  The optional argument to handler() is a</span>
 | 
				
			||||||
 | 
					<span class="sd">3-item tuple (etype, evalue, etb) just like the value of sys.exc_info().</span>
 | 
				
			||||||
 | 
					<span class="sd">If you do not pass anything to handler() it will use sys.exc_info().</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">This script was adapted from Ka-Ping Yee's cgitb.</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">Specification</span>
 | 
				
			||||||
 | 
					<span class="sd">-------------</span>
 | 
				
			||||||
 | 
					<span class="sd">"""</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="n">__author__</span> <span class="o">=</span> <span class="s1">'Matthew Nicholson'</span>
 | 
				
			||||||
 | 
					<span class="n">__version__</span> <span class="o">=</span> <span class="s1">'0.1.0'</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="kn">import</span> <span class="nn">sys</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="n">__UNDEF__</span> <span class="o">=</span> <span class="p">[]</span>                          <span class="c1"># a special sentinel object</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="lookup"><a class="viewcode-back" href="../../agitb.html#asterisk.agitb.lookup">[docs]</a><span class="k">def</span> <span class="nf">lookup</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">frame</span><span class="p">,</span> <span class="nb">locals</span><span class="p">):</span>
 | 
				
			||||||
 | 
					    <span class="sd">"""Find the value for a given name in the given environment."""</span>
 | 
				
			||||||
 | 
					    <span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="nb">locals</span><span class="p">:</span>
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="s1">'local'</span><span class="p">,</span> <span class="nb">locals</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
 | 
				
			||||||
 | 
					    <span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">frame</span><span class="o">.</span><span class="n">f_globals</span><span class="p">:</span>
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="s1">'global'</span><span class="p">,</span> <span class="n">frame</span><span class="o">.</span><span class="n">f_globals</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
 | 
				
			||||||
 | 
					    <span class="k">if</span> <span class="s1">'__builtins__'</span> <span class="ow">in</span> <span class="n">frame</span><span class="o">.</span><span class="n">f_globals</span><span class="p">:</span>
 | 
				
			||||||
 | 
					        <span class="n">builtins</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">f_globals</span><span class="p">[</span><span class="s1">'__builtins__'</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">builtins</span><span class="p">,</span> <span class="nb">type</span><span class="p">({})):</span>
 | 
				
			||||||
 | 
					            <span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">builtins</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">return</span> <span class="s1">'builtin'</span><span class="p">,</span> <span class="n">builtins</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">builtins</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
 | 
				
			||||||
 | 
					                <span class="k">return</span> <span class="s1">'builtin'</span><span class="p">,</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">builtins</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
 | 
				
			||||||
 | 
					    <span class="k">return</span> <span class="bp">None</span><span class="p">,</span> <span class="n">__UNDEF__</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="scanvars"><a class="viewcode-back" href="../../agitb.html#asterisk.agitb.scanvars">[docs]</a><span class="k">def</span> <span class="nf">scanvars</span><span class="p">(</span><span class="n">reader</span><span class="p">,</span> <span class="n">frame</span><span class="p">,</span> <span class="nb">locals</span><span class="p">):</span>
 | 
				
			||||||
 | 
					    <span class="sd">"""Scan one logical line of Python and look up values of variables used."""</span>
 | 
				
			||||||
 | 
					    <span class="kn">import</span> <span class="nn">tokenize</span>
 | 
				
			||||||
 | 
					    <span class="kn">import</span> <span class="nn">keyword</span>
 | 
				
			||||||
 | 
					    <span class="nb">vars</span><span class="p">,</span> <span class="n">lasttoken</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">prefix</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="p">[],</span> <span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span> <span class="s1">''</span><span class="p">,</span> <span class="n">__UNDEF__</span>
 | 
				
			||||||
 | 
					    <span class="k">for</span> <span class="n">ttype</span><span class="p">,</span> <span class="n">token</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">tokenize</span><span class="o">.</span><span class="n">generate_tokens</span><span class="p">(</span><span class="n">reader</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">ttype</span> <span class="o">==</span> <span class="n">tokenize</span><span class="o">.</span><span class="n">NEWLINE</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">break</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">ttype</span> <span class="o">==</span> <span class="n">tokenize</span><span class="o">.</span><span class="n">NAME</span> <span class="ow">and</span> <span class="n">token</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">keyword</span><span class="o">.</span><span class="n">kwlist</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">if</span> <span class="n">lasttoken</span> <span class="o">==</span> <span class="s1">'.'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">if</span> <span class="n">parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">__UNDEF__</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                    <span class="n">value</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="n">token</span><span class="p">,</span> <span class="n">__UNDEF__</span><span class="p">)</span>
 | 
				
			||||||
 | 
					                    <span class="nb">vars</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">prefix</span> <span class="o">+</span> <span class="n">token</span><span class="p">,</span> <span class="n">prefix</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>
 | 
				
			||||||
 | 
					            <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="n">where</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">lookup</span><span class="p">(</span><span class="n">token</span><span class="p">,</span> <span class="n">frame</span><span class="p">,</span> <span class="nb">locals</span><span class="p">)</span>
 | 
				
			||||||
 | 
					                <span class="nb">vars</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">token</span><span class="p">,</span> <span class="n">where</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>
 | 
				
			||||||
 | 
					        <span class="k">elif</span> <span class="n">token</span> <span class="o">==</span> <span class="s1">'.'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">prefix</span> <span class="o">+=</span> <span class="n">lasttoken</span> <span class="o">+</span> <span class="s1">'.'</span>
 | 
				
			||||||
 | 
					            <span class="n">parent</span> <span class="o">=</span> <span class="n">value</span>
 | 
				
			||||||
 | 
					        <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">parent</span><span class="p">,</span> <span class="n">prefix</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="s1">''</span>
 | 
				
			||||||
 | 
					        <span class="n">lasttoken</span> <span class="o">=</span> <span class="n">token</span>
 | 
				
			||||||
 | 
					    <span class="k">return</span> <span class="nb">vars</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="text"><a class="viewcode-back" href="../../agitb.html#asterisk.agitb.text">[docs]</a><span class="k">def</span> <span class="nf">text</span><span class="p">(</span><span class="n">eparams</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="mi">5</span><span class="p">):</span>
 | 
				
			||||||
 | 
					    <span class="sd">"""Return a plain text document describing a given traceback."""</span>
 | 
				
			||||||
 | 
					    <span class="kn">import</span> <span class="nn">os</span>
 | 
				
			||||||
 | 
					    <span class="kn">import</span> <span class="nn">types</span>
 | 
				
			||||||
 | 
					    <span class="kn">import</span> <span class="nn">time</span>
 | 
				
			||||||
 | 
					    <span class="kn">import</span> <span class="nn">traceback</span>
 | 
				
			||||||
 | 
					    <span class="kn">import</span> <span class="nn">linecache</span>
 | 
				
			||||||
 | 
					    <span class="kn">import</span> <span class="nn">inspect</span>
 | 
				
			||||||
 | 
					    <span class="kn">import</span> <span class="nn">pydoc</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="n">etype</span><span class="p">,</span> <span class="n">evalue</span><span class="p">,</span> <span class="n">etb</span> <span class="o">=</span> <span class="n">eparams</span>
 | 
				
			||||||
 | 
					    <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">etype</span><span class="p">,</span> <span class="n">types</span><span class="o">.</span><span class="n">ClassType</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="n">etype</span> <span class="o">=</span> <span class="n">etype</span><span class="o">.</span><span class="n">__name__</span>
 | 
				
			||||||
 | 
					    <span class="n">pyver</span> <span class="o">=</span> <span class="s1">'Python '</span> <span class="o">+</span> <span class="n">sys</span><span class="o">.</span><span class="n">version</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="s1">': '</span> <span class="o">+</span> <span class="n">sys</span><span class="o">.</span><span class="n">executable</span>
 | 
				
			||||||
 | 
					    <span class="n">date</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">ctime</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span>
 | 
				
			||||||
 | 
					    <span class="n">head</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s</span><span class="se">\n</span><span class="si">%s</span><span class="se">\n</span><span class="si">%s</span><span class="se">\n</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">etype</span><span class="p">),</span> <span class="n">pyver</span><span class="p">,</span> <span class="n">date</span><span class="p">)</span> <span class="o">+</span> <span class="s1">'''</span>
 | 
				
			||||||
 | 
					<span class="s1">A problem occurred in a Python script.  Here is the sequence of</span>
 | 
				
			||||||
 | 
					<span class="s1">function calls leading up to the error, in the order they occurred.</span>
 | 
				
			||||||
 | 
					<span class="s1">'''</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="n">frames</span> <span class="o">=</span> <span class="p">[]</span>
 | 
				
			||||||
 | 
					    <span class="n">records</span> <span class="o">=</span> <span class="n">inspect</span><span class="o">.</span><span class="n">getinnerframes</span><span class="p">(</span><span class="n">etb</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span>
 | 
				
			||||||
 | 
					    <span class="k">for</span> <span class="n">frame</span><span class="p">,</span> <span class="nb">file</span><span class="p">,</span> <span class="n">lnum</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">lines</span><span class="p">,</span> <span class="n">index</span> <span class="ow">in</span> <span class="n">records</span><span class="p">:</span>
 | 
				
			||||||
 | 
					        <span class="nb">file</span> <span class="o">=</span> <span class="nb">file</span> <span class="ow">and</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="nb">file</span><span class="p">)</span> <span class="ow">or</span> <span class="s1">'?'</span>
 | 
				
			||||||
 | 
					        <span class="n">args</span><span class="p">,</span> <span class="n">varargs</span><span class="p">,</span> <span class="n">varkw</span><span class="p">,</span> <span class="nb">locals</span> <span class="o">=</span> <span class="n">inspect</span><span class="o">.</span><span class="n">getargvalues</span><span class="p">(</span><span class="n">frame</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">call</span> <span class="o">=</span> <span class="s1">''</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">func</span> <span class="o">!=</span> <span class="s1">'?'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">call</span> <span class="o">=</span> <span class="s1">'in '</span> <span class="o">+</span> <span class="n">func</span> <span class="o">+</span> \
 | 
				
			||||||
 | 
					                <span class="n">inspect</span><span class="o">.</span><span class="n">formatargvalues</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">varargs</span><span class="p">,</span> <span class="n">varkw</span><span class="p">,</span> <span class="nb">locals</span><span class="p">,</span>
 | 
				
			||||||
 | 
					                                        <span class="n">formatvalue</span><span class="o">=</span><span class="k">lambda</span> <span class="n">value</span><span class="p">:</span> <span class="s1">'='</span> <span class="o">+</span> <span class="n">pydoc</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">repr</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="n">highlight</span> <span class="o">=</span> <span class="p">{}</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">def</span> <span class="nf">reader</span><span class="p">(</span><span class="n">lnum</span><span class="o">=</span><span class="p">[</span><span class="n">lnum</span><span class="p">]):</span>
 | 
				
			||||||
 | 
					            <span class="n">highlight</span><span class="p">[</span><span class="n">lnum</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> <span class="o">=</span> <span class="mi">1</span>
 | 
				
			||||||
 | 
					            <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">return</span> <span class="n">linecache</span><span class="o">.</span><span class="n">getline</span><span class="p">(</span><span class="nb">file</span><span class="p">,</span> <span class="n">lnum</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
 | 
				
			||||||
 | 
					            <span class="k">finally</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="n">lnum</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
 | 
				
			||||||
 | 
					        <span class="nb">vars</span> <span class="o">=</span> <span class="n">scanvars</span><span class="p">(</span><span class="n">reader</span><span class="p">,</span> <span class="n">frame</span><span class="p">,</span> <span class="nb">locals</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="n">rows</span> <span class="o">=</span> <span class="p">[</span><span class="s1">' </span><span class="si">%s</span><span class="s1"> </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="nb">file</span><span class="p">,</span> <span class="n">call</span><span class="p">)]</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">index</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">i</span> <span class="o">=</span> <span class="n">lnum</span> <span class="o">-</span> <span class="n">index</span>
 | 
				
			||||||
 | 
					            <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="n">num</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%5d</span><span class="s1"> '</span> <span class="o">%</span> <span class="n">i</span>
 | 
				
			||||||
 | 
					                <span class="n">rows</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">num</span> <span class="o">+</span> <span class="n">line</span><span class="o">.</span><span class="n">rstrip</span><span class="p">())</span>
 | 
				
			||||||
 | 
					                <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="n">done</span><span class="p">,</span> <span class="n">dump</span> <span class="o">=</span> <span class="p">{},</span> <span class="p">[]</span>
 | 
				
			||||||
 | 
					        <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">where</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="nb">vars</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">done</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">continue</span>
 | 
				
			||||||
 | 
					            <span class="n">done</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
 | 
				
			||||||
 | 
					            <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">__UNDEF__</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">if</span> <span class="n">where</span> <span class="o">==</span> <span class="s1">'global'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                    <span class="n">name</span> <span class="o">=</span> <span class="s1">'global '</span> <span class="o">+</span> <span class="n">name</span>
 | 
				
			||||||
 | 
					                <span class="k">elif</span> <span class="n">where</span> <span class="o">==</span> <span class="s1">'local'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                    <span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
 | 
				
			||||||
 | 
					                <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                    <span class="n">name</span> <span class="o">=</span> <span class="n">where</span> <span class="o">+</span> <span class="n">name</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'.'</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
 | 
				
			||||||
 | 
					                <span class="n">dump</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'</span><span class="si">%s</span><span class="s1"> = </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">pydoc</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">repr</span><span class="p">(</span><span class="n">value</span><span class="p">)))</span>
 | 
				
			||||||
 | 
					            <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="n">dump</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">name</span> <span class="o">+</span> <span class="s1">' undefined'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="n">rows</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">dump</span><span class="p">))</span>
 | 
				
			||||||
 | 
					        <span class="n">frames</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">rows</span><span class="p">))</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="n">exception</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'</span><span class="si">%s</span><span class="s1">: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">etype</span><span class="p">),</span> <span class="nb">str</span><span class="p">(</span><span class="n">evalue</span><span class="p">))]</span>
 | 
				
			||||||
 | 
					    <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">evalue</span><span class="p">,</span> <span class="n">types</span><span class="o">.</span><span class="n">InstanceType</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="nb">dir</span><span class="p">(</span><span class="n">evalue</span><span class="p">):</span>
 | 
				
			||||||
 | 
					            <span class="n">value</span> <span class="o">=</span> <span class="n">pydoc</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">repr</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">evalue</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span>
 | 
				
			||||||
 | 
					            <span class="n">exception</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="si">%s%s</span><span class="s1"> = </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="s2">" "</span> <span class="o">*</span> <span class="mi">4</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="kn">import</span> <span class="nn">traceback</span>
 | 
				
			||||||
 | 
					    <span class="k">return</span> <span class="n">head</span> <span class="o">+</span> <span class="s1">''</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">frames</span><span class="p">)</span> <span class="o">+</span> <span class="s1">''</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">exception</span><span class="p">)</span> <span class="o">+</span> <span class="s1">'''</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="s1">The above is a description of an error in a Python program.  Here is</span>
 | 
				
			||||||
 | 
					<span class="s1">the original traceback:</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="si">%s</span><span class="s1"></span>
 | 
				
			||||||
 | 
					<span class="s1">'''</span> <span class="o">%</span> <span class="s1">''</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">traceback</span><span class="o">.</span><span class="n">format_exception</span><span class="p">(</span><span class="n">etype</span><span class="p">,</span> <span class="n">evalue</span><span class="p">,</span> <span class="n">etb</span><span class="p">))</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="Hook"><a class="viewcode-back" href="../../agitb.html#asterisk.agitb.Hook">[docs]</a><span class="k">class</span> <span class="nc">Hook</span><span class="p">:</span>
 | 
				
			||||||
 | 
					    <span class="sd">"""A hook to replace sys.excepthook that shows tracebacks in HTML."""</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">display</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">logdir</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> <span class="nb">file</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
 | 
				
			||||||
 | 
					                 <span class="n">agi</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">display</span> <span class="o">=</span> <span class="n">display</span>          <span class="c1"># send tracebacks to browser if true</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">logdir</span> <span class="o">=</span> <span class="n">logdir</span>            <span class="c1"># log tracebacks to files if not None</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">context</span> <span class="o">=</span> <span class="n">context</span>          <span class="c1"># number of source code lines per frame</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">file</span> <span class="o">=</span> <span class="nb">file</span> <span class="ow">or</span> <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span>  <span class="c1"># place to send the output</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">agi</span> <span class="o">=</span> <span class="n">agi</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">etype</span><span class="p">,</span> <span class="n">evalue</span><span class="p">,</span> <span class="n">etb</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">((</span><span class="n">etype</span><span class="p">,</span> <span class="n">evalue</span><span class="p">,</span> <span class="n">etb</span><span class="p">))</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">info</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="n">info</span> <span class="o">=</span> <span class="n">info</span> <span class="ow">or</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">doc</span> <span class="o">=</span> <span class="n">text</span><span class="p">(</span><span class="n">info</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">context</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="k">except</span><span class="p">:</span>                         <span class="c1"># just in case something goes wrong</span>
 | 
				
			||||||
 | 
					            <span class="kn">import</span> <span class="nn">traceback</span>
 | 
				
			||||||
 | 
					            <span class="n">doc</span> <span class="o">=</span> <span class="s1">''</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">traceback</span><span class="o">.</span><span class="n">format_exception</span><span class="p">(</span><span class="o">*</span><span class="n">info</span><span class="p">))</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">display</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">agi</span><span class="p">:</span>   <span class="c1"># print to agi</span>
 | 
				
			||||||
 | 
					                <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">doc</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">):</span>
 | 
				
			||||||
 | 
					                    <span class="bp">self</span><span class="o">.</span><span class="n">agi</span><span class="o">.</span><span class="n">verbose</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
 | 
				
			||||||
 | 
					            <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">doc</span> <span class="o">+</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">agi</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="bp">self</span><span class="o">.</span><span class="n">agi</span><span class="o">.</span><span class="n">verbose</span><span class="p">(</span><span class="s1">'A problem occured in a python script'</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'A problem occured in a python script</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">logdir</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="kn">import</span> <span class="nn">os</span>
 | 
				
			||||||
 | 
					            <span class="kn">import</span> <span class="nn">tempfile</span>
 | 
				
			||||||
 | 
					            <span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span> <span class="o">=</span> <span class="n">tempfile</span><span class="o">.</span><span class="n">mkstemp</span><span class="p">(</span><span class="n">suffix</span><span class="o">=</span><span class="s1">'.txt'</span><span class="p">,</span> <span class="nb">dir</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">logdir</span><span class="p">)</span>
 | 
				
			||||||
 | 
					            <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="nb">file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">fdopen</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					                <span class="nb">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">doc</span><span class="p">)</span>
 | 
				
			||||||
 | 
					                <span class="nb">file</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
 | 
				
			||||||
 | 
					                <span class="n">msg</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> contains the description of this error.'</span> <span class="o">%</span> <span class="n">path</span>
 | 
				
			||||||
 | 
					            <span class="k">except</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="n">msg</span> <span class="o">=</span> <span class="s1">'Tried to save traceback to </span><span class="si">%s</span><span class="s1">, but failed.'</span> <span class="o">%</span> <span class="n">path</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">agi</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="bp">self</span><span class="o">.</span><span class="n">agi</span><span class="o">.</span><span class="n">verbose</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
 | 
				
			||||||
 | 
					            <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">msg</span> <span class="o">+</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
 | 
				
			||||||
 | 
					        <span class="k">except</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">pass</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="n">handler</span> <span class="o">=</span> <span class="n">Hook</span><span class="p">()</span><span class="o">.</span><span class="n">handle</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="enable"><a class="viewcode-back" href="../../agitb.html#asterisk.agitb.enable">[docs]</a><span class="k">def</span> <span class="nf">enable</span><span class="p">(</span><span class="n">agi</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">display</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">logdir</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="mi">5</span><span class="p">):</span>
 | 
				
			||||||
 | 
					    <span class="sd">"""Install an exception handler that formats tracebacks as HTML.</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">    The optional argument 'display' can be set to 0 to suppress sending the</span>
 | 
				
			||||||
 | 
					<span class="sd">    traceback to the browser, and 'logdir' can be set to a directory to cause</span>
 | 
				
			||||||
 | 
					<span class="sd">    tracebacks to be written to files there."""</span>
 | 
				
			||||||
 | 
					    <span class="n">except_hook</span> <span class="o">=</span> <span class="n">Hook</span><span class="p">(</span><span class="n">display</span><span class="o">=</span><span class="n">display</span><span class="p">,</span> <span class="n">logdir</span><span class="o">=</span><span class="n">logdir</span><span class="p">,</span>
 | 
				
			||||||
 | 
					                       <span class="n">context</span><span class="o">=</span><span class="n">context</span><span class="p">,</span> <span class="n">agi</span><span class="o">=</span><span class="n">agi</span><span class="p">)</span>
 | 
				
			||||||
 | 
					    <span class="n">sys</span><span class="o">.</span><span class="n">excepthook</span> <span class="o">=</span> <span class="n">except_hook</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">global</span> <span class="n">handler</span>
 | 
				
			||||||
 | 
					    <span class="n">handler</span> <span class="o">=</span> <span class="n">except_hook</span><span class="o">.</span><span class="n">handle</span></div>
 | 
				
			||||||
 | 
					</pre></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
 | 
				
			||||||
 | 
					        <div class="sphinxsidebarwrapper"><div class="relations">
 | 
				
			||||||
 | 
					<h3>Related Topics</h3>
 | 
				
			||||||
 | 
					<ul>
 | 
				
			||||||
 | 
					  <li><a href="../../index.html">Documentation overview</a><ul>
 | 
				
			||||||
 | 
					  <li><a href="../index.html">Module code</a><ul>
 | 
				
			||||||
 | 
					  </ul></li>
 | 
				
			||||||
 | 
					  </ul></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div id="searchbox" style="display: none" role="search">
 | 
				
			||||||
 | 
					  <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="footer">
 | 
				
			||||||
 | 
					      ©2016, Randall Degges.
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      |
 | 
				
			||||||
 | 
					      Powered by <a href="http://sphinx-doc.org/">Sphinx 1.3.6</a>
 | 
				
			||||||
 | 
					      & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.7</a>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  </body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
							
								
								
									
										767
									
								
								html/_modules/asterisk/manager.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,767 @@
 | 
				
			|||||||
 | 
					<!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>asterisk.manager — pyst2 0.4.9 documentation</title>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <link rel="stylesheet" href="../../_static/alabaster.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.4.9',
 | 
				
			||||||
 | 
					        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="pyst2 0.4.9 documentation" href="../../index.html" />
 | 
				
			||||||
 | 
					    <link rel="up" title="Module code" href="../index.html" />
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </head>
 | 
				
			||||||
 | 
					  <body role="document">  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div class="document">
 | 
				
			||||||
 | 
					      <div class="documentwrapper">
 | 
				
			||||||
 | 
					        <div class="bodywrapper">
 | 
				
			||||||
 | 
					          <div class="body" role="main">
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					  <h1>Source code for asterisk.manager</h1><div class="highlight"><pre>
 | 
				
			||||||
 | 
					<span></span><span class="ch">#!/usr/bin/env python</span>
 | 
				
			||||||
 | 
					<span class="c1"># vim: set expandtab shiftwidth=4:</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">"""</span>
 | 
				
			||||||
 | 
					<span class="sd">.. module:: manager</span>
 | 
				
			||||||
 | 
					<span class="sd">   :synopsis: Python Interface for Asterisk Manager</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">This module provides a Python API for interfacing with the asterisk manager.</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">Example</span>
 | 
				
			||||||
 | 
					<span class="sd">-------</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">.. code-block:: python</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">   import asterisk.manager</span>
 | 
				
			||||||
 | 
					<span class="sd">   import sys</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">   def handle_shutdown(event, manager):</span>
 | 
				
			||||||
 | 
					<span class="sd">      print "Recieved shutdown event"</span>
 | 
				
			||||||
 | 
					<span class="sd">      manager.close()</span>
 | 
				
			||||||
 | 
					<span class="sd">      # we could analize the event and reconnect here</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">   def handle_event(event, manager):</span>
 | 
				
			||||||
 | 
					<span class="sd">      print "Recieved event: %s" % event.name</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">   manager = asterisk.manager.Manager()</span>
 | 
				
			||||||
 | 
					<span class="sd">   try:</span>
 | 
				
			||||||
 | 
					<span class="sd">       # connect to the manager</span>
 | 
				
			||||||
 | 
					<span class="sd">       try:</span>
 | 
				
			||||||
 | 
					<span class="sd">          manager.connect('host')</span>
 | 
				
			||||||
 | 
					<span class="sd">          manager.login('user', 'secret')</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">           # register some callbacks</span>
 | 
				
			||||||
 | 
					<span class="sd">           manager.register_event('Shutdown', handle_shutdown) # shutdown</span>
 | 
				
			||||||
 | 
					<span class="sd">           manager.register_event('*', handle_event)           # catch all</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">           # get a status report</span>
 | 
				
			||||||
 | 
					<span class="sd">           response = manager.status()</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">           manager.logoff()</span>
 | 
				
			||||||
 | 
					<span class="sd">       except asterisk.manager.ManagerSocketException as e:</span>
 | 
				
			||||||
 | 
					<span class="sd">          print "Error connecting to the manager: %s" % e.strerror</span>
 | 
				
			||||||
 | 
					<span class="sd">          sys.exit(1)</span>
 | 
				
			||||||
 | 
					<span class="sd">       except asterisk.manager.ManagerAuthException as e:</span>
 | 
				
			||||||
 | 
					<span class="sd">          print "Error logging in to the manager: %s" % e.strerror</span>
 | 
				
			||||||
 | 
					<span class="sd">          sys.exit(1)</span>
 | 
				
			||||||
 | 
					<span class="sd">       except asterisk.manager.ManagerException as e:</span>
 | 
				
			||||||
 | 
					<span class="sd">          print "Error: %s" % e.strerror</span>
 | 
				
			||||||
 | 
					<span class="sd">          sys.exit(1)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">   finally:</span>
 | 
				
			||||||
 | 
					<span class="sd">      # remember to clean up</span>
 | 
				
			||||||
 | 
					<span class="sd">      manager.close()</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">Remember all header, response, and event names are case sensitive.</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">Not all manager actions are implmented as of yet, feel free to add them</span>
 | 
				
			||||||
 | 
					<span class="sd">and submit patches.</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">Specification</span>
 | 
				
			||||||
 | 
					<span class="sd">-------------</span>
 | 
				
			||||||
 | 
					<span class="sd">"""</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="kn">import</span> <span class="nn">sys</span>
 | 
				
			||||||
 | 
					<span class="kn">import</span> <span class="nn">os</span>
 | 
				
			||||||
 | 
					<span class="kn">import</span> <span class="nn">socket</span>
 | 
				
			||||||
 | 
					<span class="kn">import</span> <span class="nn">threading</span>
 | 
				
			||||||
 | 
					<span class="kn">from</span> <span class="nn">six</span> <span class="kn">import</span> <span class="n">PY3</span>
 | 
				
			||||||
 | 
					<span class="kn">from</span> <span class="nn">six.moves</span> <span class="kn">import</span> <span class="n">queue</span>
 | 
				
			||||||
 | 
					<span class="kn">import</span> <span class="nn">re</span>
 | 
				
			||||||
 | 
					<span class="kn">from</span> <span class="nn">types</span> <span class="kn">import</span> <span class="o">*</span>
 | 
				
			||||||
 | 
					<span class="kn">from</span> <span class="nn">time</span> <span class="kn">import</span> <span class="n">sleep</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="n">EOL</span> <span class="o">=</span> <span class="s1">'</span><span class="se">\r\n</span><span class="s1">'</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="ManagerMsg"><a class="viewcode-back" href="../../manager.html#asterisk.manager.ManagerMsg">[docs]</a><span class="k">class</span> <span class="nc">ManagerMsg</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
 | 
				
			||||||
 | 
					    <span class="sd">"""A manager interface message"""</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">response</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="c1"># the raw response, straight from the horse's mouth:</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">response</span> <span class="o">=</span> <span class="n">response</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s1">''</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">headers</span> <span class="o">=</span> <span class="p">{}</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># parse the response</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">response</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># This is an unknown message, may happen if a command (notably</span>
 | 
				
			||||||
 | 
					        <span class="c1"># 'dialplan show something') contains a \n\r\n sequence in the</span>
 | 
				
			||||||
 | 
					        <span class="c1"># middle of output. We hope this happens only *once* during a</span>
 | 
				
			||||||
 | 
					        <span class="c1"># misbehaved command *and* the command ends with --END COMMAND--</span>
 | 
				
			||||||
 | 
					        <span class="c1"># in that case we return an Event.  Otherwise we asume it is</span>
 | 
				
			||||||
 | 
					        <span class="c1"># from a misbehaving command not returning a proper header (e.g.</span>
 | 
				
			||||||
 | 
					        <span class="c1"># IAXnetstats in Asterisk 1.4.X)</span>
 | 
				
			||||||
 | 
					        <span class="c1"># A better solution is probably to retain some knowledge of</span>
 | 
				
			||||||
 | 
					        <span class="c1"># commands sent and their expected return syntax. In that case</span>
 | 
				
			||||||
 | 
					        <span class="c1"># we could wait for --END COMMAND-- for 'command'.</span>
 | 
				
			||||||
 | 
					        <span class="c1"># B0rken in asterisk. This should be parseable without context.</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="s1">'Event'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span> <span class="ow">and</span> <span class="s1">'Response'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="c1"># there are commands that return the ActionID but not</span>
 | 
				
			||||||
 | 
					            <span class="c1"># 'Response', e.g., IAXpeers in Asterisk 1.4.X</span>
 | 
				
			||||||
 | 
					            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_header</span><span class="p">(</span><span class="s1">'ActionID'</span><span class="p">):</span>
 | 
				
			||||||
 | 
					                <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">'Response'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Generated Header'</span>
 | 
				
			||||||
 | 
					            <span class="k">elif</span> <span class="s1">'--END COMMAND--'</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">'Event'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'NoClue'</span>
 | 
				
			||||||
 | 
					            <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">'Response'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Generated Header'</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="ManagerMsg.parse"><a class="viewcode-back" href="../../manager.html#asterisk.manager.ManagerMsg.parse">[docs]</a>    <span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">response</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Parse a manager message"""</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="n">data</span> <span class="o">=</span> <span class="p">[]</span>
 | 
				
			||||||
 | 
					        <span class="k">for</span> <span class="n">n</span><span class="p">,</span> <span class="n">line</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">response</span><span class="p">):</span>
 | 
				
			||||||
 | 
					            <span class="c1"># all valid header lines end in \r\n</span>
 | 
				
			||||||
 | 
					            <span class="k">if</span> <span class="ow">not</span> <span class="n">line</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">'</span><span class="se">\r\n</span><span class="s1">'</span><span class="p">):</span>
 | 
				
			||||||
 | 
					                <span class="n">data</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">response</span><span class="p">[</span><span class="n">n</span><span class="p">:])</span>
 | 
				
			||||||
 | 
					                <span class="k">break</span>
 | 
				
			||||||
 | 
					            <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">':'</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
 | 
				
			||||||
 | 
					                <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
 | 
				
			||||||
 | 
					            <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="c1"># invalid header, start of multi-line data response</span>
 | 
				
			||||||
 | 
					                <span class="n">data</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">response</span><span class="p">[</span><span class="n">n</span><span class="p">:])</span>
 | 
				
			||||||
 | 
					                <span class="k">break</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s1">''</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">data</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="ManagerMsg.has_header"><a class="viewcode-back" href="../../manager.html#asterisk.manager.ManagerMsg.has_header">[docs]</a>    <span class="k">def</span> <span class="nf">has_header</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hname</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Check for a header"""</span>
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="n">hname</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="ManagerMsg.get_header"><a class="viewcode-back" href="../../manager.html#asterisk.manager.ManagerMsg.get_header">[docs]</a>    <span class="k">def</span> <span class="nf">get_header</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hname</span><span class="p">,</span> <span class="n">defval</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Return the specfied header"""</span>
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">hname</span><span class="p">,</span> <span class="n">defval</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hname</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Return the specfied header"""</span>
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="n">hname</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">if</span> <span class="s1">'Response'</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">'Response'</span><span class="p">]</span>
 | 
				
			||||||
 | 
					        <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">'Event'</span><span class="p">]</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="Event"><a class="viewcode-back" href="../../manager.html#asterisk.manager.Event">[docs]</a><span class="k">class</span> <span class="nc">Event</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
 | 
				
			||||||
 | 
					    <span class="sd">"""Manager interface Events, __init__ expects and 'Event' message"""</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">message</span><span class="p">):</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># store all of the event data</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="n">message</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">headers</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">headers</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># if this is not an event message we have a problem</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">has_header</span><span class="p">(</span><span class="s1">'Event'</span><span class="p">):</span>
 | 
				
			||||||
 | 
					            <span class="k">raise</span> <span class="n">ManagerException</span><span class="p">(</span>
 | 
				
			||||||
 | 
					                <span class="s1">'Trying to create event from non event message'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># get the event name</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">get_header</span><span class="p">(</span><span class="s1">'Event'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="Event.has_header"><a class="viewcode-back" href="../../manager.html#asterisk.manager.Event.has_header">[docs]</a>    <span class="k">def</span> <span class="nf">has_header</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hname</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Check for a header"""</span>
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="n">hname</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="viewcode-block" id="Event.get_header"><a class="viewcode-back" href="../../manager.html#asterisk.manager.Event.get_header">[docs]</a>    <span class="k">def</span> <span class="nf">get_header</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hname</span><span class="p">,</span> <span class="n">defval</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Return the specfied header"""</span>
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">hname</span><span class="p">,</span> <span class="n">defval</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hname</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Return the specfied header"""</span>
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="n">hname</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="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">'Event'</span><span class="p">]</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">get_action_id</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">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'ActionID'</span><span class="p">,</span> <span class="mo">0000</span><span class="p">)</span></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="k">class</span> <span class="nc">Manager</span><span class="p">(</span><span class="nb">object</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="bp">self</span><span class="o">.</span><span class="n">_sock</span> <span class="o">=</span> <span class="bp">None</span>     <span class="c1"># our socket</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">title</span> <span class="o">=</span> <span class="bp">None</span>     <span class="c1"># set by received greeting</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">_connected</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Event</span><span class="p">()</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">_running</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Event</span><span class="p">()</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># our hostname</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">hostname</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostname</span><span class="p">()</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># our queues</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">_message_queue</span> <span class="o">=</span> <span class="n">queue</span><span class="o">.</span><span class="n">Queue</span><span class="p">()</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">_response_queue</span> <span class="o">=</span> <span class="n">queue</span><span class="o">.</span><span class="n">Queue</span><span class="p">()</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">_event_queue</span> <span class="o">=</span> <span class="n">queue</span><span class="o">.</span><span class="n">Queue</span><span class="p">()</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># callbacks for events</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">_event_callbacks</span> <span class="o">=</span> <span class="p">{}</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">_reswaiting</span> <span class="o">=</span> <span class="p">[]</span>  <span class="c1"># who is waiting for a response</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># sequence stuff</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">_seqlock</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Lock</span><span class="p">()</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">_seq</span> <span class="o">=</span> <span class="mi">0</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># some threads</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">message_thread</span> <span class="o">=</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="bp">self</span><span class="o">.</span><span class="n">message_loop</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">event_dispatch_thread</span> <span class="o">=</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="bp">self</span><span class="o">.</span><span class="n">event_dispatch</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">message_thread</span><span class="o">.</span><span class="n">setDaemon</span><span class="p">(</span><span class="bp">True</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">event_dispatch_thread</span><span class="o">.</span><span class="n">setDaemon</span><span class="p">(</span><span class="bp">True</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">__del__</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">close</span><span class="p">()</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">connected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""</span>
 | 
				
			||||||
 | 
					<span class="sd">        Check if we are connected or not.</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connected</span><span class="o">.</span><span class="n">isSet</span><span class="p">()</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">next_seq</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Return the next number in the sequence, this is used for ActionID"""</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">_seqlock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
 | 
				
			||||||
 | 
					        <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_seq</span>
 | 
				
			||||||
 | 
					        <span class="k">finally</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="bp">self</span><span class="o">.</span><span class="n">_seq</span> <span class="o">+=</span> <span class="mi">1</span>
 | 
				
			||||||
 | 
					            <span class="bp">self</span><span class="o">.</span><span class="n">_seqlock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">send_action</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cdict</span><span class="o">=</span><span class="p">{},</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""</span>
 | 
				
			||||||
 | 
					<span class="sd">        Send a command to the manager</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">        If a list is passed to the cdict argument, each item in the list will</span>
 | 
				
			||||||
 | 
					<span class="sd">        be sent to asterisk under the same header in the following manner:</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">        cdict = {"Action": "Originate",</span>
 | 
				
			||||||
 | 
					<span class="sd">                 "Variable": ["var1=value", "var2=value"]}</span>
 | 
				
			||||||
 | 
					<span class="sd">        send_action(cdict)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">        ...</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="sd">        Action: Originate</span>
 | 
				
			||||||
 | 
					<span class="sd">        Variable: var1=value</span>
 | 
				
			||||||
 | 
					<span class="sd">        Variable: var2=value</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connected</span><span class="o">.</span><span class="n">isSet</span><span class="p">():</span>
 | 
				
			||||||
 | 
					            <span class="k">raise</span> <span class="n">ManagerException</span><span class="p">(</span><span class="s2">"Not connected"</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># fill in our args</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># set the action id</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="s1">'ActionID'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">cdict</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">cdict</span><span class="p">[</span><span class="s1">'ActionID'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">-</span><span class="si">%08x</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">hostname</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">next_seq</span><span class="p">())</span>
 | 
				
			||||||
 | 
					        <span class="n">clist</span> <span class="o">=</span> <span class="p">[]</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># generate the command</span>
 | 
				
			||||||
 | 
					        <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">cdict</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
 | 
				
			||||||
 | 
					            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
 | 
				
			||||||
 | 
					                <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                    <span class="n">item</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">([</span><span class="n">key</span><span class="p">,</span> <span class="n">item</span><span class="p">])</span>
 | 
				
			||||||
 | 
					                    <span class="n">clist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'</span><span class="si">%s</span><span class="s1">: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">item</span><span class="p">)</span>
 | 
				
			||||||
 | 
					            <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="n">item</span> <span class="o">=</span> <span class="nb">tuple</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">clist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'</span><span class="si">%s</span><span class="s1">: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">item</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">clist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">EOL</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">command</span> <span class="o">=</span> <span class="n">EOL</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">clist</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># lock the socket and send our command</span>
 | 
				
			||||||
 | 
					        <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="bp">self</span><span class="o">.</span><span class="n">_sock</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">encode</span><span class="p">(</span><span class="s1">'utf8'</span><span class="p">))</span>
 | 
				
			||||||
 | 
					            <span class="bp">self</span><span class="o">.</span><span class="n">_sock</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
 | 
				
			||||||
 | 
					        <span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">raise</span> <span class="n">ManagerSocketException</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">errno</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">strerror</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">_reswaiting</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_response_queue</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">_reswaiting</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="ow">not</span> <span class="n">response</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">raise</span> <span class="n">ManagerSocketException</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="s1">'Connection Terminated'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="n">response</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">_receive_data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""</span>
 | 
				
			||||||
 | 
					<span class="sd">        Read the response from a command.</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="n">multiline</span> <span class="o">=</span> <span class="bp">False</span>
 | 
				
			||||||
 | 
					        <span class="n">status</span> <span class="o">=</span> <span class="bp">False</span>
 | 
				
			||||||
 | 
					        <span class="n">wait_for_marker</span> <span class="o">=</span> <span class="bp">False</span>
 | 
				
			||||||
 | 
					        <span class="n">eolcount</span> <span class="o">=</span> <span class="mi">0</span>
 | 
				
			||||||
 | 
					        <span class="c1"># loop while we are sill running and connected</span>
 | 
				
			||||||
 | 
					        <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">_running</span><span class="o">.</span><span class="n">isSet</span><span class="p">()</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connected</span><span class="o">.</span><span class="n">isSet</span><span class="p">():</span>
 | 
				
			||||||
 | 
					            <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="n">lines</span> <span class="o">=</span> <span class="p">[]</span>
 | 
				
			||||||
 | 
					                <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sock</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                    <span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">'utf8'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					                    <span class="c1"># check to see if this is the greeting line</span>
 | 
				
			||||||
 | 
					                    <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">title</span> <span class="ow">and</span> <span class="s1">'/'</span> <span class="ow">in</span> <span class="n">line</span> <span class="ow">and</span> <span class="ow">not</span> <span class="s1">':'</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                        <span class="c1"># store the title of the manager we are connecting to:</span>
 | 
				
			||||||
 | 
					                        <span class="bp">self</span><span class="o">.</span><span class="n">title</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
 | 
				
			||||||
 | 
					                        <span class="c1"># store the version of the manager we are connecting to:</span>
 | 
				
			||||||
 | 
					                        <span class="bp">self</span><span class="o">.</span><span class="n">version</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
 | 
				
			||||||
 | 
					                        <span class="c1"># fake message header</span>
 | 
				
			||||||
 | 
					                        <span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'Response: Generated Header</span><span class="se">\r\n</span><span class="s1">'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					                        <span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
 | 
				
			||||||
 | 
					                        <span class="k">break</span>
 | 
				
			||||||
 | 
					                    <span class="c1"># If the line is EOL marker we have a complete message.</span>
 | 
				
			||||||
 | 
					                    <span class="c1"># Some commands are broken and contain a \n\r\n</span>
 | 
				
			||||||
 | 
					                    <span class="c1"># sequence, in the case wait_for_marker is set, we</span>
 | 
				
			||||||
 | 
					                    <span class="c1"># have such a command where the data ends with the</span>
 | 
				
			||||||
 | 
					                    <span class="c1"># marker --END COMMAND--, so we ignore embedded</span>
 | 
				
			||||||
 | 
					                    <span class="c1"># newlines until we see that marker</span>
 | 
				
			||||||
 | 
					                    <span class="k">if</span> <span class="n">line</span> <span class="o">==</span> <span class="n">EOL</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">wait_for_marker</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                        <span class="n">multiline</span> <span class="o">=</span> <span class="bp">False</span>
 | 
				
			||||||
 | 
					                        <span class="k">if</span> <span class="n">lines</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connected</span><span class="o">.</span><span class="n">isSet</span><span class="p">():</span>
 | 
				
			||||||
 | 
					                            <span class="k">break</span>
 | 
				
			||||||
 | 
					                        <span class="c1"># ignore empty lines at start</span>
 | 
				
			||||||
 | 
					                        <span class="k">continue</span>
 | 
				
			||||||
 | 
					                    <span class="c1"># If the user executed the status command, it's a special</span>
 | 
				
			||||||
 | 
					                    <span class="c1"># case, so we need to look for a marker.</span>
 | 
				
			||||||
 | 
					                    <span class="k">if</span> <span class="s1">'status will follow'</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                        <span class="n">status</span> <span class="o">=</span> <span class="bp">True</span>
 | 
				
			||||||
 | 
					                        <span class="n">wait_for_marker</span> <span class="o">=</span> <span class="bp">True</span>
 | 
				
			||||||
 | 
					                    <span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    <span class="c1"># line not ending in \r\n or without ':' isn't a</span>
 | 
				
			||||||
 | 
					                    <span class="c1"># valid header and starts multiline response</span>
 | 
				
			||||||
 | 
					                    <span class="k">if</span> <span class="ow">not</span> <span class="n">line</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">'</span><span class="se">\r\n</span><span class="s1">'</span><span class="p">)</span> <span class="ow">or</span> <span class="s1">':'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                        <span class="n">multiline</span> <span class="o">=</span> <span class="bp">True</span>
 | 
				
			||||||
 | 
					                    <span class="c1"># Response: Follows indicates we should wait for end</span>
 | 
				
			||||||
 | 
					                    <span class="c1"># marker --END COMMAND--</span>
 | 
				
			||||||
 | 
					                    <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">multiline</span> <span class="ow">or</span> <span class="n">status</span><span class="p">)</span> <span class="ow">and</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'Response'</span><span class="p">)</span> <span class="ow">and</span> \
 | 
				
			||||||
 | 
					                            <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">':'</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="o">==</span> <span class="s1">'Follows'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                        <span class="n">wait_for_marker</span> <span class="o">=</span> <span class="bp">True</span>
 | 
				
			||||||
 | 
					                    <span class="c1"># same when seeing end of multiline response</span>
 | 
				
			||||||
 | 
					                    <span class="k">if</span> <span class="n">multiline</span> <span class="ow">and</span> <span class="p">(</span><span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'--END COMMAND--'</span><span class="p">)</span> <span class="ow">or</span> <span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">'--END COMMAND--'</span><span class="p">)):</span>
 | 
				
			||||||
 | 
					                        <span class="n">wait_for_marker</span> <span class="o">=</span> <span class="bp">False</span>
 | 
				
			||||||
 | 
					                        <span class="n">multiline</span> <span class="o">=</span> <span class="bp">False</span>
 | 
				
			||||||
 | 
					                    <span class="c1"># same when seeing end of status response</span>
 | 
				
			||||||
 | 
					                    <span class="k">if</span> <span class="n">status</span> <span class="ow">and</span> <span class="s1">'StatusComplete'</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                        <span class="n">wait_for_marker</span> <span class="o">=</span> <span class="bp">False</span>
 | 
				
			||||||
 | 
					                        <span class="n">status</span> <span class="o">=</span> <span class="bp">False</span>
 | 
				
			||||||
 | 
					                    <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connected</span><span class="o">.</span><span class="n">isSet</span><span class="p">():</span>
 | 
				
			||||||
 | 
					                        <span class="k">break</span>
 | 
				
			||||||
 | 
					                <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                    <span class="c1"># EOF during reading</span>
 | 
				
			||||||
 | 
					                    <span class="bp">self</span><span class="o">.</span><span class="n">_sock</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
 | 
				
			||||||
 | 
					                    <span class="bp">self</span><span class="o">.</span><span class="n">_connected</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
 | 
				
			||||||
 | 
					                <span class="c1"># if we have a message append it to our queue</span>
 | 
				
			||||||
 | 
					                <span class="k">if</span> <span class="n">lines</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connected</span><span class="o">.</span><span class="n">isSet</span><span class="p">():</span>
 | 
				
			||||||
 | 
					                    <span class="bp">self</span><span class="o">.</span><span class="n">_message_queue</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span>
 | 
				
			||||||
 | 
					                <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                    <span class="bp">self</span><span class="o">.</span><span class="n">_message_queue</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
 | 
				
			||||||
 | 
					            <span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="bp">self</span><span class="o">.</span><span class="n">_sock</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
 | 
				
			||||||
 | 
					                <span class="bp">self</span><span class="o">.</span><span class="n">_connected</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
 | 
				
			||||||
 | 
					                <span class="bp">self</span><span class="o">.</span><span class="n">_message_queue</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">register_event</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">function</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""</span>
 | 
				
			||||||
 | 
					<span class="sd">        Register a callback for the specfied event.</span>
 | 
				
			||||||
 | 
					<span class="sd">        If a callback function returns True, no more callbacks for that</span>
 | 
				
			||||||
 | 
					<span class="sd">        event will be executed.</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># get the current value, or an empty list</span>
 | 
				
			||||||
 | 
					        <span class="c1"># then add our new callback</span>
 | 
				
			||||||
 | 
					        <span class="n">current_callbacks</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_event_callbacks</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="p">[])</span>
 | 
				
			||||||
 | 
					        <span class="n">current_callbacks</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">function</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">_event_callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]</span> <span class="o">=</span> <span class="n">current_callbacks</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">unregister_event</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">function</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""</span>
 | 
				
			||||||
 | 
					<span class="sd">        Unregister a callback for the specified event.</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					        <span class="n">current_callbacks</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_event_callbacks</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="p">[])</span>
 | 
				
			||||||
 | 
					        <span class="n">current_callbacks</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">function</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">_event_callbacks</span><span class="p">[</span><span class="n">event</span><span class="p">]</span> <span class="o">=</span> <span class="n">current_callbacks</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">message_loop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""</span>
 | 
				
			||||||
 | 
					<span class="sd">        The method for the event thread.</span>
 | 
				
			||||||
 | 
					<span class="sd">        This actually recieves all types of messages and places them</span>
 | 
				
			||||||
 | 
					<span class="sd">        in the proper queues.</span>
 | 
				
			||||||
 | 
					<span class="sd">        """</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># start a thread to recieve data</span>
 | 
				
			||||||
 | 
					        <span class="n">t</span> <span class="o">=</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="bp">self</span><span class="o">.</span><span class="n">_receive_data</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">t</span><span class="o">.</span><span class="n">setDaemon</span><span class="p">(</span><span class="bp">True</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="n">t</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="c1"># loop getting messages from the queue</span>
 | 
				
			||||||
 | 
					            <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">_running</span><span class="o">.</span><span class="n">isSet</span><span class="p">():</span>
 | 
				
			||||||
 | 
					                <span class="c1"># get/wait for messages</span>
 | 
				
			||||||
 | 
					                <span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message_queue</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <span class="c1"># if we got None as our message we are done</span>
 | 
				
			||||||
 | 
					                <span class="k">if</span> <span class="ow">not</span> <span class="n">data</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                    <span class="c1"># notify the other queues</span>
 | 
				
			||||||
 | 
					                    <span class="bp">self</span><span class="o">.</span><span class="n">_event_queue</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
 | 
				
			||||||
 | 
					                    <span class="k">for</span> <span class="n">waiter</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reswaiting</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                        <span class="bp">self</span><span class="o">.</span><span class="n">_response_queue</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
 | 
				
			||||||
 | 
					                    <span class="k">break</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <span class="c1"># parse the data</span>
 | 
				
			||||||
 | 
					                <span class="n">message</span> <span class="o">=</span> <span class="n">ManagerMsg</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <span class="c1"># check if this is an event message</span>
 | 
				
			||||||
 | 
					                <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">has_header</span><span class="p">(</span><span class="s1">'Event'</span><span class="p">):</span>
 | 
				
			||||||
 | 
					                    <span class="bp">self</span><span class="o">.</span><span class="n">_event_queue</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="n">Event</span><span class="p">(</span><span class="n">message</span><span class="p">))</span>
 | 
				
			||||||
 | 
					                <span class="c1"># check if this is a response</span>
 | 
				
			||||||
 | 
					                <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">has_header</span><span class="p">(</span><span class="s1">'Response'</span><span class="p">):</span>
 | 
				
			||||||
 | 
					                    <span class="bp">self</span><span class="o">.</span><span class="n">_response_queue</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
 | 
				
			||||||
 | 
					                <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                    <span class="k">print</span><span class="p">(</span><span class="s1">'No clue what we got</span><span class="se">\n</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="k">finally</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="c1"># wait for our data receiving thread to exit</span>
 | 
				
			||||||
 | 
					            <span class="n">t</span><span class="o">.</span><span class="n">join</span><span class="p">()</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">event_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""This thread is responsible for dispatching events"""</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># loop dispatching events</span>
 | 
				
			||||||
 | 
					        <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">_running</span><span class="o">.</span><span class="n">isSet</span><span class="p">():</span>
 | 
				
			||||||
 | 
					            <span class="c1"># get/wait for an event</span>
 | 
				
			||||||
 | 
					            <span class="n">ev</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_event_queue</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <span class="c1"># if we got None as an event, we are finished</span>
 | 
				
			||||||
 | 
					            <span class="k">if</span> <span class="ow">not</span> <span class="n">ev</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">break</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <span class="c1"># dispatch our events</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <span class="c1"># first build a list of the functions to execute</span>
 | 
				
			||||||
 | 
					            <span class="n">callbacks</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_event_callbacks</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">ev</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="p">[])</span>
 | 
				
			||||||
 | 
					                         <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">_event_callbacks</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'*'</span><span class="p">,</span> <span class="p">[]))</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <span class="c1"># now execute the functions</span>
 | 
				
			||||||
 | 
					            <span class="k">for</span> <span class="n">callback</span> <span class="ow">in</span> <span class="n">callbacks</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="k">if</span> <span class="n">callback</span><span class="p">(</span><span class="n">ev</span><span class="p">,</span> <span class="bp">self</span><span class="p">):</span>
 | 
				
			||||||
 | 
					                    <span class="k">break</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">5038</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Connect to the manager interface"""</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connected</span><span class="o">.</span><span class="n">isSet</span><span class="p">():</span>
 | 
				
			||||||
 | 
					            <span class="k">raise</span> <span class="n">ManagerException</span><span class="p">(</span><span class="s1">'Already connected to manager'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># make sure host is a string</span>
 | 
				
			||||||
 | 
					        <span class="k">assert</span> <span class="nb">type</span><span class="p">(</span><span class="n">host</span><span class="p">)</span> <span class="ow">is</span> <span class="nb">str</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="n">port</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">port</span><span class="p">)</span>  <span class="c1"># make sure port is an int</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># create our socket and connect</span>
 | 
				
			||||||
 | 
					        <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">_sock</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">)</span>
 | 
				
			||||||
 | 
					            <span class="n">_sock</span><span class="o">.</span><span class="n">connect</span><span class="p">((</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">))</span>
 | 
				
			||||||
 | 
					            <span class="k">if</span> <span class="n">PY3</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="bp">self</span><span class="o">.</span><span class="n">_sock</span> <span class="o">=</span> <span class="n">_sock</span><span class="o">.</span><span class="n">makefile</span><span class="p">(</span><span class="n">mode</span><span class="o">=</span><span class="s1">'rwb'</span><span class="p">,</span> <span class="n">buffering</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
 | 
				
			||||||
 | 
					            <span class="k">else</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="bp">self</span><span class="o">.</span><span class="n">_sock</span> <span class="o">=</span> <span class="n">_sock</span><span class="o">.</span><span class="n">makefile</span><span class="p">()</span>
 | 
				
			||||||
 | 
					            <span class="n">_sock</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
 | 
				
			||||||
 | 
					        <span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">raise</span> <span class="n">ManagerSocketException</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">errno</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">strerror</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># we are connected and running</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">_connected</span><span class="o">.</span><span class="n">set</span><span class="p">()</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">_running</span><span class="o">.</span><span class="n">set</span><span class="p">()</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># start the event thread</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">message_thread</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># start the event dispatching thread</span>
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">event_dispatch_thread</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># get our initial connection response</span>
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_response_queue</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Shutdown the connection to the manager"""</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># if we are still running, logout</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_running</span><span class="o">.</span><span class="n">isSet</span><span class="p">()</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connected</span><span class="o">.</span><span class="n">isSet</span><span class="p">():</span>
 | 
				
			||||||
 | 
					            <span class="bp">self</span><span class="o">.</span><span class="n">logoff</span><span class="p">()</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_running</span><span class="o">.</span><span class="n">isSet</span><span class="p">():</span>
 | 
				
			||||||
 | 
					            <span class="c1"># put None in the message_queue to kill our threads</span>
 | 
				
			||||||
 | 
					            <span class="bp">self</span><span class="o">.</span><span class="n">_message_queue</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <span class="c1"># wait for the event thread to exit</span>
 | 
				
			||||||
 | 
					            <span class="bp">self</span><span class="o">.</span><span class="n">message_thread</span><span class="o">.</span><span class="n">join</span><span class="p">()</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <span class="c1"># make sure we do not join our self (when close is called from event handlers)</span>
 | 
				
			||||||
 | 
					            <span class="k">if</span> <span class="n">threading</span><span class="o">.</span><span class="n">currentThread</span><span class="p">()</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">event_dispatch_thread</span><span class="p">:</span>
 | 
				
			||||||
 | 
					                <span class="c1"># wait for the dispatch thread to exit</span>
 | 
				
			||||||
 | 
					                <span class="bp">self</span><span class="o">.</span><span class="n">event_dispatch_thread</span><span class="o">.</span><span class="n">join</span><span class="p">()</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="bp">self</span><span class="o">.</span><span class="n">_running</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="c1"># Manager actions</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">login</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">secret</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Login to the manager, throws ManagerAuthException when login falis"""</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'Login'</span><span class="p">}</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span><span class="p">[</span><span class="s1">'Username'</span><span class="p">]</span> <span class="o">=</span> <span class="n">username</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span><span class="p">[</span><span class="s1">'Secret'</span><span class="p">]</span> <span class="o">=</span> <span class="n">secret</span>
 | 
				
			||||||
 | 
					        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">get_header</span><span class="p">(</span><span class="s1">'Response'</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'Error'</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="k">raise</span> <span class="n">ManagerAuthException</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">get_header</span><span class="p">(</span><span class="s1">'Message'</span><span class="p">))</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="n">response</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">ping</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Send a ping action to the manager"""</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'Ping'</span><span class="p">}</span>
 | 
				
			||||||
 | 
					        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="n">response</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">logoff</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Logoff from the manager"""</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'Logoff'</span><span class="p">}</span>
 | 
				
			||||||
 | 
					        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="n">response</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">hangup</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">channel</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Hangup the specified channel"""</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'Hangup'</span><span class="p">}</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span><span class="p">[</span><span class="s1">'Channel'</span><span class="p">]</span> <span class="o">=</span> <span class="n">channel</span>
 | 
				
			||||||
 | 
					        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="n">response</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">channel</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Get a status message from asterisk"""</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'Status'</span><span class="p">}</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span><span class="p">[</span><span class="s1">'Channel'</span><span class="p">]</span> <span class="o">=</span> <span class="n">channel</span>
 | 
				
			||||||
 | 
					        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="n">response</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">redirect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">channel</span><span class="p">,</span> <span class="n">exten</span><span class="p">,</span> <span class="n">priority</span><span class="o">=</span><span class="s1">'1'</span><span class="p">,</span> <span class="n">extra_channel</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Redirect a channel"""</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'Redirect'</span><span class="p">}</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span><span class="p">[</span><span class="s1">'Channel'</span><span class="p">]</span> <span class="o">=</span> <span class="n">channel</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span><span class="p">[</span><span class="s1">'Exten'</span><span class="p">]</span> <span class="o">=</span> <span class="n">exten</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span><span class="p">[</span><span class="s1">'Priority'</span><span class="p">]</span> <span class="o">=</span> <span class="n">priority</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">context</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">cdict</span><span class="p">[</span><span class="s1">'Context'</span><span class="p">]</span> <span class="o">=</span> <span class="n">context</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">extra_channel</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">cdict</span><span class="p">[</span><span class="s1">'ExtraChannel'</span><span class="p">]</span> <span class="o">=</span> <span class="n">extra_channel</span>
 | 
				
			||||||
 | 
					        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="n">response</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">originate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">channel</span><span class="p">,</span> <span class="n">exten</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">priority</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">caller_id</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">async</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">account</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">variables</span><span class="o">=</span><span class="p">{}):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Originate a call"""</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'Originate'</span><span class="p">}</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span><span class="p">[</span><span class="s1">'Channel'</span><span class="p">]</span> <span class="o">=</span> <span class="n">channel</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span><span class="p">[</span><span class="s1">'Exten'</span><span class="p">]</span> <span class="o">=</span> <span class="n">exten</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">context</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">cdict</span><span class="p">[</span><span class="s1">'Context'</span><span class="p">]</span> <span class="o">=</span> <span class="n">context</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">priority</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">cdict</span><span class="p">[</span><span class="s1">'Priority'</span><span class="p">]</span> <span class="o">=</span> <span class="n">priority</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">timeout</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">cdict</span><span class="p">[</span><span class="s1">'Timeout'</span><span class="p">]</span> <span class="o">=</span> <span class="n">timeout</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">caller_id</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">cdict</span><span class="p">[</span><span class="s1">'CallerID'</span><span class="p">]</span> <span class="o">=</span> <span class="n">caller_id</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">async</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">cdict</span><span class="p">[</span><span class="s1">'Async'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'yes'</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">account</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">cdict</span><span class="p">[</span><span class="s1">'Account'</span><span class="p">]</span> <span class="o">=</span> <span class="n">account</span>
 | 
				
			||||||
 | 
					        <span class="c1"># join dict of vairables together in a string in the form of 'key=val|key=val'</span>
 | 
				
			||||||
 | 
					        <span class="c1"># with the latest CVS HEAD this is no longer necessary</span>
 | 
				
			||||||
 | 
					        <span class="c1"># if variables: cdict['Variable'] = '|'.join(['='.join((str(key), str(value))) for key, value in variables.items()])</span>
 | 
				
			||||||
 | 
					        <span class="k">if</span> <span class="n">variables</span><span class="p">:</span>
 | 
				
			||||||
 | 
					            <span class="n">cdict</span><span class="p">[</span><span class="s1">'Variable'</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'='</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
 | 
				
			||||||
 | 
					                <span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">key</span><span class="p">),</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)))</span> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">variables</span><span class="o">.</span><span class="n">items</span><span class="p">()]</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="n">response</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">mailbox_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mailbox</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Get the status of the specfied mailbox"""</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'MailboxStatus'</span><span class="p">}</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span><span class="p">[</span><span class="s1">'Mailbox'</span><span class="p">]</span> <span class="o">=</span> <span class="n">mailbox</span>
 | 
				
			||||||
 | 
					        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="n">response</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">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="sd">"""Execute a command"""</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'Command'</span><span class="p">}</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span><span class="p">[</span><span class="s1">'Command'</span><span class="p">]</span> <span class="o">=</span> <span class="n">command</span>
 | 
				
			||||||
 | 
					        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="n">response</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">extension_state</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exten</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Get the state of an extension"""</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'ExtensionState'</span><span class="p">}</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span><span class="p">[</span><span class="s1">'Exten'</span><span class="p">]</span> <span class="o">=</span> <span class="n">exten</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span><span class="p">[</span><span class="s1">'Context'</span><span class="p">]</span> <span class="o">=</span> <span class="n">context</span>
 | 
				
			||||||
 | 
					        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="n">response</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">playdtmf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">channel</span><span class="p">,</span> <span class="n">digit</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Plays a dtmf digit on the specified channel"""</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'PlayDTMF'</span><span class="p">}</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span><span class="p">[</span><span class="s1">'Channel'</span><span class="p">]</span> <span class="o">=</span> <span class="n">channel</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span><span class="p">[</span><span class="s1">'Digit'</span><span class="p">]</span> <span class="o">=</span> <span class="n">digit</span>
 | 
				
			||||||
 | 
					        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="n">response</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">absolute_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">channel</span><span class="p">,</span> <span class="n">timeout</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">"""Set an absolute timeout on a channel"""</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'AbsoluteTimeout'</span><span class="p">}</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span><span class="p">[</span><span class="s1">'Channel'</span><span class="p">]</span> <span class="o">=</span> <span class="n">channel</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span><span class="p">[</span><span class="s1">'Timeout'</span><span class="p">]</span> <span class="o">=</span> <span class="n">timeout</span>
 | 
				
			||||||
 | 
					        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="n">response</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">mailbox_count</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mailbox</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'MailboxCount'</span><span class="p">}</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span><span class="p">[</span><span class="s1">'Mailbox'</span><span class="p">]</span> <span class="o">=</span> <span class="n">mailbox</span>
 | 
				
			||||||
 | 
					        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="n">response</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">sippeers</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'Sippeers'</span><span class="p">}</span>
 | 
				
			||||||
 | 
					        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="n">response</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">sipshowpeer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">peer</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'SIPshowpeer'</span><span class="p">}</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span><span class="p">[</span><span class="s1">'Peer'</span><span class="p">]</span> <span class="o">=</span> <span class="n">peer</span>
 | 
				
			||||||
 | 
					        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="n">response</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <span class="k">def</span> <span class="nf">reload</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">module</span><span class="p">):</span>
 | 
				
			||||||
 | 
					        <span class="sd">""" Reloads config for a given module """</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="n">cdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Action'</span><span class="p">:</span> <span class="s1">'Reload'</span><span class="p">}</span>
 | 
				
			||||||
 | 
					        <span class="n">cdict</span><span class="p">[</span><span class="s1">'Module'</span><span class="p">]</span> <span class="o">=</span> <span class="n">module</span>
 | 
				
			||||||
 | 
					        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">send_action</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span>
 | 
				
			||||||
 | 
					        <span class="k">return</span> <span class="n">response</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="k">class</span> <span class="nc">ManagerException</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
 | 
				
			||||||
 | 
					    <span class="k">pass</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="k">class</span> <span class="nc">ManagerSocketException</span><span class="p">(</span><span class="n">ManagerException</span><span class="p">):</span>
 | 
				
			||||||
 | 
					    <span class="k">pass</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="k">class</span> <span class="nc">ManagerAuthException</span><span class="p">(</span><span class="n">ManagerException</span><span class="p">):</span>
 | 
				
			||||||
 | 
					    <span class="k">pass</span>
 | 
				
			||||||
 | 
					</pre></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
 | 
				
			||||||
 | 
					        <div class="sphinxsidebarwrapper"><div class="relations">
 | 
				
			||||||
 | 
					<h3>Related Topics</h3>
 | 
				
			||||||
 | 
					<ul>
 | 
				
			||||||
 | 
					  <li><a href="../../index.html">Documentation overview</a><ul>
 | 
				
			||||||
 | 
					  <li><a href="../index.html">Module code</a><ul>
 | 
				
			||||||
 | 
					  </ul></li>
 | 
				
			||||||
 | 
					  </ul></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div id="searchbox" style="display: none" role="search">
 | 
				
			||||||
 | 
					  <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="footer">
 | 
				
			||||||
 | 
					      ©2016, Randall Degges.
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      |
 | 
				
			||||||
 | 
					      Powered by <a href="http://sphinx-doc.org/">Sphinx 1.3.6</a>
 | 
				
			||||||
 | 
					      & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.7</a>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  </body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
							
								
								
									
										86
									
								
								html/_modules/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,86 @@
 | 
				
			|||||||
 | 
					<!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 — pyst2 0.4.9 documentation</title>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <link rel="stylesheet" href="../_static/alabaster.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.4.9',
 | 
				
			||||||
 | 
					        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="pyst2 0.4.9 documentation" href="../index.html" />
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </head>
 | 
				
			||||||
 | 
					  <body role="document">  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div class="document">
 | 
				
			||||||
 | 
					      <div class="documentwrapper">
 | 
				
			||||||
 | 
					        <div class="bodywrapper">
 | 
				
			||||||
 | 
					          <div class="body" role="main">
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					  <h1>All modules for which code is available</h1>
 | 
				
			||||||
 | 
					<ul><li><a href="asterisk/agi.html">asterisk.agi</a></li>
 | 
				
			||||||
 | 
					<li><a href="asterisk/agitb.html">asterisk.agitb</a></li>
 | 
				
			||||||
 | 
					<li><a href="asterisk/manager.html">asterisk.manager</a></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
 | 
				
			||||||
 | 
					        <div class="sphinxsidebarwrapper"><div class="relations">
 | 
				
			||||||
 | 
					<h3>Related Topics</h3>
 | 
				
			||||||
 | 
					<ul>
 | 
				
			||||||
 | 
					  <li><a href="../index.html">Documentation overview</a><ul>
 | 
				
			||||||
 | 
					  </ul></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div id="searchbox" style="display: none" role="search">
 | 
				
			||||||
 | 
					  <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="footer">
 | 
				
			||||||
 | 
					      ©2016, Randall Degges.
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      |
 | 
				
			||||||
 | 
					      Powered by <a href="http://sphinx-doc.org/">Sphinx 1.3.6</a>
 | 
				
			||||||
 | 
					      & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.7</a>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  </body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
							
								
								
									
										6
									
								
								html/_sources/agi.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					AGI
 | 
				
			||||||
 | 
					=========================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. automodule:: asterisk.agi
 | 
				
			||||||
 | 
					   :members:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										6
									
								
								html/_sources/agitb.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					AGITB
 | 
				
			||||||
 | 
					=========================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. automodule:: asterisk.agitb
 | 
				
			||||||
 | 
					   :members:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										5
									
								
								html/_sources/changes.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					Changes
 | 
				
			||||||
 | 
					*******
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. include:: ../../CHANGELOG
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										6
									
								
								html/_sources/config.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					Config
 | 
				
			||||||
 | 
					=========================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. automodule:: asterisk.config
 | 
				
			||||||
 | 
					   :members:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										6
									
								
								html/_sources/fastagi.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					fastAGI
 | 
				
			||||||
 | 
					=========================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. automodule:: asterisk.fastagi
 | 
				
			||||||
 | 
					   :members:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										29
									
								
								html/_sources/index.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					.. pyst2 documentation master file, created by
 | 
				
			||||||
 | 
					   sphinx-quickstart on Mon Mar  7 10:41:33 2016.
 | 
				
			||||||
 | 
					   You can adapt this file completely to your liking, but it should at least
 | 
				
			||||||
 | 
					   contain the root `toctree` directive.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Welcome to pyst2's documentation!
 | 
				
			||||||
 | 
					=================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Contents:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. toctree::
 | 
				
			||||||
 | 
					   :maxdepth: 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   readme
 | 
				
			||||||
 | 
					   agi
 | 
				
			||||||
 | 
					   agitb
 | 
				
			||||||
 | 
					   config
 | 
				
			||||||
 | 
					   fastagi
 | 
				
			||||||
 | 
					   manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   changes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Indices and tables
 | 
				
			||||||
 | 
					==================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* :ref:`genindex`
 | 
				
			||||||
 | 
					* :ref:`modindex`
 | 
				
			||||||
 | 
					* :ref:`search`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										6
									
								
								html/_sources/manager.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					Manager
 | 
				
			||||||
 | 
					=========================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. automodule:: asterisk.manager
 | 
				
			||||||
 | 
					   :members:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										1
									
								
								html/_sources/readme.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					.. include:: ../../README.rst
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								html/_static/ajax-loader.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 673 B  | 
							
								
								
									
										593
									
								
								html/_static/alabaster.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,593 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@import url("basic.css");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* -- page layout ----------------------------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					body {
 | 
				
			||||||
 | 
					    font-family: 'goudy old style', 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro', serif;
 | 
				
			||||||
 | 
					    font-size: 17px;
 | 
				
			||||||
 | 
					    background-color: white;
 | 
				
			||||||
 | 
					    color: #000;
 | 
				
			||||||
 | 
					    margin: 0;
 | 
				
			||||||
 | 
					    padding: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.document {
 | 
				
			||||||
 | 
					    width: 940px;
 | 
				
			||||||
 | 
					    margin: 30px auto 0 auto;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.documentwrapper {
 | 
				
			||||||
 | 
					    float: left;
 | 
				
			||||||
 | 
					    width: 100%;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.bodywrapper {
 | 
				
			||||||
 | 
					    margin: 0 0 0 220px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.sphinxsidebar {
 | 
				
			||||||
 | 
					    width: 220px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hr {
 | 
				
			||||||
 | 
					    border: 1px solid #B1B4B6;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.body {
 | 
				
			||||||
 | 
					    background-color: #ffffff;
 | 
				
			||||||
 | 
					    color: #3E4349;
 | 
				
			||||||
 | 
					    padding: 0 30px 0 30px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.body > .section {
 | 
				
			||||||
 | 
					    text-align: left;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.footer {
 | 
				
			||||||
 | 
					    width: 940px;
 | 
				
			||||||
 | 
					    margin: 20px auto 30px auto;
 | 
				
			||||||
 | 
					    font-size: 14px;
 | 
				
			||||||
 | 
					    color: #888;
 | 
				
			||||||
 | 
					    text-align: right;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.footer a {
 | 
				
			||||||
 | 
					    color: #888;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.relations {
 | 
				
			||||||
 | 
					    display: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.sphinxsidebar a {
 | 
				
			||||||
 | 
					    color: #444;
 | 
				
			||||||
 | 
					    text-decoration: none;
 | 
				
			||||||
 | 
					    border-bottom: 1px dotted #999;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.sphinxsidebar a:hover {
 | 
				
			||||||
 | 
					    border-bottom: 1px solid #999;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.sphinxsidebar {
 | 
				
			||||||
 | 
					    font-size: 14px;
 | 
				
			||||||
 | 
					    line-height: 1.5;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.sphinxsidebarwrapper {
 | 
				
			||||||
 | 
					    padding: 18px 10px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.sphinxsidebarwrapper p.logo {
 | 
				
			||||||
 | 
					    padding: 0;
 | 
				
			||||||
 | 
					    margin: -10px 0 0 0px;
 | 
				
			||||||
 | 
					    text-align: center;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.sphinxsidebarwrapper h1.logo {
 | 
				
			||||||
 | 
					    margin-top: -10px;
 | 
				
			||||||
 | 
					    text-align: center;
 | 
				
			||||||
 | 
					    margin-bottom: 5px;
 | 
				
			||||||
 | 
					    text-align: left;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.sphinxsidebarwrapper h1.logo-name {
 | 
				
			||||||
 | 
					    margin-top: 0px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.sphinxsidebarwrapper p.blurb {
 | 
				
			||||||
 | 
					    margin-top: 0;
 | 
				
			||||||
 | 
					    font-style: normal;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.sphinxsidebar h3,
 | 
				
			||||||
 | 
					div.sphinxsidebar h4 {
 | 
				
			||||||
 | 
					    font-family: 'Garamond', 'Georgia', serif;
 | 
				
			||||||
 | 
					    color: #444;
 | 
				
			||||||
 | 
					    font-size: 24px;
 | 
				
			||||||
 | 
					    font-weight: normal;
 | 
				
			||||||
 | 
					    margin: 0 0 5px 0;
 | 
				
			||||||
 | 
					    padding: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.sphinxsidebar h4 {
 | 
				
			||||||
 | 
					    font-size: 20px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.sphinxsidebar h3 a {
 | 
				
			||||||
 | 
					    color: #444;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.sphinxsidebar p.logo a,
 | 
				
			||||||
 | 
					div.sphinxsidebar h3 a,
 | 
				
			||||||
 | 
					div.sphinxsidebar p.logo a:hover,
 | 
				
			||||||
 | 
					div.sphinxsidebar h3 a:hover {
 | 
				
			||||||
 | 
					    border: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.sphinxsidebar p {
 | 
				
			||||||
 | 
					    color: #555;
 | 
				
			||||||
 | 
					    margin: 10px 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.sphinxsidebar ul {
 | 
				
			||||||
 | 
					    margin: 10px 0;
 | 
				
			||||||
 | 
					    padding: 0;
 | 
				
			||||||
 | 
					    color: #000;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.sphinxsidebar ul li.toctree-l1 > a {
 | 
				
			||||||
 | 
					    font-size: 120%;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.sphinxsidebar ul li.toctree-l2 > a {
 | 
				
			||||||
 | 
					    font-size: 110%;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.sphinxsidebar input {
 | 
				
			||||||
 | 
					    border: 1px solid #CCC;
 | 
				
			||||||
 | 
					    font-family: 'goudy old style', 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro', serif;
 | 
				
			||||||
 | 
					    font-size: 1em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.sphinxsidebar hr {
 | 
				
			||||||
 | 
					    border: none;
 | 
				
			||||||
 | 
					    height: 1px;
 | 
				
			||||||
 | 
					    color: #AAA;
 | 
				
			||||||
 | 
					    background: #AAA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    text-align: left;
 | 
				
			||||||
 | 
					    margin-left: 0;
 | 
				
			||||||
 | 
					    width: 50%;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* -- body styles ----------------------------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					a {
 | 
				
			||||||
 | 
					    color: #004B6B;
 | 
				
			||||||
 | 
					    text-decoration: underline;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					a:hover {
 | 
				
			||||||
 | 
					    color: #6D4100;
 | 
				
			||||||
 | 
					    text-decoration: underline;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.body h1,
 | 
				
			||||||
 | 
					div.body h2,
 | 
				
			||||||
 | 
					div.body h3,
 | 
				
			||||||
 | 
					div.body h4,
 | 
				
			||||||
 | 
					div.body h5,
 | 
				
			||||||
 | 
					div.body h6 {
 | 
				
			||||||
 | 
					    font-family: 'Garamond', 'Georgia', serif;
 | 
				
			||||||
 | 
					    font-weight: normal;
 | 
				
			||||||
 | 
					    margin: 30px 0px 10px 0px;
 | 
				
			||||||
 | 
					    padding: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; }
 | 
				
			||||||
 | 
					div.body h2 { font-size: 180%; }
 | 
				
			||||||
 | 
					div.body h3 { font-size: 150%; }
 | 
				
			||||||
 | 
					div.body h4 { font-size: 130%; }
 | 
				
			||||||
 | 
					div.body h5 { font-size: 100%; }
 | 
				
			||||||
 | 
					div.body h6 { font-size: 100%; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					a.headerlink {
 | 
				
			||||||
 | 
					    color: #DDD;
 | 
				
			||||||
 | 
					    padding: 0 4px;
 | 
				
			||||||
 | 
					    text-decoration: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					a.headerlink:hover {
 | 
				
			||||||
 | 
					    color: #444;
 | 
				
			||||||
 | 
					    background: #EAEAEA;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.body p, div.body dd, div.body li {
 | 
				
			||||||
 | 
					    line-height: 1.4em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.admonition {
 | 
				
			||||||
 | 
					    margin: 20px 0px;
 | 
				
			||||||
 | 
					    padding: 10px 30px;
 | 
				
			||||||
 | 
					    background-color: #FCC;
 | 
				
			||||||
 | 
					    border: 1px solid #FAA;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.admonition tt.xref, div.admonition a tt {
 | 
				
			||||||
 | 
					    border-bottom: 1px solid #fafafa;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dd div.admonition {
 | 
				
			||||||
 | 
					    margin-left: -60px;
 | 
				
			||||||
 | 
					    padding-left: 60px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.admonition p.admonition-title {
 | 
				
			||||||
 | 
					    font-family: 'Garamond', 'Georgia', serif;
 | 
				
			||||||
 | 
					    font-weight: normal;
 | 
				
			||||||
 | 
					    font-size: 24px;
 | 
				
			||||||
 | 
					    margin: 0 0 10px 0;
 | 
				
			||||||
 | 
					    padding: 0;
 | 
				
			||||||
 | 
					    line-height: 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.admonition p.last {
 | 
				
			||||||
 | 
					    margin-bottom: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.highlight {
 | 
				
			||||||
 | 
					    background-color: white;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dt:target, .highlight {
 | 
				
			||||||
 | 
					    background: #FAF3E8;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.note {
 | 
				
			||||||
 | 
					    background-color: #EEE;
 | 
				
			||||||
 | 
					    border: 1px solid #CCC;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.seealso {
 | 
				
			||||||
 | 
					    background-color: #EEE;
 | 
				
			||||||
 | 
					    border: 1px solid #CCC;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.topic {
 | 
				
			||||||
 | 
					    background-color: #eee;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					p.admonition-title {
 | 
				
			||||||
 | 
					    display: inline;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					p.admonition-title:after {
 | 
				
			||||||
 | 
					    content: ":";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pre, tt, code {
 | 
				
			||||||
 | 
					    font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
 | 
				
			||||||
 | 
					    font-size: 0.9em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.hll {
 | 
				
			||||||
 | 
					    background-color: #FFC;
 | 
				
			||||||
 | 
					    margin: 0 -12px;
 | 
				
			||||||
 | 
					    padding: 0 12px;
 | 
				
			||||||
 | 
					    display: block;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					img.screenshot {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					tt.descname, tt.descclassname, code.descname, code.descclassname {
 | 
				
			||||||
 | 
					    font-size: 0.95em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					tt.descname, code.descname {
 | 
				
			||||||
 | 
					    padding-right: 0.08em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					img.screenshot {
 | 
				
			||||||
 | 
					    -moz-box-shadow: 2px 2px 4px #eee;
 | 
				
			||||||
 | 
					    -webkit-box-shadow: 2px 2px 4px #eee;
 | 
				
			||||||
 | 
					    box-shadow: 2px 2px 4px #eee;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					table.docutils {
 | 
				
			||||||
 | 
					    border: 1px solid #888;
 | 
				
			||||||
 | 
					    -moz-box-shadow: 2px 2px 4px #eee;
 | 
				
			||||||
 | 
					    -webkit-box-shadow: 2px 2px 4px #eee;
 | 
				
			||||||
 | 
					    box-shadow: 2px 2px 4px #eee;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					table.docutils td, table.docutils th {
 | 
				
			||||||
 | 
					    border: 1px solid #888;
 | 
				
			||||||
 | 
					    padding: 0.25em 0.7em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					table.field-list, table.footnote {
 | 
				
			||||||
 | 
					    border: none;
 | 
				
			||||||
 | 
					    -moz-box-shadow: none;
 | 
				
			||||||
 | 
					    -webkit-box-shadow: none;
 | 
				
			||||||
 | 
					    box-shadow: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					table.footnote {
 | 
				
			||||||
 | 
					    margin: 15px 0;
 | 
				
			||||||
 | 
					    width: 100%;
 | 
				
			||||||
 | 
					    border: 1px solid #EEE;
 | 
				
			||||||
 | 
					    background: #FDFDFD;
 | 
				
			||||||
 | 
					    font-size: 0.9em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					table.footnote + table.footnote {
 | 
				
			||||||
 | 
					    margin-top: -15px;
 | 
				
			||||||
 | 
					    border-top: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					table.field-list th {
 | 
				
			||||||
 | 
					    padding: 0 0.8em 0 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					table.field-list td {
 | 
				
			||||||
 | 
					    padding: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					table.field-list p {
 | 
				
			||||||
 | 
					    margin-bottom: 0.8em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					table.footnote td.label {
 | 
				
			||||||
 | 
					    width: 0px;
 | 
				
			||||||
 | 
					    padding: 0.3em 0 0.3em 0.5em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					table.footnote td {
 | 
				
			||||||
 | 
					    padding: 0.3em 0.5em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dl {
 | 
				
			||||||
 | 
					    margin: 0;
 | 
				
			||||||
 | 
					    padding: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dl dd {
 | 
				
			||||||
 | 
					    margin-left: 30px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					blockquote {
 | 
				
			||||||
 | 
					    margin: 0 0 0 30px;
 | 
				
			||||||
 | 
					    padding: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ul, ol {
 | 
				
			||||||
 | 
					    margin: 10px 0 10px 30px;
 | 
				
			||||||
 | 
					    padding: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pre {
 | 
				
			||||||
 | 
					    background: #EEE;
 | 
				
			||||||
 | 
					    padding: 7px 30px;
 | 
				
			||||||
 | 
					    margin: 15px 0px;
 | 
				
			||||||
 | 
					    line-height: 1.3em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dl pre, blockquote pre, li pre {
 | 
				
			||||||
 | 
					    margin-left: 0;
 | 
				
			||||||
 | 
					    padding-left: 30px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dl dl pre {
 | 
				
			||||||
 | 
					    margin-left: -90px;
 | 
				
			||||||
 | 
					    padding-left: 90px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					tt, code {
 | 
				
			||||||
 | 
					    background-color: #ecf0f3;
 | 
				
			||||||
 | 
					    color: #222;
 | 
				
			||||||
 | 
					    /* padding: 1px 2px; */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					tt.xref, code.xref, a tt {
 | 
				
			||||||
 | 
					    background-color: #FBFBFB;
 | 
				
			||||||
 | 
					    border-bottom: 1px solid white;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					a.reference {
 | 
				
			||||||
 | 
					    text-decoration: none;
 | 
				
			||||||
 | 
					    border-bottom: 1px dotted #004B6B;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					a.reference:hover {
 | 
				
			||||||
 | 
					    border-bottom: 1px solid #6D4100;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					a.footnote-reference {
 | 
				
			||||||
 | 
					    text-decoration: none;
 | 
				
			||||||
 | 
					    font-size: 0.7em;
 | 
				
			||||||
 | 
					    vertical-align: top;
 | 
				
			||||||
 | 
					    border-bottom: 1px dotted #004B6B;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					a.footnote-reference:hover {
 | 
				
			||||||
 | 
					    border-bottom: 1px solid #6D4100;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					a:hover tt, a:hover code {
 | 
				
			||||||
 | 
					    background: #EEE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@media screen and (max-width: 870px) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    div.sphinxsidebar {
 | 
				
			||||||
 | 
					    	display: none;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    div.document {
 | 
				
			||||||
 | 
					       width: 100%;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    div.documentwrapper {
 | 
				
			||||||
 | 
					    	margin-left: 0;
 | 
				
			||||||
 | 
					    	margin-top: 0;
 | 
				
			||||||
 | 
					    	margin-right: 0;
 | 
				
			||||||
 | 
					    	margin-bottom: 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    div.bodywrapper {
 | 
				
			||||||
 | 
					    	margin-top: 0;
 | 
				
			||||||
 | 
					    	margin-right: 0;
 | 
				
			||||||
 | 
					    	margin-bottom: 0;
 | 
				
			||||||
 | 
					    	margin-left: 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ul {
 | 
				
			||||||
 | 
					    	margin-left: 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .document {
 | 
				
			||||||
 | 
					    	width: auto;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .footer {
 | 
				
			||||||
 | 
					    	width: auto;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .bodywrapper {
 | 
				
			||||||
 | 
					    	margin: 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .footer {
 | 
				
			||||||
 | 
					    	width: auto;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .github {
 | 
				
			||||||
 | 
					        display: none;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@media screen and (max-width: 875px) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    body {
 | 
				
			||||||
 | 
					        margin: 0;
 | 
				
			||||||
 | 
					        padding: 20px 30px;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    div.documentwrapper {
 | 
				
			||||||
 | 
					        float: none;
 | 
				
			||||||
 | 
					        background: white;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    div.sphinxsidebar {
 | 
				
			||||||
 | 
					        display: block;
 | 
				
			||||||
 | 
					        float: none;
 | 
				
			||||||
 | 
					        width: 102.5%;
 | 
				
			||||||
 | 
					        margin: 50px -30px -20px -30px;
 | 
				
			||||||
 | 
					        padding: 10px 20px;
 | 
				
			||||||
 | 
					        background: #333;
 | 
				
			||||||
 | 
					        color: #FFF;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p,
 | 
				
			||||||
 | 
					    div.sphinxsidebar h3 a {
 | 
				
			||||||
 | 
					        color: white;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    div.sphinxsidebar a {
 | 
				
			||||||
 | 
					        color: #AAA;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    div.sphinxsidebar p.logo {
 | 
				
			||||||
 | 
					        display: none;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    div.document {
 | 
				
			||||||
 | 
					        width: 100%;
 | 
				
			||||||
 | 
					        margin: 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    div.footer {
 | 
				
			||||||
 | 
					        display: none;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    div.bodywrapper {
 | 
				
			||||||
 | 
					        margin: 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    div.body {
 | 
				
			||||||
 | 
					        min-height: 0;
 | 
				
			||||||
 | 
					        padding: 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .rtd_doc_footer {
 | 
				
			||||||
 | 
					        display: none;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .document {
 | 
				
			||||||
 | 
					        width: auto;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .footer {
 | 
				
			||||||
 | 
					        width: auto;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .footer {
 | 
				
			||||||
 | 
					        width: auto;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .github {
 | 
				
			||||||
 | 
					        display: none;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* misc. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.revsys-inline {
 | 
				
			||||||
 | 
					    display: none!important;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Make nested-list/multi-paragraph items look better in Releases changelog
 | 
				
			||||||
 | 
					 * pages. Without this, docutils' magical list fuckery causes inconsistent
 | 
				
			||||||
 | 
					 * formatting between different release sub-lists.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					div#changelog > div.section > ul > li > p:only-child {
 | 
				
			||||||
 | 
					    margin-bottom: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Hide fugly table cell borders in ..bibliography:: directive output */
 | 
				
			||||||
 | 
					table.docutils.citation, table.docutils.citation td, table.docutils.citation th {
 | 
				
			||||||
 | 
					  border: none;
 | 
				
			||||||
 | 
					  /* Below needed in some edge cases; if not applied, bottom shadows appear */
 | 
				
			||||||
 | 
					  -moz-box-shadow: none;
 | 
				
			||||||
 | 
					  -webkit-box-shadow: none;
 | 
				
			||||||
 | 
					  box-shadow: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										599
									
								
								html/_static/basic.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,599 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * basic.css
 | 
				
			||||||
 | 
					 * ~~~~~~~~~
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Sphinx stylesheet -- basic theme.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * :copyright: Copyright 2007-2016 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;
 | 
				
			||||||
 | 
					    max-width: 100%;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* -- 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,
 | 
				
			||||||
 | 
					caption:hover > a.headerlink,
 | 
				
			||||||
 | 
					p.caption:hover > a.headerlink,
 | 
				
			||||||
 | 
					div.code-block-caption: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 caption span.caption-number {
 | 
				
			||||||
 | 
					    font-style: italic;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					table caption span.caption-text {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* -- figures --------------------------------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.figure {
 | 
				
			||||||
 | 
					    margin: 0.5em;
 | 
				
			||||||
 | 
					    padding: 0.5em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.figure p.caption {
 | 
				
			||||||
 | 
					    padding: 0.3em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.figure p.caption span.caption-number {
 | 
				
			||||||
 | 
					    font-style: italic;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.figure p.caption span.caption-text {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* -- 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;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.sig-paren {
 | 
				
			||||||
 | 
					    font-size: larger;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.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;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.code-block-caption {
 | 
				
			||||||
 | 
					    padding: 2px 5px;
 | 
				
			||||||
 | 
					    font-size: small;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.code-block-caption code {
 | 
				
			||||||
 | 
					    background-color: transparent;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.code-block-caption + div > div.highlight > pre {
 | 
				
			||||||
 | 
					    margin-top: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.code-block-caption span.caption-number {
 | 
				
			||||||
 | 
					    padding: 0.1em 0.3em;
 | 
				
			||||||
 | 
					    font-style: italic;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.code-block-caption span.caption-text {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.literal-block-wrapper {
 | 
				
			||||||
 | 
					    padding: 1em 1em 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.literal-block-wrapper div.highlight {
 | 
				
			||||||
 | 
					    margin: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					code.descname {
 | 
				
			||||||
 | 
					    background-color: transparent;
 | 
				
			||||||
 | 
					    font-weight: bold;
 | 
				
			||||||
 | 
					    font-size: 1.2em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					code.descclassname {
 | 
				
			||||||
 | 
					    background-color: transparent;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					code.xref, a code {
 | 
				
			||||||
 | 
					    background-color: transparent;
 | 
				
			||||||
 | 
					    font-weight: bold;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
 | 
				
			||||||
 | 
					    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;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								html/_static/comment-bright.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3.4 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								html/_static/comment-close.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3.5 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								html/_static/comment.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3.4 KiB  | 
							
								
								
									
										263
									
								
								html/_static/doctools.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,263 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * doctools.js
 | 
				
			||||||
 | 
					 * ~~~~~~~~~~~
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Sphinx JavaScript utilities for all documentation.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * :copyright: Copyright 2007-2016 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);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * backward compatibility for jQuery.browser
 | 
				
			||||||
 | 
					 * This will be supported until firefox bug is fixed.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					if (!jQuery.browser) {
 | 
				
			||||||
 | 
					  jQuery.uaMatch = function(ua) {
 | 
				
			||||||
 | 
					    ua = ua.toLowerCase();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
 | 
				
			||||||
 | 
					      /(webkit)[ \/]([\w.]+)/.exec(ua) ||
 | 
				
			||||||
 | 
					      /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
 | 
				
			||||||
 | 
					      /(msie) ([\w.]+)/.exec(ua) ||
 | 
				
			||||||
 | 
					      ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
 | 
				
			||||||
 | 
					      [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      browser: match[ 1 ] || "",
 | 
				
			||||||
 | 
					      version: match[ 2 ] || "0"
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  jQuery.browser = {};
 | 
				
			||||||
 | 
					  jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * 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
 | 
				
			||||||
 | 
					   * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  fixFirefoxAnchorBug : function() {
 | 
				
			||||||
 | 
					    if (document.location.hash)
 | 
				
			||||||
 | 
					      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');
 | 
				
			||||||
 | 
					      if (!body.length) {
 | 
				
			||||||
 | 
					        body = $('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();
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								html/_static/down-pressed.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 347 B  | 
							
								
								
									
										
											BIN
										
									
								
								html/_static/down.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 347 B  | 
							
								
								
									
										
											BIN
										
									
								
								html/_static/file.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 358 B  | 
							
								
								
									
										10308
									
								
								html/_static/jquery-1.11.1.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										4
									
								
								html/_static/jquery.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								html/_static/minus.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 173 B  | 
							
								
								
									
										
											BIN
										
									
								
								html/_static/plus.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 173 B  | 
							
								
								
									
										65
									
								
								html/_static/pygments.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,65 @@
 | 
				
			|||||||
 | 
					.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 .ch { color: #408090; font-style: italic } /* Comment.Hashbang */
 | 
				
			||||||
 | 
					.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */
 | 
				
			||||||
 | 
					.highlight .cp { color: #007020 } /* Comment.Preproc */
 | 
				
			||||||
 | 
					.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */
 | 
				
			||||||
 | 
					.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 .mb { color: #208050 } /* Literal.Number.Bin */
 | 
				
			||||||
 | 
					.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 */
 | 
				
			||||||
							
								
								
									
										651
									
								
								html/_static/searchtools.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,651 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * searchtools.js_t
 | 
				
			||||||
 | 
					 * ~~~~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Sphinx JavaScript utilties for the full-text search.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
 | 
				
			||||||
 | 
					 * :license: BSD, see LICENSE for details.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Non-minified version JS is _stemmer.js if file is provided */ 
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * 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].toLowerCase()) != -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, titleterms));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // 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 !== '' && data !== undefined) {
 | 
				
			||||||
 | 
					                      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, titleterms) {
 | 
				
			||||||
 | 
					    var filenames = this._index.filenames;
 | 
				
			||||||
 | 
					    var titles = this._index.titles;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var i, j, file;
 | 
				
			||||||
 | 
					    var fileMap = {};
 | 
				
			||||||
 | 
					    var scoreMap = {};
 | 
				
			||||||
 | 
					    var results = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // perform the search on the required terms
 | 
				
			||||||
 | 
					    for (i = 0; i < searchterms.length; i++) {
 | 
				
			||||||
 | 
					      var word = searchterms[i];
 | 
				
			||||||
 | 
					      var files = [];
 | 
				
			||||||
 | 
					      var _o = [
 | 
				
			||||||
 | 
					        {files: terms[word], score: Scorer.term},
 | 
				
			||||||
 | 
					        {files: titleterms[word], score: Scorer.title}
 | 
				
			||||||
 | 
					      ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // no match but word was a required one
 | 
				
			||||||
 | 
					      if ($u.every(_o, function(o){return o.files === undefined;})) {
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      // found search word in contents
 | 
				
			||||||
 | 
					      $u.each(_o, function(o) {
 | 
				
			||||||
 | 
					        var _files = o.files;
 | 
				
			||||||
 | 
					        if (_files === undefined)
 | 
				
			||||||
 | 
					          return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (_files.length === undefined)
 | 
				
			||||||
 | 
					          _files = [_files];
 | 
				
			||||||
 | 
					        files = files.concat(_files);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // set score for the word in each file to Scorer.term
 | 
				
			||||||
 | 
					        for (j = 0; j < _files.length; j++) {
 | 
				
			||||||
 | 
					          file = _files[j];
 | 
				
			||||||
 | 
					          if (!(file in scoreMap))
 | 
				
			||||||
 | 
					            scoreMap[file] = {}
 | 
				
			||||||
 | 
					          scoreMap[file][word] = o.score;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // 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 ||
 | 
				
			||||||
 | 
					            titleterms[excluded[i]] == file ||
 | 
				
			||||||
 | 
					            $u.contains(terms[excluded[i]] || [], file) ||
 | 
				
			||||||
 | 
					            $u.contains(titleterms[excluded[i]] || [], file)) {
 | 
				
			||||||
 | 
					          valid = false;
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // if we have still a valid result we can add it to the result list
 | 
				
			||||||
 | 
					      if (valid) {
 | 
				
			||||||
 | 
					        // select one (max) score for the file.
 | 
				
			||||||
 | 
					        // for better ranking, we should calculate ranking by using words statistics like basic tf-idf...
 | 
				
			||||||
 | 
					        var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]}));
 | 
				
			||||||
 | 
					        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();
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
							
								
								
									
										999
									
								
								html/_static/underscore-1.3.1.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,999 @@
 | 
				
			|||||||
 | 
					//     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() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Baseline setup
 | 
				
			||||||
 | 
					  // --------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Establish the root object, `window` in the browser, or `global` on the server.
 | 
				
			||||||
 | 
					  var root = this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Save the previous value of the `_` variable.
 | 
				
			||||||
 | 
					  var previousUnderscore = root._;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Establish the object that gets returned to break out of a loop iteration.
 | 
				
			||||||
 | 
					  var breaker = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Save bytes in the minified (but not gzipped) version:
 | 
				
			||||||
 | 
					  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Create quick reference variables for speed access to core prototypes.
 | 
				
			||||||
 | 
					  var slice            = ArrayProto.slice,
 | 
				
			||||||
 | 
					      unshift          = ArrayProto.unshift,
 | 
				
			||||||
 | 
					      toString         = ObjProto.toString,
 | 
				
			||||||
 | 
					      hasOwnProperty   = ObjProto.hasOwnProperty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // All **ECMAScript 5** native function implementations that we hope to use
 | 
				
			||||||
 | 
					  // are declared here.
 | 
				
			||||||
 | 
					  var
 | 
				
			||||||
 | 
					    nativeForEach      = ArrayProto.forEach,
 | 
				
			||||||
 | 
					    nativeMap          = ArrayProto.map,
 | 
				
			||||||
 | 
					    nativeReduce       = ArrayProto.reduce,
 | 
				
			||||||
 | 
					    nativeReduceRight  = ArrayProto.reduceRight,
 | 
				
			||||||
 | 
					    nativeFilter       = ArrayProto.filter,
 | 
				
			||||||
 | 
					    nativeEvery        = ArrayProto.every,
 | 
				
			||||||
 | 
					    nativeSome         = ArrayProto.some,
 | 
				
			||||||
 | 
					    nativeIndexOf      = ArrayProto.indexOf,
 | 
				
			||||||
 | 
					    nativeLastIndexOf  = ArrayProto.lastIndexOf,
 | 
				
			||||||
 | 
					    nativeIsArray      = Array.isArray,
 | 
				
			||||||
 | 
					    nativeKeys         = Object.keys,
 | 
				
			||||||
 | 
					    nativeBind         = FuncProto.bind;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Create a safe reference to the Underscore object for use below.
 | 
				
			||||||
 | 
					  var _ = function(obj) { return new wrapper(obj); };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Export the Underscore object for **Node.js**, with
 | 
				
			||||||
 | 
					  // backwards-compatibility for the old `require()` API. If we're in
 | 
				
			||||||
 | 
					  // the browser, add `_` as a global object via a string identifier,
 | 
				
			||||||
 | 
					  // for Closure Compiler "advanced" mode.
 | 
				
			||||||
 | 
					  if (typeof exports !== 'undefined') {
 | 
				
			||||||
 | 
					    if (typeof module !== 'undefined' && module.exports) {
 | 
				
			||||||
 | 
					      exports = module.exports = _;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    exports._ = _;
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    root['_'] = _;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Current version.
 | 
				
			||||||
 | 
					  _.VERSION = '1.3.1';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Collection Functions
 | 
				
			||||||
 | 
					  // --------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // The cornerstone, an `each` implementation, aka `forEach`.
 | 
				
			||||||
 | 
					  // Handles objects with the built-in `forEach`, arrays, and raw objects.
 | 
				
			||||||
 | 
					  // Delegates to **ECMAScript 5**'s native `forEach` if available.
 | 
				
			||||||
 | 
					  var each = _.each = _.forEach = function(obj, iterator, context) {
 | 
				
			||||||
 | 
					    if (obj == null) return;
 | 
				
			||||||
 | 
					    if (nativeForEach && obj.forEach === nativeForEach) {
 | 
				
			||||||
 | 
					      obj.forEach(iterator, context);
 | 
				
			||||||
 | 
					    } else if (obj.length === +obj.length) {
 | 
				
			||||||
 | 
					      for (var i = 0, l = obj.length; i < l; i++) {
 | 
				
			||||||
 | 
					        if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      for (var key in obj) {
 | 
				
			||||||
 | 
					        if (_.has(obj, key)) {
 | 
				
			||||||
 | 
					          if (iterator.call(context, obj[key], key, obj) === breaker) return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Return the results of applying the iterator to each element.
 | 
				
			||||||
 | 
					  // Delegates to **ECMAScript 5**'s native `map` if available.
 | 
				
			||||||
 | 
					  _.map = _.collect = function(obj, iterator, context) {
 | 
				
			||||||
 | 
					    var results = [];
 | 
				
			||||||
 | 
					    if (obj == null) return results;
 | 
				
			||||||
 | 
					    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
 | 
				
			||||||
 | 
					    each(obj, function(value, index, list) {
 | 
				
			||||||
 | 
					      results[results.length] = iterator.call(context, value, index, list);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    if (obj.length === +obj.length) results.length = obj.length;
 | 
				
			||||||
 | 
					    return results;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // **Reduce** builds up a single result from a list of values, aka `inject`,
 | 
				
			||||||
 | 
					  // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
 | 
				
			||||||
 | 
					  _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
 | 
				
			||||||
 | 
					    var initial = arguments.length > 2;
 | 
				
			||||||
 | 
					    if (obj == null) obj = [];
 | 
				
			||||||
 | 
					    if (nativeReduce && obj.reduce === nativeReduce) {
 | 
				
			||||||
 | 
					      if (context) iterator = _.bind(iterator, context);
 | 
				
			||||||
 | 
					      return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    each(obj, function(value, index, list) {
 | 
				
			||||||
 | 
					      if (!initial) {
 | 
				
			||||||
 | 
					        memo = value;
 | 
				
			||||||
 | 
					        initial = true;
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        memo = iterator.call(context, memo, value, index, list);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    if (!initial) throw new TypeError('Reduce of empty array with no initial value');
 | 
				
			||||||
 | 
					    return memo;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // The right-associative version of reduce, also known as `foldr`.
 | 
				
			||||||
 | 
					  // Delegates to **ECMAScript 5**'s native `reduceRight` if available.
 | 
				
			||||||
 | 
					  _.reduceRight = _.foldr = function(obj, iterator, memo, context) {
 | 
				
			||||||
 | 
					    var initial = arguments.length > 2;
 | 
				
			||||||
 | 
					    if (obj == null) obj = [];
 | 
				
			||||||
 | 
					    if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
 | 
				
			||||||
 | 
					      if (context) iterator = _.bind(iterator, context);
 | 
				
			||||||
 | 
					      return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    var reversed = _.toArray(obj).reverse();
 | 
				
			||||||
 | 
					    if (context && !initial) iterator = _.bind(iterator, context);
 | 
				
			||||||
 | 
					    return initial ? _.reduce(reversed, iterator, memo, context) : _.reduce(reversed, iterator);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Return the first value which passes a truth test. Aliased as `detect`.
 | 
				
			||||||
 | 
					  _.find = _.detect = function(obj, iterator, context) {
 | 
				
			||||||
 | 
					    var result;
 | 
				
			||||||
 | 
					    any(obj, function(value, index, list) {
 | 
				
			||||||
 | 
					      if (iterator.call(context, value, index, list)) {
 | 
				
			||||||
 | 
					        result = value;
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    return result;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Return all the elements that pass a truth test.
 | 
				
			||||||
 | 
					  // Delegates to **ECMAScript 5**'s native `filter` if available.
 | 
				
			||||||
 | 
					  // Aliased as `select`.
 | 
				
			||||||
 | 
					  _.filter = _.select = function(obj, iterator, context) {
 | 
				
			||||||
 | 
					    var results = [];
 | 
				
			||||||
 | 
					    if (obj == null) return results;
 | 
				
			||||||
 | 
					    if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
 | 
				
			||||||
 | 
					    each(obj, function(value, index, list) {
 | 
				
			||||||
 | 
					      if (iterator.call(context, value, index, list)) results[results.length] = value;
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    return results;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Return all the elements for which a truth test fails.
 | 
				
			||||||
 | 
					  _.reject = function(obj, iterator, context) {
 | 
				
			||||||
 | 
					    var results = [];
 | 
				
			||||||
 | 
					    if (obj == null) return results;
 | 
				
			||||||
 | 
					    each(obj, function(value, index, list) {
 | 
				
			||||||
 | 
					      if (!iterator.call(context, value, index, list)) results[results.length] = value;
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    return results;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Determine whether all of the elements match a truth test.
 | 
				
			||||||
 | 
					  // Delegates to **ECMAScript 5**'s native `every` if available.
 | 
				
			||||||
 | 
					  // Aliased as `all`.
 | 
				
			||||||
 | 
					  _.every = _.all = function(obj, iterator, context) {
 | 
				
			||||||
 | 
					    var result = true;
 | 
				
			||||||
 | 
					    if (obj == null) return result;
 | 
				
			||||||
 | 
					    if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
 | 
				
			||||||
 | 
					    each(obj, function(value, index, list) {
 | 
				
			||||||
 | 
					      if (!(result = result && iterator.call(context, value, index, list))) return breaker;
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    return result;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Determine if at least one element in the object matches a truth test.
 | 
				
			||||||
 | 
					  // Delegates to **ECMAScript 5**'s native `some` if available.
 | 
				
			||||||
 | 
					  // Aliased as `any`.
 | 
				
			||||||
 | 
					  var any = _.some = _.any = function(obj, iterator, context) {
 | 
				
			||||||
 | 
					    iterator || (iterator = _.identity);
 | 
				
			||||||
 | 
					    var result = false;
 | 
				
			||||||
 | 
					    if (obj == null) return result;
 | 
				
			||||||
 | 
					    if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
 | 
				
			||||||
 | 
					    each(obj, function(value, index, list) {
 | 
				
			||||||
 | 
					      if (result || (result = iterator.call(context, value, index, list))) return breaker;
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    return !!result;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Determine if a given value is included in the array or object using `===`.
 | 
				
			||||||
 | 
					  // Aliased as `contains`.
 | 
				
			||||||
 | 
					  _.include = _.contains = function(obj, target) {
 | 
				
			||||||
 | 
					    var found = false;
 | 
				
			||||||
 | 
					    if (obj == null) return found;
 | 
				
			||||||
 | 
					    if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
 | 
				
			||||||
 | 
					    found = any(obj, function(value) {
 | 
				
			||||||
 | 
					      return value === target;
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    return found;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Invoke a method (with arguments) on every item in a collection.
 | 
				
			||||||
 | 
					  _.invoke = function(obj, method) {
 | 
				
			||||||
 | 
					    var args = slice.call(arguments, 2);
 | 
				
			||||||
 | 
					    return _.map(obj, function(value) {
 | 
				
			||||||
 | 
					      return (_.isFunction(method) ? method || value : value[method]).apply(value, args);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Convenience version of a common use case of `map`: fetching a property.
 | 
				
			||||||
 | 
					  _.pluck = function(obj, key) {
 | 
				
			||||||
 | 
					    return _.map(obj, function(value){ return value[key]; });
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Return the maximum element or (element-based computation).
 | 
				
			||||||
 | 
					  _.max = function(obj, iterator, context) {
 | 
				
			||||||
 | 
					    if (!iterator && _.isArray(obj)) return Math.max.apply(Math, obj);
 | 
				
			||||||
 | 
					    if (!iterator && _.isEmpty(obj)) return -Infinity;
 | 
				
			||||||
 | 
					    var result = {computed : -Infinity};
 | 
				
			||||||
 | 
					    each(obj, function(value, index, list) {
 | 
				
			||||||
 | 
					      var computed = iterator ? iterator.call(context, value, index, list) : value;
 | 
				
			||||||
 | 
					      computed >= result.computed && (result = {value : value, computed : computed});
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    return result.value;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Return the minimum element (or element-based computation).
 | 
				
			||||||
 | 
					  _.min = function(obj, iterator, context) {
 | 
				
			||||||
 | 
					    if (!iterator && _.isArray(obj)) return Math.min.apply(Math, obj);
 | 
				
			||||||
 | 
					    if (!iterator && _.isEmpty(obj)) return Infinity;
 | 
				
			||||||
 | 
					    var result = {computed : Infinity};
 | 
				
			||||||
 | 
					    each(obj, function(value, index, list) {
 | 
				
			||||||
 | 
					      var computed = iterator ? iterator.call(context, value, index, list) : value;
 | 
				
			||||||
 | 
					      computed < result.computed && (result = {value : value, computed : computed});
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    return result.value;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Shuffle an array.
 | 
				
			||||||
 | 
					  _.shuffle = function(obj) {
 | 
				
			||||||
 | 
					    var shuffled = [], rand;
 | 
				
			||||||
 | 
					    each(obj, function(value, index, list) {
 | 
				
			||||||
 | 
					      if (index == 0) {
 | 
				
			||||||
 | 
					        shuffled[0] = value;
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        rand = Math.floor(Math.random() * (index + 1));
 | 
				
			||||||
 | 
					        shuffled[index] = shuffled[rand];
 | 
				
			||||||
 | 
					        shuffled[rand] = value;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    return shuffled;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Sort the object's values by a criterion produced by an iterator.
 | 
				
			||||||
 | 
					  _.sortBy = function(obj, iterator, context) {
 | 
				
			||||||
 | 
					    return _.pluck(_.map(obj, function(value, index, list) {
 | 
				
			||||||
 | 
					      return {
 | 
				
			||||||
 | 
					        value : value,
 | 
				
			||||||
 | 
					        criteria : iterator.call(context, value, index, list)
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    }).sort(function(left, right) {
 | 
				
			||||||
 | 
					      var a = left.criteria, b = right.criteria;
 | 
				
			||||||
 | 
					      return a < b ? -1 : a > b ? 1 : 0;
 | 
				
			||||||
 | 
					    }), 'value');
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Groups the object's values by a criterion. Pass either a string attribute
 | 
				
			||||||
 | 
					  // to group by, or a function that returns the criterion.
 | 
				
			||||||
 | 
					  _.groupBy = function(obj, val) {
 | 
				
			||||||
 | 
					    var result = {};
 | 
				
			||||||
 | 
					    var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; };
 | 
				
			||||||
 | 
					    each(obj, function(value, index) {
 | 
				
			||||||
 | 
					      var key = iterator(value, index);
 | 
				
			||||||
 | 
					      (result[key] || (result[key] = [])).push(value);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    return result;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Use a comparator function to figure out at what index an object should
 | 
				
			||||||
 | 
					  // be inserted so as to maintain order. Uses binary search.
 | 
				
			||||||
 | 
					  _.sortedIndex = function(array, obj, iterator) {
 | 
				
			||||||
 | 
					    iterator || (iterator = _.identity);
 | 
				
			||||||
 | 
					    var low = 0, high = array.length;
 | 
				
			||||||
 | 
					    while (low < high) {
 | 
				
			||||||
 | 
					      var mid = (low + high) >> 1;
 | 
				
			||||||
 | 
					      iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return low;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Safely convert anything iterable into a real, live array.
 | 
				
			||||||
 | 
					  _.toArray = function(iterable) {
 | 
				
			||||||
 | 
					    if (!iterable)                return [];
 | 
				
			||||||
 | 
					    if (iterable.toArray)         return iterable.toArray();
 | 
				
			||||||
 | 
					    if (_.isArray(iterable))      return slice.call(iterable);
 | 
				
			||||||
 | 
					    if (_.isArguments(iterable))  return slice.call(iterable);
 | 
				
			||||||
 | 
					    return _.values(iterable);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Return the number of elements in an object.
 | 
				
			||||||
 | 
					  _.size = function(obj) {
 | 
				
			||||||
 | 
					    return _.toArray(obj).length;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Array Functions
 | 
				
			||||||
 | 
					  // ---------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Get the first element of an array. Passing **n** will return the first N
 | 
				
			||||||
 | 
					  // values in the array. Aliased as `head`. The **guard** check allows it to work
 | 
				
			||||||
 | 
					  // with `_.map`.
 | 
				
			||||||
 | 
					  _.first = _.head = function(array, n, guard) {
 | 
				
			||||||
 | 
					    return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Returns everything but the last entry of the array. Especcialy useful on
 | 
				
			||||||
 | 
					  // the arguments object. Passing **n** will return all the values in
 | 
				
			||||||
 | 
					  // the array, excluding the last N. The **guard** check allows it to work with
 | 
				
			||||||
 | 
					  // `_.map`.
 | 
				
			||||||
 | 
					  _.initial = function(array, n, guard) {
 | 
				
			||||||
 | 
					    return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Get the last element of an array. Passing **n** will return the last N
 | 
				
			||||||
 | 
					  // values in the array. The **guard** check allows it to work with `_.map`.
 | 
				
			||||||
 | 
					  _.last = function(array, n, guard) {
 | 
				
			||||||
 | 
					    if ((n != null) && !guard) {
 | 
				
			||||||
 | 
					      return slice.call(array, Math.max(array.length - n, 0));
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      return array[array.length - 1];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Returns everything but the first entry of the array. Aliased as `tail`.
 | 
				
			||||||
 | 
					  // Especially useful on the arguments object. Passing an **index** will return
 | 
				
			||||||
 | 
					  // the rest of the values in the array from that index onward. The **guard**
 | 
				
			||||||
 | 
					  // check allows it to work with `_.map`.
 | 
				
			||||||
 | 
					  _.rest = _.tail = function(array, index, guard) {
 | 
				
			||||||
 | 
					    return slice.call(array, (index == null) || guard ? 1 : index);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Trim out all falsy values from an array.
 | 
				
			||||||
 | 
					  _.compact = function(array) {
 | 
				
			||||||
 | 
					    return _.filter(array, function(value){ return !!value; });
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Return a completely flattened version of an array.
 | 
				
			||||||
 | 
					  _.flatten = function(array, shallow) {
 | 
				
			||||||
 | 
					    return _.reduce(array, function(memo, value) {
 | 
				
			||||||
 | 
					      if (_.isArray(value)) return memo.concat(shallow ? value : _.flatten(value));
 | 
				
			||||||
 | 
					      memo[memo.length] = value;
 | 
				
			||||||
 | 
					      return memo;
 | 
				
			||||||
 | 
					    }, []);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Return a version of the array that does not contain the specified value(s).
 | 
				
			||||||
 | 
					  _.without = function(array) {
 | 
				
			||||||
 | 
					    return _.difference(array, slice.call(arguments, 1));
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Produce a duplicate-free version of the array. If the array has already
 | 
				
			||||||
 | 
					  // been sorted, you have the option of using a faster algorithm.
 | 
				
			||||||
 | 
					  // Aliased as `unique`.
 | 
				
			||||||
 | 
					  _.uniq = _.unique = function(array, isSorted, iterator) {
 | 
				
			||||||
 | 
					    var initial = iterator ? _.map(array, iterator) : array;
 | 
				
			||||||
 | 
					    var result = [];
 | 
				
			||||||
 | 
					    _.reduce(initial, function(memo, el, i) {
 | 
				
			||||||
 | 
					      if (0 == i || (isSorted === true ? _.last(memo) != el : !_.include(memo, el))) {
 | 
				
			||||||
 | 
					        memo[memo.length] = el;
 | 
				
			||||||
 | 
					        result[result.length] = array[i];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return memo;
 | 
				
			||||||
 | 
					    }, []);
 | 
				
			||||||
 | 
					    return result;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Produce an array that contains the union: each distinct element from all of
 | 
				
			||||||
 | 
					  // the passed-in arrays.
 | 
				
			||||||
 | 
					  _.union = function() {
 | 
				
			||||||
 | 
					    return _.uniq(_.flatten(arguments, true));
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Produce an array that contains every item shared between all the
 | 
				
			||||||
 | 
					  // passed-in arrays. (Aliased as "intersect" for back-compat.)
 | 
				
			||||||
 | 
					  _.intersection = _.intersect = function(array) {
 | 
				
			||||||
 | 
					    var rest = slice.call(arguments, 1);
 | 
				
			||||||
 | 
					    return _.filter(_.uniq(array), function(item) {
 | 
				
			||||||
 | 
					      return _.every(rest, function(other) {
 | 
				
			||||||
 | 
					        return _.indexOf(other, item) >= 0;
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Take the difference between one array and a number of other arrays.
 | 
				
			||||||
 | 
					  // Only the elements present in just the first array will remain.
 | 
				
			||||||
 | 
					  _.difference = function(array) {
 | 
				
			||||||
 | 
					    var rest = _.flatten(slice.call(arguments, 1));
 | 
				
			||||||
 | 
					    return _.filter(array, function(value){ return !_.include(rest, value); });
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Zip together multiple lists into a single array -- elements that share
 | 
				
			||||||
 | 
					  // an index go together.
 | 
				
			||||||
 | 
					  _.zip = function() {
 | 
				
			||||||
 | 
					    var args = slice.call(arguments);
 | 
				
			||||||
 | 
					    var length = _.max(_.pluck(args, 'length'));
 | 
				
			||||||
 | 
					    var results = new Array(length);
 | 
				
			||||||
 | 
					    for (var i = 0; i < length; i++) results[i] = _.pluck(args, "" + i);
 | 
				
			||||||
 | 
					    return results;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
 | 
				
			||||||
 | 
					  // we need this function. Return the position of the first occurrence of an
 | 
				
			||||||
 | 
					  // item in an array, or -1 if the item is not included in the array.
 | 
				
			||||||
 | 
					  // Delegates to **ECMAScript 5**'s native `indexOf` if available.
 | 
				
			||||||
 | 
					  // If the array is large and already in sort order, pass `true`
 | 
				
			||||||
 | 
					  // for **isSorted** to use binary search.
 | 
				
			||||||
 | 
					  _.indexOf = function(array, item, isSorted) {
 | 
				
			||||||
 | 
					    if (array == null) return -1;
 | 
				
			||||||
 | 
					    var i, l;
 | 
				
			||||||
 | 
					    if (isSorted) {
 | 
				
			||||||
 | 
					      i = _.sortedIndex(array, item);
 | 
				
			||||||
 | 
					      return array[i] === item ? i : -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
 | 
				
			||||||
 | 
					    for (i = 0, l = array.length; i < l; i++) if (i in array && array[i] === item) return i;
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
 | 
				
			||||||
 | 
					  _.lastIndexOf = function(array, item) {
 | 
				
			||||||
 | 
					    if (array == null) return -1;
 | 
				
			||||||
 | 
					    if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item);
 | 
				
			||||||
 | 
					    var i = array.length;
 | 
				
			||||||
 | 
					    while (i--) if (i in array && array[i] === item) return i;
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Generate an integer Array containing an arithmetic progression. A port of
 | 
				
			||||||
 | 
					  // the native Python `range()` function. See
 | 
				
			||||||
 | 
					  // [the Python documentation](http://docs.python.org/library/functions.html#range).
 | 
				
			||||||
 | 
					  _.range = function(start, stop, step) {
 | 
				
			||||||
 | 
					    if (arguments.length <= 1) {
 | 
				
			||||||
 | 
					      stop = start || 0;
 | 
				
			||||||
 | 
					      start = 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    step = arguments[2] || 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var len = Math.max(Math.ceil((stop - start) / step), 0);
 | 
				
			||||||
 | 
					    var idx = 0;
 | 
				
			||||||
 | 
					    var range = new Array(len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    while(idx < len) {
 | 
				
			||||||
 | 
					      range[idx++] = start;
 | 
				
			||||||
 | 
					      start += step;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return range;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Function (ahem) Functions
 | 
				
			||||||
 | 
					  // ------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Reusable constructor function for prototype setting.
 | 
				
			||||||
 | 
					  var ctor = function(){};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Create a function bound to a given object (assigning `this`, and arguments,
 | 
				
			||||||
 | 
					  // optionally). Binding with arguments is also known as `curry`.
 | 
				
			||||||
 | 
					  // Delegates to **ECMAScript 5**'s native `Function.bind` if available.
 | 
				
			||||||
 | 
					  // We check for `func.bind` first, to fail fast when `func` is undefined.
 | 
				
			||||||
 | 
					  _.bind = function bind(func, context) {
 | 
				
			||||||
 | 
					    var bound, args;
 | 
				
			||||||
 | 
					    if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
 | 
				
			||||||
 | 
					    if (!_.isFunction(func)) throw new TypeError;
 | 
				
			||||||
 | 
					    args = slice.call(arguments, 2);
 | 
				
			||||||
 | 
					    return bound = function() {
 | 
				
			||||||
 | 
					      if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
 | 
				
			||||||
 | 
					      ctor.prototype = func.prototype;
 | 
				
			||||||
 | 
					      var self = new ctor;
 | 
				
			||||||
 | 
					      var result = func.apply(self, args.concat(slice.call(arguments)));
 | 
				
			||||||
 | 
					      if (Object(result) === result) return result;
 | 
				
			||||||
 | 
					      return self;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Bind all of an object's methods to that object. Useful for ensuring that
 | 
				
			||||||
 | 
					  // all callbacks defined on an object belong to it.
 | 
				
			||||||
 | 
					  _.bindAll = function(obj) {
 | 
				
			||||||
 | 
					    var funcs = slice.call(arguments, 1);
 | 
				
			||||||
 | 
					    if (funcs.length == 0) funcs = _.functions(obj);
 | 
				
			||||||
 | 
					    each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
 | 
				
			||||||
 | 
					    return obj;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Memoize an expensive function by storing its results.
 | 
				
			||||||
 | 
					  _.memoize = function(func, hasher) {
 | 
				
			||||||
 | 
					    var memo = {};
 | 
				
			||||||
 | 
					    hasher || (hasher = _.identity);
 | 
				
			||||||
 | 
					    return function() {
 | 
				
			||||||
 | 
					      var key = hasher.apply(this, arguments);
 | 
				
			||||||
 | 
					      return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Delays a function for the given number of milliseconds, and then calls
 | 
				
			||||||
 | 
					  // it with the arguments supplied.
 | 
				
			||||||
 | 
					  _.delay = function(func, wait) {
 | 
				
			||||||
 | 
					    var args = slice.call(arguments, 2);
 | 
				
			||||||
 | 
					    return setTimeout(function(){ return func.apply(func, args); }, wait);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Defers a function, scheduling it to run after the current call stack has
 | 
				
			||||||
 | 
					  // cleared.
 | 
				
			||||||
 | 
					  _.defer = function(func) {
 | 
				
			||||||
 | 
					    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Returns a function, that, when invoked, will only be triggered at most once
 | 
				
			||||||
 | 
					  // during a given window of time.
 | 
				
			||||||
 | 
					  _.throttle = function(func, wait) {
 | 
				
			||||||
 | 
					    var context, args, timeout, throttling, more;
 | 
				
			||||||
 | 
					    var whenDone = _.debounce(function(){ more = throttling = false; }, wait);
 | 
				
			||||||
 | 
					    return function() {
 | 
				
			||||||
 | 
					      context = this; args = arguments;
 | 
				
			||||||
 | 
					      var later = function() {
 | 
				
			||||||
 | 
					        timeout = null;
 | 
				
			||||||
 | 
					        if (more) func.apply(context, args);
 | 
				
			||||||
 | 
					        whenDone();
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					      if (!timeout) timeout = setTimeout(later, wait);
 | 
				
			||||||
 | 
					      if (throttling) {
 | 
				
			||||||
 | 
					        more = true;
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        func.apply(context, args);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      whenDone();
 | 
				
			||||||
 | 
					      throttling = true;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Returns a function, that, as long as it continues to be invoked, will not
 | 
				
			||||||
 | 
					  // be triggered. The function will be called after it stops being called for
 | 
				
			||||||
 | 
					  // N milliseconds.
 | 
				
			||||||
 | 
					  _.debounce = function(func, wait) {
 | 
				
			||||||
 | 
					    var timeout;
 | 
				
			||||||
 | 
					    return function() {
 | 
				
			||||||
 | 
					      var context = this, args = arguments;
 | 
				
			||||||
 | 
					      var later = function() {
 | 
				
			||||||
 | 
					        timeout = null;
 | 
				
			||||||
 | 
					        func.apply(context, args);
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					      clearTimeout(timeout);
 | 
				
			||||||
 | 
					      timeout = setTimeout(later, wait);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Returns a function that will be executed at most one time, no matter how
 | 
				
			||||||
 | 
					  // often you call it. Useful for lazy initialization.
 | 
				
			||||||
 | 
					  _.once = function(func) {
 | 
				
			||||||
 | 
					    var ran = false, memo;
 | 
				
			||||||
 | 
					    return function() {
 | 
				
			||||||
 | 
					      if (ran) return memo;
 | 
				
			||||||
 | 
					      ran = true;
 | 
				
			||||||
 | 
					      return memo = func.apply(this, arguments);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Returns the first function passed as an argument to the second,
 | 
				
			||||||
 | 
					  // allowing you to adjust arguments, run code before and after, and
 | 
				
			||||||
 | 
					  // conditionally execute the original function.
 | 
				
			||||||
 | 
					  _.wrap = function(func, wrapper) {
 | 
				
			||||||
 | 
					    return function() {
 | 
				
			||||||
 | 
					      var args = [func].concat(slice.call(arguments, 0));
 | 
				
			||||||
 | 
					      return wrapper.apply(this, args);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Returns a function that is the composition of a list of functions, each
 | 
				
			||||||
 | 
					  // consuming the return value of the function that follows.
 | 
				
			||||||
 | 
					  _.compose = function() {
 | 
				
			||||||
 | 
					    var funcs = arguments;
 | 
				
			||||||
 | 
					    return function() {
 | 
				
			||||||
 | 
					      var args = arguments;
 | 
				
			||||||
 | 
					      for (var i = funcs.length - 1; i >= 0; i--) {
 | 
				
			||||||
 | 
					        args = [funcs[i].apply(this, args)];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return args[0];
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Returns a function that will only be executed after being called N times.
 | 
				
			||||||
 | 
					  _.after = function(times, func) {
 | 
				
			||||||
 | 
					    if (times <= 0) return func();
 | 
				
			||||||
 | 
					    return function() {
 | 
				
			||||||
 | 
					      if (--times < 1) { return func.apply(this, arguments); }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Object Functions
 | 
				
			||||||
 | 
					  // ----------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Retrieve the names of an object's properties.
 | 
				
			||||||
 | 
					  // Delegates to **ECMAScript 5**'s native `Object.keys`
 | 
				
			||||||
 | 
					  _.keys = nativeKeys || function(obj) {
 | 
				
			||||||
 | 
					    if (obj !== Object(obj)) throw new TypeError('Invalid object');
 | 
				
			||||||
 | 
					    var keys = [];
 | 
				
			||||||
 | 
					    for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;
 | 
				
			||||||
 | 
					    return keys;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Retrieve the values of an object's properties.
 | 
				
			||||||
 | 
					  _.values = function(obj) {
 | 
				
			||||||
 | 
					    return _.map(obj, _.identity);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Return a sorted list of the function names available on the object.
 | 
				
			||||||
 | 
					  // Aliased as `methods`
 | 
				
			||||||
 | 
					  _.functions = _.methods = function(obj) {
 | 
				
			||||||
 | 
					    var names = [];
 | 
				
			||||||
 | 
					    for (var key in obj) {
 | 
				
			||||||
 | 
					      if (_.isFunction(obj[key])) names.push(key);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return names.sort();
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Extend a given object with all the properties in passed-in object(s).
 | 
				
			||||||
 | 
					  _.extend = function(obj) {
 | 
				
			||||||
 | 
					    each(slice.call(arguments, 1), function(source) {
 | 
				
			||||||
 | 
					      for (var prop in source) {
 | 
				
			||||||
 | 
					        obj[prop] = source[prop];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    return obj;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Fill in a given object with default properties.
 | 
				
			||||||
 | 
					  _.defaults = function(obj) {
 | 
				
			||||||
 | 
					    each(slice.call(arguments, 1), function(source) {
 | 
				
			||||||
 | 
					      for (var prop in source) {
 | 
				
			||||||
 | 
					        if (obj[prop] == null) obj[prop] = source[prop];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    return obj;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Create a (shallow-cloned) duplicate of an object.
 | 
				
			||||||
 | 
					  _.clone = function(obj) {
 | 
				
			||||||
 | 
					    if (!_.isObject(obj)) return obj;
 | 
				
			||||||
 | 
					    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Invokes interceptor with the obj, and then returns obj.
 | 
				
			||||||
 | 
					  // The primary purpose of this method is to "tap into" a method chain, in
 | 
				
			||||||
 | 
					  // order to perform operations on intermediate results within the chain.
 | 
				
			||||||
 | 
					  _.tap = function(obj, interceptor) {
 | 
				
			||||||
 | 
					    interceptor(obj);
 | 
				
			||||||
 | 
					    return obj;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Internal recursive comparison function.
 | 
				
			||||||
 | 
					  function eq(a, b, stack) {
 | 
				
			||||||
 | 
					    // Identical objects are equal. `0 === -0`, but they aren't identical.
 | 
				
			||||||
 | 
					    // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.
 | 
				
			||||||
 | 
					    if (a === b) return a !== 0 || 1 / a == 1 / b;
 | 
				
			||||||
 | 
					    // A strict comparison is necessary because `null == undefined`.
 | 
				
			||||||
 | 
					    if (a == null || b == null) return a === b;
 | 
				
			||||||
 | 
					    // Unwrap any wrapped objects.
 | 
				
			||||||
 | 
					    if (a._chain) a = a._wrapped;
 | 
				
			||||||
 | 
					    if (b._chain) b = b._wrapped;
 | 
				
			||||||
 | 
					    // Invoke a custom `isEqual` method if one is provided.
 | 
				
			||||||
 | 
					    if (a.isEqual && _.isFunction(a.isEqual)) return a.isEqual(b);
 | 
				
			||||||
 | 
					    if (b.isEqual && _.isFunction(b.isEqual)) return b.isEqual(a);
 | 
				
			||||||
 | 
					    // Compare `[[Class]]` names.
 | 
				
			||||||
 | 
					    var className = toString.call(a);
 | 
				
			||||||
 | 
					    if (className != toString.call(b)) return false;
 | 
				
			||||||
 | 
					    switch (className) {
 | 
				
			||||||
 | 
					      // Strings, numbers, dates, and booleans are compared by value.
 | 
				
			||||||
 | 
					      case '[object String]':
 | 
				
			||||||
 | 
					        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
 | 
				
			||||||
 | 
					        // equivalent to `new String("5")`.
 | 
				
			||||||
 | 
					        return a == String(b);
 | 
				
			||||||
 | 
					      case '[object Number]':
 | 
				
			||||||
 | 
					        // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
 | 
				
			||||||
 | 
					        // other numeric values.
 | 
				
			||||||
 | 
					        return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);
 | 
				
			||||||
 | 
					      case '[object Date]':
 | 
				
			||||||
 | 
					      case '[object Boolean]':
 | 
				
			||||||
 | 
					        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
 | 
				
			||||||
 | 
					        // millisecond representations. Note that invalid dates with millisecond representations
 | 
				
			||||||
 | 
					        // of `NaN` are not equivalent.
 | 
				
			||||||
 | 
					        return +a == +b;
 | 
				
			||||||
 | 
					      // RegExps are compared by their source patterns and flags.
 | 
				
			||||||
 | 
					      case '[object RegExp]':
 | 
				
			||||||
 | 
					        return a.source == b.source &&
 | 
				
			||||||
 | 
					               a.global == b.global &&
 | 
				
			||||||
 | 
					               a.multiline == b.multiline &&
 | 
				
			||||||
 | 
					               a.ignoreCase == b.ignoreCase;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (typeof a != 'object' || typeof b != 'object') return false;
 | 
				
			||||||
 | 
					    // Assume equality for cyclic structures. The algorithm for detecting cyclic
 | 
				
			||||||
 | 
					    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
 | 
				
			||||||
 | 
					    var length = stack.length;
 | 
				
			||||||
 | 
					    while (length--) {
 | 
				
			||||||
 | 
					      // Linear search. Performance is inversely proportional to the number of
 | 
				
			||||||
 | 
					      // unique nested structures.
 | 
				
			||||||
 | 
					      if (stack[length] == a) return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    // Add the first object to the stack of traversed objects.
 | 
				
			||||||
 | 
					    stack.push(a);
 | 
				
			||||||
 | 
					    var size = 0, result = true;
 | 
				
			||||||
 | 
					    // Recursively compare objects and arrays.
 | 
				
			||||||
 | 
					    if (className == '[object Array]') {
 | 
				
			||||||
 | 
					      // Compare array lengths to determine if a deep comparison is necessary.
 | 
				
			||||||
 | 
					      size = a.length;
 | 
				
			||||||
 | 
					      result = size == b.length;
 | 
				
			||||||
 | 
					      if (result) {
 | 
				
			||||||
 | 
					        // Deep compare the contents, ignoring non-numeric properties.
 | 
				
			||||||
 | 
					        while (size--) {
 | 
				
			||||||
 | 
					          // Ensure commutative equality for sparse arrays.
 | 
				
			||||||
 | 
					          if (!(result = size in a == size in b && eq(a[size], b[size], stack))) break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      // Objects with different constructors are not equivalent.
 | 
				
			||||||
 | 
					      if ('constructor' in a != 'constructor' in b || a.constructor != b.constructor) return false;
 | 
				
			||||||
 | 
					      // Deep compare objects.
 | 
				
			||||||
 | 
					      for (var key in a) {
 | 
				
			||||||
 | 
					        if (_.has(a, key)) {
 | 
				
			||||||
 | 
					          // Count the expected number of properties.
 | 
				
			||||||
 | 
					          size++;
 | 
				
			||||||
 | 
					          // Deep compare each member.
 | 
				
			||||||
 | 
					          if (!(result = _.has(b, key) && eq(a[key], b[key], stack))) break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      // Ensure that both objects contain the same number of properties.
 | 
				
			||||||
 | 
					      if (result) {
 | 
				
			||||||
 | 
					        for (key in b) {
 | 
				
			||||||
 | 
					          if (_.has(b, key) && !(size--)) break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        result = !size;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    // Remove the first object from the stack of traversed objects.
 | 
				
			||||||
 | 
					    stack.pop();
 | 
				
			||||||
 | 
					    return result;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Perform a deep comparison to check if two objects are equal.
 | 
				
			||||||
 | 
					  _.isEqual = function(a, b) {
 | 
				
			||||||
 | 
					    return eq(a, b, []);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Is a given array, string, or object empty?
 | 
				
			||||||
 | 
					  // An "empty" object has no enumerable own-properties.
 | 
				
			||||||
 | 
					  _.isEmpty = function(obj) {
 | 
				
			||||||
 | 
					    if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
 | 
				
			||||||
 | 
					    for (var key in obj) if (_.has(obj, key)) return false;
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Is a given value a DOM element?
 | 
				
			||||||
 | 
					  _.isElement = function(obj) {
 | 
				
			||||||
 | 
					    return !!(obj && obj.nodeType == 1);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Is a given value an array?
 | 
				
			||||||
 | 
					  // Delegates to ECMA5's native Array.isArray
 | 
				
			||||||
 | 
					  _.isArray = nativeIsArray || function(obj) {
 | 
				
			||||||
 | 
					    return toString.call(obj) == '[object Array]';
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Is a given variable an object?
 | 
				
			||||||
 | 
					  _.isObject = function(obj) {
 | 
				
			||||||
 | 
					    return obj === Object(obj);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Is a given variable an arguments object?
 | 
				
			||||||
 | 
					  _.isArguments = function(obj) {
 | 
				
			||||||
 | 
					    return toString.call(obj) == '[object Arguments]';
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  if (!_.isArguments(arguments)) {
 | 
				
			||||||
 | 
					    _.isArguments = function(obj) {
 | 
				
			||||||
 | 
					      return !!(obj && _.has(obj, 'callee'));
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Is a given value a function?
 | 
				
			||||||
 | 
					  _.isFunction = function(obj) {
 | 
				
			||||||
 | 
					    return toString.call(obj) == '[object Function]';
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Is a given value a string?
 | 
				
			||||||
 | 
					  _.isString = function(obj) {
 | 
				
			||||||
 | 
					    return toString.call(obj) == '[object String]';
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Is a given value a number?
 | 
				
			||||||
 | 
					  _.isNumber = function(obj) {
 | 
				
			||||||
 | 
					    return toString.call(obj) == '[object Number]';
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Is the given value `NaN`?
 | 
				
			||||||
 | 
					  _.isNaN = function(obj) {
 | 
				
			||||||
 | 
					    // `NaN` is the only value for which `===` is not reflexive.
 | 
				
			||||||
 | 
					    return obj !== obj;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Is a given value a boolean?
 | 
				
			||||||
 | 
					  _.isBoolean = function(obj) {
 | 
				
			||||||
 | 
					    return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Is a given value a date?
 | 
				
			||||||
 | 
					  _.isDate = function(obj) {
 | 
				
			||||||
 | 
					    return toString.call(obj) == '[object Date]';
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Is the given value a regular expression?
 | 
				
			||||||
 | 
					  _.isRegExp = function(obj) {
 | 
				
			||||||
 | 
					    return toString.call(obj) == '[object RegExp]';
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Is a given value equal to null?
 | 
				
			||||||
 | 
					  _.isNull = function(obj) {
 | 
				
			||||||
 | 
					    return obj === null;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Is a given variable undefined?
 | 
				
			||||||
 | 
					  _.isUndefined = function(obj) {
 | 
				
			||||||
 | 
					    return obj === void 0;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Has own property?
 | 
				
			||||||
 | 
					  _.has = function(obj, key) {
 | 
				
			||||||
 | 
					    return hasOwnProperty.call(obj, key);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Utility Functions
 | 
				
			||||||
 | 
					  // -----------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
 | 
				
			||||||
 | 
					  // previous owner. Returns a reference to the Underscore object.
 | 
				
			||||||
 | 
					  _.noConflict = function() {
 | 
				
			||||||
 | 
					    root._ = previousUnderscore;
 | 
				
			||||||
 | 
					    return this;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Keep the identity function around for default iterators.
 | 
				
			||||||
 | 
					  _.identity = function(value) {
 | 
				
			||||||
 | 
					    return value;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Run a function **n** times.
 | 
				
			||||||
 | 
					  _.times = function (n, iterator, context) {
 | 
				
			||||||
 | 
					    for (var i = 0; i < n; i++) iterator.call(context, i);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Escape a string for HTML interpolation.
 | 
				
			||||||
 | 
					  _.escape = function(string) {
 | 
				
			||||||
 | 
					    return (''+string).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''').replace(/\//g,'/');
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Add your own custom functions to the Underscore object, ensuring that
 | 
				
			||||||
 | 
					  // they're correctly added to the OOP wrapper as well.
 | 
				
			||||||
 | 
					  _.mixin = function(obj) {
 | 
				
			||||||
 | 
					    each(_.functions(obj), function(name){
 | 
				
			||||||
 | 
					      addToWrapper(name, _[name] = obj[name]);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Generate a unique integer id (unique within the entire client session).
 | 
				
			||||||
 | 
					  // Useful for temporary DOM ids.
 | 
				
			||||||
 | 
					  var idCounter = 0;
 | 
				
			||||||
 | 
					  _.uniqueId = function(prefix) {
 | 
				
			||||||
 | 
					    var id = idCounter++;
 | 
				
			||||||
 | 
					    return prefix ? prefix + id : id;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // By default, Underscore uses ERB-style template delimiters, change the
 | 
				
			||||||
 | 
					  // following template settings to use alternative delimiters.
 | 
				
			||||||
 | 
					  _.templateSettings = {
 | 
				
			||||||
 | 
					    evaluate    : /<%([\s\S]+?)%>/g,
 | 
				
			||||||
 | 
					    interpolate : /<%=([\s\S]+?)%>/g,
 | 
				
			||||||
 | 
					    escape      : /<%-([\s\S]+?)%>/g
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // When customizing `templateSettings`, if you don't want to define an
 | 
				
			||||||
 | 
					  // interpolation, evaluation or escaping regex, we need one that is
 | 
				
			||||||
 | 
					  // guaranteed not to match.
 | 
				
			||||||
 | 
					  var noMatch = /.^/;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Within an interpolation, evaluation, or escaping, remove HTML escaping
 | 
				
			||||||
 | 
					  // that had been previously added.
 | 
				
			||||||
 | 
					  var unescape = function(code) {
 | 
				
			||||||
 | 
					    return code.replace(/\\\\/g, '\\').replace(/\\'/g, "'");
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // JavaScript micro-templating, similar to John Resig's implementation.
 | 
				
			||||||
 | 
					  // Underscore templating handles arbitrary delimiters, preserves whitespace,
 | 
				
			||||||
 | 
					  // and correctly escapes quotes within interpolated code.
 | 
				
			||||||
 | 
					  _.template = function(str, data) {
 | 
				
			||||||
 | 
					    var c  = _.templateSettings;
 | 
				
			||||||
 | 
					    var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' +
 | 
				
			||||||
 | 
					      'with(obj||{}){__p.push(\'' +
 | 
				
			||||||
 | 
					      str.replace(/\\/g, '\\\\')
 | 
				
			||||||
 | 
					         .replace(/'/g, "\\'")
 | 
				
			||||||
 | 
					         .replace(c.escape || noMatch, function(match, code) {
 | 
				
			||||||
 | 
					           return "',_.escape(" + unescape(code) + "),'";
 | 
				
			||||||
 | 
					         })
 | 
				
			||||||
 | 
					         .replace(c.interpolate || noMatch, function(match, code) {
 | 
				
			||||||
 | 
					           return "'," + unescape(code) + ",'";
 | 
				
			||||||
 | 
					         })
 | 
				
			||||||
 | 
					         .replace(c.evaluate || noMatch, function(match, code) {
 | 
				
			||||||
 | 
					           return "');" + unescape(code).replace(/[\r\n\t]/g, ' ') + ";__p.push('";
 | 
				
			||||||
 | 
					         })
 | 
				
			||||||
 | 
					         .replace(/\r/g, '\\r')
 | 
				
			||||||
 | 
					         .replace(/\n/g, '\\n')
 | 
				
			||||||
 | 
					         .replace(/\t/g, '\\t')
 | 
				
			||||||
 | 
					         + "');}return __p.join('');";
 | 
				
			||||||
 | 
					    var func = new Function('obj', '_', tmpl);
 | 
				
			||||||
 | 
					    if (data) return func(data, _);
 | 
				
			||||||
 | 
					    return function(data) {
 | 
				
			||||||
 | 
					      return func.call(this, data, _);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Add a "chain" function, which will delegate to the wrapper.
 | 
				
			||||||
 | 
					  _.chain = function(obj) {
 | 
				
			||||||
 | 
					    return _(obj).chain();
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // The OOP Wrapper
 | 
				
			||||||
 | 
					  // ---------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // If Underscore is called as a function, it returns a wrapped object that
 | 
				
			||||||
 | 
					  // can be used OO-style. This wrapper holds altered versions of all the
 | 
				
			||||||
 | 
					  // underscore functions. Wrapped objects may be chained.
 | 
				
			||||||
 | 
					  var wrapper = function(obj) { this._wrapped = obj; };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Expose `wrapper.prototype` as `_.prototype`
 | 
				
			||||||
 | 
					  _.prototype = wrapper.prototype;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Helper function to continue chaining intermediate results.
 | 
				
			||||||
 | 
					  var result = function(obj, chain) {
 | 
				
			||||||
 | 
					    return chain ? _(obj).chain() : obj;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // A method to easily add functions to the OOP wrapper.
 | 
				
			||||||
 | 
					  var addToWrapper = function(name, func) {
 | 
				
			||||||
 | 
					    wrapper.prototype[name] = function() {
 | 
				
			||||||
 | 
					      var args = slice.call(arguments);
 | 
				
			||||||
 | 
					      unshift.call(args, this._wrapped);
 | 
				
			||||||
 | 
					      return result(func.apply(_, args), this._chain);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Add all of the Underscore functions to the wrapper object.
 | 
				
			||||||
 | 
					  _.mixin(_);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Add all mutator Array functions to the wrapper.
 | 
				
			||||||
 | 
					  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
 | 
				
			||||||
 | 
					    var method = ArrayProto[name];
 | 
				
			||||||
 | 
					    wrapper.prototype[name] = function() {
 | 
				
			||||||
 | 
					      var wrapped = this._wrapped;
 | 
				
			||||||
 | 
					      method.apply(wrapped, arguments);
 | 
				
			||||||
 | 
					      var length = wrapped.length;
 | 
				
			||||||
 | 
					      if ((name == 'shift' || name == 'splice') && length === 0) delete wrapped[0];
 | 
				
			||||||
 | 
					      return result(wrapped, this._chain);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Add all accessor Array functions to the wrapper.
 | 
				
			||||||
 | 
					  each(['concat', 'join', 'slice'], function(name) {
 | 
				
			||||||
 | 
					    var method = ArrayProto[name];
 | 
				
			||||||
 | 
					    wrapper.prototype[name] = function() {
 | 
				
			||||||
 | 
					      return result(method.apply(this._wrapped, arguments), this._chain);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Start chaining a wrapped Underscore object.
 | 
				
			||||||
 | 
					  wrapper.prototype.chain = function() {
 | 
				
			||||||
 | 
					    this._chain = true;
 | 
				
			||||||
 | 
					    return this;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Extracts the result from a wrapped and chained object.
 | 
				
			||||||
 | 
					  wrapper.prototype.value = function() {
 | 
				
			||||||
 | 
					    return this._wrapped;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}).call(this);
 | 
				
			||||||
							
								
								
									
										31
									
								
								html/_static/underscore.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					// 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,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")};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);
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								html/_static/up-pressed.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 345 B  | 
							
								
								
									
										
											BIN
										
									
								
								html/_static/up.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 345 B  | 
							
								
								
									
										808
									
								
								html/_static/websupport.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,808 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * websupport.js
 | 
				
			||||||
 | 
					 * ~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * sphinx.websupport utilties for all documentation.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * :copyright: Copyright 2007-2016 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() {
 | 
				
			||||||
 | 
					    $(document).on("click", 'a.comment-close', function(event) {
 | 
				
			||||||
 | 
					      event.preventDefault();
 | 
				
			||||||
 | 
					      hide($(this).attr('id').substring(2));
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    $(document).on("click", 'a.vote', function(event) {
 | 
				
			||||||
 | 
					      event.preventDefault();
 | 
				
			||||||
 | 
					      handleVote($(this));
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    $(document).on("click", 'a.reply', function(event) {
 | 
				
			||||||
 | 
					      event.preventDefault();
 | 
				
			||||||
 | 
					      openReply($(this).attr('id').substring(2));
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    $(document).on("click", 'a.close-reply', function(event) {
 | 
				
			||||||
 | 
					      event.preventDefault();
 | 
				
			||||||
 | 
					      closeReply($(this).attr('id').substring(2));
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    $(document).on("click", 'a.sort-option', function(event) {
 | 
				
			||||||
 | 
					      event.preventDefault();
 | 
				
			||||||
 | 
					      handleReSort($(this));
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    $(document).on("click", 'a.show-proposal', function(event) {
 | 
				
			||||||
 | 
					      event.preventDefault();
 | 
				
			||||||
 | 
					      showProposal($(this).attr('id').substring(2));
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    $(document).on("click", 'a.hide-proposal', function(event) {
 | 
				
			||||||
 | 
					      event.preventDefault();
 | 
				
			||||||
 | 
					      hideProposal($(this).attr('id').substring(2));
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    $(document).on("click", 'a.show-propose-change', function(event) {
 | 
				
			||||||
 | 
					      event.preventDefault();
 | 
				
			||||||
 | 
					      showProposeChange($(this).attr('id').substring(2));
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    $(document).on("click", 'a.hide-propose-change', function(event) {
 | 
				
			||||||
 | 
					      event.preventDefault();
 | 
				
			||||||
 | 
					      hideProposeChange($(this).attr('id').substring(2));
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    $(document).on("click", 'a.accept-comment', function(event) {
 | 
				
			||||||
 | 
					      event.preventDefault();
 | 
				
			||||||
 | 
					      acceptComment($(this).attr('id').substring(2));
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    $(document).on("click", 'a.delete-comment', function(event) {
 | 
				
			||||||
 | 
					      event.preventDefault();
 | 
				
			||||||
 | 
					      deleteComment($(this).attr('id').substring(2));
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    $(document).on("click", 'a.comment-markup', 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>, \
 | 
				
			||||||
 | 
					        <code>``code``</code>, \
 | 
				
			||||||
 | 
					        code blocks: <code>::</code> 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 ▹\
 | 
				
			||||||
 | 
					          </a>\
 | 
				
			||||||
 | 
					          <a href="#" id="hc<%id%>" class="hide-propose-change">\
 | 
				
			||||||
 | 
					            Propose a change ▿\
 | 
				
			||||||
 | 
					          </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 ▹</a>\
 | 
				
			||||||
 | 
					          <a href="#" class="close-reply" id="cr<%id%>">reply ▿</a>\
 | 
				
			||||||
 | 
					          <a href="#" id="sp<%id%>" class="show-proposal">proposal ▹</a>\
 | 
				
			||||||
 | 
					          <a href="#" id="hp<%id%>" class="hide-proposal">proposal ▿</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);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
							
								
								
									
										460
									
								
								html/agi.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,460 @@
 | 
				
			|||||||
 | 
					<!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>AGI — pyst2 0.4.9 documentation</title>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <link rel="stylesheet" href="_static/alabaster.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.4.9',
 | 
				
			||||||
 | 
					        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="pyst2 0.4.9 documentation" href="index.html" />
 | 
				
			||||||
 | 
					    <link rel="next" title="AGITB" href="agitb.html" />
 | 
				
			||||||
 | 
					    <link rel="prev" title="pyst2: A Python Interface to Asterisk" href="readme.html" />
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </head>
 | 
				
			||||||
 | 
					  <body role="document">  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div class="document">
 | 
				
			||||||
 | 
					      <div class="documentwrapper">
 | 
				
			||||||
 | 
					        <div class="bodywrapper">
 | 
				
			||||||
 | 
					          <div class="body" role="main">
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					  <div class="section" id="module-asterisk.agi">
 | 
				
			||||||
 | 
					<span id="agi"></span><h1>AGI<a class="headerlink" href="#module-asterisk.agi" title="Permalink to this headline">¶</a></h1>
 | 
				
			||||||
 | 
					<span class="target" id="module-agi"></span><p>pyvr</p>
 | 
				
			||||||
 | 
					<dl class="docutils">
 | 
				
			||||||
 | 
					<dt>{‘agi_callerid’ <span class="classifier-delimiter">:</span> <span class="classifier">‘mars.putland.int’,</span></dt>
 | 
				
			||||||
 | 
					<dd>‘agi_channel’  : ‘IAX[<a class="reference external" href="mailto:kputland%40kputland">kputland<span>@</span>kputland</a>]/119’,
 | 
				
			||||||
 | 
					‘agi_context’  : ‘default’,
 | 
				
			||||||
 | 
					‘agi_dnid’     : ‘1000’,
 | 
				
			||||||
 | 
					‘agi_enhanced’ : ‘0.0’,
 | 
				
			||||||
 | 
					‘agi_extension’: ‘1000’,
 | 
				
			||||||
 | 
					‘agi_language’ : ‘en’,
 | 
				
			||||||
 | 
					‘agi_priority’ : ‘1’,
 | 
				
			||||||
 | 
					‘agi_rdnis’    : ‘’,
 | 
				
			||||||
 | 
					‘agi_request’  : ‘pyst’,
 | 
				
			||||||
 | 
					‘agi_type’     : ‘IAX’}</dd>
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					<div class="section" id="specification">
 | 
				
			||||||
 | 
					<h2>Specification<a class="headerlink" href="#specification" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
 | 
					<dl class="class">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI">
 | 
				
			||||||
 | 
					<em class="property">class </em><code class="descclassname">asterisk.agi.</code><code class="descname">AGI</code><span class="sig-paren">(</span><em>stdin=<open file '<stdin>'</em>, <em>mode 'r'></em>, <em>stdout=<open file '<stdout>'</em>, <em>mode 'w'></em>, <em>stderr=<open file '<stderr>'</em>, <em>mode 'w'></em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>This class encapsulates communication between Asterisk an a python script.
 | 
				
			||||||
 | 
					It handles encoding commands to Asterisk and parsing responses from
 | 
				
			||||||
 | 
					Asterisk.</p>
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.answer">
 | 
				
			||||||
 | 
					<code class="descname">answer</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.answer"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.answer" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.answer() –> None
 | 
				
			||||||
 | 
					Answer channel if not already in answer state.</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.appexec">
 | 
				
			||||||
 | 
					<code class="descname">appexec</code><span class="sig-paren">(</span><em>application</em>, <em>options=''</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.appexec"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.appexec" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>Executes <application> with given <options>.
 | 
				
			||||||
 | 
					Returns whatever the application returns, or -2 on failure to find
 | 
				
			||||||
 | 
					application</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.channel_status">
 | 
				
			||||||
 | 
					<code class="descname">channel_status</code><span class="sig-paren">(</span><em>channel=''</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.channel_status"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.channel_status" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.channel_status(channel=’‘) –> int
 | 
				
			||||||
 | 
					Returns the status of the specified channel.  If no channel name is
 | 
				
			||||||
 | 
					given the returns the status of the current channel.</p>
 | 
				
			||||||
 | 
					<p>Return values:
 | 
				
			||||||
 | 
					0 Channel is down and available
 | 
				
			||||||
 | 
					1 Channel is down, but reserved
 | 
				
			||||||
 | 
					2 Channel is off hook
 | 
				
			||||||
 | 
					3 Digits (or equivalent) have been dialed
 | 
				
			||||||
 | 
					4 Line is ringing
 | 
				
			||||||
 | 
					5 Remote end is ringing
 | 
				
			||||||
 | 
					6 Line is up
 | 
				
			||||||
 | 
					7 Line is busy</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.control_stream_file">
 | 
				
			||||||
 | 
					<code class="descname">control_stream_file</code><span class="sig-paren">(</span><em>filename</em>, <em>escape_digits=''</em>, <em>skipms=3000</em>, <em>fwd=''</em>, <em>rew=''</em>, <em>pause=''</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.control_stream_file"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.control_stream_file" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>Send the given file, allowing playback to be interrupted by the given
 | 
				
			||||||
 | 
					digits, if any.  escape_digits is a string ‘12345’ or a list  of
 | 
				
			||||||
 | 
					ints [1,2,3,4,5] or strings [‘1’,‘2’,‘3’] or mixed [1,‘2’,3,‘4’]
 | 
				
			||||||
 | 
					If sample offset is provided then the audio will seek to sample
 | 
				
			||||||
 | 
					offset before play starts.  Returns  digit if one was pressed.
 | 
				
			||||||
 | 
					Throws AGIError if the channel was disconnected.  Remember, the file
 | 
				
			||||||
 | 
					extension must not be included in the filename.</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.database_del">
 | 
				
			||||||
 | 
					<code class="descname">database_del</code><span class="sig-paren">(</span><em>family</em>, <em>key</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.database_del"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.database_del" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.database_del(family, key) –> None
 | 
				
			||||||
 | 
					Deletes an entry in the Asterisk database for a
 | 
				
			||||||
 | 
					given family and key.</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.database_deltree">
 | 
				
			||||||
 | 
					<code class="descname">database_deltree</code><span class="sig-paren">(</span><em>family</em>, <em>key=''</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.database_deltree"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.database_deltree" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.database_deltree(family, key=’‘) –> None
 | 
				
			||||||
 | 
					Deletes a family or specific keytree with in a family
 | 
				
			||||||
 | 
					in the Asterisk database.</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.database_get">
 | 
				
			||||||
 | 
					<code class="descname">database_get</code><span class="sig-paren">(</span><em>family</em>, <em>key</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.database_get"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.database_get" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.database_get(family, key) –> str
 | 
				
			||||||
 | 
					Retrieves an entry in the Asterisk database for a given family and key.
 | 
				
			||||||
 | 
					Returns 0 if <key> is not set.  Returns 1 if <key>
 | 
				
			||||||
 | 
					is set and returns the variable in parenthesis
 | 
				
			||||||
 | 
					example return code: 200 result=1 (testvariable)</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.database_put">
 | 
				
			||||||
 | 
					<code class="descname">database_put</code><span class="sig-paren">(</span><em>family</em>, <em>key</em>, <em>value</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.database_put"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.database_put" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.database_put(family, key, value) –> None
 | 
				
			||||||
 | 
					Adds or updates an entry in the Asterisk database for a
 | 
				
			||||||
 | 
					given family, key, and value.</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.get_data">
 | 
				
			||||||
 | 
					<code class="descname">get_data</code><span class="sig-paren">(</span><em>filename</em>, <em>timeout=2000</em>, <em>max_digits=255</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.get_data"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.get_data" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.get_data(filename, timeout=DEFAULT_TIMEOUT, max_digits=255) –> digits
 | 
				
			||||||
 | 
					Stream the given file and receive dialed digits</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.get_full_variable">
 | 
				
			||||||
 | 
					<code class="descname">get_full_variable</code><span class="sig-paren">(</span><em>name</em>, <em>channel=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.get_full_variable"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.get_full_variable" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>Get a channel variable.</p>
 | 
				
			||||||
 | 
					<p>This function returns the value of the indicated channel variable.  If
 | 
				
			||||||
 | 
					the variable is not set, an empty string is returned.</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.get_option">
 | 
				
			||||||
 | 
					<code class="descname">get_option</code><span class="sig-paren">(</span><em>filename</em>, <em>escape_digits=''</em>, <em>timeout=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.get_option"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.get_option" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.get_option(filename, escape_digits=’‘, timeout=0) –> digit
 | 
				
			||||||
 | 
					Send the given file, allowing playback to be interrupted by the given
 | 
				
			||||||
 | 
					digits, if any.  escape_digits is a string ‘12345’ or a list  of
 | 
				
			||||||
 | 
					ints [1,2,3,4,5] or strings [‘1’,‘2’,‘3’] or mixed [1,‘2’,3,‘4’]
 | 
				
			||||||
 | 
					Returns  digit if one was pressed.
 | 
				
			||||||
 | 
					Throws AGIError if the channel was disconnected.  Remember, the file
 | 
				
			||||||
 | 
					extension must not be included in the filename.</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.get_result">
 | 
				
			||||||
 | 
					<code class="descname">get_result</code><span class="sig-paren">(</span><em>stdin=<open file '<stdin>'</em>, <em>mode 'r'></em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.get_result"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.get_result" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>Read the result of a command from Asterisk</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.get_variable">
 | 
				
			||||||
 | 
					<code class="descname">get_variable</code><span class="sig-paren">(</span><em>name</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.get_variable"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.get_variable" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>Get a channel variable.</p>
 | 
				
			||||||
 | 
					<p>This function returns the value of the indicated channel variable.  If
 | 
				
			||||||
 | 
					the variable is not set, an empty string is returned.</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.hangup">
 | 
				
			||||||
 | 
					<code class="descname">hangup</code><span class="sig-paren">(</span><em>channel=''</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.hangup"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.hangup" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>Hangs up the specified channel.
 | 
				
			||||||
 | 
					If no channel name is given, hangs up the current channel</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.noop">
 | 
				
			||||||
 | 
					<code class="descname">noop</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.noop"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.noop" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.noop() –> None
 | 
				
			||||||
 | 
					Does nothing</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.receive_char">
 | 
				
			||||||
 | 
					<code class="descname">receive_char</code><span class="sig-paren">(</span><em>timeout=2000</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.receive_char"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.receive_char" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.receive_char(timeout=DEFAULT_TIMEOUT) –> chr
 | 
				
			||||||
 | 
					Receives a character of text on a channel.  Specify timeout to be the
 | 
				
			||||||
 | 
					maximum time to wait for input in milliseconds, or 0 for infinite. Most channels
 | 
				
			||||||
 | 
					do not support the reception of text.</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.record_file">
 | 
				
			||||||
 | 
					<code class="descname">record_file</code><span class="sig-paren">(</span><em>filename</em>, <em>format='gsm'</em>, <em>escape_digits='#'</em>, <em>timeout=20000</em>, <em>offset=0</em>, <em>beep='beep'</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.record_file"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.record_file" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.record_file(filename, format, escape_digits, timeout=DEFAULT_TIMEOUT, offset=0, beep=’beep’) –> None
 | 
				
			||||||
 | 
					Record to a file until a given dtmf digit in the sequence is received
 | 
				
			||||||
 | 
					The format will specify what kind of file will be recorded.  The timeout
 | 
				
			||||||
 | 
					is the maximum record time in milliseconds, or -1 for no timeout. Offset
 | 
				
			||||||
 | 
					samples is optional, and if provided will seek to the offset without
 | 
				
			||||||
 | 
					exceeding the end of the file</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.say_alpha">
 | 
				
			||||||
 | 
					<code class="descname">say_alpha</code><span class="sig-paren">(</span><em>characters</em>, <em>escape_digits=''</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.say_alpha"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.say_alpha" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.say_alpha(string, escape_digits=’‘) –> digit
 | 
				
			||||||
 | 
					Say a given character string, returning early if any of the given DTMF
 | 
				
			||||||
 | 
					digits are received on the channel.
 | 
				
			||||||
 | 
					Throws AGIError on channel failure</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.say_date">
 | 
				
			||||||
 | 
					<code class="descname">say_date</code><span class="sig-paren">(</span><em>seconds</em>, <em>escape_digits=''</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.say_date"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.say_date" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.say_date(seconds, escape_digits=’‘) –> digit
 | 
				
			||||||
 | 
					Say a given date, returning early if any of the given DTMF digits are
 | 
				
			||||||
 | 
					pressed.  The date should be in seconds since the UNIX Epoch (Jan 1, 1970 00:00:00)</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.say_datetime">
 | 
				
			||||||
 | 
					<code class="descname">say_datetime</code><span class="sig-paren">(</span><em>seconds</em>, <em>escape_digits=''</em>, <em>format=''</em>, <em>zone=''</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.say_datetime"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.say_datetime" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.say_datetime(seconds, escape_digits=’‘, format=’‘, zone=’‘) –> digit
 | 
				
			||||||
 | 
					Say a given date in the format specfied (see voicemail.conf), returning
 | 
				
			||||||
 | 
					early if any of the given DTMF digits are pressed.  The date should be
 | 
				
			||||||
 | 
					in seconds since the UNIX Epoch (Jan 1, 1970 00:00:00).</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.say_digits">
 | 
				
			||||||
 | 
					<code class="descname">say_digits</code><span class="sig-paren">(</span><em>digits</em>, <em>escape_digits=''</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.say_digits"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.say_digits" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.say_digits(digits, escape_digits=’‘) –> digit
 | 
				
			||||||
 | 
					Say a given digit string, returning early if any of the given DTMF digits
 | 
				
			||||||
 | 
					are received on the channel.
 | 
				
			||||||
 | 
					Throws AGIError on channel failure</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.say_number">
 | 
				
			||||||
 | 
					<code class="descname">say_number</code><span class="sig-paren">(</span><em>number</em>, <em>escape_digits=''</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.say_number"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.say_number" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.say_number(number, escape_digits=’‘) –> digit
 | 
				
			||||||
 | 
					Say a given digit string, returning early if any of the given DTMF digits
 | 
				
			||||||
 | 
					are received on the channel.
 | 
				
			||||||
 | 
					Throws AGIError on channel failure</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.say_phonetic">
 | 
				
			||||||
 | 
					<code class="descname">say_phonetic</code><span class="sig-paren">(</span><em>characters</em>, <em>escape_digits=''</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.say_phonetic"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.say_phonetic" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.say_phonetic(string, escape_digits=’‘) –> digit
 | 
				
			||||||
 | 
					Phonetically say a given character string, returning early if any of
 | 
				
			||||||
 | 
					the given DTMF digits are received on the channel.
 | 
				
			||||||
 | 
					Throws AGIError on channel failure</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.say_time">
 | 
				
			||||||
 | 
					<code class="descname">say_time</code><span class="sig-paren">(</span><em>seconds</em>, <em>escape_digits=''</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.say_time"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.say_time" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.say_time(seconds, escape_digits=’‘) –> digit
 | 
				
			||||||
 | 
					Say a given time, returning early if any of the given DTMF digits are
 | 
				
			||||||
 | 
					pressed.  The time should be in seconds since the UNIX Epoch (Jan 1, 1970 00:00:00)</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.send_command">
 | 
				
			||||||
 | 
					<code class="descname">send_command</code><span class="sig-paren">(</span><em>command</em>, <em>*args</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.send_command"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.send_command" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>Send a command to Asterisk</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.send_image">
 | 
				
			||||||
 | 
					<code class="descname">send_image</code><span class="sig-paren">(</span><em>filename</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.send_image"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.send_image" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.send_image(filename) –> None
 | 
				
			||||||
 | 
					Sends the given image on a channel.  Most channels do not support the
 | 
				
			||||||
 | 
					transmission of images.   Image names should not include extensions.
 | 
				
			||||||
 | 
					Throws AGIError on channel failure</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.send_text">
 | 
				
			||||||
 | 
					<code class="descname">send_text</code><span class="sig-paren">(</span><em>text=''</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.send_text"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.send_text" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.send_text(text=’‘) –> None
 | 
				
			||||||
 | 
					Sends the given text on a channel.  Most channels do not support the
 | 
				
			||||||
 | 
					transmission of text.
 | 
				
			||||||
 | 
					Throws AGIError on error/hangup</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.set_autohangup">
 | 
				
			||||||
 | 
					<code class="descname">set_autohangup</code><span class="sig-paren">(</span><em>secs</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.set_autohangup"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.set_autohangup" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.set_autohangup(secs) –> None
 | 
				
			||||||
 | 
					Cause the channel to automatically hangup at <secs> seconds in the
 | 
				
			||||||
 | 
					future.  Of course it can be hungup before then as well.   Setting to
 | 
				
			||||||
 | 
					0 will cause the autohangup feature to be disabled on this channel.</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.set_callerid">
 | 
				
			||||||
 | 
					<code class="descname">set_callerid</code><span class="sig-paren">(</span><em>number</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.set_callerid"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.set_callerid" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.set_callerid(number) –> None
 | 
				
			||||||
 | 
					Changes the callerid of the current channel.</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.set_context">
 | 
				
			||||||
 | 
					<code class="descname">set_context</code><span class="sig-paren">(</span><em>context</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.set_context"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.set_context" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>Sets the context for continuation upon exiting the application.
 | 
				
			||||||
 | 
					No error appears to be produced.  Does not set exten or priority
 | 
				
			||||||
 | 
					Use at your own risk.  Ensure that you specify a valid context.</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.set_extension">
 | 
				
			||||||
 | 
					<code class="descname">set_extension</code><span class="sig-paren">(</span><em>extension</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.set_extension"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.set_extension" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>Sets the extension for continuation upon exiting the application.
 | 
				
			||||||
 | 
					No error appears to be produced.  Does not set context or priority
 | 
				
			||||||
 | 
					Use at your own risk.  Ensure that you specify a valid extension.</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.set_priority">
 | 
				
			||||||
 | 
					<code class="descname">set_priority</code><span class="sig-paren">(</span><em>priority</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.set_priority"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.set_priority" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>Sets the priority for continuation upon exiting the application.
 | 
				
			||||||
 | 
					No error appears to be produced.  Does not set exten or context
 | 
				
			||||||
 | 
					Use at your own risk.  Ensure that you specify a valid priority.</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.set_variable">
 | 
				
			||||||
 | 
					<code class="descname">set_variable</code><span class="sig-paren">(</span><em>name</em>, <em>value</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.set_variable"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.set_variable" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>Set a channel variable.</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.stream_file">
 | 
				
			||||||
 | 
					<code class="descname">stream_file</code><span class="sig-paren">(</span><em>filename</em>, <em>escape_digits=''</em>, <em>sample_offset=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.stream_file"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.stream_file" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.stream_file(filename, escape_digits=’‘, sample_offset=0) –> digit
 | 
				
			||||||
 | 
					Send the given file, allowing playback to be interrupted by the given
 | 
				
			||||||
 | 
					digits, if any.  escape_digits is a string ‘12345’ or a list  of
 | 
				
			||||||
 | 
					ints [1,2,3,4,5] or strings [‘1’,‘2’,‘3’] or mixed [1,‘2’,3,‘4’]
 | 
				
			||||||
 | 
					If sample offset is provided then the audio will seek to sample
 | 
				
			||||||
 | 
					offset before play starts.  Returns  digit if one was pressed.
 | 
				
			||||||
 | 
					Throws AGIError if the channel was disconnected.  Remember, the file
 | 
				
			||||||
 | 
					extension must not be included in the filename.</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.tdd_mode">
 | 
				
			||||||
 | 
					<code class="descname">tdd_mode</code><span class="sig-paren">(</span><em>mode='off'</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.tdd_mode"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.tdd_mode" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.tdd_mode(mode=’on’|’off’) –> None
 | 
				
			||||||
 | 
					Enable/Disable TDD transmission/reception on a channel.
 | 
				
			||||||
 | 
					Throws AGIAppError if channel is not TDD-capable.</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.test_hangup">
 | 
				
			||||||
 | 
					<code class="descname">test_hangup</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.test_hangup"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.test_hangup" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>This function throws AGIHangup if we have recieved a SIGHUP</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.verbose">
 | 
				
			||||||
 | 
					<code class="descname">verbose</code><span class="sig-paren">(</span><em>message</em>, <em>level=1</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.verbose"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.verbose" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.verbose(message=’‘, level=1) –> None
 | 
				
			||||||
 | 
					Sends <message> to the console via verbose message system.
 | 
				
			||||||
 | 
					<level> is the the verbose level (1-4)</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.agi.AGI.wait_for_digit">
 | 
				
			||||||
 | 
					<code class="descname">wait_for_digit</code><span class="sig-paren">(</span><em>timeout=2000</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agi.html#AGI.wait_for_digit"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agi.AGI.wait_for_digit" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>agi.wait_for_digit(timeout=DEFAULT_TIMEOUT) –> digit
 | 
				
			||||||
 | 
					Waits for up to ‘timeout’ milliseconds for a channel to receive a DTMF
 | 
				
			||||||
 | 
					digit.  Returns digit dialed
 | 
				
			||||||
 | 
					Throws AGIError on channel falure</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
 | 
				
			||||||
 | 
					        <div class="sphinxsidebarwrapper">
 | 
				
			||||||
 | 
					  <h3><a href="index.html">Table Of Contents</a></h3>
 | 
				
			||||||
 | 
					  <ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#">AGI</a><ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#specification">Specification</a></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					<div class="relations">
 | 
				
			||||||
 | 
					<h3>Related Topics</h3>
 | 
				
			||||||
 | 
					<ul>
 | 
				
			||||||
 | 
					  <li><a href="index.html">Documentation overview</a><ul>
 | 
				
			||||||
 | 
					      <li>Previous: <a href="readme.html" title="previous chapter">pyst2: A Python Interface to Asterisk</a></li>
 | 
				
			||||||
 | 
					      <li>Next: <a href="agitb.html" title="next chapter">AGITB</a></li>
 | 
				
			||||||
 | 
					  </ul></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					  <div role="note" aria-label="source link">
 | 
				
			||||||
 | 
					    <h3>This Page</h3>
 | 
				
			||||||
 | 
					    <ul class="this-page-menu">
 | 
				
			||||||
 | 
					      <li><a href="_sources/agi.txt"
 | 
				
			||||||
 | 
					            rel="nofollow">Show Source</a></li>
 | 
				
			||||||
 | 
					    </ul>
 | 
				
			||||||
 | 
					   </div>
 | 
				
			||||||
 | 
					<div id="searchbox" style="display: none" role="search">
 | 
				
			||||||
 | 
					  <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="footer">
 | 
				
			||||||
 | 
					      ©2016, Randall Degges.
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      |
 | 
				
			||||||
 | 
					      Powered by <a href="http://sphinx-doc.org/">Sphinx 1.3.6</a>
 | 
				
			||||||
 | 
					      & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.7</a>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      |
 | 
				
			||||||
 | 
					      <a href="_sources/agi.txt"
 | 
				
			||||||
 | 
					          rel="nofollow">Page source</a>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  </body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
							
								
								
									
										171
									
								
								html/agitb.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,171 @@
 | 
				
			|||||||
 | 
					<!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>AGITB — pyst2 0.4.9 documentation</title>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <link rel="stylesheet" href="_static/alabaster.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.4.9',
 | 
				
			||||||
 | 
					        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="pyst2 0.4.9 documentation" href="index.html" />
 | 
				
			||||||
 | 
					    <link rel="next" title="Config" href="config.html" />
 | 
				
			||||||
 | 
					    <link rel="prev" title="AGI" href="agi.html" />
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </head>
 | 
				
			||||||
 | 
					  <body role="document">  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div class="document">
 | 
				
			||||||
 | 
					      <div class="documentwrapper">
 | 
				
			||||||
 | 
					        <div class="bodywrapper">
 | 
				
			||||||
 | 
					          <div class="body" role="main">
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					  <div class="section" id="module-asterisk.agitb">
 | 
				
			||||||
 | 
					<span id="agitb"></span><h1>AGITB<a class="headerlink" href="#module-asterisk.agitb" title="Permalink to this headline">¶</a></h1>
 | 
				
			||||||
 | 
					<span class="target" id="module-agi"></span><div class="section" id="example">
 | 
				
			||||||
 | 
					<h2>Example<a class="headerlink" href="#example" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
 | 
					<p>To enable this module, do:</p>
 | 
				
			||||||
 | 
					<div class="highlight-python"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">asterisk.agitb</span><span class="o">,</span> <span class="nn">asterisk.agi</span>
 | 
				
			||||||
 | 
					<span class="n">asterisk</span><span class="o">.</span><span class="n">agitb</span><span class="o">.</span><span class="n">enable</span><span class="p">(</span><span class="n">display</span> <span class="o">=</span> <span class="bp">False</span><span class="p">,</span> <span class="n">logdir</span> <span class="o">=</span> <span class="s1">'/var/log/asterisk/'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="n">agi</span> <span class="o">=</span> <span class="n">asterisk</span><span class="o">.</span><span class="n">agi</span><span class="o">.</span><span class="n">AGI</span><span class="p">()</span>
 | 
				
			||||||
 | 
					<span class="n">asterisk</span><span class="o">.</span><span class="n">agitb</span><span class="o">.</span><span class="n">enable</span><span class="p">(</span><span class="n">agi</span><span class="p">,</span> <span class="bp">False</span><span class="p">,</span> <span class="s1">'/var/log/asterisk'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					</pre></div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<p>at the top of your script.  The optional arguments to enable() are:</p>
 | 
				
			||||||
 | 
					<ul class="simple">
 | 
				
			||||||
 | 
					<li>agi         - the agi handle to write verbose messages to</li>
 | 
				
			||||||
 | 
					<li>display     - if true, tracebacks are displayed on the asterisk console
 | 
				
			||||||
 | 
					(used with the agi option)</li>
 | 
				
			||||||
 | 
					<li>logdir      - if set, tracebacks are written to files in this directory</li>
 | 
				
			||||||
 | 
					<li>context     - number of lines of source code to show for each stack frame</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					<p>By default, tracebacks are displayed but not saved, and the context is 5 lines.</p>
 | 
				
			||||||
 | 
					<p>You may want to add a logdir if you call agitb.enable() before you have
 | 
				
			||||||
 | 
					an agi.AGI() handle.</p>
 | 
				
			||||||
 | 
					<p>Alternatively, if you have caught an exception and want agitb to display it
 | 
				
			||||||
 | 
					for you, call agitb.handler().  The optional argument to handler() is a
 | 
				
			||||||
 | 
					3-item tuple (etype, evalue, etb) just like the value of sys.exc_info().
 | 
				
			||||||
 | 
					If you do not pass anything to handler() it will use sys.exc_info().</p>
 | 
				
			||||||
 | 
					<p>This script was adapted from Ka-Ping Yee’s cgitb.</p>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="section" id="specification">
 | 
				
			||||||
 | 
					<h2>Specification<a class="headerlink" href="#specification" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
 | 
					<dl class="class">
 | 
				
			||||||
 | 
					<dt id="asterisk.agitb.Hook">
 | 
				
			||||||
 | 
					<em class="property">class </em><code class="descclassname">asterisk.agitb.</code><code class="descname">Hook</code><span class="sig-paren">(</span><em>display=1</em>, <em>logdir=None</em>, <em>context=5</em>, <em>file=None</em>, <em>agi=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agitb.html#Hook"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agitb.Hook" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>A hook to replace sys.excepthook that shows tracebacks in HTML.</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="function">
 | 
				
			||||||
 | 
					<dt id="asterisk.agitb.enable">
 | 
				
			||||||
 | 
					<code class="descclassname">asterisk.agitb.</code><code class="descname">enable</code><span class="sig-paren">(</span><em>agi=None</em>, <em>display=1</em>, <em>logdir=None</em>, <em>context=5</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agitb.html#enable"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agitb.enable" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>Install an exception handler that formats tracebacks as HTML.</p>
 | 
				
			||||||
 | 
					<p>The optional argument ‘display’ can be set to 0 to suppress sending the
 | 
				
			||||||
 | 
					traceback to the browser, and ‘logdir’ can be set to a directory to cause
 | 
				
			||||||
 | 
					tracebacks to be written to files there.</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="function">
 | 
				
			||||||
 | 
					<dt id="asterisk.agitb.lookup">
 | 
				
			||||||
 | 
					<code class="descclassname">asterisk.agitb.</code><code class="descname">lookup</code><span class="sig-paren">(</span><em>name</em>, <em>frame</em>, <em>locals</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agitb.html#lookup"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agitb.lookup" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>Find the value for a given name in the given environment.</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="function">
 | 
				
			||||||
 | 
					<dt id="asterisk.agitb.scanvars">
 | 
				
			||||||
 | 
					<code class="descclassname">asterisk.agitb.</code><code class="descname">scanvars</code><span class="sig-paren">(</span><em>reader</em>, <em>frame</em>, <em>locals</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agitb.html#scanvars"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agitb.scanvars" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>Scan one logical line of Python and look up values of variables used.</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="function">
 | 
				
			||||||
 | 
					<dt id="asterisk.agitb.text">
 | 
				
			||||||
 | 
					<code class="descclassname">asterisk.agitb.</code><code class="descname">text</code><span class="sig-paren">(</span><em>eparams</em>, <em>context=5</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/agitb.html#text"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.agitb.text" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>Return a plain text document describing a given traceback.</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
 | 
				
			||||||
 | 
					        <div class="sphinxsidebarwrapper">
 | 
				
			||||||
 | 
					  <h3><a href="index.html">Table Of Contents</a></h3>
 | 
				
			||||||
 | 
					  <ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#">AGITB</a><ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#example">Example</a></li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#specification">Specification</a></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					<div class="relations">
 | 
				
			||||||
 | 
					<h3>Related Topics</h3>
 | 
				
			||||||
 | 
					<ul>
 | 
				
			||||||
 | 
					  <li><a href="index.html">Documentation overview</a><ul>
 | 
				
			||||||
 | 
					      <li>Previous: <a href="agi.html" title="previous chapter">AGI</a></li>
 | 
				
			||||||
 | 
					      <li>Next: <a href="config.html" title="next chapter">Config</a></li>
 | 
				
			||||||
 | 
					  </ul></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					  <div role="note" aria-label="source link">
 | 
				
			||||||
 | 
					    <h3>This Page</h3>
 | 
				
			||||||
 | 
					    <ul class="this-page-menu">
 | 
				
			||||||
 | 
					      <li><a href="_sources/agitb.txt"
 | 
				
			||||||
 | 
					            rel="nofollow">Show Source</a></li>
 | 
				
			||||||
 | 
					    </ul>
 | 
				
			||||||
 | 
					   </div>
 | 
				
			||||||
 | 
					<div id="searchbox" style="display: none" role="search">
 | 
				
			||||||
 | 
					  <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="footer">
 | 
				
			||||||
 | 
					      ©2016, Randall Degges.
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      |
 | 
				
			||||||
 | 
					      Powered by <a href="http://sphinx-doc.org/">Sphinx 1.3.6</a>
 | 
				
			||||||
 | 
					      & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.7</a>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      |
 | 
				
			||||||
 | 
					      <a href="_sources/agitb.txt"
 | 
				
			||||||
 | 
					          rel="nofollow">Page source</a>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  </body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
							
								
								
									
										317
									
								
								html/changes.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,317 @@
 | 
				
			|||||||
 | 
					<!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>Changes — pyst2 0.4.9 documentation</title>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <link rel="stylesheet" href="_static/alabaster.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.4.9',
 | 
				
			||||||
 | 
					        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="pyst2 0.4.9 documentation" href="index.html" />
 | 
				
			||||||
 | 
					    <link rel="prev" title="Manager" href="manager.html" />
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </head>
 | 
				
			||||||
 | 
					  <body role="document">  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div class="document">
 | 
				
			||||||
 | 
					      <div class="documentwrapper">
 | 
				
			||||||
 | 
					        <div class="bodywrapper">
 | 
				
			||||||
 | 
					          <div class="body" role="main">
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					  <div class="section" id="changes">
 | 
				
			||||||
 | 
					<h1>Changes<a class="headerlink" href="#changes" title="Permalink to this headline">¶</a></h1>
 | 
				
			||||||
 | 
					<p>2016-02-16  Randall Degges <<a class="reference external" href="https://github.com/rdegges">https://github.com/rdegges</a>></p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>Fixing issue in AGI class init function. Thanks to @sancho2934489 for the
 | 
				
			||||||
 | 
					find!</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<p>2015-11-16  Scinawa Antani <<a class="reference external" href="https://github.com/Scinawa">https://github.com/Scinawa</a>></p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>Fixing indentation errors.</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<p>2015-11-14  Ben Davis <<a class="reference external" href="https://github.com/tuxpowered">https://github.com/tuxpowered</a>></p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>Handling more UTF-8 encoding issues in <cite>_quote</cite> method.</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<p>2015-07-18  Artem Sorokin</p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>Fixing UTF-8 encoding issues.</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<p>2015-07-15  Artem Sorokin</p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>Fix multiline command end marker for OpenVox GSM Gateway.</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<p>2015-03-31  Randall Degges</p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>Porting packaging to setuptools (modern).</li>
 | 
				
			||||||
 | 
					<li>Adding six as a dependency (it was missing before).</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<p>2015-03-30  Areski Belaid</p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>Fixing the MANIFEST.in file I accidentally broke :)</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<dl class="docutils">
 | 
				
			||||||
 | 
					<dt>2015-03-29  Timur Tuchkovenko <<a class="reference external" href="mailto:eill%40yandex.ru">eill<span>@</span>yandex<span>.</span>ru</a>></dt>
 | 
				
			||||||
 | 
					<dd><ul class="first last simple">
 | 
				
			||||||
 | 
					<li>UPGRADE: AMI fix for Python 3 compatibility.</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</dd>
 | 
				
			||||||
 | 
					<dt>2014-10-08  Timur Tuchkovenko <<a class="reference external" href="mailto:eill%40yandex.ru">eill<span>@</span>yandex<span>.</span>ru</a>></dt>
 | 
				
			||||||
 | 
					<dd><ul class="first last simple">
 | 
				
			||||||
 | 
					<li>UPGRADE: initial Python 3 support. Now pyst2 requires
 | 
				
			||||||
 | 
					Python ‘six’ module. Some minor changes in other files.</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</dd>
 | 
				
			||||||
 | 
					<dt>2014-09-14  Sp1tF1r3 <<a class="reference external" href="https://github.com/Sp1tF1r3">https://github.com/Sp1tF1r3</a>></dt>
 | 
				
			||||||
 | 
					<dd><ul class="first last simple">
 | 
				
			||||||
 | 
					<li>asterisk/manager.py: added action ‘Reload’ for Asterisk Manager
 | 
				
			||||||
 | 
					Interface (AMI).</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</dd>
 | 
				
			||||||
 | 
					<dt>2013-12-03  Ludovic Gasc <<a class="reference external" href="mailto:gmludo%40gmail.com">gmludo<span>@</span>gmail<span>.</span>com</a>></dt>
 | 
				
			||||||
 | 
					<dd><ul class="first last simple">
 | 
				
			||||||
 | 
					<li>examples/agi_script.py: added example script to explain AGI
 | 
				
			||||||
 | 
					functionality.</li>
 | 
				
			||||||
 | 
					<li>README: renamed to REAMDE.rst for Github’s Markdown support.</li>
 | 
				
			||||||
 | 
					<li>setup.py: minor changes.</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</dd>
 | 
				
			||||||
 | 
					<dt>2012-11-12  Arezqui Belaid <<a class="reference external" href="mailto:areski%40gmail.com">areski<span>@</span>gmail<span>.</span>com</a>></dt>
 | 
				
			||||||
 | 
					<dd><ul class="first last simple">
 | 
				
			||||||
 | 
					<li>asterisk/manager.py: minor empty line enhancements.</li>
 | 
				
			||||||
 | 
					<li>examples/show_channels.py: added example script to show information via
 | 
				
			||||||
 | 
					Asterisk Manager Interface (AMI).</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</dd>
 | 
				
			||||||
 | 
					<dt>2012-11-11      Arezqui Belaid <<a class="reference external" href="mailto:areski%40gmail.com">areski<span>@</span>gmail<span>.</span>com</a>></dt>
 | 
				
			||||||
 | 
					<dd><ul class="first last simple">
 | 
				
			||||||
 | 
					<li>PEP8 Fixes</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</dd>
 | 
				
			||||||
 | 
					<dt>2011-05-31      Randall Degges <<a class="reference external" href="mailto:rdegges%40gmail.com">rdegges<span>@</span>gmail<span>.</span>com</a>></dt>
 | 
				
			||||||
 | 
					<dd><ul class="first last simple">
 | 
				
			||||||
 | 
					<li>BUGFIX: Fixing issue that prevented manager.status command from returning
 | 
				
			||||||
 | 
					proper output.</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</dd>
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					<p>2007-01-26  Matthew Nicholson  <<a class="reference external" href="mailto:mnicholson%40digium.com">mnicholson<span>@</span>digium<span>.</span>com</a>></p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>asterisk/manager.py: Make get_header() functions work like
 | 
				
			||||||
 | 
					dict.get().</li>
 | 
				
			||||||
 | 
					<li>UPGRADE: Updated.</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<p>2007-01-16  Matthew Nicholson  <<a class="reference external" href="mailto:mnicholson%40digium.com">mnicholson<span>@</span>digium<span>.</span>com</a>></p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>asterisk/manager.py: Fix support for Manager.command(). Patch from
 | 
				
			||||||
 | 
					Karl Putland <<a class="reference external" href="mailto:karl%40klasstek.com">karl<span>@</span>klasstek<span>.</span>com</a>>.</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<p>2007-01-02  Matthew Nicholson  <<a class="reference external" href="mailto:mnicholson%40digium.com">mnicholson<span>@</span>digium<span>.</span>com</a>></p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>asterisk/agi.py (AGI.set_autohangup): Fixed syntax error.</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<p>2006-11-28  Matthew Nicholson  <<a class="reference external" href="mailto:mnicholson%40digium.com">mnicholson<span>@</span>digium<span>.</span>com</a>></p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>UPGRADE: Tweaked formatting.</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<p>2006-10-30  Matthew Nicholson  <<a class="reference external" href="mailto:mnicholson%40digium.com">mnicholson<span>@</span>digium<span>.</span>com</a>></p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>ChangeLog: Fixed previous entry.</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<p>2006-10-30  Matthew Nicholson  <<a class="reference external" href="mailto:mnicholson%40digium.com">mnicholson<span>@</span>digium<span>.</span>com</a>></p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>TODO: Updated.</li>
 | 
				
			||||||
 | 
					<li>asterisk/agi.py (AGI.control_stream_file): Changed default skipms</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					<p>and quoted arguments.</p>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<p>2006-10-24  Matthew Nicholson  <<a class="reference external" href="mailto:mnicholson%40digium.com">mnicholson<span>@</span>digium<span>.</span>com</a>></p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>asterisk/agi.py: Added get_variable_full command.</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<p>2006-10-18  Matthew Nicholson  <<a class="reference external" href="mailto:mnicholson%40digium.com">mnicholson<span>@</span>digium<span>.</span>com</a>></p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>asterisk/agitb.py: Make error output default to sys.stderr instead</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					<p>of sys.stdout.</p>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<p>2006-09-19  Matthew Nicholson  <<a class="reference external" href="mailto:mnicholson%40digium.com">mnicholson<span>@</span>digium<span>.</span>com</a>></p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>debian/control: Removed XS-Python-Versions header to make it default</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					<p>to all python versions.</p>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<p>2006-09-19  Matthew Nicholson  <<a class="reference external" href="mailto:mnicholson%40digium.com">mnicholson<span>@</span>digium<span>.</span>com</a>></p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>setup.py: Updated version.</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<p>2006-09-19  Matthew Nicholson  <<a class="reference external" href="mailto:mnicholson%40digium.com">mnicholson<span>@</span>digium<span>.</span>com</a>></p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>debian/rules: Changed to use pysupport.</li>
 | 
				
			||||||
 | 
					<li>debian/control: Changed to use pysupport and changed arch to all.</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<p>2006-09-19  Matthew Nicholson  <<a class="reference external" href="mailto:mnicholson%40digium.com">mnicholson<span>@</span>digium<span>.</span>com</a>></p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>MANIFEST.in: Added NEWS to manifest.</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<p>2006-09-19  Matthew Nicholson  <<a class="reference external" href="mailto:mnicholson%40digium.com">mnicholson<span>@</span>digium<span>.</span>com</a>></p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>debian/rules: Updated to reflect new python policy.</li>
 | 
				
			||||||
 | 
					<li>debian/control: Updated to reflect new python policy.</li>
 | 
				
			||||||
 | 
					<li>debian/changelog: Updated.</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<p>2006-08-23  Matthew Nicholson  <<a class="reference external" href="mailto:mnicholson%40digium.com">mnicholson<span>@</span>digium<span>.</span>com</a>></p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>UPGRADE: Updated.</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<p>2006-08-23  Matthew Nicholson  <<a class="reference external" href="mailto:mnicholson%40digium.com">mnicholson<span>@</span>digium<span>.</span>com</a>></p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>asterisk/manager.py (unregister_event): Added.</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<p>2006-08-23  Matthew Nicholson  <<a class="reference external" href="mailto:mnicholson%40digium.com">mnicholson<span>@</span>digium<span>.</span>com</a>></p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>NEWS: Added.</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<p>2006-07-14  Matthew Nicholson  <<a class="reference external" href="mailto:mnicholson%40digium.com">mnicholson<span>@</span>digium<span>.</span>com</a>></p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>asterisk/agi.py (wait_for_digit): Only catch ValueError, not all</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					<p>exceptions.</p>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<p>2006-07-14  Matthew Nicholson  <<a class="reference external" href="mailto:mnicholson%40digium.com">mnicholson<span>@</span>digium<span>.</span>com</a>></p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>TODO: Updated.</li>
 | 
				
			||||||
 | 
					<li>asterisk/agi.py (set_variable): Documentation changes.</li>
 | 
				
			||||||
 | 
					<li>asterisk/agi.py (get_variable): Changed to return and empty string</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					<p>instead of throwing an exception when a channel variable is not set.
 | 
				
			||||||
 | 
					* UPGRADE: Added.</p>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					<p>2006-07-14  Matthew Nicholson  <<a class="reference external" href="mailto:mnicholson%40digium.com">mnicholson<span>@</span>digium<span>.</span>com</a>></p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><ul class="simple">
 | 
				
			||||||
 | 
					<li>ChangeLog: Added.</li>
 | 
				
			||||||
 | 
					<li>TODO: Added.</li>
 | 
				
			||||||
 | 
					<li>MANIFEST.in: Added ChangeLog and TODO.</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
 | 
				
			||||||
 | 
					        <div class="sphinxsidebarwrapper"><div class="relations">
 | 
				
			||||||
 | 
					<h3>Related Topics</h3>
 | 
				
			||||||
 | 
					<ul>
 | 
				
			||||||
 | 
					  <li><a href="index.html">Documentation overview</a><ul>
 | 
				
			||||||
 | 
					      <li>Previous: <a href="manager.html" title="previous chapter">Manager</a></li>
 | 
				
			||||||
 | 
					  </ul></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					  <div role="note" aria-label="source link">
 | 
				
			||||||
 | 
					    <h3>This Page</h3>
 | 
				
			||||||
 | 
					    <ul class="this-page-menu">
 | 
				
			||||||
 | 
					      <li><a href="_sources/changes.txt"
 | 
				
			||||||
 | 
					            rel="nofollow">Show Source</a></li>
 | 
				
			||||||
 | 
					    </ul>
 | 
				
			||||||
 | 
					   </div>
 | 
				
			||||||
 | 
					<div id="searchbox" style="display: none" role="search">
 | 
				
			||||||
 | 
					  <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="footer">
 | 
				
			||||||
 | 
					      ©2016, Randall Degges.
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      |
 | 
				
			||||||
 | 
					      Powered by <a href="http://sphinx-doc.org/">Sphinx 1.3.6</a>
 | 
				
			||||||
 | 
					      & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.7</a>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      |
 | 
				
			||||||
 | 
					      <a href="_sources/changes.txt"
 | 
				
			||||||
 | 
					          rel="nofollow">Page source</a>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  </body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
							
								
								
									
										136
									
								
								html/config.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,136 @@
 | 
				
			|||||||
 | 
					<!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>Config — pyst2 0.4.9 documentation</title>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <link rel="stylesheet" href="_static/alabaster.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.4.9',
 | 
				
			||||||
 | 
					        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="pyst2 0.4.9 documentation" href="index.html" />
 | 
				
			||||||
 | 
					    <link rel="next" title="fastAGI" href="fastagi.html" />
 | 
				
			||||||
 | 
					    <link rel="prev" title="AGITB" href="agitb.html" />
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </head>
 | 
				
			||||||
 | 
					  <body role="document">  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div class="document">
 | 
				
			||||||
 | 
					      <div class="documentwrapper">
 | 
				
			||||||
 | 
					        <div class="bodywrapper">
 | 
				
			||||||
 | 
					          <div class="body" role="main">
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					  <div class="section" id="module-asterisk.config">
 | 
				
			||||||
 | 
					<span id="config"></span><h1>Config<a class="headerlink" href="#module-asterisk.config" title="Permalink to this headline">¶</a></h1>
 | 
				
			||||||
 | 
					<span class="target" id="module-config"></span><p>This module provides parsing functionality for asterisk config files.</p>
 | 
				
			||||||
 | 
					<div class="section" id="example">
 | 
				
			||||||
 | 
					<h2>Example<a class="headerlink" href="#example" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
 | 
					<div class="highlight-python"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">asterisk.config</span>
 | 
				
			||||||
 | 
					<span class="kn">import</span> <span class="nn">sys</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="c1"># load and parse the config file</span>
 | 
				
			||||||
 | 
					<span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					   <span class="n">config</span> <span class="o">=</span> <span class="n">asterisk</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">Config</span><span class="p">(</span><span class="s1">'/etc/asterisk/extensions.conf'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					<span class="k">except</span> <span class="n">asterisk</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">ParseError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
 | 
				
			||||||
 | 
					   <span class="k">print</span> <span class="s2">"Parse Error line: </span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">line</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">strerror</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="mi">1</span><span class="p">)</span>
 | 
				
			||||||
 | 
					<span class="k">except</span> <span class="ne">IOError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
 | 
				
			||||||
 | 
					   <span class="k">print</span> <span class="s2">"Error opening file: </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="n">e</span><span class="o">.</span><span class="n">strerror</span>
 | 
				
			||||||
 | 
					   <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="c1"># print our parsed output</span>
 | 
				
			||||||
 | 
					<span class="k">for</span> <span class="n">category</span> <span class="ow">in</span> <span class="n">config</span><span class="o">.</span><span class="n">categories</span><span class="p">:</span>
 | 
				
			||||||
 | 
					   <span class="k">print</span> <span class="s1">'[</span><span class="si">%s</span><span class="s1">]'</span> <span class="o">%</span> <span class="n">category</span><span class="o">.</span><span class="n">name</span>   <span class="c1"># print the current category</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">category</span><span class="o">.</span><span class="n">items</span><span class="p">:</span>
 | 
				
			||||||
 | 
					      <span class="k">print</span> <span class="s1">'   </span><span class="si">%s</span><span class="s1"> = </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">item</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
 | 
				
			||||||
 | 
					</pre></div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="section" id="specification">
 | 
				
			||||||
 | 
					<h2>Specification<a class="headerlink" href="#specification" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
 | 
				
			||||||
 | 
					        <div class="sphinxsidebarwrapper">
 | 
				
			||||||
 | 
					  <h3><a href="index.html">Table Of Contents</a></h3>
 | 
				
			||||||
 | 
					  <ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#">Config</a><ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#example">Example</a></li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#specification">Specification</a></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					<div class="relations">
 | 
				
			||||||
 | 
					<h3>Related Topics</h3>
 | 
				
			||||||
 | 
					<ul>
 | 
				
			||||||
 | 
					  <li><a href="index.html">Documentation overview</a><ul>
 | 
				
			||||||
 | 
					      <li>Previous: <a href="agitb.html" title="previous chapter">AGITB</a></li>
 | 
				
			||||||
 | 
					      <li>Next: <a href="fastagi.html" title="next chapter">fastAGI</a></li>
 | 
				
			||||||
 | 
					  </ul></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					  <div role="note" aria-label="source link">
 | 
				
			||||||
 | 
					    <h3>This Page</h3>
 | 
				
			||||||
 | 
					    <ul class="this-page-menu">
 | 
				
			||||||
 | 
					      <li><a href="_sources/config.txt"
 | 
				
			||||||
 | 
					            rel="nofollow">Show Source</a></li>
 | 
				
			||||||
 | 
					    </ul>
 | 
				
			||||||
 | 
					   </div>
 | 
				
			||||||
 | 
					<div id="searchbox" style="display: none" role="search">
 | 
				
			||||||
 | 
					  <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="footer">
 | 
				
			||||||
 | 
					      ©2016, Randall Degges.
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      |
 | 
				
			||||||
 | 
					      Powered by <a href="http://sphinx-doc.org/">Sphinx 1.3.6</a>
 | 
				
			||||||
 | 
					      & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.7</a>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      |
 | 
				
			||||||
 | 
					      <a href="_sources/config.txt"
 | 
				
			||||||
 | 
					          rel="nofollow">Page source</a>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  </body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
							
								
								
									
										114
									
								
								html/fastagi.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,114 @@
 | 
				
			|||||||
 | 
					<!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>fastAGI — pyst2 0.4.9 documentation</title>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <link rel="stylesheet" href="_static/alabaster.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.4.9',
 | 
				
			||||||
 | 
					        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="pyst2 0.4.9 documentation" href="index.html" />
 | 
				
			||||||
 | 
					    <link rel="next" title="Manager" href="manager.html" />
 | 
				
			||||||
 | 
					    <link rel="prev" title="Config" href="config.html" />
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </head>
 | 
				
			||||||
 | 
					  <body role="document">  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div class="document">
 | 
				
			||||||
 | 
					      <div class="documentwrapper">
 | 
				
			||||||
 | 
					        <div class="bodywrapper">
 | 
				
			||||||
 | 
					          <div class="body" role="main">
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					  <div class="section" id="module-asterisk.fastagi">
 | 
				
			||||||
 | 
					<span id="fastagi"></span><h1>fastAGI<a class="headerlink" href="#module-asterisk.fastagi" title="Permalink to this headline">¶</a></h1>
 | 
				
			||||||
 | 
					<span class="target" id="module-fastagi"></span><p>Requires modified pyst2 to support reading stdin/out/err</p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div>Copyright 2011 VOICE1, LLC
 | 
				
			||||||
 | 
					By: Ben Davis <<a class="reference external" href="mailto:ben%40voice1-dot-me">ben<span>@</span>voice1-dot-me</a>></div></blockquote>
 | 
				
			||||||
 | 
					<div class="section" id="specification">
 | 
				
			||||||
 | 
					<h2>Specification<a class="headerlink" href="#specification" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
 | 
				
			||||||
 | 
					        <div class="sphinxsidebarwrapper">
 | 
				
			||||||
 | 
					  <h3><a href="index.html">Table Of Contents</a></h3>
 | 
				
			||||||
 | 
					  <ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#">fastAGI</a><ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#specification">Specification</a></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					<div class="relations">
 | 
				
			||||||
 | 
					<h3>Related Topics</h3>
 | 
				
			||||||
 | 
					<ul>
 | 
				
			||||||
 | 
					  <li><a href="index.html">Documentation overview</a><ul>
 | 
				
			||||||
 | 
					      <li>Previous: <a href="config.html" title="previous chapter">Config</a></li>
 | 
				
			||||||
 | 
					      <li>Next: <a href="manager.html" title="next chapter">Manager</a></li>
 | 
				
			||||||
 | 
					  </ul></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					  <div role="note" aria-label="source link">
 | 
				
			||||||
 | 
					    <h3>This Page</h3>
 | 
				
			||||||
 | 
					    <ul class="this-page-menu">
 | 
				
			||||||
 | 
					      <li><a href="_sources/fastagi.txt"
 | 
				
			||||||
 | 
					            rel="nofollow">Show Source</a></li>
 | 
				
			||||||
 | 
					    </ul>
 | 
				
			||||||
 | 
					   </div>
 | 
				
			||||||
 | 
					<div id="searchbox" style="display: none" role="search">
 | 
				
			||||||
 | 
					  <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="footer">
 | 
				
			||||||
 | 
					      ©2016, Randall Degges.
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      |
 | 
				
			||||||
 | 
					      Powered by <a href="http://sphinx-doc.org/">Sphinx 1.3.6</a>
 | 
				
			||||||
 | 
					      & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.7</a>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      |
 | 
				
			||||||
 | 
					      <a href="_sources/fastagi.txt"
 | 
				
			||||||
 | 
					          rel="nofollow">Page source</a>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  </body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
							
								
								
									
										468
									
								
								html/genindex.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,468 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					<!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 — pyst2 0.4.9 documentation</title>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <link rel="stylesheet" href="_static/alabaster.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.4.9',
 | 
				
			||||||
 | 
					        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="pyst2 0.4.9 documentation" href="index.html" />
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </head>
 | 
				
			||||||
 | 
					  <body role="document">  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div class="document">
 | 
				
			||||||
 | 
					      <div class="documentwrapper">
 | 
				
			||||||
 | 
					        <div class="bodywrapper">
 | 
				
			||||||
 | 
					          <div class="body" role="main">
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<h1 id="index">Index</h1>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="genindex-jumpbox">
 | 
				
			||||||
 | 
					 <a href="#A"><strong>A</strong></a>
 | 
				
			||||||
 | 
					 | <a href="#C"><strong>C</strong></a>
 | 
				
			||||||
 | 
					 | <a href="#D"><strong>D</strong></a>
 | 
				
			||||||
 | 
					 | <a href="#E"><strong>E</strong></a>
 | 
				
			||||||
 | 
					 | <a href="#F"><strong>F</strong></a>
 | 
				
			||||||
 | 
					 | <a href="#G"><strong>G</strong></a>
 | 
				
			||||||
 | 
					 | <a href="#H"><strong>H</strong></a>
 | 
				
			||||||
 | 
					 | <a href="#L"><strong>L</strong></a>
 | 
				
			||||||
 | 
					 | <a href="#M"><strong>M</strong></a>
 | 
				
			||||||
 | 
					 | <a href="#N"><strong>N</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="#V"><strong>V</strong></a>
 | 
				
			||||||
 | 
					 | <a href="#W"><strong>W</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="agi.html#asterisk.agi.AGI">AGI (class in asterisk.agi)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#module-agi">agi (module)</a>, <a href="agitb.html#module-agi">[1]</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.answer">answer() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.appexec">appexec() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#module-asterisk.agi">asterisk.agi (module)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </dl></td>
 | 
				
			||||||
 | 
					  <td style="width: 33%" valign="top"><dl>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agitb.html#module-asterisk.agitb">asterisk.agitb (module)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="config.html#module-asterisk.config">asterisk.config (module)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="fastagi.html#module-asterisk.fastagi">asterisk.fastagi (module)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="manager.html#module-asterisk.manager">asterisk.manager (module)</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="agi.html#asterisk.agi.AGI.channel_status">channel_status() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="config.html#module-config">config (module)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </dl></td>
 | 
				
			||||||
 | 
					  <td style="width: 33%" valign="top"><dl>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.control_stream_file">control_stream_file() (asterisk.agi.AGI method)</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="agi.html#asterisk.agi.AGI.database_del">database_del() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.database_deltree">database_deltree() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </dl></td>
 | 
				
			||||||
 | 
					  <td style="width: 33%" valign="top"><dl>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.database_get">database_get() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.database_put">database_put() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </dl></td>
 | 
				
			||||||
 | 
					</tr></table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<h2 id="E">E</h2>
 | 
				
			||||||
 | 
					<table style="width: 100%" class="indextable genindextable"><tr>
 | 
				
			||||||
 | 
					  <td style="width: 33%" valign="top"><dl>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agitb.html#asterisk.agitb.enable">enable() (in module asterisk.agitb)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </dl></td>
 | 
				
			||||||
 | 
					  <td style="width: 33%" valign="top"><dl>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="manager.html#asterisk.manager.Event">Event (class in asterisk.manager)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </dl></td>
 | 
				
			||||||
 | 
					</tr></table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<h2 id="F">F</h2>
 | 
				
			||||||
 | 
					<table style="width: 100%" class="indextable genindextable"><tr>
 | 
				
			||||||
 | 
					  <td style="width: 33%" valign="top"><dl>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="fastagi.html#module-fastagi">fastagi (module)</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="agi.html#asterisk.agi.AGI.get_data">get_data() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.get_full_variable">get_full_variable() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="manager.html#asterisk.manager.Event.get_header">get_header() (asterisk.manager.Event method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      <dd><dl>
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					  <dt><a href="manager.html#asterisk.manager.ManagerMsg.get_header">(asterisk.manager.ManagerMsg method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      </dl></dd>
 | 
				
			||||||
 | 
					  </dl></td>
 | 
				
			||||||
 | 
					  <td style="width: 33%" valign="top"><dl>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.get_option">get_option() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.get_result">get_result() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.get_variable">get_variable() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </dl></td>
 | 
				
			||||||
 | 
					</tr></table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<h2 id="H">H</h2>
 | 
				
			||||||
 | 
					<table style="width: 100%" class="indextable genindextable"><tr>
 | 
				
			||||||
 | 
					  <td style="width: 33%" valign="top"><dl>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.hangup">hangup() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="manager.html#asterisk.manager.Event.has_header">has_header() (asterisk.manager.Event method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      <dd><dl>
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					  <dt><a href="manager.html#asterisk.manager.ManagerMsg.has_header">(asterisk.manager.ManagerMsg method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      </dl></dd>
 | 
				
			||||||
 | 
					  </dl></td>
 | 
				
			||||||
 | 
					  <td style="width: 33%" valign="top"><dl>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agitb.html#asterisk.agitb.Hook">Hook (class in asterisk.agitb)</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="agitb.html#asterisk.agitb.lookup">lookup() (in module asterisk.agitb)</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="manager.html#module-manager">manager (module)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </dl></td>
 | 
				
			||||||
 | 
					  <td style="width: 33%" valign="top"><dl>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="manager.html#asterisk.manager.ManagerMsg">ManagerMsg (class in asterisk.manager)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </dl></td>
 | 
				
			||||||
 | 
					</tr></table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<h2 id="N">N</h2>
 | 
				
			||||||
 | 
					<table style="width: 100%" class="indextable genindextable"><tr>
 | 
				
			||||||
 | 
					  <td style="width: 33%" valign="top"><dl>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.noop">noop() (asterisk.agi.AGI 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="manager.html#asterisk.manager.ManagerMsg.parse">parse() (asterisk.manager.ManagerMsg method)</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="agi.html#asterisk.agi.AGI.receive_char">receive_char() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </dl></td>
 | 
				
			||||||
 | 
					  <td style="width: 33%" valign="top"><dl>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.record_file">record_file() (asterisk.agi.AGI 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="agi.html#asterisk.agi.AGI.say_alpha">say_alpha() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.say_date">say_date() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.say_datetime">say_datetime() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.say_digits">say_digits() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.say_number">say_number() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.say_phonetic">say_phonetic() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.say_time">say_time() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agitb.html#asterisk.agitb.scanvars">scanvars() (in module asterisk.agitb)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.send_command">send_command() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </dl></td>
 | 
				
			||||||
 | 
					  <td style="width: 33%" valign="top"><dl>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.send_image">send_image() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.send_text">send_text() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.set_autohangup">set_autohangup() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.set_callerid">set_callerid() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.set_context">set_context() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.set_extension">set_extension() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.set_priority">set_priority() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.set_variable">set_variable() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.stream_file">stream_file() (asterisk.agi.AGI method)</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="agi.html#asterisk.agi.AGI.tdd_mode">tdd_mode() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.test_hangup">test_hangup() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </dl></td>
 | 
				
			||||||
 | 
					  <td style="width: 33%" valign="top"><dl>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agitb.html#asterisk.agitb.text">text() (in module asterisk.agitb)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </dl></td>
 | 
				
			||||||
 | 
					</tr></table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<h2 id="V">V</h2>
 | 
				
			||||||
 | 
					<table style="width: 100%" class="indextable genindextable"><tr>
 | 
				
			||||||
 | 
					  <td style="width: 33%" valign="top"><dl>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.verbose">verbose() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </dl></td>
 | 
				
			||||||
 | 
					</tr></table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<h2 id="W">W</h2>
 | 
				
			||||||
 | 
					<table style="width: 100%" class="indextable genindextable"><tr>
 | 
				
			||||||
 | 
					  <td style="width: 33%" valign="top"><dl>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					  <dt><a href="agi.html#asterisk.agi.AGI.wait_for_digit">wait_for_digit() (asterisk.agi.AGI method)</a>
 | 
				
			||||||
 | 
					  </dt>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </dl></td>
 | 
				
			||||||
 | 
					</tr></table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
 | 
				
			||||||
 | 
					        <div class="sphinxsidebarwrapper">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   <div class="relations">
 | 
				
			||||||
 | 
					<h3>Related Topics</h3>
 | 
				
			||||||
 | 
					<ul>
 | 
				
			||||||
 | 
					  <li><a href="index.html">Documentation overview</a><ul>
 | 
				
			||||||
 | 
					  </ul></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div id="searchbox" style="display: none" role="search">
 | 
				
			||||||
 | 
					  <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="footer">
 | 
				
			||||||
 | 
					      ©2016, Randall Degges.
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      |
 | 
				
			||||||
 | 
					      Powered by <a href="http://sphinx-doc.org/">Sphinx 1.3.6</a>
 | 
				
			||||||
 | 
					      & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.7</a>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  </body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
							
								
								
									
										150
									
								
								html/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,150 @@
 | 
				
			|||||||
 | 
					<!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 pyst2’s documentation! — pyst2 0.4.9 documentation</title>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <link rel="stylesheet" href="_static/alabaster.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.4.9',
 | 
				
			||||||
 | 
					        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="pyst2 0.4.9 documentation" href="#" />
 | 
				
			||||||
 | 
					    <link rel="next" title="pyst2: A Python Interface to Asterisk" href="readme.html" />
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </head>
 | 
				
			||||||
 | 
					  <body role="document">  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div class="document">
 | 
				
			||||||
 | 
					      <div class="documentwrapper">
 | 
				
			||||||
 | 
					        <div class="bodywrapper">
 | 
				
			||||||
 | 
					          <div class="body" role="main">
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					  <div class="section" id="welcome-to-pyst2-s-documentation">
 | 
				
			||||||
 | 
					<h1>Welcome to pyst2’s documentation!<a class="headerlink" href="#welcome-to-pyst2-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="readme.html">pyst2: A Python Interface to Asterisk</a><ul>
 | 
				
			||||||
 | 
					<li class="toctree-l2"><a class="reference internal" href="readme.html#meta">Meta</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l2"><a class="reference internal" href="readme.html#purpose">Purpose</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l2"><a class="reference internal" href="readme.html#installation">Installation</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l2"><a class="reference internal" href="readme.html#documentation">Documentation</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l2"><a class="reference internal" href="readme.html#fastagi">FastAGI</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l2"><a class="reference internal" href="readme.html#credits">Credits</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l2"><a class="reference internal" href="readme.html#things-to-do-for-pyst">Things to do for pyst</a></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="agi.html">AGI</a><ul>
 | 
				
			||||||
 | 
					<li class="toctree-l2"><a class="reference internal" href="agi.html#specification">Specification</a></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="agitb.html">AGITB</a><ul>
 | 
				
			||||||
 | 
					<li class="toctree-l2"><a class="reference internal" href="agitb.html#example">Example</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l2"><a class="reference internal" href="agitb.html#specification">Specification</a></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="config.html">Config</a><ul>
 | 
				
			||||||
 | 
					<li class="toctree-l2"><a class="reference internal" href="config.html#example">Example</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l2"><a class="reference internal" href="config.html#specification">Specification</a></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="fastagi.html">fastAGI</a><ul>
 | 
				
			||||||
 | 
					<li class="toctree-l2"><a class="reference internal" href="fastagi.html#specification">Specification</a></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="manager.html">Manager</a><ul>
 | 
				
			||||||
 | 
					<li class="toctree-l2"><a class="reference internal" href="manager.html#example">Example</a></li>
 | 
				
			||||||
 | 
					<li class="toctree-l2"><a class="reference internal" href="manager.html#specification">Specification</a></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					<li class="toctree-l1"><a class="reference internal" href="changes.html">Changes</a></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"><span>Index</span></a></li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="py-modindex.html"><span>Module Index</span></a></li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="search.html"><span>Search Page</span></a></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
 | 
				
			||||||
 | 
					        <div class="sphinxsidebarwrapper">
 | 
				
			||||||
 | 
					  <h3><a href="#">Table Of Contents</a></h3>
 | 
				
			||||||
 | 
					  <ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#">Welcome to pyst2’s documentation!</a></li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#indices-and-tables">Indices and tables</a></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					<div class="relations">
 | 
				
			||||||
 | 
					<h3>Related Topics</h3>
 | 
				
			||||||
 | 
					<ul>
 | 
				
			||||||
 | 
					  <li><a href="#">Documentation overview</a><ul>
 | 
				
			||||||
 | 
					      <li>Next: <a href="readme.html" title="next chapter">pyst2: A Python Interface to Asterisk</a></li>
 | 
				
			||||||
 | 
					  </ul></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					  <div role="note" aria-label="source link">
 | 
				
			||||||
 | 
					    <h3>This Page</h3>
 | 
				
			||||||
 | 
					    <ul class="this-page-menu">
 | 
				
			||||||
 | 
					      <li><a href="_sources/index.txt"
 | 
				
			||||||
 | 
					            rel="nofollow">Show Source</a></li>
 | 
				
			||||||
 | 
					    </ul>
 | 
				
			||||||
 | 
					   </div>
 | 
				
			||||||
 | 
					<div id="searchbox" style="display: none" role="search">
 | 
				
			||||||
 | 
					  <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="footer">
 | 
				
			||||||
 | 
					      ©2016, Randall Degges.
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      |
 | 
				
			||||||
 | 
					      Powered by <a href="http://sphinx-doc.org/">Sphinx 1.3.6</a>
 | 
				
			||||||
 | 
					      & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.7</a>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      |
 | 
				
			||||||
 | 
					      <a href="_sources/index.txt"
 | 
				
			||||||
 | 
					          rel="nofollow">Page source</a>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  </body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
							
								
								
									
										201
									
								
								html/manager.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,201 @@
 | 
				
			|||||||
 | 
					<!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>Manager — pyst2 0.4.9 documentation</title>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <link rel="stylesheet" href="_static/alabaster.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.4.9',
 | 
				
			||||||
 | 
					        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="pyst2 0.4.9 documentation" href="index.html" />
 | 
				
			||||||
 | 
					    <link rel="next" title="Changes" href="changes.html" />
 | 
				
			||||||
 | 
					    <link rel="prev" title="fastAGI" href="fastagi.html" />
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </head>
 | 
				
			||||||
 | 
					  <body role="document">  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div class="document">
 | 
				
			||||||
 | 
					      <div class="documentwrapper">
 | 
				
			||||||
 | 
					        <div class="bodywrapper">
 | 
				
			||||||
 | 
					          <div class="body" role="main">
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					  <div class="section" id="module-asterisk.manager">
 | 
				
			||||||
 | 
					<span id="manager"></span><h1>Manager<a class="headerlink" href="#module-asterisk.manager" title="Permalink to this headline">¶</a></h1>
 | 
				
			||||||
 | 
					<span class="target" id="module-manager"></span><p>This module provides a Python API for interfacing with the asterisk manager.</p>
 | 
				
			||||||
 | 
					<div class="section" id="example">
 | 
				
			||||||
 | 
					<h2>Example<a class="headerlink" href="#example" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
 | 
					<div class="highlight-python"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">asterisk.manager</span>
 | 
				
			||||||
 | 
					<span class="kn">import</span> <span class="nn">sys</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="k">def</span> <span class="nf">handle_shutdown</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">manager</span><span class="p">):</span>
 | 
				
			||||||
 | 
					   <span class="k">print</span> <span class="s2">"Recieved shutdown event"</span>
 | 
				
			||||||
 | 
					   <span class="n">manager</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
 | 
				
			||||||
 | 
					   <span class="c1"># we could analize the event and reconnect here</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="k">def</span> <span class="nf">handle_event</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">manager</span><span class="p">):</span>
 | 
				
			||||||
 | 
					   <span class="k">print</span> <span class="s2">"Recieved event: </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="n">event</span><span class="o">.</span><span class="n">name</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="n">manager</span> <span class="o">=</span> <span class="n">asterisk</span><span class="o">.</span><span class="n">manager</span><span class="o">.</span><span class="n">Manager</span><span class="p">()</span>
 | 
				
			||||||
 | 
					<span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					    <span class="c1"># connect to the manager</span>
 | 
				
			||||||
 | 
					    <span class="k">try</span><span class="p">:</span>
 | 
				
			||||||
 | 
					       <span class="n">manager</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="s1">'host'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					       <span class="n">manager</span><span class="o">.</span><span class="n">login</span><span class="p">(</span><span class="s1">'user'</span><span class="p">,</span> <span class="s1">'secret'</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># register some callbacks</span>
 | 
				
			||||||
 | 
					        <span class="n">manager</span><span class="o">.</span><span class="n">register_event</span><span class="p">(</span><span class="s1">'Shutdown'</span><span class="p">,</span> <span class="n">handle_shutdown</span><span class="p">)</span> <span class="c1"># shutdown</span>
 | 
				
			||||||
 | 
					        <span class="n">manager</span><span class="o">.</span><span class="n">register_event</span><span class="p">(</span><span class="s1">'*'</span><span class="p">,</span> <span class="n">handle_event</span><span class="p">)</span>           <span class="c1"># catch all</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="c1"># get a status report</span>
 | 
				
			||||||
 | 
					        <span class="n">response</span> <span class="o">=</span> <span class="n">manager</span><span class="o">.</span><span class="n">status</span><span class="p">()</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <span class="n">manager</span><span class="o">.</span><span class="n">logoff</span><span class="p">()</span>
 | 
				
			||||||
 | 
					    <span class="k">except</span> <span class="n">asterisk</span><span class="o">.</span><span class="n">manager</span><span class="o">.</span><span class="n">ManagerSocketException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
 | 
				
			||||||
 | 
					       <span class="k">print</span> <span class="s2">"Error connecting to the manager: </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="n">e</span><span class="o">.</span><span class="n">strerror</span>
 | 
				
			||||||
 | 
					       <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
 | 
				
			||||||
 | 
					    <span class="k">except</span> <span class="n">asterisk</span><span class="o">.</span><span class="n">manager</span><span class="o">.</span><span class="n">ManagerAuthException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
 | 
				
			||||||
 | 
					       <span class="k">print</span> <span class="s2">"Error logging in to the manager: </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="n">e</span><span class="o">.</span><span class="n">strerror</span>
 | 
				
			||||||
 | 
					       <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
 | 
				
			||||||
 | 
					    <span class="k">except</span> <span class="n">asterisk</span><span class="o">.</span><span class="n">manager</span><span class="o">.</span><span class="n">ManagerException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
 | 
				
			||||||
 | 
					       <span class="k">print</span> <span class="s2">"Error: </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="n">e</span><span class="o">.</span><span class="n">strerror</span>
 | 
				
			||||||
 | 
					       <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="k">finally</span><span class="p">:</span>
 | 
				
			||||||
 | 
					   <span class="c1"># remember to clean up</span>
 | 
				
			||||||
 | 
					   <span class="n">manager</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
 | 
				
			||||||
 | 
					</pre></div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<p>Remember all header, response, and event names are case sensitive.</p>
 | 
				
			||||||
 | 
					<p>Not all manager actions are implmented as of yet, feel free to add them
 | 
				
			||||||
 | 
					and submit patches.</p>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="section" id="specification">
 | 
				
			||||||
 | 
					<h2>Specification<a class="headerlink" href="#specification" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
 | 
					<dl class="class">
 | 
				
			||||||
 | 
					<dt id="asterisk.manager.Event">
 | 
				
			||||||
 | 
					<em class="property">class </em><code class="descclassname">asterisk.manager.</code><code class="descname">Event</code><span class="sig-paren">(</span><em>message</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/manager.html#Event"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.manager.Event" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>Manager interface Events, __init__ expects and ‘Event’ message</p>
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.manager.Event.get_header">
 | 
				
			||||||
 | 
					<code class="descname">get_header</code><span class="sig-paren">(</span><em>hname</em>, <em>defval=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/manager.html#Event.get_header"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.manager.Event.get_header" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>Return the specfied header</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.manager.Event.has_header">
 | 
				
			||||||
 | 
					<code class="descname">has_header</code><span class="sig-paren">(</span><em>hname</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/manager.html#Event.has_header"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.manager.Event.has_header" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>Check for a header</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="class">
 | 
				
			||||||
 | 
					<dt id="asterisk.manager.ManagerMsg">
 | 
				
			||||||
 | 
					<em class="property">class </em><code class="descclassname">asterisk.manager.</code><code class="descname">ManagerMsg</code><span class="sig-paren">(</span><em>response</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/manager.html#ManagerMsg"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.manager.ManagerMsg" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>A manager interface message</p>
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.manager.ManagerMsg.get_header">
 | 
				
			||||||
 | 
					<code class="descname">get_header</code><span class="sig-paren">(</span><em>hname</em>, <em>defval=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/manager.html#ManagerMsg.get_header"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.manager.ManagerMsg.get_header" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>Return the specfied header</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.manager.ManagerMsg.has_header">
 | 
				
			||||||
 | 
					<code class="descname">has_header</code><span class="sig-paren">(</span><em>hname</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/manager.html#ManagerMsg.has_header"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.manager.ManagerMsg.has_header" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>Check for a header</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="method">
 | 
				
			||||||
 | 
					<dt id="asterisk.manager.ManagerMsg.parse">
 | 
				
			||||||
 | 
					<code class="descname">parse</code><span class="sig-paren">(</span><em>response</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/asterisk/manager.html#ManagerMsg.parse"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#asterisk.manager.ManagerMsg.parse" title="Permalink to this definition">¶</a></dt>
 | 
				
			||||||
 | 
					<dd><p>Parse a manager message</p>
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</dd></dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
 | 
				
			||||||
 | 
					        <div class="sphinxsidebarwrapper">
 | 
				
			||||||
 | 
					  <h3><a href="index.html">Table Of Contents</a></h3>
 | 
				
			||||||
 | 
					  <ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#">Manager</a><ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#example">Example</a></li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#specification">Specification</a></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					<div class="relations">
 | 
				
			||||||
 | 
					<h3>Related Topics</h3>
 | 
				
			||||||
 | 
					<ul>
 | 
				
			||||||
 | 
					  <li><a href="index.html">Documentation overview</a><ul>
 | 
				
			||||||
 | 
					      <li>Previous: <a href="fastagi.html" title="previous chapter">fastAGI</a></li>
 | 
				
			||||||
 | 
					      <li>Next: <a href="changes.html" title="next chapter">Changes</a></li>
 | 
				
			||||||
 | 
					  </ul></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					  <div role="note" aria-label="source link">
 | 
				
			||||||
 | 
					    <h3>This Page</h3>
 | 
				
			||||||
 | 
					    <ul class="this-page-menu">
 | 
				
			||||||
 | 
					      <li><a href="_sources/manager.txt"
 | 
				
			||||||
 | 
					            rel="nofollow">Show Source</a></li>
 | 
				
			||||||
 | 
					    </ul>
 | 
				
			||||||
 | 
					   </div>
 | 
				
			||||||
 | 
					<div id="searchbox" style="display: none" role="search">
 | 
				
			||||||
 | 
					  <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="footer">
 | 
				
			||||||
 | 
					      ©2016, Randall Degges.
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      |
 | 
				
			||||||
 | 
					      Powered by <a href="http://sphinx-doc.org/">Sphinx 1.3.6</a>
 | 
				
			||||||
 | 
					      & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.7</a>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      |
 | 
				
			||||||
 | 
					      <a href="_sources/manager.txt"
 | 
				
			||||||
 | 
					          rel="nofollow">Page source</a>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  </body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
							
								
								
									
										7
									
								
								html/objects.inv
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					# Sphinx inventory version 2
 | 
				
			||||||
 | 
					# Project: pyst2
 | 
				
			||||||
 | 
					# Version: 0.4.9
 | 
				
			||||||
 | 
					# The remainder of this file is compressed using zlib.
 | 
				
			||||||
 | 
					xÚ–ÁnÛ0†ïy
 | 
				
			||||||
 | 
					Û5Æzím‡aë!@<40>=€@[´-T–‘N“·;h$<24>iì‡þ?‘’~Sj1¸`ñPÛgúbûT´s´ì¸÷ߊ—ñyÓG{CšŽÛó‹Y½‹vð8C„<43>ëî™b³úï$x…7Ð:﹟øQÈ®&ÝÛ~/¶ Æìè¼!ÿR\þüý2µ¢âéCKXB w̧È]´<><C2B4>”ð€µ‚¨;½!HÆÀ9Ž`FèMãdþËi+û±“¼«2¶Èk°4h0IbFT‰4ƒ÷fÙA¥ZΑ<C38E>‰]J(#
^;±ŠËÚ!)€£Fž±F·G#vÎ:,f«5/ÁÑ€O(1®@ØõjÌIÛ"%†¾Ru›J]RaÄ´sÂ`Mû‚Õb®—¾®…¬bØÀÀQmó¬Á{‰Z-&
X_¥H×(F.e³ã£[Ñ*Ö(l‘3W… ±QïØsI“çœtö˜§¯rÈ•ò"¯ÿÄøvu·8C7ÔÎûÒ¡><1D>/	¦µZŒP
A<@*èlë€|<04>k/Öj
 | 
				
			||||||
 | 
					Ý_¬Fž®¯msì>$<24>GºH¾€æØC¨üµÇÀŸw悼<E2809A>œÛÁ^uå¥x´ßM¿;juUpëKÿ4ƨ¿Lb>ü_î!<21>u4Žùs<y¹
 | 
				
			||||||
							
								
								
									
										160
									
								
								html/py-modindex.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,160 @@
 | 
				
			|||||||
 | 
					<!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 — pyst2 0.4.9 documentation</title>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <link rel="stylesheet" href="_static/alabaster.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.4.9',
 | 
				
			||||||
 | 
					        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="pyst2 0.4.9 documentation" href="index.html" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </head>
 | 
				
			||||||
 | 
					  <body role="document">  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div class="document">
 | 
				
			||||||
 | 
					      <div class="documentwrapper">
 | 
				
			||||||
 | 
					        <div class="bodywrapper">
 | 
				
			||||||
 | 
					          <div class="body" role="main">
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   <h1>Python Module Index</h1>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   <div class="modindex-jumpbox">
 | 
				
			||||||
 | 
					   <a href="#cap-a"><strong>a</strong></a> | 
 | 
				
			||||||
 | 
					   <a href="#cap-c"><strong>c</strong></a> | 
 | 
				
			||||||
 | 
					   <a href="#cap-f"><strong>f</strong></a> | 
 | 
				
			||||||
 | 
					   <a href="#cap-m"><strong>m</strong></a>
 | 
				
			||||||
 | 
					   </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   <table class="indextable modindextable" cellspacing="0" cellpadding="2">
 | 
				
			||||||
 | 
					     <tr class="pcap"><td></td><td> </td><td></td></tr>
 | 
				
			||||||
 | 
					     <tr class="cap" id="cap-a"><td></td><td>
 | 
				
			||||||
 | 
					       <strong>a</strong></td><td></td></tr>
 | 
				
			||||||
 | 
					     <tr>
 | 
				
			||||||
 | 
					       <td></td>
 | 
				
			||||||
 | 
					       <td>
 | 
				
			||||||
 | 
					       <a href="agitb.html#module-agi"><code class="xref">agi</code></a></td><td>
 | 
				
			||||||
 | 
					       <em>More comprehensive traceback formatting for Python scripts.</em></td></tr>
 | 
				
			||||||
 | 
					     <tr>
 | 
				
			||||||
 | 
					       <td><img src="_static/minus.png" class="toggler"
 | 
				
			||||||
 | 
					              id="toggle-1" style="display: none" alt="-" /></td>
 | 
				
			||||||
 | 
					       <td>
 | 
				
			||||||
 | 
					       <code class="xref">asterisk</code></td><td>
 | 
				
			||||||
 | 
					       <em></em></td></tr>
 | 
				
			||||||
 | 
					     <tr class="cg-1">
 | 
				
			||||||
 | 
					       <td></td>
 | 
				
			||||||
 | 
					       <td>   
 | 
				
			||||||
 | 
					       <a href="agi.html#module-asterisk.agi"><code class="xref">asterisk.agi</code></a></td><td>
 | 
				
			||||||
 | 
					       <em></em></td></tr>
 | 
				
			||||||
 | 
					     <tr class="cg-1">
 | 
				
			||||||
 | 
					       <td></td>
 | 
				
			||||||
 | 
					       <td>   
 | 
				
			||||||
 | 
					       <a href="agitb.html#module-asterisk.agitb"><code class="xref">asterisk.agitb</code></a></td><td>
 | 
				
			||||||
 | 
					       <em></em></td></tr>
 | 
				
			||||||
 | 
					     <tr class="cg-1">
 | 
				
			||||||
 | 
					       <td></td>
 | 
				
			||||||
 | 
					       <td>   
 | 
				
			||||||
 | 
					       <a href="config.html#module-asterisk.config"><code class="xref">asterisk.config</code></a></td><td>
 | 
				
			||||||
 | 
					       <em></em></td></tr>
 | 
				
			||||||
 | 
					     <tr class="cg-1">
 | 
				
			||||||
 | 
					       <td></td>
 | 
				
			||||||
 | 
					       <td>   
 | 
				
			||||||
 | 
					       <a href="fastagi.html#module-asterisk.fastagi"><code class="xref">asterisk.fastagi</code></a></td><td>
 | 
				
			||||||
 | 
					       <em></em></td></tr>
 | 
				
			||||||
 | 
					     <tr class="cg-1">
 | 
				
			||||||
 | 
					       <td></td>
 | 
				
			||||||
 | 
					       <td>   
 | 
				
			||||||
 | 
					       <a href="manager.html#module-asterisk.manager"><code class="xref">asterisk.manager</code></a></td><td>
 | 
				
			||||||
 | 
					       <em></em></td></tr>
 | 
				
			||||||
 | 
					     <tr class="pcap"><td></td><td> </td><td></td></tr>
 | 
				
			||||||
 | 
					     <tr class="cap" id="cap-c"><td></td><td>
 | 
				
			||||||
 | 
					       <strong>c</strong></td><td></td></tr>
 | 
				
			||||||
 | 
					     <tr>
 | 
				
			||||||
 | 
					       <td></td>
 | 
				
			||||||
 | 
					       <td>
 | 
				
			||||||
 | 
					       <a href="config.html#module-config"><code class="xref">config</code></a></td><td>
 | 
				
			||||||
 | 
					       <em>Parse Asterisk configuration files.</em></td></tr>
 | 
				
			||||||
 | 
					     <tr class="pcap"><td></td><td> </td><td></td></tr>
 | 
				
			||||||
 | 
					     <tr class="cap" id="cap-f"><td></td><td>
 | 
				
			||||||
 | 
					       <strong>f</strong></td><td></td></tr>
 | 
				
			||||||
 | 
					     <tr>
 | 
				
			||||||
 | 
					       <td></td>
 | 
				
			||||||
 | 
					       <td>
 | 
				
			||||||
 | 
					       <a href="fastagi.html#module-fastagi"><code class="xref">fastagi</code></a></td><td>
 | 
				
			||||||
 | 
					       <em>FastAGI service for Asterisk</em></td></tr>
 | 
				
			||||||
 | 
					     <tr class="pcap"><td></td><td> </td><td></td></tr>
 | 
				
			||||||
 | 
					     <tr class="cap" id="cap-m"><td></td><td>
 | 
				
			||||||
 | 
					       <strong>m</strong></td><td></td></tr>
 | 
				
			||||||
 | 
					     <tr>
 | 
				
			||||||
 | 
					       <td></td>
 | 
				
			||||||
 | 
					       <td>
 | 
				
			||||||
 | 
					       <a href="manager.html#module-manager"><code class="xref">manager</code></a></td><td>
 | 
				
			||||||
 | 
					       <em>Python Interface for Asterisk Manager</em></td></tr>
 | 
				
			||||||
 | 
					   </table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
 | 
				
			||||||
 | 
					        <div class="sphinxsidebarwrapper"><div class="relations">
 | 
				
			||||||
 | 
					<h3>Related Topics</h3>
 | 
				
			||||||
 | 
					<ul>
 | 
				
			||||||
 | 
					  <li><a href="index.html">Documentation overview</a><ul>
 | 
				
			||||||
 | 
					  </ul></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div id="searchbox" style="display: none" role="search">
 | 
				
			||||||
 | 
					  <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="footer">
 | 
				
			||||||
 | 
					      ©2016, Randall Degges.
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      |
 | 
				
			||||||
 | 
					      Powered by <a href="http://sphinx-doc.org/">Sphinx 1.3.6</a>
 | 
				
			||||||
 | 
					      & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.7</a>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  </body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
							
								
								
									
										245
									
								
								html/readme.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,245 @@
 | 
				
			|||||||
 | 
					<!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>pyst2: A Python Interface to Asterisk — pyst2 0.4.9 documentation</title>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <link rel="stylesheet" href="_static/alabaster.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.4.9',
 | 
				
			||||||
 | 
					        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="pyst2 0.4.9 documentation" href="index.html" />
 | 
				
			||||||
 | 
					    <link rel="next" title="AGI" href="agi.html" />
 | 
				
			||||||
 | 
					    <link rel="prev" title="Welcome to pyst2’s documentation!" href="index.html" />
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </head>
 | 
				
			||||||
 | 
					  <body role="document">  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div class="document">
 | 
				
			||||||
 | 
					      <div class="documentwrapper">
 | 
				
			||||||
 | 
					        <div class="bodywrapper">
 | 
				
			||||||
 | 
					          <div class="body" role="main">
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					  <div class="section" id="pyst2-a-python-interface-to-asterisk">
 | 
				
			||||||
 | 
					<h1>pyst2: A Python Interface to Asterisk<a class="headerlink" href="#pyst2-a-python-interface-to-asterisk" title="Permalink to this headline">¶</a></h1>
 | 
				
			||||||
 | 
					<a class="reference external image-reference" href="https://pypi.python.org/pypi/pyst2"><img alt="pyst2 Release" src="https://img.shields.io/pypi/v/pyst2.svg" /></a>
 | 
				
			||||||
 | 
					<a class="reference external image-reference" href="https://pypi.python.org/pypi/pyst2"><img alt="pyst2 Downloads" src="https://img.shields.io/pypi/dm/pyst2.svg" /></a>
 | 
				
			||||||
 | 
					<a class="reference external image-reference" href="https://travis-ci.org/rdegges/pyst2"><img alt="pyst2 Build" src="https://img.shields.io/travis/rdegges/pyst2.svg" /></a>
 | 
				
			||||||
 | 
					<img alt="Snake Sketch" src="https://github.com/rdegges/pyst2/raw/master/assets/snake-sketch.jpg" />
 | 
				
			||||||
 | 
					<div class="section" id="meta">
 | 
				
			||||||
 | 
					<h2>Meta<a class="headerlink" href="#meta" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
 | 
					<ul class="simple">
 | 
				
			||||||
 | 
					<li>Author: Randall Degges</li>
 | 
				
			||||||
 | 
					<li>Email: <a class="reference external" href="mailto:r%40rdegges.com">r<span>@</span>rdegges<span>.</span>com</a></li>
 | 
				
			||||||
 | 
					<li>Site: <a class="reference external" href="http://www.rdegges.com">http://www.rdegges.com</a></li>
 | 
				
			||||||
 | 
					<li>Status: <em>looking for maintainer</em>, active</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					<p><strong>NOTE</strong>: This project is in need of an active maintainer.  I’m quite busy with
 | 
				
			||||||
 | 
					other non-asterisk related projects in my personal time, so if you’re a good
 | 
				
			||||||
 | 
					Python programmer, and working with this library and Asterisk on a daily basis
 | 
				
			||||||
 | 
					– please consider maintaining the project!  Contact me for more information:
 | 
				
			||||||
 | 
					<a class="reference external" href="mailto:r%40rdegges.com">r<span>@</span>rdegges<span>.</span>com</a></p>
 | 
				
			||||||
 | 
					<p>In the meantime, I’m happy to accept pull requests and cut releases as needed.
 | 
				
			||||||
 | 
					If you want to contribute to the project, please do!</p>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="section" id="purpose">
 | 
				
			||||||
 | 
					<h2>Purpose<a class="headerlink" href="#purpose" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
 | 
					<p>pyst2 consists of a set of interfaces and libraries to allow programming of
 | 
				
			||||||
 | 
					Asterisk from python. The library currently supports AGI, AMI, and the parsing
 | 
				
			||||||
 | 
					of Asterisk configuration files. The library also includes debugging facilities
 | 
				
			||||||
 | 
					for AGI.</p>
 | 
				
			||||||
 | 
					<p>This project has been forked from pyst (<a class="reference external" href="http://sf.net/projects/pyst/">http://sf.net/projects/pyst/</a>) because
 | 
				
			||||||
 | 
					it was impossible for me to contact the project maintainer (after several
 | 
				
			||||||
 | 
					attempts), and I’d like to bring the project up-to-date, fix bugs, and make
 | 
				
			||||||
 | 
					it more usable overall.</p>
 | 
				
			||||||
 | 
					<p>My immediate plans include adding full documentation, re-writing some
 | 
				
			||||||
 | 
					of the core routines, adding a test suite, and accepting pull requests.</p>
 | 
				
			||||||
 | 
					<p>If you are one of the current maintainers, and would like to take over the
 | 
				
			||||||
 | 
					fork, please contact me: <a class="reference external" href="mailto:r%40rdegges.com">r<span>@</span>rdegges<span>.</span>com</a>, so we can get that setup!</p>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="section" id="installation">
 | 
				
			||||||
 | 
					<h2>Installation<a class="headerlink" href="#installation" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
 | 
					<p>To install <code class="docutils literal"><span class="pre">pyst2</span></code>, simply run:</p>
 | 
				
			||||||
 | 
					<div class="highlight-console"><div class="highlight"><pre><span></span><span class="gp">$</span> pip install pyst2
 | 
				
			||||||
 | 
					</pre></div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<p>This will install the latest version of the library automatically.</p>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="section" id="documentation">
 | 
				
			||||||
 | 
					<h2>Documentation<a class="headerlink" href="#documentation" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
 | 
					<p>Documentation is currently only in python docstrings, you can use
 | 
				
			||||||
 | 
					pythons built-in help facility:</p>
 | 
				
			||||||
 | 
					<div class="highlight-python"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">asterisk</span>
 | 
				
			||||||
 | 
					<span class="n">help</span> <span class="p">(</span><span class="n">asterisk</span><span class="p">)</span>
 | 
				
			||||||
 | 
					<span class="kn">import</span> <span class="nn">asterisk.agi</span>
 | 
				
			||||||
 | 
					<span class="n">help</span> <span class="p">(</span><span class="n">asterisk</span><span class="o">.</span><span class="n">agi</span><span class="p">)</span>
 | 
				
			||||||
 | 
					<span class="kn">import</span> <span class="nn">asterisk.manager</span>
 | 
				
			||||||
 | 
					<span class="n">help</span> <span class="p">(</span><span class="n">asterisk</span><span class="o">.</span><span class="n">manager</span><span class="p">)</span>
 | 
				
			||||||
 | 
					<span class="kn">import</span> <span class="nn">asterisk.config</span>
 | 
				
			||||||
 | 
					<span class="n">help</span> <span class="p">(</span><span class="n">asterisk</span><span class="o">.</span><span class="n">config</span><span class="p">)</span>
 | 
				
			||||||
 | 
					</pre></div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<p>Some notes on platforms: We now specify “platforms = ‘Any’” in
 | 
				
			||||||
 | 
					<code class="docutils literal"><span class="pre">setup.py</span></code>. This means, the manager part of the package will probably
 | 
				
			||||||
 | 
					run on any platform. The agi scripts on the other hand are called
 | 
				
			||||||
 | 
					directly on the host where Asterisk is running. Since Asterisk doesn’t
 | 
				
			||||||
 | 
					run on windows platforms (and probably never will) the agi part of the
 | 
				
			||||||
 | 
					package can only be run on Asterisk platforms.</p>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="section" id="fastagi">
 | 
				
			||||||
 | 
					<h2>FastAGI<a class="headerlink" href="#fastagi" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
 | 
					<p>FastAGI support is a python based raw SocketServer, To start the server
 | 
				
			||||||
 | 
					python fastagi.py should start it listening on localhost and the default
 | 
				
			||||||
 | 
					asterisk FastAGI port. This does require the newest version of pyst2.
 | 
				
			||||||
 | 
					The FastAGI server runs in as a Forked operation for each request, in
 | 
				
			||||||
 | 
					an attempt to prevent blocking by a single bad service. As a result the
 | 
				
			||||||
 | 
					FastAGI server may consume more memory then a single process. If you need
 | 
				
			||||||
 | 
					to use a single process simply uncomment the appropriate line. Future versions
 | 
				
			||||||
 | 
					of this will use a config file to set options.</p>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="section" id="credits">
 | 
				
			||||||
 | 
					<h2>Credits<a class="headerlink" href="#credits" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
 | 
					<p>Thanks to Karl Putland for writing the original package.</p>
 | 
				
			||||||
 | 
					<p>Thanks to Matthew Nicholson for maintaining the package for some years
 | 
				
			||||||
 | 
					and for handing over maintenance when he was no longer interested.</p>
 | 
				
			||||||
 | 
					<p>Thanks to Randall Degges for maintaining this for and accepting
 | 
				
			||||||
 | 
					pull requests.</p>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="section" id="things-to-do-for-pyst">
 | 
				
			||||||
 | 
					<h2>Things to do for pyst<a class="headerlink" href="#things-to-do-for-pyst" title="Permalink to this headline">¶</a></h2>
 | 
				
			||||||
 | 
					<p>This is the original changelog merged into the readme file. I’m not so
 | 
				
			||||||
 | 
					sure I really want to change all these things (in particular the
 | 
				
			||||||
 | 
					threaded implementation looks good to me). I will maintain a section
 | 
				
			||||||
 | 
					summarizing the changes in this README. Detailed changes will be
 | 
				
			||||||
 | 
					available in the version control tool (currently git).</p>
 | 
				
			||||||
 | 
					<ul>
 | 
				
			||||||
 | 
					<li><p class="first">ChangeLog:
 | 
				
			||||||
 | 
					The ChangeLog needs to be updated from the monotone logs.</p>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					<li><p class="first">Documentation:
 | 
				
			||||||
 | 
					All of pyst’s inline documentation needs to be updated.</p>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					<li><p class="first">manager.py:
 | 
				
			||||||
 | 
					This should be converted to be single threaded.  Also there is a race
 | 
				
			||||||
 | 
					condition when a user calls manager.logoff() followed by
 | 
				
			||||||
 | 
					manager.close().  The close() function may still call logoff again if
 | 
				
			||||||
 | 
					the socket thread has not yet cleared the _connected flag.</p>
 | 
				
			||||||
 | 
					<p>A class should be made for each manager action rather than having a
 | 
				
			||||||
 | 
					function in a manager class.  The manager class should be adapted to
 | 
				
			||||||
 | 
					have a send method that know the general format of the classes.</p>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					<p>Matthew Nicholson writes on the mailinglist (note that I’m not sure I’ll do
 | 
				
			||||||
 | 
					this, I’m currently satisfied with the threaded implementation):</p>
 | 
				
			||||||
 | 
					<blockquote>
 | 
				
			||||||
 | 
					<div><p>For pyst 0.3 I am planning to clean up the manager.py.  There are
 | 
				
			||||||
 | 
					several know issues with the code.  No one has actually reported these
 | 
				
			||||||
 | 
					as problems, but I have personally had trouble with these.  Currently
 | 
				
			||||||
 | 
					manager.py runs in several threads, the main program thread, a thread to
 | 
				
			||||||
 | 
					read from the network, and an event distribution thread.  This causes
 | 
				
			||||||
 | 
					problems with non thread safe code such as the MySQLdb libraries.  This
 | 
				
			||||||
 | 
					design also causes problems when an event handler throws an exception
 | 
				
			||||||
 | 
					that causes the event processing thread to terminate.</p>
 | 
				
			||||||
 | 
					<p>The second problem is with the way actions are sent.  Each action has a
 | 
				
			||||||
 | 
					specific function associated with it in the manager object that takes
 | 
				
			||||||
 | 
					all possible arguments that may ever be passed to that action.  This
 | 
				
			||||||
 | 
					makes the api somewhat rigid and the Manager object cluttered.</p>
 | 
				
			||||||
 | 
					<p>To solve these problems I am basically going to copy the design of my
 | 
				
			||||||
 | 
					Astxx manager library (written in c++) and make it more python like.
 | 
				
			||||||
 | 
					Each action will be a different object with certain methods to handle
 | 
				
			||||||
 | 
					various tasks, with one function in the actual Manager class to send the
 | 
				
			||||||
 | 
					action.  This will make the Manager class much smaller and much more
 | 
				
			||||||
 | 
					flexible.  The current code will be consolidated into a single threaded
 | 
				
			||||||
 | 
					design with hooks to have the library process events and such.  These
 | 
				
			||||||
 | 
					hooks will be called from the host application’s main loop.</p>
 | 
				
			||||||
 | 
					</div></blockquote>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
 | 
				
			||||||
 | 
					        <div class="sphinxsidebarwrapper">
 | 
				
			||||||
 | 
					  <h3><a href="index.html">Table Of Contents</a></h3>
 | 
				
			||||||
 | 
					  <ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#">pyst2: A Python Interface to Asterisk</a><ul>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#meta">Meta</a></li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#purpose">Purpose</a></li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#installation">Installation</a></li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#documentation">Documentation</a></li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#fastagi">FastAGI</a></li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#credits">Credits</a></li>
 | 
				
			||||||
 | 
					<li><a class="reference internal" href="#things-to-do-for-pyst">Things to do for pyst</a></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					<div class="relations">
 | 
				
			||||||
 | 
					<h3>Related Topics</h3>
 | 
				
			||||||
 | 
					<ul>
 | 
				
			||||||
 | 
					  <li><a href="index.html">Documentation overview</a><ul>
 | 
				
			||||||
 | 
					      <li>Previous: <a href="index.html" title="previous chapter">Welcome to pyst2’s documentation!</a></li>
 | 
				
			||||||
 | 
					      <li>Next: <a href="agi.html" title="next chapter">AGI</a></li>
 | 
				
			||||||
 | 
					  </ul></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					  <div role="note" aria-label="source link">
 | 
				
			||||||
 | 
					    <h3>This Page</h3>
 | 
				
			||||||
 | 
					    <ul class="this-page-menu">
 | 
				
			||||||
 | 
					      <li><a href="_sources/readme.txt"
 | 
				
			||||||
 | 
					            rel="nofollow">Show Source</a></li>
 | 
				
			||||||
 | 
					    </ul>
 | 
				
			||||||
 | 
					   </div>
 | 
				
			||||||
 | 
					<div id="searchbox" style="display: none" role="search">
 | 
				
			||||||
 | 
					  <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="footer">
 | 
				
			||||||
 | 
					      ©2016, Randall Degges.
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      |
 | 
				
			||||||
 | 
					      Powered by <a href="http://sphinx-doc.org/">Sphinx 1.3.6</a>
 | 
				
			||||||
 | 
					      & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.7</a>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      |
 | 
				
			||||||
 | 
					      <a href="_sources/readme.txt"
 | 
				
			||||||
 | 
					          rel="nofollow">Page source</a>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  </body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
							
								
								
									
										99
									
								
								html/search.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,99 @@
 | 
				
			|||||||
 | 
					<!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 — pyst2 0.4.9 documentation</title>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <link rel="stylesheet" href="_static/alabaster.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.4.9',
 | 
				
			||||||
 | 
					        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="pyst2 0.4.9 documentation" href="index.html" />
 | 
				
			||||||
 | 
					  <script type="text/javascript">
 | 
				
			||||||
 | 
					    jQuery(function() { Search.loadIndex("searchindex.js"); });
 | 
				
			||||||
 | 
					  </script>
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  <script type="text/javascript" id="searchindexloader"></script>
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </head>
 | 
				
			||||||
 | 
					  <body role="document">  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div class="document">
 | 
				
			||||||
 | 
					      <div class="documentwrapper">
 | 
				
			||||||
 | 
					        <div class="bodywrapper">
 | 
				
			||||||
 | 
					          <div class="body" role="main">
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					  <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" role="navigation" aria-label="main navigation">
 | 
				
			||||||
 | 
					        <div class="sphinxsidebarwrapper"><div class="relations">
 | 
				
			||||||
 | 
					<h3>Related Topics</h3>
 | 
				
			||||||
 | 
					<ul>
 | 
				
			||||||
 | 
					  <li><a href="index.html">Documentation overview</a><ul>
 | 
				
			||||||
 | 
					  </ul></li>
 | 
				
			||||||
 | 
					</ul>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					      <div class="clearer"></div>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div class="footer">
 | 
				
			||||||
 | 
					      ©2016, Randall Degges.
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      |
 | 
				
			||||||
 | 
					      Powered by <a href="http://sphinx-doc.org/">Sphinx 1.3.6</a>
 | 
				
			||||||
 | 
					      & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.7</a>
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  </body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||