diff options
author | Zearin <zearin@gonk.net> | 2011-10-07 10:35:21 -0400 |
---|---|---|
committer | Zearin <zearin@gonk.net> | 2011-10-07 10:35:21 -0400 |
commit | 07b4dc3d6991cbdc420c246e807371c97a467d1a (patch) | |
tree | 329febd532aedfcd4daf92c807e802d1535c8f88 /doxygen/html/cmd2_8py_source.html | |
parent | 36a2424cfd8c44d9f63bb4e2d7ac69cf7bce3940 (diff) | |
parent | 04cdcb0feb369ac4c60e10ccdc139c57e8b52e62 (diff) | |
download | cmd2-master.tar.gz |
Diffstat (limited to 'doxygen/html/cmd2_8py_source.html')
-rw-r--r-- | doxygen/html/cmd2_8py_source.html | 1721 |
1 files changed, 0 insertions, 1721 deletions
diff --git a/doxygen/html/cmd2_8py_source.html b/doxygen/html/cmd2_8py_source.html deleted file mode 100644 index ab7ea18..0000000 --- a/doxygen/html/cmd2_8py_source.html +++ /dev/null @@ -1,1721 +0,0 @@ -<!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/xhtml;charset=UTF-8"/> -<title>Cmd2: /Users/amrogers/Developer/Projects/cmd2/cmd2.py Source File</title> - -<link href="tabs.css" rel="stylesheet" type="text/css"/> -<link href="doxygen.css" rel="stylesheet" type="text/css" /> -<link href="navtree.css" rel="stylesheet" type="text/css"/> -<script type="text/javascript" src="jquery.js"></script> -<script type="text/javascript" src="resize.js"></script> -<script type="text/javascript" src="navtree.js"></script> -<script type="text/javascript"> - $(document).ready(initResizable); -</script> -<link href="search/search.css" rel="stylesheet" type="text/css"/> -<script type="text/javascript" src="search/search.js"></script> -<script type="text/javascript"> - $(document).ready(function() { searchBox.OnSelectItem(0); }); -</script> - -</head> -<body> -<div id="top"><!-- do not remove this div! --> - - -<div id="titlearea"> -<table cellspacing="0" cellpadding="0"> - <tbody> - <tr style="height: 56px;"> - - - <td style="padding-left: 0.5em;"> - <div id="projectname">Cmd2 - - </div> - - </td> - - - - </tr> - </tbody> -</table> -</div> - -<!-- Generated by Doxygen 1.7.5.1 --> -<script type="text/javascript"> -var searchBox = new SearchBox("searchBox", "search",false,'Search'); -</script> - <div id="navrow1" class="tabs"> - <ul class="tablist"> - <li><a href="index.html"><span>Main Page</span></a></li> - <li><a href="namespaces.html"><span>Packages</span></a></li> - <li><a href="annotated.html"><span>Classes</span></a></li> - <li class="current"><a href="files.html"><span>Files</span></a></li> - <li><a href="dirs.html"><span>Directories</span></a></li> - <li> - <div id="MSearchBox" class="MSearchBoxInactive"> - <span class="left"> - <img id="MSearchSelect" src="search/mag_sel.png" - onmouseover="return searchBox.OnSearchSelectShow()" - onmouseout="return searchBox.OnSearchSelectHide()" - alt=""/> - <input type="text" id="MSearchField" value="Search" accesskey="S" - onfocus="searchBox.OnSearchFieldFocus(true)" - onblur="searchBox.OnSearchFieldFocus(false)" - onkeyup="searchBox.OnSearchFieldChange(event)"/> - </span><span class="right"> - <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a> - </span> - </div> - </li> - </ul> - </div> - <div id="navrow2" class="tabs2"> - <ul class="tablist"> - <li><a href="files.html"><span>File List</span></a></li> - </ul> - </div> -</div> -<div id="side-nav" class="ui-resizable side-nav-resizable"> - <div id="nav-tree"> - <div id="nav-tree-contents"> - </div> - </div> - <div id="splitbar" style="-moz-user-select:none;" - class="ui-resizable-handle"> - </div> -</div> -<script type="text/javascript"> - initNavTree('cmd2_8py.html',''); -</script> -<div id="doc-content"> -<div class="header"> - <div class="headertitle"> -<div class="title">cmd2.py</div> </div> -</div> -<div class="contents"> -<a href="cmd2_8py.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a><a class="code" href="namespacecmd2.html">00001</a> <span class="stringliteral">"""Variant on standard library's cmd with extra features.</span> -<a name="l00002"></a>00002 <span class="stringliteral"></span> -<a name="l00003"></a>00003 <span class="stringliteral">To use, simply import cmd2.Cmd instead of cmd.Cmd; use precisely as though you</span> -<a name="l00004"></a>00004 <span class="stringliteral">were using the standard library's cmd, while enjoying the extra features.</span> -<a name="l00005"></a>00005 <span class="stringliteral"></span> -<a name="l00006"></a>00006 <span class="stringliteral">Searchable command history (commands: "hi", "li", "run")</span> -<a name="l00007"></a>00007 <span class="stringliteral">Load commands from file, save to file, edit commands in file</span> -<a name="l00008"></a>00008 <span class="stringliteral">Multi-line commands</span> -<a name="l00009"></a>00009 <span class="stringliteral">Case-insensitive commands</span> -<a name="l00010"></a>00010 <span class="stringliteral">Special-character shortcut commands (beyond cmd's "@" and "!")</span> -<a name="l00011"></a>00011 <span class="stringliteral">Settable environment parameters</span> -<a name="l00012"></a>00012 <span class="stringliteral">Optional _onchange_{paramname} called when environment parameter changes</span> -<a name="l00013"></a>00013 <span class="stringliteral">Parsing commands with `optparse` options (flags)</span> -<a name="l00014"></a>00014 <span class="stringliteral">Redirection to file with >, >>; input from file with <</span> -<a name="l00015"></a>00015 <span class="stringliteral">Easy transcript-based testing of applications (see example/example.py)</span> -<a name="l00016"></a>00016 <span class="stringliteral">Bash-style ``select`` available</span> -<a name="l00017"></a>00017 <span class="stringliteral"></span> -<a name="l00018"></a>00018 <span class="stringliteral">Note that redirection with > and | will only work if `self.stdout.write()`</span> -<a name="l00019"></a>00019 <span class="stringliteral">is used in place of `print`. The standard library's `cmd` module is </span> -<a name="l00020"></a>00020 <span class="stringliteral">written to use `self.stdout.write()`, </span> -<a name="l00021"></a>00021 <span class="stringliteral"></span> -<a name="l00022"></a>00022 <span class="stringliteral">- Catherine Devlin, Jan 03 2008 - catherinedevlin.blogspot.com</span> -<a name="l00023"></a>00023 <span class="stringliteral"></span> -<a name="l00024"></a>00024 <span class="stringliteral">mercurial repository at http://www.assembla.com/wiki/show/python-cmd2</span> -<a name="l00025"></a>00025 <span class="stringliteral">"""</span> -<a name="l00026"></a>00026 <span class="keyword">import</span> cmd -<a name="l00027"></a>00027 <span class="keyword">import</span> re -<a name="l00028"></a>00028 <span class="keyword">import</span> os -<a name="l00029"></a>00029 <span class="keyword">import</span> sys -<a name="l00030"></a>00030 <span class="keyword">import</span> optparse -<a name="l00031"></a>00031 <span class="keyword">import</span> subprocess -<a name="l00032"></a>00032 <span class="keyword">import</span> tempfile -<a name="l00033"></a>00033 <span class="keyword">import</span> doctest -<a name="l00034"></a>00034 <span class="keyword">import</span> unittest -<a name="l00035"></a>00035 <span class="keyword">import</span> datetime -<a name="l00036"></a>00036 <span class="keyword">import</span> urllib -<a name="l00037"></a>00037 <span class="keyword">import</span> glob -<a name="l00038"></a>00038 <span class="keyword">import</span> traceback -<a name="l00039"></a>00039 <span class="keyword">import</span> platform -<a name="l00040"></a>00040 <span class="keyword">import</span> copy -<a name="l00041"></a>00041 <span class="keyword">from</span> code <span class="keyword">import</span> InteractiveConsole, InteractiveInterpreter -<a name="l00042"></a>00042 <span class="keyword">from</span> optparse <span class="keyword">import</span> make_option -<a name="l00043"></a>00043 <span class="keyword">import</span> pyparsing -<a name="l00044"></a>00044 -<a name="l00045"></a><a class="code" href="namespacecmd2.html#a05ce8a1645f64208f969036f8621ddd2">00045</a> __version__ = <span class="stringliteral">'0.6.4'</span> -<a name="l00046"></a>00046 -<a name="l00047"></a>00047 <span class="keywordflow">if</span> sys.version_info[0] == 2: -<a name="l00048"></a>00048 pyparsing.ParserElement.enablePackrat() -<a name="l00049"></a>00049 -<a name="l00050"></a>00050 <span class="stringliteral">"""</span> -<a name="l00051"></a>00051 <span class="stringliteral">Packrat is causing Python3 errors that I don't understand.</span> -<a name="l00052"></a>00052 <span class="stringliteral"></span> -<a name="l00053"></a>00053 <span class="stringliteral">> /usr/local/Cellar/python3/3.2/lib/python3.2/site-packages/pyparsing-1.5.6-py3.2.egg/pyparsing.py(999)scanString()</span> -<a name="l00054"></a>00054 <span class="stringliteral">-> nextLoc,tokens = parseFn( instring, preloc, callPreParse=False )</span> -<a name="l00055"></a>00055 <span class="stringliteral">(Pdb) n</span> -<a name="l00056"></a>00056 <span class="stringliteral">NameError: global name 'exc' is not defined</span> -<a name="l00057"></a>00057 <span class="stringliteral"></span> -<a name="l00058"></a>00058 <span class="stringliteral">(Pdb) parseFn</span> -<a name="l00059"></a>00059 <span class="stringliteral"><bound method Or._parseCache of {Python style comment ^ C style comment}></span> -<a name="l00060"></a>00060 <span class="stringliteral"></span> -<a name="l00061"></a>00061 <span class="stringliteral">Bug report filed: https://sourceforge.net/tracker/?func=detail&atid=617311&aid=3381439&group_id=97203</span> -<a name="l00062"></a>00062 <span class="stringliteral">"""</span> -<a name="l00063"></a>00063 -<a name="l00064"></a><a class="code" href="classcmd2_1_1OptionParser.html">00064</a> <span class="keyword">class </span><a class="code" href="classcmd2_1_1OptionParser.html">OptionParser</a>(optparse.OptionParser): -<a name="l00065"></a><a class="code" href="classcmd2_1_1OptionParser.html#ad82c8fb7559af2e4b1663e0762a80c89">00065</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1OptionParser.html#ad82c8fb7559af2e4b1663e0762a80c89">exit</a>(self, status=0, msg=None): -<a name="l00066"></a>00066 self.values._exit = <span class="keyword">True</span> -<a name="l00067"></a>00067 <span class="keywordflow">if</span> msg: -<a name="l00068"></a>00068 <span class="keywordflow">print</span> (msg) -<a name="l00069"></a>00069 -<a name="l00070"></a><a class="code" href="classcmd2_1_1OptionParser.html#a6f2d24051471268be245221149bc9c6a">00070</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1OptionParser.html#a6f2d24051471268be245221149bc9c6a">print_help</a>(self, *args, **kwargs): -<a name="l00071"></a>00071 <span class="keywordflow">try</span>: -<a name="l00072"></a>00072 <span class="keywordflow">print</span> (self._func.__doc__) -<a name="l00073"></a>00073 <span class="keywordflow">except</span> AttributeError: -<a name="l00074"></a>00074 <span class="keywordflow">pass</span> -<a name="l00075"></a>00075 optparse.OptionParser.print_help(self, *args, **kwargs) -<a name="l00076"></a>00076 -<a name="l00077"></a><a class="code" href="classcmd2_1_1OptionParser.html#ada4f39b453e033ae4356709f8ee9f340">00077</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1OptionParser.html#ada4f39b453e033ae4356709f8ee9f340">error</a>(self, msg): -<a name="l00078"></a>00078 <span class="stringliteral">"""error(msg : string)</span> -<a name="l00079"></a>00079 <span class="stringliteral"></span> -<a name="l00080"></a>00080 <span class="stringliteral"> Print a usage message incorporating 'msg' to stderr and exit.</span> -<a name="l00081"></a>00081 <span class="stringliteral"> If you override this in a subclass, it should not return -- it</span> -<a name="l00082"></a>00082 <span class="stringliteral"> should either exit or raise an exception.</span> -<a name="l00083"></a>00083 <span class="stringliteral"> """</span> -<a name="l00084"></a>00084 <span class="keywordflow">raise</span> optparse.OptParseError(msg) -<a name="l00085"></a>00085 -<a name="l00086"></a><a class="code" href="namespacecmd2.html#a11d252497d81548f19771cddf0ca68fb">00086</a> <span class="keyword">def </span><a class="code" href="namespacecmd2.html#a11d252497d81548f19771cddf0ca68fb">remaining_args</a>(oldArgs, newArgList): -<a name="l00087"></a>00087 <span class="stringliteral">'''</span> -<a name="l00088"></a>00088 <span class="stringliteral"> Preserves the spacing originally in the argument after</span> -<a name="l00089"></a>00089 <span class="stringliteral"> the removal of options.</span> -<a name="l00090"></a>00090 <span class="stringliteral"> </span> -<a name="l00091"></a>00091 <span class="stringliteral"> >>> remaining_args('-f bar bar cow', ['bar', 'cow'])</span> -<a name="l00092"></a>00092 <span class="stringliteral"> 'bar cow'</span> -<a name="l00093"></a>00093 <span class="stringliteral"> '''</span> -<a name="l00094"></a>00094 pattern = <span class="stringliteral">'\s+'</span>.join(re.escape(a) <span class="keywordflow">for</span> a <span class="keywordflow">in</span> newArgList) + <span class="stringliteral">'\s*$'</span> -<a name="l00095"></a>00095 matchObj = re.search(pattern, oldArgs) -<a name="l00096"></a>00096 <span class="keywordflow">return</span> oldArgs[matchObj.start():] -<a name="l00097"></a>00097 -<a name="l00098"></a><a class="code" href="namespacecmd2.html#a93001003cf51a72d1d6adaf5e3e22366">00098</a> <span class="keyword">def </span><a class="code" href="namespacecmd2.html#a93001003cf51a72d1d6adaf5e3e22366">_attr_get_</a>(obj, attr): -<a name="l00099"></a>00099 <span class="stringliteral">'''Returns an attribute's value, or None (no error) if undefined.</span> -<a name="l00100"></a>00100 <span class="stringliteral"> Analagous to .get() for dictionaries. Useful when checking for</span> -<a name="l00101"></a>00101 <span class="stringliteral"> value of options that may not have been defined on a given</span> -<a name="l00102"></a>00102 <span class="stringliteral"> method.'''</span> -<a name="l00103"></a>00103 <span class="keywordflow">try</span>: -<a name="l00104"></a>00104 <span class="keywordflow">return</span> getattr(obj, attr) -<a name="l00105"></a>00105 <span class="keywordflow">except</span> AttributeError: -<a name="l00106"></a>00106 <span class="keywordflow">return</span> <span class="keywordtype">None</span> -<a name="l00107"></a>00107 -<a name="l00108"></a>00108 optparse.Values.get = _attr_get_ -<a name="l00109"></a>00109 -<a name="l00110"></a><a class="code" href="namespacecmd2.html#afd483925db6ff208624b8e5c0ae09271">00110</a> options_defined = [] <span class="comment"># used to distinguish --options from SQL-style --comments</span> -<a name="l00111"></a>00111 -<a name="l00112"></a><a class="code" href="namespacecmd2.html#a863be2c5e3b9fdec03710fd550801c22">00112</a> <span class="keyword">def </span><a class="code" href="namespacecmd2.html#a863be2c5e3b9fdec03710fd550801c22">options</a>(option_list, arg_desc="arg"): -<a name="l00113"></a>00113 <span class="stringliteral">'''Used as a decorator and passed a list of optparse-style options,</span> -<a name="l00114"></a>00114 <span class="stringliteral"> alters a cmd2 method to populate its ``opts`` argument from its</span> -<a name="l00115"></a>00115 <span class="stringliteral"> raw text argument.</span> -<a name="l00116"></a>00116 <span class="stringliteral"></span> -<a name="l00117"></a>00117 <span class="stringliteral"> Example: transform</span> -<a name="l00118"></a>00118 <span class="stringliteral"> def do_something(self, arg):</span> -<a name="l00119"></a>00119 <span class="stringliteral"></span> -<a name="l00120"></a>00120 <span class="stringliteral"> into</span> -<a name="l00121"></a>00121 <span class="stringliteral"> @options([make_option('-q', '--quick', action="store_true",</span> -<a name="l00122"></a>00122 <span class="stringliteral"> help="Makes things fast")],</span> -<a name="l00123"></a>00123 <span class="stringliteral"> "source dest")</span> -<a name="l00124"></a>00124 <span class="stringliteral"> def do_something(self, arg, opts):</span> -<a name="l00125"></a>00125 <span class="stringliteral"> if opts.quick:</span> -<a name="l00126"></a>00126 <span class="stringliteral"> self.fast_button = True</span> -<a name="l00127"></a>00127 <span class="stringliteral"> '''</span> -<a name="l00128"></a>00128 <span class="keywordflow">if</span> <span class="keywordflow">not</span> isinstance(option_list, list): -<a name="l00129"></a>00129 option_list = [option_list] -<a name="l00130"></a>00130 <span class="keywordflow">for</span> opt <span class="keywordflow">in</span> option_list: -<a name="l00131"></a>00131 options_defined.append(pyparsing.Literal(opt.get_opt_string())) -<a name="l00132"></a>00132 <span class="keyword">def </span>option_setup(func): -<a name="l00133"></a>00133 optionParser = <a class="code" href="classcmd2_1_1OptionParser.html">OptionParser</a>() -<a name="l00134"></a>00134 <span class="keywordflow">for</span> opt <span class="keywordflow">in</span> option_list: -<a name="l00135"></a>00135 optionParser.add_option(opt) -<a name="l00136"></a>00136 optionParser.set_usage(<span class="stringliteral">"%s [options] %s"</span> % (func.__name__[3:], arg_desc)) -<a name="l00137"></a>00137 optionParser._func = func -<a name="l00138"></a>00138 <span class="keyword">def </span>new_func(instance, arg): -<a name="l00139"></a>00139 <span class="keywordflow">try</span>: -<a name="l00140"></a>00140 opts, newArgList = optionParser.parse_args(arg.split()) -<a name="l00141"></a>00141 <span class="comment"># Must find the remaining args in the original argument list, but </span> -<a name="l00142"></a>00142 <span class="comment"># mustn't include the command itself</span> -<a name="l00143"></a>00143 <span class="comment">#if hasattr(arg, 'parsed') and newArgList[0] == arg.parsed.command:</span> -<a name="l00144"></a>00144 <span class="comment"># newArgList = newArgList[1:]</span> -<a name="l00145"></a>00145 newArgs = <a class="code" href="namespacecmd2.html#a11d252497d81548f19771cddf0ca68fb">remaining_args</a>(arg, newArgList) -<a name="l00146"></a>00146 <span class="keywordflow">if</span> isinstance(arg, ParsedString): -<a name="l00147"></a>00147 arg = arg.with_args_replaced(newArgs) -<a name="l00148"></a>00148 <span class="keywordflow">else</span>: -<a name="l00149"></a>00149 arg = newArgs -<a name="l00150"></a>00150 <span class="keywordflow">except</span> optparse.OptParseError, e: -<a name="l00151"></a>00151 <span class="keywordflow">print</span> (e) -<a name="l00152"></a>00152 optionParser.print_help() -<a name="l00153"></a>00153 <span class="keywordflow">return</span> -<a name="l00154"></a>00154 <span class="keywordflow">if</span> hasattr(opts, <span class="stringliteral">'_exit'</span>): -<a name="l00155"></a>00155 <span class="keywordflow">return</span> <span class="keywordtype">None</span> -<a name="l00156"></a>00156 result = func(instance, arg, opts) -<a name="l00157"></a>00157 <span class="keywordflow">return</span> result -<a name="l00158"></a>00158 new_func.__doc__ = <span class="stringliteral">'%s\n%s'</span> % (func.__doc__, optionParser.format_help()) -<a name="l00159"></a>00159 <span class="keywordflow">return</span> new_func -<a name="l00160"></a>00160 <span class="keywordflow">return</span> option_setup -<a name="l00161"></a>00161 -<a name="l00162"></a><a class="code" href="classcmd2_1_1PasteBufferError.html">00162</a> <span class="keyword">class </span><a class="code" href="classcmd2_1_1PasteBufferError.html">PasteBufferError</a>(EnvironmentError): -<a name="l00163"></a>00163 <span class="keywordflow">if</span> sys.platform[:3] == <span class="stringliteral">'win'</span>: -<a name="l00164"></a><a class="code" href="classcmd2_1_1PasteBufferError.html#adaa363483c6d5a54f13713233ba398b2">00164</a> errmsg = <span class="stringliteral">"""Redirecting to or from paste buffer requires pywin32</span> -<a name="l00165"></a>00165 <span class="stringliteral">to be installed on operating system.</span> -<a name="l00166"></a>00166 <span class="stringliteral">Download from http://sourceforge.net/projects/pywin32/"""</span> -<a name="l00167"></a>00167 <span class="keywordflow">elif</span> sys.platform[:3] == <span class="stringliteral">'dar'</span>: -<a name="l00168"></a>00168 <span class="comment"># Use built in pbcopy on Mac OSX</span> -<a name="l00169"></a>00169 <span class="keywordflow">pass</span> -<a name="l00170"></a>00170 <span class="keywordflow">else</span>: -<a name="l00171"></a>00171 errmsg = <span class="stringliteral">"""Redirecting to or from paste buffer requires xclip </span> -<a name="l00172"></a>00172 <span class="stringliteral">to be installed on operating system.</span> -<a name="l00173"></a>00173 <span class="stringliteral">On Debian/Ubuntu, 'sudo apt-get install xclip' will install it."""</span> -<a name="l00174"></a><a class="code" href="classcmd2_1_1PasteBufferError.html#ae1cd41756d1ae940201fe2cb0d0f821e">00174</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1PasteBufferError.html#ae1cd41756d1ae940201fe2cb0d0f821e">__init__</a>(self): -<a name="l00175"></a>00175 Exception.__init__(self, self.<a class="code" href="classcmd2_1_1PasteBufferError.html#adaa363483c6d5a54f13713233ba398b2">errmsg</a>) -<a name="l00176"></a>00176 -<a name="l00177"></a><a class="code" href="namespacecmd2.html#abb901de4eb2987589c68b4d895acd8c3">00177</a> pastebufferr = <span class="stringliteral">"""Redirecting to or from paste buffer requires %s</span> -<a name="l00178"></a>00178 <span class="stringliteral">to be installed on operating system.</span> -<a name="l00179"></a>00179 <span class="stringliteral">%s"""</span> -<a name="l00180"></a>00180 -<a name="l00181"></a>00181 <span class="keywordflow">if</span> subprocess.mswindows: -<a name="l00182"></a>00182 <span class="keywordflow">try</span>: -<a name="l00183"></a>00183 <span class="keyword">import</span> win32clipboard -<a name="l00184"></a><a class="code" href="namespacecmd2.html#a9f1495f6c72f7d8c0dbb0f9f22029763">00184</a> <span class="keyword">def </span><a class="code" href="namespacecmd2.html#a9f1495f6c72f7d8c0dbb0f9f22029763">get_paste_buffer</a>(): -<a name="l00185"></a>00185 win32clipboard.OpenClipboard(0) -<a name="l00186"></a>00186 <span class="keywordflow">try</span>: -<a name="l00187"></a>00187 result = win32clipboard.GetClipboardData() -<a name="l00188"></a>00188 <span class="keywordflow">except</span> TypeError: -<a name="l00189"></a>00189 result = <span class="stringliteral">''</span> <span class="comment">#non-text</span> -<a name="l00190"></a>00190 win32clipboard.CloseClipboard() -<a name="l00191"></a>00191 <span class="keywordflow">return</span> result -<a name="l00192"></a><a class="code" href="namespacecmd2.html#a514a20ceb8ab40dd89d2df2dd5ff87a0">00192</a> <span class="keyword">def </span><a class="code" href="namespacecmd2.html#a514a20ceb8ab40dd89d2df2dd5ff87a0">write_to_paste_buffer</a>(txt): -<a name="l00193"></a>00193 win32clipboard.OpenClipboard(0) -<a name="l00194"></a>00194 win32clipboard.EmptyClipboard() -<a name="l00195"></a>00195 win32clipboard.SetClipboardText(txt) -<a name="l00196"></a>00196 win32clipboard.CloseClipboard() -<a name="l00197"></a>00197 <span class="keywordflow">except</span> ImportError: -<a name="l00198"></a><a class="code" href="namespacecmd2.html#a9f1495f6c72f7d8c0dbb0f9f22029763">00198</a> <span class="keyword">def </span><a class="code" href="namespacecmd2.html#a9f1495f6c72f7d8c0dbb0f9f22029763">get_paste_buffer</a>(*args): -<a name="l00199"></a>00199 <span class="keywordflow">raise</span> OSError, pastebufferr % (<span class="stringliteral">'pywin32'</span>, <span class="stringliteral">'Download from http://sourceforge.net/projects/pywin32/'</span>) -<a name="l00200"></a><a class="code" href="namespacecmd2.html#a514a20ceb8ab40dd89d2df2dd5ff87a0">00200</a> write_to_paste_buffer = get_paste_buffer -<a name="l00201"></a>00201 <span class="keywordflow">elif</span> sys.platform == <span class="stringliteral">'darwin'</span>: -<a name="l00202"></a><a class="code" href="namespacecmd2.html#a3f2a6eb75c58ca830028f18cf2851958">00202</a> can_clip = <span class="keyword">False</span> -<a name="l00203"></a>00203 <span class="keywordflow">try</span>: -<a name="l00204"></a>00204 <span class="comment"># test for pbcopy - AFAIK, should always be installed on MacOS</span> -<a name="l00205"></a>00205 subprocess.check_call(<span class="stringliteral">'pbcopy -help'</span>, shell=<span class="keyword">True</span>, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) -<a name="l00206"></a>00206 can_clip = <span class="keyword">True</span> -<a name="l00207"></a>00207 <span class="keywordflow">except</span> (subprocess.CalledProcessError, OSError, IOError): -<a name="l00208"></a>00208 <span class="keywordflow">pass</span> -<a name="l00209"></a>00209 <span class="keywordflow">if</span> can_clip: -<a name="l00210"></a>00210 <span class="keyword">def </span><a class="code" href="namespacecmd2.html#a9f1495f6c72f7d8c0dbb0f9f22029763">get_paste_buffer</a>(): -<a name="l00211"></a>00211 pbcopyproc = subprocess.Popen(<span class="stringliteral">'pbcopy -help'</span>, shell=<span class="keyword">True</span>, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) -<a name="l00212"></a>00212 <span class="keywordflow">return</span> pbcopyproc.stdout.read() -<a name="l00213"></a>00213 <span class="keyword">def </span><a class="code" href="namespacecmd2.html#a514a20ceb8ab40dd89d2df2dd5ff87a0">write_to_paste_buffer</a>(txt): -<a name="l00214"></a>00214 pbcopyproc = subprocess.Popen(<span class="stringliteral">'pbcopy'</span>, shell=<span class="keyword">True</span>, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) -<a name="l00215"></a>00215 pbcopyproc.communicate(txt.encode()) -<a name="l00216"></a>00216 <span class="keywordflow">else</span>: -<a name="l00217"></a>00217 <span class="keyword">def </span><a class="code" href="namespacecmd2.html#a9f1495f6c72f7d8c0dbb0f9f22029763">get_paste_buffer</a>(*args): -<a name="l00218"></a>00218 <span class="keywordflow">raise</span> OSError, pastebufferr % (<span class="stringliteral">'pbcopy'</span>, <span class="stringliteral">'On MacOS X - error should not occur - part of the default installation'</span>) -<a name="l00219"></a>00219 write_to_paste_buffer = get_paste_buffer -<a name="l00220"></a>00220 <span class="keywordflow">else</span>: -<a name="l00221"></a>00221 can_clip = <span class="keyword">False</span> -<a name="l00222"></a>00222 <span class="keywordflow">try</span>: -<a name="l00223"></a>00223 subprocess.check_call(<span class="stringliteral">'xclip -o -sel clip'</span>, shell=<span class="keyword">True</span>, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) -<a name="l00224"></a>00224 can_clip = <span class="keyword">True</span> -<a name="l00225"></a>00225 <span class="keywordflow">except</span> AttributeError: <span class="comment"># check_call not defined, Python < 2.5</span> -<a name="l00226"></a>00226 <span class="keywordflow">try</span>: -<a name="l00227"></a><a class="code" href="namespacecmd2.html#ab810fc3f05607c1e4311225b04591244">00227</a> teststring = <span class="stringliteral">'Testing for presence of xclip.'</span> -<a name="l00228"></a><a class="code" href="namespacecmd2.html#ae76e61704924b26b7ddb97fce8c384ef">00228</a> xclipproc = subprocess.Popen(<span class="stringliteral">'xclip -sel clip'</span>, shell=<span class="keyword">True</span>, stdout=subprocess.PIPE, stdin=subprocess.PIPE) -<a name="l00229"></a>00229 xclipproc.stdin.write(teststring) -<a name="l00230"></a>00230 xclipproc.stdin.close() -<a name="l00231"></a>00231 xclipproc = subprocess.Popen(<span class="stringliteral">'xclip -o -sel clip'</span>, shell=<span class="keyword">True</span>, stdout=subprocess.PIPE, stdin=subprocess.PIPE) -<a name="l00232"></a>00232 <span class="keywordflow">if</span> xclipproc.stdout.read() == teststring: -<a name="l00233"></a>00233 can_clip = <span class="keyword">True</span> -<a name="l00234"></a>00234 <span class="keywordflow">except</span> Exception: <span class="comment"># hate a bare Exception call, but exception classes vary too much b/t stdlib versions</span> -<a name="l00235"></a>00235 <span class="keywordflow">pass</span> -<a name="l00236"></a>00236 <span class="keywordflow">except</span> Exception: -<a name="l00237"></a>00237 <span class="keywordflow">pass</span> <span class="comment"># something went wrong with xclip and we cannot use it</span> -<a name="l00238"></a>00238 <span class="keywordflow">if</span> can_clip: -<a name="l00239"></a>00239 <span class="keyword">def </span><a class="code" href="namespacecmd2.html#a9f1495f6c72f7d8c0dbb0f9f22029763">get_paste_buffer</a>(): -<a name="l00240"></a>00240 xclipproc = subprocess.Popen(<span class="stringliteral">'xclip -o -sel clip'</span>, shell=<span class="keyword">True</span>, stdout=subprocess.PIPE, stdin=subprocess.PIPE) -<a name="l00241"></a>00241 <span class="keywordflow">return</span> xclipproc.stdout.read() -<a name="l00242"></a>00242 <span class="keyword">def </span><a class="code" href="namespacecmd2.html#a514a20ceb8ab40dd89d2df2dd5ff87a0">write_to_paste_buffer</a>(txt): -<a name="l00243"></a>00243 xclipproc = subprocess.Popen(<span class="stringliteral">'xclip -sel clip'</span>, shell=<span class="keyword">True</span>, stdout=subprocess.PIPE, stdin=subprocess.PIPE) -<a name="l00244"></a>00244 xclipproc.stdin.write(txt.encode()) -<a name="l00245"></a>00245 xclipproc.stdin.close() -<a name="l00246"></a>00246 <span class="comment"># but we want it in both the "primary" and "mouse" clipboards</span> -<a name="l00247"></a>00247 xclipproc = subprocess.Popen(<span class="stringliteral">'xclip'</span>, shell=<span class="keyword">True</span>, stdout=subprocess.PIPE, stdin=subprocess.PIPE) -<a name="l00248"></a>00248 xclipproc.stdin.write(txt.encode()) -<a name="l00249"></a>00249 xclipproc.stdin.close() -<a name="l00250"></a>00250 <span class="keywordflow">else</span>: -<a name="l00251"></a>00251 <span class="keyword">def </span><a class="code" href="namespacecmd2.html#a9f1495f6c72f7d8c0dbb0f9f22029763">get_paste_buffer</a>(*args): -<a name="l00252"></a>00252 <span class="keywordflow">raise</span> OSError, pastebufferr % (<span class="stringliteral">'xclip'</span>, <span class="stringliteral">'On Debian/Ubuntu, install with "sudo apt-get install xclip"'</span>) -<a name="l00253"></a>00253 write_to_paste_buffer = get_paste_buffer -<a name="l00254"></a>00254 -<a name="l00255"></a>00255 pyparsing.ParserElement.setDefaultWhitespaceChars(<span class="stringliteral">' \t'</span>) -<a name="l00256"></a>00256 -<a name="l00257"></a><a class="code" href="classcmd2_1_1ParsedString.html">00257</a> <span class="keyword">class </span><a class="code" href="classcmd2_1_1ParsedString.html">ParsedString</a>(str): -<a name="l00258"></a><a class="code" href="classcmd2_1_1ParsedString.html#a6ac3a7f2f37126a25774517b3eb7cace">00258</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1ParsedString.html#a6ac3a7f2f37126a25774517b3eb7cace">full_parsed_statement</a>(self): -<a name="l00259"></a>00259 new = <a class="code" href="classcmd2_1_1ParsedString.html">ParsedString</a>(<span class="stringliteral">'%s %s'</span> % (self.parsed.command, self.parsed.args)) -<a name="l00260"></a>00260 new.parsed = self.parsed -<a name="l00261"></a>00261 new.parser = self.parser -<a name="l00262"></a>00262 <span class="keywordflow">return</span> new -<a name="l00263"></a><a class="code" href="classcmd2_1_1ParsedString.html#afe56ec060a51b268e266f7c0d1fb7328">00263</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1ParsedString.html#afe56ec060a51b268e266f7c0d1fb7328">with_args_replaced</a>(self, newargs): -<a name="l00264"></a>00264 new = <a class="code" href="classcmd2_1_1ParsedString.html">ParsedString</a>(newargs) -<a name="l00265"></a>00265 new.parsed = self.parsed -<a name="l00266"></a>00266 new.parser = self.parser -<a name="l00267"></a>00267 new.parsed[<span class="stringliteral">'args'</span>] = newargs -<a name="l00268"></a>00268 new.parsed.statement[<span class="stringliteral">'args'</span>] = newargs -<a name="l00269"></a>00269 <span class="keywordflow">return</span> new -<a name="l00270"></a>00270 -<a name="l00271"></a><a class="code" href="classcmd2_1_1StubbornDict.html">00271</a> <span class="keyword">class </span><a class="code" href="classcmd2_1_1StubbornDict.html">StubbornDict</a>(dict): -<a name="l00272"></a>00272 <span class="stringliteral">'''Dictionary that tolerates many input formats.</span> -<a name="l00273"></a>00273 <span class="stringliteral"> Create it with stubbornDict(arg) factory function.</span> -<a name="l00274"></a>00274 <span class="stringliteral"> </span> -<a name="l00275"></a>00275 <span class="stringliteral"> >>> d = StubbornDict(large='gross', small='klein')</span> -<a name="l00276"></a>00276 <span class="stringliteral"> >>> sorted(d.items())</span> -<a name="l00277"></a>00277 <span class="stringliteral"> [('large', 'gross'), ('small', 'klein')]</span> -<a name="l00278"></a>00278 <span class="stringliteral"> >>> d.append(['plain', ' plaid'])</span> -<a name="l00279"></a>00279 <span class="stringliteral"> >>> sorted(d.items())</span> -<a name="l00280"></a>00280 <span class="stringliteral"> [('large', 'gross'), ('plaid', ''), ('plain', ''), ('small', 'klein')]</span> -<a name="l00281"></a>00281 <span class="stringliteral"> >>> d += ' girl Frauelein, Maedchen\\n\\n shoe schuh'</span> -<a name="l00282"></a>00282 <span class="stringliteral"> >>> sorted(d.items())</span> -<a name="l00283"></a>00283 <span class="stringliteral"> [('girl', 'Frauelein, Maedchen'), ('large', 'gross'), ('plaid', ''), ('plain', ''), ('shoe', 'schuh'), ('small', 'klein')]</span> -<a name="l00284"></a>00284 <span class="stringliteral"> '''</span> -<a name="l00285"></a><a class="code" href="classcmd2_1_1StubbornDict.html#a669dd7f5373f3726d8c8fb52a1e85bbd">00285</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1StubbornDict.html#a669dd7f5373f3726d8c8fb52a1e85bbd">update</a>(self, arg): -<a name="l00286"></a>00286 dict.update(self, StubbornDict.to_dict(arg)) -<a name="l00287"></a><a class="code" href="classcmd2_1_1StubbornDict.html#a66dc32a221c00611f1c131382703c333">00287</a> append = update -<a name="l00288"></a><a class="code" href="classcmd2_1_1StubbornDict.html#ad7c49b2ca37c0c88b198853706ae7e99">00288</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1StubbornDict.html#ad7c49b2ca37c0c88b198853706ae7e99">__iadd__</a>(self, arg): -<a name="l00289"></a>00289 self.<a class="code" href="classcmd2_1_1StubbornDict.html#a669dd7f5373f3726d8c8fb52a1e85bbd">update</a>(arg) -<a name="l00290"></a>00290 <span class="keywordflow">return</span> self -<a name="l00291"></a><a class="code" href="classcmd2_1_1StubbornDict.html#a219b3f21c078f3b8158de67beae62da2">00291</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1StubbornDict.html#a219b3f21c078f3b8158de67beae62da2">__add__</a>(self, arg): -<a name="l00292"></a>00292 selfcopy = copy.copy(self) -<a name="l00293"></a>00293 selfcopy.update(<a class="code" href="namespacecmd2.html#aae88fcdb31e45b322ecdaf7df9922823">stubbornDict</a>(arg)) -<a name="l00294"></a>00294 <span class="keywordflow">return</span> selfcopy -<a name="l00295"></a><a class="code" href="classcmd2_1_1StubbornDict.html#a190b1b2bd8a914bafaab137c5b1276ea">00295</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1StubbornDict.html#a190b1b2bd8a914bafaab137c5b1276ea">__radd__</a>(self, arg): -<a name="l00296"></a>00296 selfcopy = copy.copy(self) -<a name="l00297"></a>00297 selfcopy.update(<a class="code" href="namespacecmd2.html#aae88fcdb31e45b322ecdaf7df9922823">stubbornDict</a>(arg)) -<a name="l00298"></a>00298 <span class="keywordflow">return</span> selfcopy -<a name="l00299"></a>00299 -<a name="l00300"></a>00300 @classmethod -<a name="l00301"></a><a class="code" href="classcmd2_1_1StubbornDict.html#ad46f55b61faae98d241e30d52cd04eee">00301</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1StubbornDict.html#ad46f55b61faae98d241e30d52cd04eee">to_dict</a>(cls, arg): -<a name="l00302"></a>00302 <span class="stringliteral">'Generates dictionary from string or list of strings'</span> -<a name="l00303"></a>00303 <span class="keywordflow">if</span> hasattr(arg, <span class="stringliteral">'splitlines'</span>): -<a name="l00304"></a>00304 arg = arg.splitlines() -<a name="l00305"></a>00305 <span class="keywordflow">if</span> hasattr(arg, <span class="stringliteral">'__reversed__'</span>): -<a name="l00306"></a>00306 result = {} -<a name="l00307"></a>00307 <span class="keywordflow">for</span> a <span class="keywordflow">in</span> arg: -<a name="l00308"></a>00308 a = a.strip() -<a name="l00309"></a>00309 <span class="keywordflow">if</span> a: -<a name="l00310"></a>00310 key_val = a.split(<span class="keywordtype">None</span>, 1) -<a name="l00311"></a>00311 key = key_val[0] -<a name="l00312"></a>00312 <span class="keywordflow">if</span> len(key_val) > 1: -<a name="l00313"></a>00313 val = key_val[1] -<a name="l00314"></a>00314 <span class="keywordflow">else</span>: -<a name="l00315"></a>00315 val = <span class="stringliteral">''</span> -<a name="l00316"></a>00316 result[key] = val -<a name="l00317"></a>00317 <span class="keywordflow">else</span>: -<a name="l00318"></a>00318 result = arg -<a name="l00319"></a>00319 <span class="keywordflow">return</span> result -<a name="l00320"></a>00320 -<a name="l00321"></a><a class="code" href="namespacecmd2.html#aae88fcdb31e45b322ecdaf7df9922823">00321</a> <span class="keyword">def </span><a class="code" href="namespacecmd2.html#aae88fcdb31e45b322ecdaf7df9922823">stubbornDict</a>(*arg, **kwarg): -<a name="l00322"></a>00322 <span class="stringliteral">'''</span> -<a name="l00323"></a>00323 <span class="stringliteral"> >>> sorted(stubbornDict('cow a bovine\\nhorse an equine').items())</span> -<a name="l00324"></a>00324 <span class="stringliteral"> [('cow', 'a bovine'), ('horse', 'an equine')]</span> -<a name="l00325"></a>00325 <span class="stringliteral"> >>> sorted(stubbornDict(['badger', 'porcupine a poky creature']).items())</span> -<a name="l00326"></a>00326 <span class="stringliteral"> [('badger', ''), ('porcupine', 'a poky creature')]</span> -<a name="l00327"></a>00327 <span class="stringliteral"> >>> sorted(stubbornDict(turtle='has shell', frog='jumpy').items())</span> -<a name="l00328"></a>00328 <span class="stringliteral"> [('frog', 'jumpy'), ('turtle', 'has shell')]</span> -<a name="l00329"></a>00329 <span class="stringliteral"> '''</span> -<a name="l00330"></a>00330 result = {} -<a name="l00331"></a>00331 <span class="keywordflow">for</span> a <span class="keywordflow">in</span> arg: -<a name="l00332"></a>00332 result.update(StubbornDict.to_dict(a)) -<a name="l00333"></a>00333 result.update(kwarg) -<a name="l00334"></a>00334 <span class="keywordflow">return</span> <a class="code" href="classcmd2_1_1StubbornDict.html">StubbornDict</a>(result) -<a name="l00335"></a>00335 -<a name="l00336"></a><a class="code" href="namespacecmd2.html#aa5aa0c16a66d0ec0510ac38f3cc00ad3">00336</a> <span class="keyword">def </span><a class="code" href="namespacecmd2.html#aa5aa0c16a66d0ec0510ac38f3cc00ad3">replace_with_file_contents</a>(fname): -<a name="l00337"></a>00337 <span class="keywordflow">if</span> fname: -<a name="l00338"></a>00338 <span class="keywordflow">try</span>: -<a name="l00339"></a>00339 result = open(os.path.expanduser(fname[0])).read() -<a name="l00340"></a>00340 <span class="keywordflow">except</span> IOError: -<a name="l00341"></a>00341 result = <span class="stringliteral">'< %s'</span> % fname[0] <span class="comment"># wasn't a file after all</span> -<a name="l00342"></a>00342 <span class="keywordflow">else</span>: -<a name="l00343"></a>00343 result = <a class="code" href="namespacecmd2.html#a9f1495f6c72f7d8c0dbb0f9f22029763">get_paste_buffer</a>() -<a name="l00344"></a>00344 <span class="keywordflow">return</span> result -<a name="l00345"></a>00345 -<a name="l00346"></a><a class="code" href="classcmd2_1_1EmbeddedConsoleExit.html">00346</a> <span class="keyword">class </span><a class="code" href="classcmd2_1_1EmbeddedConsoleExit.html">EmbeddedConsoleExit</a>(SystemExit): -<a name="l00347"></a>00347 <span class="keywordflow">pass</span> -<a name="l00348"></a>00348 -<a name="l00349"></a><a class="code" href="classcmd2_1_1EmptyStatement.html">00349</a> <span class="keyword">class </span>EmptyStatement(Exception): -<a name="l00350"></a>00350 <span class="keywordflow">pass</span> -<a name="l00351"></a>00351 -<a name="l00352"></a><a class="code" href="namespacecmd2.html#ad4ac87ba068f9549b5a7735054df8065">00352</a> <span class="keyword">def </span><a class="code" href="namespacecmd2.html#ad4ac87ba068f9549b5a7735054df8065">ljust</a>(x, width, fillchar=' '): -<a name="l00353"></a>00353 <span class="stringliteral">'analogous to str.ljust, but works for lists'</span> -<a name="l00354"></a>00354 <span class="keywordflow">if</span> hasattr(x, <span class="stringliteral">'ljust'</span>): -<a name="l00355"></a>00355 <span class="keywordflow">return</span> x.ljust(width, fillchar) -<a name="l00356"></a>00356 <span class="keywordflow">else</span>: -<a name="l00357"></a>00357 <span class="keywordflow">if</span> len(x) < width: -<a name="l00358"></a>00358 x = (x + [fillchar] * width)[:width] -<a name="l00359"></a>00359 <span class="keywordflow">return</span> x -<a name="l00360"></a>00360 -<a name="l00361"></a><a class="code" href="classcmd2_1_1Cmd.html">00361</a> <span class="keyword">class </span><a class="code" href="classcmd2_1_1Cmd.html">Cmd</a>(cmd.Cmd): -<a name="l00362"></a><a class="code" href="classcmd2_1_1Cmd.html#a417779ccb5de864826f97a959bd196d3">00362</a> echo = <span class="keyword">False</span> -<a name="l00363"></a><a class="code" href="classcmd2_1_1Cmd.html#a10de661ca23b94cd93972c260523c8a0">00363</a> case_insensitive = <span class="keyword">True</span> <span class="comment"># Commands recognized regardless of case</span> -<a name="l00364"></a><a class="code" href="classcmd2_1_1Cmd.html#a186ca22e76dc63ad9d8a95cfaeb4f7fd">00364</a> continuation_prompt = <span class="stringliteral">'> '</span> -<a name="l00365"></a><a class="code" href="classcmd2_1_1Cmd.html#a2d83899c5edb8c1296cb90b0fb282de7">00365</a> timing = <span class="keyword">False</span> <span class="comment"># Prints elapsed time for each command</span> -<a name="l00366"></a>00366 <span class="comment"># make sure your terminators are not in legalChars!</span> -<a name="l00367"></a><a class="code" href="classcmd2_1_1Cmd.html#a866c4b8895784a477d36bebfecfa397e">00367</a> legalChars = <span class="stringliteral">u'!#$%.:?@_'</span> + pyparsing.alphanums + pyparsing.alphas8bit -<a name="l00368"></a><a class="code" href="classcmd2_1_1Cmd.html#ad8ccfbcd2a4eb800f040fcdbd26089df">00368</a> shortcuts = {<span class="stringliteral">'?'</span>: <span class="stringliteral">'help'</span>, <span class="stringliteral">'!'</span>: <span class="stringliteral">'shell'</span>, <span class="stringliteral">'@'</span>: <span class="stringliteral">'load'</span>, <span class="stringliteral">'@@'</span>: <span class="stringliteral">'_relative_load'</span>} -<a name="l00369"></a><a class="code" href="classcmd2_1_1Cmd.html#a35586c262b272917f6ecae8e76fca6b9">00369</a> excludeFromHistory = <span class="stringliteral">'''run r list l history hi ed edit li eof'''</span>.split() -<a name="l00370"></a><a class="code" href="classcmd2_1_1Cmd.html#a7da859e33eae87d5069b96d366cf04b4">00370</a> default_to_shell = <span class="keyword">False</span> -<a name="l00371"></a><a class="code" href="classcmd2_1_1Cmd.html#a4e4d47a554f0725c2562c2bc19af1a3e">00371</a> noSpecialParse = <span class="stringliteral">'set ed edit exit'</span>.split() -<a name="l00372"></a><a class="code" href="classcmd2_1_1Cmd.html#ab14061f1d84f49fb8fefcce285e7aec7">00372</a> defaultExtension = <span class="stringliteral">'txt'</span> <span class="comment"># For ``save``, ``load``, etc.</span> -<a name="l00373"></a><a class="code" href="classcmd2_1_1Cmd.html#a3af82e64cdabf19b462cd0ddf686823d">00373</a> default_file_name = <span class="stringliteral">'command.txt'</span> <span class="comment"># For ``save``, ``load``, etc.</span> -<a name="l00374"></a><a class="code" href="classcmd2_1_1Cmd.html#a810ba12198cbbc4e38643c83278956f6">00374</a> abbrev = <span class="keyword">True</span> <span class="comment"># Abbreviated commands recognized</span> -<a name="l00375"></a><a class="code" href="classcmd2_1_1Cmd.html#a549399bed9574c87901100530343ac68">00375</a> current_script_dir = <span class="keywordtype">None</span> -<a name="l00376"></a><a class="code" href="classcmd2_1_1Cmd.html#a01befaea1ef9fa2c8b26521f7b2dfb9c">00376</a> reserved_words = [] -<a name="l00377"></a><a class="code" href="classcmd2_1_1Cmd.html#ad571e5687af698c33a547062762a26bc">00377</a> feedback_to_output = <span class="keyword">False</span> <span class="comment"># Do include nonessentials in >, | output</span> -<a name="l00378"></a><a class="code" href="classcmd2_1_1Cmd.html#a50495cbf3a3ea3467c86233ebbea4572">00378</a> quiet = <span class="keyword">False</span> <span class="comment"># Do not suppress nonessential output</span> -<a name="l00379"></a><a class="code" href="classcmd2_1_1Cmd.html#a7b07b64964162c07f50675b2b40160b2">00379</a> debug = <span class="keyword">False</span> -<a name="l00380"></a><a class="code" href="classcmd2_1_1Cmd.html#a55e7978c792429a0a2e3321abdbd23fe">00380</a> locals_in_py = <span class="keyword">True</span> -<a name="l00381"></a><a class="code" href="classcmd2_1_1Cmd.html#ad480d9102b3a5e4c8c5541d2c205a1ad">00381</a> kept_state = <span class="keywordtype">None</span> -<a name="l00382"></a><a class="code" href="classcmd2_1_1Cmd.html#a64b810574dab9ec12100c5344dc66735">00382</a> redirector = <span class="stringliteral">'>'</span> <span class="comment"># for sending output to file</span> -<a name="l00383"></a><a class="code" href="classcmd2_1_1Cmd.html#a6cec2f634666d15d032d4c113e654c3c">00383</a> settable = <a class="code" href="namespacecmd2.html#aae88fcdb31e45b322ecdaf7df9922823">stubbornDict</a>(<span class="stringliteral">'''</span> -<a name="l00384"></a>00384 <span class="stringliteral"> prompt</span> -<a name="l00385"></a>00385 <span class="stringliteral"> colors Colorized output (*nix only)</span> -<a name="l00386"></a>00386 <span class="stringliteral"> continuation_prompt On 2nd+ line of input</span> -<a name="l00387"></a>00387 <span class="stringliteral"> debug Show full error stack on error</span> -<a name="l00388"></a>00388 <span class="stringliteral"> default_file_name for ``save``, ``load``, etc.</span> -<a name="l00389"></a>00389 <span class="stringliteral"> editor Program used by ``edit`` </span> -<a name="l00390"></a>00390 <span class="stringliteral"> case_insensitive upper- and lower-case both OK</span> -<a name="l00391"></a>00391 <span class="stringliteral"> feedback_to_output include nonessentials in `|`, `>` results </span> -<a name="l00392"></a>00392 <span class="stringliteral"> quiet Don't print nonessential feedback</span> -<a name="l00393"></a>00393 <span class="stringliteral"> echo Echo command issued into output</span> -<a name="l00394"></a>00394 <span class="stringliteral"> timing Report execution times</span> -<a name="l00395"></a>00395 <span class="stringliteral"> abbrev Accept abbreviated commands</span> -<a name="l00396"></a>00396 <span class="stringliteral"> '''</span>) -<a name="l00397"></a>00397 -<a name="l00398"></a><a class="code" href="classcmd2_1_1Cmd.html#ad8b5d33873f9b515e33f83a616d0828f">00398</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#ad8b5d33873f9b515e33f83a616d0828f">poutput</a>(self, msg): -<a name="l00399"></a>00399 <span class="stringliteral">'''Convenient shortcut for self.stdout.write(); adds newline if necessary.'''</span> -<a name="l00400"></a>00400 <span class="keywordflow">if</span> msg: -<a name="l00401"></a>00401 self.stdout.write(msg) -<a name="l00402"></a>00402 <span class="keywordflow">if</span> msg[-1] != <span class="stringliteral">'\n'</span>: -<a name="l00403"></a>00403 self.stdout.write(<span class="stringliteral">'\n'</span>) -<a name="l00404"></a><a class="code" href="classcmd2_1_1Cmd.html#a118c16455f28dbd3918b565bca086db4">00404</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a118c16455f28dbd3918b565bca086db4">perror</a>(self, errmsg, statement=None): -<a name="l00405"></a>00405 <span class="keywordflow">if</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a7b07b64964162c07f50675b2b40160b2">debug</a>: -<a name="l00406"></a>00406 traceback.print_exc() -<a name="l00407"></a>00407 <span class="keywordflow">print</span> (str(errmsg)) -<a name="l00408"></a><a class="code" href="classcmd2_1_1Cmd.html#a122b67681a0db23863f5ddaa7a687975">00408</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a122b67681a0db23863f5ddaa7a687975">pfeedback</a>(self, msg): -<a name="l00409"></a>00409 <span class="stringliteral">"""For printing nonessential feedback. Can be silenced with `quiet`.</span> -<a name="l00410"></a>00410 <span class="stringliteral"> Inclusion in redirected output is controlled by `feedback_to_output`."""</span> -<a name="l00411"></a>00411 <span class="keywordflow">if</span> <span class="keywordflow">not</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a50495cbf3a3ea3467c86233ebbea4572">quiet</a>: -<a name="l00412"></a>00412 <span class="keywordflow">if</span> self.<a class="code" href="classcmd2_1_1Cmd.html#ad571e5687af698c33a547062762a26bc">feedback_to_output</a>: -<a name="l00413"></a>00413 self.<a class="code" href="classcmd2_1_1Cmd.html#ad8b5d33873f9b515e33f83a616d0828f">poutput</a>(msg) -<a name="l00414"></a>00414 <span class="keywordflow">else</span>: -<a name="l00415"></a>00415 <span class="keywordflow">print</span> (msg) -<a name="l00416"></a><a class="code" href="classcmd2_1_1Cmd.html#a7a8e8257d7d35c7813355cdefb62b85b">00416</a> _STOP_AND_EXIT = <span class="keyword">True</span> <span class="comment"># distinguish end of script file from actual exit</span> -<a name="l00417"></a><a class="code" href="classcmd2_1_1Cmd.html#abe14bda0dc50326876c6a761cefba702">00417</a> _STOP_SCRIPT_NO_EXIT = -999 -<a name="l00418"></a><a class="code" href="classcmd2_1_1Cmd.html#a25fe904aca52573c6f10e798dd561588">00418</a> editor = os.environ.get(<span class="stringliteral">'EDITOR'</span>) -<a name="l00419"></a>00419 <span class="keywordflow">if</span> <span class="keywordflow">not</span> editor: -<a name="l00420"></a>00420 <span class="keywordflow">if</span> sys.platform[:3] == <span class="stringliteral">'win'</span>: -<a name="l00421"></a><a class="code" href="classcmd2_1_1Cmd.html#a3a1abb5d4a8d42dcce7d61b04bdf9e97">00421</a> editor = <span class="stringliteral">'notepad'</span> -<a name="l00422"></a>00422 <span class="keywordflow">else</span>: -<a name="l00423"></a>00423 <span class="keywordflow">for</span> editor <span class="keywordflow">in</span> [<span class="stringliteral">'gedit'</span>, <span class="stringliteral">'kate'</span>, <span class="stringliteral">'vim'</span>, <span class="stringliteral">'emacs'</span>, <span class="stringliteral">'nano'</span>, <span class="stringliteral">'pico'</span>]: -<a name="l00424"></a>00424 <span class="keywordflow">if</span> subprocess.Popen([<span class="stringliteral">'which'</span>, editor], stdout=subprocess.PIPE).communicate()[0]: -<a name="l00425"></a>00425 <span class="keywordflow">break</span> -<a name="l00426"></a>00426 -<a name="l00427"></a><a class="code" href="classcmd2_1_1Cmd.html#a91dd3e77a8d1f247dcfdddbfc0288b3b">00427</a> colorcodes = {<span class="stringliteral">'bold'</span>:{<span class="keyword">True</span>:<span class="stringliteral">'\x1b[1m'</span>,<span class="keyword">False</span>:<span class="stringliteral">'\x1b[22m'</span>}, -<a name="l00428"></a>00428 <span class="stringliteral">'cyan'</span>:{<span class="keyword">True</span>:<span class="stringliteral">'\x1b[36m'</span>,<span class="keyword">False</span>:<span class="stringliteral">'\x1b[39m'</span>}, -<a name="l00429"></a>00429 <span class="stringliteral">'blue'</span>:{<span class="keyword">True</span>:<span class="stringliteral">'\x1b[34m'</span>,<span class="keyword">False</span>:<span class="stringliteral">'\x1b[39m'</span>}, -<a name="l00430"></a>00430 <span class="stringliteral">'red'</span>:{<span class="keyword">True</span>:<span class="stringliteral">'\x1b[31m'</span>,<span class="keyword">False</span>:<span class="stringliteral">'\x1b[39m'</span>}, -<a name="l00431"></a>00431 <span class="stringliteral">'magenta'</span>:{<span class="keyword">True</span>:<span class="stringliteral">'\x1b[35m'</span>,<span class="keyword">False</span>:<span class="stringliteral">'\x1b[39m'</span>}, -<a name="l00432"></a>00432 <span class="stringliteral">'green'</span>:{<span class="keyword">True</span>:<span class="stringliteral">'\x1b[32m'</span>,<span class="keyword">False</span>:<span class="stringliteral">'\x1b[39m'</span>}, -<a name="l00433"></a>00433 <span class="stringliteral">'underline'</span>:{<span class="keyword">True</span>:<span class="stringliteral">'\x1b[4m'</span>,<span class="keyword">False</span>:<span class="stringliteral">'\x1b[24m'</span>}} -<a name="l00434"></a><a class="code" href="classcmd2_1_1Cmd.html#a2ec43e734ae5b2a581216dc7914b231a">00434</a> colors = (platform.system() != <span class="stringliteral">'Windows'</span>) -<a name="l00435"></a><a class="code" href="classcmd2_1_1Cmd.html#a9c7f8fd1e7909d18a0f1d8cebf6c1966">00435</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a9c7f8fd1e7909d18a0f1d8cebf6c1966">colorize</a>(self, val, color): -<a name="l00436"></a>00436 <span class="stringliteral">'''Given a string (``val``), returns that string wrapped in UNIX-style </span> -<a name="l00437"></a>00437 <span class="stringliteral"> special characters that turn on (and then off) text color and style.</span> -<a name="l00438"></a>00438 <span class="stringliteral"> If the ``colors`` environment paramter is ``False``, or the application</span> -<a name="l00439"></a>00439 <span class="stringliteral"> is running on Windows, will return ``val`` unchanged.</span> -<a name="l00440"></a><a class="code" href="classcmd2_1_1Cmd.html#a2a71ccfd9f189e17db765b603f2c9a78">00440</a> <span class="stringliteral"> ``color`` should be one of the supported strings (or styles):</span> -<a name="l00441"></a>00441 <span class="stringliteral"> red/blue/green/cyan/magenta, bold, underline'''</span> -<a name="l00442"></a>00442 <span class="keywordflow">if</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a2ec43e734ae5b2a581216dc7914b231a">colors</a> <span class="keywordflow">and</span> (self.<a class="code" href="classcmd2_1_1Cmd.html#a2a71ccfd9f189e17db765b603f2c9a78">stdout</a> == self.<a class="code" href="classcmd2_1_1Cmd.html#af7cb41e066bc55be38b97ea82269e5e8">initial_stdout</a>): -<a name="l00443"></a>00443 <span class="keywordflow">return</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a91dd3e77a8d1f247dcfdddbfc0288b3b">colorcodes</a>[color][<span class="keyword">True</span>] + val + self.<a class="code" href="classcmd2_1_1Cmd.html#a91dd3e77a8d1f247dcfdddbfc0288b3b">colorcodes</a>[color][<span class="keyword">False</span>] -<a name="l00444"></a>00444 <span class="keywordflow">return</span> val -<a name="l00445"></a>00445 -<a name="l00446"></a><a class="code" href="classcmd2_1_1Cmd.html#a79949284f70e1fdb7e33117cc4195f80">00446</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a79949284f70e1fdb7e33117cc4195f80">do_cmdenvironment</a>(self, args): -<a name="l00447"></a>00447 <span class="stringliteral">'''Summary report of interactive parameters.'''</span> -<a name="l00448"></a>00448 self.stdout.write(<span class="stringliteral">"""</span> -<a name="l00449"></a>00449 <span class="stringliteral"> Commands are %(casesensitive)scase-sensitive.</span> -<a name="l00450"></a>00450 <span class="stringliteral"> Commands may be terminated with: %(terminators)s</span> -<a name="l00451"></a>00451 <span class="stringliteral"> Settable parameters: %(settable)s\n"""</span> % \ -<a name="l00452"></a>00452 { <span class="stringliteral">'casesensitive'</span>: (self.<a class="code" href="classcmd2_1_1Cmd.html#a10de661ca23b94cd93972c260523c8a0">case_insensitive</a> <span class="keywordflow">and</span> <span class="stringliteral">'not '</span>) <span class="keywordflow">or</span> <span class="stringliteral">''</span>, -<a name="l00453"></a>00453 <span class="stringliteral">'terminators'</span>: str(self.<a class="code" href="classcmd2_1_1Cmd.html#a6bd95a7f702f668696ab6e88555da23d">terminators</a>), -<a name="l00454"></a>00454 <span class="stringliteral">'settable'</span>: <span class="stringliteral">' '</span>.join(self.<a class="code" href="classcmd2_1_1Cmd.html#a6cec2f634666d15d032d4c113e654c3c">settable</a>) -<a name="l00455"></a>00455 }) -<a name="l00456"></a>00456 -<a name="l00457"></a><a class="code" href="classcmd2_1_1Cmd.html#af112b7b704dcd8d34c389fcaa150e3d0">00457</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#af112b7b704dcd8d34c389fcaa150e3d0">do_help</a>(self, arg): -<a name="l00458"></a>00458 <span class="keywordflow">if</span> arg: -<a name="l00459"></a>00459 funcname = self.<a class="code" href="classcmd2_1_1Cmd.html#a7fbb17b136654f705387ede1fb685a3e">func_named</a>(arg) -<a name="l00460"></a>00460 <span class="keywordflow">if</span> funcname: -<a name="l00461"></a>00461 fn = getattr(self, funcname) -<a name="l00462"></a>00462 <span class="keywordflow">try</span>: -<a name="l00463"></a>00463 fn.optionParser.print_help(file=self.<a class="code" href="classcmd2_1_1Cmd.html#a2a71ccfd9f189e17db765b603f2c9a78">stdout</a>) -<a name="l00464"></a>00464 <span class="keywordflow">except</span> AttributeError: -<a name="l00465"></a>00465 cmd.Cmd.do_help(self, funcname[3:]) -<a name="l00466"></a>00466 <span class="keywordflow">else</span>: -<a name="l00467"></a>00467 cmd.Cmd.do_help(self, arg) -<a name="l00468"></a>00468 -<a name="l00469"></a><a class="code" href="classcmd2_1_1Cmd.html#a728675cc7b48ac258c5026929df0dfe4">00469</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#afef8fbba2cb5adea45e3a22a506c8665">__init__</a>(self, *args, **kwargs): -<a name="l00470"></a>00470 cmd.Cmd.__init__(self, *args, **kwargs) -<a name="l00471"></a>00471 self.<a class="code" href="classcmd2_1_1Cmd.html#af7cb41e066bc55be38b97ea82269e5e8">initial_stdout</a> = sys.stdout -<a name="l00472"></a>00472 self.<a class="code" href="classcmd2_1_1Cmd.html#a666a090bc7298aae6ca55840e9418f96">history</a> = <a class="code" href="classcmd2_1_1History.html">History</a>() -<a name="l00473"></a>00473 self.<a class="code" href="classcmd2_1_1Cmd.html#a30058e5e628d60dedf7c500e270b3e5d">pystate</a> = {} -<a name="l00474"></a>00474 self.<a class="code" href="classcmd2_1_1Cmd.html#ad8ccfbcd2a4eb800f040fcdbd26089df">shortcuts</a> = sorted(self.shortcuts.items(), reverse=<span class="keyword">True</span>) -<a name="l00475"></a>00475 self.<a class="code" href="classcmd2_1_1Cmd.html#a8ccd464e255a798b587637f9b812dbcd">keywords</a> = self.<a class="code" href="classcmd2_1_1Cmd.html#a01befaea1ef9fa2c8b26521f7b2dfb9c">reserved_words</a> + [fname[3:] <span class="keywordflow">for</span> fname <span class="keywordflow">in</span> dir(self) -<a name="l00476"></a>00476 <span class="keywordflow">if</span> fname.startswith(<span class="stringliteral">'do_'</span>)] -<a name="l00477"></a>00477 self.<a class="code" href="classcmd2_1_1Cmd.html#a819bd7bd930dab0e39e59af3397c2eac">_init_parser</a>() -<a name="l00478"></a>00478 -<a name="l00479"></a><a class="code" href="classcmd2_1_1Cmd.html#aea47330c6e0f4e5f14e2cdff41679597">00479</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#aea47330c6e0f4e5f14e2cdff41679597">do_shortcuts</a>(self, args): -<a name="l00480"></a>00480 <span class="stringliteral">"""Lists single-key shortcuts available."""</span> -<a name="l00481"></a>00481 result = <span class="stringliteral">"\n"</span>.join(<span class="stringliteral">'%s: %s'</span> % (sc[0], sc[1]) <span class="keywordflow">for</span> sc <span class="keywordflow">in</span> sorted(self.<a class="code" href="classcmd2_1_1Cmd.html#ad8ccfbcd2a4eb800f040fcdbd26089df">shortcuts</a>)) -<a name="l00482"></a>00482 self.stdout.write(<span class="stringliteral">"Single-key shortcuts for other commands:\n%s\n"</span> % (result)) -<a name="l00483"></a>00483 -<a name="l00484"></a><a class="code" href="classcmd2_1_1Cmd.html#a794ce4cfd06ddd8df24df33d9f116a65">00484</a> prefixParser = pyparsing.Empty() -<a name="l00485"></a><a class="code" href="classcmd2_1_1Cmd.html#ae6adde6cd440331e4add0bdf8c2c61d0">00485</a> commentGrammars = pyparsing.Or([pyparsing.pythonStyleComment, pyparsing.cStyleComment]) -<a name="l00486"></a>00486 commentGrammars.addParseAction(<span class="keyword">lambda</span> x: <span class="stringliteral">''</span>) -<a name="l00487"></a><a class="code" href="classcmd2_1_1Cmd.html#a0333f71a3291354d3238a4853ec5e762">00487</a> commentInProgress = pyparsing.Literal(<span class="stringliteral">'/*'</span>) + pyparsing.SkipTo( -<a name="l00488"></a>00488 pyparsing.stringEnd ^ <span class="stringliteral">'*/'</span>) -<a name="l00489"></a><a class="code" href="classcmd2_1_1Cmd.html#a6bd95a7f702f668696ab6e88555da23d">00489</a> terminators = [<span class="stringliteral">';'</span>] -<a name="l00490"></a><a class="code" href="classcmd2_1_1Cmd.html#a395ee1f733c5faeb66e74b308cbc5e63">00490</a> blankLinesAllowed = <span class="keyword">False</span> -<a name="l00491"></a><a class="code" href="classcmd2_1_1Cmd.html#a05fbd7501cbc1f911e9a4925e5f0804a">00491</a> multilineCommands = [] -<a name="l00492"></a>00492 -<a name="l00493"></a><a class="code" href="classcmd2_1_1Cmd.html#a819bd7bd930dab0e39e59af3397c2eac">00493</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a819bd7bd930dab0e39e59af3397c2eac">_init_parser</a>(self): -<a name="l00494"></a>00494 <span class="stringliteral">r'''</span> -<a name="l00495"></a>00495 <span class="stringliteral"> >>> c = Cmd()</span> -<a name="l00496"></a>00496 <span class="stringliteral"> >>> c.multilineCommands = ['multiline']</span> -<a name="l00497"></a>00497 <span class="stringliteral"> >>> c.case_insensitive = True</span> -<a name="l00498"></a>00498 <span class="stringliteral"> >>> c._init_parser()</span> -<a name="l00499"></a>00499 <span class="stringliteral"> >>> print (c.parser.parseString('').dump())</span> -<a name="l00500"></a>00500 <span class="stringliteral"> []</span> -<a name="l00501"></a>00501 <span class="stringliteral"> >>> print (c.parser.parseString('').dump())</span> -<a name="l00502"></a>00502 <span class="stringliteral"> [] </span> -<a name="l00503"></a>00503 <span class="stringliteral"> >>> print (c.parser.parseString('/* empty command */').dump())</span> -<a name="l00504"></a>00504 <span class="stringliteral"> [] </span> -<a name="l00505"></a>00505 <span class="stringliteral"> >>> print (c.parser.parseString('plainword').dump())</span> -<a name="l00506"></a>00506 <span class="stringliteral"> ['plainword', '']</span> -<a name="l00507"></a>00507 <span class="stringliteral"> - command: plainword</span> -<a name="l00508"></a>00508 <span class="stringliteral"> - statement: ['plainword', '']</span> -<a name="l00509"></a>00509 <span class="stringliteral"> - command: plainword </span> -<a name="l00510"></a>00510 <span class="stringliteral"> >>> print (c.parser.parseString('termbare;').dump())</span> -<a name="l00511"></a>00511 <span class="stringliteral"> ['termbare', '', ';', '']</span> -<a name="l00512"></a>00512 <span class="stringliteral"> - command: termbare</span> -<a name="l00513"></a>00513 <span class="stringliteral"> - statement: ['termbare', '', ';']</span> -<a name="l00514"></a>00514 <span class="stringliteral"> - command: termbare</span> -<a name="l00515"></a>00515 <span class="stringliteral"> - terminator: ;</span> -<a name="l00516"></a>00516 <span class="stringliteral"> - terminator: ; </span> -<a name="l00517"></a>00517 <span class="stringliteral"> >>> print (c.parser.parseString('termbare; suffx').dump())</span> -<a name="l00518"></a>00518 <span class="stringliteral"> ['termbare', '', ';', 'suffx']</span> -<a name="l00519"></a>00519 <span class="stringliteral"> - command: termbare</span> -<a name="l00520"></a>00520 <span class="stringliteral"> - statement: ['termbare', '', ';']</span> -<a name="l00521"></a>00521 <span class="stringliteral"> - command: termbare</span> -<a name="l00522"></a>00522 <span class="stringliteral"> - terminator: ;</span> -<a name="l00523"></a>00523 <span class="stringliteral"> - suffix: suffx</span> -<a name="l00524"></a>00524 <span class="stringliteral"> - terminator: ; </span> -<a name="l00525"></a>00525 <span class="stringliteral"> >>> print (c.parser.parseString('barecommand').dump())</span> -<a name="l00526"></a>00526 <span class="stringliteral"> ['barecommand', '']</span> -<a name="l00527"></a>00527 <span class="stringliteral"> - command: barecommand</span> -<a name="l00528"></a>00528 <span class="stringliteral"> - statement: ['barecommand', '']</span> -<a name="l00529"></a>00529 <span class="stringliteral"> - command: barecommand</span> -<a name="l00530"></a>00530 <span class="stringliteral"> >>> print (c.parser.parseString('COMmand with args').dump())</span> -<a name="l00531"></a>00531 <span class="stringliteral"> ['command', 'with args']</span> -<a name="l00532"></a>00532 <span class="stringliteral"> - args: with args</span> -<a name="l00533"></a>00533 <span class="stringliteral"> - command: command</span> -<a name="l00534"></a>00534 <span class="stringliteral"> - statement: ['command', 'with args']</span> -<a name="l00535"></a>00535 <span class="stringliteral"> - args: with args</span> -<a name="l00536"></a>00536 <span class="stringliteral"> - command: command</span> -<a name="l00537"></a>00537 <span class="stringliteral"> >>> print (c.parser.parseString('command with args and terminator; and suffix').dump())</span> -<a name="l00538"></a>00538 <span class="stringliteral"> ['command', 'with args and terminator', ';', 'and suffix']</span> -<a name="l00539"></a>00539 <span class="stringliteral"> - args: with args and terminator</span> -<a name="l00540"></a>00540 <span class="stringliteral"> - command: command</span> -<a name="l00541"></a>00541 <span class="stringliteral"> - statement: ['command', 'with args and terminator', ';']</span> -<a name="l00542"></a>00542 <span class="stringliteral"> - args: with args and terminator</span> -<a name="l00543"></a>00543 <span class="stringliteral"> - command: command</span> -<a name="l00544"></a>00544 <span class="stringliteral"> - terminator: ;</span> -<a name="l00545"></a>00545 <span class="stringliteral"> - suffix: and suffix</span> -<a name="l00546"></a>00546 <span class="stringliteral"> - terminator: ;</span> -<a name="l00547"></a>00547 <span class="stringliteral"> >>> print (c.parser.parseString('simple | piped').dump())</span> -<a name="l00548"></a>00548 <span class="stringliteral"> ['simple', '', '|', ' piped']</span> -<a name="l00549"></a>00549 <span class="stringliteral"> - command: simple</span> -<a name="l00550"></a>00550 <span class="stringliteral"> - pipeTo: piped</span> -<a name="l00551"></a>00551 <span class="stringliteral"> - statement: ['simple', '']</span> -<a name="l00552"></a>00552 <span class="stringliteral"> - command: simple</span> -<a name="l00553"></a>00553 <span class="stringliteral"> >>> print (c.parser.parseString('double-pipe || is not a pipe').dump())</span> -<a name="l00554"></a>00554 <span class="stringliteral"> ['double', '-pipe || is not a pipe']</span> -<a name="l00555"></a>00555 <span class="stringliteral"> - args: -pipe || is not a pipe</span> -<a name="l00556"></a>00556 <span class="stringliteral"> - command: double</span> -<a name="l00557"></a>00557 <span class="stringliteral"> - statement: ['double', '-pipe || is not a pipe']</span> -<a name="l00558"></a>00558 <span class="stringliteral"> - args: -pipe || is not a pipe</span> -<a name="l00559"></a>00559 <span class="stringliteral"> - command: double</span> -<a name="l00560"></a>00560 <span class="stringliteral"> >>> print (c.parser.parseString('command with args, terminator;sufx | piped').dump())</span> -<a name="l00561"></a>00561 <span class="stringliteral"> ['command', 'with args, terminator', ';', 'sufx', '|', ' piped']</span> -<a name="l00562"></a>00562 <span class="stringliteral"> - args: with args, terminator</span> -<a name="l00563"></a>00563 <span class="stringliteral"> - command: command</span> -<a name="l00564"></a>00564 <span class="stringliteral"> - pipeTo: piped</span> -<a name="l00565"></a>00565 <span class="stringliteral"> - statement: ['command', 'with args, terminator', ';']</span> -<a name="l00566"></a>00566 <span class="stringliteral"> - args: with args, terminator</span> -<a name="l00567"></a>00567 <span class="stringliteral"> - command: command</span> -<a name="l00568"></a>00568 <span class="stringliteral"> - terminator: ;</span> -<a name="l00569"></a>00569 <span class="stringliteral"> - suffix: sufx</span> -<a name="l00570"></a>00570 <span class="stringliteral"> - terminator: ;</span> -<a name="l00571"></a>00571 <span class="stringliteral"> >>> print (c.parser.parseString('output into > afile.txt').dump())</span> -<a name="l00572"></a>00572 <span class="stringliteral"> ['output', 'into', '>', 'afile.txt']</span> -<a name="l00573"></a>00573 <span class="stringliteral"> - args: into</span> -<a name="l00574"></a>00574 <span class="stringliteral"> - command: output</span> -<a name="l00575"></a>00575 <span class="stringliteral"> - output: ></span> -<a name="l00576"></a>00576 <span class="stringliteral"> - outputTo: afile.txt</span> -<a name="l00577"></a>00577 <span class="stringliteral"> - statement: ['output', 'into']</span> -<a name="l00578"></a>00578 <span class="stringliteral"> - args: into</span> -<a name="l00579"></a>00579 <span class="stringliteral"> - command: output </span> -<a name="l00580"></a>00580 <span class="stringliteral"> >>> print (c.parser.parseString('output into;sufx | pipethrume plz > afile.txt').dump())</span> -<a name="l00581"></a>00581 <span class="stringliteral"> ['output', 'into', ';', 'sufx', '|', ' pipethrume plz', '>', 'afile.txt']</span> -<a name="l00582"></a>00582 <span class="stringliteral"> - args: into</span> -<a name="l00583"></a>00583 <span class="stringliteral"> - command: output</span> -<a name="l00584"></a>00584 <span class="stringliteral"> - output: ></span> -<a name="l00585"></a>00585 <span class="stringliteral"> - outputTo: afile.txt</span> -<a name="l00586"></a>00586 <span class="stringliteral"> - pipeTo: pipethrume plz</span> -<a name="l00587"></a>00587 <span class="stringliteral"> - statement: ['output', 'into', ';']</span> -<a name="l00588"></a>00588 <span class="stringliteral"> - args: into</span> -<a name="l00589"></a>00589 <span class="stringliteral"> - command: output</span> -<a name="l00590"></a>00590 <span class="stringliteral"> - terminator: ;</span> -<a name="l00591"></a>00591 <span class="stringliteral"> - suffix: sufx</span> -<a name="l00592"></a>00592 <span class="stringliteral"> - terminator: ;</span> -<a name="l00593"></a>00593 <span class="stringliteral"> >>> print (c.parser.parseString('output to paste buffer >> ').dump())</span> -<a name="l00594"></a>00594 <span class="stringliteral"> ['output', 'to paste buffer', '>>', '']</span> -<a name="l00595"></a>00595 <span class="stringliteral"> - args: to paste buffer</span> -<a name="l00596"></a>00596 <span class="stringliteral"> - command: output</span> -<a name="l00597"></a>00597 <span class="stringliteral"> - output: >></span> -<a name="l00598"></a>00598 <span class="stringliteral"> - statement: ['output', 'to paste buffer']</span> -<a name="l00599"></a>00599 <span class="stringliteral"> - args: to paste buffer</span> -<a name="l00600"></a>00600 <span class="stringliteral"> - command: output</span> -<a name="l00601"></a>00601 <span class="stringliteral"> >>> print (c.parser.parseString('ignore the /* commented | > */ stuff;').dump())</span> -<a name="l00602"></a>00602 <span class="stringliteral"> ['ignore', 'the /* commented | > */ stuff', ';', '']</span> -<a name="l00603"></a>00603 <span class="stringliteral"> - args: the /* commented | > */ stuff</span> -<a name="l00604"></a>00604 <span class="stringliteral"> - command: ignore</span> -<a name="l00605"></a>00605 <span class="stringliteral"> - statement: ['ignore', 'the /* commented | > */ stuff', ';']</span> -<a name="l00606"></a>00606 <span class="stringliteral"> - args: the /* commented | > */ stuff</span> -<a name="l00607"></a>00607 <span class="stringliteral"> - command: ignore</span> -<a name="l00608"></a>00608 <span class="stringliteral"> - terminator: ;</span> -<a name="l00609"></a>00609 <span class="stringliteral"> - terminator: ;</span> -<a name="l00610"></a>00610 <span class="stringliteral"> >>> print (c.parser.parseString('has > inside;').dump())</span> -<a name="l00611"></a>00611 <span class="stringliteral"> ['has', '> inside', ';', '']</span> -<a name="l00612"></a>00612 <span class="stringliteral"> - args: > inside</span> -<a name="l00613"></a>00613 <span class="stringliteral"> - command: has</span> -<a name="l00614"></a>00614 <span class="stringliteral"> - statement: ['has', '> inside', ';']</span> -<a name="l00615"></a>00615 <span class="stringliteral"> - args: > inside</span> -<a name="l00616"></a>00616 <span class="stringliteral"> - command: has</span> -<a name="l00617"></a>00617 <span class="stringliteral"> - terminator: ;</span> -<a name="l00618"></a>00618 <span class="stringliteral"> - terminator: ; </span> -<a name="l00619"></a>00619 <span class="stringliteral"> >>> print (c.parser.parseString('multiline has > inside an unfinished command').dump())</span> -<a name="l00620"></a>00620 <span class="stringliteral"> ['multiline', ' has > inside an unfinished command']</span> -<a name="l00621"></a>00621 <span class="stringliteral"> - multilineCommand: multiline </span> -<a name="l00622"></a>00622 <span class="stringliteral"> >>> print (c.parser.parseString('multiline has > inside;').dump())</span> -<a name="l00623"></a>00623 <span class="stringliteral"> ['multiline', 'has > inside', ';', '']</span> -<a name="l00624"></a>00624 <span class="stringliteral"> - args: has > inside</span> -<a name="l00625"></a>00625 <span class="stringliteral"> - multilineCommand: multiline</span> -<a name="l00626"></a>00626 <span class="stringliteral"> - statement: ['multiline', 'has > inside', ';']</span> -<a name="l00627"></a>00627 <span class="stringliteral"> - args: has > inside</span> -<a name="l00628"></a>00628 <span class="stringliteral"> - multilineCommand: multiline</span> -<a name="l00629"></a>00629 <span class="stringliteral"> - terminator: ;</span> -<a name="l00630"></a>00630 <span class="stringliteral"> - terminator: ; </span> -<a name="l00631"></a>00631 <span class="stringliteral"> >>> print (c.parser.parseString('multiline command /* with comment in progress;').dump())</span> -<a name="l00632"></a>00632 <span class="stringliteral"> ['multiline', ' command /* with comment in progress;']</span> -<a name="l00633"></a>00633 <span class="stringliteral"> - multilineCommand: multiline</span> -<a name="l00634"></a>00634 <span class="stringliteral"> >>> print (c.parser.parseString('multiline command /* with comment complete */ is done;').dump())</span> -<a name="l00635"></a>00635 <span class="stringliteral"> ['multiline', 'command /* with comment complete */ is done', ';', '']</span> -<a name="l00636"></a>00636 <span class="stringliteral"> - args: command /* with comment complete */ is done</span> -<a name="l00637"></a>00637 <span class="stringliteral"> - multilineCommand: multiline</span> -<a name="l00638"></a>00638 <span class="stringliteral"> - statement: ['multiline', 'command /* with comment complete */ is done', ';']</span> -<a name="l00639"></a>00639 <span class="stringliteral"> - args: command /* with comment complete */ is done</span> -<a name="l00640"></a>00640 <span class="stringliteral"> - multilineCommand: multiline</span> -<a name="l00641"></a>00641 <span class="stringliteral"> - terminator: ;</span> -<a name="l00642"></a>00642 <span class="stringliteral"> - terminator: ;</span> -<a name="l00643"></a>00643 <span class="stringliteral"> >>> print (c.parser.parseString('multiline command ends\n\n').dump())</span> -<a name="l00644"></a>00644 <span class="stringliteral"> ['multiline', 'command ends', '\n', '\n']</span> -<a name="l00645"></a>00645 <span class="stringliteral"> - args: command ends</span> -<a name="l00646"></a>00646 <span class="stringliteral"> - multilineCommand: multiline</span> -<a name="l00647"></a>00647 <span class="stringliteral"> - statement: ['multiline', 'command ends', '\n', '\n']</span> -<a name="l00648"></a>00648 <span class="stringliteral"> - args: command ends</span> -<a name="l00649"></a>00649 <span class="stringliteral"> - multilineCommand: multiline</span> -<a name="l00650"></a>00650 <span class="stringliteral"> - terminator: ['\n', '\n']</span> -<a name="l00651"></a>00651 <span class="stringliteral"> - terminator: ['\n', '\n']</span> -<a name="l00652"></a>00652 <span class="stringliteral"> >>> print (c.parser.parseString('multiline command "with term; ends" now\n\n').dump())</span> -<a name="l00653"></a>00653 <span class="stringliteral"> ['multiline', 'command "with term; ends" now', '\n', '\n']</span> -<a name="l00654"></a>00654 <span class="stringliteral"> - args: command "with term; ends" now</span> -<a name="l00655"></a>00655 <span class="stringliteral"> - multilineCommand: multiline</span> -<a name="l00656"></a>00656 <span class="stringliteral"> - statement: ['multiline', 'command "with term; ends" now', '\n', '\n']</span> -<a name="l00657"></a>00657 <span class="stringliteral"> - args: command "with term; ends" now</span> -<a name="l00658"></a>00658 <span class="stringliteral"> - multilineCommand: multiline</span> -<a name="l00659"></a>00659 <span class="stringliteral"> - terminator: ['\n', '\n']</span> -<a name="l00660"></a>00660 <span class="stringliteral"> - terminator: ['\n', '\n']</span> -<a name="l00661"></a>00661 <span class="stringliteral"> >>> print (c.parser.parseString('what if "quoted strings /* seem to " start comments?').dump())</span> -<a name="l00662"></a>00662 <span class="stringliteral"> ['what', 'if "quoted strings /* seem to " start comments?']</span> -<a name="l00663"></a>00663 <span class="stringliteral"> - args: if "quoted strings /* seem to " start comments?</span> -<a name="l00664"></a>00664 <span class="stringliteral"> - command: what</span> -<a name="l00665"></a>00665 <span class="stringliteral"> - statement: ['what', 'if "quoted strings /* seem to " start comments?']</span> -<a name="l00666"></a>00666 <span class="stringliteral"> - args: if "quoted strings /* seem to " start comments?</span> -<a name="l00667"></a><a class="code" href="classcmd2_1_1Cmd.html#a58e84cc1e072fda53b98ba9ed4376540">00667</a> <span class="stringliteral"> - command: what</span> -<a name="l00668"></a>00668 <span class="stringliteral"> '''</span> -<a name="l00669"></a>00669 <span class="comment">#outputParser = (pyparsing.Literal('>>') | (pyparsing.WordStart() + '>') | pyparsing.Regex('[^=]>'))('output')</span> -<a name="l00670"></a>00670 outputParser = (pyparsing.Literal(self.<a class="code" href="classcmd2_1_1Cmd.html#a64b810574dab9ec12100c5344dc66735">redirector</a> *2) | \ -<a name="l00671"></a>00671 (pyparsing.WordStart() + self.<a class="code" href="classcmd2_1_1Cmd.html#a64b810574dab9ec12100c5344dc66735">redirector</a>) | \ -<a name="l00672"></a>00672 pyparsing.Regex(<span class="stringliteral">'[^=]'</span> + self.<a class="code" href="classcmd2_1_1Cmd.html#a64b810574dab9ec12100c5344dc66735">redirector</a>))(<span class="stringliteral">'output'</span>) -<a name="l00673"></a>00673 -<a name="l00674"></a>00674 terminatorParser = pyparsing.Or([(hasattr(t, <span class="stringliteral">'parseString'</span>) <span class="keywordflow">and</span> t) <span class="keywordflow">or</span> pyparsing.Literal(t) <span class="keywordflow">for</span> t <span class="keywordflow">in</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a6bd95a7f702f668696ab6e88555da23d">terminators</a>])(<span class="stringliteral">'terminator'</span>) -<a name="l00675"></a>00675 stringEnd = pyparsing.stringEnd ^ <span class="stringliteral">'\nEOF'</span> -<a name="l00676"></a>00676 self.<a class="code" href="classcmd2_1_1Cmd.html#a295de6e6060359049be89b5cdb6c09b1">multilineCommand</a> = pyparsing.Or([pyparsing.Keyword(c, caseless=self.<a class="code" href="classcmd2_1_1Cmd.html#a10de661ca23b94cd93972c260523c8a0">case_insensitive</a>) <span class="keywordflow">for</span> c <span class="keywordflow">in</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a05fbd7501cbc1f911e9a4925e5f0804a">multilineCommands</a>])(<span class="stringliteral">'multilineCommand'</span>) -<a name="l00677"></a>00677 oneLineCommand = (~self.<a class="code" href="classcmd2_1_1Cmd.html#a295de6e6060359049be89b5cdb6c09b1">multilineCommand</a> + pyparsing.Word(self.<a class="code" href="classcmd2_1_1Cmd.html#a866c4b8895784a477d36bebfecfa397e">legalChars</a>))(<span class="stringliteral">'command'</span>) -<a name="l00678"></a>00678 pipe = pyparsing.Keyword(<span class="stringliteral">'|'</span>, identChars=<span class="stringliteral">'|'</span>) -<a name="l00679"></a>00679 self.commentGrammars.ignore(pyparsing.quotedString).setParseAction(<span class="keyword">lambda</span> x: <span class="stringliteral">''</span>) -<a name="l00680"></a>00680 doNotParse = self.<a class="code" href="classcmd2_1_1Cmd.html#ae6adde6cd440331e4add0bdf8c2c61d0">commentGrammars</a> | self.<a class="code" href="classcmd2_1_1Cmd.html#a0333f71a3291354d3238a4853ec5e762">commentInProgress</a> | pyparsing.quotedString -<a name="l00681"></a>00681 afterElements = \ -<a name="l00682"></a>00682 pyparsing.Optional(pipe + pyparsing.SkipTo(outputParser ^ stringEnd, ignore=doNotParse)(<span class="stringliteral">'pipeTo'</span>)) + \ -<a name="l00683"></a>00683 pyparsing.Optional(outputParser + pyparsing.SkipTo(stringEnd, ignore=doNotParse).setParseAction(<span class="keyword">lambda</span> x: x[0].strip())(<span class="stringliteral">'outputTo'</span>)) -<a name="l00684"></a>00684 <span class="keywordflow">if</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a10de661ca23b94cd93972c260523c8a0">case_insensitive</a>: -<a name="l00685"></a>00685 self.multilineCommand.setParseAction(<span class="keyword">lambda</span> x: x[0].lower()) -<a name="l00686"></a>00686 oneLineCommand.setParseAction(<span class="keyword">lambda</span> x: x[0].lower()) -<a name="l00687"></a>00687 <span class="keywordflow">if</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a395ee1f733c5faeb66e74b308cbc5e63">blankLinesAllowed</a>: -<a name="l00688"></a>00688 self.<a class="code" href="classcmd2_1_1Cmd.html#ab45987033aafd0458078de49d4cf1fb5">blankLineTerminationParser</a> = pyparsing.NoMatch -<a name="l00689"></a>00689 <span class="keywordflow">else</span>: -<a name="l00690"></a>00690 self.<a class="code" href="classcmd2_1_1Cmd.html#a826ac7c82dd02c99be27940c179c9af3">blankLineTerminator</a> = (pyparsing.lineEnd + pyparsing.lineEnd)(<span class="stringliteral">'terminator'</span>) -<a name="l00691"></a>00691 self.blankLineTerminator.setResultsName(<span class="stringliteral">'terminator'</span>) -<a name="l00692"></a>00692 self.<a class="code" href="classcmd2_1_1Cmd.html#ab45987033aafd0458078de49d4cf1fb5">blankLineTerminationParser</a> = ((self.<a class="code" href="classcmd2_1_1Cmd.html#a295de6e6060359049be89b5cdb6c09b1">multilineCommand</a> ^ oneLineCommand) + pyparsing.SkipTo(self.<a class="code" href="classcmd2_1_1Cmd.html#a826ac7c82dd02c99be27940c179c9af3">blankLineTerminator</a>, ignore=doNotParse).setParseAction(<span class="keyword">lambda</span> x: x[0].strip())(<span class="stringliteral">'args'</span>) + self.<a class="code" href="classcmd2_1_1Cmd.html#a826ac7c82dd02c99be27940c179c9af3">blankLineTerminator</a>)(<span class="stringliteral">'statement'</span>) -<a name="l00693"></a>00693 self.<a class="code" href="classcmd2_1_1Cmd.html#a501ba802672b553037e265760319cfe1">multilineParser</a> = (((self.<a class="code" href="classcmd2_1_1Cmd.html#a295de6e6060359049be89b5cdb6c09b1">multilineCommand</a> ^ oneLineCommand) + pyparsing.SkipTo(terminatorParser, ignore=doNotParse).setParseAction(<span class="keyword">lambda</span> x: x[0].strip())(<span class="stringliteral">'args'</span>) + terminatorParser)(<span class="stringliteral">'statement'</span>) + -<a name="l00694"></a>00694 pyparsing.SkipTo(outputParser ^ pipe ^ stringEnd, ignore=doNotParse).setParseAction(<span class="keyword">lambda</span> x: x[0].strip())(<span class="stringliteral">'suffix'</span>) + afterElements) -<a name="l00695"></a>00695 self.multilineParser.ignore(self.<a class="code" href="classcmd2_1_1Cmd.html#a0333f71a3291354d3238a4853ec5e762">commentInProgress</a>) -<a name="l00696"></a>00696 self.<a class="code" href="classcmd2_1_1Cmd.html#a58e84cc1e072fda53b98ba9ed4376540">singleLineParser</a> = ((oneLineCommand + pyparsing.SkipTo(terminatorParser ^ stringEnd ^ pipe ^ outputParser, ignore=doNotParse).setParseAction(<span class="keyword">lambda</span> x:x[0].strip())(<span class="stringliteral">'args'</span>))(<span class="stringliteral">'statement'</span>) + -<a name="l00697"></a>00697 pyparsing.Optional(terminatorParser) + afterElements) -<a name="l00698"></a>00698 <span class="comment">#self.multilineParser = self.multilineParser.setResultsName('multilineParser')</span> -<a name="l00699"></a>00699 <span class="comment">#self.singleLineParser = self.singleLineParser.setResultsName('singleLineParser')</span> -<a name="l00700"></a>00700 self.<a class="code" href="classcmd2_1_1Cmd.html#ab45987033aafd0458078de49d4cf1fb5">blankLineTerminationParser</a> = self.blankLineTerminationParser.setResultsName(<span class="stringliteral">'statement'</span>) -<a name="l00701"></a>00701 self.<a class="code" href="classcmd2_1_1Cmd.html#a60c8c9f51ca086f83a2563b7c5e93421">parser</a> = self.<a class="code" href="classcmd2_1_1Cmd.html#a794ce4cfd06ddd8df24df33d9f116a65">prefixParser</a> + ( -<a name="l00702"></a>00702 stringEnd | -<a name="l00703"></a>00703 self.<a class="code" href="classcmd2_1_1Cmd.html#a501ba802672b553037e265760319cfe1">multilineParser</a> | -<a name="l00704"></a>00704 self.<a class="code" href="classcmd2_1_1Cmd.html#a58e84cc1e072fda53b98ba9ed4376540">singleLineParser</a> | -<a name="l00705"></a>00705 self.<a class="code" href="classcmd2_1_1Cmd.html#ab45987033aafd0458078de49d4cf1fb5">blankLineTerminationParser</a> | -<a name="l00706"></a>00706 self.<a class="code" href="classcmd2_1_1Cmd.html#a295de6e6060359049be89b5cdb6c09b1">multilineCommand</a> + pyparsing.SkipTo(stringEnd, ignore=doNotParse) -<a name="l00707"></a>00707 ) -<a name="l00708"></a>00708 self.parser.ignore(self.<a class="code" href="classcmd2_1_1Cmd.html#ae6adde6cd440331e4add0bdf8c2c61d0">commentGrammars</a>) -<a name="l00709"></a>00709 -<a name="l00710"></a>00710 inputMark = pyparsing.Literal(<span class="stringliteral">'<'</span>) -<a name="l00711"></a>00711 inputMark.setParseAction(<span class="keyword">lambda</span> x: <span class="stringliteral">''</span>) -<a name="l00712"></a>00712 fileName = pyparsing.Word(self.<a class="code" href="classcmd2_1_1Cmd.html#a866c4b8895784a477d36bebfecfa397e">legalChars</a> + <span class="stringliteral">'/\\'</span>) -<a name="l00713"></a>00713 inputFrom = fileName(<span class="stringliteral">'inputFrom'</span>) -<a name="l00714"></a>00714 inputFrom.setParseAction(replace_with_file_contents) -<a name="l00715"></a>00715 <span class="comment"># a not-entirely-satisfactory way of distinguishing < as in "import from" from <</span> -<a name="l00716"></a>00716 <span class="comment"># as in "lesser than"</span> -<a name="l00717"></a>00717 self.<a class="code" href="classcmd2_1_1Cmd.html#a984d7a052143f938fa7894fbd44632d2">inputParser</a> = inputMark + pyparsing.Optional(inputFrom) + pyparsing.Optional(<span class="stringliteral">'>'</span>) + \ -<a name="l00718"></a>00718 pyparsing.Optional(fileName) + (pyparsing.stringEnd | <span class="stringliteral">'|'</span>) -<a name="l00719"></a>00719 self.inputParser.ignore(self.<a class="code" href="classcmd2_1_1Cmd.html#a0333f71a3291354d3238a4853ec5e762">commentInProgress</a>) -<a name="l00720"></a>00720 -<a name="l00721"></a><a class="code" href="classcmd2_1_1Cmd.html#a794ada2c7a6027d079d6a5bae38fea2b">00721</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a794ada2c7a6027d079d6a5bae38fea2b">preparse</a>(self, raw, **kwargs): -<a name="l00722"></a>00722 <span class="keywordflow">return</span> raw -<a name="l00723"></a><a class="code" href="classcmd2_1_1Cmd.html#aeda7fe76e7ecbc032386722e8f5cae3a">00723</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#aeda7fe76e7ecbc032386722e8f5cae3a">postparse</a>(self, parseResult): -<a name="l00724"></a>00724 <span class="keywordflow">return</span> parseResult -<a name="l00725"></a>00725 -<a name="l00726"></a><a class="code" href="classcmd2_1_1Cmd.html#a1d2749139a96bd29ddabc6cb0dfd4c00">00726</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a1d2749139a96bd29ddabc6cb0dfd4c00">parsed</a>(self, raw, **kwargs): -<a name="l00727"></a>00727 <span class="keywordflow">if</span> isinstance(raw, ParsedString): -<a name="l00728"></a>00728 p = raw -<a name="l00729"></a>00729 <span class="keywordflow">else</span>: -<a name="l00730"></a>00730 <span class="comment"># preparse is an overridable hook; default makes no changes</span> -<a name="l00731"></a>00731 s = self.<a class="code" href="classcmd2_1_1Cmd.html#a794ada2c7a6027d079d6a5bae38fea2b">preparse</a>(raw, **kwargs) -<a name="l00732"></a>00732 s = self.inputParser.transformString(s.lstrip()) -<a name="l00733"></a>00733 s = self.commentGrammars.transformString(s) -<a name="l00734"></a>00734 <span class="keywordflow">for</span> (shortcut, expansion) <span class="keywordflow">in</span> self.<a class="code" href="classcmd2_1_1Cmd.html#ad8ccfbcd2a4eb800f040fcdbd26089df">shortcuts</a>: -<a name="l00735"></a>00735 <span class="keywordflow">if</span> s.lower().startswith(shortcut): -<a name="l00736"></a>00736 s = s.replace(shortcut, expansion + <span class="stringliteral">' '</span>, 1) -<a name="l00737"></a>00737 <span class="keywordflow">break</span> -<a name="l00738"></a>00738 result = self.parser.parseString(s) -<a name="l00739"></a>00739 result[<span class="stringliteral">'raw'</span>] = raw -<a name="l00740"></a>00740 result[<span class="stringliteral">'command'</span>] = result.multilineCommand <span class="keywordflow">or</span> result.command -<a name="l00741"></a>00741 result = self.<a class="code" href="classcmd2_1_1Cmd.html#aeda7fe76e7ecbc032386722e8f5cae3a">postparse</a>(result) -<a name="l00742"></a>00742 p = <a class="code" href="classcmd2_1_1ParsedString.html">ParsedString</a>(result.args) -<a name="l00743"></a>00743 p.parsed = result -<a name="l00744"></a>00744 p.parser = self.<a class="code" href="classcmd2_1_1Cmd.html#a1d2749139a96bd29ddabc6cb0dfd4c00">parsed</a> -<a name="l00745"></a>00745 <span class="keywordflow">for</span> (key, val) <span class="keywordflow">in</span> kwargs.items(): -<a name="l00746"></a>00746 p.parsed[key] = val -<a name="l00747"></a>00747 <span class="keywordflow">return</span> p -<a name="l00748"></a>00748 -<a name="l00749"></a><a class="code" href="classcmd2_1_1Cmd.html#ab021b9befbc198bc266b1a439cdc44e6">00749</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#ab021b9befbc198bc266b1a439cdc44e6">postparsing_precmd</a>(self, statement): -<a name="l00750"></a>00750 stop = 0 -<a name="l00751"></a>00751 <span class="keywordflow">return</span> stop, statement -<a name="l00752"></a><a class="code" href="classcmd2_1_1Cmd.html#ae64756253f4ef8494ad3cd920f749eb6">00752</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#ae64756253f4ef8494ad3cd920f749eb6">postparsing_postcmd</a>(self, stop): -<a name="l00753"></a>00753 <span class="keywordflow">return</span> stop -<a name="l00754"></a>00754 -<a name="l00755"></a><a class="code" href="classcmd2_1_1Cmd.html#a7fbb17b136654f705387ede1fb685a3e">00755</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a7fbb17b136654f705387ede1fb685a3e">func_named</a>(self, arg): -<a name="l00756"></a>00756 result = <span class="keywordtype">None</span> -<a name="l00757"></a>00757 target = <span class="stringliteral">'do_'</span> + arg -<a name="l00758"></a>00758 <span class="keywordflow">if</span> target <span class="keywordflow">in</span> dir(self): -<a name="l00759"></a>00759 result = target -<a name="l00760"></a>00760 <span class="keywordflow">else</span>: -<a name="l00761"></a>00761 <span class="keywordflow">if</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a810ba12198cbbc4e38643c83278956f6">abbrev</a>: <span class="comment"># accept shortened versions of commands</span> -<a name="l00762"></a>00762 funcs = [fname <span class="keywordflow">for</span> fname <span class="keywordflow">in</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a8ccd464e255a798b587637f9b812dbcd">keywords</a> <span class="keywordflow">if</span> fname.startswith(arg)] -<a name="l00763"></a>00763 <span class="keywordflow">if</span> len(funcs) == 1: -<a name="l00764"></a>00764 result = <span class="stringliteral">'do_'</span> + funcs[0] -<a name="l00765"></a>00765 <span class="keywordflow">return</span> result -<a name="l00766"></a><a class="code" href="classcmd2_1_1Cmd.html#ac188a434c9c7d5c939e971a3d42c1c63">00766</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#ac188a434c9c7d5c939e971a3d42c1c63">onecmd_plus_hooks</a>(self, line): -<a name="l00767"></a>00767 <span class="comment"># The outermost level of try/finally nesting can be condensed once</span> -<a name="l00768"></a>00768 <span class="comment"># Python 2.4 support can be dropped.</span> -<a name="l00769"></a>00769 stop = 0 -<a name="l00770"></a>00770 <span class="keywordflow">try</span>: -<a name="l00771"></a>00771 <span class="keywordflow">try</span>: -<a name="l00772"></a>00772 statement = self.<a class="code" href="classcmd2_1_1Cmd.html#a9f07c787a0f421ce9186b404fed63c54">complete_statement</a>(line) -<a name="l00773"></a>00773 (stop, statement) = self.<a class="code" href="classcmd2_1_1Cmd.html#ab021b9befbc198bc266b1a439cdc44e6">postparsing_precmd</a>(statement) -<a name="l00774"></a>00774 <span class="keywordflow">if</span> stop: -<a name="l00775"></a>00775 <span class="keywordflow">return</span> self.<a class="code" href="classcmd2_1_1Cmd.html#ae64756253f4ef8494ad3cd920f749eb6">postparsing_postcmd</a>(stop) -<a name="l00776"></a>00776 <span class="keywordflow">if</span> statement.parsed.command <span class="keywordflow">not</span> <span class="keywordflow">in</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a35586c262b272917f6ecae8e76fca6b9">excludeFromHistory</a>: -<a name="l00777"></a>00777 self.history.append(statement.parsed.raw) -<a name="l00778"></a>00778 <span class="keywordflow">try</span>: -<a name="l00779"></a>00779 self.<a class="code" href="classcmd2_1_1Cmd.html#a46d1bc05e01f5eced432f00c9934db88">redirect_output</a>(statement) -<a name="l00780"></a>00780 timestart = datetime.datetime.now() -<a name="l00781"></a>00781 statement = self.precmd(statement) -<a name="l00782"></a>00782 stop = self.<a class="code" href="classcmd2_1_1Cmd.html#a7b46b9fabe42bf5ec481ab5ea68effcd">onecmd</a>(statement) -<a name="l00783"></a>00783 stop = self.postcmd(stop, statement) -<a name="l00784"></a>00784 <span class="keywordflow">if</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a2d83899c5edb8c1296cb90b0fb282de7">timing</a>: -<a name="l00785"></a>00785 self.<a class="code" href="classcmd2_1_1Cmd.html#a122b67681a0db23863f5ddaa7a687975">pfeedback</a>(<span class="stringliteral">'Elapsed: %s'</span> % str(datetime.datetime.now() - timestart)) -<a name="l00786"></a>00786 <span class="keywordflow">finally</span>: -<a name="l00787"></a>00787 self.<a class="code" href="classcmd2_1_1Cmd.html#a8b44f9a5a3197613178b4a8fb1804ef7">restore_output</a>(statement) -<a name="l00788"></a>00788 <span class="keywordflow">except</span> EmptyStatement: -<a name="l00789"></a>00789 <span class="keywordflow">return</span> 0 -<a name="l00790"></a>00790 <span class="keywordflow">except</span> Exception, e: -<a name="l00791"></a>00791 self.<a class="code" href="classcmd2_1_1Cmd.html#a118c16455f28dbd3918b565bca086db4">perror</a>(str(e), statement) -<a name="l00792"></a>00792 <span class="keywordflow">finally</span>: -<a name="l00793"></a>00793 <span class="keywordflow">return</span> self.<a class="code" href="classcmd2_1_1Cmd.html#ae64756253f4ef8494ad3cd920f749eb6">postparsing_postcmd</a>(stop) -<a name="l00794"></a><a class="code" href="classcmd2_1_1Cmd.html#a9f07c787a0f421ce9186b404fed63c54">00794</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a9f07c787a0f421ce9186b404fed63c54">complete_statement</a>(self, line): -<a name="l00795"></a>00795 <span class="stringliteral">"""Keep accepting lines of input until the command is complete."""</span> -<a name="l00796"></a>00796 <span class="keywordflow">if</span> (<span class="keywordflow">not</span> line) <span class="keywordflow">or</span> ( -<a name="l00797"></a>00797 <span class="keywordflow">not</span> pyparsing.Or(self.<a class="code" href="classcmd2_1_1Cmd.html#ae6adde6cd440331e4add0bdf8c2c61d0">commentGrammars</a>). -<a name="l00798"></a>00798 setParseAction(<span class="keyword">lambda</span> x: <span class="stringliteral">''</span>).transformString(line)): -<a name="l00799"></a>00799 <span class="keywordflow">raise</span> EmptyStatement -<a name="l00800"></a>00800 statement = self.<a class="code" href="classcmd2_1_1Cmd.html#a1d2749139a96bd29ddabc6cb0dfd4c00">parsed</a>(line) -<a name="l00801"></a>00801 <span class="keywordflow">while</span> statement.parsed.multilineCommand <span class="keywordflow">and</span> (statement.parsed.terminator == <span class="stringliteral">''</span>): -<a name="l00802"></a>00802 statement = <span class="stringliteral">'%s\n%s'</span> % (statement.parsed.raw, -<a name="l00803"></a>00803 self.<a class="code" href="classcmd2_1_1Cmd.html#ab2b46bf4fdbb22536322417117eebf16">pseudo_raw_input</a>(self.<a class="code" href="classcmd2_1_1Cmd.html#a186ca22e76dc63ad9d8a95cfaeb4f7fd">continuation_prompt</a>)) -<a name="l00804"></a>00804 statement = self.<a class="code" href="classcmd2_1_1Cmd.html#a1d2749139a96bd29ddabc6cb0dfd4c00">parsed</a>(statement) -<a name="l00805"></a>00805 <span class="keywordflow">if</span> <span class="keywordflow">not</span> statement.parsed.command: -<a name="l00806"></a>00806 <span class="keywordflow">raise</span> EmptyStatement -<a name="l00807"></a>00807 <span class="keywordflow">return</span> statement -<a name="l00808"></a>00808 -<a name="l00809"></a><a class="code" href="classcmd2_1_1Cmd.html#a46d1bc05e01f5eced432f00c9934db88">00809</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a46d1bc05e01f5eced432f00c9934db88">redirect_output</a>(self, statement): -<a name="l00810"></a>00810 <span class="keywordflow">if</span> statement.parsed.pipeTo: -<a name="l00811"></a>00811 self.<a class="code" href="classcmd2_1_1Cmd.html#ad480d9102b3a5e4c8c5541d2c205a1ad">kept_state</a> = <a class="code" href="classcmd2_1_1Statekeeper.html">Statekeeper</a>(self, (<span class="stringliteral">'stdout'</span>,)) -<a name="l00812"></a>00812 self.<a class="code" href="classcmd2_1_1Cmd.html#a86a3b99c482252a9c9e7fc283c7eae5d">kept_sys</a> = <a class="code" href="classcmd2_1_1Statekeeper.html">Statekeeper</a>(sys, (<span class="stringliteral">'stdout'</span>,)) -<a name="l00813"></a>00813 self.<a class="code" href="classcmd2_1_1Cmd.html#ac1dac1bcd74f78671161775a95d74c0a">redirect</a> = subprocess.Popen(statement.parsed.pipeTo, shell=<span class="keyword">True</span>, stdout=subprocess.PIPE, stdin=subprocess.PIPE) -<a name="l00814"></a>00814 sys.stdout = self.<a class="code" href="classcmd2_1_1Cmd.html#a2a71ccfd9f189e17db765b603f2c9a78">stdout</a> = self.<a class="code" href="classcmd2_1_1Cmd.html#ac1dac1bcd74f78671161775a95d74c0a">redirect</a>.stdin -<a name="l00815"></a>00815 <span class="keywordflow">elif</span> statement.parsed.output: -<a name="l00816"></a>00816 <span class="keywordflow">if</span> (<span class="keywordflow">not</span> statement.parsed.outputTo) <span class="keywordflow">and</span> (<span class="keywordflow">not</span> can_clip): -<a name="l00817"></a>00817 <span class="keywordflow">raise</span> EnvironmentError(<span class="stringliteral">'Cannot redirect to paste buffer; install ``xclip`` and re-run to enable'</span>) -<a name="l00818"></a>00818 self.<a class="code" href="classcmd2_1_1Cmd.html#ad480d9102b3a5e4c8c5541d2c205a1ad">kept_state</a> = <a class="code" href="classcmd2_1_1Statekeeper.html">Statekeeper</a>(self, (<span class="stringliteral">'stdout'</span>,)) -<a name="l00819"></a>00819 self.<a class="code" href="classcmd2_1_1Cmd.html#a86a3b99c482252a9c9e7fc283c7eae5d">kept_sys</a> = <a class="code" href="classcmd2_1_1Statekeeper.html">Statekeeper</a>(sys, (<span class="stringliteral">'stdout'</span>,)) -<a name="l00820"></a>00820 <span class="keywordflow">if</span> statement.parsed.outputTo: -<a name="l00821"></a>00821 mode = <span class="stringliteral">'w'</span> -<a name="l00822"></a>00822 <span class="keywordflow">if</span> statement.parsed.output == 2 * self.<a class="code" href="classcmd2_1_1Cmd.html#a64b810574dab9ec12100c5344dc66735">redirector</a>: -<a name="l00823"></a>00823 mode = <span class="stringliteral">'a'</span> -<a name="l00824"></a>00824 sys.stdout = self.<a class="code" href="classcmd2_1_1Cmd.html#a2a71ccfd9f189e17db765b603f2c9a78">stdout</a> = open(os.path.expanduser(statement.parsed.outputTo), mode) -<a name="l00825"></a>00825 <span class="keywordflow">else</span>: -<a name="l00826"></a>00826 sys.stdout = self.<a class="code" href="classcmd2_1_1Cmd.html#a2a71ccfd9f189e17db765b603f2c9a78">stdout</a> = tempfile.TemporaryFile(mode=<span class="stringliteral">"w+"</span>) -<a name="l00827"></a>00827 <span class="keywordflow">if</span> statement.parsed.output == <span class="stringliteral">'>>'</span>: -<a name="l00828"></a>00828 self.stdout.write(<a class="code" href="namespacecmd2.html#a9f1495f6c72f7d8c0dbb0f9f22029763">get_paste_buffer</a>()) -<a name="l00829"></a>00829 -<a name="l00830"></a><a class="code" href="classcmd2_1_1Cmd.html#a8b44f9a5a3197613178b4a8fb1804ef7">00830</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a8b44f9a5a3197613178b4a8fb1804ef7">restore_output</a>(self, statement): -<a name="l00831"></a>00831 <span class="keywordflow">if</span> self.<a class="code" href="classcmd2_1_1Cmd.html#ad480d9102b3a5e4c8c5541d2c205a1ad">kept_state</a>: -<a name="l00832"></a>00832 <span class="keywordflow">if</span> statement.parsed.output: -<a name="l00833"></a>00833 <span class="keywordflow">if</span> <span class="keywordflow">not</span> statement.parsed.outputTo: -<a name="l00834"></a>00834 self.stdout.seek(0) -<a name="l00835"></a>00835 <a class="code" href="namespacecmd2.html#a514a20ceb8ab40dd89d2df2dd5ff87a0">write_to_paste_buffer</a>(self.stdout.read()) -<a name="l00836"></a>00836 <span class="keywordflow">elif</span> statement.parsed.pipeTo: -<a name="l00837"></a>00837 <span class="keywordflow">for</span> result <span class="keywordflow">in</span> self.redirect.communicate(): -<a name="l00838"></a>00838 self.kept_state.stdout.write(result <span class="keywordflow">or</span> <span class="stringliteral">''</span>) -<a name="l00839"></a>00839 self.stdout.close() -<a name="l00840"></a>00840 self.kept_state.restore() -<a name="l00841"></a>00841 self.kept_sys.restore() -<a name="l00842"></a>00842 self.<a class="code" href="classcmd2_1_1Cmd.html#ad480d9102b3a5e4c8c5541d2c205a1ad">kept_state</a> = <span class="keywordtype">None</span> -<a name="l00843"></a>00843 -<a name="l00844"></a><a class="code" href="classcmd2_1_1Cmd.html#a7b46b9fabe42bf5ec481ab5ea68effcd">00844</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a7b46b9fabe42bf5ec481ab5ea68effcd">onecmd</a>(self, line): -<a name="l00845"></a>00845 <span class="stringliteral">"""Interpret the argument as though it had been typed in response</span> -<a name="l00846"></a>00846 <span class="stringliteral"> to the prompt.</span> -<a name="l00847"></a>00847 <span class="stringliteral"></span> -<a name="l00848"></a>00848 <span class="stringliteral"> This may be overridden, but should not normally need to be;</span> -<a name="l00849"></a>00849 <span class="stringliteral"> see the precmd() and postcmd() methods for useful execution hooks.</span> -<a name="l00850"></a>00850 <span class="stringliteral"> The return value is a flag indicating whether interpretation of</span> -<a name="l00851"></a>00851 <span class="stringliteral"> commands by the interpreter should stop.</span> -<a name="l00852"></a>00852 <span class="stringliteral"> </span> -<a name="l00853"></a>00853 <span class="stringliteral"> This (`cmd2`) version of `onecmd` already override's `cmd`'s `onecmd`.</span> -<a name="l00854"></a><a class="code" href="classcmd2_1_1Cmd.html#adaaec8df571e88463c3b8b02fefea8b2">00854</a> <span class="stringliteral"></span> -<a name="l00855"></a>00855 <span class="stringliteral"> """</span> -<a name="l00856"></a>00856 statement = self.<a class="code" href="classcmd2_1_1Cmd.html#a1d2749139a96bd29ddabc6cb0dfd4c00">parsed</a>(line) -<a name="l00857"></a>00857 self.<a class="code" href="classcmd2_1_1Cmd.html#adaaec8df571e88463c3b8b02fefea8b2">lastcmd</a> = statement.parsed.raw -<a name="l00858"></a>00858 funcname = self.<a class="code" href="classcmd2_1_1Cmd.html#a7fbb17b136654f705387ede1fb685a3e">func_named</a>(statement.parsed.command) -<a name="l00859"></a>00859 <span class="keywordflow">if</span> <span class="keywordflow">not</span> funcname: -<a name="l00860"></a>00860 <span class="keywordflow">return</span> self.<a class="code" href="classcmd2_1_1Cmd.html#aea64b66ff75b5daaeef61a3dd583df99">_default</a>(statement) -<a name="l00861"></a>00861 <span class="keywordflow">try</span>: -<a name="l00862"></a>00862 func = getattr(self, funcname) -<a name="l00863"></a>00863 <span class="keywordflow">except</span> AttributeError: -<a name="l00864"></a>00864 <span class="keywordflow">return</span> self.<a class="code" href="classcmd2_1_1Cmd.html#aea64b66ff75b5daaeef61a3dd583df99">_default</a>(statement) -<a name="l00865"></a>00865 stop = func(statement) -<a name="l00866"></a>00866 <span class="keywordflow">return</span> stop -<a name="l00867"></a>00867 -<a name="l00868"></a><a class="code" href="classcmd2_1_1Cmd.html#aea64b66ff75b5daaeef61a3dd583df99">00868</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#aea64b66ff75b5daaeef61a3dd583df99">_default</a>(self, statement): -<a name="l00869"></a>00869 arg = statement.full_parsed_statement() -<a name="l00870"></a>00870 <span class="keywordflow">if</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a7da859e33eae87d5069b96d366cf04b4">default_to_shell</a>: -<a name="l00871"></a>00871 result = os.system(arg) -<a name="l00872"></a>00872 <span class="keywordflow">if</span> <span class="keywordflow">not</span> result: -<a name="l00873"></a>00873 <span class="keywordflow">return</span> self.<a class="code" href="classcmd2_1_1Cmd.html#ae64756253f4ef8494ad3cd920f749eb6">postparsing_postcmd</a>(<span class="keywordtype">None</span>) -<a name="l00874"></a>00874 <span class="keywordflow">return</span> self.<a class="code" href="classcmd2_1_1Cmd.html#ae64756253f4ef8494ad3cd920f749eb6">postparsing_postcmd</a>(self.default(arg)) -<a name="l00875"></a>00875 -<a name="l00876"></a><a class="code" href="classcmd2_1_1Cmd.html#ab2b46bf4fdbb22536322417117eebf16">00876</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#ab2b46bf4fdbb22536322417117eebf16">pseudo_raw_input</a>(self, prompt): -<a name="l00877"></a>00877 <span class="stringliteral">"""copied from cmd's cmdloop; like raw_input, but accounts for changed stdin, stdout"""</span> -<a name="l00878"></a>00878 -<a name="l00879"></a>00879 <span class="keywordflow">if</span> self.<a class="code" href="classcmd2_1_1Cmd.html#add0217858bbc4c268a5f2f27330ad1f8">use_rawinput</a>: -<a name="l00880"></a>00880 <span class="keywordflow">try</span>: -<a name="l00881"></a>00881 line = raw_input(prompt) -<a name="l00882"></a>00882 <span class="keywordflow">except</span> EOFError: -<a name="l00883"></a>00883 line = <span class="stringliteral">'EOF'</span> -<a name="l00884"></a>00884 <span class="keywordflow">else</span>: -<a name="l00885"></a>00885 self.stdout.write(prompt) -<a name="l00886"></a>00886 self.stdout.flush() -<a name="l00887"></a>00887 line = self.stdin.readline() -<a name="l00888"></a>00888 <span class="keywordflow">if</span> <span class="keywordflow">not</span> len(line): -<a name="l00889"></a>00889 line = <span class="stringliteral">'EOF'</span> -<a name="l00890"></a>00890 <span class="keywordflow">else</span>: -<a name="l00891"></a>00891 <span class="keywordflow">if</span> line[-1] == <span class="stringliteral">'\n'</span>: <span class="comment"># this was always true in Cmd</span> -<a name="l00892"></a>00892 line = line[:-1] -<a name="l00893"></a>00893 <span class="keywordflow">return</span> line -<a name="l00894"></a>00894 -<a name="l00895"></a><a class="code" href="classcmd2_1_1Cmd.html#a392c5cd062c20d916c0cacc9cc36c022">00895</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a392c5cd062c20d916c0cacc9cc36c022">_cmdloop</a>(self, intro=None): -<a name="l00896"></a>00896 <span class="stringliteral">"""Repeatedly issue a prompt, accept input, parse an initial prefix</span> -<a name="l00897"></a>00897 <span class="stringliteral"> off the received input, and dispatch to action methods, passing them</span> -<a name="l00898"></a><a class="code" href="classcmd2_1_1Cmd.html#a4540b84ee5f75aa1f915042ac4f327dc">00898</a> <span class="stringliteral"> the remainder of the line as argument.</span> -<a name="l00899"></a>00899 <span class="stringliteral"> """</span> -<a name="l00900"></a>00900 -<a name="l00901"></a>00901 <span class="comment"># An almost perfect copy from Cmd; however, the pseudo_raw_input portion</span> -<a name="l00902"></a>00902 <span class="comment"># has been split out so that it can be called separately</span> -<a name="l00903"></a>00903 -<a name="l00904"></a>00904 self.preloop() -<a name="l00905"></a>00905 <span class="keywordflow">if</span> self.<a class="code" href="classcmd2_1_1Cmd.html#add0217858bbc4c268a5f2f27330ad1f8">use_rawinput</a> <span class="keywordflow">and</span> self.completekey: -<a name="l00906"></a>00906 <span class="keywordflow">try</span>: -<a name="l00907"></a>00907 <span class="keyword">import</span> readline -<a name="l00908"></a>00908 self.<a class="code" href="classcmd2_1_1Cmd.html#a4540b84ee5f75aa1f915042ac4f327dc">old_completer</a> = readline.get_completer() -<a name="l00909"></a>00909 readline.set_completer(self.complete) -<a name="l00910"></a>00910 readline.parse_and_bind(self.completekey+<span class="stringliteral">": complete"</span>) -<a name="l00911"></a>00911 <span class="keywordflow">except</span> ImportError: -<a name="l00912"></a>00912 <span class="keywordflow">pass</span> -<a name="l00913"></a>00913 <span class="keywordflow">try</span>: -<a name="l00914"></a>00914 <span class="keywordflow">if</span> intro <span class="keywordflow">is</span> <span class="keywordflow">not</span> <span class="keywordtype">None</span>: -<a name="l00915"></a>00915 self.<a class="code" href="classcmd2_1_1Cmd.html#a3f1d7fcb42b72f182eed91009e0708c3">intro</a> = intro -<a name="l00916"></a>00916 <span class="keywordflow">if</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a3f1d7fcb42b72f182eed91009e0708c3">intro</a>: -<a name="l00917"></a>00917 self.stdout.write(str(self.<a class="code" href="classcmd2_1_1Cmd.html#a3f1d7fcb42b72f182eed91009e0708c3">intro</a>)+<span class="stringliteral">"\n"</span>) -<a name="l00918"></a>00918 stop = <span class="keywordtype">None</span> -<a name="l00919"></a>00919 <span class="keywordflow">while</span> <span class="keywordflow">not</span> stop: -<a name="l00920"></a>00920 <span class="keywordflow">if</span> self.cmdqueue: -<a name="l00921"></a>00921 line = self.cmdqueue.pop(0) -<a name="l00922"></a>00922 <span class="keywordflow">else</span>: -<a name="l00923"></a>00923 line = self.<a class="code" href="classcmd2_1_1Cmd.html#ab2b46bf4fdbb22536322417117eebf16">pseudo_raw_input</a>(self.<a class="code" href="classcmd2_1_1Cmd.html#ae9a33dc613b00f4d5b849c0d3521f2c3">prompt</a>) -<a name="l00924"></a>00924 <span class="keywordflow">if</span> (self.<a class="code" href="classcmd2_1_1Cmd.html#a417779ccb5de864826f97a959bd196d3">echo</a>) <span class="keywordflow">and</span> (isinstance(self.<a class="code" href="classcmd2_1_1Cmd.html#a6f0eed071b4e9197cc4fa46a2c8f1457">stdin</a>, file)): -<a name="l00925"></a>00925 self.stdout.write(line + <span class="stringliteral">'\n'</span>) -<a name="l00926"></a>00926 stop = self.<a class="code" href="classcmd2_1_1Cmd.html#ac188a434c9c7d5c939e971a3d42c1c63">onecmd_plus_hooks</a>(line) -<a name="l00927"></a>00927 self.postloop() -<a name="l00928"></a>00928 <span class="keywordflow">finally</span>: -<a name="l00929"></a>00929 <span class="keywordflow">if</span> self.<a class="code" href="classcmd2_1_1Cmd.html#add0217858bbc4c268a5f2f27330ad1f8">use_rawinput</a> <span class="keywordflow">and</span> self.completekey: -<a name="l00930"></a>00930 <span class="keywordflow">try</span>: -<a name="l00931"></a>00931 <span class="keyword">import</span> readline -<a name="l00932"></a>00932 readline.set_completer(self.<a class="code" href="classcmd2_1_1Cmd.html#a4540b84ee5f75aa1f915042ac4f327dc">old_completer</a>) -<a name="l00933"></a>00933 <span class="keywordflow">except</span> ImportError: -<a name="l00934"></a>00934 <span class="keywordflow">pass</span> -<a name="l00935"></a>00935 <span class="keywordflow">return</span> stop -<a name="l00936"></a>00936 -<a name="l00937"></a><a class="code" href="classcmd2_1_1Cmd.html#ab2783ec53899e2b4c0abda7007471e64">00937</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#ab2783ec53899e2b4c0abda7007471e64">do_EOF</a>(self, arg): -<a name="l00938"></a>00938 <span class="keywordflow">return</span> self.<a class="code" href="classcmd2_1_1Cmd.html#abe14bda0dc50326876c6a761cefba702">_STOP_SCRIPT_NO_EXIT</a> <span class="comment"># End of script; should not exit app</span> -<a name="l00939"></a><a class="code" href="classcmd2_1_1Cmd.html#a489ae23e2c2dc31c04eab9287c9339fa">00939</a> do_eof = do_EOF -<a name="l00940"></a>00940 -<a name="l00941"></a><a class="code" href="classcmd2_1_1Cmd.html#a27f6387585848a575e95c936ce97c4cf">00941</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a27f6387585848a575e95c936ce97c4cf">do_quit</a>(self, arg): -<a name="l00942"></a>00942 <span class="keywordflow">return</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a7a8e8257d7d35c7813355cdefb62b85b">_STOP_AND_EXIT</a> -<a name="l00943"></a><a class="code" href="classcmd2_1_1Cmd.html#a7407cf3f70091dc1ade5acb856585850">00943</a> do_exit = do_quit -<a name="l00944"></a><a class="code" href="classcmd2_1_1Cmd.html#ad938266e8224edd7a6e681b9f4416cb5">00944</a> do_q = do_quit -<a name="l00945"></a>00945 -<a name="l00946"></a><a class="code" href="classcmd2_1_1Cmd.html#a28cd403d962038aca658344673a5ab38">00946</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a28cd403d962038aca658344673a5ab38">select</a>(self, options, prompt='Your choice? '): -<a name="l00947"></a>00947 <span class="stringliteral">'''Presents a numbered menu to the user. Modelled after</span> -<a name="l00948"></a>00948 <span class="stringliteral"> the bash shell's SELECT. Returns the item chosen.</span> -<a name="l00949"></a>00949 <span class="stringliteral"> </span> -<a name="l00950"></a>00950 <span class="stringliteral"> Argument ``options`` can be:</span> -<a name="l00951"></a>00951 <span class="stringliteral"></span> -<a name="l00952"></a>00952 <span class="stringliteral"> | a single string -> will be split into one-word options</span> -<a name="l00953"></a>00953 <span class="stringliteral"> | a list of strings -> will be offered as options</span> -<a name="l00954"></a>00954 <span class="stringliteral"> | a list of tuples -> interpreted as (value, text), so </span> -<a name="l00955"></a>00955 <span class="stringliteral"> that the return value can differ from</span> -<a name="l00956"></a>00956 <span class="stringliteral"> the text advertised to the user '''</span> -<a name="l00957"></a>00957 <span class="keywordflow">if</span> isinstance(options, basestring): -<a name="l00958"></a>00958 options = zip(options.split(), options.split()) -<a name="l00959"></a>00959 fulloptions = [] -<a name="l00960"></a>00960 <span class="keywordflow">for</span> opt <span class="keywordflow">in</span> options: -<a name="l00961"></a>00961 <span class="keywordflow">if</span> isinstance(opt, basestring): -<a name="l00962"></a>00962 fulloptions.append((opt, opt)) -<a name="l00963"></a>00963 <span class="keywordflow">else</span>: -<a name="l00964"></a>00964 <span class="keywordflow">try</span>: -<a name="l00965"></a>00965 fulloptions.append((opt[0], opt[1])) -<a name="l00966"></a>00966 <span class="keywordflow">except</span> IndexError: -<a name="l00967"></a>00967 fulloptions.append((opt[0], opt[0])) -<a name="l00968"></a>00968 <span class="keywordflow">for</span> (idx, (value, text)) <span class="keywordflow">in</span> enumerate(fulloptions): -<a name="l00969"></a>00969 self.<a class="code" href="classcmd2_1_1Cmd.html#ad8b5d33873f9b515e33f83a616d0828f">poutput</a>(<span class="stringliteral">' %2d. %s\n'</span> % (idx+1, text)) -<a name="l00970"></a>00970 <span class="keywordflow">while</span> <span class="keyword">True</span>: -<a name="l00971"></a>00971 response = raw_input(prompt) -<a name="l00972"></a>00972 <span class="keywordflow">try</span>: -<a name="l00973"></a>00973 response = int(response) -<a name="l00974"></a>00974 result = fulloptions[response - 1][0] -<a name="l00975"></a>00975 <span class="keywordflow">break</span> -<a name="l00976"></a>00976 <span class="keywordflow">except</span> ValueError: -<a name="l00977"></a>00977 <span class="keywordflow">pass</span> <span class="comment"># loop and ask again</span> -<a name="l00978"></a>00978 <span class="keywordflow">return</span> result -<a name="l00979"></a>00979 -<a name="l00980"></a>00980 @<a class="code" href="namespacecmd2.html#a863be2c5e3b9fdec03710fd550801c22">options</a>([make_option(<span class="stringliteral">'-l'</span>, <span class="stringliteral">'--long'</span>, action=<span class="stringliteral">"store_true"</span>, -<a name="l00981"></a><a class="code" href="classcmd2_1_1Cmd.html#a9db85d1db5ea30170d540102f1206b1f">00981</a> help=<span class="stringliteral">"describe function of parameter"</span>)]) -<a name="l00982"></a><a class="code" href="classcmd2_1_1Cmd.html#a4816ba13212f079e4b1e865d20041983">00982</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a4816ba13212f079e4b1e865d20041983">do_show</a>(self, arg, opts): -<a name="l00983"></a>00983 <span class="stringliteral">'''Shows value of a parameter.'''</span> -<a name="l00984"></a>00984 param = arg.strip().lower() -<a name="l00985"></a>00985 result = {} -<a name="l00986"></a>00986 maxlen = 0 -<a name="l00987"></a>00987 <span class="keywordflow">for</span> p <span class="keywordflow">in</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a6cec2f634666d15d032d4c113e654c3c">settable</a>: -<a name="l00988"></a>00988 <span class="keywordflow">if</span> (<span class="keywordflow">not</span> param) <span class="keywordflow">or</span> p.startswith(param): -<a name="l00989"></a>00989 result[p] = <span class="stringliteral">'%s: %s'</span> % (p, str(getattr(self, p))) -<a name="l00990"></a>00990 maxlen = max(maxlen, len(result[p])) -<a name="l00991"></a>00991 <span class="keywordflow">if</span> result: -<a name="l00992"></a>00992 <span class="keywordflow">for</span> p <span class="keywordflow">in</span> sorted(result): -<a name="l00993"></a>00993 <span class="keywordflow">if</span> opts.long: -<a name="l00994"></a>00994 self.<a class="code" href="classcmd2_1_1Cmd.html#ad8b5d33873f9b515e33f83a616d0828f">poutput</a>(<span class="stringliteral">'%s # %s'</span> % (result[p].<a class="code" href="namespacecmd2.html#ad4ac87ba068f9549b5a7735054df8065">ljust</a>(maxlen), self.<a class="code" href="classcmd2_1_1Cmd.html#a6cec2f634666d15d032d4c113e654c3c">settable</a>[p])) -<a name="l00995"></a>00995 <span class="keywordflow">else</span>: -<a name="l00996"></a>00996 self.<a class="code" href="classcmd2_1_1Cmd.html#ad8b5d33873f9b515e33f83a616d0828f">poutput</a>(result[p]) -<a name="l00997"></a>00997 <span class="keywordflow">else</span>: -<a name="l00998"></a>00998 <span class="keywordflow">raise</span> NotImplementedError(<span class="stringliteral">"Parameter '%s' not supported (type 'show' for list of parameters)."</span> % param) -<a name="l00999"></a>00999 -<a name="l01000"></a><a class="code" href="classcmd2_1_1Cmd.html#a1587bec304ebe93070072d273da9bb31">01000</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a1587bec304ebe93070072d273da9bb31">do_set</a>(self, arg): -<a name="l01001"></a>01001 <span class="stringliteral">'''</span> -<a name="l01002"></a>01002 <span class="stringliteral"> Sets a cmd2 parameter. Accepts abbreviated parameter names so long</span> -<a name="l01003"></a>01003 <span class="stringliteral"> as there is no ambiguity. Call without arguments for a list of </span> -<a name="l01004"></a>01004 <span class="stringliteral"> settable parameters with their values.'''</span> -<a name="l01005"></a>01005 <span class="keywordflow">try</span>: -<a name="l01006"></a>01006 statement, paramName, val = arg.parsed.raw.split(<span class="keywordtype">None</span>, 2) -<a name="l01007"></a>01007 val = val.strip() -<a name="l01008"></a>01008 paramName = paramName.strip().lower() -<a name="l01009"></a>01009 <span class="keywordflow">if</span> paramName <span class="keywordflow">not</span> <span class="keywordflow">in</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a6cec2f634666d15d032d4c113e654c3c">settable</a>: -<a name="l01010"></a>01010 hits = [p <span class="keywordflow">for</span> p <span class="keywordflow">in</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a6cec2f634666d15d032d4c113e654c3c">settable</a> <span class="keywordflow">if</span> p.startswith(paramName)] -<a name="l01011"></a>01011 <span class="keywordflow">if</span> len(hits) == 1: -<a name="l01012"></a>01012 paramName = hits[0] -<a name="l01013"></a>01013 <span class="keywordflow">else</span>: -<a name="l01014"></a>01014 <span class="keywordflow">return</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a4816ba13212f079e4b1e865d20041983">do_show</a>(paramName) -<a name="l01015"></a>01015 currentVal = getattr(self, paramName) -<a name="l01016"></a>01016 <span class="keywordflow">if</span> (val[0] == val[-1]) <span class="keywordflow">and</span> val[0] <span class="keywordflow">in</span> (<span class="stringliteral">"'"</span>, <span class="stringliteral">'"'</span>): -<a name="l01017"></a>01017 val = val[1:-1] -<a name="l01018"></a>01018 <span class="keywordflow">else</span>: -<a name="l01019"></a>01019 val = <a class="code" href="namespacecmd2.html#a0880940558f324b3958aedfc430f592d">cast</a>(currentVal, val) -<a name="l01020"></a>01020 setattr(self, paramName, val) -<a name="l01021"></a>01021 self.stdout.write(<span class="stringliteral">'%s - was: %s\nnow: %s\n'</span> % (paramName, currentVal, val)) -<a name="l01022"></a>01022 <span class="keywordflow">if</span> currentVal != val: -<a name="l01023"></a>01023 <span class="keywordflow">try</span>: -<a name="l01024"></a>01024 onchange_hook = getattr(self, <span class="stringliteral">'_onchange_%s'</span> % paramName) -<a name="l01025"></a>01025 onchange_hook(old=currentVal, new=val) -<a name="l01026"></a>01026 <span class="keywordflow">except</span> AttributeError: -<a name="l01027"></a>01027 <span class="keywordflow">pass</span> -<a name="l01028"></a>01028 <span class="keywordflow">except</span> (ValueError, AttributeError, NotSettableError), e: -<a name="l01029"></a>01029 self.<a class="code" href="classcmd2_1_1Cmd.html#a4816ba13212f079e4b1e865d20041983">do_show</a>(arg) -<a name="l01030"></a>01030 -<a name="l01031"></a><a class="code" href="classcmd2_1_1Cmd.html#a468717f63c360b46dd5f5bcbae4b0c9c">01031</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a468717f63c360b46dd5f5bcbae4b0c9c">do_pause</a>(self, arg): -<a name="l01032"></a>01032 <span class="stringliteral">'Displays the specified text then waits for the user to press RETURN.'</span> -<a name="l01033"></a>01033 raw_input(arg + <span class="stringliteral">'\n'</span>) -<a name="l01034"></a>01034 -<a name="l01035"></a><a class="code" href="classcmd2_1_1Cmd.html#a734c394c38de8828960370d6d8e68004">01035</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a734c394c38de8828960370d6d8e68004">do_shell</a>(self, arg): -<a name="l01036"></a>01036 <span class="stringliteral">'execute a command as if at the OS prompt.'</span> -<a name="l01037"></a>01037 os.system(arg) -<a name="l01038"></a>01038 -<a name="l01039"></a><a class="code" href="classcmd2_1_1Cmd.html#a5ccce52c26063115070d56b6f099223b">01039</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a5ccce52c26063115070d56b6f099223b">do_py</a>(self, arg): -<a name="l01040"></a>01040 <span class="stringliteral">'''</span> -<a name="l01041"></a>01041 <span class="stringliteral"> py <command>: Executes a Python command.</span> -<a name="l01042"></a>01042 <span class="stringliteral"> py: Enters interactive Python mode.</span> -<a name="l01043"></a>01043 <span class="stringliteral"> End with ``Ctrl-D`` (Unix) / ``Ctrl-Z`` (Windows), ``quit()``, '`exit()``.</span> -<a name="l01044"></a>01044 <span class="stringliteral"> Non-python commands can be issued with ``cmd("your command")``.</span> -<a name="l01045"></a>01045 <span class="stringliteral"> Run python code from external files with ``run("filename.py")``</span> -<a name="l01046"></a>01046 <span class="stringliteral"> '''</span> -<a name="l01047"></a>01047 self.<a class="code" href="classcmd2_1_1Cmd.html#a30058e5e628d60dedf7c500e270b3e5d">pystate</a>[<span class="stringliteral">'self'</span>] = self -<a name="l01048"></a>01048 arg = arg.parsed.raw[2:].strip() -<a name="l01049"></a>01049 localvars = (self.<a class="code" href="classcmd2_1_1Cmd.html#a55e7978c792429a0a2e3321abdbd23fe">locals_in_py</a> <span class="keywordflow">and</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a30058e5e628d60dedf7c500e270b3e5d">pystate</a>) <span class="keywordflow">or</span> {} -<a name="l01050"></a>01050 interp = InteractiveConsole(locals=localvars) -<a name="l01051"></a>01051 interp.runcode(<span class="stringliteral">'import sys, os;sys.path.insert(0, os.getcwd())'</span>) -<a name="l01052"></a>01052 <span class="keywordflow">if</span> arg.strip(): -<a name="l01053"></a>01053 interp.runcode(arg) -<a name="l01054"></a>01054 <span class="keywordflow">else</span>: -<a name="l01055"></a>01055 <span class="keyword">def </span>quit(): -<a name="l01056"></a>01056 <span class="keywordflow">raise</span> EmbeddedConsoleExit -<a name="l01057"></a>01057 <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#ac188a434c9c7d5c939e971a3d42c1c63">onecmd_plus_hooks</a>(arg): -<a name="l01058"></a>01058 <span class="keywordflow">return</span> self.<a class="code" href="classcmd2_1_1Cmd.html#ac188a434c9c7d5c939e971a3d42c1c63">onecmd_plus_hooks</a>(arg + <span class="stringliteral">'\n'</span>) -<a name="l01059"></a>01059 <span class="keyword">def </span>run(arg): -<a name="l01060"></a>01060 <span class="keywordflow">try</span>: -<a name="l01061"></a>01061 file = open(arg) -<a name="l01062"></a>01062 interp.runcode(file.read()) -<a name="l01063"></a>01063 file.close() -<a name="l01064"></a>01064 <span class="keywordflow">except</span> IOError, e: -<a name="l01065"></a>01065 self.<a class="code" href="classcmd2_1_1Cmd.html#a118c16455f28dbd3918b565bca086db4">perror</a>(e) -<a name="l01066"></a>01066 self.<a class="code" href="classcmd2_1_1Cmd.html#a30058e5e628d60dedf7c500e270b3e5d">pystate</a>[<span class="stringliteral">'quit'</span>] = quit -<a name="l01067"></a>01067 self.<a class="code" href="classcmd2_1_1Cmd.html#a30058e5e628d60dedf7c500e270b3e5d">pystate</a>[<span class="stringliteral">'exit'</span>] = quit -<a name="l01068"></a>01068 self.<a class="code" href="classcmd2_1_1Cmd.html#a30058e5e628d60dedf7c500e270b3e5d">pystate</a>[<span class="stringliteral">'cmd'</span>] = onecmd_plus_hooks -<a name="l01069"></a>01069 self.<a class="code" href="classcmd2_1_1Cmd.html#a30058e5e628d60dedf7c500e270b3e5d">pystate</a>[<span class="stringliteral">'run'</span>] = run -<a name="l01070"></a>01070 <span class="keywordflow">try</span>: -<a name="l01071"></a>01071 cprt = <span class="stringliteral">'Type "help", "copyright", "credits" or "license" for more information.'</span> -<a name="l01072"></a>01072 keepstate = <a class="code" href="classcmd2_1_1Statekeeper.html">Statekeeper</a>(sys, (<span class="stringliteral">'stdin'</span>,<span class="stringliteral">'stdout'</span>)) -<a name="l01073"></a>01073 sys.stdout = self.<a class="code" href="classcmd2_1_1Cmd.html#a2a71ccfd9f189e17db765b603f2c9a78">stdout</a> -<a name="l01074"></a>01074 sys.stdin = self.<a class="code" href="classcmd2_1_1Cmd.html#a6f0eed071b4e9197cc4fa46a2c8f1457">stdin</a> -<a name="l01075"></a>01075 interp.interact(banner= <span class="stringliteral">"Python %s on %s\n%s\n(%s)\n%s"</span> % -<a name="l01076"></a>01076 (sys.version, sys.platform, cprt, self.__class__.__name__, self.<a class="code" href="classcmd2_1_1Cmd.html#a5ccce52c26063115070d56b6f099223b">do_py</a>.__doc__)) -<a name="l01077"></a>01077 <span class="keywordflow">except</span> EmbeddedConsoleExit: -<a name="l01078"></a>01078 <span class="keywordflow">pass</span> -<a name="l01079"></a>01079 keepstate.restore() -<a name="l01080"></a>01080 -<a name="l01081"></a>01081 @<a class="code" href="namespacecmd2.html#a863be2c5e3b9fdec03710fd550801c22">options</a>([make_option(<span class="stringliteral">'-s'</span>, <span class="stringliteral">'--script'</span>, action=<span class="stringliteral">"store_true"</span>, help=<span class="stringliteral">"Script format; no separation lines"</span>), -<a name="l01082"></a>01082 ], arg_desc = <span class="stringliteral">'(limit on which commands to include)'</span>) -<a name="l01083"></a><a class="code" href="classcmd2_1_1Cmd.html#a46d9a5551bb0456721a0bf7dc07b0d0b">01083</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a46d9a5551bb0456721a0bf7dc07b0d0b">do_history</a>(self, arg, opts): -<a name="l01084"></a>01084 <span class="stringliteral">"""history [arg]: lists past commands issued</span> -<a name="l01085"></a>01085 <span class="stringliteral"> </span> -<a name="l01086"></a>01086 <span class="stringliteral"> | no arg: list all</span> -<a name="l01087"></a>01087 <span class="stringliteral"> | arg is integer: list one history item, by index</span> -<a name="l01088"></a>01088 <span class="stringliteral"> | arg is string: string search</span> -<a name="l01089"></a>01089 <span class="stringliteral"> | arg is /enclosed in forward-slashes/: regular expression search</span> -<a name="l01090"></a>01090 <span class="stringliteral"> """</span> -<a name="l01091"></a>01091 <span class="keywordflow">if</span> arg: -<a name="l01092"></a>01092 history = self.history.get(arg) -<a name="l01093"></a>01093 <span class="keywordflow">else</span>: -<a name="l01094"></a>01094 history = self.<a class="code" href="classcmd2_1_1Cmd.html#a666a090bc7298aae6ca55840e9418f96">history</a> -<a name="l01095"></a>01095 <span class="keywordflow">for</span> hi <span class="keywordflow">in</span> history: -<a name="l01096"></a>01096 <span class="keywordflow">if</span> opts.script: -<a name="l01097"></a>01097 self.<a class="code" href="classcmd2_1_1Cmd.html#ad8b5d33873f9b515e33f83a616d0828f">poutput</a>(hi) -<a name="l01098"></a>01098 <span class="keywordflow">else</span>: -<a name="l01099"></a>01099 self.stdout.write(hi.pr()) -<a name="l01100"></a><a class="code" href="classcmd2_1_1Cmd.html#aea5c4d49c7b6f552b6123e5a981a6f49">01100</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#aea5c4d49c7b6f552b6123e5a981a6f49">last_matching</a>(self, arg): -<a name="l01101"></a>01101 <span class="keywordflow">try</span>: -<a name="l01102"></a>01102 <span class="keywordflow">if</span> arg: -<a name="l01103"></a>01103 <span class="keywordflow">return</span> self.history.get(arg)[-1] -<a name="l01104"></a>01104 <span class="keywordflow">else</span>: -<a name="l01105"></a>01105 <span class="keywordflow">return</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a666a090bc7298aae6ca55840e9418f96">history</a>[-1] -<a name="l01106"></a>01106 <span class="keywordflow">except</span> IndexError: -<a name="l01107"></a>01107 <span class="keywordflow">return</span> <span class="keywordtype">None</span> -<a name="l01108"></a><a class="code" href="classcmd2_1_1Cmd.html#af278702e71cf57de45012216904d1bb5">01108</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#af278702e71cf57de45012216904d1bb5">do_list</a>(self, arg): -<a name="l01109"></a>01109 <span class="stringliteral">"""list [arg]: lists last command issued</span> -<a name="l01110"></a>01110 <span class="stringliteral"> </span> -<a name="l01111"></a>01111 <span class="stringliteral"> no arg -> list most recent command</span> -<a name="l01112"></a>01112 <span class="stringliteral"> arg is integer -> list one history item, by index</span> -<a name="l01113"></a>01113 <span class="stringliteral"> a..b, a:b, a:, ..b -> list spans from a (or start) to b (or end)</span> -<a name="l01114"></a>01114 <span class="stringliteral"> arg is string -> list all commands matching string search</span> -<a name="l01115"></a>01115 <span class="stringliteral"> arg is /enclosed in forward-slashes/ -> regular expression search</span> -<a name="l01116"></a>01116 <span class="stringliteral"> """</span> -<a name="l01117"></a>01117 <span class="keywordflow">try</span>: -<a name="l01118"></a>01118 history = self.history.span(arg <span class="keywordflow">or</span> <span class="stringliteral">'-1'</span>) -<a name="l01119"></a>01119 <span class="keywordflow">except</span> IndexError: -<a name="l01120"></a>01120 history = self.history.search(arg) -<a name="l01121"></a>01121 <span class="keywordflow">for</span> hi <span class="keywordflow">in</span> history: -<a name="l01122"></a>01122 self.<a class="code" href="classcmd2_1_1Cmd.html#ad8b5d33873f9b515e33f83a616d0828f">poutput</a>(hi.pr()) -<a name="l01123"></a>01123 -<a name="l01124"></a><a class="code" href="classcmd2_1_1Cmd.html#a71e16c0eab993aa6f22272e04615fa4e">01124</a> do_hi = do_history -<a name="l01125"></a><a class="code" href="classcmd2_1_1Cmd.html#a978b02763d086aa3f4a278c370b6798f">01125</a> do_l = do_list -<a name="l01126"></a><a class="code" href="classcmd2_1_1Cmd.html#a0be8d5c8676c2da5eacb8dbaf2e10e29">01126</a> do_li = do_list -<a name="l01127"></a>01127 -<a name="l01128"></a><a class="code" href="classcmd2_1_1Cmd.html#aebdc7ebb6dc83e9dadb8827cdab1952a">01128</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#aebdc7ebb6dc83e9dadb8827cdab1952a">do_ed</a>(self, arg): -<a name="l01129"></a>01129 <span class="stringliteral">"""ed: edit most recent command in text editor</span> -<a name="l01130"></a>01130 <span class="stringliteral"> ed [N]: edit numbered command from history</span> -<a name="l01131"></a>01131 <span class="stringliteral"> ed [filename]: edit specified file name</span> -<a name="l01132"></a>01132 <span class="stringliteral"> </span> -<a name="l01133"></a>01133 <span class="stringliteral"> commands are run after editor is closed.</span> -<a name="l01134"></a>01134 <span class="stringliteral"> "set edit (program-name)" or set EDITOR environment variable</span> -<a name="l01135"></a>01135 <span class="stringliteral"> to control which editing program is used."""</span> -<a name="l01136"></a>01136 <span class="keywordflow">if</span> <span class="keywordflow">not</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a25fe904aca52573c6f10e798dd561588">editor</a>: -<a name="l01137"></a>01137 <span class="keywordflow">raise</span> EnvironmentError(<span class="stringliteral">"Please use 'set editor' to specify your text editing program of choice."</span>) -<a name="l01138"></a>01138 filename = self.<a class="code" href="classcmd2_1_1Cmd.html#a3af82e64cdabf19b462cd0ddf686823d">default_file_name</a> -<a name="l01139"></a>01139 <span class="keywordflow">if</span> arg: -<a name="l01140"></a>01140 <span class="keywordflow">try</span>: -<a name="l01141"></a>01141 buffer = self.<a class="code" href="classcmd2_1_1Cmd.html#aea5c4d49c7b6f552b6123e5a981a6f49">last_matching</a>(int(arg)) -<a name="l01142"></a>01142 <span class="keywordflow">except</span> ValueError: -<a name="l01143"></a>01143 filename = arg -<a name="l01144"></a>01144 buffer = <span class="stringliteral">''</span> -<a name="l01145"></a>01145 <span class="keywordflow">else</span>: -<a name="l01146"></a>01146 buffer = self.<a class="code" href="classcmd2_1_1Cmd.html#a666a090bc7298aae6ca55840e9418f96">history</a>[-1] -<a name="l01147"></a>01147 -<a name="l01148"></a>01148 <span class="keywordflow">if</span> buffer: -<a name="l01149"></a>01149 f = open(os.path.expanduser(filename), <span class="stringliteral">'w'</span>) -<a name="l01150"></a>01150 f.write(buffer <span class="keywordflow">or</span> <span class="stringliteral">''</span>) -<a name="l01151"></a>01151 f.close() -<a name="l01152"></a>01152 -<a name="l01153"></a>01153 os.system(<span class="stringliteral">'%s %s'</span> % (self.<a class="code" href="classcmd2_1_1Cmd.html#a25fe904aca52573c6f10e798dd561588">editor</a>, filename)) -<a name="l01154"></a>01154 self.<a class="code" href="classcmd2_1_1Cmd.html#a3a237dae48a4dba0daa7e114ff098e90">do__load</a>(filename) -<a name="l01155"></a><a class="code" href="classcmd2_1_1Cmd.html#a900317e58aad07d0d1fb48080dc63d5c">01155</a> do_edit = do_ed -<a name="l01156"></a>01156 -<a name="l01157"></a><a class="code" href="classcmd2_1_1Cmd.html#aafc3b1cd861e711c3f5e10cd00a41221">01157</a> saveparser = (pyparsing.Optional(pyparsing.Word(pyparsing.nums)^<span class="stringliteral">'*'</span>)(<span class="stringliteral">"idx"</span>) + -<a name="l01158"></a>01158 pyparsing.Optional(pyparsing.Word(legalChars + <span class="stringliteral">'/\\'</span>))(<span class="stringliteral">"fname"</span>) + -<a name="l01159"></a>01159 pyparsing.stringEnd) -<a name="l01160"></a><a class="code" href="classcmd2_1_1Cmd.html#a12d5262e31e148dafea6017a356ed9cd">01160</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a12d5262e31e148dafea6017a356ed9cd">do_save</a>(self, arg): -<a name="l01161"></a>01161 <span class="stringliteral">"""`save [N] [filename.ext]`</span> -<a name="l01162"></a>01162 <span class="stringliteral"></span> -<a name="l01163"></a>01163 <span class="stringliteral"> Saves command from history to file.</span> -<a name="l01164"></a>01164 <span class="stringliteral"></span> -<a name="l01165"></a>01165 <span class="stringliteral"> | N => Number of command (from history), or `*`; </span> -<a name="l01166"></a>01166 <span class="stringliteral"> | most recent command if omitted"""</span> -<a name="l01167"></a>01167 -<a name="l01168"></a>01168 <span class="keywordflow">try</span>: -<a name="l01169"></a>01169 args = self.saveparser.parseString(arg) -<a name="l01170"></a>01170 <span class="keywordflow">except</span> pyparsing.ParseException: -<a name="l01171"></a>01171 self.<a class="code" href="classcmd2_1_1Cmd.html#a118c16455f28dbd3918b565bca086db4">perror</a>(<span class="stringliteral">'Could not understand save target %s'</span> % arg) -<a name="l01172"></a>01172 <span class="keywordflow">raise</span> SyntaxError(self.<a class="code" href="classcmd2_1_1Cmd.html#a12d5262e31e148dafea6017a356ed9cd">do_save</a>.__doc__) -<a name="l01173"></a>01173 fname = args.fname <span class="keywordflow">or</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a3af82e64cdabf19b462cd0ddf686823d">default_file_name</a> -<a name="l01174"></a>01174 <span class="keywordflow">if</span> args.idx == <span class="stringliteral">'*'</span>: -<a name="l01175"></a>01175 saveme = <span class="stringliteral">'\n\n'</span>.join(self.<a class="code" href="classcmd2_1_1Cmd.html#a666a090bc7298aae6ca55840e9418f96">history</a>[:]) -<a name="l01176"></a>01176 <span class="keywordflow">elif</span> args.idx: -<a name="l01177"></a>01177 saveme = self.<a class="code" href="classcmd2_1_1Cmd.html#a666a090bc7298aae6ca55840e9418f96">history</a>[int(args.idx)-1] -<a name="l01178"></a>01178 <span class="keywordflow">else</span>: -<a name="l01179"></a>01179 saveme = self.<a class="code" href="classcmd2_1_1Cmd.html#a666a090bc7298aae6ca55840e9418f96">history</a>[-1] -<a name="l01180"></a>01180 <span class="keywordflow">try</span>: -<a name="l01181"></a>01181 f = open(os.path.expanduser(fname), <span class="stringliteral">'w'</span>) -<a name="l01182"></a>01182 f.write(saveme) -<a name="l01183"></a>01183 f.close() -<a name="l01184"></a>01184 self.<a class="code" href="classcmd2_1_1Cmd.html#a122b67681a0db23863f5ddaa7a687975">pfeedback</a>(<span class="stringliteral">'Saved to %s'</span> % (fname)) -<a name="l01185"></a>01185 <span class="keywordflow">except</span> Exception, e: -<a name="l01186"></a>01186 self.<a class="code" href="classcmd2_1_1Cmd.html#a118c16455f28dbd3918b565bca086db4">perror</a>(<span class="stringliteral">'Error saving %s'</span> % (fname)) -<a name="l01187"></a>01187 <span class="keywordflow">raise</span> -<a name="l01188"></a>01188 -<a name="l01189"></a><a class="code" href="classcmd2_1_1Cmd.html#a2eba6d3d12d65789880959d788be2d86">01189</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a2eba6d3d12d65789880959d788be2d86">read_file_or_url</a>(self, fname): -<a name="l01190"></a>01190 <span class="comment"># TODO: not working on localhost</span> -<a name="l01191"></a>01191 <span class="keywordflow">if</span> isinstance(fname, file): -<a name="l01192"></a>01192 result = open(fname, <span class="stringliteral">'</span><span class="stringliteral">r')</span> -<a name="l01193"></a>01193 <span class="stringliteral"> </span><span class="keywordflow">else</span>: -<a name="l01194"></a>01194 match = self.urlre.match(fname) -<a name="l01195"></a>01195 <span class="keywordflow">if</span> match: -<a name="l01196"></a>01196 result = urllib.urlopen(match.group(1)) -<a name="l01197"></a>01197 <span class="keywordflow">else</span>: -<a name="l01198"></a>01198 fname = os.path.expanduser(fname) -<a name="l01199"></a>01199 <span class="keywordflow">try</span>: -<a name="l01200"></a>01200 result = open(os.path.expanduser(fname), <span class="stringliteral">'</span><span class="stringliteral">r')</span> -<a name="l01201"></a>01201 <span class="stringliteral"> </span><span class="keywordflow">except</span> IOError: -<a name="l01202"></a>01202 result = open(<span class="stringliteral">'%s.%s'</span> % (os.path.expanduser(fname), -<a name="l01203"></a>01203 self.<a class="code" href="classcmd2_1_1Cmd.html#ab14061f1d84f49fb8fefcce285e7aec7">defaultExtension</a>), <span class="stringliteral">'</span><span class="stringliteral">r')</span> -<a name="l01204"></a>01204 <span class="stringliteral"> </span><span class="keywordflow">return</span> result -<a name="l01205"></a>01205 -<a name="l01206"></a><a class="code" href="classcmd2_1_1Cmd.html#aa084d0f962d9ea060c935ff6a9cf74a8">01206</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#aa084d0f962d9ea060c935ff6a9cf74a8">do__relative_load</a>(self, arg=None): -<a name="l01207"></a>01207 <span class="stringliteral">'''</span> -<a name="l01208"></a>01208 <span class="stringliteral"> Runs commands in script at file or URL; if this is called from within an</span> -<a name="l01209"></a>01209 <span class="stringliteral"> already-running script, the filename will be interpreted relative to the </span> -<a name="l01210"></a>01210 <span class="stringliteral"> already-running script's directory.'''</span> -<a name="l01211"></a>01211 <span class="keywordflow">if</span> arg: -<a name="l01212"></a>01212 arg = arg.split(<span class="keywordtype">None</span>, 1) -<a name="l01213"></a>01213 targetname, args = arg[0], (arg[1:] <span class="keywordflow">or</span> [<span class="stringliteral">''</span>])[0] -<a name="l01214"></a>01214 targetname = os.path.join(self.<a class="code" href="classcmd2_1_1Cmd.html#a549399bed9574c87901100530343ac68">current_script_dir</a> <span class="keywordflow">or</span> <span class="stringliteral">''</span>, targetname) -<a name="l01215"></a>01215 self.<a class="code" href="classcmd2_1_1Cmd.html#a3a237dae48a4dba0daa7e114ff098e90">do__load</a>(<span class="stringliteral">'%s %s'</span> % (targetname, args)) -<a name="l01216"></a>01216 -<a name="l01217"></a><a class="code" href="classcmd2_1_1Cmd.html#ad8c02476fc0918fde1093ce103be09de">01217</a> urlre = re.compile(<span class="stringliteral">'(https?://[-\\w\\./]+)'</span>) -<a name="l01218"></a><a class="code" href="classcmd2_1_1Cmd.html#add0217858bbc4c268a5f2f27330ad1f8">01218</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a8b8c98ab5e1b98e618a5a9122c50fc74">do_load</a>(self, arg=None): -<a name="l01219"></a>01219 <span class="stringliteral">"""Runs script of command(s) from a file or URL."""</span> -<a name="l01220"></a>01220 <span class="keywordflow">if</span> arg <span class="keywordflow">is</span> <span class="keywordtype">None</span>: -<a name="l01221"></a>01221 targetname = self.<a class="code" href="classcmd2_1_1Cmd.html#a3af82e64cdabf19b462cd0ddf686823d">default_file_name</a> -<a name="l01222"></a>01222 <span class="keywordflow">else</span>: -<a name="l01223"></a>01223 arg = arg.split(<span class="keywordtype">None</span>, 1) -<a name="l01224"></a>01224 targetname, args = arg[0], (arg[1:] <span class="keywordflow">or</span> [<span class="stringliteral">''</span>])[0].strip() -<a name="l01225"></a>01225 <span class="keywordflow">try</span>: -<a name="l01226"></a>01226 target = self.<a class="code" href="classcmd2_1_1Cmd.html#a2eba6d3d12d65789880959d788be2d86">read_file_or_url</a>(targetname) -<a name="l01227"></a>01227 <span class="keywordflow">except</span> IOError, e: -<a name="l01228"></a>01228 self.<a class="code" href="classcmd2_1_1Cmd.html#a118c16455f28dbd3918b565bca086db4">perror</a>(<span class="stringliteral">'Problem accessing script from %s: \n%s'</span> % (targetname, e)) -<a name="l01229"></a>01229 <span class="keywordflow">return</span> -<a name="l01230"></a>01230 keepstate = <a class="code" href="classcmd2_1_1Statekeeper.html">Statekeeper</a>(self, (<span class="stringliteral">'stdin'</span>,<span class="stringliteral">'use_rawinput'</span>,<span class="stringliteral">'prompt'</span>, -<a name="l01231"></a>01231 <span class="stringliteral">'continuation_prompt'</span>,<span class="stringliteral">'current_script_dir'</span>)) -<a name="l01232"></a>01232 self.<a class="code" href="classcmd2_1_1Cmd.html#a6f0eed071b4e9197cc4fa46a2c8f1457">stdin</a> = target -<a name="l01233"></a>01233 self.<a class="code" href="classcmd2_1_1Cmd.html#add0217858bbc4c268a5f2f27330ad1f8">use_rawinput</a> = <span class="keyword">False</span> -<a name="l01234"></a>01234 self.<a class="code" href="classcmd2_1_1Cmd.html#ae9a33dc613b00f4d5b849c0d3521f2c3">prompt</a> = self.<a class="code" href="classcmd2_1_1Cmd.html#a186ca22e76dc63ad9d8a95cfaeb4f7fd">continuation_prompt</a> = <span class="stringliteral">''</span> -<a name="l01235"></a>01235 self.<a class="code" href="classcmd2_1_1Cmd.html#a549399bed9574c87901100530343ac68">current_script_dir</a> = os.path.split(targetname)[0] -<a name="l01236"></a>01236 stop = self.<a class="code" href="classcmd2_1_1Cmd.html#a392c5cd062c20d916c0cacc9cc36c022">_cmdloop</a>() -<a name="l01237"></a>01237 self.stdin.close() -<a name="l01238"></a>01238 keepstate.restore() -<a name="l01239"></a>01239 self.<a class="code" href="classcmd2_1_1Cmd.html#adaaec8df571e88463c3b8b02fefea8b2">lastcmd</a> = <span class="stringliteral">''</span> -<a name="l01240"></a>01240 <span class="keywordflow">return</span> stop <span class="keywordflow">and</span> (stop != self.<a class="code" href="classcmd2_1_1Cmd.html#abe14bda0dc50326876c6a761cefba702">_STOP_SCRIPT_NO_EXIT</a>) -<a name="l01241"></a><a class="code" href="classcmd2_1_1Cmd.html#a3a237dae48a4dba0daa7e114ff098e90">01241</a> do__load = do_load <span class="comment"># avoid an unfortunate legacy use of do_load from sqlpython</span> -<a name="l01242"></a>01242 -<a name="l01243"></a><a class="code" href="classcmd2_1_1Cmd.html#aafd86f263566aa4f2b5bd3c3ea64c678">01243</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#aafd86f263566aa4f2b5bd3c3ea64c678">do_run</a>(self, arg): -<a name="l01244"></a>01244 <span class="stringliteral">"""run [arg]: re-runs an earlier command</span> -<a name="l01245"></a>01245 <span class="stringliteral"> </span> -<a name="l01246"></a>01246 <span class="stringliteral"> no arg -> run most recent command</span> -<a name="l01247"></a>01247 <span class="stringliteral"> arg is integer -> run one history item, by index</span> -<a name="l01248"></a>01248 <span class="stringliteral"> arg is string -> run most recent command by string search</span> -<a name="l01249"></a>01249 <span class="stringliteral"> arg is /enclosed in forward-slashes/ -> run most recent by regex</span> -<a name="l01250"></a>01250 <span class="stringliteral"> """</span> -<a name="l01251"></a>01251 <span class="stringliteral">'run [N]: runs the SQL that was run N commands ago'</span> -<a name="l01252"></a>01252 runme = self.<a class="code" href="classcmd2_1_1Cmd.html#aea5c4d49c7b6f552b6123e5a981a6f49">last_matching</a>(arg) -<a name="l01253"></a>01253 self.<a class="code" href="classcmd2_1_1Cmd.html#a122b67681a0db23863f5ddaa7a687975">pfeedback</a>(runme) -<a name="l01254"></a>01254 <span class="keywordflow">if</span> runme: -<a name="l01255"></a>01255 stop = self.<a class="code" href="classcmd2_1_1Cmd.html#ac188a434c9c7d5c939e971a3d42c1c63">onecmd_plus_hooks</a>(runme) -<a name="l01256"></a><a class="code" href="classcmd2_1_1Cmd.html#a0a9b6e01b7ac4efb65f2957c28949e87">01256</a> do_r = do_run -<a name="l01257"></a>01257 -<a name="l01258"></a><a class="code" href="classcmd2_1_1Cmd.html#a66160524beda7b75d70070bebce69e42">01258</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a66160524beda7b75d70070bebce69e42">fileimport</a>(self, statement, source): -<a name="l01259"></a>01259 <span class="keywordflow">try</span>: -<a name="l01260"></a>01260 f = open(os.path.expanduser(source)) -<a name="l01261"></a>01261 <span class="keywordflow">except</span> IOError: -<a name="l01262"></a>01262 self.stdout.write(<span class="stringliteral">"Couldn't read from file %s\n"</span> % source) -<a name="l01263"></a>01263 <span class="keywordflow">return</span> <span class="stringliteral">''</span> -<a name="l01264"></a>01264 data = f.read() -<a name="l01265"></a>01265 f.close() -<a name="l01266"></a>01266 <span class="keywordflow">return</span> data -<a name="l01267"></a>01267 -<a name="l01268"></a><a class="code" href="classcmd2_1_1Cmd.html#a160c7a080d222defe32c781138901d4e">01268</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a160c7a080d222defe32c781138901d4e">runTranscriptTests</a>(self, callargs): -<a name="l01269"></a>01269 <span class="keyword">class </span>TestMyAppCase(<a class="code" href="classcmd2_1_1Cmd2TestCase.html">Cmd2TestCase</a>): -<a name="l01270"></a>01270 CmdApp = self.__class__ -<a name="l01271"></a>01271 self.__class__.testfiles = callargs -<a name="l01272"></a>01272 sys.argv = [sys.argv[0]] <span class="comment"># the --test argument upsets unittest.main()</span> -<a name="l01273"></a>01273 testcase = TestMyAppCase() -<a name="l01274"></a>01274 runner = unittest.TextTestRunner() -<a name="l01275"></a>01275 result = runner.run(testcase) -<a name="l01276"></a>01276 result.printErrors() -<a name="l01277"></a>01277 -<a name="l01278"></a><a class="code" href="classcmd2_1_1Cmd.html#a19b932e21ac917375f16457c986ad4f6">01278</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a19b932e21ac917375f16457c986ad4f6">run_commands_at_invocation</a>(self, callargs): -<a name="l01279"></a>01279 <span class="keywordflow">for</span> initial_command <span class="keywordflow">in</span> callargs: -<a name="l01280"></a>01280 <span class="keywordflow">if</span> self.<a class="code" href="classcmd2_1_1Cmd.html#ac188a434c9c7d5c939e971a3d42c1c63">onecmd_plus_hooks</a>(initial_command + <span class="stringliteral">'\n'</span>): -<a name="l01281"></a>01281 <span class="keywordflow">return</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a7a8e8257d7d35c7813355cdefb62b85b">_STOP_AND_EXIT</a> -<a name="l01282"></a>01282 -<a name="l01283"></a><a class="code" href="classcmd2_1_1Cmd.html#a0e5f32e5ab972e32273ef5d69de81afc">01283</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd.html#a0e5f32e5ab972e32273ef5d69de81afc">cmdloop</a>(self): -<a name="l01284"></a>01284 parser = optparse.OptionParser() -<a name="l01285"></a>01285 parser.add_option(<span class="stringliteral">'-t'</span>, <span class="stringliteral">'--test'</span>, dest=<span class="stringliteral">'test'</span>, -<a name="l01286"></a>01286 action=<span class="stringliteral">"store_true"</span>, -<a name="l01287"></a>01287 help=<span class="stringliteral">'Test against transcript(s) in FILE (wildcards OK)'</span>) -<a name="l01288"></a>01288 (callopts, callargs) = parser.parse_args() -<a name="l01289"></a>01289 <span class="keywordflow">if</span> callopts.test: -<a name="l01290"></a>01290 self.<a class="code" href="classcmd2_1_1Cmd.html#a160c7a080d222defe32c781138901d4e">runTranscriptTests</a>(callargs) -<a name="l01291"></a>01291 <span class="keywordflow">else</span>: -<a name="l01292"></a>01292 <span class="keywordflow">if</span> <span class="keywordflow">not</span> self.<a class="code" href="classcmd2_1_1Cmd.html#a19b932e21ac917375f16457c986ad4f6">run_commands_at_invocation</a>(callargs): -<a name="l01293"></a>01293 self.<a class="code" href="classcmd2_1_1Cmd.html#a392c5cd062c20d916c0cacc9cc36c022">_cmdloop</a>() -<a name="l01294"></a>01294 -<a name="l01295"></a><a class="code" href="classcmd2_1_1HistoryItem.html">01295</a> <span class="keyword">class </span><a class="code" href="classcmd2_1_1HistoryItem.html">HistoryItem</a>(str): -<a name="l01296"></a><a class="code" href="classcmd2_1_1HistoryItem.html#ac496a3283d2754e61e156ddbf2370259">01296</a> listformat = <span class="stringliteral">'-------------------------[%d]\n%s\n'</span> -<a name="l01297"></a><a class="code" href="classcmd2_1_1HistoryItem.html#a74c5f486309e86773802f72335ff4252">01297</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1HistoryItem.html#ab873a526e5978d15a16fddae74005471">__init__</a>(self, instr): -<a name="l01298"></a>01298 str.__init__(self) -<a name="l01299"></a>01299 self.<a class="code" href="classcmd2_1_1HistoryItem.html#a74c5f486309e86773802f72335ff4252">lowercase</a> = self.lower() -<a name="l01300"></a>01300 self.<a class="code" href="classcmd2_1_1HistoryItem.html#a83243fbd9faac88d0fb2c13473029d12">idx</a> = <span class="keywordtype">None</span> -<a name="l01301"></a><a class="code" href="classcmd2_1_1HistoryItem.html#af49dd31da48eafd74653503a69eae230">01301</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1HistoryItem.html#af49dd31da48eafd74653503a69eae230">pr</a>(self): -<a name="l01302"></a>01302 <span class="keywordflow">return</span> self.<a class="code" href="classcmd2_1_1HistoryItem.html#ac496a3283d2754e61e156ddbf2370259">listformat</a> % (self.<a class="code" href="classcmd2_1_1HistoryItem.html#a83243fbd9faac88d0fb2c13473029d12">idx</a>, str(self)) -<a name="l01303"></a>01303 -<a name="l01304"></a><a class="code" href="classcmd2_1_1History.html">01304</a> <span class="keyword">class </span><a class="code" href="classcmd2_1_1History.html">History</a>(list): -<a name="l01305"></a>01305 <span class="stringliteral">'''A list of HistoryItems that knows how to respond to user requests.</span> -<a name="l01306"></a>01306 <span class="stringliteral"> >>> h = History([HistoryItem('first'), HistoryItem('second'), HistoryItem('third'), HistoryItem('fourth')])</span> -<a name="l01307"></a>01307 <span class="stringliteral"> >>> h.span('-2..')</span> -<a name="l01308"></a>01308 <span class="stringliteral"> ['third', 'fourth']</span> -<a name="l01309"></a>01309 <span class="stringliteral"> >>> h.span('2..3')</span> -<a name="l01310"></a>01310 <span class="stringliteral"> ['second', 'third']</span> -<a name="l01311"></a>01311 <span class="stringliteral"> >>> h.span('3')</span> -<a name="l01312"></a>01312 <span class="stringliteral"> ['third'] </span> -<a name="l01313"></a>01313 <span class="stringliteral"> >>> h.span(':')</span> -<a name="l01314"></a>01314 <span class="stringliteral"> ['first', 'second', 'third', 'fourth']</span> -<a name="l01315"></a>01315 <span class="stringliteral"> >>> h.span('2..')</span> -<a name="l01316"></a>01316 <span class="stringliteral"> ['second', 'third', 'fourth']</span> -<a name="l01317"></a>01317 <span class="stringliteral"> >>> h.span('-1')</span> -<a name="l01318"></a>01318 <span class="stringliteral"> ['fourth'] </span> -<a name="l01319"></a>01319 <span class="stringliteral"> >>> h.span('-2..-3')</span> -<a name="l01320"></a>01320 <span class="stringliteral"> ['third', 'second'] </span> -<a name="l01321"></a>01321 <span class="stringliteral"> >>> h.search('o')</span> -<a name="l01322"></a>01322 <span class="stringliteral"> ['second', 'fourth']</span> -<a name="l01323"></a>01323 <span class="stringliteral"> >>> h.search('/IR/')</span> -<a name="l01324"></a>01324 <span class="stringliteral"> ['first', 'third']</span> -<a name="l01325"></a>01325 <span class="stringliteral"> '''</span> -<a name="l01326"></a><a class="code" href="classcmd2_1_1History.html#accd354b7c81e1cd538438b834630f3ac">01326</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1History.html#accd354b7c81e1cd538438b834630f3ac">zero_based_index</a>(self, onebased): -<a name="l01327"></a>01327 result = onebased -<a name="l01328"></a>01328 <span class="keywordflow">if</span> result > 0: -<a name="l01329"></a>01329 result -= 1 -<a name="l01330"></a>01330 <span class="keywordflow">return</span> result -<a name="l01331"></a><a class="code" href="classcmd2_1_1History.html#a28fe5dc698da4c7bf82fdcdfb2e70506">01331</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1History.html#a28fe5dc698da4c7bf82fdcdfb2e70506">to_index</a>(self, raw): -<a name="l01332"></a>01332 <span class="keywordflow">if</span> raw: -<a name="l01333"></a>01333 result = self.<a class="code" href="classcmd2_1_1History.html#accd354b7c81e1cd538438b834630f3ac">zero_based_index</a>(int(raw)) -<a name="l01334"></a>01334 <span class="keywordflow">else</span>: -<a name="l01335"></a>01335 result = <span class="keywordtype">None</span> -<a name="l01336"></a>01336 <span class="keywordflow">return</span> result -<a name="l01337"></a><a class="code" href="classcmd2_1_1History.html#ae1db5657367e6aa9b0e43811d5b8893f">01337</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1History.html#ae1db5657367e6aa9b0e43811d5b8893f">search</a>(self, target): -<a name="l01338"></a>01338 target = target.strip() -<a name="l01339"></a>01339 <span class="keywordflow">if</span> target[0] == target[-1] == <span class="stringliteral">'/'</span> <span class="keywordflow">and</span> len(target) > 1: -<a name="l01340"></a>01340 target = target[1:-1] -<a name="l01341"></a>01341 <span class="keywordflow">else</span>: -<a name="l01342"></a>01342 target = re.escape(target) -<a name="l01343"></a>01343 pattern = re.compile(target, re.IGNORECASE) -<a name="l01344"></a>01344 <span class="keywordflow">return</span> [s <span class="keywordflow">for</span> s <span class="keywordflow">in</span> self <span class="keywordflow">if</span> pattern.search(s)] -<a name="l01345"></a><a class="code" href="classcmd2_1_1History.html#aa5204f159577beb16f07a8a9ada184ec">01345</a> spanpattern = re.compile(<span class="stringliteral">r'^\s*(?P<start>\-?\d+)?\s*(?P<separator>:|(\.{2,}))?\s*(?P<end>\-?\d+)?\s*$'</span>) -<a name="l01346"></a><a class="code" href="classcmd2_1_1History.html#a8c0837240ac7747aa804ba9eebddab60">01346</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1History.html#a8c0837240ac7747aa804ba9eebddab60">span</a>(self, raw): -<a name="l01347"></a>01347 <span class="keywordflow">if</span> raw.lower() <span class="keywordflow">in</span> (<span class="stringliteral">'*'</span>, <span class="stringliteral">'-'</span>, <span class="stringliteral">'all'</span>): -<a name="l01348"></a>01348 raw = <span class="stringliteral">':'</span> -<a name="l01349"></a>01349 results = self.spanpattern.search(raw) -<a name="l01350"></a>01350 <span class="keywordflow">if</span> <span class="keywordflow">not</span> results: -<a name="l01351"></a>01351 <span class="keywordflow">raise</span> IndexError -<a name="l01352"></a>01352 <span class="keywordflow">if</span> <span class="keywordflow">not</span> results.group(<span class="stringliteral">'separator'</span>): -<a name="l01353"></a>01353 <span class="keywordflow">return</span> [self[self.<a class="code" href="classcmd2_1_1History.html#a28fe5dc698da4c7bf82fdcdfb2e70506">to_index</a>(results.group(<span class="stringliteral">'start'</span>))]] -<a name="l01354"></a>01354 start = self.<a class="code" href="classcmd2_1_1History.html#a28fe5dc698da4c7bf82fdcdfb2e70506">to_index</a>(results.group(<span class="stringliteral">'start'</span>)) -<a name="l01355"></a>01355 end = self.<a class="code" href="classcmd2_1_1History.html#a28fe5dc698da4c7bf82fdcdfb2e70506">to_index</a>(results.group(<span class="stringliteral">'end'</span>)) -<a name="l01356"></a>01356 reverse = <span class="keyword">False</span> -<a name="l01357"></a>01357 <span class="keywordflow">if</span> end <span class="keywordflow">is</span> <span class="keywordflow">not</span> <span class="keywordtype">None</span>: -<a name="l01358"></a>01358 <span class="keywordflow">if</span> end < start: -<a name="l01359"></a>01359 (start, end) = (end, start) -<a name="l01360"></a>01360 reverse = <span class="keyword">True</span> -<a name="l01361"></a>01361 end += 1 -<a name="l01362"></a>01362 result = self[start:end] -<a name="l01363"></a>01363 <span class="keywordflow">if</span> reverse: -<a name="l01364"></a>01364 result.reverse() -<a name="l01365"></a>01365 <span class="keywordflow">return</span> result -<a name="l01366"></a>01366 -<a name="l01367"></a><a class="code" href="classcmd2_1_1History.html#a47db7cadf89510850e60e3c908a376f1">01367</a> rangePattern = re.compile(<span class="stringliteral">r'^\s*(?P<start>[\d]+)?\s*\-\s*(?P<end>[\d]+)?\s*$'</span>) -<a name="l01368"></a><a class="code" href="classcmd2_1_1History.html#aef5a4f297a77df78cd0e6bb17b67fb16">01368</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1History.html#aef5a4f297a77df78cd0e6bb17b67fb16">append</a>(self, new): -<a name="l01369"></a>01369 new = <a class="code" href="classcmd2_1_1HistoryItem.html">HistoryItem</a>(new) -<a name="l01370"></a>01370 list.append(self, new) -<a name="l01371"></a>01371 new.idx = len(self) -<a name="l01372"></a><a class="code" href="classcmd2_1_1History.html#a1c036910ea442db79fe012715b29c9db">01372</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1History.html#a1c036910ea442db79fe012715b29c9db">extend</a>(self, new): -<a name="l01373"></a>01373 <span class="keywordflow">for</span> n <span class="keywordflow">in</span> new: -<a name="l01374"></a>01374 self.<a class="code" href="classcmd2_1_1History.html#aef5a4f297a77df78cd0e6bb17b67fb16">append</a>(n) -<a name="l01375"></a>01375 -<a name="l01376"></a><a class="code" href="classcmd2_1_1History.html#a030faac02c0b814fc676d21d8c5e049c">01376</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1History.html#a030faac02c0b814fc676d21d8c5e049c">get</a>(self, getme=None, fromEnd=False): -<a name="l01377"></a>01377 <span class="keywordflow">if</span> <span class="keywordflow">not</span> getme: -<a name="l01378"></a>01378 <span class="keywordflow">return</span> self -<a name="l01379"></a>01379 <span class="keywordflow">try</span>: -<a name="l01380"></a>01380 getme = int(getme) -<a name="l01381"></a>01381 <span class="keywordflow">if</span> getme < 0: -<a name="l01382"></a>01382 <span class="keywordflow">return</span> self[:(-1 * getme)] -<a name="l01383"></a>01383 <span class="keywordflow">else</span>: -<a name="l01384"></a>01384 <span class="keywordflow">return</span> [self[getme-1]] -<a name="l01385"></a>01385 <span class="keywordflow">except</span> IndexError: -<a name="l01386"></a>01386 <span class="keywordflow">return</span> [] -<a name="l01387"></a>01387 <span class="keywordflow">except</span> ValueError: -<a name="l01388"></a>01388 rangeResult = self.rangePattern.search(getme) -<a name="l01389"></a>01389 <span class="keywordflow">if</span> rangeResult: -<a name="l01390"></a>01390 start = rangeResult.group(<span class="stringliteral">'start'</span>) <span class="keywordflow">or</span> <span class="keywordtype">None</span> -<a name="l01391"></a>01391 end = rangeResult.group(<span class="stringliteral">'start'</span>) <span class="keywordflow">or</span> <span class="keywordtype">None</span> -<a name="l01392"></a>01392 <span class="keywordflow">if</span> start: -<a name="l01393"></a>01393 start = int(start) - 1 -<a name="l01394"></a>01394 <span class="keywordflow">if</span> end: -<a name="l01395"></a>01395 end = int(end) -<a name="l01396"></a>01396 <span class="keywordflow">return</span> self[start:end] -<a name="l01397"></a>01397 -<a name="l01398"></a>01398 getme = getme.strip() -<a name="l01399"></a>01399 -<a name="l01400"></a>01400 <span class="keywordflow">if</span> getme.startswith(<span class="stringliteral">r'/'</span>) <span class="keywordflow">and</span> getme.endswith(<span class="stringliteral">r'/'</span>): -<a name="l01401"></a>01401 finder = re.compile(getme[1:-1], re.DOTALL | re.MULTILINE | re.IGNORECASE) -<a name="l01402"></a>01402 <span class="keyword">def </span>isin(hi): -<a name="l01403"></a>01403 <span class="keywordflow">return</span> finder.search(hi) -<a name="l01404"></a>01404 <span class="keywordflow">else</span>: -<a name="l01405"></a>01405 <span class="keyword">def </span>isin(hi): -<a name="l01406"></a>01406 <span class="keywordflow">return</span> (getme.lower() <span class="keywordflow">in</span> hi.lowercase) -<a name="l01407"></a>01407 <span class="keywordflow">return</span> [itm <span class="keywordflow">for</span> itm <span class="keywordflow">in</span> self <span class="keywordflow">if</span> isin(itm)] -<a name="l01408"></a>01408 -<a name="l01409"></a><a class="code" href="classcmd2_1_1NotSettableError.html">01409</a> <span class="keyword">class </span><a class="code" href="classcmd2_1_1NotSettableError.html">NotSettableError</a>(Exception): -<a name="l01410"></a>01410 <span class="keywordflow">pass</span> -<a name="l01411"></a>01411 -<a name="l01412"></a><a class="code" href="namespacecmd2.html#a0880940558f324b3958aedfc430f592d">01412</a> <span class="keyword">def </span><a class="code" href="namespacecmd2.html#a0880940558f324b3958aedfc430f592d">cast</a>(current, new): -<a name="l01413"></a>01413 <span class="stringliteral">"""Tries to force a new value into the same type as the current."""</span> -<a name="l01414"></a>01414 typ = type(current) -<a name="l01415"></a>01415 <span class="keywordflow">if</span> typ == bool: -<a name="l01416"></a>01416 <span class="keywordflow">try</span>: -<a name="l01417"></a>01417 <span class="keywordflow">return</span> bool(int(new)) -<a name="l01418"></a>01418 <span class="keywordflow">except</span> (ValueError, TypeError): -<a name="l01419"></a>01419 <span class="keywordflow">pass</span> -<a name="l01420"></a>01420 <span class="keywordflow">try</span>: -<a name="l01421"></a>01421 new = new.lower() -<a name="l01422"></a>01422 <span class="keywordflow">except</span>: -<a name="l01423"></a>01423 <span class="keywordflow">pass</span> -<a name="l01424"></a>01424 <span class="keywordflow">if</span> (new==<span class="stringliteral">'on'</span>) <span class="keywordflow">or</span> (new[0] <span class="keywordflow">in</span> (<span class="stringliteral">'y'</span>,<span class="stringliteral">'t'</span>)): -<a name="l01425"></a>01425 <span class="keywordflow">return</span> <span class="keyword">True</span> -<a name="l01426"></a>01426 <span class="keywordflow">if</span> (new==<span class="stringliteral">'off'</span>) <span class="keywordflow">or</span> (new[0] <span class="keywordflow">in</span> (<span class="stringliteral">'n'</span>,<span class="stringliteral">'f'</span>)): -<a name="l01427"></a>01427 <span class="keywordflow">return</span> <span class="keyword">False</span> -<a name="l01428"></a>01428 <span class="keywordflow">else</span>: -<a name="l01429"></a>01429 <span class="keywordflow">try</span>: -<a name="l01430"></a>01430 <span class="keywordflow">return</span> typ(new) -<a name="l01431"></a>01431 <span class="keywordflow">except</span>: -<a name="l01432"></a>01432 <span class="keywordflow">pass</span> -<a name="l01433"></a>01433 <span class="keywordflow">print</span> (<span class="stringliteral">"Problem setting parameter (now %s) to %s; incorrect type?"</span> % (current, new)) -<a name="l01434"></a>01434 <span class="keywordflow">return</span> current -<a name="l01435"></a>01435 -<a name="l01436"></a><a class="code" href="classcmd2_1_1Statekeeper.html">01436</a> <span class="keyword">class </span><a class="code" href="classcmd2_1_1Statekeeper.html">Statekeeper</a>(object): -<a name="l01437"></a><a class="code" href="classcmd2_1_1Statekeeper.html#a84a5071e786e0dff91a413e3fd0470c1">01437</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Statekeeper.html#a3550a0316a7f911d7b13da87844ee882">__init__</a>(self, obj, attribs): -<a name="l01438"></a>01438 self.<a class="code" href="classcmd2_1_1Statekeeper.html#a84a5071e786e0dff91a413e3fd0470c1">obj</a> = obj -<a name="l01439"></a>01439 self.<a class="code" href="classcmd2_1_1Statekeeper.html#a18466d6cef3f084e92f086a86d4a7244">attribs</a> = attribs -<a name="l01440"></a>01440 <span class="keywordflow">if</span> self.<a class="code" href="classcmd2_1_1Statekeeper.html#a84a5071e786e0dff91a413e3fd0470c1">obj</a>: -<a name="l01441"></a>01441 self.<a class="code" href="classcmd2_1_1Statekeeper.html#a848245f65d18fddf4bb768bd3f911b30">save</a>() -<a name="l01442"></a><a class="code" href="classcmd2_1_1Statekeeper.html#a848245f65d18fddf4bb768bd3f911b30">01442</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Statekeeper.html#a848245f65d18fddf4bb768bd3f911b30">save</a>(self): -<a name="l01443"></a>01443 <span class="keywordflow">for</span> attrib <span class="keywordflow">in</span> self.<a class="code" href="classcmd2_1_1Statekeeper.html#a18466d6cef3f084e92f086a86d4a7244">attribs</a>: -<a name="l01444"></a>01444 setattr(self, attrib, getattr(self.<a class="code" href="classcmd2_1_1Statekeeper.html#a84a5071e786e0dff91a413e3fd0470c1">obj</a>, attrib)) -<a name="l01445"></a><a class="code" href="classcmd2_1_1Statekeeper.html#a00e6cfdbe169bcb76db888b9d0beff03">01445</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Statekeeper.html#a00e6cfdbe169bcb76db888b9d0beff03">restore</a>(self): -<a name="l01446"></a>01446 <span class="keywordflow">if</span> self.<a class="code" href="classcmd2_1_1Statekeeper.html#a84a5071e786e0dff91a413e3fd0470c1">obj</a>: -<a name="l01447"></a>01447 <span class="keywordflow">for</span> attrib <span class="keywordflow">in</span> self.<a class="code" href="classcmd2_1_1Statekeeper.html#a18466d6cef3f084e92f086a86d4a7244">attribs</a>: -<a name="l01448"></a>01448 setattr(self.<a class="code" href="classcmd2_1_1Statekeeper.html#a84a5071e786e0dff91a413e3fd0470c1">obj</a>, attrib, getattr(self, attrib)) -<a name="l01449"></a>01449 -<a name="l01450"></a><a class="code" href="classcmd2_1_1Borg.html">01450</a> <span class="keyword">class </span><a class="code" href="classcmd2_1_1Borg.html">Borg</a>(object): -<a name="l01451"></a>01451 <span class="stringliteral">'''All instances of any Borg subclass will share state.</span> -<a name="l01452"></a>01452 <span class="stringliteral"> from Python Cookbook, 2nd Ed., recipe 6.16'''</span> -<a name="l01453"></a><a class="code" href="classcmd2_1_1Borg.html#a3af75c745a5c124376fa050b4d1c3912">01453</a> _shared_state = {} -<a name="l01454"></a><a class="code" href="classcmd2_1_1Borg.html#addff1031aaf78f5e1dc5ff0c6dba5137">01454</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Borg.html#addff1031aaf78f5e1dc5ff0c6dba5137">__new__</a>(cls, *a, **k): -<a name="l01455"></a>01455 obj = object.__new__(cls, *a, **k) -<a name="l01456"></a>01456 obj.__dict__ = cls._shared_state -<a name="l01457"></a>01457 <span class="keywordflow">return</span> obj -<a name="l01458"></a>01458 -<a name="l01459"></a><a class="code" href="classcmd2_1_1OutputTrap.html">01459</a> <span class="keyword">class </span><a class="code" href="classcmd2_1_1OutputTrap.html">OutputTrap</a>(<a class="code" href="classcmd2_1_1Borg.html">Borg</a>): -<a name="l01460"></a>01460 <span class="stringliteral">'''Instantiate an OutputTrap to divert/capture ALL stdout output. For use in unit testing.</span> -<a name="l01461"></a>01461 <span class="stringliteral"> Call `tearDown()` to return to normal output.'''</span> -<a name="l01462"></a><a class="code" href="classcmd2_1_1OutputTrap.html#ac7a0b848dc18c74b089bc0d4044996de">01462</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1OutputTrap.html#a0dc45d536432b07d7ec32da5755b5c85">__init__</a>(self): -<a name="l01463"></a>01463 self.<a class="code" href="classcmd2_1_1OutputTrap.html#a9117a6d5bfa07f1eeade54f24eeba0ed">contents</a> = <span class="stringliteral">''</span> -<a name="l01464"></a>01464 self.<a class="code" href="classcmd2_1_1OutputTrap.html#ac7a0b848dc18c74b089bc0d4044996de">old_stdout</a> = sys.stdout -<a name="l01465"></a>01465 sys.stdout = self -<a name="l01466"></a><a class="code" href="classcmd2_1_1OutputTrap.html#aa3bec468fdc0d248cd43cb8e8e0d96cd">01466</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1OutputTrap.html#aa3bec468fdc0d248cd43cb8e8e0d96cd">write</a>(self, txt): -<a name="l01467"></a>01467 self.<a class="code" href="classcmd2_1_1OutputTrap.html#a9117a6d5bfa07f1eeade54f24eeba0ed">contents</a> += txt -<a name="l01468"></a><a class="code" href="classcmd2_1_1OutputTrap.html#a492ceb8dfb3f6e90bf095a710ab56ad1">01468</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1OutputTrap.html#a492ceb8dfb3f6e90bf095a710ab56ad1">read</a>(self): -<a name="l01469"></a>01469 result = self.<a class="code" href="classcmd2_1_1OutputTrap.html#a9117a6d5bfa07f1eeade54f24eeba0ed">contents</a> -<a name="l01470"></a>01470 self.<a class="code" href="classcmd2_1_1OutputTrap.html#a9117a6d5bfa07f1eeade54f24eeba0ed">contents</a> = <span class="stringliteral">''</span> -<a name="l01471"></a>01471 <span class="keywordflow">return</span> result -<a name="l01472"></a><a class="code" href="classcmd2_1_1OutputTrap.html#a06961b49c3e19e9984f077a08b3a75f2">01472</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1OutputTrap.html#a06961b49c3e19e9984f077a08b3a75f2">tearDown</a>(self): -<a name="l01473"></a>01473 sys.stdout = self.<a class="code" href="classcmd2_1_1OutputTrap.html#ac7a0b848dc18c74b089bc0d4044996de">old_stdout</a> -<a name="l01474"></a>01474 self.<a class="code" href="classcmd2_1_1OutputTrap.html#a9117a6d5bfa07f1eeade54f24eeba0ed">contents</a> = <span class="stringliteral">''</span> -<a name="l01475"></a>01475 -<a name="l01476"></a><a class="code" href="classcmd2_1_1Cmd2TestCase.html">01476</a> <span class="keyword">class </span><a class="code" href="classcmd2_1_1Cmd2TestCase.html">Cmd2TestCase</a>(unittest.TestCase): -<a name="l01477"></a>01477 <span class="stringliteral">'''Subclass this, setting CmdApp, to make a unittest.TestCase class</span> -<a name="l01478"></a>01478 <span class="stringliteral"> that will execute the commands in a transcript file and expect the results shown.</span> -<a name="l01479"></a>01479 <span class="stringliteral"> See example.py'''</span> -<a name="l01480"></a><a class="code" href="classcmd2_1_1Cmd2TestCase.html#ae3ce50557636abee00a3941461dd450c">01480</a> CmdApp = <span class="keywordtype">None</span> -<a name="l01481"></a><a class="code" href="classcmd2_1_1Cmd2TestCase.html#ad319aa2e1874f60202610e5b8de33dbb">01481</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd2TestCase.html#ad82fc3489ffaf8ae227e7b122df389e0">fetchTranscripts</a>(self): -<a name="l01482"></a>01482 self.<a class="code" href="classcmd2_1_1Cmd2TestCase.html#ad319aa2e1874f60202610e5b8de33dbb">transcripts</a> = {} -<a name="l01483"></a>01483 <span class="keywordflow">for</span> fileset <span class="keywordflow">in</span> self.<a class="code" href="classcmd2_1_1Cmd2TestCase.html#ae3ce50557636abee00a3941461dd450c">CmdApp</a>.testfiles: -<a name="l01484"></a>01484 <span class="keywordflow">for</span> fname <span class="keywordflow">in</span> glob.glob(fileset): -<a name="l01485"></a>01485 tfile = open(fname) -<a name="l01486"></a>01486 self.<a class="code" href="classcmd2_1_1Cmd2TestCase.html#ad319aa2e1874f60202610e5b8de33dbb">transcripts</a>[fname] = iter(tfile.readlines()) -<a name="l01487"></a>01487 tfile.close() -<a name="l01488"></a>01488 <span class="keywordflow">if</span> <span class="keywordflow">not</span> len(self.<a class="code" href="classcmd2_1_1Cmd2TestCase.html#ad319aa2e1874f60202610e5b8de33dbb">transcripts</a>): -<a name="l01489"></a>01489 <span class="keywordflow">raise</span> (StandardError,), <span class="stringliteral">"No test files found - nothing to test."</span> -<a name="l01490"></a><a class="code" href="classcmd2_1_1Cmd2TestCase.html#a5892c02ac5ee5a25c47bbfa1c648647b">01490</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd2TestCase.html#a5892c02ac5ee5a25c47bbfa1c648647b">setUp</a>(self): -<a name="l01491"></a>01491 <span class="keywordflow">if</span> self.<a class="code" href="classcmd2_1_1Cmd2TestCase.html#ae3ce50557636abee00a3941461dd450c">CmdApp</a>: -<a name="l01492"></a>01492 self.<a class="code" href="classcmd2_1_1Cmd2TestCase.html#adeb5a7b735ad3b7f23a3c44d15ad283e">outputTrap</a> = <a class="code" href="classcmd2_1_1OutputTrap.html">OutputTrap</a>() -<a name="l01493"></a>01493 self.<a class="code" href="classcmd2_1_1Cmd2TestCase.html#acc7fc3df4fb04682fd1e4b2c4cc4cd3c">cmdapp</a> = self.<a class="code" href="classcmd2_1_1Cmd2TestCase.html#ae3ce50557636abee00a3941461dd450c">CmdApp</a>() -<a name="l01494"></a>01494 self.<a class="code" href="classcmd2_1_1Cmd2TestCase.html#ad82fc3489ffaf8ae227e7b122df389e0">fetchTranscripts</a>() -<a name="l01495"></a><a class="code" href="classcmd2_1_1Cmd2TestCase.html#acc8585a2192f48e04a8eafd63348c590">01495</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd2TestCase.html#acc8585a2192f48e04a8eafd63348c590">runTest</a>(self): <span class="comment"># was testall</span> -<a name="l01496"></a>01496 <span class="keywordflow">if</span> self.<a class="code" href="classcmd2_1_1Cmd2TestCase.html#ae3ce50557636abee00a3941461dd450c">CmdApp</a>: -<a name="l01497"></a>01497 its = sorted(self.transcripts.items()) -<a name="l01498"></a>01498 <span class="keywordflow">for</span> (fname, transcript) <span class="keywordflow">in</span> its: -<a name="l01499"></a>01499 self.<a class="code" href="classcmd2_1_1Cmd2TestCase.html#aaad687718f366338a76f83cb6547a258">_test_transcript</a>(fname, transcript) -<a name="l01500"></a><a class="code" href="classcmd2_1_1Cmd2TestCase.html#aa85409ff40b934d96ca1b3d3ff9e897d">01500</a> regexPattern = pyparsing.QuotedString(quoteChar=<span class="stringliteral">r'/'</span>, escChar=<span class="stringliteral">'\\'</span>, multiline=<span class="keyword">True</span>, unquoteResults=<span class="keyword">True</span>) -<a name="l01501"></a>01501 regexPattern.ignore(pyparsing.cStyleComment) -<a name="l01502"></a><a class="code" href="classcmd2_1_1Cmd2TestCase.html#a29b62f02c603b82014102babccd0c40e">01502</a> notRegexPattern = pyparsing.Word(pyparsing.printables) -<a name="l01503"></a>01503 notRegexPattern.setParseAction(<span class="keyword">lambda</span> t: re.escape(t[0])) -<a name="l01504"></a><a class="code" href="classcmd2_1_1Cmd2TestCase.html#af9574fde56ba05bc1532a6a028fb566d">01504</a> expectationParser = regexPattern | notRegexPattern -<a name="l01505"></a><a class="code" href="classcmd2_1_1Cmd2TestCase.html#a946827bef7050042cee99d3749c976d0">01505</a> anyWhitespace = re.compile(<span class="stringliteral">r'\s'</span>, re.DOTALL | re.MULTILINE) -<a name="l01506"></a><a class="code" href="classcmd2_1_1Cmd2TestCase.html#aaad687718f366338a76f83cb6547a258">01506</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd2TestCase.html#aaad687718f366338a76f83cb6547a258">_test_transcript</a>(self, fname, transcript): -<a name="l01507"></a>01507 lineNum = 0 -<a name="l01508"></a>01508 finished = <span class="keyword">False</span> -<a name="l01509"></a>01509 line = transcript.next() -<a name="l01510"></a>01510 lineNum += 1 -<a name="l01511"></a>01511 tests_run = 0 -<a name="l01512"></a>01512 <span class="keywordflow">while</span> <span class="keywordflow">not</span> finished: -<a name="l01513"></a>01513 <span class="comment"># Scroll forward to where actual commands begin</span> -<a name="l01514"></a>01514 <span class="keywordflow">while</span> <span class="keywordflow">not</span> line.startswith(self.<a class="code" href="classcmd2_1_1Cmd2TestCase.html#acc7fc3df4fb04682fd1e4b2c4cc4cd3c">cmdapp</a>.prompt): -<a name="l01515"></a>01515 <span class="keywordflow">try</span>: -<a name="l01516"></a>01516 line = transcript.next() -<a name="l01517"></a>01517 <span class="keywordflow">except</span> StopIteration: -<a name="l01518"></a>01518 finished = <span class="keyword">True</span> -<a name="l01519"></a>01519 <span class="keywordflow">break</span> -<a name="l01520"></a>01520 lineNum += 1 -<a name="l01521"></a>01521 command = [line[len(self.<a class="code" href="classcmd2_1_1Cmd2TestCase.html#acc7fc3df4fb04682fd1e4b2c4cc4cd3c">cmdapp</a>.prompt):]] -<a name="l01522"></a>01522 line = transcript.next() -<a name="l01523"></a>01523 <span class="comment"># Read the entirety of a multi-line command</span> -<a name="l01524"></a>01524 <span class="keywordflow">while</span> line.startswith(self.<a class="code" href="classcmd2_1_1Cmd2TestCase.html#acc7fc3df4fb04682fd1e4b2c4cc4cd3c">cmdapp</a>.continuation_prompt): -<a name="l01525"></a>01525 command.append(line[len(self.<a class="code" href="classcmd2_1_1Cmd2TestCase.html#acc7fc3df4fb04682fd1e4b2c4cc4cd3c">cmdapp</a>.continuation_prompt):]) -<a name="l01526"></a>01526 <span class="keywordflow">try</span>: -<a name="l01527"></a>01527 line = transcript.next() -<a name="l01528"></a>01528 <span class="keywordflow">except</span> StopIteration: -<a name="l01529"></a>01529 <span class="keywordflow">raise</span> (StopIteration, -<a name="l01530"></a>01530 <span class="stringliteral">'Transcript broke off while reading command beginning at line %d with\n%s'</span> -<a name="l01531"></a>01531 % (command[0])) -<a name="l01532"></a>01532 lineNum += 1 -<a name="l01533"></a>01533 command = <span class="stringliteral">''</span>.join(command) -<a name="l01534"></a>01534 <span class="comment"># Send the command into the application and capture the resulting output</span> -<a name="l01535"></a>01535 stop = self.cmdapp.onecmd_plus_hooks(command) -<a name="l01536"></a>01536 <span class="comment">#TODO: should act on ``stop``</span> -<a name="l01537"></a>01537 result = self.outputTrap.read() -<a name="l01538"></a>01538 <span class="comment"># Read the expected result from transcript</span> -<a name="l01539"></a>01539 <span class="keywordflow">if</span> line.startswith(self.<a class="code" href="classcmd2_1_1Cmd2TestCase.html#acc7fc3df4fb04682fd1e4b2c4cc4cd3c">cmdapp</a>.prompt): -<a name="l01540"></a>01540 message = <span class="stringliteral">'\nFile %s, line %d\nCommand was:\n%s\nExpected: (nothing)\nGot:\n%s\n'</span>%\ -<a name="l01541"></a>01541 (fname, lineNum, command, result) -<a name="l01542"></a>01542 self.assert_(not(result.strip()), message) -<a name="l01543"></a>01543 <span class="keywordflow">continue</span> -<a name="l01544"></a>01544 expected = [] -<a name="l01545"></a>01545 <span class="keywordflow">while</span> <span class="keywordflow">not</span> line.startswith(self.<a class="code" href="classcmd2_1_1Cmd2TestCase.html#acc7fc3df4fb04682fd1e4b2c4cc4cd3c">cmdapp</a>.prompt): -<a name="l01546"></a>01546 expected.append(line) -<a name="l01547"></a>01547 <span class="keywordflow">try</span>: -<a name="l01548"></a>01548 line = transcript.next() -<a name="l01549"></a>01549 <span class="keywordflow">except</span> StopIteration: -<a name="l01550"></a>01550 finished = <span class="keyword">True</span> -<a name="l01551"></a>01551 <span class="keywordflow">break</span> -<a name="l01552"></a>01552 lineNum += 1 -<a name="l01553"></a>01553 expected = <span class="stringliteral">''</span>.join(expected) -<a name="l01554"></a>01554 <span class="comment"># Compare actual result to expected</span> -<a name="l01555"></a>01555 message = <span class="stringliteral">'\nFile %s, line %d\nCommand was:\n%s\nExpected:\n%s\nGot:\n%s\n'</span>%\ -<a name="l01556"></a>01556 (fname, lineNum, command, expected, result) -<a name="l01557"></a>01557 expected = self.expectationParser.transformString(expected) -<a name="l01558"></a>01558 <span class="comment"># checking whitespace is a pain - let's skip it</span> -<a name="l01559"></a>01559 expected = self.anyWhitespace.sub(<span class="stringliteral">''</span>, expected) -<a name="l01560"></a>01560 result = self.anyWhitespace.sub(<span class="stringliteral">''</span>, result) -<a name="l01561"></a>01561 self.assert_(re.match(expected, result, re.MULTILINE | re.DOTALL), message) -<a name="l01562"></a>01562 -<a name="l01563"></a><a class="code" href="classcmd2_1_1Cmd2TestCase.html#a12a9839011a264bf817e646114523052">01563</a> <span class="keyword">def </span><a class="code" href="classcmd2_1_1Cmd2TestCase.html#a12a9839011a264bf817e646114523052">tearDown</a>(self): -<a name="l01564"></a>01564 <span class="keywordflow">if</span> self.<a class="code" href="classcmd2_1_1Cmd2TestCase.html#ae3ce50557636abee00a3941461dd450c">CmdApp</a>: -<a name="l01565"></a>01565 self.outputTrap.tearDown() -<a name="l01566"></a>01566 -<a name="l01567"></a>01567 <span class="keywordflow">if</span> __name__ == <span class="stringliteral">'__main__'</span>: -<a name="l01568"></a>01568 doctest.testmod(optionflags = doctest.NORMALIZE_WHITESPACE) -<a name="l01569"></a>01569 -<a name="l01570"></a>01570 <span class="stringliteral">'''</span> -<a name="l01571"></a>01571 <span class="stringliteral">To make your application transcript-testable, replace </span> -<a name="l01572"></a>01572 <span class="stringliteral"></span> -<a name="l01573"></a>01573 <span class="stringliteral">::</span> -<a name="l01574"></a>01574 <span class="stringliteral"></span> -<a name="l01575"></a>01575 <span class="stringliteral"> app = MyApp()</span> -<a name="l01576"></a>01576 <span class="stringliteral"> app.cmdloop()</span> -<a name="l01577"></a>01577 <span class="stringliteral"> </span> -<a name="l01578"></a>01578 <span class="stringliteral">with</span> -<a name="l01579"></a>01579 <span class="stringliteral"></span> -<a name="l01580"></a>01580 <span class="stringliteral">::</span> -<a name="l01581"></a>01581 <span class="stringliteral"></span> -<a name="l01582"></a>01582 <span class="stringliteral"> app = MyApp()</span> -<a name="l01583"></a>01583 <span class="stringliteral"> cmd2.run(app)</span> -<a name="l01584"></a>01584 <span class="stringliteral"> </span> -<a name="l01585"></a>01585 <span class="stringliteral">Then run a session of your application and paste the entire screen contents</span> -<a name="l01586"></a>01586 <span class="stringliteral">into a file, ``transcript.test``, and invoke the test like::</span> -<a name="l01587"></a>01587 <span class="stringliteral"></span> -<a name="l01588"></a>01588 <span class="stringliteral"> python myapp.py --test transcript.test</span> -<a name="l01589"></a>01589 <span class="stringliteral"></span> -<a name="l01590"></a>01590 <span class="stringliteral">Wildcards can be used to test against multiple transcript files.</span> -<a name="l01591"></a>01591 <span class="stringliteral">'''</span> -<a name="l01592"></a>01592 -<a name="l01593"></a>01593 -</pre></div></div> -</div> - <div id="nav-path" class="navpath"> - <ul> - <li class="navelem"><a class="el" href="cmd2_8py.html">cmd2.py</a> </li> -<!-- window showing the filter options --> -<div id="MSearchSelectWindow" - onmouseover="return searchBox.OnSearchSelectShow()" - onmouseout="return searchBox.OnSearchSelectHide()" - onkeydown="return searchBox.OnSearchSelectKey(event)"> -<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Variables</a></div> - -<!-- iframe showing the search results (closed by default) --> -<div id="MSearchResultsWindow"> -<iframe src="javascript:void(0)" frameborder="0" - name="MSearchResults" id="MSearchResults"> -</iframe> -</div> - - - <li class="footer">Generated on Fri Sep 9 2011 10:50:47 for Cmd2 by - <a href="http://www.doxygen.org/index.html"> - <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.5.1 </li> - </ul> - </div> - - -</body> -</html> |