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,951 +0,0 @@
1
- # This program is free software; you can redistribute it and/or modify it under
2
- # the terms of the GNU Lesser General Public License as published by the Free Software
3
- # Foundation; either version 2 of the License, or (at your option) any later
4
- # version.
5
- #
6
- # This program is distributed in the hope that it will be useful, but WITHOUT
7
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
8
- # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
9
- #
10
- # You should have received a copy of the GNU Lesser General Public License along with
11
- # this program; if not, write to the Free Software Foundation, Inc.,
12
- # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
13
- # copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
14
- # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
15
- # copyright 2003-2010 Sylvain Thenault, all rights reserved.
16
- # contact mailto:thenault@gmail.com
17
- #
18
- # This file is part of logilab-astng.
19
- #
20
- # logilab-astng is free software: you can redistribute it and/or modify it
21
- # under the terms of the GNU Lesser General Public License as published by the
22
- # Free Software Foundation, either version 2.1 of the License, or (at your
23
- # option) any later version.
24
- #
25
- # logilab-astng is distributed in the hope that it will be useful, but
26
- # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
27
- # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
28
- # for more details.
29
- #
30
- # You should have received a copy of the GNU Lesser General Public License along
31
- # with logilab-astng. If not, see <http://www.gnu.org/licenses/>.
32
- """This module contains the classes for "scoped" node, i.e. which are opening a
33
- new local scope in the language definition : Module, Class, Function (and
34
- Lambda and GenExpr to some extends).
35
-
36
- """
37
- from __future__ import generators
38
-
39
- __doctype__ = "restructuredtext en"
40
-
41
- import __builtin__
42
- import sys
43
-
44
- from logilab.common.compat import chain, set
45
- from logilab.common.decorators import cached
46
-
47
- from logilab.astng import MANAGER, NotFoundError, NoDefault, \
48
- ASTNGBuildingException, InferenceError
49
- from logilab.astng.node_classes import (Const, DelName, DelAttr,
50
- Dict, From, List, Name, Pass, Raise, Return, Tuple, Yield,
51
- are_exclusive, LookupMixIn, const_factory as cf, unpack_infer)
52
- from logilab.astng.bases import (NodeNG, BaseClass, InferenceContext, Instance,
53
- YES, Generator, UnboundMethod, BoundMethod, _infer_stmts, copy_context)
54
- from logilab.astng.mixins import (StmtMixIn, FilterStmtsMixin)
55
-
56
- from logilab.astng.nodes_as_string import as_string
57
-
58
-
59
- def remove_nodes(func, cls):
60
- def wrapper(*args, **kwargs):
61
- nodes = [n for n in func(*args, **kwargs) if not isinstance(n, cls)]
62
- if not nodes:
63
- raise NotFoundError()
64
- return nodes
65
- return wrapper
66
-
67
-
68
- def function_to_method(n, klass):
69
- if isinstance(n, Function):
70
- if n.type == 'classmethod':
71
- return BoundMethod(n, klass)
72
- if n.type != 'staticmethod':
73
- return UnboundMethod(n)
74
- return n
75
-
76
- def std_special_attributes(self, name, add_locals=True):
77
- if add_locals:
78
- locals = self.locals
79
- else:
80
- locals = {}
81
- if name == '__name__':
82
- return [cf(self.name)] + locals.get(name, [])
83
- if name == '__doc__':
84
- return [cf(self.doc)] + locals.get(name, [])
85
- if name == '__dict__':
86
- return [Dict()] + locals.get(name, [])
87
- raise NotFoundError(name)
88
-
89
-
90
-
91
- def builtin_lookup(name):
92
- """lookup a name into the builtin module
93
- return the list of matching statements and the astng for the builtin
94
- module
95
- """
96
- # TODO : once there is no more monkey patching, make a BUILTINASTNG const
97
- builtinastng = MANAGER.astng_from_module(__builtin__)
98
- if name == '__dict__':
99
- return builtinastng, ()
100
- try:
101
- stmts = builtinastng.locals[name]
102
- except KeyError:
103
- stmts = ()
104
- return builtinastng, stmts
105
-
106
-
107
- # TODO move this Mixin to mixins.py; problem: 'Function' in _scope_lookup
108
- class LocalsDictNodeNG(LookupMixIn, NodeNG):
109
- """ this class provides locals handling common to Module, Function
110
- and Class nodes, including a dict like interface for direct access
111
- to locals information
112
- """
113
-
114
- # attributes below are set by the builder module or by raw factories
115
-
116
- # dictionary of locals with name as key and node defining the local as
117
- # value
118
-
119
- def qname(self):
120
- """return the 'qualified' name of the node, eg module.name,
121
- module.class.name ...
122
- """
123
- if self.parent is None:
124
- return self.name
125
- return '%s.%s' % (self.parent.frame().qname(), self.name)
126
-
127
- def frame(self):
128
- """return the first parent frame node (i.e. Module, Function or Class)
129
- """
130
- return self
131
-
132
- def scope(self):
133
- """return the first node defining a new scope (i.e. Module,
134
- Function, Class, Lambda but also GenExpr)
135
- """
136
- return self
137
-
138
-
139
- def _scope_lookup(self, node, name, offset=0):
140
- """XXX method for interfacing the scope lookup"""
141
- try:
142
- stmts = node._filter_stmts(self.locals[name], self, offset)
143
- except KeyError:
144
- stmts = ()
145
- if stmts:
146
- return self, stmts
147
- if self.parent: # i.e. not Module
148
- # nested scope: if parent scope is a function, that's fine
149
- # else jump to the module
150
- pscope = self.parent.scope()
151
- if not isinstance(pscope, Function):
152
- pscope = pscope.root()
153
- return pscope.scope_lookup(node, name)
154
- return builtin_lookup(name) # Module
155
-
156
-
157
-
158
- def set_local(self, name, stmt):
159
- """define <name> in locals (<stmt> is the node defining the name)
160
- if the node is a Module node (i.e. has globals), add the name to
161
- globals
162
-
163
- if the name is already defined, ignore it
164
- """
165
- #assert not stmt in self.locals.get(name, ()), (self, stmt)
166
- self.locals.setdefault(name, []).append(stmt)
167
-
168
- __setitem__ = set_local
169
-
170
- def _append_node(self, child):
171
- """append a child, linking it in the tree"""
172
- self.body.append(child)
173
- child.parent = self
174
-
175
- def add_local_node(self, child_node, name=None):
176
- """append a child which should alter locals to the given node"""
177
- if name != '__class__':
178
- # add __class__ node as a child will cause infinite recursion later!
179
- self._append_node(child_node)
180
- self.set_local(name or child_node.name, child_node)
181
-
182
-
183
- def __getitem__(self, item):
184
- """method from the `dict` interface returning the first node
185
- associated with the given name in the locals dictionary
186
-
187
- :type item: str
188
- :param item: the name of the locally defined object
189
- :raises KeyError: if the name is not defined
190
- """
191
- return self.locals[item][0]
192
-
193
- def __iter__(self):
194
- """method from the `dict` interface returning an iterator on
195
- `self.keys()`
196
- """
197
- return iter(self.keys())
198
-
199
- def keys(self):
200
- """method from the `dict` interface returning a tuple containing
201
- locally defined names
202
- """
203
- return self.locals.keys()
204
-
205
- def values(self):
206
- """method from the `dict` interface returning a tuple containing
207
- locally defined nodes which are instance of `Function` or `Class`
208
- """
209
- return [self[key] for key in self.keys()]
210
-
211
- def items(self):
212
- """method from the `dict` interface returning a list of tuple
213
- containing each locally defined name with its associated node,
214
- which is an instance of `Function` or `Class`
215
- """
216
- return zip(self.keys(), self.values())
217
-
218
- def has_key(self, name):
219
- """method from the `dict` interface returning True if the given
220
- name is defined in the locals dictionary
221
- """
222
- return self.locals.has_key(name)
223
-
224
- __contains__ = has_key
225
-
226
-
227
- # Module #####################################################################
228
-
229
- class Module(LocalsDictNodeNG):
230
- _astng_fields = ('body',)
231
-
232
- fromlineno = 0
233
- lineno = 0
234
-
235
- # attributes below are set by the builder module or by raw factories
236
-
237
- # the file from which as been extracted the astng representation. It may
238
- # be None if the representation has been built from a built-in module
239
- file = None
240
- # the module name
241
- name = None
242
- # boolean for astng built from source (i.e. ast)
243
- pure_python = None
244
- # boolean for package module
245
- package = None
246
- # dictionary of globals with name as key and node defining the global
247
- # as value
248
- globals = None
249
-
250
- # names of python special attributes (handled by getattr impl.)
251
- special_attributes = set(('__name__', '__doc__', '__file__', '__path__',
252
- '__dict__'))
253
- # names of module attributes available through the global scope
254
- scope_attrs = set(('__name__', '__doc__', '__file__', '__path__'))
255
-
256
- def __init__(self, name, doc, pure_python=True):
257
- self.name = name
258
- self.doc = doc
259
- self.pure_python = pure_python
260
- self.locals = self.globals = {}
261
- self.body = []
262
-
263
- # Module is not a Statement node but needs the replace method (see StmtMixIn)
264
- def replace(self, child, newchild):
265
- sequence = self.child_sequence(child)
266
- newchild.parent = self
267
- child.parent = None
268
- sequence[sequence.index(child)] = newchild
269
-
270
- def block_range(self, lineno):
271
- """return block line numbers.
272
-
273
- start from the beginning whatever the given lineno
274
- """
275
- return self.fromlineno, self.tolineno
276
-
277
- def scope_lookup(self, node, name, offset=0):
278
- if name in self.scope_attrs and not name in self.locals:
279
- try:
280
- return self, self.getattr(name)
281
- except NotFoundError:
282
- return self, ()
283
- return self._scope_lookup(node, name, offset)
284
-
285
- def pytype(self):
286
- return '__builtin__.module'
287
-
288
- def display_type(self):
289
- return 'Module'
290
-
291
- def getattr(self, name, context=None):
292
- if not name in self.special_attributes:
293
- try:
294
- return self.locals[name]
295
- except KeyError:
296
- pass
297
- else:
298
- if name == '__file__':
299
- return [cf(self.file)] + self.locals.get(name, [])
300
- if name == '__path__':
301
- if self.package:
302
- return [List()] + self.locals.get(name, [])
303
- return std_special_attributes(self, name)
304
- if self.package:
305
- try:
306
- return [self.import_module(name, relative_only=True)]
307
- except (KeyboardInterrupt, SystemExit):
308
- raise
309
- except:
310
- pass
311
- raise NotFoundError(name)
312
- getattr = remove_nodes(getattr, DelName)
313
-
314
- def igetattr(self, name, context=None):
315
- """inferred getattr"""
316
- # set lookup name since this is necessary to infer on import nodes for
317
- # instance
318
- context = copy_context(context)
319
- context.lookupname = name
320
- try:
321
- return _infer_stmts(self.getattr(name, context), context, frame=self)
322
- except NotFoundError:
323
- raise InferenceError(name)
324
-
325
- def fully_defined(self):
326
- """return True if this module has been built from a .py file
327
- and so contains a complete representation including the code
328
- """
329
- return self.file is not None and self.file.endswith('.py')
330
-
331
- def statement(self):
332
- """return the first parent node marked as statement node
333
- consider a module as a statement...
334
- """
335
- return self
336
-
337
- def previous_sibling(self):
338
- """module has no sibling"""
339
- return
340
-
341
- def next_sibling(self):
342
- """module has no sibling"""
343
- return
344
-
345
- def absolute_import_activated(self):
346
- for stmt in self.locals.get('absolute_import', ()):
347
- if isinstance(stmt, From) and stmt.modname == '__future__':
348
- return True
349
- return False
350
-
351
- def import_module(self, modname, relative_only=False, level=None):
352
- """import the given module considering self as context"""
353
- try:
354
- absmodname = self.absolute_modname(modname, level)
355
- return MANAGER.astng_from_module_name(absmodname)
356
- except ASTNGBuildingException:
357
- # we only want to import a sub module or package of this module,
358
- # skip here
359
- if relative_only:
360
- raise
361
- module = MANAGER.astng_from_module_name(modname)
362
- return module
363
-
364
- def absolute_modname(self, modname, level):
365
- if self.absolute_import_activated() and not level:
366
- return modname
367
- if level:
368
- parts = self.name.split('.')
369
- if self.package:
370
- parts.append('__init__')
371
- package_name = '.'.join(parts[:-level])
372
- elif self.package:
373
- package_name = self.name
374
- else:
375
- package_name = '.'.join(self.name.split('.')[:-1])
376
- if package_name:
377
- return '%s.%s' % (package_name, modname)
378
- return modname
379
-
380
- def wildcard_import_names(self):
381
- """return the list of imported names when this module is 'wildcard
382
- imported'
383
-
384
- It doesn't include the '__builtins__' name which is added by the
385
- current CPython implementation of wildcard imports.
386
- """
387
- # take advantage of a living module if it exists
388
- try:
389
- living = sys.modules[self.name]
390
- except KeyError:
391
- pass
392
- else:
393
- try:
394
- return living.__all__
395
- except AttributeError:
396
- return [name for name in living.__dict__.keys()
397
- if not name.startswith('_')]
398
- # else lookup the astng
399
- #
400
- # We separate the different steps of lookup in try/excepts
401
- # to avoid catching too many Exceptions
402
- # However, we can not analyse dynamically constructed __all__
403
- try:
404
- all = self['__all__']
405
- except KeyError:
406
- return [name for name in self.keys() if not name.startswith('_')]
407
- try:
408
- explicit = all.assigned_stmts().next()
409
- except InferenceError:
410
- return [name for name in self.keys() if not name.startswith('_')]
411
- except AttributeError:
412
- # not an assignment node
413
- # XXX infer?
414
- return [name for name in self.keys() if not name.startswith('_')]
415
- try:
416
- # should be a Tuple/List of constant string / 1 string not allowed
417
- return [const.value for const in explicit.elts]
418
- except AttributeError:
419
- return [name for name in self.keys() if not name.startswith('_')]
420
-
421
-
422
- class GenExpr(LocalsDictNodeNG):
423
- _astng_fields = ('elt', 'generators')
424
-
425
- def __init__(self):
426
- self.locals = {}
427
- self.elt = None
428
- self.generators = []
429
-
430
- def frame(self):
431
- return self.parent.frame()
432
- GenExpr.scope_lookup = LocalsDictNodeNG._scope_lookup
433
-
434
-
435
- # Function ###################################################################
436
-
437
-
438
- class Lambda(LocalsDictNodeNG, FilterStmtsMixin):
439
- _astng_fields = ('args', 'body',)
440
-
441
- # function's type, 'function' | 'method' | 'staticmethod' | 'classmethod'
442
- type = 'function'
443
-
444
- def __init__(self):
445
- self.locals = {}
446
- self.args = []
447
- self.body = []
448
-
449
- def pytype(self):
450
- if 'method' in self.type:
451
- return '__builtin__.instancemethod'
452
- return '__builtin__.function'
453
-
454
- def display_type(self):
455
- if 'method' in self.type:
456
- return 'Method'
457
- return 'Function'
458
-
459
- def callable(self):
460
- return True
461
-
462
- def argnames(self):
463
- """return a list of argument names"""
464
- if self.args.args: # maybe None with builtin functions
465
- names = _rec_get_names(self.args.args)
466
- else:
467
- names = []
468
- if self.args.vararg:
469
- names.append(self.args.vararg)
470
- if self.args.kwarg:
471
- names.append(self.args.kwarg)
472
- return names
473
-
474
- def infer_call_result(self, caller, context=None):
475
- """infer what a function is returning when called"""
476
- return self.body.infer(context)
477
-
478
- def scope_lookup(self, node, name, offset=0):
479
- if node in self.args.defaults:
480
- frame = self.parent.frame()
481
- # line offset to avoid that def func(f=func) resolve the default
482
- # value to the defined function
483
- offset = -1
484
- else:
485
- # check this is not used in function decorators
486
- frame = self
487
- return frame._scope_lookup(node, name, offset)
488
-
489
- class Function(StmtMixIn, Lambda):
490
- _astng_fields = ('decorators', 'args', 'body')
491
-
492
- special_attributes = set(('__name__', '__doc__', '__dict__'))
493
- # attributes below are set by the builder module or by raw factories
494
-
495
- blockstart_tolineno = None
496
-
497
- def __init__(self, name, doc):
498
- self.locals = {}
499
- self.args = []
500
- self.body = []
501
- self.decorators = None
502
- self.name = name
503
- self.doc = doc
504
-
505
- def set_line_info(self, lastchild):
506
- self.fromlineno = self.lineno
507
- # lineno is the line number of the first decorator, we want the def statement lineno
508
- if self.decorators is not None:
509
- self.fromlineno += len(self.decorators.nodes)
510
- self.tolineno = lastchild.tolineno
511
- self.blockstart_tolineno = self.args.tolineno
512
-
513
- def block_range(self, lineno):
514
- """return block line numbers.
515
-
516
- start from the "def" position whatever the given lineno
517
- """
518
- return self.fromlineno, self.tolineno
519
-
520
- def getattr(self, name, context=None):
521
- """this method doesn't look in the instance_attrs dictionary since it's
522
- done by an Instance proxy at inference time.
523
- """
524
- if name == '__module__':
525
- return [cf(self.root().qname())]
526
- return std_special_attributes(self, name, False)
527
-
528
- def is_method(self):
529
- """return true if the function node should be considered as a method"""
530
- # check we are defined in a Class, because this is usually expected
531
- # (e.g. pylint...) when is_method() return True
532
- return self.type != 'function' and isinstance(self.parent.frame(), Class)
533
-
534
- @cached
535
- def decoratornames(self):
536
- """return a list of decorator qualified names"""
537
- result = set()
538
- decoratornodes = []
539
- if self.decorators is not None:
540
- decoratornodes += self.decorators.nodes
541
- decoratornodes += getattr(self, 'extra_decorators', [])
542
- for decnode in decoratornodes:
543
- for infnode in decnode.infer():
544
- result.add(infnode.qname())
545
- return result
546
-
547
-
548
- def is_bound(self):
549
- """return true if the function is bound to an Instance or a class"""
550
- return self.type == 'classmethod'
551
-
552
- def is_abstract(self, pass_is_abstract=True):
553
- """return true if the method is abstract
554
- It's considered as abstract if the only statement is a raise of
555
- NotImplementError, or, if pass_is_abstract, a pass statement
556
- """
557
- for child_node in self.body:
558
- if isinstance(child_node, Raise) and child_node.type:
559
- try:
560
- name = child_node.type.nodes_of_class(Name).next()
561
- if name.name == 'NotImplementedError':
562
- return True
563
- except StopIteration:
564
- pass
565
- if pass_is_abstract and isinstance(child_node, Pass):
566
- return True
567
- return False
568
- # empty function is the same as function with a single "pass" statement
569
- if pass_is_abstract:
570
- return True
571
-
572
- def is_generator(self):
573
- """return true if this is a generator function"""
574
- # XXX should be flagged, not computed
575
- try:
576
- return self.nodes_of_class(Yield, skip_klass=Function).next()
577
- except StopIteration:
578
- return False
579
-
580
- def infer_call_result(self, caller, context=None):
581
- """infer what a function is returning when called"""
582
- if self.is_generator():
583
- yield Generator(self)
584
- return
585
- returns = self.nodes_of_class(Return, skip_klass=Function)
586
- for returnnode in returns:
587
- if returnnode.value is None:
588
- yield None
589
- else:
590
- try:
591
- for infered in returnnode.value.infer(context):
592
- yield infered
593
- except InferenceError:
594
- yield YES
595
-
596
-
597
-
598
- def _rec_get_names(args, names=None):
599
- """return a list of all argument names"""
600
- if names is None:
601
- names = []
602
- for arg in args:
603
- if isinstance(arg, Tuple):
604
- _rec_get_names(arg.elts, names)
605
- else:
606
- names.append(arg.name)
607
- return names
608
-
609
-
610
- def _format_args(args, defaults=None):
611
- values = []
612
- if args is None:
613
- return ''
614
- if defaults is not None:
615
- default_offset = len(args) - len(defaults)
616
- for i, arg in enumerate(args):
617
- if isinstance(arg, Tuple):
618
- values.append('(%s)' % _format_args(arg.elts))
619
- else:
620
- values.append(arg.name)
621
- if defaults is not None and i >= default_offset:
622
- values[-1] += '=' + defaults[i-default_offset].as_string()
623
- return ', '.join(values)
624
-
625
-
626
- # Class ######################################################################
627
-
628
- def _class_type(klass):
629
- """return a Class node type to differ metaclass, interface and exception
630
- from 'regular' classes
631
- """
632
- if klass._type is not None:
633
- return klass._type
634
- if klass.name == 'type':
635
- klass._type = 'metaclass'
636
- elif klass.name.endswith('Interface'):
637
- klass._type = 'interface'
638
- elif klass.name.endswith('Exception'):
639
- klass._type = 'exception'
640
- else:
641
- for base in klass.ancestors(recurs=False):
642
- if base.type != 'class':
643
- klass._type = base.type
644
- break
645
- if klass._type is None:
646
- klass._type = 'class'
647
- return klass._type
648
-
649
- def _iface_hdlr(iface_node):
650
- """a handler function used by interfaces to handle suspicious
651
- interface nodes
652
- """
653
- return True
654
-
655
-
656
- class Class(StmtMixIn, LocalsDictNodeNG, FilterStmtsMixin):
657
-
658
- # some of the attributes below are set by the builder module or
659
- # by a raw factories
660
-
661
- # a dictionary of class instances attributes
662
- _astng_fields = ('bases', 'body',) # name
663
-
664
- instance_attrs = None
665
- special_attributes = set(('__name__', '__doc__', '__dict__', '__module__',
666
- '__bases__', '__mro__'))
667
-
668
- blockstart_tolineno = None
669
-
670
- _type = None
671
- type = property(_class_type,
672
- doc="class'type, possible values are 'class' | "
673
- "'metaclass' | 'interface' | 'exception'")
674
-
675
- def __init__(self, name, doc):
676
- self.instance_attrs = {}
677
- self.locals = {}
678
- self.bases = []
679
- self.body = []
680
- self.name = name
681
- self.doc = doc
682
-
683
- def _newstyle_impl(self, context=None):
684
- if context is None:
685
- context = InferenceContext()
686
- if self._newstyle is not None:
687
- return self._newstyle
688
- for base in self.ancestors(recurs=False, context=context):
689
- if base._newstyle_impl(context):
690
- self._newstyle = True
691
- break
692
- if self._newstyle is None:
693
- self._newstyle = False
694
- return self._newstyle
695
-
696
- _newstyle = None
697
- newstyle = property(_newstyle_impl,
698
- doc="boolean indicating if it's a new style class"
699
- "or not")
700
-
701
- def set_line_info(self, lastchild):
702
- self.fromlineno = self.lineno
703
- self.blockstart_tolineno = self.bases and self.bases[-1].tolineno or self.fromlineno
704
- if lastchild is not None:
705
- self.tolineno = lastchild.tolineno
706
- # else this is a class with only a docstring, then tolineno is (should be) already ok
707
-
708
- def block_range(self, lineno):
709
- """return block line numbers.
710
-
711
- start from the "class" position whatever the given lineno
712
- """
713
- return self.fromlineno, self.tolineno
714
-
715
- def pytype(self):
716
- if self.newstyle:
717
- return '__builtin__.type'
718
- return '__builtin__.classobj'
719
-
720
- def display_type(self):
721
- return 'Class'
722
-
723
- def callable(self):
724
- return True
725
-
726
- def infer_call_result(self, caller, context=None):
727
- """infer what a class is returning when called"""
728
- yield Instance(self)
729
-
730
- def scope_lookup(self, node, name, offset=0):
731
- if node in self.bases:
732
- frame = self.parent.frame()
733
- # line offset to avoid that class A(A) resolve the ancestor to
734
- # the defined class
735
- offset = -1
736
- else:
737
- frame = self
738
- return frame._scope_lookup(node, name, offset)
739
-
740
- # list of parent class as a list of string (i.e. names as they appear
741
- # in the class definition) XXX bw compat
742
- def basenames(self):
743
- return [as_string(bnode) for bnode in self.bases]
744
- basenames = property(basenames)
745
-
746
- def ancestors(self, recurs=True, context=None):
747
- """return an iterator on the node base classes in a prefixed
748
- depth first order
749
-
750
- :param recurs:
751
- boolean indicating if it should recurse or return direct
752
- ancestors only
753
- """
754
- # FIXME: should be possible to choose the resolution order
755
- # XXX inference make infinite loops possible here (see BaseTransformer
756
- # manipulation in the builder module for instance !)
757
- if context is None:
758
- context = InferenceContext()
759
- for stmt in self.bases:
760
- try:
761
- for baseobj in stmt.infer(context):
762
- if not isinstance(baseobj, Class):
763
- # duh ?
764
- continue
765
- if baseobj is self:
766
- continue # cf xxx above
767
- yield baseobj
768
- if recurs:
769
- for grandpa in baseobj.ancestors(True, context):
770
- if grandpa is self:
771
- continue # cf xxx above
772
- yield grandpa
773
- except InferenceError:
774
- # XXX log error ?
775
- continue
776
-
777
- def local_attr_ancestors(self, name, context=None):
778
- """return an iterator on astng representation of parent classes
779
- which have <name> defined in their locals
780
- """
781
- for astng in self.ancestors(context=context):
782
- if astng.locals.has_key(name):
783
- yield astng
784
-
785
- def instance_attr_ancestors(self, name, context=None):
786
- """return an iterator on astng representation of parent classes
787
- which have <name> defined in their instance attribute dictionary
788
- """
789
- for astng in self.ancestors(context=context):
790
- if astng.instance_attrs.has_key(name):
791
- yield astng
792
-
793
- def has_base(self, node):
794
- return node in self.bases
795
-
796
- def local_attr(self, name, context=None):
797
- """return the list of assign node associated to name in this class
798
- locals or in its parents
799
-
800
- :raises `NotFoundError`:
801
- if no attribute with this name has been find in this class or
802
- its parent classes
803
- """
804
- try:
805
- return self.locals[name]
806
- except KeyError:
807
- # get if from the first parent implementing it if any
808
- for class_node in self.local_attr_ancestors(name, context):
809
- return class_node.locals[name]
810
- raise NotFoundError(name)
811
- local_attr = remove_nodes(local_attr, DelAttr)
812
-
813
- def instance_attr(self, name, context=None):
814
- """return the astng nodes associated to name in this class instance
815
- attributes dictionary and in its parents
816
-
817
- :raises `NotFoundError`:
818
- if no attribute with this name has been find in this class or
819
- its parent classes
820
- """
821
- values = self.instance_attrs.get(name, [])
822
- # get if from the first parent implementing it if any
823
- for class_node in self.instance_attr_ancestors(name, context):
824
- values += class_node.instance_attrs[name]
825
- if not values:
826
- raise NotFoundError(name)
827
- return values
828
- instance_attr = remove_nodes(instance_attr, DelAttr)
829
-
830
- def instanciate_class(self):
831
- """return Instance of Class node, else return self"""
832
- return Instance(self)
833
-
834
- def getattr(self, name, context=None):
835
- """this method doesn't look in the instance_attrs dictionary since it's
836
- done by an Instance proxy at inference time.
837
-
838
- It may return a YES object if the attribute has not been actually
839
- found but a __getattr__ or __getattribute__ method is defined
840
- """
841
- values = self.locals.get(name, [])
842
- if name in self.special_attributes:
843
- if name == '__module__':
844
- return [cf(self.root().qname())] + values
845
- if name == '__bases__':
846
- return [cf(tuple(self.ancestors(recurs=False, context=context)))] + values
847
- # XXX need proper meta class handling + MRO implementation
848
- if name == '__mro__' and self.newstyle:
849
- # XXX mro is read-only but that's not our job to detect that
850
- return [cf(tuple(self.ancestors(recurs=True, context=context)))] + values
851
- return std_special_attributes(self, name)
852
- # don't modify the list in self.locals!
853
- values = list(values)
854
- for classnode in self.ancestors(recurs=False, context=context):
855
- try:
856
- values += classnode.getattr(name, context)
857
- except NotFoundError:
858
- continue
859
- if not values:
860
- raise NotFoundError(name)
861
- return values
862
-
863
- def igetattr(self, name, context=None):
864
- """inferred getattr, need special treatment in class to handle
865
- descriptors
866
- """
867
- # set lookup name since this is necessary to infer on import nodes for
868
- # instance
869
- context = copy_context(context)
870
- context.lookupname = name
871
- try:
872
- for infered in _infer_stmts(self.getattr(name, context), context,
873
- frame=self):
874
- # yield YES object instead of descriptors when necessary
875
- if not isinstance(infered, Const) and isinstance(infered, Instance):
876
- try:
877
- infered._proxied.getattr('__get__', context)
878
- except NotFoundError:
879
- yield infered
880
- else:
881
- yield YES
882
- else:
883
- yield function_to_method(infered, self)
884
- except NotFoundError:
885
- if not name.startswith('__') and self.has_dynamic_getattr(context):
886
- # class handle some dynamic attributes, return a YES object
887
- yield YES
888
- else:
889
- raise InferenceError(name)
890
-
891
- def has_dynamic_getattr(self, context=None):
892
- """return True if the class has a custom __getattr__ or
893
- __getattribute__ method
894
- """
895
- # need to explicitly handle optparse.Values (setattr is not detected)
896
- if self.name == 'Values' and self.root().name == 'optparse':
897
- return True
898
- try:
899
- self.getattr('__getattr__', context)
900
- return True
901
- except NotFoundError:
902
- #if self.newstyle: XXX cause an infinite recursion error
903
- try:
904
- getattribute = self.getattr('__getattribute__', context)[0]
905
- if getattribute.root().name != '__builtin__':
906
- # class has a custom __getattribute__ defined
907
- return True
908
- except NotFoundError:
909
- pass
910
- return False
911
-
912
- def methods(self):
913
- """return an iterator on all methods defined in the class and
914
- its ancestors
915
- """
916
- done = {}
917
- for astng in chain(iter((self,)), self.ancestors()):
918
- for meth in astng.mymethods():
919
- if done.has_key(meth.name):
920
- continue
921
- done[meth.name] = None
922
- yield meth
923
-
924
- def mymethods(self):
925
- """return an iterator on all methods defined in the class"""
926
- for member in self.values():
927
- if isinstance(member, Function):
928
- yield member
929
-
930
- def interfaces(self, herited=True, handler_func=_iface_hdlr):
931
- """return an iterator on interfaces implemented by the given
932
- class node
933
- """
934
- # FIXME: what if __implements__ = (MyIFace, MyParent.__implements__)...
935
- try:
936
- implements = Instance(self).getattr('__implements__')[0]
937
- except NotFoundError:
938
- return
939
- if not herited and not implements.frame() is self:
940
- return
941
- found = set()
942
- for iface in unpack_infer(implements):
943
- if iface is YES:
944
- continue
945
- if not iface in found and handler_func(iface):
946
- found.add(iface)
947
- yield iface
948
- if not found:
949
- raise InferenceError()
950
-
951
-