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,372 @@
1
+ # copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
2
+ # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
3
+ #
4
+ # This file is part of logilab-common.
5
+ #
6
+ # logilab-common is free software: you can redistribute it and/or modify it under
7
+ # the terms of the GNU Lesser General Public License as published by the Free
8
+ # Software Foundation, either version 2.1 of the License, or (at your option) any
9
+ # later version.
10
+ #
11
+ # logilab-common is distributed in the hope that it will be useful, but WITHOUT
12
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13
+ # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
14
+ # details.
15
+ #
16
+ # You should have received a copy of the GNU Lesser General Public License along
17
+ # with logilab-common. If not, see <http://www.gnu.org/licenses/>.
18
+ """Base class to represent a tree structure.
19
+
20
+
21
+
22
+
23
+ """
24
+ __docformat__ = "restructuredtext en"
25
+
26
+ import sys
27
+
28
+ from logilab.common import flatten
29
+ from logilab.common.visitor import VisitedMixIn, FilteredIterator, no_filter
30
+
31
+ ## Exceptions #################################################################
32
+
33
+ class NodeNotFound(Exception):
34
+ """raised when a node has not been found"""
35
+
36
+ EX_SIBLING_NOT_FOUND = "No such sibling as '%s'"
37
+ EX_CHILD_NOT_FOUND = "No such child as '%s'"
38
+ EX_NODE_NOT_FOUND = "No such node as '%s'"
39
+
40
+
41
+ # Base node ###################################################################
42
+
43
+ class Node(object):
44
+ """a basic tree node, characterized by an id"""
45
+
46
+ def __init__(self, nid=None) :
47
+ self.id = nid
48
+ # navigation
49
+ self.parent = None
50
+ self.children = []
51
+
52
+ def __iter__(self):
53
+ return iter(self.children)
54
+
55
+ def __str__(self, indent=0):
56
+ s = ['%s%s %s' % (' '*indent, self.__class__.__name__, self.id)]
57
+ indent += 2
58
+ for child in self.children:
59
+ try:
60
+ s.append(child.__str__(indent))
61
+ except TypeError:
62
+ s.append(child.__str__())
63
+ return '\n'.join(s)
64
+
65
+ def is_leaf(self):
66
+ return not self.children
67
+
68
+ def append(self, child):
69
+ """add a node to children"""
70
+ self.children.append(child)
71
+ child.parent = self
72
+
73
+ def remove(self, child):
74
+ """remove a child node"""
75
+ self.children.remove(child)
76
+ child.parent = None
77
+
78
+ def insert(self, index, child):
79
+ """insert a child node"""
80
+ self.children.insert(index, child)
81
+ child.parent = self
82
+
83
+ def replace(self, old_child, new_child):
84
+ """replace a child node with another"""
85
+ i = self.children.index(old_child)
86
+ self.children.pop(i)
87
+ self.children.insert(i, new_child)
88
+ new_child.parent = self
89
+
90
+ def get_sibling(self, nid):
91
+ """return the sibling node that has given id"""
92
+ try:
93
+ return self.parent.get_child_by_id(nid)
94
+ except NodeNotFound :
95
+ raise NodeNotFound(EX_SIBLING_NOT_FOUND % nid)
96
+
97
+ def next_sibling(self):
98
+ """
99
+ return the next sibling for this node if any
100
+ """
101
+ parent = self.parent
102
+ if parent is None:
103
+ # root node has no sibling
104
+ return None
105
+ index = parent.children.index(self)
106
+ try:
107
+ return parent.children[index+1]
108
+ except IndexError:
109
+ return None
110
+
111
+ def previous_sibling(self):
112
+ """
113
+ return the previous sibling for this node if any
114
+ """
115
+ parent = self.parent
116
+ if parent is None:
117
+ # root node has no sibling
118
+ return None
119
+ index = parent.children.index(self)
120
+ if index > 0:
121
+ return parent.children[index-1]
122
+ return None
123
+
124
+ def get_node_by_id(self, nid):
125
+ """
126
+ return node in whole hierarchy that has given id
127
+ """
128
+ root = self.root()
129
+ try:
130
+ return root.get_child_by_id(nid, 1)
131
+ except NodeNotFound :
132
+ raise NodeNotFound(EX_NODE_NOT_FOUND % nid)
133
+
134
+ def get_child_by_id(self, nid, recurse=None):
135
+ """
136
+ return child of given id
137
+ """
138
+ if self.id == nid:
139
+ return self
140
+ for c in self.children :
141
+ if recurse:
142
+ try:
143
+ return c.get_child_by_id(nid, 1)
144
+ except NodeNotFound :
145
+ continue
146
+ if c.id == nid :
147
+ return c
148
+ raise NodeNotFound(EX_CHILD_NOT_FOUND % nid)
149
+
150
+ def get_child_by_path(self, path):
151
+ """
152
+ return child of given path (path is a list of ids)
153
+ """
154
+ if len(path) > 0 and path[0] == self.id:
155
+ if len(path) == 1 :
156
+ return self
157
+ else :
158
+ for c in self.children :
159
+ try:
160
+ return c.get_child_by_path(path[1:])
161
+ except NodeNotFound :
162
+ pass
163
+ raise NodeNotFound(EX_CHILD_NOT_FOUND % path)
164
+
165
+ def depth(self):
166
+ """
167
+ return depth of this node in the tree
168
+ """
169
+ if self.parent is not None:
170
+ return 1 + self.parent.depth()
171
+ else :
172
+ return 0
173
+
174
+ def depth_down(self):
175
+ """
176
+ return depth of the tree from this node
177
+ """
178
+ if self.children:
179
+ return 1 + max([c.depth_down() for c in self.children])
180
+ return 1
181
+
182
+ def width(self):
183
+ """
184
+ return the width of the tree from this node
185
+ """
186
+ return len(self.leaves())
187
+
188
+ def root(self):
189
+ """
190
+ return the root node of the tree
191
+ """
192
+ if self.parent is not None:
193
+ return self.parent.root()
194
+ return self
195
+
196
+ def leaves(self):
197
+ """
198
+ return a list with all the leaves nodes descendant from this node
199
+ """
200
+ leaves = []
201
+ if self.children:
202
+ for child in self.children:
203
+ leaves += child.leaves()
204
+ return leaves
205
+ else:
206
+ return [self]
207
+
208
+ def __iter__(self):
209
+ return iter(self.children)
210
+
211
+ def flatten(self, _list=None):
212
+ """
213
+ return a list with all the nodes descendant from this node
214
+ """
215
+ if _list is None:
216
+ _list = []
217
+ _list.append(self)
218
+ for c in self.children:
219
+ c.flatten(_list)
220
+ return _list
221
+
222
+ def lineage(self):
223
+ """
224
+ return list of parents up to root node
225
+ """
226
+ lst = [self]
227
+ if self.parent is not None:
228
+ lst.extend(self.parent.lineage())
229
+ return lst
230
+
231
+ class VNode(Node, VisitedMixIn):
232
+ """a visitable node
233
+ """
234
+ pass
235
+
236
+
237
+ class BinaryNode(VNode):
238
+ """a binary node (i.e. only two children
239
+ """
240
+ def __init__(self, lhs=None, rhs=None) :
241
+ VNode.__init__(self)
242
+ if lhs is not None or rhs is not None:
243
+ assert lhs and rhs
244
+ self.append(lhs)
245
+ self.append(rhs)
246
+
247
+ def remove(self, child):
248
+ """remove the child and replace this node with the other child
249
+ """
250
+ self.children.remove(child)
251
+ self.parent.replace(self, self.children[0])
252
+
253
+ def get_parts(self):
254
+ """
255
+ return the left hand side and the right hand side of this node
256
+ """
257
+ return self.children[0], self.children[1]
258
+
259
+
260
+
261
+ if sys.version_info[0:2] >= (2, 2):
262
+ list_class = list
263
+ else:
264
+ from UserList import UserList
265
+ list_class = UserList
266
+
267
+ class ListNode(VNode, list_class):
268
+ """Used to manipulate Nodes as Lists
269
+ """
270
+ def __init__(self):
271
+ list_class.__init__(self)
272
+ VNode.__init__(self)
273
+ self.children = self
274
+
275
+ def __str__(self, indent=0):
276
+ return '%s%s %s' % (indent*' ', self.__class__.__name__,
277
+ ', '.join([str(v) for v in self]))
278
+
279
+ def append(self, child):
280
+ """add a node to children"""
281
+ list_class.append(self, child)
282
+ child.parent = self
283
+
284
+ def insert(self, index, child):
285
+ """add a node to children"""
286
+ list_class.insert(self, index, child)
287
+ child.parent = self
288
+
289
+ def remove(self, child):
290
+ """add a node to children"""
291
+ list_class.remove(self, child)
292
+ child.parent = None
293
+
294
+ def pop(self, index):
295
+ """add a node to children"""
296
+ child = list_class.pop(self, index)
297
+ child.parent = None
298
+
299
+ def __iter__(self):
300
+ return list_class.__iter__(self)
301
+
302
+ # construct list from tree ####################################################
303
+
304
+ def post_order_list(node, filter_func=no_filter):
305
+ """
306
+ create a list with tree nodes for which the <filter> function returned true
307
+ in a post order fashion
308
+ """
309
+ l, stack = [], []
310
+ poped, index = 0, 0
311
+ while node:
312
+ if filter_func(node):
313
+ if node.children and not poped:
314
+ stack.append((node, index))
315
+ index = 0
316
+ node = node.children[0]
317
+ else:
318
+ l.append(node)
319
+ index += 1
320
+ try:
321
+ node = stack[-1][0].children[index]
322
+ except IndexError:
323
+ node = None
324
+ else:
325
+ node = None
326
+ poped = 0
327
+ if node is None and stack:
328
+ node, index = stack.pop()
329
+ poped = 1
330
+ return l
331
+
332
+ def pre_order_list(node, filter_func=no_filter):
333
+ """
334
+ create a list with tree nodes for which the <filter> function returned true
335
+ in a pre order fashion
336
+ """
337
+ l, stack = [], []
338
+ poped, index = 0, 0
339
+ while node:
340
+ if filter_func(node):
341
+ if not poped:
342
+ l.append(node)
343
+ if node.children and not poped:
344
+ stack.append((node, index))
345
+ index = 0
346
+ node = node.children[0]
347
+ else:
348
+ index += 1
349
+ try:
350
+ node = stack[-1][0].children[index]
351
+ except IndexError:
352
+ node = None
353
+ else:
354
+ node = None
355
+ poped = 0
356
+ if node is None and len(stack) > 1:
357
+ node, index = stack.pop()
358
+ poped = 1
359
+ return l
360
+
361
+ class PostfixedDepthFirstIterator(FilteredIterator):
362
+ """a postfixed depth first iterator, designed to be used with visitors
363
+ """
364
+ def __init__(self, node, filter_func=None):
365
+ FilteredIterator.__init__(self, node, post_order_list, filter_func)
366
+
367
+ class PrefixedDepthFirstIterator(FilteredIterator):
368
+ """a prefixed depth first iterator, designed to be used with visitors
369
+ """
370
+ def __init__(self, node, filter_func=None):
371
+ FilteredIterator.__init__(self, node, pre_order_list, filter_func)
372
+
@@ -0,0 +1,161 @@
1
+ # copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
2
+ # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
3
+ #
4
+ # This file is part of logilab-common.
5
+ #
6
+ # logilab-common is free software: you can redistribute it and/or modify it under
7
+ # the terms of the GNU Lesser General Public License as published by the Free
8
+ # Software Foundation, either version 2.1 of the License, or (at your option) any
9
+ # later version.
10
+ #
11
+ # logilab-common is distributed in the hope that it will be useful, but WITHOUT
12
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13
+ # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
14
+ # details.
15
+ #
16
+ # You should have received a copy of the GNU Lesser General Public License along
17
+ # with logilab-common. If not, see <http://www.gnu.org/licenses/>.
18
+ """Unicode email support (extends email from stdlib).
19
+
20
+
21
+
22
+
23
+ """
24
+ __docformat__ = "restructuredtext en"
25
+
26
+ import email
27
+ from encodings import search_function
28
+ from email.Utils import parseaddr, parsedate
29
+ from email.Header import decode_header
30
+ from datetime import datetime
31
+
32
+ try:
33
+ from mx.DateTime import DateTime
34
+ except ImportError:
35
+ DateTime = datetime
36
+
37
+ import logilab.common as lgc
38
+
39
+
40
+ def decode_QP(string):
41
+ parts = []
42
+ for decoded, charset in decode_header(string):
43
+ if not charset :
44
+ charset = 'iso-8859-15'
45
+ parts.append(unicode(decoded, charset, 'replace'))
46
+
47
+ return u' '.join(parts)
48
+
49
+ def message_from_file(fd):
50
+ try:
51
+ return UMessage(email.message_from_file(fd))
52
+ except email.Errors.MessageParseError:
53
+ return ''
54
+
55
+ def message_from_string(string):
56
+ try:
57
+ return UMessage(email.message_from_string(string))
58
+ except email.Errors.MessageParseError:
59
+ return ''
60
+
61
+ class UMessage:
62
+ """Encapsulates an email.Message instance and returns only unicode objects.
63
+ """
64
+
65
+ def __init__(self, message):
66
+ self.message = message
67
+
68
+ # email.Message interface #################################################
69
+
70
+ def get(self, header, default=None):
71
+ value = self.message.get(header, default)
72
+ if value:
73
+ return decode_QP(value)
74
+ return value
75
+
76
+ def get_all(self, header, default=()):
77
+ return [decode_QP(val) for val in self.message.get_all(header, default)
78
+ if val is not None]
79
+
80
+ def get_payload(self, index=None, decode=False):
81
+ message = self.message
82
+ if index is None:
83
+ payload = message.get_payload(index, decode)
84
+ if isinstance(payload, list):
85
+ return [UMessage(msg) for msg in payload]
86
+ if message.get_content_maintype() != 'text':
87
+ return payload
88
+
89
+ charset = message.get_content_charset() or 'iso-8859-1'
90
+ if search_function(charset) is None:
91
+ charset = 'iso-8859-1'
92
+ return unicode(payload or '', charset, "replace")
93
+ else:
94
+ payload = UMessage(message.get_payload(index, decode))
95
+ return payload
96
+
97
+ def is_multipart(self):
98
+ return self.message.is_multipart()
99
+
100
+ def get_boundary(self):
101
+ return self.message.get_boundary()
102
+
103
+ def walk(self):
104
+ for part in self.message.walk():
105
+ yield UMessage(part)
106
+
107
+ def get_content_maintype(self):
108
+ return unicode(self.message.get_content_maintype())
109
+
110
+ def get_content_type(self):
111
+ return unicode(self.message.get_content_type())
112
+
113
+ def get_filename(self, failobj=None):
114
+ value = self.message.get_filename(failobj)
115
+ if value is failobj:
116
+ return value
117
+ try:
118
+ return unicode(value)
119
+ except UnicodeDecodeError:
120
+ return u'error decoding filename'
121
+
122
+ # other convenience methods ###############################################
123
+
124
+ def headers(self):
125
+ """return an unicode string containing all the message's headers"""
126
+ values = []
127
+ for header in self.message.keys():
128
+ values.append(u'%s: %s' % (header, self.get(header)))
129
+ return '\n'.join(values)
130
+
131
+ def multi_addrs(self, header):
132
+ """return a list of 2-uple (name, address) for the given address (which
133
+ is expected to be an header containing address such as from, to, cc...)
134
+ """
135
+ persons = []
136
+ for person in self.get_all(header, ()):
137
+ name, mail = parseaddr(person)
138
+ persons.append((name, mail))
139
+ return persons
140
+
141
+ def date(self, alternative_source=False, return_str=False):
142
+ """return a datetime object for the email's date or None if no date is
143
+ set or if it can't be parsed
144
+ """
145
+ value = self.get('date')
146
+ if value is None and alternative_source:
147
+ unix_from = self.message.get_unixfrom()
148
+ if unix_from is not None:
149
+ try:
150
+ value = unix_from.split(" ", 2)[2]
151
+ except IndexError:
152
+ pass
153
+ if value is not None:
154
+ datetuple = parsedate(value)
155
+ if datetuple:
156
+ if lgc.USE_MX_DATETIME:
157
+ return DateTime(*datetuple[:6])
158
+ return datetime(*datetuple[:6])
159
+ elif not return_str:
160
+ return None
161
+ return value
@@ -0,0 +1,174 @@
1
+ # copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
2
+ # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
3
+ #
4
+ # This file is part of logilab-common.
5
+ #
6
+ # logilab-common is free software: you can redistribute it and/or modify it under
7
+ # the terms of the GNU Lesser General Public License as published by the Free
8
+ # Software Foundation, either version 2.1 of the License, or (at your option) any
9
+ # later version.
10
+ #
11
+ # logilab-common is distributed in the hope that it will be useful, but WITHOUT
12
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13
+ # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
14
+ # details.
15
+ #
16
+ # You should have received a copy of the GNU Lesser General Public License along
17
+ # with logilab-common. If not, see <http://www.gnu.org/licenses/>.
18
+ """Universal report objects and some formatting drivers.
19
+
20
+ A way to create simple reports using python objects, primarily designed to be
21
+ formatted as text and html.
22
+ """
23
+ from __future__ import generators
24
+ __docformat__ = "restructuredtext en"
25
+
26
+ import sys
27
+ from cStringIO import StringIO
28
+ from StringIO import StringIO as UStringIO
29
+
30
+ from logilab.common.textutils import linesep
31
+
32
+
33
+ def get_nodes(node, klass):
34
+ """return an iterator on all children node of the given klass"""
35
+ for child in node.children:
36
+ if isinstance(child, klass):
37
+ yield child
38
+ # recurse (FIXME: recursion controled by an option)
39
+ for grandchild in get_nodes(child, klass):
40
+ yield grandchild
41
+
42
+ def layout_title(layout):
43
+ """try to return the layout's title as string, return None if not found
44
+ """
45
+ for child in layout.children:
46
+ if isinstance(child, Title):
47
+ return ' '.join([node.data for node in get_nodes(child, Text)])
48
+
49
+ def build_summary(layout, level=1):
50
+ """make a summary for the report, including X level"""
51
+ assert level > 0
52
+ level -= 1
53
+ summary = List(klass='summary')
54
+ for child in layout.children:
55
+ if not isinstance(child, Section):
56
+ continue
57
+ label = layout_title(child)
58
+ if not label and not child.id:
59
+ continue
60
+ if not child.id:
61
+ child.id = label.replace(' ', '-')
62
+ node = Link('#'+child.id, label=label or child.id)
63
+ # FIXME: Three following lines produce not very compliant
64
+ # docbook: there are some useless <para><para>. They might be
65
+ # replaced by the three commented lines but this then produces
66
+ # a bug in html display...
67
+ if level and [n for n in child.children if isinstance(n, Section)]:
68
+ node = Paragraph([node, build_summary(child, level)])
69
+ summary.append(node)
70
+ # summary.append(node)
71
+ # if level and [n for n in child.children if isinstance(n, Section)]:
72
+ # summary.append(build_summary(child, level))
73
+ return summary
74
+
75
+
76
+ class BaseWriter(object):
77
+ """base class for ureport writers"""
78
+
79
+ def format(self, layout, stream=None, encoding=None):
80
+ """format and write the given layout into the stream object
81
+
82
+ unicode policy: unicode strings may be found in the layout;
83
+ try to call stream.write with it, but give it back encoded using
84
+ the given encoding if it fails
85
+ """
86
+ if stream is None:
87
+ stream = sys.stdout
88
+ if not encoding:
89
+ encoding = getattr(stream, 'encoding', 'UTF-8')
90
+ self.encoding = encoding or 'UTF-8'
91
+ self.__compute_funcs = []
92
+ self.out = stream
93
+ self.begin_format(layout)
94
+ layout.accept(self)
95
+ self.end_format(layout)
96
+
97
+ def format_children(self, layout):
98
+ """recurse on the layout children and call their accept method
99
+ (see the Visitor pattern)
100
+ """
101
+ for child in getattr(layout, 'children', ()):
102
+ child.accept(self)
103
+
104
+ def writeln(self, string=''):
105
+ """write a line in the output buffer"""
106
+ self.write(string + linesep)
107
+
108
+ def write(self, string):
109
+ """write a string in the output buffer"""
110
+ try:
111
+ self.out.write(string)
112
+ except UnicodeEncodeError:
113
+ self.out.write(string.encode(self.encoding))
114
+
115
+ def begin_format(self, layout):
116
+ """begin to format a layout"""
117
+ self.section = 0
118
+
119
+ def end_format(self, layout):
120
+ """finished to format a layout"""
121
+
122
+ def get_table_content(self, table):
123
+ """trick to get table content without actually writing it
124
+
125
+ return an aligned list of lists containing table cells values as string
126
+ """
127
+ result = [[]]
128
+ cols = table.cols
129
+ for cell in self.compute_content(table):
130
+ if cols == 0:
131
+ result.append([])
132
+ cols = table.cols
133
+ cols -= 1
134
+ result[-1].append(cell)
135
+ # fill missing cells
136
+ while len(result[-1]) < cols:
137
+ result[-1].append('')
138
+ return result
139
+
140
+ def compute_content(self, layout):
141
+ """trick to compute the formatting of children layout before actually
142
+ writing it
143
+
144
+ return an iterator on strings (one for each child element)
145
+ """
146
+ # use cells !
147
+ def write(data):
148
+ try:
149
+ stream.write(data)
150
+ except UnicodeEncodeError:
151
+ stream.write(data.encode(self.encoding))
152
+ def writeln(data=''):
153
+ try:
154
+ stream.write(data+linesep)
155
+ except UnicodeEncodeError:
156
+ stream.write(data.encode(self.encoding)+linesep)
157
+ self.write = write
158
+ self.writeln = writeln
159
+ self.__compute_funcs.append((write, writeln))
160
+ for child in layout.children:
161
+ stream = UStringIO()
162
+ child.accept(self)
163
+ yield stream.getvalue()
164
+ self.__compute_funcs.pop()
165
+ try:
166
+ self.write, self.writeln = self.__compute_funcs[-1]
167
+ except IndexError:
168
+ del self.write
169
+ del self.writeln
170
+
171
+
172
+ from logilab.common.ureports.nodes import *
173
+ from logilab.common.ureports.text_writer import TextWriter
174
+ from logilab.common.ureports.html_writer import HTMLWriter