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,58 @@
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
+ """A few useful context managers
19
+
20
+
21
+
22
+
23
+ """
24
+ __docformat__ = "restructuredtext en"
25
+
26
+ import sys
27
+
28
+ if sys.version_info < (2, 5):
29
+ raise ImportError("python >= 2.5 is required to import logilab.common.contexts")
30
+
31
+ import os
32
+ import tempfile
33
+ import shutil
34
+
35
+ class tempdir(object):
36
+
37
+ def __enter__(self):
38
+ self.path = tempfile.mkdtemp()
39
+ return self.path
40
+
41
+ def __exit__(self, exctype, value, traceback):
42
+ # rmtree in all cases
43
+ shutil.rmtree(self.path)
44
+ return traceback is None
45
+
46
+
47
+ class pushd(object):
48
+ def __init__(self, directory):
49
+ self.directory = directory
50
+
51
+ def __enter__(self):
52
+ self.cwd = os.getcwd()
53
+ os.chdir(self.directory)
54
+ return self.directory
55
+
56
+ def __exit__(self, exctype, value, traceback):
57
+ os.chdir(self.cwd)
58
+
@@ -0,0 +1,117 @@
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
+ """A set of utility function to ease the use of OmniORBpy.
19
+
20
+
21
+
22
+
23
+ """
24
+ __docformat__ = "restructuredtext en"
25
+
26
+ from omniORB import CORBA, PortableServer
27
+ import CosNaming
28
+
29
+ orb = None
30
+
31
+ def get_orb():
32
+ """
33
+ returns a reference to the ORB.
34
+ The first call to the method initialized the ORB
35
+ This method is mainly used internally in the module.
36
+ """
37
+
38
+ global orb
39
+ if orb is None:
40
+ import sys
41
+ orb = CORBA.ORB_init(sys.argv, CORBA.ORB_ID)
42
+ return orb
43
+
44
+ def get_root_context():
45
+ """
46
+ returns a reference to the NameService object.
47
+ This method is mainly used internally in the module.
48
+ """
49
+
50
+ orb = get_orb()
51
+ nss = orb.resolve_initial_references("NameService")
52
+ rootContext = nss._narrow(CosNaming.NamingContext)
53
+ assert rootContext is not None,"Failed to narrow root naming context"
54
+ return rootContext
55
+
56
+ def register_object_name(object, namepath):
57
+ """
58
+ Registers a object in the NamingService.
59
+ The name path is a list of 2-uples (id,kind) giving the path.
60
+
61
+ For instance if the path of an object is [('foo',''),('bar','')],
62
+ it is possible to get a reference to the object using the URL
63
+ 'corbaname::hostname#foo/bar'.
64
+ [('logilab','rootmodule'),('chatbot','application'),('chatter','server')]
65
+ is mapped to
66
+ 'corbaname::hostname#logilab.rootmodule/chatbot.application/chatter.server'
67
+
68
+ The get_object_reference() function can be used to resolve such a URL.
69
+ """
70
+ context = get_root_context()
71
+ for id, kind in namepath[:-1]:
72
+ name = [CosNaming.NameComponent(id, kind)]
73
+ try:
74
+ context = context.bind_new_context(name)
75
+ except CosNaming.NamingContext.AlreadyBound, ex:
76
+ context = context.resolve(name)._narrow(CosNaming.NamingContext)
77
+ assert context is not None, \
78
+ 'test context exists but is not a NamingContext'
79
+
80
+ id,kind = namepath[-1]
81
+ name = [CosNaming.NameComponent(id, kind)]
82
+ try:
83
+ context.bind(name, object._this())
84
+ except CosNaming.NamingContext.AlreadyBound, ex:
85
+ context.rebind(name, object._this())
86
+
87
+ def activate_POA():
88
+ """
89
+ This methods activates the Portable Object Adapter.
90
+ You need to call it to enable the reception of messages in your code,
91
+ on both the client and the server.
92
+ """
93
+ orb = get_orb()
94
+ poa = orb.resolve_initial_references('RootPOA')
95
+ poaManager = poa._get_the_POAManager()
96
+ poaManager.activate()
97
+
98
+ def run_orb():
99
+ """
100
+ Enters the ORB mainloop on the server.
101
+ You should not call this method on the client.
102
+ """
103
+ get_orb().run()
104
+
105
+ def get_object_reference(url):
106
+ """
107
+ Resolves a corbaname URL to an object proxy.
108
+ See register_object_name() for examples URLs
109
+ """
110
+ return get_orb().string_to_object(url)
111
+
112
+ def get_object_string(host, namepath):
113
+ """given an host name and a name path as described in register_object_name,
114
+ return a corba string identifier
115
+ """
116
+ strname = '/'.join(['.'.join(path_elt) for path_elt in namepath])
117
+ return 'corbaname::%s#%s' % (host, strname)
@@ -0,0 +1,171 @@
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
+ """A daemonize function (for Unices) and daemon mix-in class"""
19
+
20
+ __docformat__ = "restructuredtext en"
21
+
22
+ import os
23
+ import errno
24
+ import signal
25
+ import sys
26
+ import time
27
+ import warnings
28
+
29
+
30
+ def daemonize(pidfile):
31
+ # See http://www.erlenstar.demon.co.uk/unix/faq_toc.html#TOC16
32
+ # XXX unix specific
33
+ #
34
+ # fork so the parent can exit
35
+ if os.fork(): # launch child and...
36
+ return 1
37
+ # deconnect from tty and create a new session
38
+ os.setsid()
39
+ # fork again so the parent, (the session group leader), can exit.
40
+ # as a non-session group leader, we can never regain a controlling
41
+ # terminal.
42
+ if os.fork(): # launch child again.
43
+ return 1
44
+ # move to the root to avoit mount pb
45
+ os.chdir('/')
46
+ # set paranoid umask
47
+ os.umask(077)
48
+ # redirect standard descriptors
49
+ null = os.open('/dev/null', os.O_RDWR)
50
+ for i in range(3):
51
+ try:
52
+ os.dup2(null, i)
53
+ except OSError, e:
54
+ if e.errno != errno.EBADF:
55
+ raise
56
+ os.close(null)
57
+ # filter warnings
58
+ warnings.filterwarnings('ignore')
59
+ # write pid in a file
60
+ if pidfile:
61
+ # ensure the directory where the pid-file should be set exists (for
62
+ # instance /var/run/cubicweb may be deleted on computer restart)
63
+ piddir = os.path.dirname(pidfile)
64
+ if not os.path.exists(piddir):
65
+ os.makedirs(piddir)
66
+ f = file(pidfile, 'w')
67
+ f.write(str(os.getpid()))
68
+ f.close()
69
+ return None
70
+
71
+
72
+ class DaemonMixIn:
73
+ """Mixin to make a daemon from watchers/queriers.
74
+ """
75
+
76
+ def __init__(self, configmod) :
77
+ self.delay = configmod.DELAY
78
+ self.name = str(self.__class__).split('.')[-1]
79
+ self._pid_file = os.path.join('/tmp', '%s.pid'%self.name)
80
+ if os.path.exists(self._pid_file):
81
+ raise Exception('''Another instance of %s must be running.
82
+ If it i not the case, remove the file %s''' % (self.name, self._pid_file))
83
+ self._alive = 1
84
+ self._sleeping = 0
85
+ self.config = configmod
86
+
87
+ def _daemonize(self):
88
+ if not self.config.NODETACH:
89
+ if daemonize(self._pid_file) is None:
90
+ # put signal handler
91
+ signal.signal(signal.SIGTERM, self.signal_handler)
92
+ signal.signal(signal.SIGHUP, self.signal_handler)
93
+ else:
94
+ return -1
95
+
96
+ def run(self):
97
+ """ optionally go in daemon mode and
98
+ do what concrete class has to do and pauses for delay between runs
99
+ If self.delay is negative, do a pause before starting
100
+ """
101
+ if self._daemonize() == -1:
102
+ return
103
+ if self.delay < 0:
104
+ self.delay = -self.delay
105
+ time.sleep(self.delay)
106
+ while 1:
107
+ try:
108
+ self._run()
109
+ except Exception, ex:
110
+ # display for info, sleep, and hope the problem will be solved
111
+ # later.
112
+ self.config.exception('Internal error: %s', ex)
113
+ if not self._alive:
114
+ break
115
+ try:
116
+ self._sleeping = 1
117
+ time.sleep(self.delay)
118
+ self._sleeping = 0
119
+ except SystemExit:
120
+ break
121
+ self.config.info('%s instance exited', self.name)
122
+ # remove pid file
123
+ os.remove(self._pid_file)
124
+
125
+ def signal_handler(self, sig_num, stack_frame):
126
+ if sig_num == signal.SIGTERM:
127
+ if self._sleeping:
128
+ # we are sleeping so we can exit without fear
129
+ self.config.debug('exit on SIGTERM')
130
+ sys.exit(0)
131
+ else:
132
+ self.config.debug('exit on SIGTERM (on next turn)')
133
+ self._alive = 0
134
+ elif sig_num == signal.SIGHUP:
135
+ self.config.info('reloading configuration on SIGHUP')
136
+ reload(self.config)
137
+
138
+ def _run(self):
139
+ """should be overridden in the mixed class"""
140
+ raise NotImplementedError()
141
+
142
+
143
+ import logging
144
+ from logilab.common.logging_ext import set_log_methods
145
+ set_log_methods(DaemonMixIn, logging.getLogger('lgc.daemon'))
146
+
147
+ ## command line utilities ######################################################
148
+
149
+ L_OPTIONS = ["help", "log=", "delay=", 'no-detach']
150
+ S_OPTIONS = 'hl:d:n'
151
+
152
+ def print_help(modconfig):
153
+ print """ --help or -h
154
+ displays this message
155
+ --log <log_level>
156
+ log treshold (7 record everything, 0 record only emergency.)
157
+ Defaults to %s
158
+ --delay <delay>
159
+ the number of seconds between two runs.
160
+ Defaults to %s""" % (modconfig.LOG_TRESHOLD, modconfig.DELAY)
161
+
162
+ def handle_option(modconfig, opt_name, opt_value, help_meth):
163
+ if opt_name in ('-h','--help'):
164
+ help_meth()
165
+ sys.exit(0)
166
+ elif opt_name in ('-l','--log'):
167
+ modconfig.LOG_TRESHOLD = int(opt_value)
168
+ elif opt_name in ('-d', '--delay'):
169
+ modconfig.DELAY = int(opt_value)
170
+ elif opt_name in ('-n', '--no-detach'):
171
+ modconfig.NODETACH = 1
@@ -0,0 +1,279 @@
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
+ """Date manipulation helper functions.
19
+
20
+
21
+
22
+
23
+ """
24
+ __docformat__ = "restructuredtext en"
25
+
26
+ import math
27
+ from locale import getpreferredencoding
28
+ from datetime import date, time, datetime, timedelta
29
+ from time import strptime as time_strptime
30
+ from calendar import monthrange, timegm
31
+
32
+ try:
33
+ from mx.DateTime import RelativeDateTime, Date, DateTimeType
34
+ except ImportError:
35
+ from warnings import warn
36
+ warn("mxDateTime not found, endOfMonth won't be available")
37
+ endOfMonth = None
38
+ DateTimeType = datetime
39
+ else:
40
+ endOfMonth = RelativeDateTime(months=1, day=-1)
41
+
42
+ # NOTE: should we implement a compatibility layer between date representations
43
+ # as we have in lgc.db ?
44
+
45
+ FRENCH_FIXED_HOLIDAYS = {
46
+ 'jour_an' : '%s-01-01',
47
+ 'fete_travail' : '%s-05-01',
48
+ 'armistice1945' : '%s-05-08',
49
+ 'fete_nat' : '%s-07-14',
50
+ 'assomption' : '%s-08-15',
51
+ 'toussaint' : '%s-11-01',
52
+ 'armistice1918' : '%s-11-11',
53
+ 'noel' : '%s-12-25',
54
+ }
55
+
56
+ FRENCH_MOBILE_HOLIDAYS = {
57
+ 'paques2004' : '2004-04-12',
58
+ 'ascension2004' : '2004-05-20',
59
+ 'pentecote2004' : '2004-05-31',
60
+
61
+ 'paques2005' : '2005-03-28',
62
+ 'ascension2005' : '2005-05-05',
63
+ 'pentecote2005' : '2005-05-16',
64
+
65
+ 'paques2006' : '2006-04-17',
66
+ 'ascension2006' : '2006-05-25',
67
+ 'pentecote2006' : '2006-06-05',
68
+
69
+ 'paques2007' : '2007-04-09',
70
+ 'ascension2007' : '2007-05-17',
71
+ 'pentecote2007' : '2007-05-28',
72
+
73
+ 'paques2008' : '2008-03-24',
74
+ 'ascension2008' : '2008-05-01',
75
+ 'pentecote2008' : '2008-05-12',
76
+
77
+ 'paques2009' : '2009-04-13',
78
+ 'ascension2009' : '2009-05-21',
79
+ 'pentecote2009' : '2009-06-01',
80
+
81
+ 'paques2010' : '2010-04-05',
82
+ 'ascension2010' : '2010-05-13',
83
+ 'pentecote2010' : '2010-05-24',
84
+
85
+ 'paques2011' : '2011-04-25',
86
+ 'ascension2011' : '2011-06-02',
87
+ 'pentecote2011' : '2011-06-13',
88
+
89
+ 'paques2012' : '2012-04-09',
90
+ 'ascension2012' : '2012-05-17',
91
+ 'pentecote2012' : '2012-05-28',
92
+ }
93
+
94
+ # XXX this implementation cries for multimethod dispatching
95
+
96
+ def get_step(dateobj, nbdays=1):
97
+ # assume date is either a python datetime or a mx.DateTime object
98
+ if isinstance(dateobj, date):
99
+ return ONEDAY * nbdays
100
+ return nbdays # mx.DateTime is ok with integers
101
+
102
+ def datefactory(year, month, day, sampledate):
103
+ # assume date is either a python datetime or a mx.DateTime object
104
+ if isinstance(sampledate, datetime):
105
+ return datetime(year, month, day)
106
+ if isinstance(sampledate, date):
107
+ return date(year, month, day)
108
+ return Date(year, month, day)
109
+
110
+ def weekday(dateobj):
111
+ # assume date is either a python datetime or a mx.DateTime object
112
+ if isinstance(dateobj, date):
113
+ return dateobj.weekday()
114
+ return dateobj.day_of_week
115
+
116
+ def str2date(datestr, sampledate):
117
+ # NOTE: datetime.strptime is not an option until we drop py2.4 compat
118
+ year, month, day = [int(chunk) for chunk in datestr.split('-')]
119
+ return datefactory(year, month, day, sampledate)
120
+
121
+ def days_between(start, end):
122
+ if isinstance(start, date):
123
+ delta = end - start
124
+ # datetime.timedelta.days is always an integer (floored)
125
+ if delta.seconds:
126
+ return delta.days + 1
127
+ return delta.days
128
+ else:
129
+ return int(math.ceil((end - start).days))
130
+
131
+ def get_national_holidays(begin, end):
132
+ """return french national days off between begin and end"""
133
+ begin = datefactory(begin.year, begin.month, begin.day, begin)
134
+ end = datefactory(end.year, end.month, end.day, end)
135
+ holidays = [str2date(datestr, begin)
136
+ for datestr in FRENCH_MOBILE_HOLIDAYS.values()]
137
+ for year in xrange(begin.year, end.year+1):
138
+ for datestr in FRENCH_FIXED_HOLIDAYS.values():
139
+ date = str2date(datestr % year, begin)
140
+ if date not in holidays:
141
+ holidays.append(date)
142
+ return [day for day in holidays if begin <= day < end]
143
+
144
+ def add_days_worked(start, days):
145
+ """adds date but try to only take days worked into account"""
146
+ step = get_step(start)
147
+ weeks, plus = divmod(days, 5)
148
+ end = start + ((weeks * 7) + plus) * step
149
+ if weekday(end) >= 5: # saturday or sunday
150
+ end += (2 * step)
151
+ end += len([x for x in get_national_holidays(start, end + step)
152
+ if weekday(x) < 5]) * step
153
+ if weekday(end) >= 5: # saturday or sunday
154
+ end += (2 * step)
155
+ return end
156
+
157
+ def nb_open_days(start, end):
158
+ assert start <= end
159
+ step = get_step(start)
160
+ days = days_between(start, end)
161
+ weeks, plus = divmod(days, 7)
162
+ if weekday(start) > weekday(end):
163
+ plus -= 2
164
+ elif weekday(end) == 6:
165
+ plus -= 1
166
+ open_days = weeks * 5 + plus
167
+ nb_week_holidays = len([x for x in get_national_holidays(start, end+step)
168
+ if weekday(x) < 5 and x < end])
169
+ open_days -= nb_week_holidays
170
+ if open_days < 0:
171
+ return 0
172
+ return open_days
173
+
174
+ def date_range(begin, end, incday=None, incmonth=None):
175
+ """yields each date between begin and end
176
+
177
+ :param begin: the start date
178
+ :param end: the end date
179
+ :param incr: the step to use to iterate over dates. Default is
180
+ one day.
181
+ :param include: None (means no exclusion) or a function taking a
182
+ date as parameter, and returning True if the date
183
+ should be included.
184
+
185
+ When using mx datetime, you should *NOT* use incmonth argument, use instead
186
+ oneDay, oneHour, oneMinute, oneSecond, oneWeek or endOfMonth (to enumerate
187
+ months) as `incday` argument
188
+ """
189
+ assert not (incday and incmonth)
190
+ begin = todate(begin)
191
+ end = todate(end)
192
+ if incmonth:
193
+ while begin < end:
194
+ begin = next_month(begin, incmonth)
195
+ yield begin
196
+ else:
197
+ incr = get_step(begin, incday or 1)
198
+ while begin < end:
199
+ yield begin
200
+ begin += incr
201
+
202
+ # makes py datetime usable #####################################################
203
+
204
+ ONEDAY = timedelta(days=1)
205
+ ONEWEEK = timedelta(days=7)
206
+
207
+ try:
208
+ strptime = datetime.strptime
209
+ except AttributeError: # py < 2.5
210
+ from time import strptime as time_strptime
211
+ def strptime(value, format):
212
+ return datetime(*time_strptime(value, format)[:6])
213
+
214
+ def strptime_time(value, format='%H:%M'):
215
+ return time(*time_strptime(value, format)[3:6])
216
+
217
+ def todate(somedate):
218
+ """return a date from a date (leaving unchanged) or a datetime"""
219
+ if isinstance(somedate, datetime):
220
+ return date(somedate.year, somedate.month, somedate.day)
221
+ assert isinstance(somedate, (date, DateTimeType)), repr(somedate)
222
+ return somedate
223
+
224
+ def totime(somedate):
225
+ """return a time from a time (leaving unchanged), date or datetime"""
226
+ # XXX mx compat
227
+ if not isinstance(somedate, time):
228
+ return time(somedate.hour, somedate.minute, somedate.second)
229
+ assert isinstance(somedate, (time)), repr(somedate)
230
+ return somedate
231
+
232
+ def todatetime(somedate):
233
+ """return a date from a date (leaving unchanged) or a datetime"""
234
+ # take care, datetime is a subclass of date
235
+ if isinstance(somedate, datetime):
236
+ return somedate
237
+ assert isinstance(somedate, (date, DateTimeType)), repr(somedate)
238
+ return datetime(somedate.year, somedate.month, somedate.day)
239
+
240
+ def datetime2ticks(somedate):
241
+ return timegm(somedate.timetuple()) * 1000
242
+
243
+ def days_in_month(somedate):
244
+ return monthrange(somedate.year, somedate.month)[1]
245
+
246
+ def days_in_year(somedate):
247
+ feb = date(somedate.year, 2, 1)
248
+ if days_in_month(feb) == 29:
249
+ return 366
250
+ else:
251
+ return 365
252
+
253
+ def previous_month(somedate, nbmonth=1):
254
+ while nbmonth:
255
+ somedate = first_day(somedate) - ONEDAY
256
+ nbmonth -= 1
257
+ return somedate
258
+
259
+ def next_month(somedate, nbmonth=1):
260
+ while nbmonth:
261
+ somedate = last_day(somedate) + ONEDAY
262
+ nbmonth -= 1
263
+ return somedate
264
+
265
+ def first_day(somedate):
266
+ return date(somedate.year, somedate.month, 1)
267
+
268
+ def last_day(somedate):
269
+ return date(somedate.year, somedate.month, days_in_month(somedate))
270
+
271
+ def ustrftime(somedate, fmt='%Y-%m-%d'):
272
+ """like strftime, but returns a unicode string instead of an encoded
273
+ string which' may be problematic with localized date.
274
+
275
+ encoding is guessed by locale.getpreferredencoding()
276
+ """
277
+ # date format may depend on the locale
278
+ encoding = getpreferredencoding(do_setlocale=False) or 'UTF-8'
279
+ return unicode(somedate.strftime(str(fmt)), encoding)
@@ -0,0 +1,49 @@
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
+ """Wrappers to get actually replaceable DBAPI2 compliant modules and
19
+ database connection whatever the database and client lib used.
20
+
21
+ Currently support:
22
+
23
+ - postgresql (pgdb, psycopg, psycopg2, pyPgSQL)
24
+ - mysql (MySQLdb)
25
+ - sqlite (pysqlite2, sqlite, sqlite3)
26
+
27
+ just use the `get_connection` function from this module to get a
28
+ wrapped connection. If multiple drivers for a database are available,
29
+ you can control which one you want to use using the
30
+ `set_prefered_driver` function.
31
+
32
+ Additional helpers are also provided for advanced functionalities such
33
+ as listing existing users or databases, creating database... Get the
34
+ helper for your database using the `get_adv_func_helper` function.
35
+ """
36
+ __docformat__ = "restructuredtext en"
37
+
38
+ from warnings import warn
39
+ warn('this module is deprecated, use logilab.database instead',
40
+ DeprecationWarning, stacklevel=1)
41
+
42
+ from logilab.database import (get_connection, set_prefered_driver,
43
+ get_dbapi_compliant_module as _gdcm,
44
+ get_db_helper as _gdh)
45
+
46
+ def get_dbapi_compliant_module(driver, *args, **kwargs):
47
+ module = _gdcm(driver, *args, **kwargs)
48
+ module.adv_func_helper = _gdh(driver)
49
+ return module