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,848 @@
1
+ # -*- coding: utf-8 -*-
2
+ # This program is free software; you can redistribute it and/or modify it under
3
+ # the terms of the GNU Lesser General Public License as published by the Free Software
4
+ # Foundation; either version 2 of the License, or (at your option) any later
5
+ # version.
6
+ #
7
+ # This program is distributed in the hope that it will be useful, but WITHOUT
8
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
9
+ # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
10
+ #
11
+ # You should have received a copy of the GNU Lesser General Public License along with
12
+ # this program; if not, write to the Free Software Foundation, Inc.,
13
+ # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
14
+ # copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
15
+ # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
16
+ # copyright 2003-2010 Sylvain Thenault, all rights reserved.
17
+ # contact mailto:thenault@gmail.com
18
+ #
19
+ # This file is part of logilab-astng.
20
+ #
21
+ # logilab-astng is free software: you can redistribute it and/or modify it
22
+ # under the terms of the GNU Lesser General Public License as published by the
23
+ # Free Software Foundation, either version 2.1 of the License, or (at your
24
+ # option) any later version.
25
+ #
26
+ # logilab-astng is distributed in the hope that it will be useful, but
27
+ # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
28
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
29
+ # for more details.
30
+ #
31
+ # You should have received a copy of the GNU Lesser General Public License along
32
+ # with logilab-astng. If not, see <http://www.gnu.org/licenses/>.
33
+ """
34
+ Module for some node classes. More nodes in scoped_nodes.py
35
+
36
+
37
+ """
38
+ from logilab.common.compat import chain, imap
39
+
40
+ from logilab.astng import NoDefault
41
+ from logilab.astng.bases import (NodeNG, BaseClass, Instance, copy_context,
42
+ _infer_stmts, YES)
43
+ from logilab.astng.mixins import (StmtMixIn, BlockRangeMixIn, AssignTypeMixin,
44
+ ParentAssignTypeMixin, FromImportMixIn)
45
+
46
+ def unpack_infer(stmt, context=None):
47
+ """return an iterator on nodes inferred by the given statement if the
48
+ inferred value is a list or a tuple, recurse on it to get values inferred
49
+ by its content
50
+ """
51
+ if isinstance(stmt, (List, Tuple)):
52
+ # XXX loosing context
53
+ return chain(*imap(unpack_infer, stmt.elts))
54
+ infered = stmt.infer(context).next()
55
+ if infered is stmt:
56
+ return iter( (stmt,) )
57
+ return chain(*imap(unpack_infer, stmt.infer(context)))
58
+
59
+
60
+
61
+ def are_exclusive(stmt1, stmt2, exceptions=None):
62
+ """return true if the two given statements are mutually exclusive
63
+
64
+ `exceptions` may be a list of exception names. If specified, discard If
65
+ branches and check one of the statement is in an exception handler catching
66
+ one of the given exceptions.
67
+
68
+ algorithm :
69
+ 1) index stmt1's parents
70
+ 2) climb among stmt2's parents until we find a common parent
71
+ 3) if the common parent is a If or TryExcept statement, look if nodes are
72
+ in exclusive branches
73
+ """
74
+ # index stmt1's parents
75
+ stmt1_parents = {}
76
+ children = {}
77
+ node = stmt1.parent
78
+ previous = stmt1
79
+ while node:
80
+ stmt1_parents[node] = 1
81
+ children[node] = previous
82
+ previous = node
83
+ node = node.parent
84
+ # climb among stmt2's parents until we find a common parent
85
+ node = stmt2.parent
86
+ previous = stmt2
87
+ while node:
88
+ if stmt1_parents.has_key(node):
89
+ # if the common parent is a If or TryExcept statement, look if
90
+ # nodes are in exclusive branches
91
+ if isinstance(node, If) and exceptions is None:
92
+ if (node.locate_child(previous)[1]
93
+ is not node.locate_child(children[node])[1]):
94
+ return True
95
+ elif isinstance(node, TryExcept):
96
+ c2attr, c2node = node.locate_child(previous)
97
+ c1attr, c1node = node.locate_child(children[node])
98
+ if c1node is not c2node:
99
+ if ((c2attr == 'body' and c1attr == 'handlers' and children[node].catch(exceptions)) or
100
+ (c2attr == 'handlers' and c1attr == 'body' and previous.catch(exceptions)) or
101
+ (c2attr == 'handlers' and c1attr == 'orelse') or
102
+ (c2attr == 'orelse' and c1attr == 'handlers')):
103
+ return True
104
+ elif c2attr == 'handlers' and c1attr == 'handlers':
105
+ return previous is not children[node]
106
+ return False
107
+ previous = node
108
+ node = node.parent
109
+ return False
110
+
111
+
112
+
113
+
114
+
115
+ class LookupMixIn(BaseClass):
116
+ """Mixin looking up a name in the right scope
117
+ """
118
+
119
+ def lookup(self, name):
120
+ """lookup a variable name
121
+
122
+ return the scope node and the list of assignments associated to the given
123
+ name according to the scope where it has been found (locals, globals or
124
+ builtin)
125
+
126
+ The lookup is starting from self's scope. If self is not a frame itself and
127
+ the name is found in the inner frame locals, statements will be filtered
128
+ to remove ignorable statements according to self's location
129
+ """
130
+ return self.scope().scope_lookup(self, name)
131
+
132
+ def ilookup(self, name, context=None):
133
+ """infered lookup
134
+
135
+ return an iterator on infered values of the statements returned by
136
+ the lookup method
137
+ """
138
+ frame, stmts = self.lookup(name)
139
+ context = copy_context(context)
140
+ context.lookupname = name
141
+ return _infer_stmts(stmts, context, frame)
142
+
143
+ def _filter_stmts(self, stmts, frame, offset):
144
+ """filter statements to remove ignorable statements.
145
+
146
+ If self is not a frame itself and the name is found in the inner
147
+ frame locals, statements will be filtered to remove ignorable
148
+ statements according to self's location
149
+ """
150
+ # if offset == -1, my actual frame is not the inner frame but its parent
151
+ #
152
+ # class A(B): pass
153
+ #
154
+ # we need this to resolve B correctly
155
+ if offset == -1:
156
+ myframe = self.frame().parent.frame()
157
+ else:
158
+ myframe = self.frame()
159
+ if not myframe is frame or self is frame:
160
+ return stmts
161
+ mystmt = self.statement()
162
+ # line filtering if we are in the same frame
163
+ #
164
+ # take care node may be missing lineno information (this is the case for
165
+ # nodes inserted for living objects)
166
+ if myframe is frame and mystmt.fromlineno is not None:
167
+ assert mystmt.fromlineno is not None, mystmt
168
+ mylineno = mystmt.fromlineno + offset
169
+ else:
170
+ # disabling lineno filtering
171
+ mylineno = 0
172
+ _stmts = []
173
+ _stmt_parents = []
174
+ for node in stmts:
175
+ stmt = node.statement()
176
+ # line filtering is on and we have reached our location, break
177
+ if mylineno > 0 and stmt.fromlineno > mylineno:
178
+ break
179
+ assert hasattr(node, 'ass_type'), (node, node.scope(),
180
+ node.scope().locals)
181
+ ass_type = node.ass_type()
182
+
183
+ if node.has_base(self):
184
+ break
185
+
186
+ _stmts, done = ass_type._get_filtered_stmts(self, node, _stmts, mystmt)
187
+ if done:
188
+ break
189
+
190
+ optional_assign = isinstance(ass_type, (For, Comprehension))
191
+ if optional_assign and ass_type.parent_of(self):
192
+ # we are inside a loop, loop var assigment is hidding previous
193
+ # assigment
194
+ _stmts = [node]
195
+ _stmt_parents = [stmt.parent]
196
+ continue
197
+
198
+ # XXX comment various branches below!!!
199
+ try:
200
+ pindex = _stmt_parents.index(stmt.parent)
201
+ except ValueError:
202
+ pass
203
+ else:
204
+ # we got a parent index, this means the currently visited node
205
+ # is at the same block level as a previously visited node
206
+ if _stmts[pindex].ass_type().parent_of(ass_type):
207
+ # both statements are not at the same block level
208
+ continue
209
+ # if currently visited node is following previously considered
210
+ # assignement and both are not exclusive, we can drop the
211
+ # previous one. For instance in the following code ::
212
+ #
213
+ # if a:
214
+ # x = 1
215
+ # else:
216
+ # x = 2
217
+ # print x
218
+ #
219
+ # we can't remove neither x = 1 nor x = 2 when looking for 'x'
220
+ # of 'print x'; while in the following ::
221
+ #
222
+ # x = 1
223
+ # x = 2
224
+ # print x
225
+ #
226
+ # we can remove x = 1 when we see x = 2
227
+ #
228
+ # moreover, on loop assignment types, assignment won't
229
+ # necessarily be done if the loop has no iteration, so we don't
230
+ # want to clear previous assigments if any (hence the test on
231
+ # optional_assign)
232
+ if not (optional_assign or are_exclusive(_stmts[pindex], node)):
233
+ del _stmt_parents[pindex]
234
+ del _stmts[pindex]
235
+ if isinstance(node, AssName):
236
+ if not optional_assign and stmt.parent is mystmt.parent:
237
+ _stmts = []
238
+ _stmt_parents = []
239
+ elif isinstance(node, DelName):
240
+ _stmts = []
241
+ _stmt_parents = []
242
+ continue
243
+ if not are_exclusive(self, node):
244
+ _stmts.append(node)
245
+ _stmt_parents.append(stmt.parent)
246
+ return _stmts
247
+
248
+ # Name classes
249
+
250
+ class AssName(LookupMixIn, ParentAssignTypeMixin, NodeNG):
251
+ """class representing an AssName node"""
252
+
253
+
254
+ class DelName(LookupMixIn, ParentAssignTypeMixin, NodeNG):
255
+ """class representing a DelName node"""
256
+
257
+
258
+ class Name(LookupMixIn, NodeNG):
259
+ """class representing a Name node"""
260
+
261
+
262
+
263
+
264
+ ##################### node classes ########################################
265
+
266
+ class Arguments(NodeNG, AssignTypeMixin):
267
+ """class representing an Arguments node"""
268
+ _astng_fields = ('args', 'defaults')
269
+ args = None
270
+ defaults = None
271
+
272
+ def __init__(self, vararg=None, kwarg=None):
273
+ self.vararg = vararg
274
+ self.kwarg = kwarg
275
+
276
+ def _infer_name(self, frame, name):
277
+ if self.parent is frame:
278
+ return name
279
+ return None
280
+
281
+ def format_args(self):
282
+ """return arguments formatted as string"""
283
+ result = [_format_args(self.args, self.defaults)]
284
+ if self.vararg:
285
+ result.append('*%s' % self.vararg)
286
+ if self.kwarg:
287
+ result.append('**%s' % self.kwarg)
288
+ return ', '.join(result)
289
+
290
+ def default_value(self, argname):
291
+ """return the default value for an argument
292
+
293
+ :raise `NoDefault`: if there is no default value defined
294
+ """
295
+ i = _find_arg(argname, self.args)[0]
296
+ if i is not None:
297
+ idx = i - (len(self.args) - len(self.defaults))
298
+ if idx >= 0:
299
+ return self.defaults[idx]
300
+ raise NoDefault()
301
+
302
+ def is_argument(self, name):
303
+ """return True if the name is defined in arguments"""
304
+ if name == self.vararg:
305
+ return True
306
+ if name == self.kwarg:
307
+ return True
308
+ return self.find_argname(name, True)[1] is not None
309
+
310
+ def find_argname(self, argname, rec=False):
311
+ """return index and Name node with given name"""
312
+ if self.args: # self.args may be None in some cases (builtin function)
313
+ return _find_arg(argname, self.args, rec)
314
+ return None, None
315
+
316
+
317
+ def _find_arg(argname, args, rec=False):
318
+ for i, arg in enumerate(args):
319
+ if isinstance(arg, Tuple):
320
+ if rec:
321
+ found = _find_arg(argname, arg.elts)
322
+ if found[0] is not None:
323
+ return found
324
+ elif arg.name == argname:
325
+ return i, arg
326
+ return None, None
327
+
328
+
329
+ def _format_args(args, defaults=None):
330
+ values = []
331
+ if args is None:
332
+ return ''
333
+ if defaults is not None:
334
+ default_offset = len(args) - len(defaults)
335
+ for i, arg in enumerate(args):
336
+ if isinstance(arg, Tuple):
337
+ values.append('(%s)' % _format_args(arg.elts))
338
+ else:
339
+ values.append(arg.name)
340
+ if defaults is not None and i >= default_offset:
341
+ values[-1] += '=' + defaults[i-default_offset].as_string()
342
+ return ', '.join(values)
343
+
344
+
345
+ class AssAttr(NodeNG, ParentAssignTypeMixin):
346
+ """class representing an AssAttr node"""
347
+ _astng_fields = ('expr',)
348
+ expr = None
349
+
350
+ class Assert(StmtMixIn, NodeNG):
351
+ """class representing an Assert node"""
352
+ _astng_fields = ('test', 'fail',)
353
+ test = None
354
+ fail = None
355
+
356
+ class Assign(StmtMixIn, NodeNG, AssignTypeMixin):
357
+ """class representing an Assign node"""
358
+ _astng_fields = ('targets', 'value',)
359
+ targets = None
360
+ value = None
361
+
362
+ class AugAssign(StmtMixIn, NodeNG, AssignTypeMixin):
363
+ """class representing an AugAssign node"""
364
+ _astng_fields = ('target', 'value',)
365
+ target = None
366
+ value = None
367
+
368
+ class Backquote(NodeNG):
369
+ """class representing a Backquote node"""
370
+ _astng_fields = ('value',)
371
+ value = None
372
+
373
+ class BinOp(NodeNG):
374
+ """class representing a BinOp node"""
375
+ _astng_fields = ('left', 'right',)
376
+ left = None
377
+ right = None
378
+
379
+ class BoolOp(NodeNG):
380
+ """class representing a BoolOp node"""
381
+ _astng_fields = ('values',)
382
+ values = None
383
+
384
+ class Break(StmtMixIn, NodeNG):
385
+ """class representing a Break node"""
386
+
387
+
388
+ class CallFunc(NodeNG):
389
+ """class representing a CallFunc node"""
390
+ _astng_fields = ('func', 'args', 'starargs', 'kwargs')
391
+ func = None
392
+ args = None
393
+ starargs = None
394
+ kwargs = None
395
+
396
+ def __init__(self):
397
+ self.starargs = None
398
+ self.kwargs = None
399
+
400
+ class Compare(NodeNG):
401
+ """class representing a Compare node"""
402
+ _astng_fields = ('left', 'ops',)
403
+ left = None
404
+ ops = None
405
+
406
+ def get_children(self):
407
+ """override get_children for tuple fields"""
408
+ yield self.left
409
+ for _, comparator in self.ops:
410
+ yield comparator # we don't want the 'op'
411
+
412
+ def last_child(self):
413
+ """override last_child"""
414
+ # XXX maybe if self.ops:
415
+ return self.ops[-1][1]
416
+ #return self.left
417
+
418
+ class Comprehension(NodeNG):
419
+ """class representing a Comprehension node"""
420
+ _astng_fields = ('target', 'iter' ,'ifs')
421
+ target = None
422
+ iter = None
423
+ ifs = None
424
+
425
+ def ass_type(self):
426
+ return self
427
+
428
+ def _get_filtered_stmts(self, lookup_node, node, stmts, mystmt):
429
+ """method used in filter_stmts"""
430
+ if self is mystmt:
431
+ if isinstance(lookup_node, (Const, Name)):
432
+ return [lookup_node], True
433
+
434
+ elif self.statement() is mystmt:
435
+ # original node's statement is the assignment, only keeps
436
+ # current node (gen exp, list comp)
437
+
438
+ return [node], True
439
+
440
+ return stmts, False
441
+
442
+
443
+ class Const(NodeNG, Instance):
444
+ """represent a Str or Num node"""
445
+
446
+ def __init__(self, value=None):
447
+ self.value = value
448
+
449
+ def getitem(self, index, context=None):
450
+ if isinstance(self.value, basestring):
451
+ return self.value[index]
452
+ raise TypeError('%r (value=%s)' % (self, self.value))
453
+
454
+ def has_dynamic_getattr(self):
455
+ return False
456
+
457
+ def itered(self):
458
+ if isinstance(self.value, basestring):
459
+ return self.value
460
+ raise TypeError()
461
+
462
+ class Continue(StmtMixIn, NodeNG):
463
+ """class representing a Continue node"""
464
+
465
+
466
+ class Decorators(NodeNG):
467
+ """class representing a Decorators node"""
468
+ _astng_fields = ('nodes',)
469
+ nodes = None
470
+
471
+ def __init__(self, nodes=None):
472
+ self.nodes = nodes
473
+
474
+ def scope(self):
475
+ # skip the function node to go directly to the upper level scope
476
+ return self.parent.parent.scope()
477
+
478
+ class DelAttr(NodeNG, ParentAssignTypeMixin):
479
+ """class representing a DelAttr node"""
480
+ _astng_fields = ('expr',)
481
+ expr = None
482
+
483
+
484
+ class Delete(StmtMixIn, NodeNG, AssignTypeMixin):
485
+ """class representing a Delete node"""
486
+ _astng_fields = ('targets',)
487
+ targets = None
488
+
489
+
490
+ class Dict(NodeNG, Instance):
491
+ """class representing a Dict node"""
492
+ _astng_fields = ('items',)
493
+ items = None
494
+
495
+ def pytype(self):
496
+ return '__builtin__.dict'
497
+
498
+ def get_children(self):
499
+ """get children of a Dict node"""
500
+ # overrides get_children
501
+ for key, value in self.items:
502
+ yield key
503
+ yield value
504
+
505
+ def last_child(self):
506
+ """override last_child"""
507
+ if self.items:
508
+ return self.items[-1][1]
509
+ return None
510
+
511
+ def itered(self):
512
+ return self.items[::2]
513
+
514
+ def getitem(self, key, context=None):
515
+ for i in xrange(0, len(self.items), 2):
516
+ for inferedkey in self.items[i].infer(context):
517
+ if inferedkey is YES:
518
+ continue
519
+ if isinstance(inferedkey, Const) and inferedkey.value == key:
520
+ return self.items[i+1]
521
+ raise IndexError(key)
522
+
523
+
524
+ class Discard(StmtMixIn, NodeNG):
525
+ """class representing a Discard node"""
526
+ _astng_fields = ('value',)
527
+ value = None
528
+
529
+
530
+ class Ellipsis(NodeNG):
531
+ """class representing an Ellipsis node"""
532
+
533
+
534
+ class EmptyNode(NodeNG):
535
+ """class representing an EmptyNode node"""
536
+
537
+
538
+ class ExceptHandler(StmtMixIn, NodeNG, AssignTypeMixin):
539
+ """class representing an ExceptHandler node"""
540
+ _astng_fields = ('type', 'name', 'body',)
541
+ type = None
542
+ name = None
543
+ body = None
544
+
545
+ def _blockstart_toline(self):
546
+ if self.name:
547
+ return self.name.tolineno
548
+ elif self.type:
549
+ return self.type.tolineno
550
+ else:
551
+ return self.lineno
552
+
553
+ def set_line_info(self, lastchild):
554
+ self.fromlineno = self.lineno
555
+ self.tolineno = lastchild.tolineno
556
+ self.blockstart_tolineno = self._blockstart_toline()
557
+
558
+ def catch(self, exceptions):
559
+ if self.type is None or exceptions is None:
560
+ return True
561
+ for node in self.type.nodes_of_class(Name):
562
+ if node.name in exceptions:
563
+ return True
564
+
565
+
566
+ class Exec(StmtMixIn, NodeNG):
567
+ """class representing an Exec node"""
568
+ _astng_fields = ('expr', 'globals', 'locals',)
569
+ expr = None
570
+ globals = None
571
+ locals = None
572
+
573
+
574
+ class ExtSlice(NodeNG):
575
+ """class representing an ExtSlice node"""
576
+ _astng_fields = ('dims',)
577
+ dims = None
578
+
579
+
580
+ class For(BlockRangeMixIn, StmtMixIn, AssignTypeMixin, NodeNG):
581
+ """class representing a For node"""
582
+ _astng_fields = ('target', 'iter', 'body', 'orelse',)
583
+ target = None
584
+ iter = None
585
+ body = None
586
+ orelse = None
587
+
588
+ def _blockstart_toline(self):
589
+ return self.iter.tolineno
590
+
591
+
592
+ class From(FromImportMixIn, StmtMixIn, NodeNG):
593
+ """class representing a From node"""
594
+
595
+ def __init__(self, fromname, names, level=0):
596
+ self.modname = fromname
597
+ self.names = names
598
+ self.level = level
599
+
600
+ class Getattr(NodeNG):
601
+ """class representing a Getattr node"""
602
+ _astng_fields = ('expr',)
603
+ expr = None
604
+
605
+
606
+ class Global(StmtMixIn, NodeNG):
607
+ """class representing a Global node"""
608
+
609
+ def __init__(self, names):
610
+ self.names = names
611
+
612
+ def _infer_name(self, frame, name):
613
+ return name
614
+
615
+
616
+ class If(BlockRangeMixIn, StmtMixIn, NodeNG):
617
+ """class representing an If node"""
618
+ _astng_fields = ('test', 'body', 'orelse')
619
+ test = None
620
+ body = None
621
+ orelse = None
622
+
623
+ def _blockstart_toline(self):
624
+ return self.test.tolineno
625
+
626
+ def block_range(self, lineno):
627
+ """handle block line numbers range for if statements"""
628
+ if lineno == self.body[0].fromlineno:
629
+ return lineno, lineno
630
+ if lineno <= self.body[-1].tolineno:
631
+ return lineno, self.body[-1].tolineno
632
+ return self._elsed_block_range(lineno, self.orelse,
633
+ self.body[0].fromlineno - 1)
634
+
635
+
636
+ class IfExp(NodeNG):
637
+ """class representing an IfExp node"""
638
+ _astng_fields = ('test', 'body', 'orelse')
639
+ test = None
640
+ body = None
641
+ orelse = None
642
+
643
+
644
+ class Import(FromImportMixIn, StmtMixIn, NodeNG):
645
+ """class representing an Import node"""
646
+
647
+
648
+ class Index(NodeNG):
649
+ """class representing an Index node"""
650
+ _astng_fields = ('value',)
651
+ value = None
652
+
653
+
654
+ class Keyword(NodeNG):
655
+ """class representing a Keyword node"""
656
+ _astng_fields = ('value',)
657
+ value = None
658
+
659
+
660
+ class List(NodeNG, Instance, ParentAssignTypeMixin):
661
+ """class representing a List node"""
662
+ _astng_fields = ('elts',)
663
+ elts = None
664
+
665
+ def pytype(self):
666
+ return '__builtin__.list'
667
+
668
+ def getitem(self, index, context=None):
669
+ return self.elts[index]
670
+
671
+ def itered(self):
672
+ return self.elts
673
+
674
+
675
+
676
+ class ListComp(NodeNG):
677
+ """class representing a ListComp node"""
678
+ _astng_fields = ('elt', 'generators')
679
+ elt = None
680
+ generators = None
681
+
682
+
683
+ class Pass(StmtMixIn, NodeNG):
684
+ """class representing a Pass node"""
685
+
686
+
687
+ class Print(StmtMixIn, NodeNG):
688
+ """class representing a Print node"""
689
+ _astng_fields = ('dest', 'values',)
690
+ dest = None
691
+ values = None
692
+
693
+
694
+ class Raise(StmtMixIn, NodeNG):
695
+ """class representing a Raise node"""
696
+ _astng_fields = ('type', 'inst', 'tback')
697
+ type = None
698
+ inst = None
699
+ tback = None
700
+
701
+
702
+ class Return(StmtMixIn, NodeNG):
703
+ """class representing a Return node"""
704
+ _astng_fields = ('value',)
705
+ value = None
706
+
707
+
708
+ class Slice(NodeNG):
709
+ """class representing a Slice node"""
710
+ _astng_fields = ('lower', 'upper', 'step')
711
+ lower = None
712
+ upper = None
713
+ step = None
714
+
715
+
716
+ class Subscript(NodeNG):
717
+ """class representing a Subscript node"""
718
+ _astng_fields = ('value', 'slice')
719
+ value = None
720
+ slice = None
721
+
722
+
723
+ class TryExcept(BlockRangeMixIn, StmtMixIn, NodeNG):
724
+ """class representing a TryExcept node"""
725
+ _astng_fields = ('body', 'handlers', 'orelse',)
726
+ body = None
727
+ handlers = None
728
+ orelse = None
729
+
730
+ def _infer_name(self, frame, name):
731
+ return name
732
+
733
+ def _blockstart_toline(self):
734
+ return self.lineno
735
+
736
+ def block_range(self, lineno):
737
+ """handle block line numbers range for try/except statements"""
738
+ last = None
739
+ for exhandler in self.handlers:
740
+ if exhandler.type and lineno == exhandler.type.fromlineno:
741
+ return lineno, lineno
742
+ if exhandler.body[0].fromlineno <= lineno <= exhandler.body[-1].tolineno:
743
+ return lineno, exhandler.body[-1].tolineno
744
+ if last is None:
745
+ last = exhandler.body[0].fromlineno - 1
746
+ return self._elsed_block_range(lineno, self.orelse, last)
747
+
748
+
749
+ class TryFinally(BlockRangeMixIn, StmtMixIn, NodeNG):
750
+ """class representing a TryFinally node"""
751
+ _astng_fields = ('body', 'finalbody',)
752
+ body = None
753
+ finalbody = None
754
+
755
+ def _blockstart_toline(self):
756
+ return self.lineno
757
+
758
+ def block_range(self, lineno):
759
+ """handle block line numbers range for try/finally statements"""
760
+ child = self.body[0]
761
+ # py2.5 try: except: finally:
762
+ if (isinstance(child, TryExcept) and child.fromlineno == self.fromlineno
763
+ and lineno > self.fromlineno and lineno <= child.tolineno):
764
+ return child.block_range(lineno)
765
+ return self._elsed_block_range(lineno, self.finalbody)
766
+
767
+
768
+ class Tuple(NodeNG, Instance, ParentAssignTypeMixin):
769
+ """class representing a Tuple node"""
770
+ _astng_fields = ('elts',)
771
+ elts = None
772
+
773
+ def pytype(self):
774
+ return '__builtin__.tuple'
775
+
776
+ def getitem(self, index, context=None):
777
+ return self.elts[index]
778
+
779
+ def itered(self):
780
+ return self.elts
781
+
782
+
783
+ class UnaryOp(NodeNG):
784
+ """class representing an UnaryOp node"""
785
+ _astng_fields = ('operand',)
786
+ operand = None
787
+
788
+
789
+ class While(BlockRangeMixIn, StmtMixIn, NodeNG):
790
+ """class representing a While node"""
791
+ _astng_fields = ('test', 'body', 'orelse',)
792
+ test = None
793
+ body = None
794
+ orelse = None
795
+
796
+ def _blockstart_toline(self):
797
+ return self.test.tolineno
798
+
799
+ def block_range(self, lineno):
800
+ """handle block line numbers range for for and while statements"""
801
+ return self. _elsed_block_range(lineno, self.orelse)
802
+
803
+ class With(BlockRangeMixIn, StmtMixIn, AssignTypeMixin, NodeNG):
804
+ """class representing a With node"""
805
+ _astng_fields = ('expr', 'vars', 'body')
806
+ expr = None
807
+ vars = None
808
+ body = None
809
+
810
+ def _blockstart_toline(self):
811
+ if self.vars:
812
+ return self.vars.tolineno
813
+ else:
814
+ return self.expr.tolineno
815
+
816
+
817
+ class Yield(NodeNG):
818
+ """class representing a Yield node"""
819
+ _astng_fields = ('value',)
820
+ value = None
821
+
822
+ # constants ##############################################################
823
+
824
+ CONST_CLS = {
825
+ list: List,
826
+ tuple: Tuple,
827
+ dict: Dict,
828
+ }
829
+
830
+ def const_factory(value):
831
+ """return an astng node for a python value"""
832
+ try:
833
+ # if value is of class list, tuple, dict use specific class, not Const
834
+ cls = CONST_CLS[value.__class__]
835
+ node = cls()
836
+ if isinstance(node, Dict):
837
+ node.items = ()
838
+ else:
839
+ node.elts = ()
840
+ except KeyError:
841
+ # why was value in (None, False, True) not OK?
842
+ assert isinstance(value, (int, long, complex, float, basestring)) or value in (None, False, True)
843
+ node = Const()
844
+ node.value = value
845
+ return node
846
+
847
+
848
+