summaryrefslogtreecommitdiffstats
path: root/askbot/bin
diff options
context:
space:
mode:
authorEvgeny Fadeev <evgeny.fadeev@gmail.com>2010-06-27 18:07:56 -0400
committerEvgeny Fadeev <evgeny.fadeev@gmail.com>2010-06-27 18:07:56 -0400
commit863a7619a39724e0c0ecee2d70e61ea538c273fc (patch)
tree052603ef5e41f291180ed182664f39c5163a6567 /askbot/bin
parente5309b128d28c94d7905bb37541c3c3b88f00555 (diff)
downloadaskbot-863a7619a39724e0c0ecee2d70e61ea538c273fc.tar.gz
askbot-863a7619a39724e0c0ecee2d70e61ea538c273fc.tar.bz2
askbot-863a7619a39724e0c0ecee2d70e61ea538c273fc.zip
made autodoc work project-wide, tweaked some doc strings
Diffstat (limited to 'askbot/bin')
-rwxr-xr-x[-rw-r--r--]askbot/bin/generate_modules.py1384
1 files changed, 319 insertions, 1065 deletions
diff --git a/askbot/bin/generate_modules.py b/askbot/bin/generate_modules.py
index 9ff7ba68..f101a69b 100644..100755
--- a/askbot/bin/generate_modules.py
+++ b/askbot/bin/generate_modules.py
@@ -1,1065 +1,319 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
- "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
-<head>
- <title>
- etienned / sphinx-autopackage-script / source &mdash; bitbucket.org
-</title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <meta name="description" content="Mercurial hosting - we're here to serve." />
- <meta name="keywords" content="mercurial,hg,hosting,bitbucket,etienned,This,script,parse,a,directory,tree,looking,for,python,modules,and,packages,and,create,ReST,files,appropriately,to,create,code,documentation,with,Sphinx.,It,also,create,a,modules,index.,source,sourcecode,generate_modules.py@d20aab0a12b8" />
- <link rel="stylesheet" type="text/css" href="http://bitbucket-assets.s3.amazonaws.com/css/layout.css" />
- <link rel="stylesheet" type="text/css" href="http://bitbucket-assets.s3.amazonaws.com/css/screen.css" />
- <link rel="stylesheet" type="text/css" href="http://bitbucket-assets.s3.amazonaws.com/css/print.css" media="print" />
- <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="Bitbucket" />
- <link rel="icon" href="http://bitbucket-assets.s3.amazonaws.com/img/logo_new.png" type="image/png"/>
- <script type="text/javascript">var MEDIA_URL = "http://bitbucket-assets.s3.amazonaws.com/"</script>
- <script type="text/javascript" src="http://bitbucket-assets.s3.amazonaws.com/js/lib/bundle.020510May.js"></script>
-
- <script type="text/javascript">
- $(document).ready(function() {
- Dropdown.init();
- $(".tooltip").tipsy({gravity:'s'});
- });
- </script>
- <noscript>
- <style type="text/css">
- .dropdown-container-text .dropdown {
- position: static !important;
- }
- </style>
- </noscript>
-
- <!--[if lt IE 7]>
- <style type="text/css">
- body {
- behavior: url(http://bitbucket-assets.s3.amazonaws.com/css/csshover.htc);
- }
-
- #issues-issue pre {
- white-space: normal !important;
- }
-
- .changeset-description {
- white-space: normal !important;
- }
- </style>
- <script type="text/javascript">
- $(document).ready(function(){
- $('#header-wrapper').pngFix();
- $('#sourcelist').pngFix();
- $('.promo-signup-screenshot').pngFix();
- });
- </script>
- <![endif]-->
-
- <link rel="stylesheet" href="http://bitbucket-assets.s3.amazonaws.com/css/highlight/trac.css" type="text/css" />
-
-
-</head>
-<body class="">
- <div id="main-wrapper">
- <div id="header-wrapper">
- <div id="header">
- <a href="/"><img src="http://bitbucket-assets.s3.amazonaws.com/img/logo_myriad.png" alt="Bitbucket" id="header-wrapper-logo" /></a>
-
- <div id="header-nav">
- <ul class="right">
- <li><a href="/">Home</a></li>
- <li><a href="/plans"><b>Plans &amp; Signup</b></a></li>
- <li><a href="/repo/all">Repositories</a></li>
- <li><a href="/news">News</a></li>
- <li><a href="/help">Help</a></li>
- <li><a href="/account/signin/">Sign in</a></li>
- </ul>
- </div>
-
- </div>
- </div>
- <div id="content-wrapper">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <script type="text/javascript" src="http://bitbucket-assets.s3.amazonaws.com/js/lib/jquery.cookie.js"></script> <!--REMOVE WHEN NEWER BUNDLE THAN 030309Mar -->
- <script type="text/javascript">
- var date = new Date();
- date.setTime(date.getTime() + (365 * 24 * 60 * 60 * 1000));
- var cookieoptions = { path: '/', expires: date };
-
- window._shard = 'fe01 (ID 1)';
-
- $(document).ready(function(){
- $('#toggle-repo-content').click(function(){
- $('#repo-desc-cloneinfo').toggle('fast');
- $('#repo-menu').toggle();
- $('#repo-menu-links-mini').toggle(100);
- $('.repo-desc-description').toggle('fast');
- var avatar_new_width = ($('.repo-avatar').width() == 35) ? 16 : 35;
- $('.repo-avatar').animate({ width: avatar_new_width }, 250);
-
- if ($.cookie('toggle_status') == 'hide') {
- $.cookie('toggle_status', 'show', cookieoptions);
- $(this).css('background-image','url(http://bitbucket-assets.s3.amazonaws.com/img/repo-toggle-up.png)');
- } else {
- $.cookie('toggle_status', 'hide', cookieoptions);
- $(this).css('background-image','url(http://bitbucket-assets.s3.amazonaws.com/img/repo-toggle-down.png)');
- }
- });
-
- if ($.cookie('toggle_status') == 'hide') {
- $('#toggle-repo-content').css('background-image','url(http://bitbucket-assets.s3.amazonaws.com/img/repo-toggle-down.png)');
- $('#repo-desc-cloneinfo').hide();
- $('#repo-menu').hide();
- $('#repo-menu-links-mini').show();
- $('.repo-desc-description').hide();
- $('.repo-avatar').css({ width: '16px' });
- } else {
- $('#toggle-repo-content').css('background-image','url(http://bitbucket-assets.s3.amazonaws.com/img/repo-toggle-up.png)');
- $('#repo-desc-cloneinfo').show();
- $('#repo-menu').show();
- $('#repo-menu-links-mini').hide();
- $('.repo-desc-description').show();
- $('.repo-avatar').css({ width: '35px' });
- }
- });
- </script>
-
-
-<div id="tabs">
- <ul class="ui-tabs-nav">
- <li>
- <a href="/etienned/sphinx-autopackage-script/overview"><span>Overview</span></a>
- </li>
-
- <li>
- <a href="/etienned/sphinx-autopackage-script/downloads"><span>Downloads (0)</span></a>
- </li>
-
-
-
- <li class="ui-tabs-selected">
-
- <a href="/etienned/sphinx-autopackage-script/src/d20aab0a12b8"><span>Source</span></a>
-
- </li>
-
- <li>
- <a href="/etienned/sphinx-autopackage-script/changesets"><span>Changesets</span></a>
- </li>
-
-
-
- <li class="ui-tabs-nav-issues">
- <a href="/etienned/sphinx-autopackage-script/wiki"><span>Wiki</span></a>
- </li>
-
-
-
-
-
- <li class="ui-tabs-nav-issues">
- <a href="/etienned/sphinx-autopackage-script/issues?status=new&amp;status=open"><span>Issues (1) &raquo;</span></a>
- <ul>
- <li><a href="/etienned/sphinx-autopackage-script/issues?status=new">New issues</a></li>
- <li><a href="/etienned/sphinx-autopackage-script/issues?status=new&amp;status=open">Open issues</a></li>
- <li><a href="/etienned/sphinx-autopackage-script/issues?status=resolved&amp;status=invalid&amp;status=duplicate">Closed issues</a></li>
-
- <li><a href="/etienned/sphinx-autopackage-script/issues">All issues</a></li>
- <li><a href="/etienned/sphinx-autopackage-script/issues/query">Advanced query</a></li>
- <li><a href="/etienned/sphinx-autopackage-script/issues/new">Create new issue</a></li>
- </ul>
- </li>
-
-
-
-
-
-
-
- <li class="tabs-right tabs-far-right">
- <a href="/etienned/sphinx-autopackage-script/descendants"><span>Forks/Queues (0)</span></a>
- </li>
-
- <li class="tabs-right">
- <a href="/etienned/sphinx-autopackage-script/zealots"><span>Followers (2)</span></a>
- </li>
- </ul>
-</div>
-
-<div id="repo-menu">
- <div id="repo-menu-links">
- <ul>
- <li>
- <a href="/etienned/sphinx-autopackage-script/rss" class="noborder repo-menu-rss" title="RSS Feed for sphinx-autopackage-script">RSS</a>
- </li>
- <li>
- <a href="/etienned/sphinx-autopackage-script/atom" class="noborder repo-menu-atom" title="Atom Feed for sphinx-autopackage-script">Atom</a>
- </li>
-
- <li>
- <a href="/etienned/sphinx-autopackage-script/pull" class="link-request-pull">
- pull request
- </a>
- </li>
-
- <li><a href="/etienned/sphinx-autopackage-script/fork" class="link-fork">fork</a></li>
-
- <li><a href="/etienned/sphinx-autopackage-script/hack" class="link-hack">patch queue</a></li>
-
- <li>
-
- <a rel="nofollow" href="/etienned/sphinx-autopackage-script/follow" class="link-follow">follow</a>
-
- </li>
- <li><a class="link-download">get source &raquo;</a>
-
- <ul>
-
- <li><a rel="nofollow" href="/etienned/sphinx-autopackage-script/get/d20aab0a12b8.zip" class="zip">zip</a></li>
- <li><a rel="nofollow" href="/etienned/sphinx-autopackage-script/get/d20aab0a12b8.gz" class="compressed">gz</a></li>
- <li><a rel="nofollow" href="/etienned/sphinx-autopackage-script/get/d20aab0a12b8.bz2" class="compressed">bz2</a></li>
-
- </ul>
- </li>
- </ul>
- </div>
-
-
- <div id="repo-menu-branches-tags">
- <ul>
- <li class="icon-branches">
- branches &raquo;
-
- <ul>
-
- <li><a href="/etienned/sphinx-autopackage-script/src/d20aab0a12b8">default</a></li>
-
- </ul>
-
- </li>
- <li class="icon-tags">
- tags &raquo;
-
- <ul>
-
- <li><a href="/etienned/sphinx-autopackage-script/src/d20aab0a12b8">tip</a></li>
-
- </ul>
- </li>
- </ul>
- </div>
-
-
- <div class="cb"></div>
- </div>
- <div id="repo-desc" class="layout-box">
-
-
- <div id="repo-menu-links-mini" class="right">
- <ul>
- <li>
- <a href="/etienned/sphinx-autopackage-script/rss" class="noborder repo-menu-rss" title="RSS Feed for sphinx-autopackage-script"></a>
- </li>
- <li>
- <a href="/etienned/sphinx-autopackage-script/atom" class="noborder repo-menu-atom" title="Atom Feed for sphinx-autopackage-script"></a>
- </li>
-
- <li>
- <a href="/etienned/sphinx-autopackage-script/pull" class="tooltip noborder link-request-pull" title="Pull request"></a>
- </li>
-
- <li><a href="/etienned/sphinx-autopackage-script/fork" class="tooltip noborder link-fork" title="Fork"></a></li>
-
- <li><a href="/etienned/sphinx-autopackage-script/hack" class="tooltip noborder link-hack" title="Patch queue"></a></li>
-
- <li><a class="tooltip noborder link-download" title="Get source"></a>
-
- <ul>
-
- <li><a rel="nofollow" href="/etienned/sphinx-autopackage-script/get/d20aab0a12b8.zip" class="zip">zip</a></li>
- <li><a rel="nofollow" href="/etienned/sphinx-autopackage-script/get/d20aab0a12b8.gz" class="compressed">gz</a></li>
- <li><a rel="nofollow" href="/etienned/sphinx-autopackage-script/get/d20aab0a12b8.bz2" class="compressed">bz2</a></li>
-
- </ul>
- </li>
- </ul>
- </div>
-
- <h3>
- <a href="/etienned">etienned</a> /
- <a href="/etienned/sphinx-autopackage-script">sphinx-autopackage-script</a>
-
-
- </h3>
-
-
-
-
-
- <p class="repo-desc-description">This script parse a directory tree looking for python modules and packages and
-create ReST files appropriately to create code documentation with Sphinx.
-It also create a modules index. </p>
-
- <div id="repo-desc-cloneinfo">Clone this repository (size: 5.8 KB): <a href="http://bitbucket.org/etienned/sphinx-autopackage-script" onclick="$('#clone-url-ssh').hide();$('#clone-url-https').toggle();return(false);"><small>HTTPS</small></a> / <a href="ssh://hg@bitbucket.org/etienned/sphinx-autopackage-script" onclick="$('#clone-url-https').hide();$('#clone-url-ssh').toggle();return(false);"><small>SSH</small></a><br/>
- <pre id="clone-url-https">$ hg clone <a href="http://bitbucket.org/etienned/sphinx-autopackage-script">http://bitbucket.org/etienned/sphinx-autopackage-script</a></pre>
-
- <pre id="clone-url-ssh" style="display:none;">$ hg clone <a href="ssh://hg@bitbucket.org/etienned/sphinx-autopackage-script">ssh://hg@bitbucket.org/etienned/sphinx-autopackage-script</a></pre></div>
-
- <div class="cb"></div>
- <a href="#" id="toggle-repo-content"></a>
-
-
-
- </div>
-
-
-
-
-
-
-
-
-
-<div id="source-summary" class="layout-box">
- <div class="right">
- <table>
- <tr>
- <td>commit 0:</td>
- <td>d20aab0a12b8</td>
- </tr>
-
-
- <tr>
- <td>branch: </td>
- <td>default</td>
- </tr>
-
- <tr>
- <td>tags:</td>
- <td>tip</td>
- </tr>
-
- </table>
- </div>
-
-<div class="changeset-description">Initial commit</div>
-
- <div>
-
-
-
-
-<div class="dropdown-container">
-
-
- <img src="http://www.gravatar.com/avatar/6fc6e07b4af580b1424c082536570dd4?d=identicon&s=32" class="avatar dropdown" />
-
-
-
- <ul class="dropdown-list">
- <li>
-
- <a href="/etienne">View etienne's profile</a>
-
- </li>
- <li>
- <a href="">etienne's public repos &raquo;</a>
-
-
-
- </li>
-
- <li>
- <a href="/account/notifications/send/?receiver=etienne">Send message</a>
- </li>
-
- </ul>
-</div>
-
-
-
-
- <span class="dropdown-right">
-
-
- <a href="/etienne">Etienne Lawlor</a> /
-
- <a href="/etienne">etienne</a>
-
- <br/>
- <small class="dropdown-right">2 months ago</small>
- </span>
-
- </div>
-
- <div class="cb"></div>
-</div>
-
-
-
-
-<div id="source-path" class="layout-box">
- <a href="/etienned/sphinx-autopackage-script/src">sphinx-autopackage-script</a> /
-
-
-
- generate_modules.py
-
-
-
-
-</div>
-
-
-<div id="source-view" class="scroll-x">
- <table class="info-table">
- <tr>
- <th>r0:d20aab0a12b8</th>
- <th>287 loc</th>
- <th>10.7 KB</th>
- <th class="source-view-links">
- <a id="embed-link" href="#" onclick="makeEmbed('#embed-link', 'http://bitbucket.org/etienned/sphinx-autopackage-script/src/d20aab0a12b8/generate_modules.py?embed=t');">embed</a> /
- <a href='/etienned/sphinx-autopackage-script/history/generate_modules.py'>history</a> /
- <a href='/etienned/sphinx-autopackage-script/annotate/d20aab0a12b8/generate_modules.py'>annotate</a> /
- <a href='/etienned/sphinx-autopackage-script/raw/d20aab0a12b8/generate_modules.py'>raw</a> /
- <form action="/etienned/sphinx-autopackage-script/diff/generate_modules.py" method="get" class="source-view-form">
-
- <select name='nothing' class="smaller" disabled="disabled">
- <option>No previous changes</option>
- </select>
-
- </form>
- </th>
- </tr>
- </table>
-
-
- <table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><a href="#cl-1"> 1</a>
-<a href="#cl-2"> 2</a>
-<a href="#cl-3"> 3</a>
-<a href="#cl-4"> 4</a>
-<a href="#cl-5"> 5</a>
-<a href="#cl-6"> 6</a>
-<a href="#cl-7"> 7</a>
-<a href="#cl-8"> 8</a>
-<a href="#cl-9"> 9</a>
-<a href="#cl-10"> 10</a>
-<a href="#cl-11"> 11</a>
-<a href="#cl-12"> 12</a>
-<a href="#cl-13"> 13</a>
-<a href="#cl-14"> 14</a>
-<a href="#cl-15"> 15</a>
-<a href="#cl-16"> 16</a>
-<a href="#cl-17"> 17</a>
-<a href="#cl-18"> 18</a>
-<a href="#cl-19"> 19</a>
-<a href="#cl-20"> 20</a>
-<a href="#cl-21"> 21</a>
-<a href="#cl-22"> 22</a>
-<a href="#cl-23"> 23</a>
-<a href="#cl-24"> 24</a>
-<a href="#cl-25"> 25</a>
-<a href="#cl-26"> 26</a>
-<a href="#cl-27"> 27</a>
-<a href="#cl-28"> 28</a>
-<a href="#cl-29"> 29</a>
-<a href="#cl-30"> 30</a>
-<a href="#cl-31"> 31</a>
-<a href="#cl-32"> 32</a>
-<a href="#cl-33"> 33</a>
-<a href="#cl-34"> 34</a>
-<a href="#cl-35"> 35</a>
-<a href="#cl-36"> 36</a>
-<a href="#cl-37"> 37</a>
-<a href="#cl-38"> 38</a>
-<a href="#cl-39"> 39</a>
-<a href="#cl-40"> 40</a>
-<a href="#cl-41"> 41</a>
-<a href="#cl-42"> 42</a>
-<a href="#cl-43"> 43</a>
-<a href="#cl-44"> 44</a>
-<a href="#cl-45"> 45</a>
-<a href="#cl-46"> 46</a>
-<a href="#cl-47"> 47</a>
-<a href="#cl-48"> 48</a>
-<a href="#cl-49"> 49</a>
-<a href="#cl-50"> 50</a>
-<a href="#cl-51"> 51</a>
-<a href="#cl-52"> 52</a>
-<a href="#cl-53"> 53</a>
-<a href="#cl-54"> 54</a>
-<a href="#cl-55"> 55</a>
-<a href="#cl-56"> 56</a>
-<a href="#cl-57"> 57</a>
-<a href="#cl-58"> 58</a>
-<a href="#cl-59"> 59</a>
-<a href="#cl-60"> 60</a>
-<a href="#cl-61"> 61</a>
-<a href="#cl-62"> 62</a>
-<a href="#cl-63"> 63</a>
-<a href="#cl-64"> 64</a>
-<a href="#cl-65"> 65</a>
-<a href="#cl-66"> 66</a>
-<a href="#cl-67"> 67</a>
-<a href="#cl-68"> 68</a>
-<a href="#cl-69"> 69</a>
-<a href="#cl-70"> 70</a>
-<a href="#cl-71"> 71</a>
-<a href="#cl-72"> 72</a>
-<a href="#cl-73"> 73</a>
-<a href="#cl-74"> 74</a>
-<a href="#cl-75"> 75</a>
-<a href="#cl-76"> 76</a>
-<a href="#cl-77"> 77</a>
-<a href="#cl-78"> 78</a>
-<a href="#cl-79"> 79</a>
-<a href="#cl-80"> 80</a>
-<a href="#cl-81"> 81</a>
-<a href="#cl-82"> 82</a>
-<a href="#cl-83"> 83</a>
-<a href="#cl-84"> 84</a>
-<a href="#cl-85"> 85</a>
-<a href="#cl-86"> 86</a>
-<a href="#cl-87"> 87</a>
-<a href="#cl-88"> 88</a>
-<a href="#cl-89"> 89</a>
-<a href="#cl-90"> 90</a>
-<a href="#cl-91"> 91</a>
-<a href="#cl-92"> 92</a>
-<a href="#cl-93"> 93</a>
-<a href="#cl-94"> 94</a>
-<a href="#cl-95"> 95</a>
-<a href="#cl-96"> 96</a>
-<a href="#cl-97"> 97</a>
-<a href="#cl-98"> 98</a>
-<a href="#cl-99"> 99</a>
-<a href="#cl-100">100</a>
-<a href="#cl-101">101</a>
-<a href="#cl-102">102</a>
-<a href="#cl-103">103</a>
-<a href="#cl-104">104</a>
-<a href="#cl-105">105</a>
-<a href="#cl-106">106</a>
-<a href="#cl-107">107</a>
-<a href="#cl-108">108</a>
-<a href="#cl-109">109</a>
-<a href="#cl-110">110</a>
-<a href="#cl-111">111</a>
-<a href="#cl-112">112</a>
-<a href="#cl-113">113</a>
-<a href="#cl-114">114</a>
-<a href="#cl-115">115</a>
-<a href="#cl-116">116</a>
-<a href="#cl-117">117</a>
-<a href="#cl-118">118</a>
-<a href="#cl-119">119</a>
-<a href="#cl-120">120</a>
-<a href="#cl-121">121</a>
-<a href="#cl-122">122</a>
-<a href="#cl-123">123</a>
-<a href="#cl-124">124</a>
-<a href="#cl-125">125</a>
-<a href="#cl-126">126</a>
-<a href="#cl-127">127</a>
-<a href="#cl-128">128</a>
-<a href="#cl-129">129</a>
-<a href="#cl-130">130</a>
-<a href="#cl-131">131</a>
-<a href="#cl-132">132</a>
-<a href="#cl-133">133</a>
-<a href="#cl-134">134</a>
-<a href="#cl-135">135</a>
-<a href="#cl-136">136</a>
-<a href="#cl-137">137</a>
-<a href="#cl-138">138</a>
-<a href="#cl-139">139</a>
-<a href="#cl-140">140</a>
-<a href="#cl-141">141</a>
-<a href="#cl-142">142</a>
-<a href="#cl-143">143</a>
-<a href="#cl-144">144</a>
-<a href="#cl-145">145</a>
-<a href="#cl-146">146</a>
-<a href="#cl-147">147</a>
-<a href="#cl-148">148</a>
-<a href="#cl-149">149</a>
-<a href="#cl-150">150</a>
-<a href="#cl-151">151</a>
-<a href="#cl-152">152</a>
-<a href="#cl-153">153</a>
-<a href="#cl-154">154</a>
-<a href="#cl-155">155</a>
-<a href="#cl-156">156</a>
-<a href="#cl-157">157</a>
-<a href="#cl-158">158</a>
-<a href="#cl-159">159</a>
-<a href="#cl-160">160</a>
-<a href="#cl-161">161</a>
-<a href="#cl-162">162</a>
-<a href="#cl-163">163</a>
-<a href="#cl-164">164</a>
-<a href="#cl-165">165</a>
-<a href="#cl-166">166</a>
-<a href="#cl-167">167</a>
-<a href="#cl-168">168</a>
-<a href="#cl-169">169</a>
-<a href="#cl-170">170</a>
-<a href="#cl-171">171</a>
-<a href="#cl-172">172</a>
-<a href="#cl-173">173</a>
-<a href="#cl-174">174</a>
-<a href="#cl-175">175</a>
-<a href="#cl-176">176</a>
-<a href="#cl-177">177</a>
-<a href="#cl-178">178</a>
-<a href="#cl-179">179</a>
-<a href="#cl-180">180</a>
-<a href="#cl-181">181</a>
-<a href="#cl-182">182</a>
-<a href="#cl-183">183</a>
-<a href="#cl-184">184</a>
-<a href="#cl-185">185</a>
-<a href="#cl-186">186</a>
-<a href="#cl-187">187</a>
-<a href="#cl-188">188</a>
-<a href="#cl-189">189</a>
-<a href="#cl-190">190</a>
-<a href="#cl-191">191</a>
-<a href="#cl-192">192</a>
-<a href="#cl-193">193</a>
-<a href="#cl-194">194</a>
-<a href="#cl-195">195</a>
-<a href="#cl-196">196</a>
-<a href="#cl-197">197</a>
-<a href="#cl-198">198</a>
-<a href="#cl-199">199</a>
-<a href="#cl-200">200</a>
-<a href="#cl-201">201</a>
-<a href="#cl-202">202</a>
-<a href="#cl-203">203</a>
-<a href="#cl-204">204</a>
-<a href="#cl-205">205</a>
-<a href="#cl-206">206</a>
-<a href="#cl-207">207</a>
-<a href="#cl-208">208</a>
-<a href="#cl-209">209</a>
-<a href="#cl-210">210</a>
-<a href="#cl-211">211</a>
-<a href="#cl-212">212</a>
-<a href="#cl-213">213</a>
-<a href="#cl-214">214</a>
-<a href="#cl-215">215</a>
-<a href="#cl-216">216</a>
-<a href="#cl-217">217</a>
-<a href="#cl-218">218</a>
-<a href="#cl-219">219</a>
-<a href="#cl-220">220</a>
-<a href="#cl-221">221</a>
-<a href="#cl-222">222</a>
-<a href="#cl-223">223</a>
-<a href="#cl-224">224</a>
-<a href="#cl-225">225</a>
-<a href="#cl-226">226</a>
-<a href="#cl-227">227</a>
-<a href="#cl-228">228</a>
-<a href="#cl-229">229</a>
-<a href="#cl-230">230</a>
-<a href="#cl-231">231</a>
-<a href="#cl-232">232</a>
-<a href="#cl-233">233</a>
-<a href="#cl-234">234</a>
-<a href="#cl-235">235</a>
-<a href="#cl-236">236</a>
-<a href="#cl-237">237</a>
-<a href="#cl-238">238</a>
-<a href="#cl-239">239</a>
-<a href="#cl-240">240</a>
-<a href="#cl-241">241</a>
-<a href="#cl-242">242</a>
-<a href="#cl-243">243</a>
-<a href="#cl-244">244</a>
-<a href="#cl-245">245</a>
-<a href="#cl-246">246</a>
-<a href="#cl-247">247</a>
-<a href="#cl-248">248</a>
-<a href="#cl-249">249</a>
-<a href="#cl-250">250</a>
-<a href="#cl-251">251</a>
-<a href="#cl-252">252</a>
-<a href="#cl-253">253</a>
-<a href="#cl-254">254</a>
-<a href="#cl-255">255</a>
-<a href="#cl-256">256</a>
-<a href="#cl-257">257</a>
-<a href="#cl-258">258</a>
-<a href="#cl-259">259</a>
-<a href="#cl-260">260</a>
-<a href="#cl-261">261</a>
-<a href="#cl-262">262</a>
-<a href="#cl-263">263</a>
-<a href="#cl-264">264</a>
-<a href="#cl-265">265</a>
-<a href="#cl-266">266</a>
-<a href="#cl-267">267</a>
-<a href="#cl-268">268</a>
-<a href="#cl-269">269</a>
-<a href="#cl-270">270</a>
-<a href="#cl-271">271</a>
-<a href="#cl-272">272</a>
-<a href="#cl-273">273</a>
-<a href="#cl-274">274</a>
-<a href="#cl-275">275</a>
-<a href="#cl-276">276</a>
-<a href="#cl-277">277</a>
-<a href="#cl-278">278</a>
-<a href="#cl-279">279</a>
-<a href="#cl-280">280</a>
-<a href="#cl-281">281</a>
-<a href="#cl-282">282</a>
-<a href="#cl-283">283</a>
-<a href="#cl-284">284</a>
-<a href="#cl-285">285</a>
-<a href="#cl-286">286</a>
-<a href="#cl-287">287</a>
-<a href="#cl-288">288</a>
-</pre></div></td><td class="code"><div class="highlight"><pre><a name="cl-1"></a><span class="c">#!/usr/bin/env python</span>
-<a name="cl-2"></a><span class="c"># -*- coding: utf-8 -*-</span>
-<a name="cl-3"></a>
-<a name="cl-4"></a><span class="c"># Miville</span>
-<a name="cl-5"></a><span class="c"># Copyright (C) 2008 Société des arts technologiques (SAT)</span>
-<a name="cl-6"></a><span class="c"># http://www.sat.qc.ca</span>
-<a name="cl-7"></a><span class="c"># All rights reserved.</span>
-<a name="cl-8"></a><span class="c">#</span>
-<a name="cl-9"></a><span class="c"># This file is free software: you can redistribute it and/or modify</span>
-<a name="cl-10"></a><span class="c"># it under the terms of the GNU General Public License as published by</span>
-<a name="cl-11"></a><span class="c"># the Free Software Foundation, either version 2 of the License, or</span>
-<a name="cl-12"></a><span class="c"># (at your option) any later version.</span>
-<a name="cl-13"></a><span class="c">#</span>
-<a name="cl-14"></a><span class="c"># Miville is distributed in the hope that it will be useful,</span>
-<a name="cl-15"></a><span class="c"># but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
-<a name="cl-16"></a><span class="c"># MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
-<a name="cl-17"></a><span class="c"># GNU General Public License for more details.</span>
-<a name="cl-18"></a><span class="c">#</span>
-<a name="cl-19"></a><span class="c"># You should have received a copy of the GNU General Public License</span>
-<a name="cl-20"></a><span class="c"># along with Miville. If not, see &lt;http://www.gnu.org/licenses/&gt;.</span>
-<a name="cl-21"></a>
-<a name="cl-22"></a><span class="sd">&quot;&quot;&quot;</span>
-<a name="cl-23"></a><span class="sd">This script parse a directory tree looking for python modules and packages and</span>
-<a name="cl-24"></a><span class="sd">create ReST files appropriately to create code documentation with Sphinx.</span>
-<a name="cl-25"></a><span class="sd">It also create a modules index. </span>
-<a name="cl-26"></a><span class="sd">&quot;&quot;&quot;</span>
-<a name="cl-27"></a>
-<a name="cl-28"></a><span class="kn">import</span> <span class="nn">os</span>
-<a name="cl-29"></a><span class="kn">import</span> <span class="nn">optparse</span>
-<a name="cl-30"></a>
-<a name="cl-31"></a>
-<a name="cl-32"></a><span class="c"># automodule options</span>
-<a name="cl-33"></a><span class="n">OPTIONS</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;members&#39;</span><span class="p">,</span>
-<a name="cl-34"></a> <span class="s">&#39;undoc-members&#39;</span><span class="p">,</span>
-<a name="cl-35"></a><span class="c"># &#39;inherited-members&#39;, # disable because there&#39;s a bug in sphinx</span>
-<a name="cl-36"></a> <span class="s">&#39;show-inheritance&#39;</span><span class="p">]</span>
-<a name="cl-37"></a>
-<a name="cl-38"></a>
-<a name="cl-39"></a><span class="k">def</span> <span class="nf">create_file_name</span><span class="p">(</span><span class="n">base</span><span class="p">,</span> <span class="n">opts</span><span class="p">):</span>
-<a name="cl-40"></a> <span class="sd">&quot;&quot;&quot;Create file name from base name, path and suffix&quot;&quot;&quot;</span>
-<a name="cl-41"></a> <span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">destdir</span><span class="p">,</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s">.</span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">base</span><span class="p">,</span> <span class="n">opts</span><span class="o">.</span><span class="n">suffix</span><span class="p">))</span>
-<a name="cl-42"></a>
-<a name="cl-43"></a><span class="k">def</span> <span class="nf">write_directive</span><span class="p">(</span><span class="n">module</span><span class="p">,</span> <span class="n">package</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
-<a name="cl-44"></a> <span class="sd">&quot;&quot;&quot;Create the automodule directive and add the options&quot;&quot;&quot;</span>
-<a name="cl-45"></a> <span class="k">if</span> <span class="n">package</span><span class="p">:</span>
-<a name="cl-46"></a> <span class="n">directive</span> <span class="o">=</span> <span class="s">&#39;.. automodule:: </span><span class="si">%s</span><span class="s">.</span><span class="si">%s</span><span class="se">\n</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">package</span><span class="p">,</span> <span class="n">module</span><span class="p">)</span>
-<a name="cl-47"></a> <span class="k">else</span><span class="p">:</span>
-<a name="cl-48"></a> <span class="n">directive</span> <span class="o">=</span> <span class="s">&#39;.. automodule:: </span><span class="si">%s</span><span class="se">\n</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">module</span>
-<a name="cl-49"></a> <span class="k">for</span> <span class="n">option</span> <span class="ow">in</span> <span class="n">OPTIONS</span><span class="p">:</span>
-<a name="cl-50"></a> <span class="n">directive</span> <span class="o">+=</span> <span class="s">&#39; :</span><span class="si">%s</span><span class="s">:</span><span class="se">\n</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">option</span>
-<a name="cl-51"></a> <span class="k">return</span> <span class="n">directive</span>
-<a name="cl-52"></a>
-<a name="cl-53"></a><span class="k">def</span> <span class="nf">write_heading</span><span class="p">(</span><span class="n">module</span><span class="p">,</span> <span class="n">kind</span><span class="o">=</span><span class="s">&#39;Module&#39;</span><span class="p">):</span>
-<a name="cl-54"></a> <span class="sd">&quot;&quot;&quot;Create the page heading.&quot;&quot;&quot;</span>
-<a name="cl-55"></a> <span class="n">module</span> <span class="o">=</span> <span class="n">module</span><span class="o">.</span><span class="n">title</span><span class="p">()</span>
-<a name="cl-56"></a> <span class="n">heading</span> <span class="o">=</span> <span class="n">title_line</span><span class="p">(</span><span class="n">module</span> <span class="o">+</span> <span class="s">&#39; Documentation&#39;</span><span class="p">,</span> <span class="s">&#39;=&#39;</span><span class="p">)</span>
-<a name="cl-57"></a> <span class="n">heading</span> <span class="o">+=</span> <span class="s">&#39;This page contains the </span><span class="si">%s</span><span class="s"> </span><span class="si">%s</span><span class="s"> documentation.</span><span class="se">\n\n</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">module</span><span class="p">,</span> <span class="n">kind</span><span class="p">)</span>
-<a name="cl-58"></a> <span class="k">return</span> <span class="n">heading</span>
-<a name="cl-59"></a>
-<a name="cl-60"></a><span class="k">def</span> <span class="nf">write_sub</span><span class="p">(</span><span class="n">module</span><span class="p">,</span> <span class="n">kind</span><span class="o">=</span><span class="s">&#39;Module&#39;</span><span class="p">):</span>
-<a name="cl-61"></a> <span class="sd">&quot;&quot;&quot;Create the module subtitle&quot;&quot;&quot;</span>
-<a name="cl-62"></a> <span class="n">sub</span> <span class="o">=</span> <span class="n">title_line</span><span class="p">(</span><span class="s">&#39;The :mod:`</span><span class="si">%s</span><span class="s">` </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">module</span><span class="p">,</span> <span class="n">kind</span><span class="p">),</span> <span class="s">&#39;-&#39;</span><span class="p">)</span>
-<a name="cl-63"></a> <span class="k">return</span> <span class="n">sub</span>
-<a name="cl-64"></a>
-<a name="cl-65"></a><span class="k">def</span> <span class="nf">title_line</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">char</span><span class="p">):</span>
-<a name="cl-66"></a> <span class="sd">&quot;&quot;&quot; Underline the title with the character pass, with the right length.&quot;&quot;&quot;</span>
-<a name="cl-67"></a> <span class="k">return</span> <span class="s">&#39;</span><span class="si">%s</span><span class="se">\n</span><span class="si">%s</span><span class="se">\n\n</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">title</span><span class="p">)</span> <span class="o">*</span> <span class="n">char</span><span class="p">)</span>
-<a name="cl-68"></a>
-<a name="cl-69"></a><span class="k">def</span> <span class="nf">create_module_file</span><span class="p">(</span><span class="n">package</span><span class="p">,</span> <span class="n">module</span><span class="p">,</span> <span class="n">opts</span><span class="p">):</span>
-<a name="cl-70"></a> <span class="sd">&quot;&quot;&quot;Build the text of the file and write the file.&quot;&quot;&quot;</span>
-<a name="cl-71"></a> <span class="n">name</span> <span class="o">=</span> <span class="n">create_file_name</span><span class="p">(</span><span class="n">module</span><span class="p">,</span> <span class="n">opts</span><span class="p">)</span>
-<a name="cl-72"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">opts</span><span class="o">.</span><span class="n">force</span> <span class="ow">and</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
-<a name="cl-73"></a> <span class="k">print</span> <span class="s">&#39;File </span><span class="si">%s</span><span class="s"> already exists.&#39;</span> <span class="o">%</span> <span class="n">name</span>
-<a name="cl-74"></a> <span class="k">else</span><span class="p">:</span>
-<a name="cl-75"></a> <span class="k">print</span> <span class="s">&#39;Creating file </span><span class="si">%s</span><span class="s"> (module).&#39;</span> <span class="o">%</span> <span class="n">name</span>
-<a name="cl-76"></a> <span class="n">text</span> <span class="o">=</span> <span class="n">write_heading</span><span class="p">(</span><span class="n">module</span><span class="p">)</span>
-<a name="cl-77"></a> <span class="n">text</span> <span class="o">+=</span> <span class="n">write_sub</span><span class="p">(</span><span class="n">module</span><span class="p">)</span>
-<a name="cl-78"></a> <span class="n">text</span> <span class="o">+=</span> <span class="n">write_directive</span><span class="p">(</span><span class="n">module</span><span class="p">,</span> <span class="n">package</span><span class="p">)</span>
-<a name="cl-79"></a>
-<a name="cl-80"></a> <span class="c"># write the file</span>
-<a name="cl-81"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">opts</span><span class="o">.</span><span class="n">dryrun</span><span class="p">:</span>
-<a name="cl-82"></a> <span class="n">fd</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s">&#39;w&#39;</span><span class="p">)</span>
-<a name="cl-83"></a> <span class="n">fd</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
-<a name="cl-84"></a> <span class="n">fd</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
-<a name="cl-85"></a>
-<a name="cl-86"></a><span class="k">def</span> <span class="nf">create_package_file</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">master_package</span><span class="p">,</span> <span class="n">subroot</span><span class="p">,</span> <span class="n">py_files</span><span class="p">,</span> <span class="n">opts</span><span class="p">,</span> <span class="n">subs</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
-<a name="cl-87"></a> <span class="sd">&quot;&quot;&quot;Build the text of the file and write the file.&quot;&quot;&quot;</span>
-<a name="cl-88"></a> <span class="n">package</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">root</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
-<a name="cl-89"></a> <span class="n">name</span> <span class="o">=</span> <span class="n">create_file_name</span><span class="p">(</span><span class="n">subroot</span><span class="p">,</span> <span class="n">opts</span><span class="p">)</span>
-<a name="cl-90"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">opts</span><span class="o">.</span><span class="n">force</span> <span class="ow">and</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
-<a name="cl-91"></a> <span class="k">print</span> <span class="s">&#39;File </span><span class="si">%s</span><span class="s"> already exists.&#39;</span> <span class="o">%</span> <span class="n">name</span>
-<a name="cl-92"></a> <span class="k">else</span><span class="p">:</span>
-<a name="cl-93"></a> <span class="k">print</span> <span class="s">&#39;Creating file </span><span class="si">%s</span><span class="s"> (package).&#39;</span> <span class="o">%</span> <span class="n">name</span>
-<a name="cl-94"></a> <span class="n">text</span> <span class="o">=</span> <span class="n">write_heading</span><span class="p">(</span><span class="n">package</span><span class="p">,</span> <span class="s">&#39;Package&#39;</span><span class="p">)</span>
-<a name="cl-95"></a> <span class="k">if</span> <span class="n">subs</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
-<a name="cl-96"></a> <span class="n">subs</span> <span class="o">=</span> <span class="p">[]</span>
-<a name="cl-97"></a> <span class="k">else</span><span class="p">:</span>
-<a name="cl-98"></a> <span class="c"># build a list of directories that are package (they contain an __init_.py file)</span>
-<a name="cl-99"></a> <span class="n">subs</span> <span class="o">=</span> <span class="p">[</span><span class="n">sub</span> <span class="k">for</span> <span class="n">sub</span> <span class="ow">in</span> <span class="n">subs</span> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">sub</span><span class="p">,</span> <span class="s">&#39;__init__.py&#39;</span><span class="p">))]</span>
-<a name="cl-100"></a> <span class="c"># if there&#39;s some package directories, add a TOC for theses subpackages</span>
-<a name="cl-101"></a> <span class="k">if</span> <span class="n">subs</span><span class="p">:</span>
-<a name="cl-102"></a> <span class="n">text</span> <span class="o">+=</span> <span class="n">title_line</span><span class="p">(</span><span class="s">&#39;Subpackages&#39;</span><span class="p">,</span> <span class="s">&#39;-&#39;</span><span class="p">)</span>
-<a name="cl-103"></a> <span class="n">text</span> <span class="o">+=</span> <span class="s">&#39;.. toctree::</span><span class="se">\n\n</span><span class="s">&#39;</span>
-<a name="cl-104"></a> <span class="k">for</span> <span class="n">sub</span> <span class="ow">in</span> <span class="n">subs</span><span class="p">:</span>
-<a name="cl-105"></a> <span class="n">text</span> <span class="o">+=</span> <span class="s">&#39; </span><span class="si">%s</span><span class="s">.</span><span class="si">%s</span><span class="se">\n</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">subroot</span><span class="p">,</span> <span class="n">sub</span><span class="p">)</span>
-<a name="cl-106"></a> <span class="n">text</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span>
-<a name="cl-107"></a>
-<a name="cl-108"></a> <span class="c"># add each package&#39;s module</span>
-<a name="cl-109"></a> <span class="k">for</span> <span class="n">py_file</span> <span class="ow">in</span> <span class="n">py_files</span><span class="p">:</span>
-<a name="cl-110"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">check_for_code</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">py_file</span><span class="p">)):</span>
-<a name="cl-111"></a> <span class="c"># don&#39;t build the file if there&#39;s no code in it</span>
-<a name="cl-112"></a> <span class="k">continue</span>
-<a name="cl-113"></a> <span class="n">py_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">splitext</span><span class="p">(</span><span class="n">py_file</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
-<a name="cl-114"></a> <span class="n">py_path</span> <span class="o">=</span> <span class="s">&#39;</span><span class="si">%s</span><span class="s">.</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">subroot</span><span class="p">,</span> <span class="n">py_file</span><span class="p">)</span>
-<a name="cl-115"></a> <span class="n">kind</span> <span class="o">=</span> <span class="s">&quot;Module&quot;</span>
-<a name="cl-116"></a> <span class="k">if</span> <span class="n">py_file</span> <span class="o">==</span> <span class="s">&#39;__init__&#39;</span><span class="p">:</span>
-<a name="cl-117"></a> <span class="n">kind</span> <span class="o">=</span> <span class="s">&quot;Package&quot;</span>
-<a name="cl-118"></a> <span class="n">text</span> <span class="o">+=</span> <span class="n">write_sub</span><span class="p">(</span><span class="n">kind</span> <span class="o">==</span> <span class="s">&#39;Package&#39;</span> <span class="ow">and</span> <span class="n">package</span> <span class="ow">or</span> <span class="n">py_file</span><span class="p">,</span> <span class="n">kind</span><span class="p">)</span>
-<a name="cl-119"></a> <span class="n">text</span> <span class="o">+=</span> <span class="n">write_directive</span><span class="p">(</span><span class="n">kind</span> <span class="o">==</span> <span class="s">&quot;Package&quot;</span> <span class="ow">and</span> <span class="n">subroot</span> <span class="ow">or</span> <span class="n">py_path</span><span class="p">,</span> <span class="n">master_package</span><span class="p">)</span>
-<a name="cl-120"></a> <span class="n">text</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span>
-<a name="cl-121"></a>
-<a name="cl-122"></a> <span class="c"># write the file</span>
-<a name="cl-123"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">opts</span><span class="o">.</span><span class="n">dryrun</span><span class="p">:</span>
-<a name="cl-124"></a> <span class="n">fd</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s">&#39;w&#39;</span><span class="p">)</span>
-<a name="cl-125"></a> <span class="n">fd</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
-<a name="cl-126"></a> <span class="n">fd</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
-<a name="cl-127"></a>
-<a name="cl-128"></a><span class="k">def</span> <span class="nf">check_for_code</span><span class="p">(</span><span class="n">module</span><span class="p">):</span>
-<a name="cl-129"></a> <span class="sd">&quot;&quot;&quot;</span>
-<a name="cl-130"></a><span class="sd"> Check if there&#39;s at least one class or one function in the module.</span>
-<a name="cl-131"></a><span class="sd"> &quot;&quot;&quot;</span>
-<a name="cl-132"></a> <span class="n">fd</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">module</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span>
-<a name="cl-133"></a> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">fd</span><span class="p">:</span>
-<a name="cl-134"></a> <span class="k">if</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&#39;def &#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&#39;class &#39;</span><span class="p">):</span>
-<a name="cl-135"></a> <span class="n">fd</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
-<a name="cl-136"></a> <span class="k">return</span> <span class="bp">True</span>
-<a name="cl-137"></a> <span class="n">fd</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
-<a name="cl-138"></a> <span class="k">return</span> <span class="bp">False</span>
-<a name="cl-139"></a>
-<a name="cl-140"></a><span class="k">def</span> <span class="nf">recurse_tree</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">excludes</span><span class="p">,</span> <span class="n">opts</span><span class="p">):</span>
-<a name="cl-141"></a> <span class="sd">&quot;&quot;&quot;</span>
-<a name="cl-142"></a><span class="sd"> Look for every file in the directory tree and create the corresponding</span>
-<a name="cl-143"></a><span class="sd"> ReST files.</span>
-<a name="cl-144"></a><span class="sd"> &quot;&quot;&quot;</span>
-<a name="cl-145"></a> <span class="n">package_name</span> <span class="o">=</span> <span class="bp">None</span>
-<a name="cl-146"></a> <span class="c"># check if the base directory is a package and get is name</span>
-<a name="cl-147"></a> <span class="k">if</span> <span class="s">&#39;__init__.py&#39;</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
-<a name="cl-148"></a> <span class="n">package_name</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">path</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">sep</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
-<a name="cl-149"></a>
-<a name="cl-150"></a> <span class="n">toc</span> <span class="o">=</span> <span class="p">[]</span>
-<a name="cl-151"></a> <span class="n">excludes</span> <span class="o">=</span> <span class="n">format_excludes</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">excludes</span><span class="p">)</span>
-<a name="cl-152"></a> <span class="n">tree</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">walk</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span>
-<a name="cl-153"></a> <span class="k">for</span> <span class="n">root</span><span class="p">,</span> <span class="n">subs</span><span class="p">,</span> <span class="n">files</span> <span class="ow">in</span> <span class="n">tree</span><span class="p">:</span>
-<a name="cl-154"></a> <span class="c"># keep only the Python script files</span>
-<a name="cl-155"></a> <span class="n">py_files</span> <span class="o">=</span> <span class="n">check_py_file</span><span class="p">(</span><span class="n">files</span><span class="p">)</span>
-<a name="cl-156"></a> <span class="c"># remove hidden (&#39;.&#39;) and private (&#39;_&#39;) directories</span>
-<a name="cl-157"></a> <span class="n">subs</span> <span class="o">=</span> <span class="p">[</span><span class="n">sub</span> <span class="k">for</span> <span class="n">sub</span> <span class="ow">in</span> <span class="n">subs</span> <span class="k">if</span> <span class="n">sub</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s">&#39;.&#39;</span><span class="p">,</span> <span class="s">&#39;_&#39;</span><span class="p">]]</span>
-<a name="cl-158"></a> <span class="c"># check if there&#39;s valid files to process</span>
-<a name="cl-159"></a> <span class="c"># TODO: could add check for windows hidden files</span>
-<a name="cl-160"></a> <span class="k">if</span> <span class="s">&quot;/.&quot;</span> <span class="ow">in</span> <span class="n">root</span> <span class="ow">or</span> <span class="s">&quot;/_&quot;</span> <span class="ow">in</span> <span class="n">root</span> \
-<a name="cl-161"></a> <span class="ow">or</span> <span class="ow">not</span> <span class="n">py_files</span> \
-<a name="cl-162"></a> <span class="ow">or</span> <span class="n">check_excludes</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">excludes</span><span class="p">):</span>
-<a name="cl-163"></a> <span class="k">continue</span>
-<a name="cl-164"></a> <span class="n">subroot</span> <span class="o">=</span> <span class="n">root</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">path</span><span class="p">):]</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">sep</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">sep</span><span class="p">,</span> <span class="s">&#39;.&#39;</span><span class="p">)</span>
-<a name="cl-165"></a> <span class="k">if</span> <span class="n">root</span> <span class="o">==</span> <span class="n">path</span><span class="p">:</span>
-<a name="cl-166"></a> <span class="c"># we are at the root level so we create only modules</span>
-<a name="cl-167"></a> <span class="k">for</span> <span class="n">py_file</span> <span class="ow">in</span> <span class="n">py_files</span><span class="p">:</span>
-<a name="cl-168"></a> <span class="n">module</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">splitext</span><span class="p">(</span><span class="n">py_file</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
-<a name="cl-169"></a> <span class="c"># add the module if it contains code</span>
-<a name="cl-170"></a> <span class="k">if</span> <span class="n">check_for_code</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s">&#39;</span><span class="si">%s</span><span class="s">.py&#39;</span> <span class="o">%</span> <span class="n">module</span><span class="p">)):</span>
-<a name="cl-171"></a> <span class="n">create_module_file</span><span class="p">(</span><span class="n">package_name</span><span class="p">,</span> <span class="n">module</span><span class="p">,</span> <span class="n">opts</span><span class="p">)</span>
-<a name="cl-172"></a> <span class="n">toc</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">module</span><span class="p">)</span>
-<a name="cl-173"></a> <span class="k">elif</span> <span class="ow">not</span> <span class="n">subs</span> <span class="ow">and</span> <span class="s">&quot;__init__.py&quot;</span> <span class="ow">in</span> <span class="n">py_files</span><span class="p">:</span>
-<a name="cl-174"></a> <span class="c"># we are in a package without sub package</span>
-<a name="cl-175"></a> <span class="c"># check if there&#39;s only an __init__.py file</span>
-<a name="cl-176"></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">py_files</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
-<a name="cl-177"></a> <span class="c"># check if there&#39;s code in the __init__.py file</span>
-<a name="cl-178"></a> <span class="k">if</span> <span class="n">check_for_code</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="s">&#39;__init__.py&#39;</span><span class="p">)):</span>
-<a name="cl-179"></a> <span class="n">create_package_file</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">package_name</span><span class="p">,</span> <span class="n">subroot</span><span class="p">,</span> <span class="n">py_files</span><span class="p">,</span> <span class="n">opts</span><span class="o">=</span><span class="n">opts</span><span class="p">)</span>
-<a name="cl-180"></a> <span class="n">toc</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">subroot</span><span class="p">)</span>
-<a name="cl-181"></a> <span class="k">else</span><span class="p">:</span>
-<a name="cl-182"></a> <span class="n">create_package_file</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">package_name</span><span class="p">,</span> <span class="n">subroot</span><span class="p">,</span> <span class="n">py_files</span><span class="p">,</span> <span class="n">opts</span><span class="o">=</span><span class="n">opts</span><span class="p">)</span>
-<a name="cl-183"></a> <span class="n">toc</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">subroot</span><span class="p">)</span>
-<a name="cl-184"></a> <span class="k">elif</span> <span class="s">&quot;__init__.py&quot;</span> <span class="ow">in</span> <span class="n">py_files</span><span class="p">:</span>
-<a name="cl-185"></a> <span class="c"># we are in package with subpackage(s)</span>
-<a name="cl-186"></a> <span class="n">create_package_file</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">package_name</span><span class="p">,</span> <span class="n">subroot</span><span class="p">,</span> <span class="n">py_files</span><span class="p">,</span> <span class="n">opts</span><span class="p">,</span> <span class="n">subs</span><span class="p">)</span>
-<a name="cl-187"></a> <span class="n">toc</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">subroot</span><span class="p">)</span>
-<a name="cl-188"></a>
-<a name="cl-189"></a> <span class="c"># create the module&#39;s index</span>
-<a name="cl-190"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">opts</span><span class="o">.</span><span class="n">notoc</span><span class="p">:</span>
-<a name="cl-191"></a> <span class="n">modules_toc</span><span class="p">(</span><span class="n">toc</span><span class="p">,</span> <span class="n">opts</span><span class="p">)</span>
-<a name="cl-192"></a>
-<a name="cl-193"></a><span class="k">def</span> <span class="nf">modules_toc</span><span class="p">(</span><span class="n">modules</span><span class="p">,</span> <span class="n">opts</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s">&#39;modules&#39;</span><span class="p">):</span>
-<a name="cl-194"></a> <span class="sd">&quot;&quot;&quot;</span>
-<a name="cl-195"></a><span class="sd"> Create the module&#39;s index.</span>
-<a name="cl-196"></a><span class="sd"> &quot;&quot;&quot;</span>
-<a name="cl-197"></a> <span class="n">fname</span> <span class="o">=</span> <span class="n">create_file_name</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">opts</span><span class="p">)</span>
-<a name="cl-198"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">opts</span><span class="o">.</span><span class="n">force</span> <span class="ow">and</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">fname</span><span class="p">):</span>
-<a name="cl-199"></a> <span class="k">print</span> <span class="s">&quot;File </span><span class="si">%s</span><span class="s"> already exists.&quot;</span> <span class="o">%</span> <span class="n">name</span>
-<a name="cl-200"></a> <span class="k">return</span>
-<a name="cl-201"></a>
-<a name="cl-202"></a> <span class="k">print</span> <span class="s">&quot;Creating module&#39;s index modules.txt.&quot;</span>
-<a name="cl-203"></a> <span class="n">text</span> <span class="o">=</span> <span class="n">write_heading</span><span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">header</span><span class="p">,</span> <span class="s">&#39;Modules&#39;</span><span class="p">)</span>
-<a name="cl-204"></a> <span class="n">text</span> <span class="o">+=</span> <span class="n">title_line</span><span class="p">(</span><span class="s">&#39;Modules:&#39;</span><span class="p">,</span> <span class="s">&#39;-&#39;</span><span class="p">)</span>
-<a name="cl-205"></a> <span class="n">text</span> <span class="o">+=</span> <span class="s">&#39;.. toctree::</span><span class="se">\n</span><span class="s">&#39;</span>
-<a name="cl-206"></a> <span class="n">text</span> <span class="o">+=</span> <span class="s">&#39; :maxdepth: </span><span class="si">%s</span><span class="se">\n\n</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">opts</span><span class="o">.</span><span class="n">maxdepth</span>
-<a name="cl-207"></a>
-<a name="cl-208"></a> <span class="n">modules</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span>
-<a name="cl-209"></a> <span class="n">prev_module</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
-<a name="cl-210"></a> <span class="k">for</span> <span class="n">module</span> <span class="ow">in</span> <span class="n">modules</span><span class="p">:</span>
-<a name="cl-211"></a> <span class="c"># look if the module is a subpackage and, if yes, ignore it</span>
-<a name="cl-212"></a> <span class="k">if</span> <span class="n">module</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">prev_module</span> <span class="o">+</span> <span class="s">&#39;.&#39;</span><span class="p">):</span>
-<a name="cl-213"></a> <span class="k">continue</span>
-<a name="cl-214"></a> <span class="n">prev_module</span> <span class="o">=</span> <span class="n">module</span>
-<a name="cl-215"></a> <span class="n">text</span> <span class="o">+=</span> <span class="s">&#39; </span><span class="si">%s</span><span class="se">\n</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">module</span>
-<a name="cl-216"></a>
-<a name="cl-217"></a> <span class="c"># write the file</span>
-<a name="cl-218"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">opts</span><span class="o">.</span><span class="n">dryrun</span><span class="p">:</span>
-<a name="cl-219"></a> <span class="n">fd</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">fname</span><span class="p">,</span> <span class="s">&#39;w&#39;</span><span class="p">)</span>
-<a name="cl-220"></a> <span class="n">fd</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
-<a name="cl-221"></a> <span class="n">fd</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
-<a name="cl-222"></a>
-<a name="cl-223"></a><span class="k">def</span> <span class="nf">format_excludes</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">excludes</span><span class="p">):</span>
-<a name="cl-224"></a> <span class="sd">&quot;&quot;&quot;</span>
-<a name="cl-225"></a><span class="sd"> Format the excluded directory list.</span>
-<a name="cl-226"></a><span class="sd"> (verify that the path is not from the root of the volume or the root of the</span>
-<a name="cl-227"></a><span class="sd"> package)</span>
-<a name="cl-228"></a><span class="sd"> &quot;&quot;&quot;</span>
-<a name="cl-229"></a> <span class="n">f_excludes</span> <span class="o">=</span> <span class="p">[]</span>
-<a name="cl-230"></a> <span class="k">for</span> <span class="n">exclude</span> <span class="ow">in</span> <span class="n">excludes</span><span class="p">:</span>
-<a name="cl-231"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isabs</span><span class="p">(</span><span class="n">exclude</span><span class="p">)</span> <span class="ow">and</span> <span class="n">exclude</span><span class="p">[:</span><span class="nb">len</span><span class="p">(</span><span class="n">path</span><span class="p">)]</span> <span class="o">!=</span> <span class="n">path</span><span class="p">:</span>
-<a name="cl-232"></a> <span class="n">exclude</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">exclude</span><span class="p">)</span>
-<a name="cl-233"></a> <span class="c"># remove trailing slash</span>
-<a name="cl-234"></a> <span class="n">f_excludes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">exclude</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">sep</span><span class="p">))</span>
-<a name="cl-235"></a> <span class="k">return</span> <span class="n">f_excludes</span>
-<a name="cl-236"></a>
-<a name="cl-237"></a><span class="k">def</span> <span class="nf">check_excludes</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">excludes</span><span class="p">):</span>
-<a name="cl-238"></a> <span class="sd">&quot;&quot;&quot;</span>
-<a name="cl-239"></a><span class="sd"> Check if the directory is in the exclude list.</span>
-<a name="cl-240"></a><span class="sd"> &quot;&quot;&quot;</span>
-<a name="cl-241"></a> <span class="k">for</span> <span class="n">exclude</span> <span class="ow">in</span> <span class="n">excludes</span><span class="p">:</span>
-<a name="cl-242"></a> <span class="k">if</span> <span class="n">root</span><span class="p">[:</span><span class="nb">len</span><span class="p">(</span><span class="n">exclude</span><span class="p">)]</span> <span class="o">==</span> <span class="n">exclude</span><span class="p">:</span>
-<a name="cl-243"></a> <span class="k">return</span> <span class="bp">True</span>
-<a name="cl-244"></a> <span class="k">return</span> <span class="bp">False</span>
-<a name="cl-245"></a>
-<a name="cl-246"></a><span class="k">def</span> <span class="nf">check_py_file</span><span class="p">(</span><span class="n">files</span><span class="p">):</span>
-<a name="cl-247"></a> <span class="sd">&quot;&quot;&quot;</span>
-<a name="cl-248"></a><span class="sd"> Return a list with only the python scripts (remove all other files). </span>
-<a name="cl-249"></a><span class="sd"> &quot;&quot;&quot;</span>
-<a name="cl-250"></a> <span class="n">py_files</span> <span class="o">=</span> <span class="p">[</span><span class="n">fich</span> <span class="k">for</span> <span class="n">fich</span> <span class="ow">in</span> <span class="n">files</span> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">splitext</span><span class="p">(</span><span class="n">fich</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;.py&#39;</span><span class="p">]</span>
-<a name="cl-251"></a> <span class="k">return</span> <span class="n">py_files</span>
-<a name="cl-252"></a>
-<a name="cl-253"></a>
-<a name="cl-254"></a><span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
-<a name="cl-255"></a> <span class="sd">&quot;&quot;&quot;</span>
-<a name="cl-256"></a><span class="sd"> Parse and check the command line arguments</span>
-<a name="cl-257"></a><span class="sd"> &quot;&quot;&quot;</span>
-<a name="cl-258"></a> <span class="n">parser</span> <span class="o">=</span> <span class="n">optparse</span><span class="o">.</span><span class="n">OptionParser</span><span class="p">(</span><span class="n">usage</span><span class="o">=</span><span class="s">&quot;&quot;&quot;usage: %prog [options] &lt;package path&gt; [exclude paths, ...]</span>
-<a name="cl-259"></a><span class="s"> </span>
-<a name="cl-260"></a><span class="s">Note: By default this script will not overwrite already created files.&quot;&quot;&quot;</span><span class="p">)</span>
-<a name="cl-261"></a> <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&quot;-n&quot;</span><span class="p">,</span> <span class="s">&quot;--doc-header&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;store&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;header&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;Documentation Header (default=Project)&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s">&quot;Project&quot;</span><span class="p">)</span>
-<a name="cl-262"></a> <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&quot;-d&quot;</span><span class="p">,</span> <span class="s">&quot;--dest-dir&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;store&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;destdir&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;Output destination directory&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s">&quot;&quot;</span><span class="p">)</span>
-<a name="cl-263"></a> <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&quot;-s&quot;</span><span class="p">,</span> <span class="s">&quot;--suffix&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;store&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;suffix&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;module suffix (default=txt)&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s">&quot;txt&quot;</span><span class="p">)</span>
-<a name="cl-264"></a> <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;--maxdepth&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;store&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;maxdepth&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;Maximum depth of submodules to show in the TOC (default=4)&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="s">&quot;int&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="mi">4</span><span class="p">)</span>
-<a name="cl-265"></a> <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;--dry-run&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;store_true&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;dryrun&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;Run the script without creating the files&quot;</span><span class="p">)</span>
-<a name="cl-266"></a> <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> <span class="n">action</span><span class="o">=</span><span class="s">&quot;store_true&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;force&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;Overwrite all the files&quot;</span><span class="p">)</span>
-<a name="cl-267"></a> <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&quot;-t&quot;</span><span class="p">,</span> <span class="s">&quot;--no-toc&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;store_true&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;notoc&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;Don&#39;t create the table of content file&quot;</span><span class="p">)</span>
-<a name="cl-268"></a> <span class="p">(</span><span class="n">opts</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>
-<a name="cl-269"></a> <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">&lt;</span> <span class="mi">1</span><span class="p">:</span>
-<a name="cl-270"></a> <span class="n">parser</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s">&quot;package path is required.&quot;</span><span class="p">)</span>
-<a name="cl-271"></a> <span class="k">else</span><span class="p">:</span>
-<a name="cl-272"></a> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isdir</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]):</span>
-<a name="cl-273"></a> <span class="c"># check if the output destination is a valid directory</span>
-<a name="cl-274"></a> <span class="k">if</span> <span class="n">opts</span><span class="o">.</span><span class="n">destdir</span> <span class="ow">and</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isdir</span><span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">destdir</span><span class="p">):</span>
-<a name="cl-275"></a> <span class="c"># if there&#39;s some exclude arguments, build the list of excludes</span>
-<a name="cl-276"></a> <span class="n">excludes</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
-<a name="cl-277"></a> <span class="n">recurse_tree</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">excludes</span><span class="p">,</span> <span class="n">opts</span><span class="p">)</span>
-<a name="cl-278"></a> <span class="k">else</span><span class="p">:</span>
-<a name="cl-279"></a> <span class="k">print</span> <span class="s">&#39;</span><span class="si">%s</span><span class="s"> is not a valid output destination directory.&#39;</span> <span class="o">%</span> <span class="n">opts</span><span class="o">.</span><span class="n">destdir</span>
-<a name="cl-280"></a> <span class="k">else</span><span class="p">:</span>
-<a name="cl-281"></a> <span class="k">print</span> <span class="s">&#39;</span><span class="si">%s</span><span class="s"> is not a valid directory.&#39;</span> <span class="o">%</span> <span class="n">args</span>
-<a name="cl-282"></a>
-<a name="cl-283"></a>
-<a name="cl-284"></a>
-<a name="cl-285"></a>
-<a name="cl-286"></a><span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
-<a name="cl-287"></a> <span class="n">main</span><span class="p">()</span>
-<a name="cl-288"></a>
-</pre></div>
-</td></tr></table>
-
-
-</div>
-
-
-
- <div class="cb"></div>
- </div>
- <div class="cb footer-placeholder"></div>
- </div>
- <div id="footer-wrapper">
- <div id="footer">
- <a href="/site/terms/">TOS</a> | <a href="/site/privacy/">Privacy Policy</a> | <a href="http://blog.bitbucket.org/">Blog</a> | <a href="http://bitbucket.org/jespern/bitbucket/issues/new/">Report Bug</a> | <a href="http://groups.google.com/group/bitbucket-users">Discuss</a> | <a href="http://avantlumiere.com/">&copy; 2008-2010</a>
- | We run <small><b>
- <a href="http://www.djangoproject.com/">Django 1.2.1</a> /
- <a href="http://bitbucket.org/jespern/django-piston/">Piston 0.2.3rc1</a> /
- <a href="http://www.selenic.com/mercurial/">Hg 1.3.1</a> /
- <a href="http://www.python.org">Python 2.5.2</a> /
- r3049| fe02
- </b></small>
- </div>
- </div>
-
- <script type="text/javascript">
- var _gaq = _gaq || [];
- _gaq.push(['_setAccount', 'UA-2456069-3'], ['_trackPageview']);
-
- var _gaq = _gaq || [];
- _gaq.push(['atl._setAccount', 'UA-6032469-33'], ['atl._trackPageview']);
- (function() {
- var ga = document.createElement('script');
- ga.src = ('https:' == document.location.protocol ? 'https://ssl' :
- 'http://www') + '.google-analytics.com/ga.js';
- ga.setAttribute('async', 'true');
- document.documentElement.firstChild.appendChild(ga);
- })();
- </script>
-
-</body>
-</html>
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Miville
+# Copyright (C) 2008 Société des arts technologiques (SAT)
+# http://www.sat.qc.ca
+# All rights reserved.
+#
+# This file is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# Miville is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Miville. If not, see <http://www.gnu.org/licenses/>.
+
+"""
+This script parse a directory tree looking for python modules and packages and
+create ReST files appropriately to create code documentation with Sphinx.
+It also create a modules index.
+"""
+
+import os
+import optparse
+
+
+# automodule options
+OPTIONS = ['members',
+ 'undoc-members',
+# 'inherited-members', # disable because there's a bug in sphinx
+ 'show-inheritance']
+
+
+def create_file_name(base, opts):
+ """Create file name from base name, path and suffix"""
+ return os.path.join(opts.destdir, "%s.%s" % (base, opts.suffix))
+
+def write_automodule_directive(module):
+ """Create the automodule directive and add the options"""
+ directive = '.. automodule:: %s\n' % module
+ for option in OPTIONS:
+ directive += ' :%s:\n' % option
+ directive += '\n'
+ return directive
+
+def write_heading(module, kind='Module'):
+ """Create the page heading."""
+ heading = '.. _%s:\n' % module
+ heading += '\n'
+ heading += title_line(module, '=')
+ return heading
+
+def write_sub(module, kind='Module'):
+ """Create the module subtitle"""
+ sub = title_line('The :mod:`%s` %s' % (module, kind), '-')
+ return sub
+
+def title_line(title, char):
+ """ Underline the title with the character pass, with the right length."""
+ return ':mod:`%s`\n%s\n\n' % (title, len(title) * char)
+
+def create_module_content(module):
+ """Build the text of the module file."""
+ text = write_heading(module)
+ #text += write_sub(module)
+ text += write_automodule_directive(module)
+ return text
+
+def is_python_package(path):
+ """returns True if directory is Python package
+ - that is - contains the __index__.py file
+ returns False otherwise
+ """
+ return os.path.isfile(os.path.join(path, '__init__.py'))
+
+def create_package_content(package, py_files, sub_packages):
+ """Build the text of the file"""
+
+ text = write_heading(package, 'Package')
+ text += write_automodule_directive(package)
+
+ #if has py_files or sub_packages
+ # output Package summary:
+ # has #modules, #sub-packages, #members
+
+ #create links to sub-module files
+ if py_files:
+ text += '.. _modules::\n'
+ text += '\n'
+ text += title_line('Modules', '-')
+ text += '\n'
+ for py_file in py_files:
+ if py_file == '__init__.py':
+ #continue, because this file is being created for
+ #__init__.py of the current module
+ continue
+ py_file = os.path.splitext(py_file)[0]
+ text += '* :ref:`%s.%s`\n' % (package, py_file)
+ text += '\n'
+
+ #create links to sub-packages
+ if sub_packages:
+ text += '.. _packages::\n'
+ text += '\n'
+ text += title_line('Subpackages', '-')
+ text += '\n'
+ for sub in sub_packages:
+ #todo - add description here
+ text += '* :ref:`%s.%s`\n' % (package, sub)
+ return text
+ #build toctree for the package page
+ #text += '.. toctree::\n\n'
+ #for sub in subs:
+ # text += ' %s.%s\n' % (package, sub)
+
+def write_file(module_name, text_content, opts):
+ """Saves file for the module uses text_content for content
+ and information within options to determine where to save
+
+ respects options "dry run" and "force"
+ """
+ file_path = create_file_name(module_name, opts)
+ if not opts.force and os.path.isfile(file_path):
+ print 'File %s already exists.' % file_path
+ else:
+ print 'Writing file %s' % file_path
+ # write the file
+ if not opts.dryrun:
+ fd = open(file_path, 'w')
+ fd.write(text_content)
+ fd.close()
+
+
+def check_for_code(module):
+ """
+ Check if there's at least one class or one function in the module.
+ """
+ fd = open(module, 'r')
+ for line in fd:
+ if line.startswith('def ') or line.startswith('class '):
+ fd.close()
+ return True
+ fd.close()
+ return False
+
+def select_public_names(name_list):
+ """goes through the list and discards names
+ that match pattern for hidden and private directory and file names
+ returns the list of those items that pass the "publicity" test
+ """
+ public_names = []
+ for name in name_list:
+ if name.startswith('.') or name.startswith('_'):
+ continue
+ else:
+ public_names.append(name)
+ return public_names
+
+def select_python_packages(package_path, sub_directory_names):
+ """returns list of subdimodule_name directories (only basenames) of package_path
+ which are themselves python packages
+ """
+ python_packages = []
+ for sub_name in sub_directory_names:
+ sub_path = os.path.join(package_path, sub_name)
+ if is_python_package(sub_path):
+ python_packages.append(sub_name)
+ return python_packages
+
+def recurse_tree(path, excludes, opts):
+ """
+ Look for every file in the directory tree and create the corresponding
+ ReST files.
+ """
+ print path
+ base_package_name = None
+ # check if the base directory is a package and get is name
+ if '__init__.py' in os.listdir(path):
+ base_package_name = os.path.basename(path)
+
+ toc = []
+ excludes = format_excludes(path, excludes)
+ tree = os.walk(path, False)
+ for directory, subs, files in tree:
+
+ py_files = select_py_files(files)
+ if len(py_files) < 1:
+ continue
+
+ if is_directory_excluded(directory, excludes):
+ continue
+
+ # TODO: could add check for windows hidden files
+ subs = select_public_names(subs)
+ subs = select_python_packages(directory, subs)
+
+ #calculate dotted python package name - like proj.pack.subpackage
+ package_name = directory.replace(os.path.sep, '.')
+
+ if is_python_package(directory):
+ text = create_package_content(package_name, py_files, subs)
+ write_file(package_name, text, opts)
+ toc.append(os.path.basename(directory))
+
+ for py_file in py_files:
+ if py_file == '__init__.py':
+ continue
+ module_name = os.path.splitext(py_file)[0]
+ module_package_name = package_name + '.' + module_name
+ text = create_module_content(module_package_name)
+ write_file(module_package_name, text, opts)
+ toc.append(module_package_name)
+
+ # create the module's index
+ if not opts.notoc:
+ modules_toc(toc, opts)
+
+def modules_toc(modules, opts, name='modules'):
+ """
+ Create the module's index.
+ """
+ fname = create_file_name(name, opts)
+ if not opts.force and os.path.exists(fname):
+ print "File %s already exists." % name
+ return
+
+ print "Creating module's index modules.txt."
+ text = write_heading(opts.header, 'Modules')
+ text += title_line('Modules:', '-')
+ text += '.. toctree::\n'
+ text += ' :maxdepth: %s\n\n' % opts.maxdepth
+
+ modules.sort()
+ prev_module = ''
+ for module in modules:
+ # look if the module is a subpackage and, if yes, ignore it
+ if module.startswith(prev_module + '.'):
+ continue
+ prev_module = module
+ text += ' %s\n' % module
+
+ # write the file
+ if not opts.dryrun:
+ fd = open(fname, 'w')
+ fd.write(text)
+ fd.close()
+
+def format_excludes(path, excludes):
+ """
+ Format the excluded directory list.
+ (verify that the path is not from the root of the volume or the root of the
+ package)
+ """
+ f_excludes = []
+ for exclude in excludes:
+ #not sure about the "not startswith" part
+ if not os.path.isabs(exclude) and not exclude.startswith(path):
+ exclude = os.path.join(path, exclude)
+ # remove trailing slash
+ f_excludes.append(exclude.rstrip(os.path.sep))
+ return f_excludes
+
+def is_directory_excluded(directory, excludes):
+ """Returns true if directory is in the exclude list
+ otherwise returns false
+ """
+ for exclude in excludes:
+ if directory.startswith(exclude):
+ return True
+ return False
+
+def select_py_files(files):
+ """
+ Return a list with only the python scripts (remove all other files).
+ """
+ py_files = [fich for fich in files if os.path.splitext(fich)[1] == '.py']
+ return py_files
+
+
+def main():
+ """
+ Parse and check the command line arguments
+ """
+ parser = optparse.OptionParser(usage="""usage: %prog [options] <package path> [exclude paths, ...]
+
+Note: By default this script will not overwrite already created files.""")
+ parser.add_option("-n", "--doc-header", action="store", dest="header", help="Documentation Header (default=Project)", default="Project")
+ parser.add_option("-d", "--dest-dir", action="store", dest="destdir", help="Output destination directory", default="")
+ parser.add_option("-s", "--suffix", action="store", dest="suffix", help="module suffix (default=txt)", default="txt")
+ parser.add_option("-m", "--maxdepth", action="store", dest="maxdepth", help="Maximum depth of submodules to show in the TOC (default=4)", type="int", default=4)
+ parser.add_option("-r", "--dry-run", action="store_true", dest="dryrun", help="Run the script without creating the files")
+ parser.add_option("-f", "--force", action="store_true", dest="force", help="Overwrite all the files")
+ parser.add_option("-t", "--no-toc", action="store_true", dest="notoc", help="Don't create the table of content file")
+ (opts, args) = parser.parse_args()
+ if len(args) < 1:
+ parser.error("package path is required.")
+ else:
+ if os.path.isdir(args[0]):
+ # check if the output destination is a valid directory
+ if opts.destdir and os.path.isdir(opts.destdir):
+ # if there's some exclude arguments, build the list of excludes
+ excludes = args[1:]
+ recurse_tree(args[0], excludes, opts)
+ else:
+ print '%s is not a valid output destination directory.' % opts.destdir
+ else:
+ print '%s is not a valid directory.' % args
+
+
+
+
+if __name__ == '__main__':
+ main()
+