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,5 @@
1
+ """
2
+ pyreverse.extensions
3
+ """
4
+
5
+ __revision__ = "$Id $"
@@ -0,0 +1,229 @@
1
+ # Copyright (c) 2000-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
+ """handle diagram generation options for class diagram or default diagrams
17
+ """
18
+
19
+ from logilab import astng
20
+ from logilab.astng.utils import LocalsVisitor
21
+
22
+ from pylint.pyreverse.diagrams import PackageDiagram, ClassDiagram
23
+
24
+ # diagram generators ##########################################################
25
+
26
+ class DiaDefGenerator:
27
+ """handle diagram generation options
28
+ """
29
+ def __init__(self, linker, handler):
30
+ """common Diagram Handler initialization"""
31
+ self.config = handler.config
32
+ self._set_default_options()
33
+ self.linker = linker
34
+ self.classdiagram = None # defined by subclasses
35
+
36
+ def get_title(self, node):
37
+ """get title for objects"""
38
+ title = node.name
39
+ if self.module_names:
40
+ title = '%s.%s' % (node.root().name, title)
41
+ return title
42
+
43
+ def _set_option(self, option):
44
+ """activate some options if not explicitly deactivated"""
45
+ # if we have a class diagram, we want more information by default;
46
+ # so if the option is None, we return True
47
+ if option is None:
48
+ if self.config.classes:
49
+ return True
50
+ else:
51
+ return False
52
+ return option
53
+
54
+ def _set_default_options(self):
55
+ """set different default options with _default dictionary"""
56
+ self.module_names = self._set_option(self.config.module_names)
57
+ all_ancestors = self._set_option(self.config.all_ancestors)
58
+ all_associated = self._set_option(self.config.all_associated)
59
+ anc_level, ass_level = (0, 0)
60
+ if all_ancestors:
61
+ anc_level = -1
62
+ if all_associated:
63
+ ass_level = -1
64
+ if self.config.show_ancestors is not None:
65
+ anc_level = self.config.show_ancestors
66
+ if self.config.show_associated is not None:
67
+ ass_level = self.config.show_associated
68
+ self.anc_level, self.ass_level = anc_level, ass_level
69
+
70
+ def _get_levels(self):
71
+ """help function for search levels"""
72
+ return self.anc_level, self.ass_level
73
+
74
+ def show_node(self, node):
75
+ """true if builtins and not show_builtins"""
76
+ if self.config.show_builtin:
77
+ return True
78
+ return node.root().name != '__builtin__'
79
+
80
+ def add_class(self, node):
81
+ """visit one class and add it to diagram"""
82
+ self.linker.visit(node)
83
+ self.classdiagram.add_object(self.get_title(node), node)
84
+
85
+ def get_ancestors(self, node, level):
86
+ """return ancestor nodes of a class node"""
87
+ if level == 0:
88
+ return
89
+ for ancestor in node.ancestors(recurs=False):
90
+ if not self.show_node(ancestor):
91
+ continue
92
+ yield ancestor
93
+
94
+ def get_associated(self, klass_node, level):
95
+ """return associated nodes of a class node"""
96
+ if level == 0:
97
+ return
98
+ for ass_nodes in klass_node.instance_attrs_type.values() + \
99
+ klass_node.locals_type.values():
100
+ for ass_node in ass_nodes:
101
+ if isinstance(ass_node, astng.Instance):
102
+ ass_node = ass_node._proxied
103
+ if not (isinstance(ass_node, astng.Class)
104
+ and self.show_node(ass_node)):
105
+ continue
106
+ yield ass_node
107
+
108
+ def extract_classes(self, klass_node, anc_level, ass_level):
109
+ """extract recursively classes related to klass_node"""
110
+ if self.classdiagram.has_node(klass_node) or not self.show_node(klass_node):
111
+ return
112
+ self.add_class(klass_node)
113
+
114
+ for ancestor in self.get_ancestors(klass_node, anc_level):
115
+ self.extract_classes(ancestor, anc_level-1, ass_level)
116
+
117
+ for ass_node in self.get_associated(klass_node, ass_level):
118
+ self.extract_classes(ass_node, anc_level, ass_level-1)
119
+
120
+
121
+ class DefaultDiadefGenerator(LocalsVisitor, DiaDefGenerator):
122
+ """generate minimum diagram definition for the project :
123
+
124
+ * a package diagram including project's modules
125
+ * a class diagram including project's classes
126
+ """
127
+
128
+ def __init__(self, linker, handler):
129
+ DiaDefGenerator.__init__(self, linker, handler)
130
+ LocalsVisitor.__init__(self)
131
+
132
+ def visit_project(self, node):
133
+ """visit an astng.Project node
134
+
135
+ create a diagram definition for packages
136
+ """
137
+ mode = self.config.mode
138
+ if len(node.modules) > 1:
139
+ self.pkgdiagram = PackageDiagram('packages %s' % node.name, mode)
140
+ else:
141
+ self.pkgdiagram = None
142
+ self.classdiagram = ClassDiagram('classes %s' % node.name, mode)
143
+
144
+ def leave_project(self, node):
145
+ """leave the astng.Project node
146
+
147
+ return the generated diagram definition
148
+ """
149
+ if self.pkgdiagram:
150
+ return self.pkgdiagram, self.classdiagram
151
+ return self.classdiagram,
152
+
153
+ def visit_module(self, node):
154
+ """visit an astng.Module node
155
+
156
+ add this class to the package diagram definition
157
+ """
158
+ if self.pkgdiagram:
159
+ self.linker.visit(node)
160
+ self.pkgdiagram.add_object(node.name, node)
161
+
162
+ def visit_class(self, node):
163
+ """visit an astng.Class node
164
+
165
+ add this class to the class diagram definition
166
+ """
167
+ anc_level, ass_level = self._get_levels()
168
+ self.extract_classes(node, anc_level, ass_level)
169
+
170
+ def visit_from(self, node):
171
+ """visit astng.From and catch modules for package diagram
172
+ """
173
+ if self.pkgdiagram:
174
+ self.pkgdiagram.add_from_depend(node, node.modname)
175
+
176
+
177
+ class ClassDiadefGenerator(DiaDefGenerator):
178
+ """generate a class diagram definition including all classes related to a
179
+ given class
180
+ """
181
+
182
+ def __init__(self, linker, handler):
183
+ DiaDefGenerator.__init__(self, linker, handler)
184
+
185
+ def class_diagram(self, project, klass):
186
+ """return a class diagram definition for the given klass and its
187
+ related klasses
188
+ """
189
+
190
+ self.classdiagram = ClassDiagram(klass, self.config.mode)
191
+ if len(project.modules) > 1:
192
+ module, klass = klass.rsplit('.', 1)
193
+ module = project.get_module(module)
194
+ else:
195
+ module = project.modules[0]
196
+ klass = klass.split('.')[-1]
197
+ klass = module.ilookup(klass).next()
198
+
199
+ anc_level, ass_level = self._get_levels()
200
+ self.extract_classes(klass, anc_level, ass_level)
201
+ return self.classdiagram
202
+
203
+ # diagram handler #############################################################
204
+
205
+ class DiadefsHandler:
206
+ """handle diagram definitions :
207
+
208
+ get it from user (i.e. xml files) or generate them
209
+ """
210
+
211
+ def __init__(self, config):
212
+ self.config = config
213
+
214
+ def get_diadefs(self, project, linker):
215
+ """get the diagrams configuration data
216
+ :param linker: astng.inspector.Linker(IdGeneratorMixIn, LocalsVisitor)
217
+ :param project: astng.manager.Project
218
+ """
219
+
220
+ # read and interpret diagram definitions (Diadefs)
221
+ diagrams = []
222
+ generator = ClassDiadefGenerator(linker, self)
223
+ for klass in self.config.classes:
224
+ diagrams.append(generator.class_diagram(project, klass))
225
+ if not diagrams:
226
+ diagrams = DefaultDiadefGenerator(linker, self).visit(project)
227
+ for diagram in diagrams:
228
+ diagram.extract_relationships()
229
+ return diagrams
@@ -0,0 +1,247 @@
1
+ # Copyright (c) 2004-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
+ """diagram objects
17
+ """
18
+
19
+ from logilab import astng
20
+ from pylint.pyreverse.utils import is_interface, FilterMixIn
21
+
22
+ def set_counter(value):
23
+ """Figure counter (re)set"""
24
+ Figure._UID_COUNT = value
25
+
26
+ class Figure:
27
+ """base class for counter handling"""
28
+ _UID_COUNT = 0
29
+ def __init__(self):
30
+ Figure._UID_COUNT += 1
31
+ self.fig_id = Figure._UID_COUNT
32
+
33
+ class Relationship(Figure):
34
+ """a relation ship from an object in the diagram to another
35
+ """
36
+ def __init__(self, from_object, to_object, relation_type, name=None):
37
+ Figure.__init__(self)
38
+ self.from_object = from_object
39
+ self.to_object = to_object
40
+ self.type = relation_type
41
+ self.name = name
42
+
43
+
44
+ class DiagramEntity(Figure):
45
+ """a diagram object, i.e. a label associated to an astng node
46
+ """
47
+ def __init__(self, title='No name', node=None):
48
+ Figure.__init__(self)
49
+ self.title = title
50
+ self.node = node
51
+
52
+ class ClassDiagram(Figure, FilterMixIn):
53
+ """main class diagram handling
54
+ """
55
+ TYPE = 'class'
56
+ def __init__(self, title, mode):
57
+ FilterMixIn.__init__(self, mode)
58
+ Figure.__init__(self)
59
+ self.title = title
60
+ self.objects = []
61
+ self.relationships = {}
62
+ self._nodes = {}
63
+ self.depends = []
64
+
65
+ def add_relationship(self, from_object, to_object,
66
+ relation_type, name=None):
67
+ """create a relation ship
68
+ """
69
+ rel = Relationship(from_object, to_object, relation_type, name)
70
+ self.relationships.setdefault(relation_type, []).append(rel)
71
+
72
+ def get_relationship(self, from_object, relation_type):
73
+ """return a relation ship or None
74
+ """
75
+ for rel in self.relationships.get(relation_type, ()):
76
+ if rel.from_object is from_object:
77
+ return rel
78
+ raise KeyError(relation_type)
79
+
80
+ def get_attrs(self, node):
81
+ """return visible attributes, possibly with class name"""
82
+ attrs = []
83
+ for node_name, ass_nodes in node.instance_attrs_type.items() + \
84
+ node.locals_type.items():
85
+ if not self.show_attr(node_name):
86
+ continue
87
+ names = self.class_names(ass_nodes)
88
+ if names:
89
+ node_name = "%s : %s" % (node_name, ", ".join(names))
90
+ attrs.append(node_name)
91
+ return attrs
92
+
93
+ def get_methods(self, node):
94
+ """return visible methods"""
95
+ return [m for m in node.values()
96
+ if isinstance(m, astng.Function) and self.show_attr(m.name)]
97
+
98
+ def add_object(self, title, node):
99
+ """create a diagram object
100
+ """
101
+ assert not self._nodes.has_key(node)
102
+ ent = DiagramEntity(title, node)
103
+ self._nodes[node] = ent
104
+ self.objects.append(ent)
105
+
106
+ def class_names(self, nodes):
107
+ """return class names if needed in diagram"""
108
+ names = []
109
+ for ass_node in nodes:
110
+ if isinstance(ass_node, astng.Instance):
111
+ ass_node = ass_node._proxied
112
+ if isinstance(ass_node, astng.Class) \
113
+ and hasattr(ass_node, "name") and not self.has_node(ass_node):
114
+ if ass_node.name not in names:
115
+ ass_name = ass_node.name
116
+ names.append(ass_name)
117
+ return names
118
+
119
+ def nodes(self):
120
+ """return the list of underlying nodes
121
+ """
122
+ return self._nodes.keys()
123
+
124
+ def has_node(self, node):
125
+ """return true if the given node is included in the diagram
126
+ """
127
+ return self._nodes.has_key(node)
128
+
129
+ def object_from_node(self, node):
130
+ """return the diagram object mapped to node
131
+ """
132
+ return self._nodes[node]
133
+
134
+ def classes(self):
135
+ """return all class nodes in the diagram"""
136
+ return [o for o in self.objects if isinstance(o.node, astng.Class)]
137
+
138
+ def classe(self, name):
139
+ """return a class by its name, raise KeyError if not found
140
+ """
141
+ for klass in self.classes():
142
+ if klass.node.name == name:
143
+ return klass
144
+ raise KeyError(name)
145
+
146
+ def extract_relationships(self):
147
+ """extract relation ships between nodes in the diagram
148
+ """
149
+ for obj in self.classes():
150
+ node = obj.node
151
+ obj.attrs = self.get_attrs(node)
152
+ obj.methods = self.get_methods(node)
153
+ # shape
154
+ if is_interface(node):
155
+ obj.shape = 'interface'
156
+ else:
157
+ obj.shape = 'class'
158
+ # inheritance link
159
+ for par_node in node.ancestors(recurs=False):
160
+ try:
161
+ par_obj = self.object_from_node(par_node)
162
+ self.add_relationship(obj, par_obj, 'specialization')
163
+ except KeyError:
164
+ continue
165
+ # implements link
166
+ for impl_node in node.implements:
167
+ try:
168
+ impl_obj = self.object_from_node(impl_node)
169
+ self.add_relationship(obj, impl_obj, 'implements')
170
+ except KeyError:
171
+ continue
172
+ # associations link
173
+ for name, values in node.instance_attrs_type.items() + \
174
+ node.locals_type.items():
175
+ for value in values:
176
+ if value is astng.YES:
177
+ continue
178
+ if isinstance( value, astng.Instance):
179
+ value = value._proxied
180
+ try:
181
+ ass_obj = self.object_from_node(value)
182
+ self.add_relationship(ass_obj, obj, 'association', name)
183
+ except KeyError:
184
+ continue
185
+
186
+
187
+ class PackageDiagram(ClassDiagram):
188
+ """package diagram handling
189
+ """
190
+ TYPE = 'package'
191
+
192
+ def modules(self):
193
+ """return all module nodes in the diagram"""
194
+ return [o for o in self.objects if isinstance(o.node, astng.Module)]
195
+
196
+ def module(self, name):
197
+ """return a module by its name, raise KeyError if not found
198
+ """
199
+ for mod in self.modules():
200
+ if mod.node.name == name:
201
+ return mod
202
+ raise KeyError(name)
203
+
204
+ def get_module(self, name, node):
205
+ """return a module by its name, looking also for relative imports;
206
+ raise KeyError if not found
207
+ """
208
+ for mod in self.modules():
209
+ mod_name = mod.node.name
210
+ if mod_name == name:
211
+ return mod
212
+ #search for fullname of relative import modules
213
+ package = node.root().name
214
+ if mod_name == "%s.%s" % (package, name):
215
+ return mod
216
+ if mod_name == "%s.%s" % (package.rsplit('.', 1)[0], name):
217
+ return mod
218
+ raise KeyError(name)
219
+
220
+ def add_from_depend(self, node, from_module):
221
+ """add dependencies created by from-imports
222
+ """
223
+ mod_name = node.root().name
224
+ obj = self.module( mod_name )
225
+ if from_module not in obj.node.depends:
226
+ obj.node.depends.append(from_module)
227
+
228
+ def extract_relationships(self):
229
+ """extract relation ships between nodes in the diagram
230
+ """
231
+ ClassDiagram.extract_relationships(self)
232
+ for obj in self.classes():
233
+ # ownership
234
+ try:
235
+ mod = self.object_from_node(obj.node.root())
236
+ self.add_relationship(obj, mod, 'ownership')
237
+ except KeyError:
238
+ continue
239
+ for obj in self.modules():
240
+ obj.shape = 'package'
241
+ # dependencies
242
+ for dep_name in obj.node.depends:
243
+ try:
244
+ dep = self.get_module(dep_name, obj.node)
245
+ except KeyError:
246
+ continue
247
+ self.add_relationship(obj, dep, 'depends')
@@ -0,0 +1,123 @@
1
+ # # Copyright (c) 2000-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
+ %prog [options] <packages>
18
+
19
+ create UML diagrams for classes and modules in <packages>
20
+ """
21
+
22
+ import sys
23
+ from logilab.common.configuration import ConfigurationMixIn
24
+ from logilab.astng.manager import astng_wrapper, ASTNGManager
25
+ from logilab.astng.inspector import Linker
26
+
27
+ from pylint.pyreverse.diadefslib import DiadefsHandler
28
+ from pylint.pyreverse import writer
29
+ from pylint.pyreverse.utils import insert_default_options
30
+
31
+ OPTIONS = (
32
+ ("filter-mode",
33
+ dict(short='f', default='PUB_ONLY', dest='mode', type='string',
34
+ action='store', metavar='<mode>',
35
+ help="""filter attributes and functions according to
36
+ <mode>. Correct modes are :
37
+ 'PUB_ONLY' filter all non public attributes
38
+ [DEFAULT], equivalent to PRIVATE+SPECIAL_A
39
+ 'ALL' no filter
40
+ 'SPECIAL' filter Python special functions
41
+ except constructor
42
+ 'OTHER' filter protected and private
43
+ attributes""")),
44
+
45
+ ("class",
46
+ dict(short='c', action="append", metavar="<class>", dest="classes", default=[],
47
+ help="create a class diagram with all classes related to <class>;\
48
+ this uses by default the options -ASmy")),
49
+
50
+ ("show-ancestors",
51
+ dict(short="a", action="store", metavar='<ancestor>', type='int',
52
+ help='show <ancestor> generations of ancestor classes not in <projects>')),
53
+ ("all-ancestors",
54
+ dict(short="A", default=None,
55
+ help="show all ancestors off all classes in <projects>") ),
56
+ ("show-associated",
57
+ dict(short='s', action="store", metavar='<ass_level>', type='int',
58
+ help='show <ass_level> levels of associated classes not in <projects>')),
59
+ ("all-associated",
60
+ dict(short='S', default=None,
61
+ help='show recursively all associated off all associated classes')),
62
+
63
+ ("show-builtin",
64
+ dict(short="b", action="store_true", default=False,
65
+ help='include builtin objects in representation of classes')),
66
+
67
+ ("module-names",
68
+ dict(short="m", default=None, type='yn', metavar='[yn]',
69
+ help='include module name in representation of classes')),
70
+ # TODO : generate dependencies like in pylint
71
+ #("package-dependencies",
72
+ #dict(short="M", action="store", metavar='<package_depth>', type='int',
73
+ #help='show <package_depth> module dependencies beyond modules in \
74
+ #<projects> (for the package diagram)')),
75
+ ("only-classnames",
76
+ dict(short='k', action="store_true", default=False,
77
+ help="don't show attributes and methods in the class boxes; \
78
+ this disables -f values")),
79
+ ("output", dict(short="o", dest="output_format", action="store",
80
+ default="dot", metavar="<format>",
81
+ help="create a *.<format> output file if format available.")),
82
+ )
83
+ # FIXME : quiet mode
84
+ #( ('quiet',
85
+ #dict(help='run quietly', action='store_true', short='q')), )
86
+
87
+
88
+ class PyreverseCommand(ConfigurationMixIn):
89
+ """base class providing common behaviour for pyreverse commands"""
90
+
91
+ options = OPTIONS
92
+
93
+ def __init__(self, args):
94
+ ConfigurationMixIn.__init__(self, usage=__doc__)
95
+ insert_default_options()
96
+ self.manager = ASTNGManager()
97
+ self.register_options_provider(self.manager)
98
+ args = self.load_command_line_configuration()
99
+ self.run(args)
100
+
101
+ def run(self, args):
102
+ """checking arguments and run project"""
103
+ if not args:
104
+ print self.help()
105
+ return
106
+ project = self.manager.project_from_files(args, astng_wrapper)
107
+ linker = Linker(project, tag=True)
108
+ handler = DiadefsHandler(self.config)
109
+ diadefs = handler.get_diadefs(project, linker)
110
+ if self.config.output_format == "vcg":
111
+ writer.VCGWriter(self.config).write(diadefs)
112
+ else:
113
+ writer.DotWriter(self.config).write(diadefs)
114
+
115
+
116
+ class Run:
117
+ """pyreverse main class"""
118
+ def __init__(self, args):
119
+ """run pyreverse"""
120
+ PyreverseCommand(args)
121
+
122
+ if __name__ == '__main__':
123
+ Run(sys.argv[1:])