bee_python 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (503) hide show
  1. data/LICENSE +202 -0
  2. data/build/README +23 -0
  3. data/egg/egg/build.yml +70 -0
  4. data/egg/egg/ez_setup.py +280 -0
  5. data/egg/egg/script.py +12 -0
  6. data/egg/egg/setup.erb +11 -0
  7. data/egg/egg/suite.py +37 -0
  8. data/egg/egg/test.py +31 -0
  9. data/egg/egg.yml +69 -0
  10. data/egg/http/build.erb +53 -0
  11. data/egg/http/server.py +34 -0
  12. data/egg/http.yml +50 -0
  13. data/egg/mysql/mysql.py +43 -0
  14. data/egg/mysql.yml +44 -0
  15. data/egg/project/build.erb +77 -0
  16. data/egg/project/script.py +42 -0
  17. data/egg/project/test.py +31 -0
  18. data/egg/project.yml +59 -0
  19. data/egg/script/build.erb +35 -0
  20. data/egg/script/script.py +42 -0
  21. data/egg/script.yml +50 -0
  22. data/egg/soap/build.erb +52 -0
  23. data/egg/soap/client.py +18 -0
  24. data/egg/soap/server.py +30 -0
  25. data/egg/soap.yml +58 -0
  26. data/egg/source/source.py +42 -0
  27. data/egg/source.yml +47 -0
  28. data/egg/test/test.py +28 -0
  29. data/egg/test.yml +44 -0
  30. data/egg/xmlrpc/build.erb +52 -0
  31. data/egg/xmlrpc/client.py +22 -0
  32. data/egg/xmlrpc/server.py +24 -0
  33. data/egg/xmlrpc.yml +51 -0
  34. data/lib/bee_task_python.rb +390 -0
  35. data/test/build.yml +16 -0
  36. data/test/tc_bee_task_python.rb +27 -0
  37. data/test/test_build.rb +26 -0
  38. data/test/test_build_listener.rb +62 -0
  39. data/test/ts_bee_python.rb +26 -0
  40. data/tools/common/__init__.py +5 -0
  41. data/tools/common/common/__init__.py +140 -0
  42. data/tools/common/common/__pkginfo__.py +43 -0
  43. data/tools/common/common/adbh.py +35 -0
  44. data/tools/common/common/cache.py +114 -0
  45. data/tools/common/common/changelog.py +234 -0
  46. data/tools/common/common/clcommands.py +181 -0
  47. data/tools/common/common/cli.py +212 -0
  48. data/tools/common/common/compat.py +328 -0
  49. data/tools/common/common/configuration.py +1087 -0
  50. data/tools/common/common/contexts.py +58 -0
  51. data/tools/common/common/corbautils.py +117 -0
  52. data/tools/common/common/daemon.py +171 -0
  53. data/tools/common/common/date.py +279 -0
  54. data/tools/common/common/db.py +49 -0
  55. data/tools/common/common/dbf.py +229 -0
  56. data/tools/common/common/debugger.py +208 -0
  57. data/tools/common/common/decorators.py +190 -0
  58. data/tools/common/common/deprecation.py +118 -0
  59. data/tools/common/common/fileutils.py +409 -0
  60. data/tools/common/common/graph.py +259 -0
  61. data/tools/common/common/html.py +142 -0
  62. data/tools/common/common/interface.py +76 -0
  63. data/tools/common/common/logging_ext.py +166 -0
  64. data/tools/common/common/modutils.py +670 -0
  65. data/tools/common/common/optik_ext.py +383 -0
  66. data/tools/common/common/optparser.py +92 -0
  67. data/tools/common/common/pdf_ext.py +111 -0
  68. data/tools/common/common/proc.py +276 -0
  69. data/tools/common/common/pyro_ext.py +146 -0
  70. data/tools/common/common/pytest.py +754 -0
  71. data/tools/common/common/shellutils.py +383 -0
  72. data/tools/common/common/sphinx_ext.py +87 -0
  73. data/tools/common/common/sphinxutils.py +122 -0
  74. data/tools/common/common/sqlgen.py +31 -0
  75. data/tools/common/common/table.py +930 -0
  76. data/tools/common/common/tasksqueue.py +97 -0
  77. data/tools/common/common/test/__init__.py +1 -0
  78. data/tools/common/common/test/data/ChangeLog +184 -0
  79. data/tools/common/common/test/data/MyPyPa-0.1.0-py2.5.egg +0 -0
  80. data/tools/common/common/test/data/__init__.py +1 -0
  81. data/tools/common/common/test/data/content_differ_dir/NOTHING +0 -0
  82. data/tools/common/common/test/data/content_differ_dir/README +1 -0
  83. data/tools/common/common/test/data/content_differ_dir/subdir/coin +1 -0
  84. data/tools/common/common/test/data/content_differ_dir/subdir/toto.txt +53 -0
  85. data/tools/common/common/test/data/file_differ_dir/NOTHING +0 -0
  86. data/tools/common/common/test/data/file_differ_dir/README +1 -0
  87. data/tools/common/common/test/data/file_differ_dir/subdir/toto.txt +53 -0
  88. data/tools/common/common/test/data/file_differ_dir/subdirtwo/Hello +0 -0
  89. data/tools/common/common/test/data/find_test/__init__.py +0 -0
  90. data/tools/common/common/test/data/find_test/foo.txt +0 -0
  91. data/tools/common/common/test/data/find_test/module.py +0 -0
  92. data/tools/common/common/test/data/find_test/module2.py +0 -0
  93. data/tools/common/common/test/data/find_test/newlines.txt +0 -0
  94. data/tools/common/common/test/data/find_test/noendingnewline.py +0 -0
  95. data/tools/common/common/test/data/find_test/nonregr.py +0 -0
  96. data/tools/common/common/test/data/find_test/normal_file.txt +0 -0
  97. data/tools/common/common/test/data/find_test/spam.txt +0 -0
  98. data/tools/common/common/test/data/find_test/sub/doc.txt +0 -0
  99. data/tools/common/common/test/data/find_test/sub/momo.py +0 -0
  100. data/tools/common/common/test/data/find_test/test.ini +0 -0
  101. data/tools/common/common/test/data/find_test/test1.msg +0 -0
  102. data/tools/common/common/test/data/find_test/test2.msg +0 -0
  103. data/tools/common/common/test/data/find_test/write_protected_file.txt +0 -0
  104. data/tools/common/common/test/data/foo.txt +9 -0
  105. data/tools/common/common/test/data/module.py +88 -0
  106. data/tools/common/common/test/data/module2.py +77 -0
  107. data/tools/common/common/test/data/newlines.txt +3 -0
  108. data/tools/common/common/test/data/noendingnewline.py +36 -0
  109. data/tools/common/common/test/data/nonregr.py +14 -0
  110. data/tools/common/common/test/data/normal_file.txt +0 -0
  111. data/tools/common/common/test/data/reference_dir/NOTHING +0 -0
  112. data/tools/common/common/test/data/reference_dir/README +1 -0
  113. data/tools/common/common/test/data/reference_dir/subdir/coin +1 -0
  114. data/tools/common/common/test/data/reference_dir/subdir/toto.txt +53 -0
  115. data/tools/common/common/test/data/same_dir/NOTHING +0 -0
  116. data/tools/common/common/test/data/same_dir/README +1 -0
  117. data/tools/common/common/test/data/same_dir/subdir/coin +1 -0
  118. data/tools/common/common/test/data/same_dir/subdir/toto.txt +53 -0
  119. data/tools/common/common/test/data/spam.txt +9 -0
  120. data/tools/common/common/test/data/sub/doc.txt +1 -0
  121. data/tools/common/common/test/data/sub/momo.py +1 -0
  122. data/tools/common/common/test/data/subdir_differ_dir/NOTHING +0 -0
  123. data/tools/common/common/test/data/subdir_differ_dir/README +1 -0
  124. data/tools/common/common/test/data/subdir_differ_dir/subdir/coin +1 -0
  125. data/tools/common/common/test/data/subdir_differ_dir/subdir/toto.txt +53 -0
  126. data/tools/common/common/test/data/test.ini +20 -0
  127. data/tools/common/common/test/data/test1.msg +30 -0
  128. data/tools/common/common/test/data/test2.msg +42 -0
  129. data/tools/common/common/test/data/write_protected_file.txt +0 -0
  130. data/tools/common/common/test/foomod.py +17 -0
  131. data/tools/common/common/test/unittest_cache.py +129 -0
  132. data/tools/common/common/test/unittest_changelog.py +37 -0
  133. data/tools/common/common/test/unittest_compat.py +239 -0
  134. data/tools/common/common/test/unittest_configuration.py +348 -0
  135. data/tools/common/common/test/unittest_date.py +154 -0
  136. data/tools/common/common/test/unittest_decorators.py +62 -0
  137. data/tools/common/common/test/unittest_deprecation.py +76 -0
  138. data/tools/common/common/test/unittest_fileutils.py +133 -0
  139. data/tools/common/common/test/unittest_graph.py +50 -0
  140. data/tools/common/common/test/unittest_html.py +76 -0
  141. data/tools/common/common/test/unittest_interface.py +87 -0
  142. data/tools/common/common/test/unittest_modutils.py +244 -0
  143. data/tools/common/common/test/unittest_pytest.py +50 -0
  144. data/tools/common/common/test/unittest_shellutils.py +248 -0
  145. data/tools/common/common/test/unittest_table.py +448 -0
  146. data/tools/common/common/test/unittest_taskqueue.py +71 -0
  147. data/tools/common/common/test/unittest_testlib.py +956 -0
  148. data/tools/common/common/test/unittest_textutils.py +247 -0
  149. data/tools/common/common/test/unittest_tree.py +248 -0
  150. data/tools/common/common/test/unittest_umessage.py +55 -0
  151. data/tools/common/common/test/unittest_ureports_html.py +64 -0
  152. data/tools/common/common/test/unittest_ureports_text.py +105 -0
  153. data/tools/common/common/test/unittest_xmlutils.py +75 -0
  154. data/tools/common/common/test/utils.py +87 -0
  155. data/tools/common/common/testlib.py +1927 -0
  156. data/tools/common/common/textutils.py +476 -0
  157. data/tools/common/common/tree.py +372 -0
  158. data/tools/common/common/umessage.py +161 -0
  159. data/tools/common/common/ureports/__init__.py +174 -0
  160. data/tools/common/common/ureports/docbook_writer.py +139 -0
  161. data/tools/common/common/ureports/html_writer.py +131 -0
  162. data/tools/common/common/ureports/nodes.py +201 -0
  163. data/tools/common/common/ureports/text_writer.py +140 -0
  164. data/tools/common/common/vcgutils.py +216 -0
  165. data/tools/common/common/visitor.py +107 -0
  166. data/tools/common/common/xmlrpcutils.py +136 -0
  167. data/tools/common/common/xmlutils.py +61 -0
  168. data/tools/compile/compile.py +16 -0
  169. data/tools/coverage/coverage.py +602 -0
  170. data/tools/epydoc/__init__.py +227 -0
  171. data/tools/epydoc/__init__.pyc +0 -0
  172. data/tools/epydoc/apidoc.py +2203 -0
  173. data/tools/epydoc/apidoc.pyc +0 -0
  174. data/tools/epydoc/checker.py +349 -0
  175. data/tools/epydoc/checker.pyc +0 -0
  176. data/tools/epydoc/cli.py +1470 -0
  177. data/tools/epydoc/cli.pyc +0 -0
  178. data/tools/epydoc/compat.py +250 -0
  179. data/tools/epydoc/compat.pyc +0 -0
  180. data/tools/epydoc/docbuilder.py +1358 -0
  181. data/tools/epydoc/docbuilder.pyc +0 -0
  182. data/tools/epydoc/docintrospecter.py +1056 -0
  183. data/tools/epydoc/docintrospecter.pyc +0 -0
  184. data/tools/epydoc/docparser.py +2113 -0
  185. data/tools/epydoc/docparser.pyc +0 -0
  186. data/tools/epydoc/docstringparser.py +1111 -0
  187. data/tools/epydoc/docstringparser.pyc +0 -0
  188. data/tools/epydoc/docwriter/__init__.py +12 -0
  189. data/tools/epydoc/docwriter/__init__.pyc +0 -0
  190. data/tools/epydoc/docwriter/dotgraph.py +1351 -0
  191. data/tools/epydoc/docwriter/dotgraph.pyc +0 -0
  192. data/tools/epydoc/docwriter/html.py +3491 -0
  193. data/tools/epydoc/docwriter/html.pyc +0 -0
  194. data/tools/epydoc/docwriter/html_colorize.py +909 -0
  195. data/tools/epydoc/docwriter/html_colorize.pyc +0 -0
  196. data/tools/epydoc/docwriter/html_css.py +550 -0
  197. data/tools/epydoc/docwriter/html_css.pyc +0 -0
  198. data/tools/epydoc/docwriter/html_help.py +190 -0
  199. data/tools/epydoc/docwriter/html_help.pyc +0 -0
  200. data/tools/epydoc/docwriter/latex.py +1187 -0
  201. data/tools/epydoc/docwriter/latex.pyc +0 -0
  202. data/tools/epydoc/docwriter/plaintext.py +276 -0
  203. data/tools/epydoc/docwriter/plaintext.pyc +0 -0
  204. data/tools/epydoc/docwriter/xlink.py +505 -0
  205. data/tools/epydoc/docwriter/xlink.pyc +0 -0
  206. data/tools/epydoc/gui.py +1148 -0
  207. data/tools/epydoc/gui.pyc +0 -0
  208. data/tools/epydoc/log.py +204 -0
  209. data/tools/epydoc/log.pyc +0 -0
  210. data/tools/epydoc/markup/__init__.py +623 -0
  211. data/tools/epydoc/markup/__init__.pyc +0 -0
  212. data/tools/epydoc/markup/doctest.py +311 -0
  213. data/tools/epydoc/markup/doctest.pyc +0 -0
  214. data/tools/epydoc/markup/epytext.py +2116 -0
  215. data/tools/epydoc/markup/epytext.pyc +0 -0
  216. data/tools/epydoc/markup/javadoc.py +250 -0
  217. data/tools/epydoc/markup/javadoc.pyc +0 -0
  218. data/tools/epydoc/markup/plaintext.py +78 -0
  219. data/tools/epydoc/markup/plaintext.pyc +0 -0
  220. data/tools/epydoc/markup/pyval_repr.py +532 -0
  221. data/tools/epydoc/markup/pyval_repr.pyc +0 -0
  222. data/tools/epydoc/markup/restructuredtext.py +906 -0
  223. data/tools/epydoc/markup/restructuredtext.pyc +0 -0
  224. data/tools/epydoc/test/__init__.py +97 -0
  225. data/tools/epydoc/test/__init__.pyc +0 -0
  226. data/tools/epydoc/test/util.py +226 -0
  227. data/tools/epydoc/test/util.pyc +0 -0
  228. data/tools/epydoc/util.py +289 -0
  229. data/tools/epydoc/util.pyc +0 -0
  230. data/tools/logilab/logilab/__init__.py +5 -0
  231. data/tools/logilab/logilab/astng/__init__.py +82 -0
  232. data/tools/logilab/logilab/astng/__pkginfo__.py +76 -0
  233. data/tools/logilab/logilab/astng/_exceptions.py +64 -0
  234. data/tools/logilab/logilab/astng/_nodes_ast.py +667 -0
  235. data/tools/logilab/logilab/astng/_nodes_compiler.py +758 -0
  236. data/tools/logilab/logilab/astng/bases.py +608 -0
  237. data/tools/logilab/logilab/astng/builder.py +239 -0
  238. data/tools/logilab/logilab/astng/inference.py +426 -0
  239. data/tools/logilab/logilab/astng/inspector.py +289 -0
  240. data/tools/logilab/logilab/astng/manager.py +421 -0
  241. data/tools/logilab/logilab/astng/mixins.py +165 -0
  242. data/tools/logilab/logilab/astng/node_classes.py +848 -0
  243. data/tools/logilab/logilab/astng/nodes.py +85 -0
  244. data/tools/logilab/logilab/astng/nodes_as_string.py +389 -0
  245. data/tools/logilab/logilab/astng/patchcomptransformer.py +159 -0
  246. data/tools/logilab/logilab/astng/protocols.py +333 -0
  247. data/tools/logilab/logilab/astng/raw_building.py +212 -0
  248. data/tools/logilab/logilab/astng/rebuilder.py +307 -0
  249. data/tools/logilab/logilab/astng/scoped_nodes.py +951 -0
  250. data/tools/logilab/logilab/astng/test/__init__.py +19 -0
  251. data/tools/logilab/logilab/astng/test/data/MyPyPa-0.1.0-py2.5.egg +0 -0
  252. data/tools/logilab/logilab/astng/test/data/MyPyPa-0.1.0-py2.5.zip +0 -0
  253. data/tools/logilab/logilab/astng/test/data/SSL1/Connection1.py +33 -0
  254. data/tools/logilab/logilab/astng/test/data/SSL1/__init__.py +20 -0
  255. data/tools/logilab/logilab/astng/test/data/__init__.py +20 -0
  256. data/tools/logilab/logilab/astng/test/data/all.py +29 -0
  257. data/tools/logilab/logilab/astng/test/data/appl/__init__.py +23 -0
  258. data/tools/logilab/logilab/astng/test/data/appl/myConnection.py +30 -0
  259. data/tools/logilab/logilab/astng/test/data/format.py +34 -0
  260. data/tools/logilab/logilab/astng/test/data/module.py +90 -0
  261. data/tools/logilab/logilab/astng/test/data/module2.py +112 -0
  262. data/tools/logilab/logilab/astng/test/data/noendingnewline.py +57 -0
  263. data/tools/logilab/logilab/astng/test/data/nonregr.py +76 -0
  264. data/tools/logilab/logilab/astng/test/data/notall.py +28 -0
  265. data/tools/logilab/logilab/astng/test/data2/__init__.py +20 -0
  266. data/tools/logilab/logilab/astng/test/data2/clientmodule_test.py +51 -0
  267. data/tools/logilab/logilab/astng/test/data2/suppliermodule_test.py +32 -0
  268. data/tools/logilab/logilab/astng/test/regrtest.py +135 -0
  269. data/tools/logilab/logilab/astng/test/regrtest_data/absimport.py +22 -0
  270. data/tools/logilab/logilab/astng/test/regrtest_data/descriptor_crash.py +31 -0
  271. data/tools/logilab/logilab/astng/test/regrtest_data/import_package_subpackage_module.py +68 -0
  272. data/tools/logilab/logilab/astng/test/regrtest_data/package/__init__.py +24 -0
  273. data/tools/logilab/logilab/astng/test/regrtest_data/package/subpackage/__init__.py +20 -0
  274. data/tools/logilab/logilab/astng/test/regrtest_data/package/subpackage/module.py +20 -0
  275. data/tools/logilab/logilab/astng/test/unittest_builder.py +684 -0
  276. data/tools/logilab/logilab/astng/test/unittest_inference.py +1112 -0
  277. data/tools/logilab/logilab/astng/test/unittest_inspector.py +105 -0
  278. data/tools/logilab/logilab/astng/test/unittest_lookup.py +302 -0
  279. data/tools/logilab/logilab/astng/test/unittest_manager.py +98 -0
  280. data/tools/logilab/logilab/astng/test/unittest_nodes.py +302 -0
  281. data/tools/logilab/logilab/astng/test/unittest_scoped_nodes.py +501 -0
  282. data/tools/logilab/logilab/astng/test/unittest_utils.py +104 -0
  283. data/tools/logilab/logilab/astng/utils.py +342 -0
  284. data/tools/logilab/logilab/common/__init__.py +140 -0
  285. data/tools/logilab/logilab/common/__pkginfo__.py +43 -0
  286. data/tools/logilab/logilab/common/adbh.py +35 -0
  287. data/tools/logilab/logilab/common/cache.py +114 -0
  288. data/tools/logilab/logilab/common/changelog.py +234 -0
  289. data/tools/logilab/logilab/common/clcommands.py +181 -0
  290. data/tools/logilab/logilab/common/cli.py +212 -0
  291. data/tools/logilab/logilab/common/compat.py +328 -0
  292. data/tools/logilab/logilab/common/configuration.py +1087 -0
  293. data/tools/logilab/logilab/common/contexts.py +58 -0
  294. data/tools/logilab/logilab/common/corbautils.py +117 -0
  295. data/tools/logilab/logilab/common/daemon.py +171 -0
  296. data/tools/logilab/logilab/common/date.py +279 -0
  297. data/tools/logilab/logilab/common/db.py +49 -0
  298. data/tools/logilab/logilab/common/dbf.py +229 -0
  299. data/tools/logilab/logilab/common/debugger.py +208 -0
  300. data/tools/logilab/logilab/common/decorators.py +190 -0
  301. data/tools/logilab/logilab/common/deprecation.py +118 -0
  302. data/tools/logilab/logilab/common/fileutils.py +409 -0
  303. data/tools/logilab/logilab/common/graph.py +259 -0
  304. data/tools/logilab/logilab/common/html.py +142 -0
  305. data/tools/logilab/logilab/common/interface.py +76 -0
  306. data/tools/logilab/logilab/common/logging_ext.py +166 -0
  307. data/tools/logilab/logilab/common/modutils.py +670 -0
  308. data/tools/logilab/logilab/common/optik_ext.py +383 -0
  309. data/tools/logilab/logilab/common/optparser.py +92 -0
  310. data/tools/logilab/logilab/common/pdf_ext.py +111 -0
  311. data/tools/logilab/logilab/common/proc.py +276 -0
  312. data/tools/logilab/logilab/common/pyro_ext.py +146 -0
  313. data/tools/logilab/logilab/common/pytest.py +754 -0
  314. data/tools/logilab/logilab/common/shellutils.py +383 -0
  315. data/tools/logilab/logilab/common/sphinx_ext.py +87 -0
  316. data/tools/logilab/logilab/common/sphinxutils.py +122 -0
  317. data/tools/logilab/logilab/common/sqlgen.py +31 -0
  318. data/tools/logilab/logilab/common/table.py +930 -0
  319. data/tools/logilab/logilab/common/tasksqueue.py +97 -0
  320. data/tools/logilab/logilab/common/test/__init__.py +1 -0
  321. data/tools/logilab/logilab/common/test/data/ChangeLog +184 -0
  322. data/tools/logilab/logilab/common/test/data/MyPyPa-0.1.0-py2.5.egg +0 -0
  323. data/tools/logilab/logilab/common/test/data/__init__.py +1 -0
  324. data/tools/logilab/logilab/common/test/data/content_differ_dir/NOTHING +0 -0
  325. data/tools/logilab/logilab/common/test/data/content_differ_dir/README +1 -0
  326. data/tools/logilab/logilab/common/test/data/content_differ_dir/subdir/coin +1 -0
  327. data/tools/logilab/logilab/common/test/data/content_differ_dir/subdir/toto.txt +53 -0
  328. data/tools/logilab/logilab/common/test/data/file_differ_dir/NOTHING +0 -0
  329. data/tools/logilab/logilab/common/test/data/file_differ_dir/README +1 -0
  330. data/tools/logilab/logilab/common/test/data/file_differ_dir/subdir/toto.txt +53 -0
  331. data/tools/logilab/logilab/common/test/data/file_differ_dir/subdirtwo/Hello +0 -0
  332. data/tools/logilab/logilab/common/test/data/find_test/__init__.py +0 -0
  333. data/tools/logilab/logilab/common/test/data/find_test/foo.txt +0 -0
  334. data/tools/logilab/logilab/common/test/data/find_test/module.py +0 -0
  335. data/tools/logilab/logilab/common/test/data/find_test/module2.py +0 -0
  336. data/tools/logilab/logilab/common/test/data/find_test/newlines.txt +0 -0
  337. data/tools/logilab/logilab/common/test/data/find_test/noendingnewline.py +0 -0
  338. data/tools/logilab/logilab/common/test/data/find_test/nonregr.py +0 -0
  339. data/tools/logilab/logilab/common/test/data/find_test/normal_file.txt +0 -0
  340. data/tools/logilab/logilab/common/test/data/find_test/spam.txt +0 -0
  341. data/tools/logilab/logilab/common/test/data/find_test/sub/doc.txt +0 -0
  342. data/tools/logilab/logilab/common/test/data/find_test/sub/momo.py +0 -0
  343. data/tools/logilab/logilab/common/test/data/find_test/test.ini +0 -0
  344. data/tools/logilab/logilab/common/test/data/find_test/test1.msg +0 -0
  345. data/tools/logilab/logilab/common/test/data/find_test/test2.msg +0 -0
  346. data/tools/logilab/logilab/common/test/data/find_test/write_protected_file.txt +0 -0
  347. data/tools/logilab/logilab/common/test/data/foo.txt +9 -0
  348. data/tools/logilab/logilab/common/test/data/module.py +88 -0
  349. data/tools/logilab/logilab/common/test/data/module2.py +77 -0
  350. data/tools/logilab/logilab/common/test/data/newlines.txt +3 -0
  351. data/tools/logilab/logilab/common/test/data/noendingnewline.py +36 -0
  352. data/tools/logilab/logilab/common/test/data/nonregr.py +14 -0
  353. data/tools/logilab/logilab/common/test/data/normal_file.txt +0 -0
  354. data/tools/logilab/logilab/common/test/data/reference_dir/NOTHING +0 -0
  355. data/tools/logilab/logilab/common/test/data/reference_dir/README +1 -0
  356. data/tools/logilab/logilab/common/test/data/reference_dir/subdir/coin +1 -0
  357. data/tools/logilab/logilab/common/test/data/reference_dir/subdir/toto.txt +53 -0
  358. data/tools/logilab/logilab/common/test/data/same_dir/NOTHING +0 -0
  359. data/tools/logilab/logilab/common/test/data/same_dir/README +1 -0
  360. data/tools/logilab/logilab/common/test/data/same_dir/subdir/coin +1 -0
  361. data/tools/logilab/logilab/common/test/data/same_dir/subdir/toto.txt +53 -0
  362. data/tools/logilab/logilab/common/test/data/spam.txt +9 -0
  363. data/tools/logilab/logilab/common/test/data/sub/doc.txt +1 -0
  364. data/tools/logilab/logilab/common/test/data/sub/momo.py +1 -0
  365. data/tools/logilab/logilab/common/test/data/subdir_differ_dir/NOTHING +0 -0
  366. data/tools/logilab/logilab/common/test/data/subdir_differ_dir/README +1 -0
  367. data/tools/logilab/logilab/common/test/data/subdir_differ_dir/subdir/coin +1 -0
  368. data/tools/logilab/logilab/common/test/data/subdir_differ_dir/subdir/toto.txt +53 -0
  369. data/tools/logilab/logilab/common/test/data/test.ini +20 -0
  370. data/tools/logilab/logilab/common/test/data/test1.msg +30 -0
  371. data/tools/logilab/logilab/common/test/data/test2.msg +42 -0
  372. data/tools/logilab/logilab/common/test/data/write_protected_file.txt +0 -0
  373. data/tools/logilab/logilab/common/test/foomod.py +17 -0
  374. data/tools/logilab/logilab/common/test/unittest_cache.py +129 -0
  375. data/tools/logilab/logilab/common/test/unittest_changelog.py +37 -0
  376. data/tools/logilab/logilab/common/test/unittest_compat.py +239 -0
  377. data/tools/logilab/logilab/common/test/unittest_configuration.py +348 -0
  378. data/tools/logilab/logilab/common/test/unittest_date.py +154 -0
  379. data/tools/logilab/logilab/common/test/unittest_decorators.py +62 -0
  380. data/tools/logilab/logilab/common/test/unittest_deprecation.py +76 -0
  381. data/tools/logilab/logilab/common/test/unittest_fileutils.py +133 -0
  382. data/tools/logilab/logilab/common/test/unittest_graph.py +50 -0
  383. data/tools/logilab/logilab/common/test/unittest_html.py +76 -0
  384. data/tools/logilab/logilab/common/test/unittest_interface.py +87 -0
  385. data/tools/logilab/logilab/common/test/unittest_modutils.py +244 -0
  386. data/tools/logilab/logilab/common/test/unittest_pytest.py +50 -0
  387. data/tools/logilab/logilab/common/test/unittest_shellutils.py +248 -0
  388. data/tools/logilab/logilab/common/test/unittest_table.py +448 -0
  389. data/tools/logilab/logilab/common/test/unittest_taskqueue.py +71 -0
  390. data/tools/logilab/logilab/common/test/unittest_testlib.py +956 -0
  391. data/tools/logilab/logilab/common/test/unittest_textutils.py +247 -0
  392. data/tools/logilab/logilab/common/test/unittest_tree.py +248 -0
  393. data/tools/logilab/logilab/common/test/unittest_umessage.py +55 -0
  394. data/tools/logilab/logilab/common/test/unittest_ureports_html.py +64 -0
  395. data/tools/logilab/logilab/common/test/unittest_ureports_text.py +105 -0
  396. data/tools/logilab/logilab/common/test/unittest_xmlutils.py +75 -0
  397. data/tools/logilab/logilab/common/test/utils.py +87 -0
  398. data/tools/logilab/logilab/common/testlib.py +1927 -0
  399. data/tools/logilab/logilab/common/textutils.py +476 -0
  400. data/tools/logilab/logilab/common/tree.py +372 -0
  401. data/tools/logilab/logilab/common/umessage.py +161 -0
  402. data/tools/logilab/logilab/common/ureports/__init__.py +174 -0
  403. data/tools/logilab/logilab/common/ureports/docbook_writer.py +139 -0
  404. data/tools/logilab/logilab/common/ureports/html_writer.py +131 -0
  405. data/tools/logilab/logilab/common/ureports/nodes.py +201 -0
  406. data/tools/logilab/logilab/common/ureports/text_writer.py +140 -0
  407. data/tools/logilab/logilab/common/vcgutils.py +216 -0
  408. data/tools/logilab/logilab/common/visitor.py +107 -0
  409. data/tools/logilab/logilab/common/xmlrpcutils.py +136 -0
  410. data/tools/logilab/logilab/common/xmlutils.py +61 -0
  411. data/tools/pychecker/COPYRIGHT +31 -0
  412. data/tools/pychecker/ChangeLog +349 -0
  413. data/tools/pychecker/CodeChecks.py +1969 -0
  414. data/tools/pychecker/CodeChecks.pyc +0 -0
  415. data/tools/pychecker/CodeChecks.pyo +0 -0
  416. data/tools/pychecker/Config.py +475 -0
  417. data/tools/pychecker/Config.pyc +0 -0
  418. data/tools/pychecker/Config.pyo +0 -0
  419. data/tools/pychecker/KNOWN_BUGS +100 -0
  420. data/tools/pychecker/MAINTAINERS +81 -0
  421. data/tools/pychecker/NEWS +406 -0
  422. data/tools/pychecker/OP.py +131 -0
  423. data/tools/pychecker/OP.pyc +0 -0
  424. data/tools/pychecker/OP.pyo +0 -0
  425. data/tools/pychecker/OptionTypes.py +117 -0
  426. data/tools/pychecker/OptionTypes.pyc +0 -0
  427. data/tools/pychecker/OptionTypes.pyo +0 -0
  428. data/tools/pychecker/README +152 -0
  429. data/tools/pychecker/Stack.py +115 -0
  430. data/tools/pychecker/Stack.pyc +0 -0
  431. data/tools/pychecker/Stack.pyo +0 -0
  432. data/tools/pychecker/TODO +101 -0
  433. data/tools/pychecker/VERSION +1 -0
  434. data/tools/pychecker/Warning.py +50 -0
  435. data/tools/pychecker/Warning.pyc +0 -0
  436. data/tools/pychecker/Warning.pyo +0 -0
  437. data/tools/pychecker/__init__.py +17 -0
  438. data/tools/pychecker/__init__.pyc +0 -0
  439. data/tools/pychecker/__init__.pyo +0 -0
  440. data/tools/pychecker/checker.py +961 -0
  441. data/tools/pychecker/checker.pyc +0 -0
  442. data/tools/pychecker/checker.pyo +0 -0
  443. data/tools/pychecker/function.py +159 -0
  444. data/tools/pychecker/function.pyc +0 -0
  445. data/tools/pychecker/function.pyo +0 -0
  446. data/tools/pychecker/msgs.py +175 -0
  447. data/tools/pychecker/msgs.pyc +0 -0
  448. data/tools/pychecker/msgs.pyo +0 -0
  449. data/tools/pychecker/options.py +275 -0
  450. data/tools/pychecker/options.pyc +0 -0
  451. data/tools/pychecker/options.pyo +0 -0
  452. data/tools/pychecker/pcmodules.py +19 -0
  453. data/tools/pychecker/pcmodules.pyc +0 -0
  454. data/tools/pychecker/pcmodules.pyo +0 -0
  455. data/tools/pychecker/printer.py +47 -0
  456. data/tools/pychecker/printer.pyc +0 -0
  457. data/tools/pychecker/printer.pyo +0 -0
  458. data/tools/pychecker/python.py +427 -0
  459. data/tools/pychecker/python.pyc +0 -0
  460. data/tools/pychecker/python.pyo +0 -0
  461. data/tools/pychecker/utils.py +102 -0
  462. data/tools/pychecker/utils.pyc +0 -0
  463. data/tools/pychecker/utils.pyo +0 -0
  464. data/tools/pychecker/warn.py +778 -0
  465. data/tools/pychecker/warn.pyc +0 -0
  466. data/tools/pychecker/warn.pyo +0 -0
  467. data/tools/pylint2/pylint/__init__.py +16 -0
  468. data/tools/pylint2/pylint/__pkginfo__.py +67 -0
  469. data/tools/pylint2/pylint/checkers/__init__.py +155 -0
  470. data/tools/pylint2/pylint/checkers/base.py +749 -0
  471. data/tools/pylint2/pylint/checkers/classes.py +527 -0
  472. data/tools/pylint2/pylint/checkers/design_analysis.py +344 -0
  473. data/tools/pylint2/pylint/checkers/exceptions.py +183 -0
  474. data/tools/pylint2/pylint/checkers/format.py +367 -0
  475. data/tools/pylint2/pylint/checkers/imports.py +379 -0
  476. data/tools/pylint2/pylint/checkers/logging.py +98 -0
  477. data/tools/pylint2/pylint/checkers/misc.py +128 -0
  478. data/tools/pylint2/pylint/checkers/newstyle.py +107 -0
  479. data/tools/pylint2/pylint/checkers/raw_metrics.py +125 -0
  480. data/tools/pylint2/pylint/checkers/similar.py +333 -0
  481. data/tools/pylint2/pylint/checkers/string_format.py +239 -0
  482. data/tools/pylint2/pylint/checkers/typecheck.py +364 -0
  483. data/tools/pylint2/pylint/checkers/utils.py +208 -0
  484. data/tools/pylint2/pylint/checkers/variables.py +498 -0
  485. data/tools/pylint2/pylint/config.py +149 -0
  486. data/tools/pylint2/pylint/epylint.py +149 -0
  487. data/tools/pylint2/pylint/gui.py +433 -0
  488. data/tools/pylint2/pylint/interfaces.py +98 -0
  489. data/tools/pylint2/pylint/lint.py +914 -0
  490. data/tools/pylint2/pylint/pyreverse/__init__.py +5 -0
  491. data/tools/pylint2/pylint/pyreverse/diadefslib.py +229 -0
  492. data/tools/pylint2/pylint/pyreverse/diagrams.py +247 -0
  493. data/tools/pylint2/pylint/pyreverse/main.py +123 -0
  494. data/tools/pylint2/pylint/pyreverse/utils.py +131 -0
  495. data/tools/pylint2/pylint/pyreverse/writer.py +196 -0
  496. data/tools/pylint2/pylint/reporters/__init__.py +67 -0
  497. data/tools/pylint2/pylint/reporters/guireporter.py +36 -0
  498. data/tools/pylint2/pylint/reporters/html.py +69 -0
  499. data/tools/pylint2/pylint/reporters/text.py +156 -0
  500. data/tools/pylint2/pylint/utils.py +518 -0
  501. data/tools/pylint2/pylint.py +16 -0
  502. data/tools/test/suite.py +35 -0
  503. metadata +566 -0
@@ -0,0 +1,951 @@
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
+