bee_python 0.0.1

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 (503) hide show
  1. data/LICENSE +202 -0
  2. data/build/README +23 -0
  3. data/egg/egg/build.yml +70 -0
  4. data/egg/egg/ez_setup.py +280 -0
  5. data/egg/egg/script.py +12 -0
  6. data/egg/egg/setup.erb +11 -0
  7. data/egg/egg/suite.py +37 -0
  8. data/egg/egg/test.py +31 -0
  9. data/egg/egg.yml +69 -0
  10. data/egg/http/build.erb +53 -0
  11. data/egg/http/server.py +34 -0
  12. data/egg/http.yml +50 -0
  13. data/egg/mysql/mysql.py +43 -0
  14. data/egg/mysql.yml +44 -0
  15. data/egg/project/build.erb +77 -0
  16. data/egg/project/script.py +42 -0
  17. data/egg/project/test.py +31 -0
  18. data/egg/project.yml +59 -0
  19. data/egg/script/build.erb +35 -0
  20. data/egg/script/script.py +42 -0
  21. data/egg/script.yml +50 -0
  22. data/egg/soap/build.erb +52 -0
  23. data/egg/soap/client.py +18 -0
  24. data/egg/soap/server.py +30 -0
  25. data/egg/soap.yml +58 -0
  26. data/egg/source/source.py +42 -0
  27. data/egg/source.yml +47 -0
  28. data/egg/test/test.py +28 -0
  29. data/egg/test.yml +44 -0
  30. data/egg/xmlrpc/build.erb +52 -0
  31. data/egg/xmlrpc/client.py +22 -0
  32. data/egg/xmlrpc/server.py +24 -0
  33. data/egg/xmlrpc.yml +51 -0
  34. data/lib/bee_task_python.rb +390 -0
  35. data/test/build.yml +16 -0
  36. data/test/tc_bee_task_python.rb +27 -0
  37. data/test/test_build.rb +26 -0
  38. data/test/test_build_listener.rb +62 -0
  39. data/test/ts_bee_python.rb +26 -0
  40. data/tools/common/__init__.py +5 -0
  41. data/tools/common/common/__init__.py +140 -0
  42. data/tools/common/common/__pkginfo__.py +43 -0
  43. data/tools/common/common/adbh.py +35 -0
  44. data/tools/common/common/cache.py +114 -0
  45. data/tools/common/common/changelog.py +234 -0
  46. data/tools/common/common/clcommands.py +181 -0
  47. data/tools/common/common/cli.py +212 -0
  48. data/tools/common/common/compat.py +328 -0
  49. data/tools/common/common/configuration.py +1087 -0
  50. data/tools/common/common/contexts.py +58 -0
  51. data/tools/common/common/corbautils.py +117 -0
  52. data/tools/common/common/daemon.py +171 -0
  53. data/tools/common/common/date.py +279 -0
  54. data/tools/common/common/db.py +49 -0
  55. data/tools/common/common/dbf.py +229 -0
  56. data/tools/common/common/debugger.py +208 -0
  57. data/tools/common/common/decorators.py +190 -0
  58. data/tools/common/common/deprecation.py +118 -0
  59. data/tools/common/common/fileutils.py +409 -0
  60. data/tools/common/common/graph.py +259 -0
  61. data/tools/common/common/html.py +142 -0
  62. data/tools/common/common/interface.py +76 -0
  63. data/tools/common/common/logging_ext.py +166 -0
  64. data/tools/common/common/modutils.py +670 -0
  65. data/tools/common/common/optik_ext.py +383 -0
  66. data/tools/common/common/optparser.py +92 -0
  67. data/tools/common/common/pdf_ext.py +111 -0
  68. data/tools/common/common/proc.py +276 -0
  69. data/tools/common/common/pyro_ext.py +146 -0
  70. data/tools/common/common/pytest.py +754 -0
  71. data/tools/common/common/shellutils.py +383 -0
  72. data/tools/common/common/sphinx_ext.py +87 -0
  73. data/tools/common/common/sphinxutils.py +122 -0
  74. data/tools/common/common/sqlgen.py +31 -0
  75. data/tools/common/common/table.py +930 -0
  76. data/tools/common/common/tasksqueue.py +97 -0
  77. data/tools/common/common/test/__init__.py +1 -0
  78. data/tools/common/common/test/data/ChangeLog +184 -0
  79. data/tools/common/common/test/data/MyPyPa-0.1.0-py2.5.egg +0 -0
  80. data/tools/common/common/test/data/__init__.py +1 -0
  81. data/tools/common/common/test/data/content_differ_dir/NOTHING +0 -0
  82. data/tools/common/common/test/data/content_differ_dir/README +1 -0
  83. data/tools/common/common/test/data/content_differ_dir/subdir/coin +1 -0
  84. data/tools/common/common/test/data/content_differ_dir/subdir/toto.txt +53 -0
  85. data/tools/common/common/test/data/file_differ_dir/NOTHING +0 -0
  86. data/tools/common/common/test/data/file_differ_dir/README +1 -0
  87. data/tools/common/common/test/data/file_differ_dir/subdir/toto.txt +53 -0
  88. data/tools/common/common/test/data/file_differ_dir/subdirtwo/Hello +0 -0
  89. data/tools/common/common/test/data/find_test/__init__.py +0 -0
  90. data/tools/common/common/test/data/find_test/foo.txt +0 -0
  91. data/tools/common/common/test/data/find_test/module.py +0 -0
  92. data/tools/common/common/test/data/find_test/module2.py +0 -0
  93. data/tools/common/common/test/data/find_test/newlines.txt +0 -0
  94. data/tools/common/common/test/data/find_test/noendingnewline.py +0 -0
  95. data/tools/common/common/test/data/find_test/nonregr.py +0 -0
  96. data/tools/common/common/test/data/find_test/normal_file.txt +0 -0
  97. data/tools/common/common/test/data/find_test/spam.txt +0 -0
  98. data/tools/common/common/test/data/find_test/sub/doc.txt +0 -0
  99. data/tools/common/common/test/data/find_test/sub/momo.py +0 -0
  100. data/tools/common/common/test/data/find_test/test.ini +0 -0
  101. data/tools/common/common/test/data/find_test/test1.msg +0 -0
  102. data/tools/common/common/test/data/find_test/test2.msg +0 -0
  103. data/tools/common/common/test/data/find_test/write_protected_file.txt +0 -0
  104. data/tools/common/common/test/data/foo.txt +9 -0
  105. data/tools/common/common/test/data/module.py +88 -0
  106. data/tools/common/common/test/data/module2.py +77 -0
  107. data/tools/common/common/test/data/newlines.txt +3 -0
  108. data/tools/common/common/test/data/noendingnewline.py +36 -0
  109. data/tools/common/common/test/data/nonregr.py +14 -0
  110. data/tools/common/common/test/data/normal_file.txt +0 -0
  111. data/tools/common/common/test/data/reference_dir/NOTHING +0 -0
  112. data/tools/common/common/test/data/reference_dir/README +1 -0
  113. data/tools/common/common/test/data/reference_dir/subdir/coin +1 -0
  114. data/tools/common/common/test/data/reference_dir/subdir/toto.txt +53 -0
  115. data/tools/common/common/test/data/same_dir/NOTHING +0 -0
  116. data/tools/common/common/test/data/same_dir/README +1 -0
  117. data/tools/common/common/test/data/same_dir/subdir/coin +1 -0
  118. data/tools/common/common/test/data/same_dir/subdir/toto.txt +53 -0
  119. data/tools/common/common/test/data/spam.txt +9 -0
  120. data/tools/common/common/test/data/sub/doc.txt +1 -0
  121. data/tools/common/common/test/data/sub/momo.py +1 -0
  122. data/tools/common/common/test/data/subdir_differ_dir/NOTHING +0 -0
  123. data/tools/common/common/test/data/subdir_differ_dir/README +1 -0
  124. data/tools/common/common/test/data/subdir_differ_dir/subdir/coin +1 -0
  125. data/tools/common/common/test/data/subdir_differ_dir/subdir/toto.txt +53 -0
  126. data/tools/common/common/test/data/test.ini +20 -0
  127. data/tools/common/common/test/data/test1.msg +30 -0
  128. data/tools/common/common/test/data/test2.msg +42 -0
  129. data/tools/common/common/test/data/write_protected_file.txt +0 -0
  130. data/tools/common/common/test/foomod.py +17 -0
  131. data/tools/common/common/test/unittest_cache.py +129 -0
  132. data/tools/common/common/test/unittest_changelog.py +37 -0
  133. data/tools/common/common/test/unittest_compat.py +239 -0
  134. data/tools/common/common/test/unittest_configuration.py +348 -0
  135. data/tools/common/common/test/unittest_date.py +154 -0
  136. data/tools/common/common/test/unittest_decorators.py +62 -0
  137. data/tools/common/common/test/unittest_deprecation.py +76 -0
  138. data/tools/common/common/test/unittest_fileutils.py +133 -0
  139. data/tools/common/common/test/unittest_graph.py +50 -0
  140. data/tools/common/common/test/unittest_html.py +76 -0
  141. data/tools/common/common/test/unittest_interface.py +87 -0
  142. data/tools/common/common/test/unittest_modutils.py +244 -0
  143. data/tools/common/common/test/unittest_pytest.py +50 -0
  144. data/tools/common/common/test/unittest_shellutils.py +248 -0
  145. data/tools/common/common/test/unittest_table.py +448 -0
  146. data/tools/common/common/test/unittest_taskqueue.py +71 -0
  147. data/tools/common/common/test/unittest_testlib.py +956 -0
  148. data/tools/common/common/test/unittest_textutils.py +247 -0
  149. data/tools/common/common/test/unittest_tree.py +248 -0
  150. data/tools/common/common/test/unittest_umessage.py +55 -0
  151. data/tools/common/common/test/unittest_ureports_html.py +64 -0
  152. data/tools/common/common/test/unittest_ureports_text.py +105 -0
  153. data/tools/common/common/test/unittest_xmlutils.py +75 -0
  154. data/tools/common/common/test/utils.py +87 -0
  155. data/tools/common/common/testlib.py +1927 -0
  156. data/tools/common/common/textutils.py +476 -0
  157. data/tools/common/common/tree.py +372 -0
  158. data/tools/common/common/umessage.py +161 -0
  159. data/tools/common/common/ureports/__init__.py +174 -0
  160. data/tools/common/common/ureports/docbook_writer.py +139 -0
  161. data/tools/common/common/ureports/html_writer.py +131 -0
  162. data/tools/common/common/ureports/nodes.py +201 -0
  163. data/tools/common/common/ureports/text_writer.py +140 -0
  164. data/tools/common/common/vcgutils.py +216 -0
  165. data/tools/common/common/visitor.py +107 -0
  166. data/tools/common/common/xmlrpcutils.py +136 -0
  167. data/tools/common/common/xmlutils.py +61 -0
  168. data/tools/compile/compile.py +16 -0
  169. data/tools/coverage/coverage.py +602 -0
  170. data/tools/epydoc/__init__.py +227 -0
  171. data/tools/epydoc/__init__.pyc +0 -0
  172. data/tools/epydoc/apidoc.py +2203 -0
  173. data/tools/epydoc/apidoc.pyc +0 -0
  174. data/tools/epydoc/checker.py +349 -0
  175. data/tools/epydoc/checker.pyc +0 -0
  176. data/tools/epydoc/cli.py +1470 -0
  177. data/tools/epydoc/cli.pyc +0 -0
  178. data/tools/epydoc/compat.py +250 -0
  179. data/tools/epydoc/compat.pyc +0 -0
  180. data/tools/epydoc/docbuilder.py +1358 -0
  181. data/tools/epydoc/docbuilder.pyc +0 -0
  182. data/tools/epydoc/docintrospecter.py +1056 -0
  183. data/tools/epydoc/docintrospecter.pyc +0 -0
  184. data/tools/epydoc/docparser.py +2113 -0
  185. data/tools/epydoc/docparser.pyc +0 -0
  186. data/tools/epydoc/docstringparser.py +1111 -0
  187. data/tools/epydoc/docstringparser.pyc +0 -0
  188. data/tools/epydoc/docwriter/__init__.py +12 -0
  189. data/tools/epydoc/docwriter/__init__.pyc +0 -0
  190. data/tools/epydoc/docwriter/dotgraph.py +1351 -0
  191. data/tools/epydoc/docwriter/dotgraph.pyc +0 -0
  192. data/tools/epydoc/docwriter/html.py +3491 -0
  193. data/tools/epydoc/docwriter/html.pyc +0 -0
  194. data/tools/epydoc/docwriter/html_colorize.py +909 -0
  195. data/tools/epydoc/docwriter/html_colorize.pyc +0 -0
  196. data/tools/epydoc/docwriter/html_css.py +550 -0
  197. data/tools/epydoc/docwriter/html_css.pyc +0 -0
  198. data/tools/epydoc/docwriter/html_help.py +190 -0
  199. data/tools/epydoc/docwriter/html_help.pyc +0 -0
  200. data/tools/epydoc/docwriter/latex.py +1187 -0
  201. data/tools/epydoc/docwriter/latex.pyc +0 -0
  202. data/tools/epydoc/docwriter/plaintext.py +276 -0
  203. data/tools/epydoc/docwriter/plaintext.pyc +0 -0
  204. data/tools/epydoc/docwriter/xlink.py +505 -0
  205. data/tools/epydoc/docwriter/xlink.pyc +0 -0
  206. data/tools/epydoc/gui.py +1148 -0
  207. data/tools/epydoc/gui.pyc +0 -0
  208. data/tools/epydoc/log.py +204 -0
  209. data/tools/epydoc/log.pyc +0 -0
  210. data/tools/epydoc/markup/__init__.py +623 -0
  211. data/tools/epydoc/markup/__init__.pyc +0 -0
  212. data/tools/epydoc/markup/doctest.py +311 -0
  213. data/tools/epydoc/markup/doctest.pyc +0 -0
  214. data/tools/epydoc/markup/epytext.py +2116 -0
  215. data/tools/epydoc/markup/epytext.pyc +0 -0
  216. data/tools/epydoc/markup/javadoc.py +250 -0
  217. data/tools/epydoc/markup/javadoc.pyc +0 -0
  218. data/tools/epydoc/markup/plaintext.py +78 -0
  219. data/tools/epydoc/markup/plaintext.pyc +0 -0
  220. data/tools/epydoc/markup/pyval_repr.py +532 -0
  221. data/tools/epydoc/markup/pyval_repr.pyc +0 -0
  222. data/tools/epydoc/markup/restructuredtext.py +906 -0
  223. data/tools/epydoc/markup/restructuredtext.pyc +0 -0
  224. data/tools/epydoc/test/__init__.py +97 -0
  225. data/tools/epydoc/test/__init__.pyc +0 -0
  226. data/tools/epydoc/test/util.py +226 -0
  227. data/tools/epydoc/test/util.pyc +0 -0
  228. data/tools/epydoc/util.py +289 -0
  229. data/tools/epydoc/util.pyc +0 -0
  230. data/tools/logilab/logilab/__init__.py +5 -0
  231. data/tools/logilab/logilab/astng/__init__.py +82 -0
  232. data/tools/logilab/logilab/astng/__pkginfo__.py +76 -0
  233. data/tools/logilab/logilab/astng/_exceptions.py +64 -0
  234. data/tools/logilab/logilab/astng/_nodes_ast.py +667 -0
  235. data/tools/logilab/logilab/astng/_nodes_compiler.py +758 -0
  236. data/tools/logilab/logilab/astng/bases.py +608 -0
  237. data/tools/logilab/logilab/astng/builder.py +239 -0
  238. data/tools/logilab/logilab/astng/inference.py +426 -0
  239. data/tools/logilab/logilab/astng/inspector.py +289 -0
  240. data/tools/logilab/logilab/astng/manager.py +421 -0
  241. data/tools/logilab/logilab/astng/mixins.py +165 -0
  242. data/tools/logilab/logilab/astng/node_classes.py +848 -0
  243. data/tools/logilab/logilab/astng/nodes.py +85 -0
  244. data/tools/logilab/logilab/astng/nodes_as_string.py +389 -0
  245. data/tools/logilab/logilab/astng/patchcomptransformer.py +159 -0
  246. data/tools/logilab/logilab/astng/protocols.py +333 -0
  247. data/tools/logilab/logilab/astng/raw_building.py +212 -0
  248. data/tools/logilab/logilab/astng/rebuilder.py +307 -0
  249. data/tools/logilab/logilab/astng/scoped_nodes.py +951 -0
  250. data/tools/logilab/logilab/astng/test/__init__.py +19 -0
  251. data/tools/logilab/logilab/astng/test/data/MyPyPa-0.1.0-py2.5.egg +0 -0
  252. data/tools/logilab/logilab/astng/test/data/MyPyPa-0.1.0-py2.5.zip +0 -0
  253. data/tools/logilab/logilab/astng/test/data/SSL1/Connection1.py +33 -0
  254. data/tools/logilab/logilab/astng/test/data/SSL1/__init__.py +20 -0
  255. data/tools/logilab/logilab/astng/test/data/__init__.py +20 -0
  256. data/tools/logilab/logilab/astng/test/data/all.py +29 -0
  257. data/tools/logilab/logilab/astng/test/data/appl/__init__.py +23 -0
  258. data/tools/logilab/logilab/astng/test/data/appl/myConnection.py +30 -0
  259. data/tools/logilab/logilab/astng/test/data/format.py +34 -0
  260. data/tools/logilab/logilab/astng/test/data/module.py +90 -0
  261. data/tools/logilab/logilab/astng/test/data/module2.py +112 -0
  262. data/tools/logilab/logilab/astng/test/data/noendingnewline.py +57 -0
  263. data/tools/logilab/logilab/astng/test/data/nonregr.py +76 -0
  264. data/tools/logilab/logilab/astng/test/data/notall.py +28 -0
  265. data/tools/logilab/logilab/astng/test/data2/__init__.py +20 -0
  266. data/tools/logilab/logilab/astng/test/data2/clientmodule_test.py +51 -0
  267. data/tools/logilab/logilab/astng/test/data2/suppliermodule_test.py +32 -0
  268. data/tools/logilab/logilab/astng/test/regrtest.py +135 -0
  269. data/tools/logilab/logilab/astng/test/regrtest_data/absimport.py +22 -0
  270. data/tools/logilab/logilab/astng/test/regrtest_data/descriptor_crash.py +31 -0
  271. data/tools/logilab/logilab/astng/test/regrtest_data/import_package_subpackage_module.py +68 -0
  272. data/tools/logilab/logilab/astng/test/regrtest_data/package/__init__.py +24 -0
  273. data/tools/logilab/logilab/astng/test/regrtest_data/package/subpackage/__init__.py +20 -0
  274. data/tools/logilab/logilab/astng/test/regrtest_data/package/subpackage/module.py +20 -0
  275. data/tools/logilab/logilab/astng/test/unittest_builder.py +684 -0
  276. data/tools/logilab/logilab/astng/test/unittest_inference.py +1112 -0
  277. data/tools/logilab/logilab/astng/test/unittest_inspector.py +105 -0
  278. data/tools/logilab/logilab/astng/test/unittest_lookup.py +302 -0
  279. data/tools/logilab/logilab/astng/test/unittest_manager.py +98 -0
  280. data/tools/logilab/logilab/astng/test/unittest_nodes.py +302 -0
  281. data/tools/logilab/logilab/astng/test/unittest_scoped_nodes.py +501 -0
  282. data/tools/logilab/logilab/astng/test/unittest_utils.py +104 -0
  283. data/tools/logilab/logilab/astng/utils.py +342 -0
  284. data/tools/logilab/logilab/common/__init__.py +140 -0
  285. data/tools/logilab/logilab/common/__pkginfo__.py +43 -0
  286. data/tools/logilab/logilab/common/adbh.py +35 -0
  287. data/tools/logilab/logilab/common/cache.py +114 -0
  288. data/tools/logilab/logilab/common/changelog.py +234 -0
  289. data/tools/logilab/logilab/common/clcommands.py +181 -0
  290. data/tools/logilab/logilab/common/cli.py +212 -0
  291. data/tools/logilab/logilab/common/compat.py +328 -0
  292. data/tools/logilab/logilab/common/configuration.py +1087 -0
  293. data/tools/logilab/logilab/common/contexts.py +58 -0
  294. data/tools/logilab/logilab/common/corbautils.py +117 -0
  295. data/tools/logilab/logilab/common/daemon.py +171 -0
  296. data/tools/logilab/logilab/common/date.py +279 -0
  297. data/tools/logilab/logilab/common/db.py +49 -0
  298. data/tools/logilab/logilab/common/dbf.py +229 -0
  299. data/tools/logilab/logilab/common/debugger.py +208 -0
  300. data/tools/logilab/logilab/common/decorators.py +190 -0
  301. data/tools/logilab/logilab/common/deprecation.py +118 -0
  302. data/tools/logilab/logilab/common/fileutils.py +409 -0
  303. data/tools/logilab/logilab/common/graph.py +259 -0
  304. data/tools/logilab/logilab/common/html.py +142 -0
  305. data/tools/logilab/logilab/common/interface.py +76 -0
  306. data/tools/logilab/logilab/common/logging_ext.py +166 -0
  307. data/tools/logilab/logilab/common/modutils.py +670 -0
  308. data/tools/logilab/logilab/common/optik_ext.py +383 -0
  309. data/tools/logilab/logilab/common/optparser.py +92 -0
  310. data/tools/logilab/logilab/common/pdf_ext.py +111 -0
  311. data/tools/logilab/logilab/common/proc.py +276 -0
  312. data/tools/logilab/logilab/common/pyro_ext.py +146 -0
  313. data/tools/logilab/logilab/common/pytest.py +754 -0
  314. data/tools/logilab/logilab/common/shellutils.py +383 -0
  315. data/tools/logilab/logilab/common/sphinx_ext.py +87 -0
  316. data/tools/logilab/logilab/common/sphinxutils.py +122 -0
  317. data/tools/logilab/logilab/common/sqlgen.py +31 -0
  318. data/tools/logilab/logilab/common/table.py +930 -0
  319. data/tools/logilab/logilab/common/tasksqueue.py +97 -0
  320. data/tools/logilab/logilab/common/test/__init__.py +1 -0
  321. data/tools/logilab/logilab/common/test/data/ChangeLog +184 -0
  322. data/tools/logilab/logilab/common/test/data/MyPyPa-0.1.0-py2.5.egg +0 -0
  323. data/tools/logilab/logilab/common/test/data/__init__.py +1 -0
  324. data/tools/logilab/logilab/common/test/data/content_differ_dir/NOTHING +0 -0
  325. data/tools/logilab/logilab/common/test/data/content_differ_dir/README +1 -0
  326. data/tools/logilab/logilab/common/test/data/content_differ_dir/subdir/coin +1 -0
  327. data/tools/logilab/logilab/common/test/data/content_differ_dir/subdir/toto.txt +53 -0
  328. data/tools/logilab/logilab/common/test/data/file_differ_dir/NOTHING +0 -0
  329. data/tools/logilab/logilab/common/test/data/file_differ_dir/README +1 -0
  330. data/tools/logilab/logilab/common/test/data/file_differ_dir/subdir/toto.txt +53 -0
  331. data/tools/logilab/logilab/common/test/data/file_differ_dir/subdirtwo/Hello +0 -0
  332. data/tools/logilab/logilab/common/test/data/find_test/__init__.py +0 -0
  333. data/tools/logilab/logilab/common/test/data/find_test/foo.txt +0 -0
  334. data/tools/logilab/logilab/common/test/data/find_test/module.py +0 -0
  335. data/tools/logilab/logilab/common/test/data/find_test/module2.py +0 -0
  336. data/tools/logilab/logilab/common/test/data/find_test/newlines.txt +0 -0
  337. data/tools/logilab/logilab/common/test/data/find_test/noendingnewline.py +0 -0
  338. data/tools/logilab/logilab/common/test/data/find_test/nonregr.py +0 -0
  339. data/tools/logilab/logilab/common/test/data/find_test/normal_file.txt +0 -0
  340. data/tools/logilab/logilab/common/test/data/find_test/spam.txt +0 -0
  341. data/tools/logilab/logilab/common/test/data/find_test/sub/doc.txt +0 -0
  342. data/tools/logilab/logilab/common/test/data/find_test/sub/momo.py +0 -0
  343. data/tools/logilab/logilab/common/test/data/find_test/test.ini +0 -0
  344. data/tools/logilab/logilab/common/test/data/find_test/test1.msg +0 -0
  345. data/tools/logilab/logilab/common/test/data/find_test/test2.msg +0 -0
  346. data/tools/logilab/logilab/common/test/data/find_test/write_protected_file.txt +0 -0
  347. data/tools/logilab/logilab/common/test/data/foo.txt +9 -0
  348. data/tools/logilab/logilab/common/test/data/module.py +88 -0
  349. data/tools/logilab/logilab/common/test/data/module2.py +77 -0
  350. data/tools/logilab/logilab/common/test/data/newlines.txt +3 -0
  351. data/tools/logilab/logilab/common/test/data/noendingnewline.py +36 -0
  352. data/tools/logilab/logilab/common/test/data/nonregr.py +14 -0
  353. data/tools/logilab/logilab/common/test/data/normal_file.txt +0 -0
  354. data/tools/logilab/logilab/common/test/data/reference_dir/NOTHING +0 -0
  355. data/tools/logilab/logilab/common/test/data/reference_dir/README +1 -0
  356. data/tools/logilab/logilab/common/test/data/reference_dir/subdir/coin +1 -0
  357. data/tools/logilab/logilab/common/test/data/reference_dir/subdir/toto.txt +53 -0
  358. data/tools/logilab/logilab/common/test/data/same_dir/NOTHING +0 -0
  359. data/tools/logilab/logilab/common/test/data/same_dir/README +1 -0
  360. data/tools/logilab/logilab/common/test/data/same_dir/subdir/coin +1 -0
  361. data/tools/logilab/logilab/common/test/data/same_dir/subdir/toto.txt +53 -0
  362. data/tools/logilab/logilab/common/test/data/spam.txt +9 -0
  363. data/tools/logilab/logilab/common/test/data/sub/doc.txt +1 -0
  364. data/tools/logilab/logilab/common/test/data/sub/momo.py +1 -0
  365. data/tools/logilab/logilab/common/test/data/subdir_differ_dir/NOTHING +0 -0
  366. data/tools/logilab/logilab/common/test/data/subdir_differ_dir/README +1 -0
  367. data/tools/logilab/logilab/common/test/data/subdir_differ_dir/subdir/coin +1 -0
  368. data/tools/logilab/logilab/common/test/data/subdir_differ_dir/subdir/toto.txt +53 -0
  369. data/tools/logilab/logilab/common/test/data/test.ini +20 -0
  370. data/tools/logilab/logilab/common/test/data/test1.msg +30 -0
  371. data/tools/logilab/logilab/common/test/data/test2.msg +42 -0
  372. data/tools/logilab/logilab/common/test/data/write_protected_file.txt +0 -0
  373. data/tools/logilab/logilab/common/test/foomod.py +17 -0
  374. data/tools/logilab/logilab/common/test/unittest_cache.py +129 -0
  375. data/tools/logilab/logilab/common/test/unittest_changelog.py +37 -0
  376. data/tools/logilab/logilab/common/test/unittest_compat.py +239 -0
  377. data/tools/logilab/logilab/common/test/unittest_configuration.py +348 -0
  378. data/tools/logilab/logilab/common/test/unittest_date.py +154 -0
  379. data/tools/logilab/logilab/common/test/unittest_decorators.py +62 -0
  380. data/tools/logilab/logilab/common/test/unittest_deprecation.py +76 -0
  381. data/tools/logilab/logilab/common/test/unittest_fileutils.py +133 -0
  382. data/tools/logilab/logilab/common/test/unittest_graph.py +50 -0
  383. data/tools/logilab/logilab/common/test/unittest_html.py +76 -0
  384. data/tools/logilab/logilab/common/test/unittest_interface.py +87 -0
  385. data/tools/logilab/logilab/common/test/unittest_modutils.py +244 -0
  386. data/tools/logilab/logilab/common/test/unittest_pytest.py +50 -0
  387. data/tools/logilab/logilab/common/test/unittest_shellutils.py +248 -0
  388. data/tools/logilab/logilab/common/test/unittest_table.py +448 -0
  389. data/tools/logilab/logilab/common/test/unittest_taskqueue.py +71 -0
  390. data/tools/logilab/logilab/common/test/unittest_testlib.py +956 -0
  391. data/tools/logilab/logilab/common/test/unittest_textutils.py +247 -0
  392. data/tools/logilab/logilab/common/test/unittest_tree.py +248 -0
  393. data/tools/logilab/logilab/common/test/unittest_umessage.py +55 -0
  394. data/tools/logilab/logilab/common/test/unittest_ureports_html.py +64 -0
  395. data/tools/logilab/logilab/common/test/unittest_ureports_text.py +105 -0
  396. data/tools/logilab/logilab/common/test/unittest_xmlutils.py +75 -0
  397. data/tools/logilab/logilab/common/test/utils.py +87 -0
  398. data/tools/logilab/logilab/common/testlib.py +1927 -0
  399. data/tools/logilab/logilab/common/textutils.py +476 -0
  400. data/tools/logilab/logilab/common/tree.py +372 -0
  401. data/tools/logilab/logilab/common/umessage.py +161 -0
  402. data/tools/logilab/logilab/common/ureports/__init__.py +174 -0
  403. data/tools/logilab/logilab/common/ureports/docbook_writer.py +139 -0
  404. data/tools/logilab/logilab/common/ureports/html_writer.py +131 -0
  405. data/tools/logilab/logilab/common/ureports/nodes.py +201 -0
  406. data/tools/logilab/logilab/common/ureports/text_writer.py +140 -0
  407. data/tools/logilab/logilab/common/vcgutils.py +216 -0
  408. data/tools/logilab/logilab/common/visitor.py +107 -0
  409. data/tools/logilab/logilab/common/xmlrpcutils.py +136 -0
  410. data/tools/logilab/logilab/common/xmlutils.py +61 -0
  411. data/tools/pychecker/COPYRIGHT +31 -0
  412. data/tools/pychecker/ChangeLog +349 -0
  413. data/tools/pychecker/CodeChecks.py +1969 -0
  414. data/tools/pychecker/CodeChecks.pyc +0 -0
  415. data/tools/pychecker/CodeChecks.pyo +0 -0
  416. data/tools/pychecker/Config.py +475 -0
  417. data/tools/pychecker/Config.pyc +0 -0
  418. data/tools/pychecker/Config.pyo +0 -0
  419. data/tools/pychecker/KNOWN_BUGS +100 -0
  420. data/tools/pychecker/MAINTAINERS +81 -0
  421. data/tools/pychecker/NEWS +406 -0
  422. data/tools/pychecker/OP.py +131 -0
  423. data/tools/pychecker/OP.pyc +0 -0
  424. data/tools/pychecker/OP.pyo +0 -0
  425. data/tools/pychecker/OptionTypes.py +117 -0
  426. data/tools/pychecker/OptionTypes.pyc +0 -0
  427. data/tools/pychecker/OptionTypes.pyo +0 -0
  428. data/tools/pychecker/README +152 -0
  429. data/tools/pychecker/Stack.py +115 -0
  430. data/tools/pychecker/Stack.pyc +0 -0
  431. data/tools/pychecker/Stack.pyo +0 -0
  432. data/tools/pychecker/TODO +101 -0
  433. data/tools/pychecker/VERSION +1 -0
  434. data/tools/pychecker/Warning.py +50 -0
  435. data/tools/pychecker/Warning.pyc +0 -0
  436. data/tools/pychecker/Warning.pyo +0 -0
  437. data/tools/pychecker/__init__.py +17 -0
  438. data/tools/pychecker/__init__.pyc +0 -0
  439. data/tools/pychecker/__init__.pyo +0 -0
  440. data/tools/pychecker/checker.py +961 -0
  441. data/tools/pychecker/checker.pyc +0 -0
  442. data/tools/pychecker/checker.pyo +0 -0
  443. data/tools/pychecker/function.py +159 -0
  444. data/tools/pychecker/function.pyc +0 -0
  445. data/tools/pychecker/function.pyo +0 -0
  446. data/tools/pychecker/msgs.py +175 -0
  447. data/tools/pychecker/msgs.pyc +0 -0
  448. data/tools/pychecker/msgs.pyo +0 -0
  449. data/tools/pychecker/options.py +275 -0
  450. data/tools/pychecker/options.pyc +0 -0
  451. data/tools/pychecker/options.pyo +0 -0
  452. data/tools/pychecker/pcmodules.py +19 -0
  453. data/tools/pychecker/pcmodules.pyc +0 -0
  454. data/tools/pychecker/pcmodules.pyo +0 -0
  455. data/tools/pychecker/printer.py +47 -0
  456. data/tools/pychecker/printer.pyc +0 -0
  457. data/tools/pychecker/printer.pyo +0 -0
  458. data/tools/pychecker/python.py +427 -0
  459. data/tools/pychecker/python.pyc +0 -0
  460. data/tools/pychecker/python.pyo +0 -0
  461. data/tools/pychecker/utils.py +102 -0
  462. data/tools/pychecker/utils.pyc +0 -0
  463. data/tools/pychecker/utils.pyo +0 -0
  464. data/tools/pychecker/warn.py +778 -0
  465. data/tools/pychecker/warn.pyc +0 -0
  466. data/tools/pychecker/warn.pyo +0 -0
  467. data/tools/pylint2/pylint/__init__.py +16 -0
  468. data/tools/pylint2/pylint/__pkginfo__.py +67 -0
  469. data/tools/pylint2/pylint/checkers/__init__.py +155 -0
  470. data/tools/pylint2/pylint/checkers/base.py +749 -0
  471. data/tools/pylint2/pylint/checkers/classes.py +527 -0
  472. data/tools/pylint2/pylint/checkers/design_analysis.py +344 -0
  473. data/tools/pylint2/pylint/checkers/exceptions.py +183 -0
  474. data/tools/pylint2/pylint/checkers/format.py +367 -0
  475. data/tools/pylint2/pylint/checkers/imports.py +379 -0
  476. data/tools/pylint2/pylint/checkers/logging.py +98 -0
  477. data/tools/pylint2/pylint/checkers/misc.py +128 -0
  478. data/tools/pylint2/pylint/checkers/newstyle.py +107 -0
  479. data/tools/pylint2/pylint/checkers/raw_metrics.py +125 -0
  480. data/tools/pylint2/pylint/checkers/similar.py +333 -0
  481. data/tools/pylint2/pylint/checkers/string_format.py +239 -0
  482. data/tools/pylint2/pylint/checkers/typecheck.py +364 -0
  483. data/tools/pylint2/pylint/checkers/utils.py +208 -0
  484. data/tools/pylint2/pylint/checkers/variables.py +498 -0
  485. data/tools/pylint2/pylint/config.py +149 -0
  486. data/tools/pylint2/pylint/epylint.py +149 -0
  487. data/tools/pylint2/pylint/gui.py +433 -0
  488. data/tools/pylint2/pylint/interfaces.py +98 -0
  489. data/tools/pylint2/pylint/lint.py +914 -0
  490. data/tools/pylint2/pylint/pyreverse/__init__.py +5 -0
  491. data/tools/pylint2/pylint/pyreverse/diadefslib.py +229 -0
  492. data/tools/pylint2/pylint/pyreverse/diagrams.py +247 -0
  493. data/tools/pylint2/pylint/pyreverse/main.py +123 -0
  494. data/tools/pylint2/pylint/pyreverse/utils.py +131 -0
  495. data/tools/pylint2/pylint/pyreverse/writer.py +196 -0
  496. data/tools/pylint2/pylint/reporters/__init__.py +67 -0
  497. data/tools/pylint2/pylint/reporters/guireporter.py +36 -0
  498. data/tools/pylint2/pylint/reporters/html.py +69 -0
  499. data/tools/pylint2/pylint/reporters/text.py +156 -0
  500. data/tools/pylint2/pylint/utils.py +518 -0
  501. data/tools/pylint2/pylint.py +16 -0
  502. data/tools/test/suite.py +35 -0
  503. metadata +566 -0
