bee_python 0.0.1

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