bee_python 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (488) hide show
  1. data/{build/README → README} +1 -1
  2. data/egg/egg/build.yml +11 -49
  3. data/egg/egg.yml +19 -27
  4. data/egg/http/build.erb +32 -36
  5. data/egg/http/libhttp.py +102 -0
  6. data/egg/http/pylint.cfg +236 -0
  7. data/egg/http/server.py +7 -0
  8. data/egg/http/test.erb +32 -0
  9. data/egg/http.yml +33 -29
  10. data/egg/mysql/mysql.py +8 -9
  11. data/egg/project/build.erb +21 -53
  12. data/egg/project/pylint.cfg +236 -0
  13. data/egg/project/test.py +2 -2
  14. data/egg/project.yml +23 -31
  15. data/egg/script/build.erb +18 -23
  16. data/egg/script/pylint.cfg +236 -0
  17. data/egg/script.yml +22 -18
  18. data/egg/source/source.py +6 -6
  19. data/egg/test/test.py +1 -1
  20. data/lib/bee_task_python.rb +3 -34
  21. data/python.yml +123 -0
  22. metadata +61 -503
  23. data/test/build.yml +0 -16
  24. data/test/tc_bee_task_python.rb +0 -27
  25. data/test/test_build.rb +0 -26
  26. data/test/test_build_listener.rb +0 -110
  27. data/test/ts_bee_python.rb +0 -26
  28. data/tools/common/__init__.py +0 -5
  29. data/tools/common/common/__init__.py +0 -140
  30. data/tools/common/common/__pkginfo__.py +0 -43
  31. data/tools/common/common/adbh.py +0 -35
  32. data/tools/common/common/cache.py +0 -114
  33. data/tools/common/common/changelog.py +0 -234
  34. data/tools/common/common/clcommands.py +0 -181
  35. data/tools/common/common/cli.py +0 -212
  36. data/tools/common/common/compat.py +0 -328
  37. data/tools/common/common/configuration.py +0 -1087
  38. data/tools/common/common/contexts.py +0 -58
  39. data/tools/common/common/corbautils.py +0 -117
  40. data/tools/common/common/daemon.py +0 -171
  41. data/tools/common/common/date.py +0 -279
  42. data/tools/common/common/db.py +0 -49
  43. data/tools/common/common/dbf.py +0 -229
  44. data/tools/common/common/debugger.py +0 -208
  45. data/tools/common/common/decorators.py +0 -190
  46. data/tools/common/common/deprecation.py +0 -118
  47. data/tools/common/common/fileutils.py +0 -409
  48. data/tools/common/common/graph.py +0 -259
  49. data/tools/common/common/html.py +0 -142
  50. data/tools/common/common/interface.py +0 -76
  51. data/tools/common/common/logging_ext.py +0 -166
  52. data/tools/common/common/modutils.py +0 -670
  53. data/tools/common/common/optik_ext.py +0 -383
  54. data/tools/common/common/optparser.py +0 -92
  55. data/tools/common/common/pdf_ext.py +0 -111
  56. data/tools/common/common/proc.py +0 -276
  57. data/tools/common/common/pyro_ext.py +0 -146
  58. data/tools/common/common/pytest.py +0 -754
  59. data/tools/common/common/shellutils.py +0 -383
  60. data/tools/common/common/sphinx_ext.py +0 -87
  61. data/tools/common/common/sphinxutils.py +0 -122
  62. data/tools/common/common/sqlgen.py +0 -31
  63. data/tools/common/common/table.py +0 -930
  64. data/tools/common/common/tasksqueue.py +0 -97
  65. data/tools/common/common/test/__init__.py +0 -1
  66. data/tools/common/common/test/data/ChangeLog +0 -184
  67. data/tools/common/common/test/data/MyPyPa-0.1.0-py2.5.egg +0 -0
  68. data/tools/common/common/test/data/__init__.py +0 -1
  69. data/tools/common/common/test/data/content_differ_dir/NOTHING +0 -0
  70. data/tools/common/common/test/data/content_differ_dir/README +0 -1
  71. data/tools/common/common/test/data/content_differ_dir/subdir/coin +0 -1
  72. data/tools/common/common/test/data/content_differ_dir/subdir/toto.txt +0 -53
  73. data/tools/common/common/test/data/file_differ_dir/NOTHING +0 -0
  74. data/tools/common/common/test/data/file_differ_dir/README +0 -1
  75. data/tools/common/common/test/data/file_differ_dir/subdir/toto.txt +0 -53
  76. data/tools/common/common/test/data/file_differ_dir/subdirtwo/Hello +0 -0
  77. data/tools/common/common/test/data/find_test/__init__.py +0 -0
  78. data/tools/common/common/test/data/find_test/foo.txt +0 -0
  79. data/tools/common/common/test/data/find_test/module.py +0 -0
  80. data/tools/common/common/test/data/find_test/module2.py +0 -0
  81. data/tools/common/common/test/data/find_test/newlines.txt +0 -0
  82. data/tools/common/common/test/data/find_test/noendingnewline.py +0 -0
  83. data/tools/common/common/test/data/find_test/nonregr.py +0 -0
  84. data/tools/common/common/test/data/find_test/normal_file.txt +0 -0
  85. data/tools/common/common/test/data/find_test/spam.txt +0 -0
  86. data/tools/common/common/test/data/find_test/sub/doc.txt +0 -0
  87. data/tools/common/common/test/data/find_test/sub/momo.py +0 -0
  88. data/tools/common/common/test/data/find_test/test.ini +0 -0
  89. data/tools/common/common/test/data/find_test/test1.msg +0 -0
  90. data/tools/common/common/test/data/find_test/test2.msg +0 -0
  91. data/tools/common/common/test/data/find_test/write_protected_file.txt +0 -0
  92. data/tools/common/common/test/data/foo.txt +0 -9
  93. data/tools/common/common/test/data/module.py +0 -88
  94. data/tools/common/common/test/data/module2.py +0 -77
  95. data/tools/common/common/test/data/newlines.txt +0 -3
  96. data/tools/common/common/test/data/noendingnewline.py +0 -36
  97. data/tools/common/common/test/data/nonregr.py +0 -14
  98. data/tools/common/common/test/data/normal_file.txt +0 -0
  99. data/tools/common/common/test/data/reference_dir/NOTHING +0 -0
  100. data/tools/common/common/test/data/reference_dir/README +0 -1
  101. data/tools/common/common/test/data/reference_dir/subdir/coin +0 -1
  102. data/tools/common/common/test/data/reference_dir/subdir/toto.txt +0 -53
  103. data/tools/common/common/test/data/same_dir/NOTHING +0 -0
  104. data/tools/common/common/test/data/same_dir/README +0 -1
  105. data/tools/common/common/test/data/same_dir/subdir/coin +0 -1
  106. data/tools/common/common/test/data/same_dir/subdir/toto.txt +0 -53
  107. data/tools/common/common/test/data/spam.txt +0 -9
  108. data/tools/common/common/test/data/sub/doc.txt +0 -1
  109. data/tools/common/common/test/data/sub/momo.py +0 -1
  110. data/tools/common/common/test/data/subdir_differ_dir/NOTHING +0 -0
  111. data/tools/common/common/test/data/subdir_differ_dir/README +0 -1
  112. data/tools/common/common/test/data/subdir_differ_dir/subdir/coin +0 -1
  113. data/tools/common/common/test/data/subdir_differ_dir/subdir/toto.txt +0 -53
  114. data/tools/common/common/test/data/test.ini +0 -20
  115. data/tools/common/common/test/data/test1.msg +0 -30
  116. data/tools/common/common/test/data/test2.msg +0 -42
  117. data/tools/common/common/test/data/write_protected_file.txt +0 -0
  118. data/tools/common/common/test/foomod.py +0 -17
  119. data/tools/common/common/test/unittest_cache.py +0 -129
  120. data/tools/common/common/test/unittest_changelog.py +0 -37
  121. data/tools/common/common/test/unittest_compat.py +0 -239
  122. data/tools/common/common/test/unittest_configuration.py +0 -348
  123. data/tools/common/common/test/unittest_date.py +0 -154
  124. data/tools/common/common/test/unittest_decorators.py +0 -62
  125. data/tools/common/common/test/unittest_deprecation.py +0 -76
  126. data/tools/common/common/test/unittest_fileutils.py +0 -133
  127. data/tools/common/common/test/unittest_graph.py +0 -50
  128. data/tools/common/common/test/unittest_html.py +0 -76
  129. data/tools/common/common/test/unittest_interface.py +0 -87
  130. data/tools/common/common/test/unittest_modutils.py +0 -244
  131. data/tools/common/common/test/unittest_pytest.py +0 -50
  132. data/tools/common/common/test/unittest_shellutils.py +0 -248
  133. data/tools/common/common/test/unittest_table.py +0 -448
  134. data/tools/common/common/test/unittest_taskqueue.py +0 -71
  135. data/tools/common/common/test/unittest_testlib.py +0 -956
  136. data/tools/common/common/test/unittest_textutils.py +0 -247
  137. data/tools/common/common/test/unittest_tree.py +0 -248
  138. data/tools/common/common/test/unittest_umessage.py +0 -55
  139. data/tools/common/common/test/unittest_ureports_html.py +0 -64
  140. data/tools/common/common/test/unittest_ureports_text.py +0 -105
  141. data/tools/common/common/test/unittest_xmlutils.py +0 -75
  142. data/tools/common/common/test/utils.py +0 -87
  143. data/tools/common/common/testlib.py +0 -1927
  144. data/tools/common/common/textutils.py +0 -476
  145. data/tools/common/common/tree.py +0 -372
  146. data/tools/common/common/umessage.py +0 -161
  147. data/tools/common/common/ureports/__init__.py +0 -174
  148. data/tools/common/common/ureports/docbook_writer.py +0 -139
  149. data/tools/common/common/ureports/html_writer.py +0 -131
  150. data/tools/common/common/ureports/nodes.py +0 -201
  151. data/tools/common/common/ureports/text_writer.py +0 -140
  152. data/tools/common/common/vcgutils.py +0 -216
  153. data/tools/common/common/visitor.py +0 -107
  154. data/tools/common/common/xmlrpcutils.py +0 -136
  155. data/tools/common/common/xmlutils.py +0 -61
  156. data/tools/coverage/coverage.py +0 -602
  157. data/tools/epydoc/__init__.py +0 -227
  158. data/tools/epydoc/__init__.pyc +0 -0
  159. data/tools/epydoc/apidoc.py +0 -2203
  160. data/tools/epydoc/apidoc.pyc +0 -0
  161. data/tools/epydoc/checker.py +0 -349
  162. data/tools/epydoc/checker.pyc +0 -0
  163. data/tools/epydoc/cli.py +0 -1470
  164. data/tools/epydoc/cli.pyc +0 -0
  165. data/tools/epydoc/compat.py +0 -250
  166. data/tools/epydoc/compat.pyc +0 -0
  167. data/tools/epydoc/docbuilder.py +0 -1358
  168. data/tools/epydoc/docbuilder.pyc +0 -0
  169. data/tools/epydoc/docintrospecter.py +0 -1056
  170. data/tools/epydoc/docintrospecter.pyc +0 -0
  171. data/tools/epydoc/docparser.py +0 -2113
  172. data/tools/epydoc/docparser.pyc +0 -0
  173. data/tools/epydoc/docstringparser.py +0 -1111
  174. data/tools/epydoc/docstringparser.pyc +0 -0
  175. data/tools/epydoc/docwriter/__init__.py +0 -12
  176. data/tools/epydoc/docwriter/__init__.pyc +0 -0
  177. data/tools/epydoc/docwriter/dotgraph.py +0 -1351
  178. data/tools/epydoc/docwriter/dotgraph.pyc +0 -0
  179. data/tools/epydoc/docwriter/html.py +0 -3491
  180. data/tools/epydoc/docwriter/html.pyc +0 -0
  181. data/tools/epydoc/docwriter/html_colorize.py +0 -909
  182. data/tools/epydoc/docwriter/html_colorize.pyc +0 -0
  183. data/tools/epydoc/docwriter/html_css.py +0 -550
  184. data/tools/epydoc/docwriter/html_css.pyc +0 -0
  185. data/tools/epydoc/docwriter/html_help.py +0 -190
  186. data/tools/epydoc/docwriter/html_help.pyc +0 -0
  187. data/tools/epydoc/docwriter/latex.py +0 -1187
  188. data/tools/epydoc/docwriter/latex.pyc +0 -0
  189. data/tools/epydoc/docwriter/plaintext.py +0 -276
  190. data/tools/epydoc/docwriter/plaintext.pyc +0 -0
  191. data/tools/epydoc/docwriter/xlink.py +0 -505
  192. data/tools/epydoc/docwriter/xlink.pyc +0 -0
  193. data/tools/epydoc/gui.py +0 -1148
  194. data/tools/epydoc/gui.pyc +0 -0
  195. data/tools/epydoc/log.py +0 -204
  196. data/tools/epydoc/log.pyc +0 -0
  197. data/tools/epydoc/markup/__init__.py +0 -623
  198. data/tools/epydoc/markup/__init__.pyc +0 -0
  199. data/tools/epydoc/markup/doctest.py +0 -311
  200. data/tools/epydoc/markup/doctest.pyc +0 -0
  201. data/tools/epydoc/markup/epytext.py +0 -2116
  202. data/tools/epydoc/markup/epytext.pyc +0 -0
  203. data/tools/epydoc/markup/javadoc.py +0 -250
  204. data/tools/epydoc/markup/javadoc.pyc +0 -0
  205. data/tools/epydoc/markup/plaintext.py +0 -78
  206. data/tools/epydoc/markup/plaintext.pyc +0 -0
  207. data/tools/epydoc/markup/pyval_repr.py +0 -532
  208. data/tools/epydoc/markup/pyval_repr.pyc +0 -0
  209. data/tools/epydoc/markup/restructuredtext.py +0 -906
  210. data/tools/epydoc/markup/restructuredtext.pyc +0 -0
  211. data/tools/epydoc/test/__init__.py +0 -97
  212. data/tools/epydoc/test/__init__.pyc +0 -0
  213. data/tools/epydoc/test/util.py +0 -226
  214. data/tools/epydoc/test/util.pyc +0 -0
  215. data/tools/epydoc/util.py +0 -289
  216. data/tools/epydoc/util.pyc +0 -0
  217. data/tools/logilab/logilab/__init__.py +0 -5
  218. data/tools/logilab/logilab/astng/__init__.py +0 -82
  219. data/tools/logilab/logilab/astng/__pkginfo__.py +0 -76
  220. data/tools/logilab/logilab/astng/_exceptions.py +0 -64
  221. data/tools/logilab/logilab/astng/_nodes_ast.py +0 -667
  222. data/tools/logilab/logilab/astng/_nodes_compiler.py +0 -758
  223. data/tools/logilab/logilab/astng/bases.py +0 -608
  224. data/tools/logilab/logilab/astng/builder.py +0 -239
  225. data/tools/logilab/logilab/astng/inference.py +0 -426
  226. data/tools/logilab/logilab/astng/inspector.py +0 -289
  227. data/tools/logilab/logilab/astng/manager.py +0 -421
  228. data/tools/logilab/logilab/astng/mixins.py +0 -165
  229. data/tools/logilab/logilab/astng/node_classes.py +0 -848
  230. data/tools/logilab/logilab/astng/nodes.py +0 -85
  231. data/tools/logilab/logilab/astng/nodes_as_string.py +0 -389
  232. data/tools/logilab/logilab/astng/patchcomptransformer.py +0 -159
  233. data/tools/logilab/logilab/astng/protocols.py +0 -333
  234. data/tools/logilab/logilab/astng/raw_building.py +0 -212
  235. data/tools/logilab/logilab/astng/rebuilder.py +0 -307
  236. data/tools/logilab/logilab/astng/scoped_nodes.py +0 -951
  237. data/tools/logilab/logilab/astng/test/__init__.py +0 -19
  238. data/tools/logilab/logilab/astng/test/data/MyPyPa-0.1.0-py2.5.egg +0 -0
  239. data/tools/logilab/logilab/astng/test/data/MyPyPa-0.1.0-py2.5.zip +0 -0
  240. data/tools/logilab/logilab/astng/test/data/SSL1/Connection1.py +0 -33
  241. data/tools/logilab/logilab/astng/test/data/SSL1/__init__.py +0 -20
  242. data/tools/logilab/logilab/astng/test/data/__init__.py +0 -20
  243. data/tools/logilab/logilab/astng/test/data/all.py +0 -29
  244. data/tools/logilab/logilab/astng/test/data/appl/__init__.py +0 -23
  245. data/tools/logilab/logilab/astng/test/data/appl/myConnection.py +0 -30
  246. data/tools/logilab/logilab/astng/test/data/format.py +0 -34
  247. data/tools/logilab/logilab/astng/test/data/module.py +0 -90
  248. data/tools/logilab/logilab/astng/test/data/module2.py +0 -112
  249. data/tools/logilab/logilab/astng/test/data/noendingnewline.py +0 -57
  250. data/tools/logilab/logilab/astng/test/data/nonregr.py +0 -76
  251. data/tools/logilab/logilab/astng/test/data/notall.py +0 -28
  252. data/tools/logilab/logilab/astng/test/data2/__init__.py +0 -20
  253. data/tools/logilab/logilab/astng/test/data2/clientmodule_test.py +0 -51
  254. data/tools/logilab/logilab/astng/test/data2/suppliermodule_test.py +0 -32
  255. data/tools/logilab/logilab/astng/test/regrtest.py +0 -135
  256. data/tools/logilab/logilab/astng/test/regrtest_data/absimport.py +0 -22
  257. data/tools/logilab/logilab/astng/test/regrtest_data/descriptor_crash.py +0 -31
  258. data/tools/logilab/logilab/astng/test/regrtest_data/import_package_subpackage_module.py +0 -68
  259. data/tools/logilab/logilab/astng/test/regrtest_data/package/__init__.py +0 -24
  260. data/tools/logilab/logilab/astng/test/regrtest_data/package/subpackage/__init__.py +0 -20
  261. data/tools/logilab/logilab/astng/test/regrtest_data/package/subpackage/module.py +0 -20
  262. data/tools/logilab/logilab/astng/test/unittest_builder.py +0 -684
  263. data/tools/logilab/logilab/astng/test/unittest_inference.py +0 -1112
  264. data/tools/logilab/logilab/astng/test/unittest_inspector.py +0 -105
  265. data/tools/logilab/logilab/astng/test/unittest_lookup.py +0 -302
  266. data/tools/logilab/logilab/astng/test/unittest_manager.py +0 -98
  267. data/tools/logilab/logilab/astng/test/unittest_nodes.py +0 -302
  268. data/tools/logilab/logilab/astng/test/unittest_scoped_nodes.py +0 -501
  269. data/tools/logilab/logilab/astng/test/unittest_utils.py +0 -104
  270. data/tools/logilab/logilab/astng/utils.py +0 -342
  271. data/tools/logilab/logilab/common/__init__.py +0 -140
  272. data/tools/logilab/logilab/common/__pkginfo__.py +0 -43
  273. data/tools/logilab/logilab/common/adbh.py +0 -35
  274. data/tools/logilab/logilab/common/cache.py +0 -114
  275. data/tools/logilab/logilab/common/changelog.py +0 -234
  276. data/tools/logilab/logilab/common/clcommands.py +0 -181
  277. data/tools/logilab/logilab/common/cli.py +0 -212
  278. data/tools/logilab/logilab/common/compat.py +0 -328
  279. data/tools/logilab/logilab/common/configuration.py +0 -1087
  280. data/tools/logilab/logilab/common/contexts.py +0 -58
  281. data/tools/logilab/logilab/common/corbautils.py +0 -117
  282. data/tools/logilab/logilab/common/daemon.py +0 -171
  283. data/tools/logilab/logilab/common/date.py +0 -279
  284. data/tools/logilab/logilab/common/db.py +0 -49
  285. data/tools/logilab/logilab/common/dbf.py +0 -229
  286. data/tools/logilab/logilab/common/debugger.py +0 -208
  287. data/tools/logilab/logilab/common/decorators.py +0 -190
  288. data/tools/logilab/logilab/common/deprecation.py +0 -118
  289. data/tools/logilab/logilab/common/fileutils.py +0 -409
  290. data/tools/logilab/logilab/common/graph.py +0 -259
  291. data/tools/logilab/logilab/common/html.py +0 -142
  292. data/tools/logilab/logilab/common/interface.py +0 -76
  293. data/tools/logilab/logilab/common/logging_ext.py +0 -166
  294. data/tools/logilab/logilab/common/modutils.py +0 -670
  295. data/tools/logilab/logilab/common/optik_ext.py +0 -383
  296. data/tools/logilab/logilab/common/optparser.py +0 -92
  297. data/tools/logilab/logilab/common/pdf_ext.py +0 -111
  298. data/tools/logilab/logilab/common/proc.py +0 -276
  299. data/tools/logilab/logilab/common/pyro_ext.py +0 -146
  300. data/tools/logilab/logilab/common/pytest.py +0 -754
  301. data/tools/logilab/logilab/common/shellutils.py +0 -383
  302. data/tools/logilab/logilab/common/sphinx_ext.py +0 -87
  303. data/tools/logilab/logilab/common/sphinxutils.py +0 -122
  304. data/tools/logilab/logilab/common/sqlgen.py +0 -31
  305. data/tools/logilab/logilab/common/table.py +0 -930
  306. data/tools/logilab/logilab/common/tasksqueue.py +0 -97
  307. data/tools/logilab/logilab/common/test/__init__.py +0 -1
  308. data/tools/logilab/logilab/common/test/data/ChangeLog +0 -184
  309. data/tools/logilab/logilab/common/test/data/MyPyPa-0.1.0-py2.5.egg +0 -0
  310. data/tools/logilab/logilab/common/test/data/__init__.py +0 -1
  311. data/tools/logilab/logilab/common/test/data/content_differ_dir/NOTHING +0 -0
  312. data/tools/logilab/logilab/common/test/data/content_differ_dir/README +0 -1
  313. data/tools/logilab/logilab/common/test/data/content_differ_dir/subdir/coin +0 -1
  314. data/tools/logilab/logilab/common/test/data/content_differ_dir/subdir/toto.txt +0 -53
  315. data/tools/logilab/logilab/common/test/data/file_differ_dir/NOTHING +0 -0
  316. data/tools/logilab/logilab/common/test/data/file_differ_dir/README +0 -1
  317. data/tools/logilab/logilab/common/test/data/file_differ_dir/subdir/toto.txt +0 -53
  318. data/tools/logilab/logilab/common/test/data/file_differ_dir/subdirtwo/Hello +0 -0
  319. data/tools/logilab/logilab/common/test/data/find_test/__init__.py +0 -0
  320. data/tools/logilab/logilab/common/test/data/find_test/foo.txt +0 -0
  321. data/tools/logilab/logilab/common/test/data/find_test/module.py +0 -0
  322. data/tools/logilab/logilab/common/test/data/find_test/module2.py +0 -0
  323. data/tools/logilab/logilab/common/test/data/find_test/newlines.txt +0 -0
  324. data/tools/logilab/logilab/common/test/data/find_test/noendingnewline.py +0 -0
  325. data/tools/logilab/logilab/common/test/data/find_test/nonregr.py +0 -0
  326. data/tools/logilab/logilab/common/test/data/find_test/normal_file.txt +0 -0
  327. data/tools/logilab/logilab/common/test/data/find_test/spam.txt +0 -0
  328. data/tools/logilab/logilab/common/test/data/find_test/sub/doc.txt +0 -0
  329. data/tools/logilab/logilab/common/test/data/find_test/sub/momo.py +0 -0
  330. data/tools/logilab/logilab/common/test/data/find_test/test.ini +0 -0
  331. data/tools/logilab/logilab/common/test/data/find_test/test1.msg +0 -0
  332. data/tools/logilab/logilab/common/test/data/find_test/test2.msg +0 -0
  333. data/tools/logilab/logilab/common/test/data/find_test/write_protected_file.txt +0 -0
  334. data/tools/logilab/logilab/common/test/data/foo.txt +0 -9
  335. data/tools/logilab/logilab/common/test/data/module.py +0 -88
  336. data/tools/logilab/logilab/common/test/data/module2.py +0 -77
  337. data/tools/logilab/logilab/common/test/data/newlines.txt +0 -3
  338. data/tools/logilab/logilab/common/test/data/noendingnewline.py +0 -36
  339. data/tools/logilab/logilab/common/test/data/nonregr.py +0 -14
  340. data/tools/logilab/logilab/common/test/data/normal_file.txt +0 -0
  341. data/tools/logilab/logilab/common/test/data/reference_dir/NOTHING +0 -0
  342. data/tools/logilab/logilab/common/test/data/reference_dir/README +0 -1
  343. data/tools/logilab/logilab/common/test/data/reference_dir/subdir/coin +0 -1
  344. data/tools/logilab/logilab/common/test/data/reference_dir/subdir/toto.txt +0 -53
  345. data/tools/logilab/logilab/common/test/data/same_dir/NOTHING +0 -0
  346. data/tools/logilab/logilab/common/test/data/same_dir/README +0 -1
  347. data/tools/logilab/logilab/common/test/data/same_dir/subdir/coin +0 -1
  348. data/tools/logilab/logilab/common/test/data/same_dir/subdir/toto.txt +0 -53
  349. data/tools/logilab/logilab/common/test/data/spam.txt +0 -9
  350. data/tools/logilab/logilab/common/test/data/sub/doc.txt +0 -1
  351. data/tools/logilab/logilab/common/test/data/sub/momo.py +0 -1
  352. data/tools/logilab/logilab/common/test/data/subdir_differ_dir/NOTHING +0 -0
  353. data/tools/logilab/logilab/common/test/data/subdir_differ_dir/README +0 -1
  354. data/tools/logilab/logilab/common/test/data/subdir_differ_dir/subdir/coin +0 -1
  355. data/tools/logilab/logilab/common/test/data/subdir_differ_dir/subdir/toto.txt +0 -53
  356. data/tools/logilab/logilab/common/test/data/test.ini +0 -20
  357. data/tools/logilab/logilab/common/test/data/test1.msg +0 -30
  358. data/tools/logilab/logilab/common/test/data/test2.msg +0 -42
  359. data/tools/logilab/logilab/common/test/data/write_protected_file.txt +0 -0
  360. data/tools/logilab/logilab/common/test/foomod.py +0 -17
  361. data/tools/logilab/logilab/common/test/unittest_cache.py +0 -129
  362. data/tools/logilab/logilab/common/test/unittest_changelog.py +0 -37
  363. data/tools/logilab/logilab/common/test/unittest_compat.py +0 -239
  364. data/tools/logilab/logilab/common/test/unittest_configuration.py +0 -348
  365. data/tools/logilab/logilab/common/test/unittest_date.py +0 -154
  366. data/tools/logilab/logilab/common/test/unittest_decorators.py +0 -62
  367. data/tools/logilab/logilab/common/test/unittest_deprecation.py +0 -76
  368. data/tools/logilab/logilab/common/test/unittest_fileutils.py +0 -133
  369. data/tools/logilab/logilab/common/test/unittest_graph.py +0 -50
  370. data/tools/logilab/logilab/common/test/unittest_html.py +0 -76
  371. data/tools/logilab/logilab/common/test/unittest_interface.py +0 -87
  372. data/tools/logilab/logilab/common/test/unittest_modutils.py +0 -244
  373. data/tools/logilab/logilab/common/test/unittest_pytest.py +0 -50
  374. data/tools/logilab/logilab/common/test/unittest_shellutils.py +0 -248
  375. data/tools/logilab/logilab/common/test/unittest_table.py +0 -448
  376. data/tools/logilab/logilab/common/test/unittest_taskqueue.py +0 -71
  377. data/tools/logilab/logilab/common/test/unittest_testlib.py +0 -956
  378. data/tools/logilab/logilab/common/test/unittest_textutils.py +0 -247
  379. data/tools/logilab/logilab/common/test/unittest_tree.py +0 -248
  380. data/tools/logilab/logilab/common/test/unittest_umessage.py +0 -55
  381. data/tools/logilab/logilab/common/test/unittest_ureports_html.py +0 -64
  382. data/tools/logilab/logilab/common/test/unittest_ureports_text.py +0 -105
  383. data/tools/logilab/logilab/common/test/unittest_xmlutils.py +0 -75
  384. data/tools/logilab/logilab/common/test/utils.py +0 -87
  385. data/tools/logilab/logilab/common/testlib.py +0 -1927
  386. data/tools/logilab/logilab/common/textutils.py +0 -476
  387. data/tools/logilab/logilab/common/tree.py +0 -372
  388. data/tools/logilab/logilab/common/umessage.py +0 -161
  389. data/tools/logilab/logilab/common/ureports/__init__.py +0 -174
  390. data/tools/logilab/logilab/common/ureports/docbook_writer.py +0 -139
  391. data/tools/logilab/logilab/common/ureports/html_writer.py +0 -131
  392. data/tools/logilab/logilab/common/ureports/nodes.py +0 -201
  393. data/tools/logilab/logilab/common/ureports/text_writer.py +0 -140
  394. data/tools/logilab/logilab/common/vcgutils.py +0 -216
  395. data/tools/logilab/logilab/common/visitor.py +0 -107
  396. data/tools/logilab/logilab/common/xmlrpcutils.py +0 -136
  397. data/tools/logilab/logilab/common/xmlutils.py +0 -61
  398. data/tools/pychecker/COPYRIGHT +0 -31
  399. data/tools/pychecker/ChangeLog +0 -349
  400. data/tools/pychecker/CodeChecks.py +0 -1969
  401. data/tools/pychecker/CodeChecks.pyc +0 -0
  402. data/tools/pychecker/CodeChecks.pyo +0 -0
  403. data/tools/pychecker/Config.py +0 -475
  404. data/tools/pychecker/Config.pyc +0 -0
  405. data/tools/pychecker/Config.pyo +0 -0
  406. data/tools/pychecker/KNOWN_BUGS +0 -100
  407. data/tools/pychecker/MAINTAINERS +0 -81
  408. data/tools/pychecker/NEWS +0 -406
  409. data/tools/pychecker/OP.py +0 -131
  410. data/tools/pychecker/OP.pyc +0 -0
  411. data/tools/pychecker/OP.pyo +0 -0
  412. data/tools/pychecker/OptionTypes.py +0 -117
  413. data/tools/pychecker/OptionTypes.pyc +0 -0
  414. data/tools/pychecker/OptionTypes.pyo +0 -0
  415. data/tools/pychecker/README +0 -152
  416. data/tools/pychecker/Stack.py +0 -115
  417. data/tools/pychecker/Stack.pyc +0 -0
  418. data/tools/pychecker/Stack.pyo +0 -0
  419. data/tools/pychecker/TODO +0 -101
  420. data/tools/pychecker/VERSION +0 -1
  421. data/tools/pychecker/Warning.py +0 -50
  422. data/tools/pychecker/Warning.pyc +0 -0
  423. data/tools/pychecker/Warning.pyo +0 -0
  424. data/tools/pychecker/__init__.py +0 -17
  425. data/tools/pychecker/__init__.pyc +0 -0
  426. data/tools/pychecker/__init__.pyo +0 -0
  427. data/tools/pychecker/checker.py +0 -961
  428. data/tools/pychecker/checker.pyc +0 -0
  429. data/tools/pychecker/checker.pyo +0 -0
  430. data/tools/pychecker/function.py +0 -159
  431. data/tools/pychecker/function.pyc +0 -0
  432. data/tools/pychecker/function.pyo +0 -0
  433. data/tools/pychecker/msgs.py +0 -175
  434. data/tools/pychecker/msgs.pyc +0 -0
  435. data/tools/pychecker/msgs.pyo +0 -0
  436. data/tools/pychecker/options.py +0 -275
  437. data/tools/pychecker/options.pyc +0 -0
  438. data/tools/pychecker/options.pyo +0 -0
  439. data/tools/pychecker/pcmodules.py +0 -19
  440. data/tools/pychecker/pcmodules.pyc +0 -0
  441. data/tools/pychecker/pcmodules.pyo +0 -0
  442. data/tools/pychecker/printer.py +0 -47
  443. data/tools/pychecker/printer.pyc +0 -0
  444. data/tools/pychecker/printer.pyo +0 -0
  445. data/tools/pychecker/python.py +0 -427
  446. data/tools/pychecker/python.pyc +0 -0
  447. data/tools/pychecker/python.pyo +0 -0
  448. data/tools/pychecker/utils.py +0 -102
  449. data/tools/pychecker/utils.pyc +0 -0
  450. data/tools/pychecker/utils.pyo +0 -0
  451. data/tools/pychecker/warn.py +0 -778
  452. data/tools/pychecker/warn.pyc +0 -0
  453. data/tools/pychecker/warn.pyo +0 -0
  454. data/tools/pylint2/pylint/__init__.py +0 -16
  455. data/tools/pylint2/pylint/__pkginfo__.py +0 -67
  456. data/tools/pylint2/pylint/checkers/__init__.py +0 -155
  457. data/tools/pylint2/pylint/checkers/base.py +0 -749
  458. data/tools/pylint2/pylint/checkers/classes.py +0 -527
  459. data/tools/pylint2/pylint/checkers/design_analysis.py +0 -344
  460. data/tools/pylint2/pylint/checkers/exceptions.py +0 -183
  461. data/tools/pylint2/pylint/checkers/format.py +0 -367
  462. data/tools/pylint2/pylint/checkers/imports.py +0 -379
  463. data/tools/pylint2/pylint/checkers/logging.py +0 -98
  464. data/tools/pylint2/pylint/checkers/misc.py +0 -128
  465. data/tools/pylint2/pylint/checkers/newstyle.py +0 -107
  466. data/tools/pylint2/pylint/checkers/raw_metrics.py +0 -125
  467. data/tools/pylint2/pylint/checkers/similar.py +0 -333
  468. data/tools/pylint2/pylint/checkers/string_format.py +0 -239
  469. data/tools/pylint2/pylint/checkers/typecheck.py +0 -364
  470. data/tools/pylint2/pylint/checkers/utils.py +0 -208
  471. data/tools/pylint2/pylint/checkers/variables.py +0 -498
  472. data/tools/pylint2/pylint/config.py +0 -149
  473. data/tools/pylint2/pylint/epylint.py +0 -149
  474. data/tools/pylint2/pylint/gui.py +0 -433
  475. data/tools/pylint2/pylint/interfaces.py +0 -98
  476. data/tools/pylint2/pylint/lint.py +0 -914
  477. data/tools/pylint2/pylint/pyreverse/__init__.py +0 -5
  478. data/tools/pylint2/pylint/pyreverse/diadefslib.py +0 -229
  479. data/tools/pylint2/pylint/pyreverse/diagrams.py +0 -247
  480. data/tools/pylint2/pylint/pyreverse/main.py +0 -123
  481. data/tools/pylint2/pylint/pyreverse/utils.py +0 -131
  482. data/tools/pylint2/pylint/pyreverse/writer.py +0 -196
  483. data/tools/pylint2/pylint/reporters/__init__.py +0 -67
  484. data/tools/pylint2/pylint/reporters/guireporter.py +0 -36
  485. data/tools/pylint2/pylint/reporters/html.py +0 -69
  486. data/tools/pylint2/pylint/reporters/text.py +0 -156
  487. data/tools/pylint2/pylint/utils.py +0 -518
  488. data/tools/pylint2/pylint.py +0 -16