@@ -0,0 +1,131 @@
1
+ # Copyright (c) 2002-2010 LOGILAB S.A. (Paris, FRANCE).
2
+ # http://www.logilab.fr/ -- mailto:contact@logilab.fr
3
+ #
4
+ # This program is free software; you can redistribute it and/or modify it under
5
+ # the terms of the GNU General Public License as published by the Free Software
6
+ # Foundation; either version 2 of the License, or (at your option) any later
7
+ # version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful, but WITHOUT
10
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11
+ # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License along with
14
+ # this program; if not, write to the Free Software Foundation, Inc.,
15
+ # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16
+ """
17
+ generic classes/functions for pyreverse core/extensions
18
+ """
19
+
20
+ import sys
21
+ import re
22
+ import os
23
+
24
+ ########### pyreverse option utils ##############################
25
+
26
+
27
+ RCFILE = '.pyreverserc'
28
+
29
+ def get_default_options():
30
+ """
31
+ Read config file and return list of options
32
+ """
33
+ options = []
34
+ home = os.environ.get('HOME', '')
35
+ if home:
36
+ rcfile = os.path.join(home, RCFILE)
37
+ try:
38
+ options = open(rcfile).read().split()
39
+ except IOError:
40
+ pass # ignore if no config file found
41
+ return options
42
+
43
+ def insert_default_options():
44
+ """insert default options to sys.argv
45
+ """
46
+ options = get_default_options()
47
+ options.reverse()
48
+ for arg in options:
49
+ sys.argv.insert(1, arg)
50
+
51
+
52
+
53
+ # astng utilities ###########################################################
54
+
55
+ SPECIAL = re.compile('^__[A-Za-z0-9]+[A-Za-z0-9_]*__$')
56
+ PRIVATE = re.compile('^__[_A-Za-z0-9]*[A-Za-z0-9]+_?$')
57
+ PROTECTED = re.compile('^_[_A-Za-z0-9]*$')
58
+
59
+ def get_visibility(name):
60
+ """return the visibility from a name: public, protected, private or special
61
+ """
62
+ if SPECIAL.match(name):
63
+ visibility = 'special'
64
+ elif PRIVATE.match(name):
65
+ visibility = 'private'
66
+ elif PROTECTED.match(name):
67
+ visibility = 'protected'
68
+
69
+ else:
70
+ visibility = 'public'
71
+ return visibility
72
+
73
+ ABSTRACT = re.compile('^.*Abstract.*')
74
+ FINAL = re.compile('^[A-Z_]*$')
75
+
76
+ def is_abstract(node):
77
+ """return true if the given class node correspond to an abstract class
78
+ definition
79
+ """
80
+ return ABSTRACT.match(node.name)
81
+
82
+ def is_final(node):
83
+ """return true if the given class/function node correspond to final
84
+ definition
85
+ """
86
+ return FINAL.match(node.name)
87
+
88
+ def is_interface(node):
89
+ # bw compat
90
+ return node.type == 'interface'
91
+
92
+ def is_exception(node):
93
+ # bw compat
94
+ return node.type == 'exception'
95
+
96
+
97
+ # Helpers #####################################################################
98
+
99
+ _CONSTRUCTOR = 1
100
+ _SPECIAL = 2
101
+ _PROTECTED = 4
102
+ _PRIVATE = 8
103
+ MODES = {
104
+ 'ALL' : 0,
105
+ 'PUB_ONLY' : _SPECIAL + _PROTECTED + _PRIVATE,
106
+ 'SPECIAL' : _SPECIAL,
107
+ 'OTHER' : _PROTECTED + _PRIVATE,
108
+ }
109
+ VIS_MOD = {'special': _SPECIAL, 'protected': _PROTECTED, \
110
+ 'private': _PRIVATE, 'public': 0 }
111
+
112
+ class FilterMixIn:
113
+ """filter nodes according to a mode and nodes' visibility
114
+ """
115
+ def __init__(self, mode):
116
+ "init filter modes"
117
+ __mode = 0
118
+ for nummod in mode.split('+'):
119
+ try:
120
+ __mode += MODES[nummod]
121
+ except KeyError, ex:
122
+ print >> sys.stderr, 'Unknown filter mode %s' % ex
123
+ self.__mode = __mode
124
+
125
+
126
+ def show_attr(self, node):
127
+ """return true if the node should be treated
128
+ """
129
+ visibility = get_visibility(getattr(node, 'name', node))
130
+ return not (self.__mode & VIS_MOD[visibility] )
131
+
@@ -0,0 +1,196 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (c) 2008-2010 LOGILAB S.A. (Paris, FRANCE).
3
+ # http://www.logilab.fr/ -- mailto:contact@logilab.fr
4
+ #
5
+ # This program is free software; you can redistribute it and/or modify it under
6
+ # the terms of the GNU General Public License as published by the Free Software
7
+ # Foundation; either version 2 of the License, or (at your option) any later
8
+ # version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful, but WITHOUT
11
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12
+ # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License along with
15
+ # this program; if not, write to the Free Software Foundation, Inc.,
16
+ # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17
+ """
18
+ Utilities for creating VCG and Dot diagrams.
19
+ """
20
+
21
+ from logilab.common.vcgutils import VCGPrinter
22
+ from logilab.common.graph import DotBackend
23
+
24
+ from pylint.pyreverse.utils import is_exception
25
+
26
+ class DiagramWriter:
27
+ """base class for writing project diagrams
28
+ """
29
+ def __init__(self, config, styles):
30
+ self.config = config
31
+ self.pkg_edges, self.inh_edges, self.imp_edges, self.ass_edges = styles
32
+ self.printer = None # defined in set_printer
33
+
34
+ def write(self, diadefs):
35
+ """write files for <project> according to <diadefs>
36
+ """
37
+ for diagram in diadefs:
38
+ basename = diagram.title.strip().replace(' ', '_')
39
+ file_name = '%s.%s' % (basename, self.config.output_format)
40
+ self.set_printer(file_name, basename)
41
+ if diagram.TYPE == 'class':
42
+ self.write_classes(diagram)
43
+ else:
44
+ self.write_packages(diagram)
45
+ self.close_graph()
46
+
47
+ def write_packages(self, diagram):
48
+ """write a package diagram"""
49
+ for obj in diagram.modules():
50
+ label = self.get_title(obj)
51
+ self.printer.emit_node(obj.fig_id, label=label, shape='box')
52
+ # package dependencies
53
+ for rel in diagram.relationships.get('depends', ()):
54
+ self.printer.emit_edge(rel.from_object.fig_id, rel.to_object.fig_id,
55
+ **self.pkg_edges)
56
+
57
+ def write_classes(self, diagram):
58
+ """write a class diagram"""
59
+ for obj in diagram.objects:
60
+ self.printer.emit_node(obj.fig_id, **self.get_values(obj) )
61
+ # inheritance links
62
+ for rel in diagram.relationships.get('specialization', ()):
63
+ self.printer.emit_edge(rel.from_object.fig_id, rel.to_object.fig_id,
64
+ **self.inh_edges)
65
+ # implementation links
66
+ for rel in diagram.relationships.get('implements', ()):
67
+ self.printer.emit_edge(rel.from_object.fig_id, rel.to_object.fig_id,
68
+ **self.imp_edges)
69
+ # generate associations
70
+ for rel in diagram.relationships.get('association', ()):
71
+ self.printer.emit_edge(rel.from_object.fig_id, rel.to_object.fig_id,
72
+ label=rel.name, **self.ass_edges)
73
+
74
+ def set_printer(self, file_name, basename):
75
+ """set printer"""
76
+ raise NotImplementedError
77
+
78
+ def get_title(self, obj):
79
+ """get project title"""
80
+ raise NotImplementedError
81
+
82
+ def get_values(self, obj):
83
+ """get label and shape for classes."""
84
+ raise NotImplementedError
85
+
86
+ def close_graph(self):
87
+ """finalize the graph"""
88
+ raise NotImplementedError
89
+
90
+
91
+ class DotWriter(DiagramWriter):
92
+ """write dot graphs from a diagram definition and a project
93
+ """
94
+
95
+ def __init__(self, config):
96
+ styles = [dict(arrowtail='none', arrowhead="open"),
97
+ dict(arrowtail = "none", arrowhead='empty'),
98
+ dict(arrowtail="node", arrowhead='empty', style='dashed'),
99
+ dict(fontcolor='green', arrowtail='none',
100
+ arrowhead='diamond', style='solid') ]
101
+ DiagramWriter.__init__(self, config, styles)
102
+
103
+ def set_printer(self, file_name, basename):
104
+ """initialize DotWriter and add options for layout.
105
+ """
106
+ layout = dict(rankdir="BT")
107
+ self.printer = DotBackend(basename, additionnal_param=layout)
108
+ self.file_name = file_name
109
+
110
+ def get_title(self, obj):
111
+ """get project title"""
112
+ return obj.title
113
+
114
+ def get_values(self, obj):
115
+ """get label and shape for classes.
116
+
117
+ The label contains all attributes and methods
118
+ """
119
+ label = obj.title
120
+ if obj.shape == 'interface':
121
+ label = "«interface»\\n%s" % label
122
+ if not self.config.only_classnames:
123
+ label = "%s|%s\l|" % (label, r"\l".join(obj.attrs) )
124
+ for func in obj.methods:
125
+ label = r'%s%s()\l' % (label, func.name)
126
+ label = '{%s}' % label
127
+ if is_exception(obj.node):
128
+ return dict(fontcolor="red", label=label, shape="record")
129
+ return dict(label=label, shape="record")
130
+
131
+ def close_graph(self):
132
+ """print the dot graph into <file_name>"""
133
+ self.printer.generate(self.file_name)
134
+
135
+
136
+ class VCGWriter(DiagramWriter):
137
+ """write vcg graphs from a diagram definition and a project
138
+ """
139
+ def __init__(self, config):
140
+ styles = [dict(arrowstyle='solid', backarrowstyle='none',
141
+ backarrowsize=0),
142
+ dict(arrowstyle='solid', backarrowstyle='none',
143
+ backarrowsize=10),
144
+ dict(arrowstyle='solid', backarrowstyle='none',
145
+ linestyle='dotted', backarrowsize=10),
146
+ dict(arrowstyle='solid', backarrowstyle='none',
147
+ textcolor='green') ]
148
+ DiagramWriter.__init__(self, config, styles)
149
+
150
+ def set_printer(self, file_name, basename):
151
+ """initialize VCGWriter for a UML graph"""
152
+ self.graph_file = open(file_name, 'w+')
153
+ self.printer = VCGPrinter(self.graph_file)
154
+ self.printer.open_graph(title=basename, layoutalgorithm='dfs',
155
+ late_edge_labels='yes', port_sharing='no',
156
+ manhattan_edges='yes')
157
+ self.printer.emit_node = self.printer.node
158
+ self.printer.emit_edge = self.printer.edge
159
+
160
+ def get_title(self, obj):
161
+ """get project title in vcg format"""
162
+ return r'\fb%s\fn' % obj.title
163
+
164
+ def get_values(self, obj):
165
+ """get label and shape for classes.
166
+
167
+ The label contains all attributes and methods
168
+ """
169
+ if is_exception(obj.node):
170
+ label = r'\fb\f09%s\fn' % obj.title
171
+ else:
172
+ label = r'\fb%s\fn' % obj.title
173
+ if obj.shape == 'interface':
174
+ shape = 'ellipse'
175
+ else:
176
+ shape = 'box'
177
+ if not self.config.only_classnames:
178
+ attrs = obj.attrs
179
+ methods = [func.name for func in obj.methods]
180
+ # box width for UML like diagram
181
+ maxlen = max(len(name) for name in [obj.title] + methods + attrs)
182
+ line = "_" * (maxlen + 2)
183
+ label = r'%s\n\f%s' % (label, line)
184
+ for attr in attrs:
185
+ label = r'%s\n\f08%s' % (label, attr)
186
+ if attrs:
187
+ label = r'%s\n\f%s' % (label, line)
188
+ for func in methods:
189
+ label = r'%s\n\f10%s()' % (label, func)
190
+ return dict(label=label, shape=shape)
191
+
192
+ def close_graph(self):
193
+ """close graph and file"""
194
+ self.printer.close_graph()
195
+ self.graph_file.close()
196
+
@@ -0,0 +1,67 @@
1
+ # This program is free software; you can redistribute it and/or modify it under
2
+ # the terms of the GNU General Public License as published by the Free Software
3
+ # Foundation; either version 2 of the License, or (at your option) any later
4
+ # version.
5
+ #
6
+ # This program is distributed in the hope that it will be useful, but WITHOUT
7
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
8
+ # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
9
+ #
10
+ # You should have received a copy of the GNU General Public License along with
11
+ # this program; if not, write to the Free Software Foundation, Inc.,
12
+ # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
13
+ """utilities methods and classes for reporters
14
+
15
+ Copyright (c) 2000-2003 LOGILAB S.A. (Paris, FRANCE).
16
+ http://www.logilab.fr/ -- mailto:contact@logilab.fr
17
+ """
18
+
19
+ import sys
20
+
21
+ CMPS = ['=', '-', '+']
22
+
23
+ def diff_string(old, new):
24
+ """given a old and new int value, return a string representing the
25
+ difference
26
+ """
27
+ diff = abs(old - new)
28
+ diff_str = "%s%s" % (CMPS[cmp(old, new)], diff and ('%.2f' % diff) or '')
29
+ return diff_str
30
+
31
+
32
+ class EmptyReport(Exception):
33
+ """raised when a report is empty and so should not be displayed"""
34
+
35
+ class BaseReporter:
36
+ """base class for reporters"""
37
+
38
+ extension = ''
39
+
40
+ def __init__(self, output=None):
41
+ self.linter = None
42
+ self.include_ids = None
43
+ self.section = 0
44
+ self.out = None
45
+ self.set_output(output)
46
+
47
+ def set_output(self, output=None):
48
+ """set output stream"""
49
+ if output is None:
50
+ output = sys.stdout
51
+ self.out = output
52
+
53
+ def writeln(self, string=''):
54
+ """write a line in the output buffer"""
55
+ print >> self.out, string
56
+
57
+ def display_results(self, layout):
58
+ """display results encapsulated in the layout tree"""
59
+ self.section = 0
60
+ if self.include_ids and hasattr(layout, 'report_id'):
61
+ layout.children[0].children[0].data += ' (%s)' % layout.report_id
62
+ self._display(layout)
63
+
64
+ def _display(self, layout):
65
+ """display the layout"""
66
+ raise NotImplementedError()
67
+
@@ -0,0 +1,36 @@
1
+ """ reporter used by gui.py """
2
+
3
+ import sys
4
+
5
+ from pylint.interfaces import IReporter
6
+ from pylint.reporters import BaseReporter
7
+ from logilab.common.ureports import TextWriter
8
+
9
+
10
+ class GUIReporter(BaseReporter):
11
+ """saves messages"""
12
+
13
+ __implements__ = IReporter
14
+ extension = ''
15
+
16
+ def __init__(self, gui, output=sys.stdout):
17
+ """init"""
18
+ BaseReporter.__init__(self, output)
19
+ self.msgs = []
20
+ self.gui = gui
21
+
22
+ def add_message(self, msg_id, location, msg):
23
+ """manage message of different type and in the context of path"""
24
+ module, obj, line = location[1:]
25
+ if self.include_ids:
26
+ sigle = msg_id
27
+ else:
28
+ sigle = msg_id[0]
29
+
30
+ full_msg = [sigle, module, obj, str(line), msg]
31
+ self.msgs += [[sigle, module, obj, str(line)]]
32
+ self.gui.msg_queue.put(full_msg)
33
+
34
+ def _display(self, layout):
35
+ """launch layouts display"""
36
+ TextWriter().format(layout, self.out)
@@ -0,0 +1,69 @@
1
+ # Copyright (c) 2003-2006 Sylvain Thenault (thenault@gmail.com).
2
+ # Copyright (c) 2003-2006 LOGILAB S.A. (Paris, FRANCE).
3
+ # This program is free software; you can redistribute it and/or modify it under
4
+ # the terms of the GNU General Public License as published by the Free Software
5
+ # Foundation; either version 2 of the License, or (at your option) any later
6
+ # version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful, but WITHOUT
9
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
10
+ # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
11
+ #
12
+ # You should have received a copy of the GNU General Public License along with
13
+ # this program; if not, write to the Free Software Foundation, Inc.,
14
+ # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
15
+ """HTML reporter"""
16
+
17
+ import sys
18
+ from cgi import escape
19
+
20
+ from logilab.common.ureports import HTMLWriter, Section, Table
21
+
22
+ from pylint.interfaces import IReporter
23
+ from pylint.reporters import BaseReporter
24
+
25
+
26
+ class HTMLReporter(BaseReporter):
27
+ """report messages and layouts in HTML"""
28
+
29
+ __implements__ = IReporter
30
+ extension = 'html'
31
+
32
+ def __init__(self, output=sys.stdout):
33
+ BaseReporter.__init__(self, output)
34
+ self.msgs = []
35
+
36
+ def add_message(self, msg_id, location, msg):
37
+ """manage message of different type and in the context of path"""
38
+ module, obj, line = location[1:]
39
+ if self.include_ids:
40
+ sigle = msg_id
41
+ else:
42
+ sigle = msg_id[0]
43
+ self.msgs += [sigle, module, obj, str(line), escape(msg)]
44
+
45
+ def set_output(self, output=None):
46
+ """set output stream
47
+
48
+ messages buffered for old output is processed first"""
49
+ if self.out and self.msgs:
50
+ self._display(Section())
51
+ BaseReporter.set_output(self, output)
52
+
53
+ def _display(self, layout):
54
+ """launch layouts display
55
+
56
+ overridden from BaseReporter to add insert the messages section
57
+ (in add_message, message is not displayed, just collected so it
58
+ can be displayed in an html table)
59
+ """
60
+ if self.msgs:
61
+ # add stored messages to the layout
62
+ msgs = ['type', 'module', 'object', 'line', 'message']
63
+ msgs += self.msgs
64
+ sect = Section('Messages')
65
+ layout.append(sect)
66
+ sect.append(Table(cols=5, children=msgs, rheaders=1))
67
+ self.msgs = []
68
+ HTMLWriter().format(layout, self.out)
69
+
@@ -0,0 +1,156 @@
1
+ # Copyright (c) 2003-2007 Sylvain Thenault (thenault@gmail.com).
2
+ # Copyright (c) 2003-2007 LOGILAB S.A. (Paris, FRANCE).
3
+ # This program is free software; you can redistribute it and/or modify it under
4
+ # the terms of the GNU General Public License as published by the Free Software
5
+ # Foundation; either version 2 of the License, or (at your option) any later
6
+ # version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful, but WITHOUT
9
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
10
+ # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
11
+ #
12
+ # You should have received a copy of the GNU General Public License along with
13
+ # this program; if not, write to the Free Software Foundation, Inc.,
14
+ # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
15
+ """Plain text reporters:
16
+
17
+ :text: the default one grouping messages by module
18
+ :parseable:
19
+ standard parseable output with full module path on each message (for
20
+ editor integration)
21
+ :colorized: an ANSI colorized text reporter
22
+
23
+ """
24
+
25
+ import os
26
+ import sys
27
+
28
+ from logilab.common.ureports import TextWriter
29
+ from logilab.common.textutils import colorize_ansi
30
+
31
+ from pylint.interfaces import IReporter
32
+ from pylint.reporters import BaseReporter
33
+
34
+ TITLE_UNDERLINES = ['', '=', '-', '.']
35
+
36
+
37
+ class TextReporter(BaseReporter):
38
+ """reports messages and layouts in plain text
39
+ """
40
+
41
+ __implements__ = IReporter
42
+ extension = 'txt'
43
+
44
+ def __init__(self, output=sys.stdout):
45
+ BaseReporter.__init__(self, output)
46
+ self._modules = {}
47
+
48
+ def add_message(self, msg_id, location, msg):
49
+ """manage message of different type and in the context of path"""
50
+ module, obj, line = location[1:]
51
+ if not self._modules.has_key(module):
52
+ if module:
53
+ self.writeln('************* Module %s' % module)
54
+ self._modules[module] = 1
55
+ else:
56
+ self.writeln('************* %s' % module)
57
+ if obj:
58
+ obj = ':%s' % obj
59
+ if self.include_ids:
60
+ sigle = msg_id
61
+ else:
62
+ sigle = msg_id[0]
63
+ self.writeln('%s:%3s%s: %s' % (sigle, line, obj, msg))
64
+
65
+ def _display(self, layout):
66
+ """launch layouts display"""
67
+ print >> self.out
68
+ TextWriter().format(layout, self.out)
69
+
70
+
71
+ class ParseableTextReporter(TextReporter):
72
+ """a reporter very similar to TextReporter, but display messages in a form
73
+ recognized by most text editors :
74
+
75
+ <filename>:<linenum>:<msg>
76
+ """
77
+ line_format = '%(path)s:%(line)s: [%(sigle)s%(obj)s] %(msg)s'
78
+
79
+ def __init__(self, output=sys.stdout, relative=True):
80
+ TextReporter.__init__(self, output)
81
+ if relative:
82
+ self._prefix = os.getcwd() + os.sep
83
+ else:
84
+ self._prefix = ''
85
+
86
+ def add_message(self, msg_id, location, msg):
87
+ """manage message of different type and in the context of path"""
88
+ path, _, obj, line = location
89
+ if obj:
90
+ obj = ', %s' % obj
91
+ if self.include_ids:
92
+ sigle = msg_id
93
+ else:
94
+ sigle = msg_id[0]
95
+ if self._prefix:
96
+ path = path.replace(self._prefix, '')
97
+ self.writeln(self.line_format % locals())
98
+
99
+ class VSTextReporter(ParseableTextReporter):
100
+ """Visual studio text reporter"""
101
+ line_format = '%(path)s(%(line)s): [%(sigle)s%(obj)s] %(msg)s'
102
+
103
+ class ColorizedTextReporter(TextReporter):
104
+ """Simple TextReporter that colorizes text output"""
105
+
106
+ COLOR_MAPPING = {
107
+ "I" : ("green", None),
108
+ 'C' : (None, "bold"),
109
+ 'R' : ("magenta", "bold, italic"),
110
+ 'W' : ("blue", None),
111
+ 'E' : ("red", "bold"),
112
+ 'F' : ("red", "bold, underline"),
113
+ 'S' : ("yellow", "inverse"), # S stands for module Separator
114
+ }
115
+
116
+ def __init__(self, output=sys.stdout, color_mapping = None):
117
+ TextReporter.__init__(self, output)
118
+ self.color_mapping = color_mapping or \
119
+ dict(ColorizedTextReporter.COLOR_MAPPING)
120
+
121
+
122
+ def _get_decoration(self, msg_id):
123
+ """Returns the tuple color, style associated with msg_id as defined
124
+ in self.color_mapping
125
+ """
126
+ try:
127
+ return self.color_mapping[msg_id[0]]
128
+ except KeyError:
129
+ return None, None
130
+
131
+ def add_message(self, msg_id, location, msg):
132
+ """manage message of different types, and colorize output
133
+ using ansi escape codes
134
+ """
135
+ module, obj, line = location[1:]
136
+ if not self._modules.has_key(module):
137
+ color, style = self._get_decoration('S')
138
+ if module:
139
+ modsep = colorize_ansi('************* Module %s' % module,
140
+ color, style)
141
+ else:
142
+ modsep = colorize_ansi('************* %s' % module,
143
+ color, style)
144
+ self.writeln(modsep)
145
+ self._modules[module] = 1
146
+ if obj:
147
+ obj = ':%s' % obj
148
+ if self.include_ids:
149
+ sigle = msg_id
150
+ else:
151
+ sigle = msg_id[0]
152
+ color, style = self._get_decoration(sigle)
153
+ msg = colorize_ansi(msg, color, style)
154
+ sigle = colorize_ansi(sigle, color, style)
155
+ self.writeln('%s:%3s%s: %s' % (sigle, line, obj, msg))
156
+