document.write("    <style type=\"text/css\">        div.siafoo_code a.toggle_linenos{border-bottom:1px #FFFEF8 solid;border-top:1px #A1A4A5 solid;border-right:1px #FFFEF8 solid;border-left:1px #C1C4C5 solid;padding:0px 5px 0px 4px;background-color:#cfcfcf;color:black;text-decoration:none}div.siafoo_code_linenos_off a.toggle_linenos{border:1px #FFF7F0 solid;border-bottom:1px #C1C4C5 solid;border-right:1px #C1C4C5 solid;background-color:#fdfdf6}div.siafoo_code div.highlight{overflow:auto;margin-top:0.3em;border:1px #d8d8d8 solid;padding-right:0.5em;background:#f9f9f9}div.siafoo_code_linenos_off div.highlight{padding-left:0.5em}div.siafoo_code div.highlight pre{margin:0}div.siafoo_code div.highlight pre span.lineno{margin-right:0.5em;border-bottom:#fdfdf6;padding:0px 5px 0px 4px;background-color:#cfcfcf}div.siafoo_code_linenos_off div.highlight pre span.lineno{display:none}.highlight .c{color:#080;font-style:italic}.highlight .err{border:1px solid #FF0000}.highlight .k{color:#00F;font-weight:bold}.highlight .o{color:#666}.highlight .cm{color:#080;font-style:italic}.highlight .cp{color:#00F}.highlight .c1{color:#080;font-style:italic}.highlight .cs{color:#080;font-weight:bold}.highlight .gd{color:#A00000}.highlight .ge{font-style:italic}.highlight .gr{color:#F00}.highlight .gh{color:#000080;font-weight:bold}.highlight .gi{color:#00A000}.highlight .go{color:#808080}.highlight .gp{color:#000080;font-weight:bold}.highlight .gs{font-weight:bold}.highlight .gu{color:#800080;font-weight:bold}.highlight .gt{color:#0040D0}.highlight .kc{color:#A2F;font-weight:bold}.highlight .kd{color:#A2F;font-weight:bold}.highlight .kp{color:#A2F}.highlight .kr{color:#A2F;font-weight:bold}.highlight .kt{color:#A2F;font-weight:bold}.highlight .m{color:#666}.highlight .s{color:#B44}.highlight .na{color:#F00}.highlight .nb{color:#A2F}.highlight .nc{color:#00F}.highlight .no{color:#800}.highlight .nd{color:#A2F}.highlight .ni{color:#999;font-weight:bold}.highlight .ne{color:#D2413A;font-weight:bold}.highlight .nf{color:#000}.highlight .nl{color:#A0A000}.highlight .nn{color:#000;font-weight:bold}.highlight .nt{color:#008000;font-weight:bold}.highlight .nv{color:#B8860B}.highlight .ow{color:#A2F;font-weight:bold}.highlight .mf{color:#666}.highlight .mh{color:#666}.highlight .mi{color:#666}.highlight .mo{color:#666}.highlight .sb{color:#B44}.highlight .sc{color:#B44}.highlight .sd{color:#B44;font-style:italic}.highlight .s2{color:#B44}.highlight .se{color:#B62;font-weight:bold}.highlight .sh{color:#B44}.highlight .si{color:#B68;font-weight:bold}.highlight .sx{color:#008000}.highlight .sr{color:#B68}.highlight .s1{color:#B44}.highlight .ss{color:#B8860B}.highlight .bp{color:#A2F}.highlight .vc{color:#B8860B}.highlight .vg{color:#B8860B}.highlight .vi{color:#B8860B}.highlight .il{color:#666}	div.siafoo_code{font-size: small;}        div.siafoo_code pre{font-size: 106%;}        div.siafoo_code div.annotation{font-family: sans-serif;}    </style>    <div class=\"siafoo_code\">        <a id=\"siafoo_snippet_348_toggle\" class=\"toggle_linenos\" href=\"#\">#'s</a>        <div id=\"siafoo_snippet_348\">            <div class=\"highlight\"><pre><span class=\"lineno\">  1</span><span class=\"c\">#!/usr/bin/env python</span><br /><span class=\"lineno\">  2</span><br /><span class=\"lineno\">  3</span><span class=\"sd\">&quot;&quot;&quot;\\</span><br /><span class=\"lineno\">  4</span><span class=\"sd\">Logging Statement Modifier - replace logging calls with pass (or vice versa)</span><br /><span class=\"lineno\">  5</span><span class=\"sd\">Author: David Underhill &lt;dgu@cs.stanford.edu&gt;</span><br /><span class=\"lineno\">  6</span><span class=\"sd\">Version: 1.00 (06-Feb-2010)</span><br /><span class=\"lineno\">  7</span><br /><span class=\"lineno\">  8</span><span class=\"sd\">This script parses a Python file and comments out logging statements, replacing</span><br /><span class=\"lineno\">  9</span><span class=\"sd\">them with a pass statement (or vice versa).  The purpose of commenting out these</span><br /><span class=\"lineno\"> 10</span><span class=\"sd\">statements is to improve performance.  Even if logging is disabled, arguments to</span><br /><span class=\"lineno\"> 11</span><span class=\"sd\">logging method calls must still be evaluated, which can be expensive.</span><br /><span class=\"lineno\"> 12</span><br /><span class=\"lineno\"> 13</span><span class=\"sd\">This tool handles most common cases:</span><br /><span class=\"lineno\"> 14</span><span class=\"sd\">  * Log statements may span multiple lines.</span><br /><span class=\"lineno\"> 15</span><span class=\"sd\">  * Custom logging levels may be added (LEVELS, LEVEL_VALUES).</span><br /><span class=\"lineno\"> 16</span><span class=\"sd\">  * Integral logging levels &amp; named logging levels (DEBUG, etc.) are recognized.</span><br /><span class=\"lineno\"> 17</span><span class=\"sd\">  * Logging statements log(), debug(), ..., critical() are all recognized.</span><br /><span class=\"lineno\"> 18</span><span class=\"sd\">  * Statements with unrecognized logging levels will be left as-is.</span><br /><span class=\"lineno\"> 19</span><span class=\"sd\">  * &#39;logging&#39; is the assumed logging module name (LOGGING_MODULE_NAME).</span><br /><span class=\"lineno\"> 20</span><br /><span class=\"lineno\"> 21</span><span class=\"sd\">However, its ability to parse files is limited:</span><br /><span class=\"lineno\"> 22</span><span class=\"sd\">  * It only operates on logging statements in the form logging.log(&lt;level&gt;, ...)</span><br /><span class=\"lineno\"> 23</span><span class=\"sd\">    and logging.&lt;level&gt;(...).</span><br /><span class=\"lineno\"> 24</span><span class=\"sd\">  * The &lt;level&gt; must either be an integral constant or contain one of the names</span><br /><span class=\"lineno\"> 25</span><span class=\"sd\">    from the LEVELS constant below.</span><br /><span class=\"lineno\"> 26</span><span class=\"sd\">  * If a logging statement is made, it is assumed that no other statement is</span><br /><span class=\"lineno\"> 27</span><span class=\"sd\">    made on the same line as logging statement (except for statements made in</span><br /><span class=\"lineno\"> 28</span><span class=\"sd\">    between the open and close parenthesis of the logging call).  For example,</span><br /><span class=\"lineno\"> 29</span><span class=\"sd\">    a semi-colon and then a second statement on the same line as a logging call</span><br /><span class=\"lineno\"> 30</span><span class=\"sd\">    will not be handled properly.</span><br /><span class=\"lineno\"> 31</span><span class=\"sd\">  * Logging methods must be called through SOME module, e.g., logging.log(), not</span><br /><span class=\"lineno\"> 32</span><span class=\"sd\">    just log().</span><br /><span class=\"lineno\"> 33</span><span class=\"sd\">  * For simplicity, undoing the commenting process relies on a comment left by</span><br /><span class=\"lineno\"> 34</span><span class=\"sd\">    the program on the pass statements it adds when commenting out logging</span><br /><span class=\"lineno\"> 35</span><span class=\"sd\">    statements.  (So don&#39;t change the comment it outputs by the pass statement).</span><br /><span class=\"lineno\"> 36</span><br /><span class=\"lineno\"> 37</span><span class=\"sd\">To run this command on all of the Python files in a particular folder and its</span><br /><span class=\"lineno\"> 38</span><span class=\"sd\">sub-folders at once, try this (replace &#39;/path/to&#39; as appropriate):</span><br /><span class=\"lineno\"> 39</span><span class=\"sd\">    find . -name &#39;*.py&#39; | xargs -i{} /path/to/logging_statement_modifier.py {}</span><br /><span class=\"lineno\"> 40</span><span class=\"sd\">&quot;&quot;&quot;</span><br /><span class=\"lineno\"> 41</span><br /><span class=\"lineno\"> 42</span><span class=\"kn\">import</span> <span class=\"nn\">logging</span><br /><span class=\"lineno\"> 43</span><span class=\"kn\">from</span> <span class=\"nn\">optparse</span> <span class=\"kn\">import</span> <span class=\"n\">OptionParser</span><br /><span class=\"lineno\"> 44</span><span class=\"kn\">import</span> <span class=\"nn\">re</span><br /><span class=\"lineno\"> 45</span><span class=\"kn\">import</span> <span class=\"nn\">sys</span><br /><span class=\"lineno\"> 46</span><br /><span class=\"lineno\"> 47</span><span class=\"c\"># logging level names and values</span><br /><span class=\"lineno\"> 48</span><span class=\"n\">LEVELS</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s\">&#39;DEBUG&#39;</span><span class=\"p\">,</span> <span class=\"s\">&#39;INFO&#39;</span><span class=\"p\">,</span> <span class=\"s\">&#39;WARN&#39;</span><span class=\"p\">,</span> <span class=\"s\">&#39;WARNING&#39;</span><span class=\"p\">,</span> <span class=\"s\">&#39;ERROR&#39;</span><span class=\"p\">,</span> <span class=\"s\">&#39;CRITICAL&#39;</span><span class=\"p\">]</span><br /><span class=\"lineno\"> 49</span><span class=\"n\">LEVEL_VALUES</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">DEBUG</span><span class=\"p\">,</span> <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">INFO</span><span class=\"p\">,</span> <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">WARN</span><span class=\"p\">,</span> <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">WARNING</span><span class=\"p\">,</span> <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">ERROR</span><span class=\"p\">,</span> <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">CRITICAL</span><span class=\"p\">]</span><br /><span class=\"lineno\"> 50</span><span class=\"n\">LEVELS_DICT</span> <span class=\"o\">=</span> <span class=\"nb\">dict</span><span class=\"p\">(</span><span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">LEVELS</span><span class=\"p\">,</span> <span class=\"n\">LEVEL_VALUES</span><span class=\"p\">))</span><br /><span class=\"lineno\"> 51</span><br /><span class=\"lineno\"> 52</span><span class=\"c\"># names of methods in the logging module which perform logging</span><br /><span class=\"lineno\"> 53</span><span class=\"n\">LOGGING_METHODS_OF_INTEREST</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s\">&#39;log&#39;</span><span class=\"p\">,</span> <span class=\"s\">&#39;debug&#39;</span><span class=\"p\">,</span> <span class=\"s\">&#39;info&#39;</span><span class=\"p\">,</span> <span class=\"s\">&#39;warn&#39;</span><span class=\"p\">,</span> <span class=\"s\">&#39;warning&#39;</span><span class=\"p\">,</span> <span class=\"s\">&#39;error&#39;</span><span class=\"p\">,</span> <span class=\"s\">&#39;critical&#39;</span><span class=\"p\">]</span><br /><span class=\"lineno\"> 54</span><br /><span class=\"lineno\"> 55</span><span class=\"c\"># name of the logging module</span><br /><span class=\"lineno\"> 56</span><span class=\"n\">LOGGING_MODULE_NAME</span> <span class=\"o\">=</span> <span class=\"s\">&#39;logging&#39;</span><br /><span class=\"lineno\"> 57</span><br /><span class=\"lineno\"> 58</span><span class=\"c\"># this matches logging.&lt;method&gt;([&lt;first_arg&gt;,]</span><br /><span class=\"lineno\"> 59</span><span class=\"n\">STR_RE_LOGGING_CALL</span> <span class=\"o\">=</span> <span class=\"s\">r&#39;</span><span class=\"si\">%s</span><span class=\"s\">.(\\w+)[(](([^,\\r\\n]+),)?&#39;</span> <span class=\"o\">%</span> <span class=\"n\">LOGGING_MODULE_NAME</span><br /><span class=\"lineno\"> 60</span><br /><span class=\"lineno\"> 61</span><span class=\"c\"># contents of a pass line (not including prefixed whitespace)</span><br /><span class=\"lineno\"> 62</span><span class=\"n\">PASS_LINE_CONTENTS</span> <span class=\"o\">=</span> <span class=\"s\">&#39;pass # replaces next logging statement</span><span class=\"se\">\\n</span><span class=\"s\">&#39;</span><br /><span class=\"lineno\"> 63</span><br /><span class=\"lineno\"> 64</span><span class=\"c\"># Match a logging call (must only be prefixed with whitespace).  Capture groups</span><br /><span class=\"lineno\"> 65</span><span class=\"c\"># include the whitespace, the logging method called, and the first argument if</span><br /><span class=\"lineno\"> 66</span><span class=\"c\"># possible</span><br /><span class=\"lineno\"> 67</span><span class=\"n\">RE_LOGGING_START</span> <span class=\"o\">=</span> <span class=\"n\">re</span><span class=\"o\">.</span><span class=\"n\">compile</span><span class=\"p\">(</span><span class=\"s\">r&#39;^(\\s+)&#39;</span> <span class=\"o\">+</span> <span class=\"n\">STR_RE_LOGGING_CALL</span><span class=\"p\">)</span><br /><span class=\"lineno\"> 68</span><span class=\"n\">RE_LOGGING_START_IN_COMMENT</span> <span class=\"o\">=</span> <span class=\"n\">re</span><span class=\"o\">.</span><span class=\"n\">compile</span><span class=\"p\">(</span><span class=\"s\">r&#39;^(\\s+)#&#39;</span> <span class=\"o\">+</span> <span class=\"n\">STR_RE_LOGGING_CALL</span><span class=\"p\">)</span><br /><span class=\"lineno\"> 69</span><br /><span class=\"lineno\"> 70</span><span class=\"k\">def</span> <span class=\"nf\">main</span><span class=\"p\">(</span><span class=\"n\">argv</span><span class=\"o\">=</span><span class=\"n\">sys</span><span class=\"o\">.</span><span class=\"n\">argv</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:]):</span><br /><span class=\"lineno\"> 71</span>    <span class=\"sd\">&quot;&quot;&quot;Parses the command line comments.&quot;&quot;&quot;</span><br /><span class=\"lineno\"> 72</span>    <span class=\"n\">usage</span> <span class=\"o\">=</span> <span class=\"s\">&#39;usage: %prog [options] FILE</span><span class=\"se\">\\n\\n</span><span class=\"s\">&#39;</span> <span class=\"o\">+</span> <span class=\"n\">__doc__</span><br /><span class=\"lineno\"> 73</span>    <span class=\"n\">parser</span> <span class=\"o\">=</span> <span class=\"n\">OptionParser</span><span class=\"p\">(</span><span class=\"n\">usage</span><span class=\"p\">)</span><br /><span class=\"lineno\"> 74</span><br /><span class=\"lineno\"> 75</span>    <span class=\"c\"># options</span><br /><span class=\"lineno\"> 76</span>    <span class=\"n\">parser</span><span class=\"o\">.</span><span class=\"n\">add_option</span><span class=\"p\">(</span><span class=\"s\">&quot;-f&quot;</span><span class=\"p\">,</span> <span class=\"s\">&quot;--force&quot;</span><span class=\"p\">,</span><br /><span class=\"lineno\"> 77</span>                      <span class=\"n\">action</span><span class=\"o\">=</span><span class=\"s\">&#39;store_true&#39;</span><span class=\"p\">,</span> <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"bp\">False</span><span class=\"p\">,</span><br /><span class=\"lineno\"> 78</span>                      <span class=\"n\">help</span><span class=\"o\">=</span><span class=\"s\">&quot;make changes even if they cannot undone before saving the new file&quot;</span><span class=\"p\">)</span><br /><span class=\"lineno\"> 79</span>    <span class=\"n\">parser</span><span class=\"o\">.</span><span class=\"n\">add_option</span><span class=\"p\">(</span><span class=\"s\">&quot;-m&quot;</span><span class=\"p\">,</span> <span class=\"s\">&quot;--min_level&quot;</span><span class=\"p\">,</span><br /><span class=\"lineno\"> 80</span>                      <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"s\">&#39;NONE&#39;</span><span class=\"p\">,</span><br /><span class=\"lineno\"> 81</span>                      <span class=\"n\">help</span><span class=\"o\">=</span><span class=\"s\">&quot;minimum level of logging statements to modify [default: no minimum]&quot;</span><span class=\"p\">)</span><br /><span class=\"lineno\"> 82</span>    <span class=\"n\">parser</span><span class=\"o\">.</span><span class=\"n\">add_option</span><span class=\"p\">(</span><span class=\"s\">&quot;-M&quot;</span><span class=\"p\">,</span> <span class=\"s\">&quot;--max_level&quot;</span><span class=\"p\">,</span><br /><span class=\"lineno\"> 83</span>                      <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"s\">&#39;NONE&#39;</span><span class=\"p\">,</span><br /><span class=\"lineno\"> 84</span>                      <span class=\"n\">help</span><span class=\"o\">=</span><span class=\"s\">&quot;maximum level of logging statements to modify [default: no maximum]&quot;</span><span class=\"p\">)</span><br /><span class=\"lineno\"> 85</span>    <span class=\"n\">parser</span><span class=\"o\">.</span><span class=\"n\">add_option</span><span class=\"p\">(</span><span class=\"s\">&quot;-o&quot;</span><span class=\"p\">,</span> <span class=\"s\">&quot;--output-file&quot;</span><span class=\"p\">,</span><br /><span class=\"lineno\"> 86</span>                      <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"bp\">None</span><span class=\"p\">,</span><br /><span class=\"lineno\"> 87</span>                      <span class=\"n\">help</span><span class=\"o\">=</span><span class=\"s\">&quot;where to output the result [default: overwrite the input file]&quot;</span><span class=\"p\">)</span><br /><span class=\"lineno\"> 88</span>    <span class=\"n\">parser</span><span class=\"o\">.</span><span class=\"n\">add_option</span><span class=\"p\">(</span><span class=\"s\">&quot;-r&quot;</span><span class=\"p\">,</span> <span class=\"s\">&quot;--restore&quot;</span><span class=\"p\">,</span><br /><span class=\"lineno\"> 89</span>                      <span class=\"n\">action</span><span class=\"o\">=</span><span class=\"s\">&#39;store_true&#39;</span><span class=\"p\">,</span> <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"bp\">False</span><span class=\"p\">,</span><br /><span class=\"lineno\"> 90</span>                      <span class=\"n\">help</span><span class=\"o\">=</span><span class=\"s\">&quot;restore logging statements previously commented out and replaced with pass statements&quot;</span><span class=\"p\">)</span><br /><span class=\"lineno\"> 91</span>    <span class=\"n\">parser</span><span class=\"o\">.</span><span class=\"n\">add_option</span><span class=\"p\">(</span><span class=\"s\">&quot;-v&quot;</span><span class=\"p\">,</span> <span class=\"s\">&quot;--verbose&quot;</span><span class=\"p\">,</span><br /><span class=\"lineno\"> 92</span>                      <span class=\"n\">action</span><span class=\"o\">=</span><span class=\"s\">&#39;store_true&#39;</span><span class=\"p\">,</span> <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"bp\">False</span><span class=\"p\">,</span><br /><span class=\"lineno\"> 93</span>                      <span class=\"n\">help</span><span class=\"o\">=</span><span class=\"s\">&quot;print informational messages about changes made&quot;</span><span class=\"p\">)</span><br /><span class=\"lineno\"> 94</span><br /><span class=\"lineno\"> 95</span>    <span class=\"p\">(</span><span class=\"n\">options</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"p\">)</span> <span class=\"o\">=</span> <span class=\"n\">parser</span><span class=\"o\">.</span><span class=\"n\">parse_args</span><span class=\"p\">(</span><span class=\"n\">argv</span><span class=\"p\">)</span><br /><span class=\"lineno\"> 96</span>    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"p\">)</span> <span class=\"o\">!=</span> <span class=\"mi\">1</span><span class=\"p\">:</span><br /><span class=\"lineno\"> 97</span>        <span class=\"n\">parser</span><span class=\"o\">.</span><span class=\"n\">error</span><span class=\"p\">(</span><span class=\"s\">&quot;expected 1 argument but got </span><span class=\"si\">%d</span><span class=\"s\"> arguments: </span><span class=\"si\">%s</span><span class=\"s\">&quot;</span> <span class=\"o\">%</span> <span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"p\">),</span> <span class=\"s\">&#39; &#39;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"p\">)))</span><br /><span class=\"lineno\"> 98</span>    <span class=\"n\">input_fn</span> <span class=\"o\">=</span> <span class=\"n\">args</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><br /><span class=\"lineno\"> 99</span>    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">output_file</span><span class=\"p\">:</span><br /><span class=\"lineno\">100</span>        <span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">output_file</span> <span class=\"o\">=</span> <span class=\"n\">input_fn</span><br /><span class=\"lineno\">101</span><br /><span class=\"lineno\">102</span>    <span class=\"c\"># validate min/max level</span><br /><span class=\"lineno\">103</span>    <span class=\"n\">LEVEL_CHOICES</span> <span class=\"o\">=</span> <span class=\"n\">LEVELS</span> <span class=\"o\">+</span> <span class=\"p\">[</span><span class=\"s\">&#39;NONE&#39;</span><span class=\"p\">]</span><br /><span class=\"lineno\">104</span>    <span class=\"n\">min_level_value</span> <span class=\"o\">=</span> <span class=\"mi\">0</span> <span class=\"k\">if</span> <span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">min_level</span> <span class=\"o\">==</span> <span class=\"s\">&#39;NONE&#39;</span> <span class=\"k\">else</span> <span class=\"n\">get_level_value</span><span class=\"p\">(</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">min_level</span><span class=\"p\">)</span><br /><span class=\"lineno\">105</span>    <span class=\"k\">if</span> <span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">min_level</span> <span class=\"ow\">is</span> <span class=\"bp\">None</span><span class=\"p\">:</span><br /><span class=\"lineno\">106</span>        <span class=\"n\">parser</span><span class=\"o\">.</span><span class=\"n\">error</span><span class=\"p\">(</span><span class=\"s\">&quot;min level must be an integer or one of these values: </span><span class=\"si\">%s</span><span class=\"s\">&quot;</span> <span class=\"o\">%</span> <span class=\"s\">&#39;, &#39;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">LEVEL_CHOICES</span><span class=\"p\">))</span><br /><span class=\"lineno\">107</span>    <span class=\"n\">max_level_value</span> <span class=\"o\">=</span> <span class=\"n\">sys</span><span class=\"o\">.</span><span class=\"n\">maxint</span> <span class=\"k\">if</span> <span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">max_level</span> <span class=\"o\">==</span> <span class=\"s\">&#39;NONE&#39;</span> <span class=\"k\">else</span> <span class=\"n\">get_level_value</span><span class=\"p\">(</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">max_level</span><span class=\"p\">)</span><br /><span class=\"lineno\">108</span>    <span class=\"k\">if</span> <span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">max_level</span> <span class=\"ow\">is</span> <span class=\"bp\">None</span><span class=\"p\">:</span><br /><span class=\"lineno\">109</span>        <span class=\"n\">parser</span><span class=\"o\">.</span><span class=\"n\">error</span><span class=\"p\">(</span><span class=\"s\">&quot;max level must be an integer or one of these values: </span><span class=\"si\">%s</span><span class=\"s\">&quot;</span> <span class=\"o\">%</span> <span class=\"s\">&#39;, &#39;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">LEVEL_CHOICES</span><span class=\"p\">))</span><br /><span class=\"lineno\">110</span><br /><span class=\"lineno\">111</span>    <span class=\"k\">if</span> <span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">verbose</span><span class=\"p\">:</span><br /><span class=\"lineno\">112</span>        <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">getLogger</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">setLevel</span><span class=\"p\">(</span><span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">INFO</span><span class=\"p\">)</span><br /><span class=\"lineno\">113</span><br /><span class=\"lineno\">114</span>    <span class=\"k\">try</span><span class=\"p\">:</span><br /><span class=\"lineno\">115</span>        <span class=\"k\">return</span> <span class=\"n\">modify_logging</span><span class=\"p\">(</span><span class=\"n\">input_fn</span><span class=\"p\">,</span> <span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">output_file</span><span class=\"p\">,</span><br /><span class=\"lineno\">116</span>                              <span class=\"n\">min_level_value</span><span class=\"p\">,</span> <span class=\"n\">max_level_value</span><span class=\"p\">,</span><br /><span class=\"lineno\">117</span>                              <span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">restore</span><span class=\"p\">,</span> <span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">force</span><span class=\"p\">)</span><br /><span class=\"lineno\">118</span>    <span class=\"k\">except</span> <span class=\"ne\">IOError</span> <span class=\"k\">as</span> <span class=\"n\">e</span><span class=\"p\">:</span><br /><span class=\"lineno\">119</span>        <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">error</span><span class=\"p\">(</span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">e</span><span class=\"p\">))</span><br /><span class=\"lineno\">120</span>        <span class=\"k\">return</span> <span class=\"o\">-</span><span class=\"mi\">1</span><br /><span class=\"lineno\">121</span><br /><span class=\"lineno\">122</span><span class=\"c\"># matches two main groups: 1) leading whitespace and 2) all following text</span><br /><span class=\"lineno\">123</span><span class=\"n\">RE_LINE_SPLITTER_COMMENT</span> <span class=\"o\">=</span> <span class=\"n\">re</span><span class=\"o\">.</span><span class=\"n\">compile</span><span class=\"p\">(</span><span class=\"s\">r&#39;^(\\s*)((.|\\n)*)$&#39;</span><span class=\"p\">)</span><br /><span class=\"lineno\">124</span><span class=\"k\">def</span> <span class=\"nf\">comment_lines</span><span class=\"p\">(</span><span class=\"n\">lines</span><span class=\"p\">):</span><br /><span class=\"lineno\">125</span>    <span class=\"sd\">&quot;&quot;&quot;Comment out the given list of lines and return them.  The hash mark will</span><br /><span class=\"lineno\">126</span><span class=\"sd\">    be inserted before the first non-whitespace character on each line.&quot;&quot;&quot;</span><br /><span class=\"lineno\">127</span>    <span class=\"n\">ret</span> <span class=\"o\">=</span> <span class=\"p\">[]</span><br /><span class=\"lineno\">128</span>    <span class=\"k\">for</span> <span class=\"n\">line</span> <span class=\"ow\">in</span> <span class=\"n\">lines</span><span class=\"p\">:</span><br /><span class=\"lineno\">129</span>        <span class=\"n\">ws_prefix</span><span class=\"p\">,</span> <span class=\"n\">rest</span><span class=\"p\">,</span> <span class=\"n\">ignore</span> <span class=\"o\">=</span> <span class=\"n\">RE_LINE_SPLITTER_COMMENT</span><span class=\"o\">.</span><span class=\"n\">match</span><span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">groups</span><span class=\"p\">()</span><br /><span class=\"lineno\">130</span>        <span class=\"n\">ret</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">ws_prefix</span> <span class=\"o\">+</span> <span class=\"s\">&#39;#&#39;</span> <span class=\"o\">+</span> <span class=\"n\">rest</span><span class=\"p\">)</span><br /><span class=\"lineno\">131</span>    <span class=\"k\">return</span> <span class=\"s\">&#39;&#39;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">ret</span><span class=\"p\">)</span><br /><span class=\"lineno\">132</span><br /><span class=\"lineno\">133</span><span class=\"c\"># matches two main groups: 1) leading whitespace and 2) all following text</span><br /><span class=\"lineno\">134</span><span class=\"n\">RE_LINE_SPLITTER_UNCOMMENT</span> <span class=\"o\">=</span> <span class=\"n\">re</span><span class=\"o\">.</span><span class=\"n\">compile</span><span class=\"p\">(</span><span class=\"s\">r&#39;^(\\s*)#((.|\\n)*)$&#39;</span><span class=\"p\">)</span><br /><span class=\"lineno\">135</span><span class=\"k\">def</span> <span class=\"nf\">uncomment_lines</span><span class=\"p\">(</span><span class=\"n\">lines</span><span class=\"p\">):</span><br /><span class=\"lineno\">136</span>    <span class=\"sd\">&quot;&quot;&quot;Uncomment the given list of lines and return them.  The first hash mark</span><br /><span class=\"lineno\">137</span><span class=\"sd\">    following any amount of whitespace will be removed on each line.&quot;&quot;&quot;</span><br /><span class=\"lineno\">138</span>    <span class=\"n\">ret</span> <span class=\"o\">=</span> <span class=\"p\">[]</span><br /><span class=\"lineno\">139</span>    <span class=\"k\">for</span> <span class=\"n\">line</span> <span class=\"ow\">in</span> <span class=\"n\">lines</span><span class=\"p\">:</span><br /><span class=\"lineno\">140</span>        <span class=\"n\">ws_prefix</span><span class=\"p\">,</span> <span class=\"n\">rest</span><span class=\"p\">,</span> <span class=\"n\">ignore</span> <span class=\"o\">=</span> <span class=\"n\">RE_LINE_SPLITTER_UNCOMMENT</span><span class=\"o\">.</span><span class=\"n\">match</span><span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">groups</span><span class=\"p\">()</span><br /><span class=\"lineno\">141</span>        <span class=\"n\">ret</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">ws_prefix</span> <span class=\"o\">+</span> <span class=\"n\">rest</span><span class=\"p\">)</span><br /><span class=\"lineno\">142</span>    <span class=\"k\">return</span> <span class=\"s\">&#39;&#39;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">ret</span><span class=\"p\">)</span><br /><span class=\"lineno\">143</span><br /><span class=\"lineno\">144</span><span class=\"k\">def</span> <span class=\"nf\">first_arg_to_level_name</span><span class=\"p\">(</span><span class=\"n\">arg</span><span class=\"p\">):</span><br /><span class=\"lineno\">145</span>    <span class=\"sd\">&quot;&quot;&quot;Decide what level the argument specifies and return it.  The argument</span><br /><span class=\"lineno\">146</span><span class=\"sd\">    must contain (case-insensitive) one of the values in LEVELS or be an integer</span><br /><span class=\"lineno\">147</span><span class=\"sd\">    constant.  Otherwise None will be returned.&quot;&quot;&quot;</span><br /><span class=\"lineno\">148</span>    <span class=\"k\">try</span><span class=\"p\">:</span><br /><span class=\"lineno\">149</span>        <span class=\"k\">return</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">arg</span><span class=\"p\">)</span><br /><span class=\"lineno\">150</span>    <span class=\"k\">except</span> <span class=\"ne\">ValueError</span><span class=\"p\">:</span><br /><span class=\"lineno\">151</span>        <span class=\"n\">arg</span> <span class=\"o\">=</span> <span class=\"n\">arg</span><span class=\"o\">.</span><span class=\"n\">upper</span><span class=\"p\">()</span><br /><span class=\"lineno\">152</span>        <span class=\"k\">for</span> <span class=\"n\">level</span> <span class=\"ow\">in</span> <span class=\"n\">LEVELS</span><span class=\"p\">:</span><br /><span class=\"lineno\">153</span>            <span class=\"k\">if</span> <span class=\"n\">level</span> <span class=\"ow\">in</span> <span class=\"n\">arg</span><span class=\"p\">:</span><br /><span class=\"lineno\">154</span>                <span class=\"k\">return</span> <span class=\"n\">level</span><br /><span class=\"lineno\">155</span>        <span class=\"k\">return</span> <span class=\"bp\">None</span><br /><span class=\"lineno\">156</span><br /><span class=\"lineno\">157</span><span class=\"k\">def</span> <span class=\"nf\">get_level_value</span><span class=\"p\">(</span><span class=\"n\">level</span><span class=\"p\">):</span><br /><span class=\"lineno\">158</span>    <span class=\"sd\">&quot;&quot;&quot;Returns the logging value associated with a particular level name.  The</span><br /><span class=\"lineno\">159</span><span class=\"sd\">    argument must be present in LEVELS_DICT or be an integer constant.</span><br /><span class=\"lineno\">160</span><span class=\"sd\">    Otherwise None will be returned.&quot;&quot;&quot;</span><br /><span class=\"lineno\">161</span>    <span class=\"k\">try</span><span class=\"p\">:</span><br /><span class=\"lineno\">162</span>        <span class=\"c\"># integral constants also work: they are the level value</span><br /><span class=\"lineno\">163</span>        <span class=\"k\">return</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">level</span><span class=\"p\">)</span><br /><span class=\"lineno\">164</span>    <span class=\"k\">except</span> <span class=\"ne\">ValueError</span><span class=\"p\">:</span><br /><span class=\"lineno\">165</span>        <span class=\"k\">try</span><span class=\"p\">:</span><br /><span class=\"lineno\">166</span>            <span class=\"k\">return</span> <span class=\"n\">LEVELS_DICT</span><span class=\"p\">[</span><span class=\"n\">level</span><span class=\"o\">.</span><span class=\"n\">upper</span><span class=\"p\">()]</span><br /><span class=\"lineno\">167</span>        <span class=\"k\">except</span> <span class=\"ne\">KeyError</span><span class=\"p\">:</span><br /><span class=\"lineno\">168</span>            <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">warning</span><span class=\"p\">(</span><span class=\"s\">&quot;level &#39;</span><span class=\"si\">%s</span><span class=\"s\">&#39; cannot be translated to a level value (not present in LEVELS_DICT)&quot;</span> <span class=\"o\">%</span> <span class=\"n\">level</span><span class=\"p\">)</span><br /><span class=\"lineno\">169</span>            <span class=\"k\">return</span> <span class=\"bp\">None</span><br /><span class=\"lineno\">170</span><br /><span class=\"lineno\">171</span><span class=\"k\">def</span> <span class=\"nf\">get_logging_level</span><span class=\"p\">(</span><span class=\"n\">logging_stmt</span><span class=\"p\">,</span> <span class=\"n\">commented_out</span><span class=\"o\">=</span><span class=\"bp\">False</span><span class=\"p\">):</span><br /><span class=\"lineno\">172</span>    <span class=\"sd\">&quot;&quot;&quot;Determines the level of logging in a given logging statement.  The string</span><br /><span class=\"lineno\">173</span><span class=\"sd\">    representing this level is returned.  False is returned if the method is</span><br /><span class=\"lineno\">174</span><span class=\"sd\">    not a logging statement and thus has no level.  None is returned if a level</span><br /><span class=\"lineno\">175</span><span class=\"sd\">    should have been found but wasn&#39;t.&quot;&quot;&quot;</span><br /><span class=\"lineno\">176</span>    <span class=\"n\">regexp</span> <span class=\"o\">=</span> <span class=\"n\">RE_LOGGING_START_IN_COMMENT</span> <span class=\"k\">if</span> <span class=\"n\">commented_out</span> <span class=\"k\">else</span> <span class=\"n\">RE_LOGGING_START</span><br /><span class=\"lineno\">177</span>    <span class=\"n\">ret</span> <span class=\"o\">=</span> <span class=\"n\">regexp</span><span class=\"o\">.</span><span class=\"n\">match</span><span class=\"p\">(</span><span class=\"n\">logging_stmt</span><span class=\"p\">)</span><br /><span class=\"lineno\">178</span>    <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">method_name</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">first_arg</span> <span class=\"o\">=</span> <span class=\"n\">ret</span><span class=\"o\">.</span><span class=\"n\">groups</span><span class=\"p\">()</span><br /><span class=\"lineno\">179</span>    <span class=\"k\">if</span> <span class=\"n\">method_name</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">LOGGING_METHODS_OF_INTEREST</span><span class=\"p\">:</span><br /><span class=\"lineno\">180</span>        <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s\">&#39;skipping uninteresting logging call: </span><span class=\"si\">%s</span><span class=\"s\">&#39;</span> <span class=\"o\">%</span> <span class=\"n\">method_name</span><span class=\"p\">)</span><br /><span class=\"lineno\">181</span>        <span class=\"k\">return</span> <span class=\"bp\">False</span><br /><span class=\"lineno\">182</span><br /><span class=\"lineno\">183</span>    <span class=\"k\">if</span> <span class=\"n\">method_name</span> <span class=\"o\">!=</span> <span class=\"s\">&#39;log&#39;</span><span class=\"p\">:</span><br /><span class=\"lineno\">184</span>        <span class=\"k\">return</span> <span class=\"n\">method_name</span><br /><span class=\"lineno\">185</span><br /><span class=\"lineno\">186</span>    <span class=\"c\"># if the method name did not specify the level, we must have a first_arg to extract the level from</span><br /><span class=\"lineno\">187</span>    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">first_arg</span><span class=\"p\">:</span><br /><span class=\"lineno\">188</span>        <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">warning</span><span class=\"p\">(</span><span class=\"s\">&quot;logging.log statement found but we couldn&#39;t extract the first argument&quot;</span><span class=\"p\">)</span><br /><span class=\"lineno\">189</span>        <span class=\"k\">return</span> <span class=\"bp\">None</span><br /><span class=\"lineno\">190</span><br /><span class=\"lineno\">191</span>    <span class=\"c\"># extract the level of logging from the first argument to the log() call</span><br /><span class=\"lineno\">192</span>    <span class=\"n\">level</span> <span class=\"o\">=</span> <span class=\"n\">first_arg_to_level_name</span><span class=\"p\">(</span><span class=\"n\">first_arg</span><span class=\"p\">)</span><br /><span class=\"lineno\">193</span>    <span class=\"k\">if</span> <span class=\"n\">level</span> <span class=\"ow\">is</span> <span class=\"bp\">None</span><span class=\"p\">:</span><br /><span class=\"lineno\">194</span>        <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">warning</span><span class=\"p\">(</span><span class=\"s\">&quot;arg does not contain any known level &#39;</span><span class=\"si\">%s</span><span class=\"s\">&#39;</span><span class=\"se\">\\n</span><span class=\"s\">&quot;</span> <span class=\"o\">%</span> <span class=\"n\">first_arg</span><span class=\"p\">)</span><br /><span class=\"lineno\">195</span>        <span class=\"k\">return</span> <span class=\"bp\">None</span><br /><span class=\"lineno\">196</span>    <span class=\"k\">return</span> <span class=\"n\">level</span><br /><span class=\"lineno\">197</span><br /><span class=\"lineno\">198</span><span class=\"k\">def</span> <span class=\"nf\">level_is_between</span><span class=\"p\">(</span><span class=\"n\">level</span><span class=\"p\">,</span> <span class=\"n\">min_level_value</span><span class=\"p\">,</span> <span class=\"n\">max_level_value</span><span class=\"p\">):</span><br /><span class=\"lineno\">199</span>    <span class=\"sd\">&quot;&quot;&quot;Returns True if level is between the specified min or max, inclusive.&quot;&quot;&quot;</span><br /><span class=\"lineno\">200</span>    <span class=\"n\">level_value</span> <span class=\"o\">=</span> <span class=\"n\">get_level_value</span><span class=\"p\">(</span><span class=\"n\">level</span><span class=\"p\">)</span><br /><span class=\"lineno\">201</span>    <span class=\"k\">if</span> <span class=\"n\">level_value</span> <span class=\"ow\">is</span> <span class=\"bp\">None</span><span class=\"p\">:</span><br /><span class=\"lineno\">202</span>        <span class=\"c\"># unknown level value</span><br /><span class=\"lineno\">203</span>        <span class=\"k\">return</span> <span class=\"bp\">False</span><br /><span class=\"lineno\">204</span>    <span class=\"k\">return</span> <span class=\"n\">level_value</span> <span class=\"o\">&gt;=</span> <span class=\"n\">min_level_value</span> <span class=\"ow\">and</span> <span class=\"n\">level_value</span> <span class=\"o\">&lt;=</span> <span class=\"n\">max_level_value</span><br /><span class=\"lineno\">205</span><br /><span class=\"lineno\">206</span><span class=\"k\">def</span> <span class=\"nf\">split_call</span><span class=\"p\">(</span><span class=\"n\">lines</span><span class=\"p\">,</span> <span class=\"n\">open_paren_line</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">):</span><br /><span class=\"lineno\">207</span>    <span class=\"sd\">&quot;&quot;&quot;Returns a 2-tuple where the first element is the list of lines from the</span><br /><span class=\"lineno\">208</span><span class=\"sd\">    first open paren in lines to the matching closed paren.  The second element</span><br /><span class=\"lineno\">209</span><span class=\"sd\">    is all remaining lines in a list.&quot;&quot;&quot;</span><br /><span class=\"lineno\">210</span>    <span class=\"n\">num_open</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><br /><span class=\"lineno\">211</span>    <span class=\"n\">num_closed</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><br /><span class=\"lineno\">212</span>    <span class=\"k\">for</span> <span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">line</span> <span class=\"ow\">in</span> <span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"n\">lines</span><span class=\"p\">):</span><br /><span class=\"lineno\">213</span>        <span class=\"n\">c</span> <span class=\"o\">=</span> <span class=\"n\">line</span><span class=\"o\">.</span><span class=\"n\">count</span><span class=\"p\">(</span><span class=\"s\">&#39;(&#39;</span><span class=\"p\">)</span><br /><span class=\"lineno\">214</span>        <span class=\"n\">num_open</span> <span class=\"o\">+=</span> <span class=\"n\">c</span><br /><span class=\"lineno\">215</span>        <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">c</span> <span class=\"ow\">and</span> <span class=\"n\">i</span><span class=\"o\">==</span><span class=\"n\">open_paren_line</span><span class=\"p\">:</span><br /><span class=\"lineno\">216</span>            <span class=\"k\">raise</span> <span class=\"ne\">Exception</span><span class=\"p\">(</span><span class=\"s\">&#39;Exception open parenthesis in line </span><span class=\"si\">%d</span><span class=\"s\"> but there is not one there: </span><span class=\"si\">%s</span><span class=\"s\">&#39;</span> <span class=\"o\">%</span> <span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">lines</span><span class=\"p\">)))</span><br /><span class=\"lineno\">217</span>        <span class=\"n\">num_closed</span> <span class=\"o\">+=</span> <span class=\"n\">line</span><span class=\"o\">.</span><span class=\"n\">count</span><span class=\"p\">(</span><span class=\"s\">&#39;)&#39;</span><span class=\"p\">)</span><br /><span class=\"lineno\">218</span><br /><span class=\"lineno\">219</span>        <span class=\"k\">if</span> <span class=\"n\">num_open</span> <span class=\"o\">==</span> <span class=\"n\">num_closed</span><span class=\"p\">:</span><br /><span class=\"lineno\">220</span>            <span class=\"k\">return</span> <span class=\"p\">(</span><span class=\"n\">lines</span><span class=\"p\">[:</span><span class=\"n\">i</span><span class=\"o\">+</span><span class=\"mi\">1</span><span class=\"p\">],</span> <span class=\"n\">lines</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"o\">+</span><span class=\"mi\">1</span><span class=\"p\">:])</span><br /><span class=\"lineno\">221</span><br /><span class=\"lineno\">222</span>    <span class=\"k\">raise</span> <span class=\"ne\">Exception</span><span class=\"p\">(</span><span class=\"s\">&#39;parenthesis are mismatched (</span><span class=\"si\">%d</span><span class=\"s\"> open, </span><span class=\"si\">%d</span><span class=\"s\"> closed found)&#39;</span> <span class=\"o\">%</span> <span class=\"p\">(</span><span class=\"n\">num_open</span><span class=\"p\">,</span> <span class=\"n\">num_closed</span><span class=\"p\">))</span><br /><span class=\"lineno\">223</span><br /><span class=\"lineno\">224</span><span class=\"k\">def</span> <span class=\"nf\">modify_logging</span><span class=\"p\">(</span><span class=\"n\">input_fn</span><span class=\"p\">,</span> <span class=\"n\">output_fn</span><span class=\"p\">,</span> <span class=\"n\">min_level_value</span><span class=\"p\">,</span> <span class=\"n\">max_level_value</span><span class=\"p\">,</span> <span class=\"n\">restore</span><span class=\"p\">,</span> <span class=\"n\">force</span><span class=\"p\">):</span><br /><span class=\"lineno\">225</span>    <span class=\"sd\">&quot;&quot;&quot;Modifies logging statements in the specified file.&quot;&quot;&quot;</span><br /><span class=\"lineno\">226</span>    <span class=\"c\"># read in all the lines</span><br /><span class=\"lineno\">227</span>    <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s\">&#39;reading in </span><span class=\"si\">%s</span><span class=\"s\">&#39;</span> <span class=\"o\">%</span> <span class=\"n\">input_fn</span><span class=\"p\">)</span><br /><span class=\"lineno\">228</span>    <span class=\"n\">fh</span> <span class=\"o\">=</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"n\">input_fn</span><span class=\"p\">,</span> <span class=\"s\">&#39;r&#39;</span><span class=\"p\">)</span><br /><span class=\"lineno\">229</span>    <span class=\"n\">lines</span> <span class=\"o\">=</span> <span class=\"n\">fh</span><span class=\"o\">.</span><span class=\"n\">readlines</span><span class=\"p\">()</span><br /><span class=\"lineno\">230</span>    <span class=\"n\">fh</span><span class=\"o\">.</span><span class=\"n\">close</span><span class=\"p\">()</span><br /><span class=\"lineno\">231</span>    <span class=\"n\">original_contents</span> <span class=\"o\">=</span> <span class=\"s\">&#39;&#39;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">lines</span><span class=\"p\">)</span><br /><span class=\"lineno\">232</span><br /><span class=\"lineno\">233</span>    <span class=\"k\">if</span> <span class=\"n\">restore</span><span class=\"p\">:</span><br /><span class=\"lineno\">234</span>        <span class=\"n\">forwards</span> <span class=\"o\">=</span> <span class=\"n\">restore_logging</span><br /><span class=\"lineno\">235</span>        <span class=\"n\">backwards</span> <span class=\"o\">=</span> <span class=\"n\">disable_logging</span><br /><span class=\"lineno\">236</span>    <span class=\"k\">else</span><span class=\"p\">:</span><br /><span class=\"lineno\">237</span>        <span class=\"n\">forwards</span> <span class=\"o\">=</span> <span class=\"n\">disable_logging</span><br /><span class=\"lineno\">238</span>        <span class=\"n\">backwards</span> <span class=\"o\">=</span> <span class=\"n\">restore_logging</span><br /><span class=\"lineno\">239</span><br /><span class=\"lineno\">240</span>    <span class=\"c\"># apply the requested action</span><br /><span class=\"lineno\">241</span>    <span class=\"n\">new_contents</span> <span class=\"o\">=</span> <span class=\"n\">forwards</span><span class=\"p\">(</span><span class=\"n\">lines</span><span class=\"p\">,</span> <span class=\"n\">min_level_value</span><span class=\"p\">,</span> <span class=\"n\">max_level_value</span><span class=\"p\">)</span><br /><span class=\"lineno\">242</span><br /><span class=\"lineno\">243</span>    <span class=\"c\"># quietly check to see if we can undo what we just did (if not, the text</span><br /><span class=\"lineno\">244</span>    <span class=\"c\"># contains something we cannot translate [bug or limitation with this code])</span><br /><span class=\"lineno\">245</span>    <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">disable</span><span class=\"p\">(</span><span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">CRITICAL</span><span class=\"p\">)</span><br /><span class=\"lineno\">246</span>    <span class=\"n\">new_contents_undone</span> <span class=\"o\">=</span> <span class=\"n\">backwards</span><span class=\"p\">(</span><span class=\"n\">new_contents</span><span class=\"o\">.</span><span class=\"n\">splitlines</span><span class=\"p\">(</span><span class=\"bp\">True</span><span class=\"p\">),</span> <span class=\"n\">min_level_value</span><span class=\"p\">,</span> <span class=\"n\">max_level_value</span><span class=\"p\">)</span><br /><span class=\"lineno\">247</span>    <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">disable</span><span class=\"p\">(</span><span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">DEBUG</span><span class=\"p\">)</span><br /><span class=\"lineno\">248</span>    <span class=\"k\">if</span> <span class=\"n\">original_contents</span> <span class=\"o\">!=</span> <span class=\"n\">new_contents_undone</span><span class=\"p\">:</span><br /><span class=\"lineno\">249</span>        <span class=\"n\">base_str</span> <span class=\"o\">=</span> <span class=\"s\">&#39;We are unable to revert this action as expected&#39;</span><br /><span class=\"lineno\">250</span>        <span class=\"k\">if</span> <span class=\"n\">force</span><span class=\"p\">:</span><br /><span class=\"lineno\">251</span>            <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">warning</span><span class=\"p\">(</span><span class=\"n\">base_str</span> <span class=\"o\">+</span> <span class=\"s\">&quot; but -f was specified so we&#39;ll do it anyway.&quot;</span><span class=\"p\">)</span><br /><span class=\"lineno\">252</span>        <span class=\"k\">else</span><span class=\"p\">:</span><br /><span class=\"lineno\">253</span>            <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">error</span><span class=\"p\">(</span><span class=\"n\">base_str</span> <span class=\"o\">+</span> <span class=\"s\">&#39;, so we will not do it in the first place.  Pass -f to override this and make the change anyway.&#39;</span><span class=\"p\">)</span><br /><span class=\"lineno\">254</span>            <span class=\"k\">return</span> <span class=\"o\">-</span><span class=\"mi\">1</span><br /><span class=\"lineno\">255</span><br /><span class=\"lineno\">256</span>    <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s\">&#39;writing the new contents to </span><span class=\"si\">%s</span><span class=\"s\">&#39;</span> <span class=\"o\">%</span> <span class=\"n\">output_fn</span><span class=\"p\">)</span><br /><span class=\"lineno\">257</span>    <span class=\"n\">fh</span> <span class=\"o\">=</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"n\">output_fn</span><span class=\"p\">,</span> <span class=\"s\">&#39;w&#39;</span><span class=\"p\">)</span><br /><span class=\"lineno\">258</span>    <span class=\"n\">fh</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"n\">new_contents</span><span class=\"p\">)</span><br /><span class=\"lineno\">259</span>    <span class=\"n\">fh</span><span class=\"o\">.</span><span class=\"n\">close</span><span class=\"p\">()</span><br /><span class=\"lineno\">260</span>    <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s\">&#39;done!&#39;</span><span class=\"p\">)</span><br /><span class=\"lineno\">261</span>    <span class=\"k\">return</span> <span class=\"mi\">0</span><br /><span class=\"lineno\">262</span><br /><span class=\"lineno\">263</span><span class=\"k\">def</span> <span class=\"nf\">check_level</span><span class=\"p\">(</span><span class=\"n\">logging_stmt</span><span class=\"p\">,</span> <span class=\"n\">logging_stmt_is_commented_out</span><span class=\"p\">,</span> <span class=\"n\">min_level_value</span><span class=\"p\">,</span> <span class=\"n\">max_level_value</span><span class=\"p\">):</span><br /><span class=\"lineno\">264</span>    <span class=\"sd\">&quot;&quot;&quot;Extracts the level of the logging statement and returns True if the</span><br /><span class=\"lineno\">265</span><span class=\"sd\">    level falls betwen min and max_level_value.  If the level cannot be</span><br /><span class=\"lineno\">266</span><span class=\"sd\">    extracted, then a warning is logged.&quot;&quot;&quot;</span><br /><span class=\"lineno\">267</span>    <span class=\"n\">level</span> <span class=\"o\">=</span> <span class=\"n\">get_logging_level</span><span class=\"p\">(</span><span class=\"n\">logging_stmt</span><span class=\"p\">,</span> <span class=\"n\">logging_stmt_is_commented_out</span><span class=\"p\">)</span><br /><span class=\"lineno\">268</span>    <span class=\"k\">if</span> <span class=\"n\">level</span> <span class=\"ow\">is</span> <span class=\"bp\">None</span><span class=\"p\">:</span><br /><span class=\"lineno\">269</span>        <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">warning</span><span class=\"p\">(</span><span class=\"s\">&#39;skipping logging statement because the level could not be extracted: </span><span class=\"si\">%s</span><span class=\"s\">&#39;</span> <span class=\"o\">%</span> <span class=\"n\">logging_stmt</span><span class=\"o\">.</span><span class=\"n\">strip</span><span class=\"p\">())</span><br /><span class=\"lineno\">270</span>        <span class=\"k\">return</span> <span class=\"bp\">False</span><br /><span class=\"lineno\">271</span>    <span class=\"k\">elif</span> <span class=\"n\">level</span> <span class=\"ow\">is</span> <span class=\"bp\">False</span><span class=\"p\">:</span><br /><span class=\"lineno\">272</span>        <span class=\"k\">return</span> <span class=\"bp\">False</span><br /><span class=\"lineno\">273</span>    <span class=\"k\">elif</span> <span class=\"n\">level_is_between</span><span class=\"p\">(</span><span class=\"n\">level</span><span class=\"p\">,</span> <span class=\"n\">min_level_value</span><span class=\"p\">,</span> <span class=\"n\">max_level_value</span><span class=\"p\">):</span><br /><span class=\"lineno\">274</span>        <span class=\"k\">return</span> <span class=\"bp\">True</span><br /><span class=\"lineno\">275</span>    <span class=\"k\">else</span><span class=\"p\">:</span><br /><span class=\"lineno\">276</span>        <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s\">&#39;keep this one as is (not in the specified level range): </span><span class=\"si\">%s</span><span class=\"s\">&#39;</span> <span class=\"o\">%</span> <span class=\"n\">logging_stmt</span><span class=\"o\">.</span><span class=\"n\">strip</span><span class=\"p\">())</span><br /><span class=\"lineno\">277</span>        <span class=\"k\">return</span> <span class=\"bp\">False</span><br /><span class=\"lineno\">278</span><br /><span class=\"lineno\">279</span><span class=\"k\">def</span> <span class=\"nf\">disable_logging</span><span class=\"p\">(</span><span class=\"n\">lines</span><span class=\"p\">,</span> <span class=\"n\">min_level_value</span><span class=\"p\">,</span> <span class=\"n\">max_level_value</span><span class=\"p\">):</span><br /><span class=\"lineno\">280</span>    <span class=\"sd\">&quot;&quot;&quot;Disables logging statements in these lines whose logging level falls</span><br /><span class=\"lineno\">281</span><span class=\"sd\">    between the specified minimum and maximum levels.&quot;&quot;&quot;</span><br /><span class=\"lineno\">282</span>    <span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"s\">&#39;&#39;</span><br /><span class=\"lineno\">283</span>    <span class=\"k\">while</span> <span class=\"n\">lines</span><span class=\"p\">:</span><br /><span class=\"lineno\">284</span>        <span class=\"n\">line</span> <span class=\"o\">=</span> <span class=\"n\">lines</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><br /><span class=\"lineno\">285</span>        <span class=\"n\">ret</span> <span class=\"o\">=</span> <span class=\"n\">RE_LOGGING_START</span><span class=\"o\">.</span><span class=\"n\">match</span><span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">)</span><br /><span class=\"lineno\">286</span>        <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">ret</span><span class=\"p\">:</span><br /><span class=\"lineno\">287</span>            <span class=\"c\"># no logging statement here, so just leave the line as-is and keep going</span><br /><span class=\"lineno\">288</span>            <span class=\"n\">output</span> <span class=\"o\">+=</span> <span class=\"n\">line</span><br /><span class=\"lineno\">289</span>            <span class=\"n\">lines</span> <span class=\"o\">=</span> <span class=\"n\">lines</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:]</span><br /><span class=\"lineno\">290</span>        <span class=\"k\">else</span><span class=\"p\">:</span><br /><span class=\"lineno\">291</span>            <span class=\"c\"># a logging call has started: find all the lines it includes and those it does not</span><br /><span class=\"lineno\">292</span>            <span class=\"n\">logging_lines</span><span class=\"p\">,</span> <span class=\"n\">remaining_lines</span> <span class=\"o\">=</span> <span class=\"n\">split_call</span><span class=\"p\">(</span><span class=\"n\">lines</span><span class=\"p\">)</span><br /><span class=\"lineno\">293</span>            <span class=\"n\">lines</span> <span class=\"o\">=</span> <span class=\"n\">remaining_lines</span><br /><span class=\"lineno\">294</span>            <span class=\"n\">logging_stmt</span> <span class=\"o\">=</span> <span class=\"s\">&#39;&#39;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">logging_lines</span><span class=\"p\">)</span><br /><span class=\"lineno\">295</span><br /><span class=\"lineno\">296</span>            <span class=\"c\"># replace the logging statement if its level falls b/w min and max</span><br /><span class=\"lineno\">297</span>            <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">check_level</span><span class=\"p\">(</span><span class=\"n\">logging_stmt</span><span class=\"p\">,</span> <span class=\"bp\">False</span><span class=\"p\">,</span> <span class=\"n\">min_level_value</span><span class=\"p\">,</span> <span class=\"n\">max_level_value</span><span class=\"p\">):</span><br /><span class=\"lineno\">298</span>                <span class=\"n\">output</span> <span class=\"o\">+=</span> <span class=\"n\">logging_stmt</span><br /><span class=\"lineno\">299</span>            <span class=\"k\">else</span><span class=\"p\">:</span><br /><span class=\"lineno\">300</span>                <span class=\"c\"># comment out this logging statement and replace it with pass</span><br /><span class=\"lineno\">301</span>                <span class=\"n\">prefix_ws</span> <span class=\"o\">=</span> <span class=\"n\">ret</span><span class=\"o\">.</span><span class=\"n\">group</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">)</span><br /><span class=\"lineno\">302</span>                <span class=\"n\">pass_stmt</span> <span class=\"o\">=</span> <span class=\"n\">prefix_ws</span> <span class=\"o\">+</span> <span class=\"n\">PASS_LINE_CONTENTS</span><br /><span class=\"lineno\">303</span>                <span class=\"n\">commented_out_logging_lines</span> <span class=\"o\">=</span> <span class=\"n\">comment_lines</span><span class=\"p\">(</span><span class=\"n\">logging_lines</span><span class=\"p\">)</span><br /><span class=\"lineno\">304</span>                <span class=\"n\">new_lines</span> <span class=\"o\">=</span> <span class=\"n\">pass_stmt</span> <span class=\"o\">+</span> <span class=\"n\">commented_out_logging_lines</span><br /><span class=\"lineno\">305</span>                <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s\">&#39;replacing:</span><span class=\"se\">\\n</span><span class=\"si\">%s</span><span class=\"se\">\\n</span><span class=\"s\">with this:</span><span class=\"se\">\\n</span><span class=\"si\">%s</span><span class=\"s\">&#39;</span> <span class=\"o\">%</span> <span class=\"p\">(</span><span class=\"n\">logging_stmt</span><span class=\"o\">.</span><span class=\"n\">rstrip</span><span class=\"p\">(),</span> <span class=\"n\">new_lines</span><span class=\"o\">.</span><span class=\"n\">rstrip</span><span class=\"p\">()))</span><br /><span class=\"lineno\">306</span>                <span class=\"n\">output</span> <span class=\"o\">+=</span> <span class=\"n\">new_lines</span><br /><span class=\"lineno\">307</span>    <span class=\"k\">return</span> <span class=\"n\">output</span><br /><span class=\"lineno\">308</span><br /><span class=\"lineno\">309</span><span class=\"k\">def</span> <span class=\"nf\">restore_logging</span><span class=\"p\">(</span><span class=\"n\">lines</span><span class=\"p\">,</span> <span class=\"n\">min_level_value</span><span class=\"p\">,</span> <span class=\"n\">max_level_value</span><span class=\"p\">):</span><br /><span class=\"lineno\">310</span>    <span class=\"sd\">&quot;&quot;&quot;Re-enables logging statements in these lines whose logging level falls</span><br /><span class=\"lineno\">311</span><span class=\"sd\">    between the specified minimum and maximum levels and which were disabled</span><br /><span class=\"lineno\">312</span><span class=\"sd\">    by disable_logging() before.&quot;&quot;&quot;</span><br /><span class=\"lineno\">313</span>    <span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"s\">&#39;&#39;</span><br /><span class=\"lineno\">314</span>    <span class=\"k\">while</span> <span class=\"n\">lines</span><span class=\"p\">:</span><br /><span class=\"lineno\">315</span>        <span class=\"n\">line</span> <span class=\"o\">=</span> <span class=\"n\">lines</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><br /><span class=\"lineno\">316</span>        <span class=\"k\">if</span> <span class=\"n\">line</span><span class=\"o\">.</span><span class=\"n\">lstrip</span><span class=\"p\">()</span> <span class=\"o\">!=</span> <span class=\"n\">PASS_LINE_CONTENTS</span><span class=\"p\">:</span><br /><span class=\"lineno\">317</span>            <span class=\"c\"># not our pass statement here, so just leave the line as-is and keep going</span><br /><span class=\"lineno\">318</span>            <span class=\"n\">output</span> <span class=\"o\">+=</span> <span class=\"n\">line</span><br /><span class=\"lineno\">319</span>            <span class=\"n\">lines</span> <span class=\"o\">=</span> <span class=\"n\">lines</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:]</span><br /><span class=\"lineno\">320</span>        <span class=\"k\">else</span><span class=\"p\">:</span><br /><span class=\"lineno\">321</span>            <span class=\"c\"># a logging call will start on the next line: find all the lines it includes and those it does not</span><br /><span class=\"lineno\">322</span>            <span class=\"n\">logging_lines</span><span class=\"p\">,</span> <span class=\"n\">remaining_lines</span> <span class=\"o\">=</span> <span class=\"n\">split_call</span><span class=\"p\">(</span><span class=\"n\">lines</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:])</span><br /><span class=\"lineno\">323</span>            <span class=\"n\">lines</span> <span class=\"o\">=</span> <span class=\"n\">remaining_lines</span><br /><span class=\"lineno\">324</span>            <span class=\"n\">logging_stmt</span> <span class=\"o\">=</span> <span class=\"s\">&#39;&#39;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">logging_lines</span><span class=\"p\">)</span><br /><span class=\"lineno\">325</span>            <span class=\"n\">original_lines</span> <span class=\"o\">=</span> <span class=\"n\">line</span> <span class=\"o\">+</span> <span class=\"n\">logging_stmt</span><br /><span class=\"lineno\">326</span><br /><span class=\"lineno\">327</span>            <span class=\"c\"># replace the logging statement if its level falls b/w min and max</span><br /><span class=\"lineno\">328</span>            <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">check_level</span><span class=\"p\">(</span><span class=\"n\">logging_stmt</span><span class=\"p\">,</span> <span class=\"bp\">True</span><span class=\"p\">,</span> <span class=\"n\">min_level_value</span><span class=\"p\">,</span> <span class=\"n\">max_level_value</span><span class=\"p\">):</span><br /><span class=\"lineno\">329</span>                <span class=\"n\">output</span> <span class=\"o\">+=</span> <span class=\"n\">logging_stmt</span><br /><span class=\"lineno\">330</span>            <span class=\"k\">else</span><span class=\"p\">:</span><br /><span class=\"lineno\">331</span>                <span class=\"c\"># uncomment_lines of this logging statement and remove the pass line</span><br /><span class=\"lineno\">332</span>                <span class=\"n\">uncommented_logging_lines</span> <span class=\"o\">=</span> <span class=\"n\">uncomment_lines</span><span class=\"p\">(</span><span class=\"n\">logging_lines</span><span class=\"p\">)</span><br /><span class=\"lineno\">333</span>                <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s\">&#39;replacing:</span><span class=\"se\">\\n</span><span class=\"si\">%s</span><span class=\"se\">\\n</span><span class=\"s\">with this:</span><span class=\"se\">\\n</span><span class=\"si\">%s</span><span class=\"s\">&#39;</span> <span class=\"o\">%</span> <span class=\"p\">(</span><span class=\"n\">original_lines</span><span class=\"o\">.</span><span class=\"n\">rstrip</span><span class=\"p\">(),</span> <span class=\"n\">uncommented_logging_lines</span><span class=\"o\">.</span><span class=\"n\">rstrip</span><span class=\"p\">()))</span><br /><span class=\"lineno\">334</span>                <span class=\"n\">output</span> <span class=\"o\">+=</span> <span class=\"n\">uncommented_logging_lines</span><br /><span class=\"lineno\">335</span>    <span class=\"k\">return</span> <span class=\"n\">output</span><br /><span class=\"lineno\">336</span><br /><span class=\"lineno\">337</span><span class=\"k\">if</span> <span class=\"n\">__name__</span> <span class=\"o\">==</span> <span class=\"s\">&quot;__main__&quot;</span><span class=\"p\">:</span><br /><span class=\"lineno\">338</span>    <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">basicConfig</span><span class=\"p\">(</span><span class=\"n\">format</span><span class=\"o\">=</span><span class=\"s\">&#39;</span><span class=\"si\">%(levelname)s</span><span class=\"s\">: </span><span class=\"si\">%(message)s</span><span class=\"s\">&#39;</span><span class=\"p\">,</span> <span class=\"n\">level</span><span class=\"o\">=</span><span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">WARN</span><span class=\"p\">)</span><br /><span class=\"lineno\">339</span>    <span class=\"n\">sys</span><span class=\"o\">.</span><span class=\"n\">exit</span><span class=\"p\">(</span><span class=\"n\">main</span><span class=\"p\">())</span><br /></pre></div>        </div>        <div class=\"annotation\">            Snippet licensed under the <a href=\"http://www.siafoo.net/license/0\">Public Domain</a> license - Hosted on <a href=\"http://www.siafoo.net/snippet/348\">Siafoo</a>        </div>    </div>")
                  if(!Siafoo)var Siafoo={}
