bee_python 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
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,239 +0,0 @@
1
- # Copyright (c) 2009-2010 Arista Networks, Inc. - James Lingard
2
- # Copyright (c) 2004-2010 LOGILAB S.A. (Paris, FRANCE).
3
- # http://www.logilab.fr/ -- mailto:contact@logilab.fr
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
-
18
- """Checker for string formatting operations.
19
- """
20
-
21
- import string
22
- from logilab import astng
23
- from pylint.interfaces import IASTNGChecker
24
- from pylint.checkers import BaseChecker
25
-
26
- MSGS = {
27
- 'E9900': ("Unsupported format character %r (%#02x) at index %d",
28
- "Used when a unsupported format character is used in a format\
29
- string."),
30
- 'E9901': ("Format string ends in middle of conversion specifier",
31
- "Used when a format string terminates before the end of a \
32
- conversion specifier."),
33
- 'E9902': ("Mixing named and unnamed conversion specifiers in format string",
34
- "Used when a format string contains both named (e.g. '%(foo)d') \
35
- and unnamed (e.g. '%d') conversion specifiers. This is also \
36
- used when a named conversion specifier contains * for the \
37
- minimum field width and/or precision."),
38
- 'E9903': ("Expected mapping for format string, not %s",
39
- "Used when a format string that uses named conversion specifiers \
40
- is used with an argument that is not a mapping."),
41
- 'W9900': ("Format string dictionary key should be a string, not %s",
42
- "Used when a format string that uses named conversion specifiers \
43
- is used with a dictionary whose keys are not all strings."),
44
- 'W9901': ("Unused key %r in format string dictionary",
45
- "Used when a format string that uses named conversion specifiers \
46
- is used with a dictionary that conWtains keys not required by the \
47
- format string."),
48
- 'E9904': ("Missing key %r in format string dictionary",
49
- "Used when a format string that uses named conversion specifiers \
50
- is used with a dictionary that doesn't contain all the keys \
51
- required by the format string."),
52
- 'E9905': ("Too many arguments for format string",
53
- "Used when a format string that uses unnamed conversion \
54
- specifiers is given too few arguments."),
55
- 'E9906': ("Not enough arguments for format string",
56
- "Used when a format string that uses unnamed conversion \
57
- specifiers is given too many arguments"),
58
- }
59
-
60
- class IncompleteFormatStringException(Exception):
61
- """A format string ended in the middle of a format specifier."""
62
- pass
63
-
64
- class UnsupportedFormatCharacterException(Exception):
65
- """A format character in a format string is not one of the supported
66
- format characters."""
67
- def __init__(self, index):
68
- Exception.__init__(self, index)
69
- self.index = index
70
-
71
- def parse_format_string(format_string):
72
- """Parses a format string, returning a tuple of (keys, num_args), where keys
73
- is the set of mapping keys in the format string, and num_args is the number
74
- of arguments required by the format string. Raises
75
- IncompleteFormatStringException or UnsupportedFormatCharacterException if a
76
- parse error occurs."""
77
- keys = set()
78
- num_args = 0
79
- def next_char(i):
80
- i += 1
81
- if i == len(format_string):
82
- raise IncompleteFormatStringException
83
- return (i, format_string[i])
84
- i = 0
85
- while i < len(format_string):
86
- c = format_string[i]
87
- if c == '%':
88
- i, c = next_char(i)
89
- # Parse the mapping key (optional).
90
- key = None
91
- if c == '(':
92
- depth = 1
93
- i, c = next_char(i)
94
- key_start = i
95
- while depth != 0:
96
- if c == '(':
97
- depth += 1
98
- elif c == ')':
99
- depth -= 1
100
- i, c = next_char(i)
101
- key_end = i - 1
102
- key = format_string[key_start:key_end]
103
-
104
- # Parse the conversion flags (optional).
105
- while c in '#0- +':
106
- i, c = next_char(i)
107
- # Parse the minimum field width (optional).
108
- if c == '*':
109
- num_args += 1
110
- i, c = next_char(i)
111
- else:
112
- while c in string.digits:
113
- i, c = next_char(i)
114
- # Parse the precision (optional).
115
- if c == '.':
116
- i, c = next_char(i)
117
- if c == '*':
118
- num_args += 1
119
- i, c = next_char(i)
120
- else:
121
- while c in string.digits:
122
- i, c = next_char(i)
123
- # Parse the length modifier (optional).
124
- if c in 'hlL':
125
- i, c = next_char(i)
126
- # Parse the conversion type (mandatory).
127
- if c not in 'diouxXeEfFgGcrs%':
128
- raise UnsupportedFormatCharacterException(i)
129
- if key:
130
- keys.add(key)
131
- elif c != '%':
132
- num_args += 1
133
- i += 1
134
- return keys, num_args
135
-
136
- class StringFormatChecker(BaseChecker):
137
- """Checks string formatting operations to ensure that the format string
138
- is valid and the arguments match the format string.
139
- """
140
- __implements__ = (IASTNGChecker,)
141
- name = 'string_format'
142
- msgs = MSGS
143
- def visit_binop(self, node):
144
- if node.op != '%':
145
- return
146
- f = node.left
147
- args = node.right
148
- if isinstance(f, astng.Const) and isinstance(f.value, basestring):
149
- format_string = f.value
150
- try:
151
- required_keys, required_num_args = \
152
- parse_format_string(format_string)
153
- except UnsupportedFormatCharacterException, e:
154
- c = format_string[e.index]
155
- self.add_message('E9900', node=node, args=(c, ord(c), e.index))
156
- except IncompleteFormatStringException:
157
- self.add_message('E9901', node=node)
158
- else:
159
- if required_keys and required_num_args:
160
- # The format string uses both named and unnamed format
161
- # specifiers.
162
- self.add_message('E9902', node=node)
163
- elif required_keys:
164
- # The format string uses only named format specifiers.
165
- # Check that the RHS of the % operator is a mapping object
166
- # that contains precisely the set of keys required by the
167
- # format string.
168
- if isinstance(args, astng.Dict):
169
- keys = set()
170
- unknown_keys = False
171
- for k, v in args.items:
172
- if isinstance(k, astng.Const):
173
- key = k.value
174
- if isinstance(key, basestring):
175
- keys.add(key)
176
- else:
177
- self.add_message('W9900',
178
- node=node,
179
- args=key)
180
- else:
181
- # One of the keys was something other than a
182
- # constant. Since we can't tell what it is,
183
- # supress checks for missing keys in the
184
- # dictionary.
185
- unknown_keys = True
186
- if not unknown_keys:
187
- for key in required_keys:
188
- if key not in keys:
189
- self.add_message('E9904',
190
- node=node,
191
- args=key)
192
- for key in keys:
193
- if key not in required_keys:
194
- self.add_message('W9901', node=node, args=key)
195
- elif (isinstance(args, astng.Const) or
196
- isinstance(args, astng.Tuple) or
197
- isinstance(args, astng.List) or
198
- isinstance(args, astng.ListComp) or
199
- isinstance(args, astng.GenExpr) or
200
- isinstance(args, astng.Backquote) or
201
- isinstance(args, astng.Lambda)):
202
- type_name = type(args).__name__
203
- self.add_message('E9903', node=node, args=type_name)
204
- else:
205
- # The RHS of the format specifier is a name or
206
- # expression. It may be a mapping object, so
207
- # there's nothing we can check.
208
- pass
209
- else:
210
- # The format string uses only unnamed format specifiers.
211
- # Check that the number of arguments passed to the RHS of
212
- # the % operator matches the number required by the format
213
- # string.
214
- if isinstance(args, astng.Tuple):
215
- num_args = len(args.elts)
216
- elif (isinstance(args, astng.Const) or
217
- isinstance(args, astng.Dict) or
218
- isinstance(args, astng.List) or
219
- isinstance(args, astng.ListComp) or
220
- isinstance(args, astng.GenExpr) or
221
- isinstance(args, astng.Backquote) or
222
- isinstance(args, astng.Lambda) or
223
- isinstance(args, astng.Function)):
224
- num_args = 1
225
- else:
226
- # The RHS of the format specifier is a name or
227
- # expression. It could be a tuple of unknown size, so
228
- # there's nothing we can check.
229
- num_args = None
230
- if num_args is not None:
231
- if num_args > required_num_args:
232
- self.add_message('E9905', node=node)
233
- elif num_args < required_num_args:
234
- self.add_message('E9906', node=node)
235
-
236
-
237
- def register(linter):
238
- """required method to auto register this checker """
239
- linter.register_checker(StringFormatChecker(linter))
@@ -1,364 +0,0 @@
1
- # Copyright (c) 2006-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
- """try to find more bugs in the code using astng inference capabilities
17
- """
18
-
19
- from logilab.common.compat import set
20
-
21
-
22
- from logilab import astng
23
- from logilab.astng import InferenceError, NotFoundError, YES, Instance
24
-
25
- from pylint.interfaces import IASTNGChecker
26
- from pylint.checkers import BaseChecker
27
- from pylint.checkers.utils import safe_infer, is_super
28
-
29
- MSGS = {
30
- 'E1101': ('%s %r has no %r member',
31
- 'Used when a variable is accessed for an unexistent member.'),
32
- 'E1102': ('%s is not callable',
33
- 'Used when an object being called has been inferred to a non \
34
- callable object'),
35
- 'E1103': ('%s %r has no %r member (but some types could not be inferred)',
36
- 'Used when a variable is accessed for an unexistent member, but \
37
- astng was not able to interpret all possible types of this \
38
- variable.'),
39
- 'E1111': ('Assigning to function call which doesn\'t return',
40
- 'Used when an assignment is done on a function call but the \
41
- inferred function doesn\'t return anything.'),
42
- 'W1111': ('Assigning to function call which only returns None',
43
- 'Used when an assignment is done on a function call but the \
44
- inferred function returns nothing but None.'),
45
-
46
- 'E1120': ('No value passed for parameter %s in function call',
47
- 'Used when a function call passes too few arguments.'),
48
- 'E1121': ('Too many positional arguments for function call',
49
- 'Used when a function call passes too many positional \
50
- arguments.'),
51
- 'E1122': ('Duplicate keyword argument %r in function call',
52
- 'Used when a function call passes the same keyword argument \
53
- multiple times.'),
54
- 'E1123': ('Passing unexpected keyword argument %r in function call',
55
- 'Used when a function call passes a keyword argument that \
56
- doesn\'t correspond to one of the function\'s parameter names.'),
57
- 'E1124': ('Multiple values passed for parameter %r in function call',
58
- 'Used when a function call would result in assigning multiple \
59
- values to a function parameter, one value from a positional \
60
- argument and one from a keyword argument.'),
61
- }
62
-
63
- class TypeChecker(BaseChecker):
64
- """try to find bugs in the code using type inference
65
- """
66
-
67
- __implements__ = (IASTNGChecker,)
68
-
69
- # configuration section name
70
- name = 'typecheck'
71
- # messages
72
- msgs = MSGS
73
- priority = -1
74
- # configuration options
75
- options = (('ignore-mixin-members',
76
- {'default' : True, 'type' : 'yn', 'metavar': '<y_or_n>',
77
- 'help' : 'Tells whether missing members accessed in mixin \
78
- class should be ignored. A mixin class is detected if its name ends with \
79
- "mixin" (case insensitive).'}
80
- ),
81
-
82
- ('ignored-classes',
83
- {'default' : ('SQLObject',),
84
- 'type' : 'csv',
85
- 'metavar' : '<members names>',
86
- 'help' : 'List of classes names for which member attributes \
87
- should not be checked (useful for classes with attributes dynamically set).'}
88
- ),
89
-
90
- ('zope',
91
- {'default' : False, 'type' : 'yn', 'metavar': '<y_or_n>',
92
- 'help' : 'When zope mode is activated, add a predefined set \
93
- of Zope acquired attributes to generated-members.'}
94
- ),
95
- ('generated-members',
96
- {'default' : (
97
- 'REQUEST', 'acl_users', 'aq_parent'),
98
- 'type' : 'csv',
99
- 'metavar' : '<members names>',
100
- 'help' : 'List of members which are set dynamically and \
101
- missed by pylint inference system, and so shouldn\'t trigger E0201 when \
102
- accessed.'}
103
- ),
104
- )
105
- def __init__(self, linter=None):
106
- BaseChecker.__init__(self, linter)
107
- self.generated_members = list(self.config.generated_members)
108
- if self.config.zope:
109
- self.generated_members.extend(('REQUEST', 'acl_users', 'aq_parent'))
110
-
111
- def visit_assattr(self, node):
112
- if isinstance(node.ass_type(), astng.AugAssign):
113
- self.visit_getattr(node)
114
-
115
- def visit_delattr(self, node):
116
- self.visit_getattr(node)
117
-
118
- def visit_getattr(self, node):
119
- """check that the accessed attribute exists
120
-
121
- to avoid to much false positives for now, we'll consider the code as
122
- correct if a single of the inferred nodes has the accessed attribute.
123
-
124
- function/method, super call and metaclasses are ignored
125
- """
126
- if node.attrname in self.generated_members:
127
- # attribute is marked as generated, stop here
128
- return
129
- try:
130
- infered = list(node.expr.infer())
131
- except InferenceError:
132
- return
133
- # list of (node, nodename) which are missing the attribute
134
- missingattr = set()
135
- ignoremim = self.config.ignore_mixin_members
136
- inference_failure = False
137
- for owner in infered:
138
- # skip yes object
139
- if owner is YES:
140
- inference_failure = True
141
- continue
142
- # skip None anyway
143
- if isinstance(owner, astng.Const) and owner.value is None:
144
- continue
145
- # XXX "super" / metaclass call
146
- if is_super(owner) or getattr(owner, 'type', None) == 'metaclass':
147
- continue
148
- name = getattr(owner, 'name', 'None')
149
- if name in self.config.ignored_classes:
150
- continue
151
- if ignoremim and name[-5:].lower() == 'mixin':
152
- continue
153
- try:
154
- if not [n for n in owner.getattr(node.attrname)
155
- if not isinstance(n.statement(), astng.AugAssign)]:
156
- missingattr.add((owner, name))
157
- continue
158
- except AttributeError:
159
- # XXX method / function
160
- continue
161
- except NotFoundError:
162
- if isinstance(owner, Instance) and owner.has_dynamic_getattr():
163
- continue
164
- # explicit skipping of optparse'Values class
165
- if owner.name == 'Values' and \
166
- owner.root().name in ('optik', 'optparse'):
167
- continue
168
- missingattr.add((owner, name))
169
- continue
170
- # stop on the first found
171
- break
172
- else:
173
- # we have not found any node with the attributes, display the
174
- # message for infered nodes
175
- done = set()
176
- for owner, name in missingattr:
177
- if isinstance(owner, Instance):
178
- actual = owner._proxied
179
- else:
180
- actual = owner
181
- if actual in done:
182
- continue
183
- done.add(actual)
184
- if inference_failure:
185
- msgid = 'E1103'
186
- else:
187
- msgid = 'E1101'
188
- self.add_message(msgid, node=node,
189
- args=(owner.display_type(), name,
190
- node.attrname))
191
-
192
-
193
- def visit_assign(self, node):
194
- """check that if assigning to a function call, the function is
195
- possibly returning something valuable
196
- """
197
- if not isinstance(node.value, astng.CallFunc):
198
- return
199
- function_node = safe_infer(node.value.func)
200
- # skip class, generator and incomplete function definition
201
- if not (isinstance(function_node, astng.Function) and
202
- function_node.root().fully_defined()):
203
- return
204
- if function_node.is_generator() \
205
- or function_node.is_abstract(pass_is_abstract=False):
206
- return
207
- returns = list(function_node.nodes_of_class(astng.Return,
208
- skip_klass=astng.Function))
209
- if len(returns) == 0:
210
- self.add_message('E1111', node=node)
211
- else:
212
- for rnode in returns:
213
- if not (isinstance(rnode.value, astng.Const)
214
- and rnode.value.value is None):
215
- break
216
- else:
217
- self.add_message('W1111', node=node)
218
-
219
- def visit_callfunc(self, node):
220
- """check that called functions/methods are inferred to callable objects,
221
- and that the arguments passed to the function match the parameters in
222
- the inferred function's definition
223
- """
224
-
225
- # Build the set of keyword arguments, checking for duplicate keywords,
226
- # and count the positional arguments.
227
- keyword_args = set()
228
- num_positional_args = 0
229
- for arg in node.args:
230
- if isinstance(arg, astng.Keyword):
231
- keyword = arg.arg
232
- if keyword in keyword_args:
233
- self.add_message('E1122', node=node, args=keyword)
234
- keyword_args.add(keyword)
235
- else:
236
- num_positional_args += 1
237
-
238
- called = safe_infer(node.func)
239
- # only function, generator and object defining __call__ are allowed
240
- if called is not None and not called.callable():
241
- self.add_message('E1102', node=node, args=node.func.as_string())
242
-
243
- # Note that BoundMethod is a subclass of UnboundMethod (huh?), so must
244
- # come first in this 'if..else'.
245
- if isinstance(called, astng.BoundMethod):
246
- # Bound methods have an extra implicit 'self' argument.
247
- num_positional_args += 1
248
- elif isinstance(called, astng.UnboundMethod):
249
- if called.decorators is not None:
250
- for d in called.decorators.nodes:
251
- if isinstance(d, astng.Name) and (d.name == 'classmethod'):
252
- # Class methods have an extra implicit 'cls' argument.
253
- num_positional_args += 1
254
- break
255
- elif (isinstance(called, astng.Function) or
256
- isinstance(called, astng.Lambda)):
257
- pass
258
- else:
259
- return
260
-
261
- if called.args.args is None:
262
- # Built-in functions have no argument information.
263
- return
264
-
265
- if len( called.argnames() ) != len( set( called.argnames() ) ):
266
- # Duplicate parameter name (see E9801). We can't really make sense
267
- # of the function call in this case, so just return.
268
- return
269
-
270
- # Analyze the list of formal parameters.
271
- num_mandatory_parameters = len(called.args.args) - len(called.args.defaults)
272
- parameters = []
273
- parameter_name_to_index = {}
274
- for i, arg in enumerate(called.args.args):
275
- if isinstance(arg, astng.Tuple):
276
- name = None
277
- # Don't store any parameter names within the tuple, since those
278
- # are not assignable from keyword arguments.
279
- else:
280
- if isinstance(arg, astng.Keyword):
281
- name = arg.arg
282
- else:
283
- assert isinstance(arg, astng.AssName)
284
- # This occurs with:
285
- # def f( (a), (b) ): pass
286
- name = arg.name
287
- parameter_name_to_index[name] = i
288
- if i >= num_mandatory_parameters:
289
- defval = called.args.defaults[i - num_mandatory_parameters]
290
- else:
291
- defval = None
292
- parameters.append([(name, defval), False])
293
-
294
- # Match the supplied arguments against the function parameters.
295
-
296
- # 1. Match the positional arguments.
297
- for i in range(num_positional_args):
298
- if i < len(parameters):
299
- parameters[i][1] = True
300
- elif called.args.vararg is not None:
301
- # The remaining positional arguments get assigned to the *args
302
- # parameter.
303
- break
304
- else:
305
- # Too many positional arguments.
306
- self.add_message('E1121', node=node)
307
- break
308
-
309
- # 2. Match the keyword arguments.
310
- for keyword in keyword_args:
311
- if keyword in parameter_name_to_index:
312
- i = parameter_name_to_index[keyword]
313
- if parameters[i][1]:
314
- # Duplicate definition of function parameter.
315
- self.add_message('E1124', node=node, args=keyword)
316
- else:
317
- parameters[i][1] = True
318
- elif called.args.kwarg is not None:
319
- # The keyword argument gets assigned to the **kwargs parameter.
320
- pass
321
- else:
322
- # Unexpected keyword argument.
323
- self.add_message('E1123', node=node, args=keyword)
324
-
325
- # 3. Match the *args, if any. Note that Python actually processes
326
- # *args _before_ any keyword arguments, but we wait until after
327
- # looking at the keyword arguments so as to make a more conservative
328
- # guess at how many values are in the *args sequence.
329
- if node.starargs is not None:
330
- for i in range(num_positional_args, len(parameters)):
331
- [(name, defval), assigned] = parameters[i]
332
- # Assume that *args provides just enough values for all
333
- # non-default parameters after the last parameter assigned by
334
- # the positional arguments but before the first parameter
335
- # assigned by the keyword arguments. This is the best we can
336
- # get without generating any false positives.
337
- if (defval is not None) or assigned:
338
- break
339
- parameters[i][1] = True
340
-
341
- # 4. Match the **kwargs, if any.
342
- if node.kwargs is not None:
343
- for i, [(name, defval), assigned] in enumerate(parameters):
344
- # Assume that *kwargs provides values for all remaining
345
- # unassigned named parameters.
346
- if name is not None:
347
- parameters[i][1] = True
348
- else:
349
- # **kwargs can't assign to tuples.
350
- pass
351
-
352
- # Check that any parameters without a default have been assigned
353
- # values.
354
- for [(name, defval), assigned] in parameters:
355
- if (defval is None) and not assigned:
356
- if name is None:
357
- display = '<tuple>'
358
- else:
359
- display_name = repr(name)
360
- self.add_message('E1120', node=node, args=display_name)
361
-
362
- def register(linter):
363
- """required method to auto register this checker """
364
- linter.register_checker(TypeChecker(linter))