bee_python 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (488) hide show
  1. data/{build/README → README} +1 -1
  2. data/egg/egg/build.yml +11 -49
  3. data/egg/egg.yml +19 -27
  4. data/egg/http/build.erb +32 -36
  5. data/egg/http/libhttp.py +102 -0
  6. data/egg/http/pylint.cfg +236 -0
  7. data/egg/http/server.py +7 -0
  8. data/egg/http/test.erb +32 -0
  9. data/egg/http.yml +33 -29
  10. data/egg/mysql/mysql.py +8 -9
  11. data/egg/project/build.erb +21 -53
  12. data/egg/project/pylint.cfg +236 -0
  13. data/egg/project/test.py +2 -2
  14. data/egg/project.yml +23 -31
  15. data/egg/script/build.erb +18 -23
  16. data/egg/script/pylint.cfg +236 -0
  17. data/egg/script.yml +22 -18
  18. data/egg/source/source.py +6 -6
  19. data/egg/test/test.py +1 -1
  20. data/lib/bee_task_python.rb +3 -34
  21. data/python.yml +123 -0
  22. metadata +61 -503
  23. data/test/build.yml +0 -16
  24. data/test/tc_bee_task_python.rb +0 -27
  25. data/test/test_build.rb +0 -26
  26. data/test/test_build_listener.rb +0 -110
  27. data/test/ts_bee_python.rb +0 -26
  28. data/tools/common/__init__.py +0 -5
  29. data/tools/common/common/__init__.py +0 -140
  30. data/tools/common/common/__pkginfo__.py +0 -43
  31. data/tools/common/common/adbh.py +0 -35
  32. data/tools/common/common/cache.py +0 -114
  33. data/tools/common/common/changelog.py +0 -234
  34. data/tools/common/common/clcommands.py +0 -181
  35. data/tools/common/common/cli.py +0 -212
  36. data/tools/common/common/compat.py +0 -328
  37. data/tools/common/common/configuration.py +0 -1087
  38. data/tools/common/common/contexts.py +0 -58
  39. data/tools/common/common/corbautils.py +0 -117
  40. data/tools/common/common/daemon.py +0 -171
  41. data/tools/common/common/date.py +0 -279
  42. data/tools/common/common/db.py +0 -49
  43. data/tools/common/common/dbf.py +0 -229
  44. data/tools/common/common/debugger.py +0 -208
  45. data/tools/common/common/decorators.py +0 -190
  46. data/tools/common/common/deprecation.py +0 -118
  47. data/tools/common/common/fileutils.py +0 -409
  48. data/tools/common/common/graph.py +0 -259
  49. data/tools/common/common/html.py +0 -142
  50. data/tools/common/common/interface.py +0 -76
  51. data/tools/common/common/logging_ext.py +0 -166
  52. data/tools/common/common/modutils.py +0 -670
  53. data/tools/common/common/optik_ext.py +0 -383
  54. data/tools/common/common/optparser.py +0 -92
  55. data/tools/common/common/pdf_ext.py +0 -111
  56. data/tools/common/common/proc.py +0 -276
  57. data/tools/common/common/pyro_ext.py +0 -146
  58. data/tools/common/common/pytest.py +0 -754
  59. data/tools/common/common/shellutils.py +0 -383
  60. data/tools/common/common/sphinx_ext.py +0 -87
  61. data/tools/common/common/sphinxutils.py +0 -122
  62. data/tools/common/common/sqlgen.py +0 -31
  63. data/tools/common/common/table.py +0 -930
  64. data/tools/common/common/tasksqueue.py +0 -97
  65. data/tools/common/common/test/__init__.py +0 -1
  66. data/tools/common/common/test/data/ChangeLog +0 -184
  67. data/tools/common/common/test/data/MyPyPa-0.1.0-py2.5.egg +0 -0
  68. data/tools/common/common/test/data/__init__.py +0 -1
  69. data/tools/common/common/test/data/content_differ_dir/NOTHING +0 -0
  70. data/tools/common/common/test/data/content_differ_dir/README +0 -1
  71. data/tools/common/common/test/data/content_differ_dir/subdir/coin +0 -1
  72. data/tools/common/common/test/data/content_differ_dir/subdir/toto.txt +0 -53
  73. data/tools/common/common/test/data/file_differ_dir/NOTHING +0 -0
  74. data/tools/common/common/test/data/file_differ_dir/README +0 -1
  75. data/tools/common/common/test/data/file_differ_dir/subdir/toto.txt +0 -53
  76. data/tools/common/common/test/data/file_differ_dir/subdirtwo/Hello +0 -0
  77. data/tools/common/common/test/data/find_test/__init__.py +0 -0
  78. data/tools/common/common/test/data/find_test/foo.txt +0 -0
  79. data/tools/common/common/test/data/find_test/module.py +0 -0
  80. data/tools/common/common/test/data/find_test/module2.py +0 -0
  81. data/tools/common/common/test/data/find_test/newlines.txt +0 -0
  82. data/tools/common/common/test/data/find_test/noendingnewline.py +0 -0
  83. data/tools/common/common/test/data/find_test/nonregr.py +0 -0
  84. data/tools/common/common/test/data/find_test/normal_file.txt +0 -0
  85. data/tools/common/common/test/data/find_test/spam.txt +0 -0
  86. data/tools/common/common/test/data/find_test/sub/doc.txt +0 -0
  87. data/tools/common/common/test/data/find_test/sub/momo.py +0 -0
  88. data/tools/common/common/test/data/find_test/test.ini +0 -0
  89. data/tools/common/common/test/data/find_test/test1.msg +0 -0
  90. data/tools/common/common/test/data/find_test/test2.msg +0 -0
  91. data/tools/common/common/test/data/find_test/write_protected_file.txt +0 -0
  92. data/tools/common/common/test/data/foo.txt +0 -9
  93. data/tools/common/common/test/data/module.py +0 -88
  94. data/tools/common/common/test/data/module2.py +0 -77
  95. data/tools/common/common/test/data/newlines.txt +0 -3
  96. data/tools/common/common/test/data/noendingnewline.py +0 -36
  97. data/tools/common/common/test/data/nonregr.py +0 -14
  98. data/tools/common/common/test/data/normal_file.txt +0 -0
  99. data/tools/common/common/test/data/reference_dir/NOTHING +0 -0
  100. data/tools/common/common/test/data/reference_dir/README +0 -1
  101. data/tools/common/common/test/data/reference_dir/subdir/coin +0 -1
  102. data/tools/common/common/test/data/reference_dir/subdir/toto.txt +0 -53
  103. data/tools/common/common/test/data/same_dir/NOTHING +0 -0
  104. data/tools/common/common/test/data/same_dir/README +0 -1
  105. data/tools/common/common/test/data/same_dir/subdir/coin +0 -1
  106. data/tools/common/common/test/data/same_dir/subdir/toto.txt +0 -53
  107. data/tools/common/common/test/data/spam.txt +0 -9
  108. data/tools/common/common/test/data/sub/doc.txt +0 -1
  109. data/tools/common/common/test/data/sub/momo.py +0 -1
  110. data/tools/common/common/test/data/subdir_differ_dir/NOTHING +0 -0
  111. data/tools/common/common/test/data/subdir_differ_dir/README +0 -1
  112. data/tools/common/common/test/data/subdir_differ_dir/subdir/coin +0 -1
  113. data/tools/common/common/test/data/subdir_differ_dir/subdir/toto.txt +0 -53
  114. data/tools/common/common/test/data/test.ini +0 -20
  115. data/tools/common/common/test/data/test1.msg +0 -30
  116. data/tools/common/common/test/data/test2.msg +0 -42
  117. data/tools/common/common/test/data/write_protected_file.txt +0 -0
  118. data/tools/common/common/test/foomod.py +0 -17
  119. data/tools/common/common/test/unittest_cache.py +0 -129
  120. data/tools/common/common/test/unittest_changelog.py +0 -37
  121. data/tools/common/common/test/unittest_compat.py +0 -239
  122. data/tools/common/common/test/unittest_configuration.py +0 -348
  123. data/tools/common/common/test/unittest_date.py +0 -154
  124. data/tools/common/common/test/unittest_decorators.py +0 -62
  125. data/tools/common/common/test/unittest_deprecation.py +0 -76
  126. data/tools/common/common/test/unittest_fileutils.py +0 -133
  127. data/tools/common/common/test/unittest_graph.py +0 -50
  128. data/tools/common/common/test/unittest_html.py +0 -76
  129. data/tools/common/common/test/unittest_interface.py +0 -87
  130. data/tools/common/common/test/unittest_modutils.py +0 -244
  131. data/tools/common/common/test/unittest_pytest.py +0 -50
  132. data/tools/common/common/test/unittest_shellutils.py +0 -248
  133. data/tools/common/common/test/unittest_table.py +0 -448
  134. data/tools/common/common/test/unittest_taskqueue.py +0 -71
  135. data/tools/common/common/test/unittest_testlib.py +0 -956
  136. data/tools/common/common/test/unittest_textutils.py +0 -247
  137. data/tools/common/common/test/unittest_tree.py +0 -248
  138. data/tools/common/common/test/unittest_umessage.py +0 -55
  139. data/tools/common/common/test/unittest_ureports_html.py +0 -64
  140. data/tools/common/common/test/unittest_ureports_text.py +0 -105
  141. data/tools/common/common/test/unittest_xmlutils.py +0 -75
  142. data/tools/common/common/test/utils.py +0 -87
  143. data/tools/common/common/testlib.py +0 -1927
  144. data/tools/common/common/textutils.py +0 -476
  145. data/tools/common/common/tree.py +0 -372
  146. data/tools/common/common/umessage.py +0 -161
  147. data/tools/common/common/ureports/__init__.py +0 -174
  148. data/tools/common/common/ureports/docbook_writer.py +0 -139
  149. data/tools/common/common/ureports/html_writer.py +0 -131
  150. data/tools/common/common/ureports/nodes.py +0 -201
  151. data/tools/common/common/ureports/text_writer.py +0 -140
  152. data/tools/common/common/vcgutils.py +0 -216
  153. data/tools/common/common/visitor.py +0 -107
  154. data/tools/common/common/xmlrpcutils.py +0 -136
  155. data/tools/common/common/xmlutils.py +0 -61
  156. data/tools/coverage/coverage.py +0 -602
  157. data/tools/epydoc/__init__.py +0 -227
  158. data/tools/epydoc/__init__.pyc +0 -0
  159. data/tools/epydoc/apidoc.py +0 -2203
  160. data/tools/epydoc/apidoc.pyc +0 -0
  161. data/tools/epydoc/checker.py +0 -349
  162. data/tools/epydoc/checker.pyc +0 -0
  163. data/tools/epydoc/cli.py +0 -1470
  164. data/tools/epydoc/cli.pyc +0 -0
  165. data/tools/epydoc/compat.py +0 -250
  166. data/tools/epydoc/compat.pyc +0 -0
  167. data/tools/epydoc/docbuilder.py +0 -1358
  168. data/tools/epydoc/docbuilder.pyc +0 -0
  169. data/tools/epydoc/docintrospecter.py +0 -1056
  170. data/tools/epydoc/docintrospecter.pyc +0 -0
  171. data/tools/epydoc/docparser.py +0 -2113
  172. data/tools/epydoc/docparser.pyc +0 -0
  173. data/tools/epydoc/docstringparser.py +0 -1111
  174. data/tools/epydoc/docstringparser.pyc +0 -0
  175. data/tools/epydoc/docwriter/__init__.py +0 -12
  176. data/tools/epydoc/docwriter/__init__.pyc +0 -0
  177. data/tools/epydoc/docwriter/dotgraph.py +0 -1351
  178. data/tools/epydoc/docwriter/dotgraph.pyc +0 -0
  179. data/tools/epydoc/docwriter/html.py +0 -3491
  180. data/tools/epydoc/docwriter/html.pyc +0 -0
  181. data/tools/epydoc/docwriter/html_colorize.py +0 -909
  182. data/tools/epydoc/docwriter/html_colorize.pyc +0 -0
  183. data/tools/epydoc/docwriter/html_css.py +0 -550
  184. data/tools/epydoc/docwriter/html_css.pyc +0 -0
  185. data/tools/epydoc/docwriter/html_help.py +0 -190
  186. data/tools/epydoc/docwriter/html_help.pyc +0 -0
  187. data/tools/epydoc/docwriter/latex.py +0 -1187
  188. data/tools/epydoc/docwriter/latex.pyc +0 -0
  189. data/tools/epydoc/docwriter/plaintext.py +0 -276
  190. data/tools/epydoc/docwriter/plaintext.pyc +0 -0
  191. data/tools/epydoc/docwriter/xlink.py +0 -505
  192. data/tools/epydoc/docwriter/xlink.pyc +0 -0
  193. data/tools/epydoc/gui.py +0 -1148
  194. data/tools/epydoc/gui.pyc +0 -0
  195. data/tools/epydoc/log.py +0 -204
  196. data/tools/epydoc/log.pyc +0 -0
  197. data/tools/epydoc/markup/__init__.py +0 -623
  198. data/tools/epydoc/markup/__init__.pyc +0 -0
  199. data/tools/epydoc/markup/doctest.py +0 -311
  200. data/tools/epydoc/markup/doctest.pyc +0 -0
  201. data/tools/epydoc/markup/epytext.py +0 -2116
  202. data/tools/epydoc/markup/epytext.pyc +0 -0
  203. data/tools/epydoc/markup/javadoc.py +0 -250
  204. data/tools/epydoc/markup/javadoc.pyc +0 -0
  205. data/tools/epydoc/markup/plaintext.py +0 -78
  206. data/tools/epydoc/markup/plaintext.pyc +0 -0
  207. data/tools/epydoc/markup/pyval_repr.py +0 -532
  208. data/tools/epydoc/markup/pyval_repr.pyc +0 -0
  209. data/tools/epydoc/markup/restructuredtext.py +0 -906
  210. data/tools/epydoc/markup/restructuredtext.pyc +0 -0
  211. data/tools/epydoc/test/__init__.py +0 -97
  212. data/tools/epydoc/test/__init__.pyc +0 -0
  213. data/tools/epydoc/test/util.py +0 -226
  214. data/tools/epydoc/test/util.pyc +0 -0
  215. data/tools/epydoc/util.py +0 -289
  216. data/tools/epydoc/util.pyc +0 -0
  217. data/tools/logilab/logilab/__init__.py +0 -5
  218. data/tools/logilab/logilab/astng/__init__.py +0 -82
  219. data/tools/logilab/logilab/astng/__pkginfo__.py +0 -76
  220. data/tools/logilab/logilab/astng/_exceptions.py +0 -64
  221. data/tools/logilab/logilab/astng/_nodes_ast.py +0 -667
  222. data/tools/logilab/logilab/astng/_nodes_compiler.py +0 -758
  223. data/tools/logilab/logilab/astng/bases.py +0 -608
  224. data/tools/logilab/logilab/astng/builder.py +0 -239
  225. data/tools/logilab/logilab/astng/inference.py +0 -426
  226. data/tools/logilab/logilab/astng/inspector.py +0 -289
  227. data/tools/logilab/logilab/astng/manager.py +0 -421
  228. data/tools/logilab/logilab/astng/mixins.py +0 -165
  229. data/tools/logilab/logilab/astng/node_classes.py +0 -848
  230. data/tools/logilab/logilab/astng/nodes.py +0 -85
  231. data/tools/logilab/logilab/astng/nodes_as_string.py +0 -389
  232. data/tools/logilab/logilab/astng/patchcomptransformer.py +0 -159
  233. data/tools/logilab/logilab/astng/protocols.py +0 -333
  234. data/tools/logilab/logilab/astng/raw_building.py +0 -212
  235. data/tools/logilab/logilab/astng/rebuilder.py +0 -307
  236. data/tools/logilab/logilab/astng/scoped_nodes.py +0 -951
  237. data/tools/logilab/logilab/astng/test/__init__.py +0 -19
  238. data/tools/logilab/logilab/astng/test/data/MyPyPa-0.1.0-py2.5.egg +0 -0
  239. data/tools/logilab/logilab/astng/test/data/MyPyPa-0.1.0-py2.5.zip +0 -0
  240. data/tools/logilab/logilab/astng/test/data/SSL1/Connection1.py +0 -33
  241. data/tools/logilab/logilab/astng/test/data/SSL1/__init__.py +0 -20
  242. data/tools/logilab/logilab/astng/test/data/__init__.py +0 -20
  243. data/tools/logilab/logilab/astng/test/data/all.py +0 -29
  244. data/tools/logilab/logilab/astng/test/data/appl/__init__.py +0 -23
  245. data/tools/logilab/logilab/astng/test/data/appl/myConnection.py +0 -30
  246. data/tools/logilab/logilab/astng/test/data/format.py +0 -34
  247. data/tools/logilab/logilab/astng/test/data/module.py +0 -90
  248. data/tools/logilab/logilab/astng/test/data/module2.py +0 -112
  249. data/tools/logilab/logilab/astng/test/data/noendingnewline.py +0 -57
  250. data/tools/logilab/logilab/astng/test/data/nonregr.py +0 -76
  251. data/tools/logilab/logilab/astng/test/data/notall.py +0 -28
  252. data/tools/logilab/logilab/astng/test/data2/__init__.py +0 -20
  253. data/tools/logilab/logilab/astng/test/data2/clientmodule_test.py +0 -51
  254. data/tools/logilab/logilab/astng/test/data2/suppliermodule_test.py +0 -32
  255. data/tools/logilab/logilab/astng/test/regrtest.py +0 -135
  256. data/tools/logilab/logilab/astng/test/regrtest_data/absimport.py +0 -22
  257. data/tools/logilab/logilab/astng/test/regrtest_data/descriptor_crash.py +0 -31
  258. data/tools/logilab/logilab/astng/test/regrtest_data/import_package_subpackage_module.py +0 -68
  259. data/tools/logilab/logilab/astng/test/regrtest_data/package/__init__.py +0 -24
  260. data/tools/logilab/logilab/astng/test/regrtest_data/package/subpackage/__init__.py +0 -20
  261. data/tools/logilab/logilab/astng/test/regrtest_data/package/subpackage/module.py +0 -20
  262. data/tools/logilab/logilab/astng/test/unittest_builder.py +0 -684
  263. data/tools/logilab/logilab/astng/test/unittest_inference.py +0 -1112
  264. data/tools/logilab/logilab/astng/test/unittest_inspector.py +0 -105
  265. data/tools/logilab/logilab/astng/test/unittest_lookup.py +0 -302
  266. data/tools/logilab/logilab/astng/test/unittest_manager.py +0 -98
  267. data/tools/logilab/logilab/astng/test/unittest_nodes.py +0 -302
  268. data/tools/logilab/logilab/astng/test/unittest_scoped_nodes.py +0 -501
  269. data/tools/logilab/logilab/astng/test/unittest_utils.py +0 -104
  270. data/tools/logilab/logilab/astng/utils.py +0 -342
  271. data/tools/logilab/logilab/common/__init__.py +0 -140
  272. data/tools/logilab/logilab/common/__pkginfo__.py +0 -43
  273. data/tools/logilab/logilab/common/adbh.py +0 -35
  274. data/tools/logilab/logilab/common/cache.py +0 -114
  275. data/tools/logilab/logilab/common/changelog.py +0 -234
  276. data/tools/logilab/logilab/common/clcommands.py +0 -181
  277. data/tools/logilab/logilab/common/cli.py +0 -212
  278. data/tools/logilab/logilab/common/compat.py +0 -328
  279. data/tools/logilab/logilab/common/configuration.py +0 -1087
  280. data/tools/logilab/logilab/common/contexts.py +0 -58
  281. data/tools/logilab/logilab/common/corbautils.py +0 -117
  282. data/tools/logilab/logilab/common/daemon.py +0 -171
  283. data/tools/logilab/logilab/common/date.py +0 -279
  284. data/tools/logilab/logilab/common/db.py +0 -49
  285. data/tools/logilab/logilab/common/dbf.py +0 -229
  286. data/tools/logilab/logilab/common/debugger.py +0 -208
  287. data/tools/logilab/logilab/common/decorators.py +0 -190
  288. data/tools/logilab/logilab/common/deprecation.py +0 -118
  289. data/tools/logilab/logilab/common/fileutils.py +0 -409
  290. data/tools/logilab/logilab/common/graph.py +0 -259
  291. data/tools/logilab/logilab/common/html.py +0 -142
  292. data/tools/logilab/logilab/common/interface.py +0 -76
  293. data/tools/logilab/logilab/common/logging_ext.py +0 -166
  294. data/tools/logilab/logilab/common/modutils.py +0 -670
  295. data/tools/logilab/logilab/common/optik_ext.py +0 -383
  296. data/tools/logilab/logilab/common/optparser.py +0 -92
  297. data/tools/logilab/logilab/common/pdf_ext.py +0 -111
  298. data/tools/logilab/logilab/common/proc.py +0 -276
  299. data/tools/logilab/logilab/common/pyro_ext.py +0 -146
  300. data/tools/logilab/logilab/common/pytest.py +0 -754
  301. data/tools/logilab/logilab/common/shellutils.py +0 -383
  302. data/tools/logilab/logilab/common/sphinx_ext.py +0 -87
  303. data/tools/logilab/logilab/common/sphinxutils.py +0 -122
  304. data/tools/logilab/logilab/common/sqlgen.py +0 -31
  305. data/tools/logilab/logilab/common/table.py +0 -930
  306. data/tools/logilab/logilab/common/tasksqueue.py +0 -97
  307. data/tools/logilab/logilab/common/test/__init__.py +0 -1
  308. data/tools/logilab/logilab/common/test/data/ChangeLog +0 -184
  309. data/tools/logilab/logilab/common/test/data/MyPyPa-0.1.0-py2.5.egg +0 -0
  310. data/tools/logilab/logilab/common/test/data/__init__.py +0 -1
  311. data/tools/logilab/logilab/common/test/data/content_differ_dir/NOTHING +0 -0
  312. data/tools/logilab/logilab/common/test/data/content_differ_dir/README +0 -1
  313. data/tools/logilab/logilab/common/test/data/content_differ_dir/subdir/coin +0 -1
  314. data/tools/logilab/logilab/common/test/data/content_differ_dir/subdir/toto.txt +0 -53
  315. data/tools/logilab/logilab/common/test/data/file_differ_dir/NOTHING +0 -0
  316. data/tools/logilab/logilab/common/test/data/file_differ_dir/README +0 -1
  317. data/tools/logilab/logilab/common/test/data/file_differ_dir/subdir/toto.txt +0 -53
  318. data/tools/logilab/logilab/common/test/data/file_differ_dir/subdirtwo/Hello +0 -0
  319. data/tools/logilab/logilab/common/test/data/find_test/__init__.py +0 -0
  320. data/tools/logilab/logilab/common/test/data/find_test/foo.txt +0 -0
  321. data/tools/logilab/logilab/common/test/data/find_test/module.py +0 -0
  322. data/tools/logilab/logilab/common/test/data/find_test/module2.py +0 -0
  323. data/tools/logilab/logilab/common/test/data/find_test/newlines.txt +0 -0
  324. data/tools/logilab/logilab/common/test/data/find_test/noendingnewline.py +0 -0
  325. data/tools/logilab/logilab/common/test/data/find_test/nonregr.py +0 -0
  326. data/tools/logilab/logilab/common/test/data/find_test/normal_file.txt +0 -0
  327. data/tools/logilab/logilab/common/test/data/find_test/spam.txt +0 -0
  328. data/tools/logilab/logilab/common/test/data/find_test/sub/doc.txt +0 -0
  329. data/tools/logilab/logilab/common/test/data/find_test/sub/momo.py +0 -0
  330. data/tools/logilab/logilab/common/test/data/find_test/test.ini +0 -0
  331. data/tools/logilab/logilab/common/test/data/find_test/test1.msg +0 -0
  332. data/tools/logilab/logilab/common/test/data/find_test/test2.msg +0 -0
  333. data/tools/logilab/logilab/common/test/data/find_test/write_protected_file.txt +0 -0
  334. data/tools/logilab/logilab/common/test/data/foo.txt +0 -9
  335. data/tools/logilab/logilab/common/test/data/module.py +0 -88
  336. data/tools/logilab/logilab/common/test/data/module2.py +0 -77
  337. data/tools/logilab/logilab/common/test/data/newlines.txt +0 -3
  338. data/tools/logilab/logilab/common/test/data/noendingnewline.py +0 -36
  339. data/tools/logilab/logilab/common/test/data/nonregr.py +0 -14
  340. data/tools/logilab/logilab/common/test/data/normal_file.txt +0 -0
  341. data/tools/logilab/logilab/common/test/data/reference_dir/NOTHING +0 -0
  342. data/tools/logilab/logilab/common/test/data/reference_dir/README +0 -1
  343. data/tools/logilab/logilab/common/test/data/reference_dir/subdir/coin +0 -1
  344. data/tools/logilab/logilab/common/test/data/reference_dir/subdir/toto.txt +0 -53
  345. data/tools/logilab/logilab/common/test/data/same_dir/NOTHING +0 -0
  346. data/tools/logilab/logilab/common/test/data/same_dir/README +0 -1
  347. data/tools/logilab/logilab/common/test/data/same_dir/subdir/coin +0 -1
  348. data/tools/logilab/logilab/common/test/data/same_dir/subdir/toto.txt +0 -53
  349. data/tools/logilab/logilab/common/test/data/spam.txt +0 -9
  350. data/tools/logilab/logilab/common/test/data/sub/doc.txt +0 -1
  351. data/tools/logilab/logilab/common/test/data/sub/momo.py +0 -1
  352. data/tools/logilab/logilab/common/test/data/subdir_differ_dir/NOTHING +0 -0
  353. data/tools/logilab/logilab/common/test/data/subdir_differ_dir/README +0 -1
  354. data/tools/logilab/logilab/common/test/data/subdir_differ_dir/subdir/coin +0 -1
  355. data/tools/logilab/logilab/common/test/data/subdir_differ_dir/subdir/toto.txt +0 -53
  356. data/tools/logilab/logilab/common/test/data/test.ini +0 -20
  357. data/tools/logilab/logilab/common/test/data/test1.msg +0 -30
  358. data/tools/logilab/logilab/common/test/data/test2.msg +0 -42
  359. data/tools/logilab/logilab/common/test/data/write_protected_file.txt +0 -0
  360. data/tools/logilab/logilab/common/test/foomod.py +0 -17
  361. data/tools/logilab/logilab/common/test/unittest_cache.py +0 -129
  362. data/tools/logilab/logilab/common/test/unittest_changelog.py +0 -37
  363. data/tools/logilab/logilab/common/test/unittest_compat.py +0 -239
  364. data/tools/logilab/logilab/common/test/unittest_configuration.py +0 -348
  365. data/tools/logilab/logilab/common/test/unittest_date.py +0 -154
  366. data/tools/logilab/logilab/common/test/unittest_decorators.py +0 -62
  367. data/tools/logilab/logilab/common/test/unittest_deprecation.py +0 -76
  368. data/tools/logilab/logilab/common/test/unittest_fileutils.py +0 -133
  369. data/tools/logilab/logilab/common/test/unittest_graph.py +0 -50
  370. data/tools/logilab/logilab/common/test/unittest_html.py +0 -76
  371. data/tools/logilab/logilab/common/test/unittest_interface.py +0 -87
  372. data/tools/logilab/logilab/common/test/unittest_modutils.py +0 -244
  373. data/tools/logilab/logilab/common/test/unittest_pytest.py +0 -50
  374. data/tools/logilab/logilab/common/test/unittest_shellutils.py +0 -248
  375. data/tools/logilab/logilab/common/test/unittest_table.py +0 -448
  376. data/tools/logilab/logilab/common/test/unittest_taskqueue.py +0 -71
  377. data/tools/logilab/logilab/common/test/unittest_testlib.py +0 -956
  378. data/tools/logilab/logilab/common/test/unittest_textutils.py +0 -247
  379. data/tools/logilab/logilab/common/test/unittest_tree.py +0 -248
  380. data/tools/logilab/logilab/common/test/unittest_umessage.py +0 -55
  381. data/tools/logilab/logilab/common/test/unittest_ureports_html.py +0 -64
  382. data/tools/logilab/logilab/common/test/unittest_ureports_text.py +0 -105
  383. data/tools/logilab/logilab/common/test/unittest_xmlutils.py +0 -75
  384. data/tools/logilab/logilab/common/test/utils.py +0 -87
  385. data/tools/logilab/logilab/common/testlib.py +0 -1927
  386. data/tools/logilab/logilab/common/textutils.py +0 -476
  387. data/tools/logilab/logilab/common/tree.py +0 -372
  388. data/tools/logilab/logilab/common/umessage.py +0 -161
  389. data/tools/logilab/logilab/common/ureports/__init__.py +0 -174
  390. data/tools/logilab/logilab/common/ureports/docbook_writer.py +0 -139
  391. data/tools/logilab/logilab/common/ureports/html_writer.py +0 -131
  392. data/tools/logilab/logilab/common/ureports/nodes.py +0 -201
  393. data/tools/logilab/logilab/common/ureports/text_writer.py +0 -140
  394. data/tools/logilab/logilab/common/vcgutils.py +0 -216
  395. data/tools/logilab/logilab/common/visitor.py +0 -107
  396. data/tools/logilab/logilab/common/xmlrpcutils.py +0 -136
  397. data/tools/logilab/logilab/common/xmlutils.py +0 -61
  398. data/tools/pychecker/COPYRIGHT +0 -31
  399. data/tools/pychecker/ChangeLog +0 -349
  400. data/tools/pychecker/CodeChecks.py +0 -1969
  401. data/tools/pychecker/CodeChecks.pyc +0 -0
  402. data/tools/pychecker/CodeChecks.pyo +0 -0
  403. data/tools/pychecker/Config.py +0 -475
  404. data/tools/pychecker/Config.pyc +0 -0
  405. data/tools/pychecker/Config.pyo +0 -0
  406. data/tools/pychecker/KNOWN_BUGS +0 -100
  407. data/tools/pychecker/MAINTAINERS +0 -81
  408. data/tools/pychecker/NEWS +0 -406
  409. data/tools/pychecker/OP.py +0 -131
  410. data/tools/pychecker/OP.pyc +0 -0
  411. data/tools/pychecker/OP.pyo +0 -0
  412. data/tools/pychecker/OptionTypes.py +0 -117
  413. data/tools/pychecker/OptionTypes.pyc +0 -0
  414. data/tools/pychecker/OptionTypes.pyo +0 -0
  415. data/tools/pychecker/README +0 -152
  416. data/tools/pychecker/Stack.py +0 -115
  417. data/tools/pychecker/Stack.pyc +0 -0
  418. data/tools/pychecker/Stack.pyo +0 -0
  419. data/tools/pychecker/TODO +0 -101
  420. data/tools/pychecker/VERSION +0 -1
  421. data/tools/pychecker/Warning.py +0 -50
  422. data/tools/pychecker/Warning.pyc +0 -0
  423. data/tools/pychecker/Warning.pyo +0 -0
  424. data/tools/pychecker/__init__.py +0 -17
  425. data/tools/pychecker/__init__.pyc +0 -0
  426. data/tools/pychecker/__init__.pyo +0 -0
  427. data/tools/pychecker/checker.py +0 -961
  428. data/tools/pychecker/checker.pyc +0 -0
  429. data/tools/pychecker/checker.pyo +0 -0
  430. data/tools/pychecker/function.py +0 -159
  431. data/tools/pychecker/function.pyc +0 -0
  432. data/tools/pychecker/function.pyo +0 -0
  433. data/tools/pychecker/msgs.py +0 -175
  434. data/tools/pychecker/msgs.pyc +0 -0
  435. data/tools/pychecker/msgs.pyo +0 -0
  436. data/tools/pychecker/options.py +0 -275
  437. data/tools/pychecker/options.pyc +0 -0
  438. data/tools/pychecker/options.pyo +0 -0
  439. data/tools/pychecker/pcmodules.py +0 -19
  440. data/tools/pychecker/pcmodules.pyc +0 -0
  441. data/tools/pychecker/pcmodules.pyo +0 -0
  442. data/tools/pychecker/printer.py +0 -47
  443. data/tools/pychecker/printer.pyc +0 -0
  444. data/tools/pychecker/printer.pyo +0 -0
  445. data/tools/pychecker/python.py +0 -427
  446. data/tools/pychecker/python.pyc +0 -0
  447. data/tools/pychecker/python.pyo +0 -0
  448. data/tools/pychecker/utils.py +0 -102
  449. data/tools/pychecker/utils.pyc +0 -0
  450. data/tools/pychecker/utils.pyo +0 -0
  451. data/tools/pychecker/warn.py +0 -778
  452. data/tools/pychecker/warn.pyc +0 -0
  453. data/tools/pychecker/warn.pyo +0 -0
  454. data/tools/pylint2/pylint/__init__.py +0 -16
  455. data/tools/pylint2/pylint/__pkginfo__.py +0 -67
  456. data/tools/pylint2/pylint/checkers/__init__.py +0 -155
  457. data/tools/pylint2/pylint/checkers/base.py +0 -749
  458. data/tools/pylint2/pylint/checkers/classes.py +0 -527
  459. data/tools/pylint2/pylint/checkers/design_analysis.py +0 -344
  460. data/tools/pylint2/pylint/checkers/exceptions.py +0 -183
  461. data/tools/pylint2/pylint/checkers/format.py +0 -367
  462. data/tools/pylint2/pylint/checkers/imports.py +0 -379
  463. data/tools/pylint2/pylint/checkers/logging.py +0 -98
  464. data/tools/pylint2/pylint/checkers/misc.py +0 -128
  465. data/tools/pylint2/pylint/checkers/newstyle.py +0 -107
  466. data/tools/pylint2/pylint/checkers/raw_metrics.py +0 -125
  467. data/tools/pylint2/pylint/checkers/similar.py +0 -333
  468. data/tools/pylint2/pylint/checkers/string_format.py +0 -239
  469. data/tools/pylint2/pylint/checkers/typecheck.py +0 -364
  470. data/tools/pylint2/pylint/checkers/utils.py +0 -208
  471. data/tools/pylint2/pylint/checkers/variables.py +0 -498
  472. data/tools/pylint2/pylint/config.py +0 -149
  473. data/tools/pylint2/pylint/epylint.py +0 -149
  474. data/tools/pylint2/pylint/gui.py +0 -433
  475. data/tools/pylint2/pylint/interfaces.py +0 -98
  476. data/tools/pylint2/pylint/lint.py +0 -914
  477. data/tools/pylint2/pylint/pyreverse/__init__.py +0 -5
  478. data/tools/pylint2/pylint/pyreverse/diadefslib.py +0 -229
  479. data/tools/pylint2/pylint/pyreverse/diagrams.py +0 -247
  480. data/tools/pylint2/pylint/pyreverse/main.py +0 -123
  481. data/tools/pylint2/pylint/pyreverse/utils.py +0 -131
  482. data/tools/pylint2/pylint/pyreverse/writer.py +0 -196
  483. data/tools/pylint2/pylint/reporters/__init__.py +0 -67
  484. data/tools/pylint2/pylint/reporters/guireporter.py +0 -36
  485. data/tools/pylint2/pylint/reporters/html.py +0 -69
  486. data/tools/pylint2/pylint/reporters/text.py +0 -156
  487. data/tools/pylint2/pylint/utils.py +0 -518
  488. data/tools/pylint2/pylint.py +0 -16