data/tools/epydoc/cli.py DELETED
@@ -1,1470 +0,0 @@
1
- # epydoc -- Command line interface
2
- #
3
- # Copyright (C) 2005 Edward Loper
4
- # Author: Edward Loper <edloper@loper.org>
5
- # URL: <http://epydoc.sf.net>
6
- #
7
- # $Id: cli.py,v 1.1 2009/11/26 13:20:36 casa Exp $
8
-
9
- """
10
- Command-line interface for epydoc. Abbreviated Usage::
11
-
12
- epydoc [options] NAMES...
13
-
14
- NAMES... The Python modules to document.
15
- --html Generate HTML output (default).
16
- --latex Generate LaTeX output.
17
- --pdf Generate pdf output, via LaTeX.
18
- -o DIR, --output DIR The output directory.
19
- --inheritance STYLE The format for showing inherited objects.
20
- -V, --version Print the version of epydoc.
21
- -h, --help Display a usage message.
22
-
23
- Run \"epydoc --help\" for a complete option list. See the epydoc(1)
24
- man page for more information.
25
-
26
- Config Files
27
- ============
28
- Configuration files can be specified with the C{--config} option.
29
- These files are read using U{ConfigParser
30
- <http://docs.python.org/lib/module-ConfigParser.html>}. Configuration
31
- files may set options or add names of modules to document. Option
32
- names are (usually) identical to the long names of command line
33
- options. To specify names to document, use any of the following
34
- option names::
35
-
36
- module modules value values object objects
37
-
38
- A simple example of a config file is::
39
-
40
- [epydoc]
41
- modules: sys, os, os.path, re, %(MYSANDBOXPATH)/utilities.py
42
- name: Example
43
- graph: classtree
44
- introspect: no
45
-
46
- All ConfigParser interpolations are done using local values and the
47
- environment variables.
48
-
49
-
50
- Verbosity Levels
51
- ================
52
- The C{-v} and C{-q} options increase and decrease verbosity,
53
- respectively. The default verbosity level is zero. The verbosity
54
- levels are currently defined as follows::
55
-
56
- Progress Markup warnings Warnings Errors
57
- -3 none no no no
58
- -2 none no no yes
59
- -1 none no yes yes
60
- 0 (default) bar no yes yes
61
- 1 bar yes yes yes
62
- 2 list yes yes yes
63
- """
64
- __docformat__ = 'epytext en'
65
-
66
- import sys, os, time, re, pickle, textwrap
67
- from glob import glob
68
- from optparse import OptionParser, OptionGroup, SUPPRESS_HELP
69
- import optparse
70
- import epydoc
71
- from epydoc import log
72
- from epydoc.util import wordwrap, run_subprocess, RunSubprocessError
73
- from epydoc.util import plaintext_to_html
74
- from epydoc.apidoc import UNKNOWN
75
- from epydoc.compat import *
76
- import ConfigParser
77
- from epydoc.docwriter.html_css import STYLESHEETS as CSS_STYLESHEETS
78
-
79
- # This module is only available if Docutils are in the system
80
- try:
81
- from epydoc.docwriter import xlink
82
- except:
83
- xlink = None
84
-
85
- INHERITANCE_STYLES = ('grouped', 'listed', 'included')
86
- GRAPH_TYPES = ('classtree', 'callgraph', 'umlclasstree')
87
- ACTIONS = ('html', 'text', 'latex', 'dvi', 'ps', 'pdf', 'check')
88
- DEFAULT_DOCFORMAT = 'epytext'
89
- PROFILER = 'profile' #: Which profiler to use: 'hotshot' or 'profile'
90
-
91
- ######################################################################
92
- #{ Help Topics
93
- ######################################################################
94
-
95
- DOCFORMATS = ('epytext', 'plaintext', 'restructuredtext', 'javadoc')
96
- HELP_TOPICS = {
97
- 'docformat': textwrap.dedent('''\
98
- __docformat__ is a module variable that specifies the markup
99
- language for the docstrings in a module. Its value is a
100
- string, consisting the name of a markup language, optionally
101
- followed by a language code (such as "en" for English). Epydoc
102
- currently recognizes the following markup language names:
103
- ''' + ', '.join(DOCFORMATS)),
104
- 'inheritance': textwrap.dedent('''\
105
- The following inheritance formats are currently supported:
106
- - grouped: inherited objects are gathered into groups,
107
- based on what class they were inherited from.
108
- - listed: inherited objects are listed in a short list
109
- at the end of their section.
110
- - included: inherited objects are mixed in with
111
- non-inherited objects.'''),
112
- 'css': textwrap.dedent(
113
- 'The following built-in CSS stylesheets are available:\n' +
114
- '\n'.join([' %10s: %s' % (key, descr)
115
- for (key, (sheet, descr))
116
- in CSS_STYLESHEETS.items()])),
117
- #'checks': textwrap.dedent('''\
118
- #
119
- # '''),
120
- }
121
-
122
-
123
- HELP_TOPICS['topics'] = wordwrap(
124
- 'Epydoc can provide additional help for the following topics: ' +
125
- ', '.join(['%r' % topic for topic in HELP_TOPICS.keys()]))
126
-
127
- ######################################################################
128
- #{ Argument & Config File Parsing
129
- ######################################################################
130
-
131
- OPTION_DEFAULTS = dict(
132
- action="html", show_frames=True, docformat=DEFAULT_DOCFORMAT,
133
- show_private=True, show_imports=False, inheritance="listed",
134
- verbose=0, quiet=0, load_pickle=False, parse=True, introspect=True,
135
- debug=epydoc.DEBUG, profile=False, graphs=[],
136
- list_classes_separately=False, graph_font=None, graph_font_size=None,
137
- include_source_code=True, pstat_files=[], simple_term=False, fail_on=None,
138
- exclude=[], exclude_parse=[], exclude_introspect=[],
139
- external_api=[], external_api_file=[], external_api_root=[],
140
- redundant_details=False, src_code_tab_width=8)
141
-
142
- def parse_arguments():
143
- # Construct the option parser.
144
- usage = '%prog [ACTION] [options] NAMES...'
145
- version = "Epydoc, version %s" % epydoc.__version__
146
- optparser = OptionParser(usage=usage, add_help_option=False)
147
-
148
- optparser.add_option('--config',
149
- action='append', dest="configfiles", metavar='FILE',
150
- help=("A configuration file, specifying additional OPTIONS "
151
- "and/or NAMES. This option may be repeated."))
152
-
153
- optparser.add_option("--output", "-o",
154
- dest="target", metavar="PATH",
155
- help="The output directory. If PATH does not exist, then "
156
- "it will be created.")
157
-
158
- optparser.add_option("--quiet", "-q",
159
- action="count", dest="quiet",
160
- help="Decrease the verbosity.")
161
-
162
- optparser.add_option("--verbose", "-v",
163
- action="count", dest="verbose",
164
- help="Increase the verbosity.")
165
-
166
- optparser.add_option("--debug",
167
- action="store_true", dest="debug",
168
- help="Show full tracebacks for internal errors.")
169
-
170
- optparser.add_option("--simple-term",
171
- action="store_true", dest="simple_term",
172
- help="Do not try to use color or cursor control when displaying "
173
- "the progress bar, warnings, or errors.")
174
-
175
-
176
- action_group = OptionGroup(optparser, 'Actions')
177
- optparser.add_option_group(action_group)
178
-
179
- action_group.add_option("--html",
180
- action="store_const", dest="action", const="html",
181
- help="Write HTML output.")
182
-
183
- action_group.add_option("--text",
184
- action="store_const", dest="action", const="text",
185
- help="Write plaintext output. (not implemented yet)")
186
-
187
- action_group.add_option("--latex",
188
- action="store_const", dest="action", const="latex",
189
- help="Write LaTeX output.")
190
-
191
- action_group.add_option("--dvi",
192
- action="store_const", dest="action", const="dvi",
193
- help="Write DVI output.")
194
-
195
- action_group.add_option("--ps",
196
- action="store_const", dest="action", const="ps",
197
- help="Write Postscript output.")
198
-
199
- action_group.add_option("--pdf",
200
- action="store_const", dest="action", const="pdf",
201
- help="Write PDF output.")
202
-
203
- action_group.add_option("--check",
204
- action="store_const", dest="action", const="check",
205
- help="Check completeness of docs.")
206
-
207
- action_group.add_option("--pickle",
208
- action="store_const", dest="action", const="pickle",
209
- help="Write the documentation to a pickle file.")
210
-
211
- # Provide our own --help and --version options.
212
- action_group.add_option("--version",
213
- action="store_const", dest="action", const="version",
214
- help="Show epydoc's version number and exit.")
215
-
216
- action_group.add_option("-h", "--help",
217
- action="store_const", dest="action", const="help",
218
- help="Show this message and exit. For help on specific "
219
- "topics, use \"--help TOPIC\". Use \"--help topics\" for a "
220
- "list of available help topics")
221
-
222
-
223
- generation_group = OptionGroup(optparser, 'Generation Options')
224
- optparser.add_option_group(generation_group)
225
-
226
- generation_group.add_option("--docformat",
227
- dest="docformat", metavar="NAME",
228
- help="The default markup language for docstrings. Defaults "
229
- "to \"%s\"." % DEFAULT_DOCFORMAT)
230
-
231
- generation_group.add_option("--parse-only",
232
- action="store_false", dest="introspect",
233
- help="Get all information from parsing (don't introspect)")
234
-
235
- generation_group.add_option("--introspect-only",
236
- action="store_false", dest="parse",
237
- help="Get all information from introspecting (don't parse)")
238
-
239
- generation_group.add_option("--exclude",
240
- dest="exclude", metavar="PATTERN", action="append",
241
- help="Exclude modules whose dotted name matches "
242
- "the regular expression PATTERN")
243
-
244
- generation_group.add_option("--exclude-introspect",
245
- dest="exclude_introspect", metavar="PATTERN", action="append",
246
- help="Exclude introspection of modules whose dotted name matches "
247
- "the regular expression PATTERN")
248
-
249
- generation_group.add_option("--exclude-parse",
250
- dest="exclude_parse", metavar="PATTERN", action="append",
251
- help="Exclude parsing of modules whose dotted name matches "
252
- "the regular expression PATTERN")
253
-
254
- generation_group.add_option("--inheritance",
255
- dest="inheritance", metavar="STYLE",
256
- help="The format for showing inheritance objects. STYLE "
257
- "should be one of: %s." % ', '.join(INHERITANCE_STYLES))
258
-
259
- generation_group.add_option("--show-private",
260
- action="store_true", dest="show_private",
261
- help="Include private variables in the output. (default)")
262
-
263
- generation_group.add_option("--no-private",
264
- action="store_false", dest="show_private",
265
- help="Do not include private variables in the output.")
266
-
267
- generation_group.add_option("--show-imports",
268
- action="store_true", dest="show_imports",
269
- help="List each module's imports.")
270
-
271
- generation_group.add_option("--no-imports",
272
- action="store_false", dest="show_imports",
273
- help="Do not list each module's imports. (default)")
274
-
275
- generation_group.add_option('--show-sourcecode',
276
- action='store_true', dest='include_source_code',
277
- help=("Include source code with syntax highlighting in the "
278
- "HTML output. (default)"))
279
-
280
- generation_group.add_option('--no-sourcecode',
281
- action='store_false', dest='include_source_code',
282
- help=("Do not include source code with syntax highlighting in the "
283
- "HTML output."))
284
-
285
- generation_group.add_option('--include-log',
286
- action='store_true', dest='include_log',
287
- help=("Include a page with the process log (epydoc-log.html)"))
288
-
289
- generation_group.add_option(
290
- '--redundant-details',
291
- action='store_true', dest='redundant_details',
292
- help=("Include values in the details lists even if all info "
293
- "about them is already provided by the summary table."))
294
-
295
- output_group = OptionGroup(optparser, 'Output Options')
296
- optparser.add_option_group(output_group)
297
-
298
- output_group.add_option("--name", "-n",
299
- dest="prj_name", metavar="NAME",
300
- help="The documented project's name (for the navigation bar).")
301
-
302
- output_group.add_option("--css", "-c",
303
- dest="css", metavar="STYLESHEET",
304
- help="The CSS stylesheet. STYLESHEET can be either a "
305
- "builtin stylesheet or the name of a CSS file.")
306
-
307
- output_group.add_option("--url", "-u",
308
- dest="prj_url", metavar="URL",
309
- help="The documented project's URL (for the navigation bar).")
310
-
311
- output_group.add_option("--navlink",
312
- dest="prj_link", metavar="HTML",
313
- help="HTML code for a navigation link to place in the "
314
- "navigation bar.")
315
-
316
- output_group.add_option("--top",
317
- dest="top_page", metavar="PAGE",
318
- help="The \"top\" page for the HTML documentation. PAGE can "
319
- "be a URL, the name of a module or class, or one of the "
320
- "special names \"trees.html\", \"indices.html\", or \"help.html\"")
321
-
322
- output_group.add_option("--help-file",
323
- dest="help_file", metavar="FILE",
324
- help="An alternate help file. FILE should contain the body "
325
- "of an HTML file -- navigation bars will be added to it.")
326
-
327
- output_group.add_option("--show-frames",
328
- action="store_true", dest="show_frames",
329
- help="Include frames in the HTML output. (default)")
330
-
331
- output_group.add_option("--no-frames",
332
- action="store_false", dest="show_frames",
333
- help="Do not include frames in the HTML output.")
334
-
335
- output_group.add_option('--separate-classes',
336
- action='store_true', dest='list_classes_separately',
337
- help=("When generating LaTeX or PDF output, list each class in "
338
- "its own section, instead of listing them under their "
339
- "containing module."))
340
-
341
- output_group.add_option('--src-code-tab-width',
342
- action='store', type='int', dest='src_code_tab_width',
343
- help=("When generating HTML output, sets the number of spaces "
344
- "each tab in source code listings is replaced with."))
345
-
346
- # The group of external API options.
347
- # Skip if the module couldn't be imported (usually missing docutils)
348
- if xlink is not None:
349
- link_group = OptionGroup(optparser,
350
- xlink.ApiLinkReader.settings_spec[0])
351
- optparser.add_option_group(link_group)
352
-
353
- for help, names, opts in xlink.ApiLinkReader.settings_spec[2]:
354
- opts = opts.copy()
355
- opts['help'] = help
356
- link_group.add_option(*names, **opts)
357
-
358
- graph_group = OptionGroup(optparser, 'Graph Options')
359
- optparser.add_option_group(graph_group)
360
-
361
- graph_group.add_option('--graph',
362
- action='append', dest='graphs', metavar='GRAPHTYPE',
363
- help=("Include graphs of type GRAPHTYPE in the generated output. "
364
- "Graphs are generated using the Graphviz dot executable. "
365
- "If this executable is not on the path, then use --dotpath "
366
- "to specify its location. This option may be repeated to "
367
- "include multiple graph types in the output. GRAPHTYPE "
368
- "should be one of: all, %s." % ', '.join(GRAPH_TYPES)))
369
-
370
- graph_group.add_option("--dotpath",
371
- dest="dotpath", metavar='PATH',
372
- help="The path to the Graphviz 'dot' executable.")
373
-
374
- graph_group.add_option('--graph-font',
375
- dest='graph_font', metavar='FONT',
376
- help=("Specify the font used to generate Graphviz graphs. (e.g., "
377
- "helvetica or times)."))
378
-
379
- graph_group.add_option('--graph-font-size',
380
- dest='graph_font_size', metavar='SIZE',
381
- help=("Specify the font size used to generate Graphviz graphs, "
382
- "in points."))
383
-
384
- graph_group.add_option('--pstat',
385
- action='append', dest='pstat_files', metavar='FILE',
386
- help="A pstat output file, to be used in generating call graphs.")
387
-
388
- # this option is for developers, not users.
389
- graph_group.add_option("--profile-epydoc",
390
- action="store_true", dest="profile",
391
- help=SUPPRESS_HELP or
392
- ("Run the hotshot profiler on epydoc itself. Output "
393
- "will be written to profile.out."))
394
-
395
-
396
- return_group = OptionGroup(optparser, 'Return Value Options')
397
- optparser.add_option_group(return_group)
398
-
399
- return_group.add_option("--fail-on-error",
400
- action="store_const", dest="fail_on", const=log.ERROR,
401
- help="Return a non-zero exit status, indicating failure, if any "
402
- "errors are encountered.")
403
-
404
- return_group.add_option("--fail-on-warning",
405
- action="store_const", dest="fail_on", const=log.WARNING,
406
- help="Return a non-zero exit status, indicating failure, if any "
407
- "errors or warnings are encountered (not including docstring "
408
- "warnings).")
409
-
410
- return_group.add_option("--fail-on-docstring-warning",
411
- action="store_const", dest="fail_on", const=log.DOCSTRING_WARNING,
412
- help="Return a non-zero exit status, indicating failure, if any "
413
- "errors or warnings are encountered (including docstring "
414
- "warnings).")
415
-
416
- # Set the option parser's defaults.
417
- optparser.set_defaults(**OPTION_DEFAULTS)
418
-
419
- # Parse the arguments.
420
- options, names = optparser.parse_args()
421
-
422
- # Print help message, if requested. We also provide support for
423
- # --help [topic]
424
- if options.action == 'help':
425
- names = set([n.lower() for n in names])
426
- for (topic, msg) in HELP_TOPICS.items():
427
- if topic.lower() in names:
428
- print '\n' + msg.rstrip() + '\n'
429
- sys.exit(0)
430
- optparser.print_help()
431
- sys.exit(0)
432
-
433
- # Print version message, if requested.
434
- if options.action == 'version':
435
- print version
436
- sys.exit(0)
437
-
438
- # Process any config files.
439
- if options.configfiles:
440
- try:
441
- parse_configfiles(options.configfiles, options, names)
442
- except (KeyboardInterrupt,SystemExit): raise
443
- except Exception, e:
444
- if len(options.configfiles) == 1:
445
- cf_name = 'config file %s' % options.configfiles[0]
446
- else:
447
- cf_name = 'config files %s' % ', '.join(options.configfiles)
448
- optparser.error('Error reading %s:\n %s' % (cf_name, e))
449
-
450
- # Check if the input file is a pickle file.
451
- for name in names:
452
- if name.endswith('.pickle'):
453
- if len(names) != 1:
454
- optparser.error("When a pickle file is specified, no other "
455
- "input files may be specified.")
456
- options.load_pickle = True
457
-
458
- # Check to make sure all options are valid.
459
- if len(names) == 0:
460
- optparser.error("No names specified.")
461
-
462
- # perform shell expansion.
463
- for i, name in reversed(list(enumerate(names[:]))):
464
- if '?' in name or '*' in name:
465
- names[i:i+1] = glob(name)
466
-
467
- if options.inheritance not in INHERITANCE_STYLES:
468
- optparser.error("Bad inheritance style. Valid options are " +
469
- ",".join(INHERITANCE_STYLES))
470
- if not options.parse and not options.introspect:
471
- optparser.error("Invalid option combination: --parse-only "
472
- "and --introspect-only.")
473
- if options.action == 'text' and len(names) > 1:
474
- optparser.error("--text option takes only one name.")
475
-
476
- # Check the list of requested graph types to make sure they're
477
- # acceptable.
478
- options.graphs = [graph_type.lower() for graph_type in options.graphs]
479
- for graph_type in options.graphs:
480
- if graph_type == 'callgraph' and not options.pstat_files:
481
- optparser.error('"callgraph" graph type may only be used if '
482
- 'one or more pstat files are specified.')
483
- # If it's 'all', then add everything (but don't add callgraph if
484
- # we don't have any profiling info to base them on).
485
- if graph_type == 'all':
486
- if options.pstat_files:
487
- options.graphs = GRAPH_TYPES
488
- else:
489
- options.graphs = [g for g in GRAPH_TYPES if g != 'callgraph']
490
- break
491
- elif graph_type not in GRAPH_TYPES:
492
- optparser.error("Invalid graph type %s." % graph_type)
493
-
494
- # Calculate verbosity.
495
- verbosity = getattr(options, 'verbosity', 0)
496
- options.verbosity = verbosity + options.verbose - options.quiet
497
-
498
- # The target default depends on the action.
499
- if options.target is None:
500
- options.target = options.action
501
-
502
- # Return parsed args.
503
- options.names = names
504
- return options, names
505
-
506
- def parse_configfiles(configfiles, options, names):
507
- configparser = ConfigParser.ConfigParser()
508
- # ConfigParser.read() silently ignores errors, so open the files
509
- # manually (since we want to notify the user of any errors).
510
- for configfile in configfiles:
511
- fp = open(configfile, 'r') # may raise IOError.
512
- configparser.readfp(fp, configfile)
513
- fp.close()
514
- for optname in configparser.options('epydoc'):
515
- val = configparser.get('epydoc', optname, vars=os.environ).strip()
516
- optname = optname.lower().strip()
517
-
518
- if optname in ('modules', 'objects', 'values',
519
- 'module', 'object', 'value'):
520
- names.extend(_str_to_list(val))
521
- elif optname == 'target':
522
- options.target = val
523
- elif optname == 'output':
524
- if val.lower() not in ACTIONS:
525
- raise ValueError('"%s" expected one of: %s' %
526
- (optname, ', '.join(ACTIONS)))
527
- options.action = val.lower()
528
- elif optname == 'verbosity':
529
- options.verbosity = _str_to_int(val, optname)
530
- elif optname == 'debug':
531
- options.debug = _str_to_bool(val, optname)
532
- elif optname in ('simple-term', 'simple_term'):
533
- options.simple_term = _str_to_bool(val, optname)
534
-
535
- # Generation options
536
- elif optname == 'docformat':
537
- options.docformat = val
538
- elif optname == 'parse':
539
- options.parse = _str_to_bool(val, optname)
540
- elif optname == 'introspect':
541
- options.introspect = _str_to_bool(val, optname)
542
- elif optname == 'exclude':
543
- options.exclude.extend(_str_to_list(val))
544
- elif optname in ('exclude-parse', 'exclude_parse'):
545
- options.exclude_parse.extend(_str_to_list(val))
546
- elif optname in ('exclude-introspect', 'exclude_introspect'):
547
- options.exclude_introspect.extend(_str_to_list(val))
548
- elif optname == 'inheritance':
549
- if val.lower() not in INHERITANCE_STYLES:
550
- raise ValueError('"%s" expected one of: %s.' %
551
- (optname, ', '.join(INHERITANCE_STYLES)))
552
- options.inheritance = val.lower()
553
- elif optname =='private':
554
- options.show_private = _str_to_bool(val, optname)
555
- elif optname =='imports':
556
- options.show_imports = _str_to_bool(val, optname)
557
- elif optname == 'sourcecode':
558
- options.include_source_code = _str_to_bool(val, optname)
559
- elif optname in ('include-log', 'include_log'):
560
- options.include_log = _str_to_bool(val, optname)
561
- elif optname in ('redundant-details', 'redundant_details'):
562
- options.redundant_details = _str_to_bool(val, optname)
563
-
564
- # Output options
565
- elif optname == 'name':
566
- options.prj_name = val
567
- elif optname == 'css':
568
- options.css = val
569
- elif optname == 'url':
570
- options.prj_url = val
571
- elif optname == 'link':
572
- options.prj_link = val
573
- elif optname == 'top':
574
- options.top_page = val
575
- elif optname == 'help':
576
- options.help_file = val
577
- elif optname =='frames':
578
- options.show_frames = _str_to_bool(val, optname)
579
- elif optname in ('separate-classes', 'separate_classes'):
580
- options.list_classes_separately = _str_to_bool(val, optname)
581
- elif optname in ('src-code-tab-width', 'src_code_tab_width'):
582
- options.src_code_tab_width = _str_to_int(val, optname)
583
-
584
- # External API
585
- elif optname in ('external-api', 'external_api'):
586
- options.external_api.extend(_str_to_list(val))
587
- elif optname in ('external-api-file', 'external_api_file'):
588
- options.external_api_file.extend(_str_to_list(val))
589
- elif optname in ('external-api-root', 'external_api_root'):
590
- options.external_api_root.extend(_str_to_list(val))
591
-
592
- # Graph options
593
- elif optname == 'graph':
594
- graphtypes = _str_to_list(val)
595
- for graphtype in graphtypes:
596
- if graphtype not in GRAPH_TYPES + ('all',):
597
- raise ValueError('"%s" expected one of: all, %s.' %
598
- (optname, ', '.join(GRAPH_TYPES)))
599
- options.graphs.extend(graphtypes)
600
- elif optname == 'dotpath':
601
- options.dotpath = val
602
- elif optname in ('graph-font', 'graph_font'):
603
- options.graph_font = val
604
- elif optname in ('graph-font-size', 'graph_font_size'):
605
- options.graph_font_size = _str_to_int(val, optname)
606
- elif optname == 'pstat':
607
- options.pstat_files.extend(_str_to_list(val))
608
-
609
- # Return value options
610
- elif optname in ('failon', 'fail-on', 'fail_on'):
611
- if val.lower().strip() in ('error', 'errors'):
612
- options.fail_on = log.ERROR
613
- elif val.lower().strip() in ('warning', 'warnings'):
614
- options.fail_on = log.WARNING
615
- elif val.lower().strip() in ('docstring_warning',
616
- 'docstring_warnings'):
617
- options.fail_on = log.DOCSTRING_WARNING
618
- else:
619
- raise ValueError("%r expected one of: error, warning, "
620
- "docstring_warning" % optname)
621
- else:
622
- raise ValueError('Unknown option %s' % optname)
623
-
624
- def _str_to_bool(val, optname):
625
- if val.lower() in ('0', 'no', 'false', 'n', 'f', 'hide'):
626
- return False
627
- elif val.lower() in ('1', 'yes', 'true', 'y', 't', 'show'):
628
- return True
629
- else:
630
- raise ValueError('"%s" option expected a boolean' % optname)
631
-
632
- def _str_to_int(val, optname):
633
- try:
634
- return int(val)
635
- except ValueError:
636
- raise ValueError('"%s" option expected an int' % optname)
637
-
638
- def _str_to_list(val):
639
- return val.replace(',', ' ').split()
640
-
641
- ######################################################################
642
- #{ Interface
643
- ######################################################################
644
-
645
- def main(options, names):
646
- # Set the debug flag, if '--debug' was specified.
647
- if options.debug:
648
- epydoc.DEBUG = True
649
-
650
- ## [XX] Did this serve a purpose? Commenting out for now:
651
- #if options.action == 'text':
652
- # if options.parse and options.introspect:
653
- # options.parse = False
654
-
655
- # Set up the logger
656
- if options.simple_term:
657
- TerminalController.FORCE_SIMPLE_TERM = True
658
- if options.action == 'text':
659
- logger = None # no logger for text output.
660
- elif options.verbosity > 1:
661
- logger = ConsoleLogger(options.verbosity)
662
- log.register_logger(logger)
663
- else:
664
- # Each number is a rough approximation of how long we spend on
665
- # that task, used to divide up the unified progress bar.
666
- stages = [40, # Building documentation
667
- 7, # Merging parsed & introspected information
668
- 1, # Linking imported variables
669
- 3, # Indexing documentation
670
- 1, # Checking for overridden methods
671
- 30, # Parsing Docstrings
672
- 1, # Inheriting documentation
673
- 2] # Sorting & Grouping
674
- if options.load_pickle:
675
- stages = [30] # Loading pickled documentation
676
- if options.action == 'html': stages += [100]
677
- elif options.action == 'text': stages += [30]
678
- elif options.action == 'latex': stages += [60]
679
- elif options.action == 'dvi': stages += [60,30]
680
- elif options.action == 'ps': stages += [60,40]
681
- elif options.action == 'pdf': stages += [60,50]
682
- elif options.action == 'check': stages += [10]
683
- elif options.action == 'pickle': stages += [10]
684
- else: raise ValueError, '%r not supported' % options.action
685
- if options.parse and not options.introspect:
686
- del stages[1] # no merging
687
- if options.introspect and not options.parse:
688
- del stages[1:3] # no merging or linking
689
- logger = UnifiedProgressConsoleLogger(options.verbosity, stages)
690
- log.register_logger(logger)
691
-
692
- # check the output directory.
693
- if options.action not in ('text', 'check', 'pickle'):
694
- if os.path.exists(options.target):
695
- if not os.path.isdir(options.target):
696
- log.error("%s is not a directory" % options.target)
697
- sys.exit(1)
698
-
699
- if options.include_log:
700
- if options.action == 'html':
701
- if not os.path.exists(options.target):
702
- os.mkdir(options.target)
703
- log.register_logger(HTMLLogger(options.target, options))
704
- else:
705
- log.warning("--include-log requires --html")
706
-
707
- # Set the default docformat
708
- from epydoc import docstringparser
709
- docstringparser.DEFAULT_DOCFORMAT = options.docformat
710
-
711
- # Configure the external API linking
712
- if xlink is not None:
713
- try:
714
- xlink.ApiLinkReader.read_configuration(options, problematic=False)
715
- except Exception, exc:
716
- log.error("Error while configuring external API linking: %s: %s"
717
- % (exc.__class__.__name__, exc))
718
-
719
- # Set the dot path
720
- if options.dotpath:
721
- from epydoc.docwriter import dotgraph
722
- dotgraph.DOT_COMMAND = options.dotpath
723
-
724
- # Set the default graph font & size
725
- if options.graph_font:
726
- from epydoc.docwriter import dotgraph
727
- fontname = options.graph_font
728
- dotgraph.DotGraph.DEFAULT_NODE_DEFAULTS['fontname'] = fontname
729
- dotgraph.DotGraph.DEFAULT_EDGE_DEFAULTS['fontname'] = fontname
730
- if options.graph_font_size:
731
- from epydoc.docwriter import dotgraph
732
- fontsize = options.graph_font_size
733
- dotgraph.DotGraph.DEFAULT_NODE_DEFAULTS['fontsize'] = fontsize
734
- dotgraph.DotGraph.DEFAULT_EDGE_DEFAULTS['fontsize'] = fontsize
735
-
736
- # If the input name is a pickle file, then read the docindex that
737
- # it contains. Otherwise, build the docs for the input names.
738
- if options.load_pickle:
739
- assert len(names) == 1
740
- log.start_progress('Deserializing')
741
- log.progress(0.1, 'Loading %r' % names[0])
742
- t0 = time.time()
743
- unpickler = pickle.Unpickler(open(names[0], 'rb'))
744
- unpickler.persistent_load = pickle_persistent_load
745
- docindex = unpickler.load()
746
- log.debug('deserialization time: %.1f sec' % (time.time()-t0))
747
- log.end_progress()
748
- else:
749
- # Build docs for the named values.
750
- from epydoc.docbuilder import build_doc_index
751
- exclude_parse = '|'.join(options.exclude_parse+options.exclude)
752
- exclude_introspect = '|'.join(options.exclude_introspect+
753
- options.exclude)
754
- docindex = build_doc_index(names, options.introspect, options.parse,
755
- add_submodules=(options.action!='text'),
756
- exclude_introspect=exclude_introspect,
757
- exclude_parse=exclude_parse)
758
-
759
- if docindex is None:
760
- if log.ERROR in logger.reported_message_levels:
761
- sys.exit(1)
762
- else:
763
- return # docbuilder already logged an error.
764
-
765
- # Load profile information, if it was given.
766
- if options.pstat_files:
767
- try: import pstats
768
- except ImportError:
769
- log.error("Could not import pstats -- ignoring pstat files.")
770
- try:
771
- profile_stats = pstats.Stats(options.pstat_files[0])
772
- for filename in options.pstat_files[1:]:
773
- profile_stats.add(filename)
774
- except KeyboardInterrupt: raise
775
- except Exception, e:
776
- log.error("Error reading pstat file: %s" % e)
777
- profile_stats = None
778
- if profile_stats is not None:
779
- docindex.read_profiling_info(profile_stats)
780
-
781
- # Perform the specified action.
782
- if options.action == 'html':
783
- write_html(docindex, options)
784
- elif options.action in ('latex', 'dvi', 'ps', 'pdf'):
785
- write_latex(docindex, options, options.action)
786
- elif options.action == 'text':
787
- write_text(docindex, options)
788
- elif options.action == 'check':
789
- check_docs(docindex, options)
790
- elif options.action == 'pickle':
791
- write_pickle(docindex, options)
792
- else:
793
- print >>sys.stderr, '\nUnsupported action %s!' % options.action
794
-
795
- # If we suppressed docstring warnings, then let the user know.
796
- if logger is not None and logger.suppressed_docstring_warning:
797
- if logger.suppressed_docstring_warning == 1:
798
- prefix = '1 markup error was found'
799
- else:
800
- prefix = ('%d markup errors were found' %
801
- logger.suppressed_docstring_warning)
802
- log.warning("%s while processing docstrings. Use the verbose "
803
- "switch (-v) to display markup errors." % prefix)
804
-
805
- # Basic timing breakdown:
806
- if options.verbosity >= 2 and logger is not None:
807
- logger.print_times()
808
-
809
- # If we encountered any message types that we were requested to
810
- # fail on, then exit with status 2.
811
- if options.fail_on is not None:
812
- max_reported_message_level = max(logger.reported_message_levels)
813
- if max_reported_message_level >= options.fail_on:
814
- sys.exit(2)
815
-
816
- def write_html(docindex, options):
817
- from epydoc.docwriter.html import HTMLWriter
818
- html_writer = HTMLWriter(docindex, **options.__dict__)
819
- if options.verbose > 0:
820
- log.start_progress('Writing HTML docs to %r' % options.target)
821
- else:
822
- log.start_progress('Writing HTML docs')
823
- html_writer.write(options.target)
824
- log.end_progress()
825
-
826
- def write_pickle(docindex, options):
827
- """Helper for writing output to a pickle file, which can then be
828
- read in at a later time. But loading the pickle is only marginally
829
- faster than building the docs from scratch, so this has pretty
830
- limited application."""
831
- if options.target == 'pickle':
832
- options.target = 'api.pickle'
833
- elif not options.target.endswith('.pickle'):
834
- options.target += '.pickle'
835
-
836
- log.start_progress('Serializing output')
837
- log.progress(0.2, 'Writing %r' % options.target)
838
- outfile = open(options.target, 'wb')
839
- pickler = pickle.Pickler(outfile, protocol=0)
840
- pickler.persistent_id = pickle_persistent_id
841
- pickler.dump(docindex)
842
- outfile.close()
843
- log.end_progress()
844
-
845
- def pickle_persistent_id(obj):
846
- """Helper for pickling, which allows us to save and restore UNKNOWN,
847
- which is required to be identical to apidoc.UNKNOWN."""
848
- if obj is UNKNOWN: return 'UNKNOWN'
849
- else: return None
850
-
851
- def pickle_persistent_load(identifier):
852
- """Helper for pickling, which allows us to save and restore UNKNOWN,
853
- which is required to be identical to apidoc.UNKNOWN."""
854
- if identifier == 'UNKNOWN': return UNKNOWN
855
- else: raise pickle.UnpicklingError, 'Invalid persistent id'
856
-
857
- _RERUN_LATEX_RE = re.compile(r'(?im)^LaTeX\s+Warning:\s+Label\(s\)\s+may'
858
- r'\s+have\s+changed.\s+Rerun')
859
-
860
- def write_latex(docindex, options, format):
861
- from epydoc.docwriter.latex import LatexWriter
862
- latex_writer = LatexWriter(docindex, **options.__dict__)
863
- log.start_progress('Writing LaTeX docs')
864
- latex_writer.write(options.target)
865
- log.end_progress()
866
- # If we're just generating the latex, and not any output format,
867
- # then we're done.
868
- if format == 'latex': return
869
-
870
- if format == 'dvi': steps = 4
871
- elif format == 'ps': steps = 5
872
- elif format == 'pdf': steps = 6
873
-
874
- log.start_progress('Processing LaTeX docs')
875
- oldpath = os.path.abspath(os.curdir)
876
- running = None # keep track of what we're doing.
877
- try:
878
- try:
879
- os.chdir(options.target)
880
-
881
- # Clear any old files out of the way.
882
- for ext in 'tex aux log out idx ilg toc ind'.split():
883
- if os.path.exists('apidoc.%s' % ext):
884
- os.remove('apidoc.%s' % ext)
885
-
886
- # The first pass generates index files.
887
- running = 'latex'
888
- log.progress(0./steps, 'LaTeX: First pass')
889
- run_subprocess('latex api.tex')
890
-
891
- # Build the index.
892
- running = 'makeindex'
893
- log.progress(1./steps, 'LaTeX: Build index')
894
- run_subprocess('makeindex api.idx')
895
-
896
- # The second pass generates our output.
897
- running = 'latex'
898
- log.progress(2./steps, 'LaTeX: Second pass')
899
- out, err = run_subprocess('latex api.tex')
900
-
901
- # The third pass is only necessary if the second pass
902
- # changed what page some things are on.
903
- running = 'latex'
904
- if _RERUN_LATEX_RE.match(out):
905
- log.progress(3./steps, 'LaTeX: Third pass')
906
- out, err = run_subprocess('latex api.tex')
907
-
908
- # A fourth path should (almost?) never be necessary.
909
- running = 'latex'
910
- if _RERUN_LATEX_RE.match(out):
911
- log.progress(3./steps, 'LaTeX: Fourth pass')
912
- run_subprocess('latex api.tex')
913
-
914
- # If requested, convert to postscript.
915
- if format in ('ps', 'pdf'):
916
- running = 'dvips'
917
- log.progress(4./steps, 'dvips')
918
- run_subprocess('dvips api.dvi -o api.ps -G0 -Ppdf')
919
-
920
- # If requested, convert to pdf.
921
- if format in ('pdf'):
922
- running = 'ps2pdf'
923
- log.progress(5./steps, 'ps2pdf')
924
- run_subprocess(
925
- 'ps2pdf -sPAPERSIZE#letter -dMaxSubsetPct#100 '
926
- '-dSubsetFonts#true -dCompatibilityLevel#1.2 '
927
- '-dEmbedAllFonts#true api.ps api.pdf')
928
- except RunSubprocessError, e:
929
- if running == 'latex':
930
- e.out = re.sub(r'(?sm)\A.*?!( LaTeX Error:)?', r'', e.out)
931
- e.out = re.sub(r'(?sm)\s*Type X to quit.*', '', e.out)
932
- e.out = re.sub(r'(?sm)^! Emergency stop.*', '', e.out)
933
- log.error("%s failed: %s" % (running, (e.out+e.err).lstrip()))
934
- except OSError, e:
935
- log.error("%s failed: %s" % (running, e))
936
- finally:
937
- os.chdir(oldpath)
938
- log.end_progress()
939
-
940
- def write_text(docindex, options):
941
- log.start_progress('Writing output')
942
- from epydoc.docwriter.plaintext import PlaintextWriter
943
- plaintext_writer = PlaintextWriter()
944
- s = ''
945
- for apidoc in docindex.root:
946
- s += plaintext_writer.write(apidoc)
947
- log.end_progress()
948
- if isinstance(s, unicode):
949
- s = s.encode('ascii', 'backslashreplace')
950
- print s
951
-
952
- def check_docs(docindex, options):
953
- from epydoc.checker import DocChecker
954
- DocChecker(docindex).check()
955
-
956
- def cli():
957
- # Parse command-line arguments.
958
- options, names = parse_arguments()
959
-
960
- try:
961
- try:
962
- if options.profile:
963
- _profile()
964
- else:
965
- main(options, names)
966
- finally:
967
- log.close()
968
- except SystemExit:
969
- raise
970
- except KeyboardInterrupt:
971
- print '\n\n'
972
- print >>sys.stderr, 'Keyboard interrupt.'
973
- except:
974
- if options.debug: raise
975
- print '\n\n'
976
- exc_info = sys.exc_info()
977
- if isinstance(exc_info[0], basestring): e = exc_info[0]
978
- else: e = exc_info[1]
979
- print >>sys.stderr, ('\nUNEXPECTED ERROR:\n'
980
- '%s\n' % (str(e) or e.__class__.__name__))
981
- print >>sys.stderr, 'Use --debug to see trace information.'
982
- sys.exit(3)
983
-
984
- def _profile():
985
- # Hotshot profiler.
986
- if PROFILER == 'hotshot':
987
- try: import hotshot, hotshot.stats
988
- except ImportError:
989
- print >>sys.stderr, "Could not import profile module!"
990
- return
991
- try:
992
- prof = hotshot.Profile('hotshot.out')
993
- prof = prof.runctx('main(*parse_arguments())', globals(), {})
994
- except SystemExit:
995
- pass
996
- prof.close()
997
- # Convert profile.hotshot -> profile.out
998
- print 'Consolidating hotshot profiling info...'
999
- hotshot.stats.load('hotshot.out').dump_stats('profile.out')
1000
-
1001
- # Standard 'profile' profiler.
1002
- elif PROFILER == 'profile':
1003
- # cProfile module was added in Python 2.5 -- use it if its'
1004
- # available, since it's faster.
1005
- try: from cProfile import Profile
1006
- except ImportError:
1007
- try: from profile import Profile
1008
- except ImportError:
1009
- print >>sys.stderr, "Could not import profile module!"
1010
- return
1011
-
1012
- # There was a bug in Python 2.4's profiler. Check if it's
1013
- # present, and if so, fix it. (Bug was fixed in 2.4maint:
1014
- # <http://mail.python.org/pipermail/python-checkins/
1015
- # 2005-September/047099.html>)
1016
- if (hasattr(Profile, 'dispatch') and
1017
- Profile.dispatch['c_exception'] is
1018
- Profile.trace_dispatch_exception.im_func):
1019
- trace_dispatch_return = Profile.trace_dispatch_return.im_func
1020
- Profile.dispatch['c_exception'] = trace_dispatch_return
1021
- try:
1022
- prof = Profile()
1023
- prof = prof.runctx('main(*parse_arguments())', globals(), {})
1024
- except SystemExit:
1025
- pass
1026
- prof.dump_stats('profile.out')
1027
-
1028
- else:
1029
- print >>sys.stderr, 'Unknown profiler %s' % PROFILER
1030
- return
1031
-
1032
- ######################################################################
1033
- #{ Logging
1034
- ######################################################################
1035
-
1036
- class TerminalController:
1037
- """
1038
- A class that can be used to portably generate formatted output to
1039
- a terminal. See
1040
- U{http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/475116}
1041
- for documentation. (This is a somewhat stripped-down version.)
1042
- """
1043
- BOL = '' #: Move the cursor to the beginning of the line
1044
- UP = '' #: Move the cursor up one line
1045
- DOWN = '' #: Move the cursor down one line
1046
- LEFT = '' #: Move the cursor left one char
1047
- RIGHT = '' #: Move the cursor right one char
1048
- CLEAR_EOL = '' #: Clear to the end of the line.
1049
- CLEAR_LINE = '' #: Clear the current line; cursor to BOL.
1050
- BOLD = '' #: Turn on bold mode
1051
- NORMAL = '' #: Turn off all modes
1052
- COLS = 75 #: Width of the terminal (default to 75)
1053
- BLACK = BLUE = GREEN = CYAN = RED = MAGENTA = YELLOW = WHITE = ''
1054
-
1055
- _STRING_CAPABILITIES = """
1056
- BOL=cr UP=cuu1 DOWN=cud1 LEFT=cub1 RIGHT=cuf1
1057
- CLEAR_EOL=el BOLD=bold UNDERLINE=smul NORMAL=sgr0""".split()
1058
- _COLORS = """BLACK BLUE GREEN CYAN RED MAGENTA YELLOW WHITE""".split()
1059
- _ANSICOLORS = "BLACK RED GREEN YELLOW BLUE MAGENTA CYAN WHITE".split()
1060
-
1061
- #: If this is set to true, then new TerminalControllers will
1062
- #: assume that the terminal is not capable of doing manipulation
1063
- #: of any kind.
1064
- FORCE_SIMPLE_TERM = False
1065
-
1066
- def __init__(self, term_stream=sys.stdout):
1067
- # If the stream isn't a tty, then assume it has no capabilities.
1068
- if not term_stream.isatty(): return
1069
- if self.FORCE_SIMPLE_TERM: return
1070
-
1071
- # Curses isn't available on all platforms
1072
- try: import curses
1073
- except:
1074
- # If it's not available, then try faking enough to get a
1075
- # simple progress bar.
1076
- self.BOL = '\r'
1077
- self.CLEAR_LINE = '\r' + ' '*self.COLS + '\r'
1078
-
1079
- # Check the terminal type. If we fail, then assume that the
1080
- # terminal has no capabilities.
1081
- try: curses.setupterm()
1082
- except: return
1083
-
1084
- # Look up numeric capabilities.
1085
- self.COLS = curses.tigetnum('cols')
1086
-
1087
- # Look up string capabilities.
1088
- for capability in self._STRING_CAPABILITIES:
1089
- (attrib, cap_name) = capability.split('=')
1090
- setattr(self, attrib, self._tigetstr(cap_name) or '')
1091
- if self.BOL and self.CLEAR_EOL:
1092
- self.CLEAR_LINE = self.BOL+self.CLEAR_EOL
1093
-
1094
- # Colors
1095
- set_fg = self._tigetstr('setf')
1096
- if set_fg:
1097
- for i,color in zip(range(len(self._COLORS)), self._COLORS):
1098
- setattr(self, color, curses.tparm(set_fg, i) or '')
1099
- set_fg_ansi = self._tigetstr('setaf')
1100
- if set_fg_ansi:
1101
- for i,color in zip(range(len(self._ANSICOLORS)), self._ANSICOLORS):
1102
- setattr(self, color, curses.tparm(set_fg_ansi, i) or '')
1103
-
1104
- def _tigetstr(self, cap_name):
1105
- # String capabilities can include "delays" of the form "$<2>".
1106
- # For any modern terminal, we should be able to just ignore
1107
- # these, so strip them out.
1108
- import curses
1109
- cap = curses.tigetstr(cap_name) or ''
1110
- return re.sub(r'\$<\d+>[/*]?', '', cap)
1111
-
1112
- class ConsoleLogger(log.Logger):
1113
- def __init__(self, verbosity, progress_mode=None):
1114
- self._verbosity = verbosity
1115
- self._progress = None
1116
- self._message_blocks = []
1117
- # For ETA display:
1118
- self._progress_start_time = None
1119
- # For per-task times:
1120
- self._task_times = []
1121
- self._progress_header = None
1122
-
1123
- self.reported_message_levels = set()
1124
- """This set contains all the message levels (WARNING, ERROR,
1125
- etc) that have been reported. It is used by the options
1126
- --fail-on-warning etc to determine the return value."""
1127
-
1128
- self.suppressed_docstring_warning = 0
1129
- """This variable will be incremented once every time a
1130
- docstring warning is reported tothe logger, but the verbosity
1131
- level is too low for it to be displayed."""
1132
-
1133
- self.term = TerminalController()
1134
-
1135
- # Set the progress bar mode.
1136
- if verbosity >= 2: self._progress_mode = 'list'
1137
- elif verbosity >= 0:
1138
- if progress_mode is not None:
1139
- self._progress_mode = progress_mode
1140
- elif self.term.COLS < 15:
1141
- self._progress_mode = 'simple-bar'
1142
- elif self.term.BOL and self.term.CLEAR_EOL and self.term.UP:
1143
- self._progress_mode = 'multiline-bar'
1144
- elif self.term.BOL and self.term.CLEAR_LINE:
1145
- self._progress_mode = 'bar'
1146
- else:
1147
- self._progress_mode = 'simple-bar'
1148
- else: self._progress_mode = 'hide'
1149
-
1150
- def start_block(self, header):
1151
- self._message_blocks.append( (header, []) )
1152
-
1153
- def end_block(self):
1154
- header, messages = self._message_blocks.pop()
1155
- if messages:
1156
- width = self.term.COLS - 5 - 2*len(self._message_blocks)
1157
- prefix = self.term.CYAN+self.term.BOLD+'| '+self.term.NORMAL
1158
- divider = (self.term.CYAN+self.term.BOLD+'+'+'-'*(width-1)+
1159
- self.term.NORMAL)
1160
- # Mark up the header:
1161
- header = wordwrap(header, right=width-2, splitchars='\\/').rstrip()
1162
- header = '\n'.join([prefix+self.term.CYAN+l+self.term.NORMAL
1163
- for l in header.split('\n')])
1164
- # Construct the body:
1165
- body = ''
1166
- for message in messages:
1167
- if message.endswith('\n'): body += message
1168
- else: body += message+'\n'
1169
- # Indent the body:
1170
- body = '\n'.join([prefix+' '+l for l in body.split('\n')])
1171
- # Put it all together:
1172
- message = divider + '\n' + header + '\n' + body + '\n'
1173
- self._report(message)
1174
-
1175
- def _format(self, prefix, message, color):
1176
- """
1177
- Rewrap the message; but preserve newlines, and don't touch any
1178
- lines that begin with spaces.
1179
- """
1180
- lines = message.split('\n')
1181
- startindex = indent = len(prefix)
1182
- for i in range(len(lines)):
1183
- if lines[i].startswith(' '):
1184
- lines[i] = ' '*(indent-startindex) + lines[i] + '\n'
1185
- else:
1186
- width = self.term.COLS - 5 - 4*len(self._message_blocks)
1187
- lines[i] = wordwrap(lines[i], indent, width, startindex, '\\/')
1188
- startindex = 0
1189
- return color+prefix+self.term.NORMAL+''.join(lines)
1190
-
1191
- def log(self, level, message):
1192
- self.reported_message_levels.add(level)
1193
- if self._verbosity >= -2 and level >= log.ERROR:
1194
- message = self._format(' Error: ', message, self.term.RED)
1195
- elif self._verbosity >= -1 and level >= log.WARNING:
1196
- message = self._format('Warning: ', message, self.term.YELLOW)
1197
- elif self._verbosity >= 1 and level >= log.DOCSTRING_WARNING:
1198
- message = self._format('Warning: ', message, self.term.YELLOW)
1199
- elif self._verbosity >= 3 and level >= log.INFO:
1200
- message = self._format(' Info: ', message, self.term.NORMAL)
1201
- elif epydoc.DEBUG and level == log.DEBUG:
1202
- message = self._format(' Debug: ', message, self.term.CYAN)
1203
- else:
1204
- if level >= log.DOCSTRING_WARNING:
1205
- self.suppressed_docstring_warning += 1
1206
- return
1207
-
1208
- self._report(message)
1209
-
1210
- def _report(self, message):
1211
- if not message.endswith('\n'): message += '\n'
1212
-
1213
- if self._message_blocks:
1214
- self._message_blocks[-1][-1].append(message)
1215
- else:
1216
- # If we're in the middle of displaying a progress bar,
1217
- # then make room for the message.
1218
- if self._progress_mode == 'simple-bar':
1219
- if self._progress is not None:
1220
- print
1221
- self._progress = None
1222
- if self._progress_mode == 'bar':
1223
- sys.stdout.write(self.term.CLEAR_LINE)
1224
- if self._progress_mode == 'multiline-bar':
1225
- sys.stdout.write((self.term.CLEAR_EOL + '\n')*2 +
1226
- self.term.CLEAR_EOL + self.term.UP*2)
1227
-
1228
- # Display the message message.
1229
- sys.stdout.write(message)
1230
- sys.stdout.flush()
1231
-
1232
- def progress(self, percent, message=''):
1233
- percent = min(1.0, percent)
1234
- message = '%s' % message
1235
-
1236
- if self._progress_mode == 'list':
1237
- if message:
1238
- print '[%3d%%] %s' % (100*percent, message)
1239
- sys.stdout.flush()
1240
-
1241
- elif self._progress_mode == 'bar':
1242
- dots = int((self.term.COLS/2-8)*percent)
1243
- background = '-'*(self.term.COLS/2-8)
1244
- if len(message) > self.term.COLS/2:
1245
- message = message[:self.term.COLS/2-3]+'...'
1246
- sys.stdout.write(self.term.CLEAR_LINE + '%3d%% '%(100*percent) +
1247
- self.term.GREEN + '[' + self.term.BOLD +
1248
- '='*dots + background[dots:] + self.term.NORMAL +
1249
- self.term.GREEN + '] ' + self.term.NORMAL +
1250
- message + self.term.BOL)
1251
- sys.stdout.flush()
1252
- self._progress = percent
1253
- elif self._progress_mode == 'multiline-bar':
1254
- dots = int((self.term.COLS-10)*percent)
1255
- background = '-'*(self.term.COLS-10)
1256
-
1257
- if len(message) > self.term.COLS-10:
1258
- message = message[:self.term.COLS-10-3]+'...'
1259
- else:
1260
- message = message.center(self.term.COLS-10)
1261
-
1262
- time_elapsed = time.time()-self._progress_start_time
1263
- if percent > 0:
1264
- time_remain = (time_elapsed / percent) * (1-percent)
1265
- else:
1266
- time_remain = 0
1267
-
1268
- sys.stdout.write(
1269
- # Line 1:
1270
- self.term.CLEAR_EOL + ' ' +
1271
- '%-8s' % self._timestr(time_elapsed) +
1272
- self.term.BOLD + 'Progress:'.center(self.term.COLS-26) +
1273
- self.term.NORMAL + '%8s' % self._timestr(time_remain) + '\n' +
1274
- # Line 2:
1275
- self.term.CLEAR_EOL + ('%3d%% ' % (100*percent)) +
1276
- self.term.GREEN + '[' + self.term.BOLD + '='*dots +
1277
- background[dots:] + self.term.NORMAL + self.term.GREEN +
1278
- ']' + self.term.NORMAL + '\n' +
1279
- # Line 3:
1280
- self.term.CLEAR_EOL + ' ' + message + self.term.BOL +
1281
- self.term.UP + self.term.UP)
1282
-
1283
- sys.stdout.flush()
1284
- self._progress = percent
1285
- elif self._progress_mode == 'simple-bar':
1286
- if self._progress is None:
1287
- sys.stdout.write(' [')
1288
- self._progress = 0.0
1289
- dots = int((self.term.COLS-2)*percent)
1290
- progress_dots = int((self.term.COLS-2)*self._progress)
1291
- if dots > progress_dots:
1292
- sys.stdout.write('.'*(dots-progress_dots))
1293
- sys.stdout.flush()
1294
- self._progress = percent
1295
-
1296
- def _timestr(self, dt):
1297
- dt = int(dt)
1298
- if dt >= 3600:
1299
- return '%d:%02d:%02d' % (dt/3600, dt%3600/60, dt%60)
1300
- else:
1301
- return '%02d:%02d' % (dt/60, dt%60)
1302
-
1303
- def start_progress(self, header=None):
1304
- if self._progress is not None:
1305
- raise ValueError
1306
- self._progress = None
1307
- self._progress_start_time = time.time()
1308
- self._progress_header = header
1309
- if self._progress_mode != 'hide' and header:
1310
- print self.term.BOLD + header + self.term.NORMAL
1311
-
1312
- def end_progress(self):
1313
- self.progress(1.)
1314
- if self._progress_mode == 'bar':
1315
- sys.stdout.write(self.term.CLEAR_LINE)
1316
- if self._progress_mode == 'multiline-bar':
1317
- sys.stdout.write((self.term.CLEAR_EOL + '\n')*2 +
1318
- self.term.CLEAR_EOL + self.term.UP*2)
1319
- if self._progress_mode == 'simple-bar':
1320
- print ']'
1321
- self._progress = None
1322
- self._task_times.append( (time.time()-self._progress_start_time,
1323
- self._progress_header) )
1324
-
1325
- def print_times(self):
1326
- print
1327
- print 'Timing summary:'
1328
- total = sum([time for (time, task) in self._task_times])
1329
- max_t = max([time for (time, task) in self._task_times])
1330
- for (time, task) in self._task_times:
1331
- task = task[:31]
1332
- print ' %s%s %7.1fs' % (task, '.'*(35-len(task)), time),
1333
- if self.term.COLS > 55:
1334
- print '|'+'=' * int((self.term.COLS-53) * time / max_t)
1335
- else:
1336
- print
1337
- print
1338
-
1339
- class UnifiedProgressConsoleLogger(ConsoleLogger):
1340
- def __init__(self, verbosity, stages, progress_mode=None):
1341
- self.stage = 0
1342
- self.stages = stages
1343
- self.task = None
1344
- ConsoleLogger.__init__(self, verbosity, progress_mode)
1345
-
1346
- def progress(self, percent, message=''):
1347
- #p = float(self.stage-1+percent)/self.stages
1348
- i = self.stage-1
1349
- p = ((sum(self.stages[:i]) + percent*self.stages[i]) /
1350
- float(sum(self.stages)))
1351
-
1352
- if message is UNKNOWN: message = None
1353
- if message: message = '%s: %s' % (self.task, message)
1354
- ConsoleLogger.progress(self, p, message)
1355
-
1356
- def start_progress(self, header=None):
1357
- self.task = header
1358
- if self.stage == 0:
1359
- ConsoleLogger.start_progress(self)
1360
- self.stage += 1
1361
-
1362
- def end_progress(self):
1363
- if self.stage == len(self.stages):
1364
- ConsoleLogger.end_progress(self)
1365
-
1366
- def print_times(self):
1367
- pass
1368
-
1369
- class HTMLLogger(log.Logger):
1370
- """
1371
- A logger used to generate a log of all warnings and messages to an
1372
- HTML file.
1373
- """
1374
-
1375
- FILENAME = "epydoc-log.html"
1376
- HEADER = textwrap.dedent('''\
1377
- <?xml version="1.0" encoding="ascii"?>
1378
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
1379
- "DTD/xhtml1-transitional.dtd">
1380
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
1381
- <head>
1382
- <title>Epydoc Log</title>
1383
- <link rel="stylesheet" href="epydoc.css" type="text/css" />
1384
- </head>
1385
-
1386
- <body bgcolor="white" text="black" link="blue" vlink="#204080"
1387
- alink="#204080">
1388
- <h1 class="epydoc">Epydoc Log</h1>
1389
- <p class="log">Epydoc started at %s</p>''')
1390
- START_BLOCK = '<div class="log-block"><h2 class="log-hdr">%s</h2>'
1391
- MESSAGE = ('<div class="log-%s"><b>%s</b>: \n'
1392
- '%s</div>\n')
1393
- END_BLOCK = '</div>'
1394
- FOOTER = "</body>\n</html>\n"
1395
-
1396
- def __init__(self, directory, options):
1397
- self.start_time = time.time()
1398
- self.out = open(os.path.join(directory, self.FILENAME), 'w')
1399
- self.out.write(self.HEADER % time.ctime(self.start_time))
1400
- self.is_empty = True
1401
- self.options = options
1402
-
1403
- def write_options(self, options):
1404
- self.out.write(self.START_BLOCK % 'Epydoc Options')
1405
- msg = '<table border="0" cellpadding="0" cellspacing="0">\n'
1406
- opts = [(key, getattr(options, key)) for key in dir(options)
1407
- if key not in dir(optparse.Values)]
1408
- opts = [(val==OPTION_DEFAULTS.get(key), key, val)
1409
- for (key, val) in opts]
1410
- for is_default, key, val in sorted(opts):
1411
- css = is_default and 'opt-default' or 'opt-changed'
1412
- msg += ('<tr valign="top" class="%s"><td valign="top">%s</td>'
1413
- '<td valign="top"><tt>&nbsp;=&nbsp;</tt></td>'
1414
- '<td valign="top"><tt>%s</tt></td></tr>' %
1415
- (css, key, plaintext_to_html(repr(val))))
1416
- msg += '</table>\n'
1417
- self.out.write('<div class="log-info">\n%s</div>\n' % msg)
1418
- self.out.write(self.END_BLOCK)
1419
-
1420
- def start_block(self, header):
1421
- self.out.write(self.START_BLOCK % header)
1422
-
1423
- def end_block(self):
1424
- self.out.write(self.END_BLOCK)
1425
-
1426
- def log(self, level, message):
1427
- if message.endswith("(-v) to display markup errors."): return
1428
- if level >= log.ERROR:
1429
- self.out.write(self._message('error', message))
1430
- elif level >= log.WARNING:
1431
- self.out.write(self._message('warning', message))
1432
- elif level >= log.DOCSTRING_WARNING:
1433
- self.out.write(self._message('docstring warning', message))
1434
-
1435
- def _message(self, level, message):
1436
- self.is_empty = False
1437
- message = plaintext_to_html(message)
1438
- if '\n' in message:
1439
- message = '<pre class="log">%s</pre>' % message
1440
- hdr = ' '.join([w.capitalize() for w in level.split()])
1441
- return self.MESSAGE % (level.split()[-1], hdr, message)
1442
-
1443
- def close(self):
1444
- if self.is_empty:
1445
- self.out.write('<div class="log-info">'
1446
- 'No warnings or errors!</div>')
1447
- self.write_options(self.options)
1448
- self.out.write('<p class="log">Epydoc finished at %s</p>\n'
1449
- '<p class="log">(Elapsed time: %s)</p>' %
1450
- (time.ctime(), self._elapsed_time()))
1451
- self.out.write(self.FOOTER)
1452
- self.out.close()
1453
-
1454
- def _elapsed_time(self):
1455
- secs = int(time.time()-self.start_time)
1456
- if secs < 60:
1457
- return '%d seconds' % secs
1458
- if secs < 3600:
1459
- return '%d minutes, %d seconds' % (secs/60, secs%60)
1460
- else:
1461
- return '%d hours, %d minutes' % (secs/3600, secs%3600)
1462
-
1463
-
1464
- ######################################################################
1465
- ## main
1466
- ######################################################################
1467
-
1468
- if __name__ == '__main__':
1469
- cli()
1470
-