if(!Siafoo.addLineNumberToggle){Siafoo.addLineNumberToggle=function(toggle,container,start_off){toggle=document.getElementById(toggle)
if(!toggle)return
container=document.getElementById(container)
if(!container)return
if(container.getElementsByClassName){var linenums=container.getElementsByClassName('lineno')}
else{var children=container.getElementsByTagName('span')
if(!children)return
var linenums=[]
for(var i=0;i<children.length;i++){var child=children[i]
if(child.className=='lineno'){linenums.push(child)}}}
if(!linenums.length)return
var max_length=linenums.length.toString().length
var spaces=Array(max_length)
var current_spacing=''
for(var i=0;i<max_length;i++){spaces[i]=current_spacing
current_spacing+=' '}
function toggleLineNumbers(){if(linenums[0].style.display!='none'){for(var i=1;i<=linenums.length;i++){var linenum=linenums[i-1]
linenum.style.display='none'
linenum.innerHTML=''}}
else{for(var i=1;i<=linenums.length;i++){var linenum=linenums[i-1]
linenum.style.display=''
linenum.innerHTML=spaces[max_length-i.toString().length]+i}}
return false}
toggle.onclick=toggleLineNumbers
if(start_off)toggleLineNumbers()}}
                  Siafoo.addLineNumberToggle('siafoo_snippet_348_toggle', 'siafoo_snippet_348', true)
               