@@ -1,344 +0,0 @@
1
- # Copyright (c) 2003-2006 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
- """check for signs of poor design
17
-
18
-
19
- see http://intranet.logilab.fr/jpl/view?rql=Any%20X%20where%20X%20eid%201243
20
- FIXME: missing 13, 15, 16
21
- """
22
-
23
- from logilab.astng import Function, If, InferenceError
24
-
25
- from pylint.interfaces import IASTNGChecker
26
- from pylint.checkers import BaseChecker
27
-
28
- import re
29
-
30
- # regexp for ignored argument name
31
- IGNORED_ARGUMENT_NAMES = re.compile('_.*')
32
-
33
- def class_is_abstract(klass):
34
- """return true if the given class node should be considered as an abstract
35
- class
36
- """
37
- for attr in klass.values():
38
- if isinstance(attr, Function):
39
- if attr.is_abstract(pass_is_abstract=False):
40
- return True
41
- return False
42
-
43
-
44
- MSGS = {
45
- 'R0901': ('Too many ancestors (%s/%s)',
46
- 'Used when class has too many parent classes, try to reduce \
47
- this to get a more simple (and so easier to use) class.'),
48
- 'R0902': ('Too many instance attributes (%s/%s)',
49
- 'Used when class has too many instance attributes, try to reduce \
50
- this to get a more simple (and so easier to use) class.'),
51
- 'R0903': ('Too few public methods (%s/%s)',
52
- 'Used when class has too few public methods, so be sure it\'s \
53
- really worth it.'),
54
- 'R0904': ('Too many public methods (%s/%s)',
55
- 'Used when class has too many public methods, try to reduce \
56
- this to get a more simple (and so easier to use) class.'),
57
-
58
- 'R0911': ('Too many return statements (%s/%s)',
59
- 'Used when a function or method has too many return statement, \
60
- making it hard to follow.'),
61
- 'R0912': ('Too many branches (%s/%s)',
62
- 'Used when a function or method has too many branches, \
63
- making it hard to follow.'),
64
- 'R0913': ('Too many arguments (%s/%s)',
65
- 'Used when a function or method takes too many arguments.'),
66
- 'R0914': ('Too many local variables (%s/%s)',
67
- 'Used when a function or method has too many local variables.'),
68
- 'R0915': ('Too many statements (%s/%s)',
69
- 'Used when a function or method has too many statements. You \
70
- should then split it in smaller functions / methods.'),
71
-
72
- 'R0921': ('Abstract class not referenced',
73
- 'Used when an abstract class is not used as ancestor anywhere.'),
74
- 'R0922': ('Abstract class is only referenced %s times',
75
- 'Used when an abstract class is used less than X times as \
76
- ancestor.'),
77
- 'R0923': ('Interface not implemented',
78
- 'Used when an interface class is not implemented anywhere.'),
79
- }
80
-
81
-
82
- class MisdesignChecker(BaseChecker):
83
- """checks for sign of poor/misdesign:
84
- * number of methods, attributes, local variables...
85
- * size, complexity of functions, methods
86
- """
87
-
88
- __implements__ = (IASTNGChecker,)
89
-
90
- # configuration section name
91
- name = 'design'
92
- # messages
93
- msgs = MSGS
94
- priority = -2
95
- # configuration options
96
- options = (('max-args',
97
- {'default' : 5, 'type' : 'int', 'metavar' : '<int>',
98
- 'help': 'Maximum number of arguments for function / method'}
99
- ),
100
- ('ignored-argument-names',
101
- {'default' : IGNORED_ARGUMENT_NAMES,
102
- 'type' :'regexp', 'metavar' : '<regexp>',
103
- 'help' : 'Argument names that match this expression will be '
104
- 'ignored. Default to name with leading underscore'}
105
- ),
106
- ('max-locals',
107
- {'default' : 15, 'type' : 'int', 'metavar' : '<int>',
108
- 'help': 'Maximum number of locals for function / method body'}
109
- ),
110
- ('max-returns',
111
- {'default' : 6, 'type' : 'int', 'metavar' : '<int>',
112
- 'help': 'Maximum number of return / yield for function / '
113
- 'method body'}
114
- ),
115
- ('max-branchs',
116
- {'default' : 12, 'type' : 'int', 'metavar' : '<int>',
117
- 'help': 'Maximum number of branch for function / method body'}
118
- ),
119
- ('max-statements',
120
- {'default' : 50, 'type' : 'int', 'metavar' : '<int>',
121
- 'help': 'Maximum number of statements in function / method '
122
- 'body'}
123
- ),
124
- ('max-parents',
125
- {'default' : 7,
126
- 'type' : 'int',
127
- 'metavar' : '<num>',
128
- 'help' : 'Maximum number of parents for a class (see R0901).'}
129
- ),
130
- ('max-attributes',
131
- {'default' : 7,
132
- 'type' : 'int',
133
- 'metavar' : '<num>',
134
- 'help' : 'Maximum number of attributes for a class \
135
- (see R0902).'}
136
- ),
137
- ('min-public-methods',
138
- {'default' : 2,
139
- 'type' : 'int',
140
- 'metavar' : '<num>',
141
- 'help' : 'Minimum number of public methods for a class \
142
- (see R0903).'}
143
- ),
144
- ('max-public-methods',
145
- {'default' : 20,
146
- 'type' : 'int',
147
- 'metavar' : '<num>',
148
- 'help' : 'Maximum number of public methods for a class \
149
- (see R0904).'}
150
- ),
151
- )
152
-
153
- def __init__(self, linter=None):
154
- BaseChecker.__init__(self, linter)
155
- self.stats = None
156
- self._returns = None
157
- self._branchs = None
158
- self._used_abstracts = None
159
- self._used_ifaces = None
160
- self._abstracts = None
161
- self._ifaces = None
162
- self._stmts = 0
163
-
164
- def open(self):
165
- """initialize visit variables"""
166
- self.stats = self.linter.add_stats()
167
- self._returns = []
168
- self._branchs = []
169
- self._used_abstracts = {}
170
- self._used_ifaces = {}
171
- self._abstracts = []
172
- self._ifaces = []
173
-
174
- def close(self):
175
- """check that abstract/interface classes are used"""
176
- for abstract in self._abstracts:
177
- if not abstract in self._used_abstracts:
178
- self.add_message('R0921', node=abstract)
179
- elif self._used_abstracts[abstract] < 2:
180
- self.add_message('R0922', node=abstract,
181
- args=self._used_abstracts[abstract])
182
- for iface in self._ifaces:
183
- if not iface in self._used_ifaces:
184
- self.add_message('R0923', node=iface)
185
-
186
- def visit_class(self, node):
187
- """check size of inheritance hierarchy and number of instance attributes
188
- """
189
- self._inc_branch()
190
- # Is the total inheritance hierarchy is 7 or less?
191
- nb_parents = len(list(node.ancestors()))
192
- if nb_parents > self.config.max_parents:
193
- self.add_message('R0901', node=node,
194
- args=(nb_parents, self.config.max_parents))
195
- # Does the class contain less than 20 attributes for
196
- # non-GUI classes (40 for GUI)?
197
- # FIXME detect gui classes
198
- if len(node.instance_attrs) > self.config.max_attributes:
199
- self.add_message('R0902', node=node,
200
- args=(len(node.instance_attrs),
201
- self.config.max_attributes))
202
- # update abstract / interface classes structures
203
- if class_is_abstract(node):
204
- self._abstracts.append(node)
205
- elif node.type == 'interface' and node.name != 'Interface':
206
- self._ifaces.append(node)
207
- for parent in node.ancestors(False):
208
- if parent.name == 'Interface':
209
- continue
210
- self._used_ifaces[parent] = 1
211
- try:
212
- for iface in node.interfaces():
213
- self._used_ifaces[iface] = 1
214
- except InferenceError:
215
- # XXX log ?
216
- pass
217
- for parent in node.ancestors():
218
- try:
219
- self._used_abstracts[parent] += 1
220
- except KeyError:
221
- self._used_abstracts[parent] = 1
222
-
223
- def leave_class(self, node):
224
- """check number of public methods"""
225
- nb_public_methods = 0
226
- for method in node.methods():
227
- if not method.name.startswith('_'):
228
- nb_public_methods += 1
229
- # Does the class contain less than 20 public methods ?
230
- if nb_public_methods > self.config.max_public_methods:
231
- self.add_message('R0904', node=node,
232
- args=(nb_public_methods,
233
- self.config.max_public_methods))
234
- # stop here for exception, metaclass and interface classes
235
- if node.type != 'class':
236
- return
237
- # Does the class contain more than 5 public methods ?
238
- if nb_public_methods < self.config.min_public_methods:
239
- self.add_message('R0903', node=node,
240
- args=(nb_public_methods,
241
- self.config.min_public_methods))
242
-
243
-
244
- def visit_function(self, node):
245
- """check function name, docstring, arguments, redefinition,
246
- variable names, max locals
247
- """
248
- self._inc_branch()
249
- # init branch and returns counters
250
- self._returns.append(0)
251
- self._branchs.append(0)
252
- # check number of arguments
253
- args = node.args.args
254
- if args is not None:
255
- ignored_args_num = len(
256
- [arg for arg in args
257
- if self.config.ignored_argument_names.match(arg.name)])
258
- argnum = len(args) - ignored_args_num
259
- if argnum > self.config.max_args:
260
- self.add_message('R0913', node=node,
261
- args=(len(args), self.config.max_args))
262
- else:
263
- ignored_args_num = 0
264
- # check number of local variables
265
- locnum = len(node.locals) - ignored_args_num
266
- if locnum > self.config.max_locals:
267
- self.add_message('R0914', node=node,
268
- args=(locnum, self.config.max_locals))
269
- # init statements counter
270
- self._stmts = 1
271
-
272
- def leave_function(self, node):
273
- """most of the work is done here on close:
274
- checks for max returns, branch, return in __init__
275
- """
276
- returns = self._returns.pop()
277
- if returns > self.config.max_returns:
278
- self.add_message('R0911', node=node,
279
- args=(returns, self.config.max_returns))
280
- branchs = self._branchs.pop()
281
- if branchs > self.config.max_branchs:
282
- self.add_message('R0912', node=node,
283
- args=(branchs, self.config.max_branchs))
284
- # check number of statements
285
- if self._stmts > self.config.max_statements:
286
- self.add_message('R0915', node=node,
287
- args=(self._stmts, self.config.max_statements))
288
-
289
- def visit_return(self, _):
290
- """count number of returns"""
291
- if not self._returns:
292
- return # return outside function, reported by the base checker
293
- self._returns[-1] += 1
294
-
295
- def visit_default(self, node):
296
- """default visit method -> increments the statements counter if
297
- necessary
298
- """
299
- if node.is_statement:
300
- self._stmts += 1
301
-
302
- def visit_tryexcept(self, node):
303
- """increments the branchs counter"""
304
- branchs = len(node.handlers)
305
- if node.orelse:
306
- branchs += 1
307
- self._inc_branch(branchs)
308
- self._stmts += branchs
309
-
310
- def visit_tryfinally(self, _):
311
- """increments the branchs counter"""
312
- self._inc_branch(2)
313
- self._stmts += 2
314
-
315
- def visit_if(self, node):
316
- """increments the branchs counter"""
317
- branchs = 1
318
- # don't double count If nodes coming from some 'elif'
319
- if node.orelse and (len(node.orelse)>1 or
320
- not isinstance(node.orelse[0], If)):
321
- branchs += 1
322
- self._inc_branch(branchs)
323
- self._stmts += branchs
324
-
325
- def visit_while(self, node):
326
- """increments the branchs counter"""
327
- branchs = 1
328
- if node.orelse:
329
- branchs += 1
330
- self._inc_branch(branchs)
331
-
332
- visit_for = visit_while
333
-
334
- def _inc_branch(self, branchsnum=1):
335
- """increments the branchs counter"""
336
- branchs = self._branchs
337
- for i in xrange(len(branchs)):
338
- branchs[i] += branchsnum
339
-
340
- # FIXME: make a nice report...
341
-
342
- def register(linter):
343
- """required method to auto register this checker """
344
- linter.register_checker(MisdesignChecker(linter))
@@ -1,183 +0,0 @@
1
- # Copyright (c) 2003-2007 LOGILAB S.A. (Paris, FRANCE).
2
- # http://www.logilab.fr/ -- mailto:contact@logilab.fr
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
- """exceptions handling (raising, catching, exceptions classes) checker
16
- """
17
- import sys
18
-
19
- from logilab.common.compat import enumerate
20
- from logilab import astng
21
- from logilab.astng import YES, Instance, unpack_infer
22
-
23
- from pylint.checkers import BaseChecker
24
- from pylint.checkers.utils import is_empty, is_raising
25
- from pylint.interfaces import IASTNGChecker
26
-
27
- MSGS = {
28
- 'E0701': (
29
- 'Bad except clauses order (%s)',
30
- 'Used when except clauses are not in the correct order (from the \
31
- more specific to the more generic). If you don\'t fix the order, \
32
- some exceptions may not be catched by the most specific handler.'),
33
- 'E0702': ('Raising %s while only classes, instances or string are allowed',
34
- 'Used when something which is neither a class, an instance or a \
35
- string is raised (i.e. a `TypeError` will be raised).'),
36
- 'E0711': ('NotImplemented raised - should raise NotImplementedError',
37
- 'Used when NotImplemented is raised instead of \
38
- NotImplementedError'),
39
-
40
- 'W0701': ('Raising a string exception',
41
- 'Used when a string exception is raised.'),
42
- 'W0702': ('No exception type(s) specified',
43
- 'Used when an except clause doesn\'t specify exceptions type to \
44
- catch.'),
45
- 'W0703': ('Catch "Exception"',
46
- 'Used when an except catches Exception instances.'),
47
- 'W0704': ('Except doesn\'t do anything',
48
- 'Used when an except clause does nothing but "pass" and there is\
49
- no "else" clause.'),
50
- 'W0710': ('Exception doesn\'t inherit from standard "Exception" class',
51
- 'Used when a custom exception class is raised but doesn\'t \
52
- inherit from the builtin "Exception" class.'),
53
- }
54
- if sys.version_info < (2, 5):
55
- MSGS['E0710'] = ('Raising a new style class',
56
- 'Used when a new style class is raised since it\'s not \
57
- possible with python < 2.5.')
58
- else:
59
- MSGS['E0710'] = ('Raising a new style class which doesn\'t inherit from \
60
- BaseException',
61
- 'Used when a new style class which doesn\'t inherit from \
62
- BaseException raised since it\'s not possible with \
63
- python < 2.5.')
64
-
65
-
66
- class ExceptionsChecker(BaseChecker):
67
- """checks for
68
- * excepts without exception filter
69
- * type of raise argument : string, Exceptions, other values
70
- """
71
-
72
- __implements__ = IASTNGChecker
73
-
74
- name = 'exceptions'
75
- msgs = MSGS
76
- priority = -4
77
- options = ()
78
-
79
- def visit_raise(self, node):
80
- """visit raise possibly inferring value"""
81
- # ignore empty raise
82
- if node.type is None:
83
- return
84
- expr = node.type
85
- if self._check_raise_value(node, expr):
86
- return
87
- else:
88
- try:
89
- value = unpack_infer(expr).next()
90
- except astng.InferenceError:
91
- return
92
- self._check_raise_value(node, value)
93
-
94
- def _check_raise_value(self, node, expr):
95
- """check for bad values, string exception and class inheritance
96
- """
97
- value_found = True
98
- if isinstance(expr, astng.Const):
99
- value = expr.value
100
- if isinstance(value, str):
101
- self.add_message('W0701', node=node)
102
- else:
103
- self.add_message('E0702', node=node,
104
- args=value.__class__.__name__)
105
- elif (isinstance(expr, astng.Name) and \
106
- expr.name in ('None', 'True', 'False')) or \
107
- isinstance(expr, (astng.List, astng.Dict, astng.Tuple,
108
- astng.Module, astng.Function)):
109
- self.add_message('E0702', node=node, args=expr.name)
110
- elif isinstance(expr, astng.Name) and expr.name == 'NotImplemented':
111
- self.add_message('E0711', node=node)
112
- elif isinstance(expr, astng.BinOp) and expr.op == '%':
113
- self.add_message('W0701', node=node)
114
- elif isinstance(expr, (Instance, astng.Class)):
115
- if isinstance(expr, Instance):
116
- expr = expr._proxied
117
- if (isinstance(expr, astng.Class) and
118
- not inherit_from_std_ex(expr) and
119
- expr.root().name != '__builtin__'):
120
- if expr.newstyle:
121
- self.add_message('E0710', node=node)
122
- else:
123
- self.add_message('W0710', node=node)
124
- else:
125
- value_found = False
126
- else:
127
- value_found = False
128
- return value_found
129
-
130
-
131
- def visit_tryexcept(self, node):
132
- """check for empty except"""
133
- exceptions_classes = []
134
- nb_handlers = len(node.handlers)
135
- for index, handler in enumerate(node.handlers):
136
- # single except doing nothing but "pass" without else clause
137
- if nb_handlers == 1 and is_empty(handler.body) and not node.orelse:
138
- self.add_message('W0704', node=handler.type or handler.body[0])
139
- if handler.type is None:
140
- if nb_handlers == 1 and not is_raising(handler.body):
141
- self.add_message('W0702', node=handler.body[0])
142
- # check if a "except:" is followed by some other
143
- # except
144
- elif index < (nb_handlers - 1):
145
- msg = 'empty except clause should always appears last'
146
- self.add_message('E0701', node=node, args=msg)
147
- else:
148
- try:
149
- excs = list(unpack_infer(handler.type))
150
- except astng.InferenceError:
151
- continue
152
- for exc in excs:
153
- # XXX skip other non class nodes
154
- if exc is YES or not isinstance(exc, astng.Class):
155
- continue
156
- exc_ancestors = [anc for anc in exc.ancestors()
157
- if isinstance(anc, astng.Class)]
158
- for previous_exc in exceptions_classes:
159
- if previous_exc in exc_ancestors:
160
- msg = '%s is an ancestor class of %s' % (
161
- previous_exc.name, exc.name)
162
- self.add_message('E0701', node=handler.type, args=msg)
163
- if (exc.name == 'Exception'
164
- and exc.root().name == 'exceptions'
165
- and nb_handlers == 1 and not is_raising(handler.body)):
166
- self.add_message('W0703', node=handler.type)
167
- exceptions_classes += excs
168
-
169
- def inherit_from_std_ex(node):
170
- """return true if the given class node is subclass of
171
- exceptions.Exception
172
- """
173
- if node.name in ('Exception', 'BaseException') \
174
- and node.root().name == 'exceptions':
175
- return True
176
- for parent in node.ancestors(recurs=False):
177
- if inherit_from_std_ex(parent):
178
- return True
179
- return False
180
-
181
- def register(linter):
182
- """required method to auto register this checker"""
183
- linter.register_checker(ExceptionsChecker(linter))