bee_python 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (488) hide show
  1. data/{build/README → README} +1 -1
  2. data/egg/egg/build.yml +11 -49
  3. data/egg/egg.yml +19 -27
  4. data/egg/http/build.erb +32 -36
  5. data/egg/http/libhttp.py +102 -0
  6. data/egg/http/pylint.cfg +236 -0
  7. data/egg/http/server.py +7 -0
  8. data/egg/http/test.erb +32 -0
  9. data/egg/http.yml +33 -29
  10. data/egg/mysql/mysql.py +8 -9
  11. data/egg/project/build.erb +21 -53
  12. data/egg/project/pylint.cfg +236 -0
  13. data/egg/project/test.py +2 -2
  14. data/egg/project.yml +23 -31
  15. data/egg/script/build.erb +18 -23
  16. data/egg/script/pylint.cfg +236 -0
  17. data/egg/script.yml +22 -18
  18. data/egg/source/source.py +6 -6
  19. data/egg/test/test.py +1 -1
  20. data/lib/bee_task_python.rb +3 -34
  21. data/python.yml +123 -0
  22. metadata +61 -503
  23. data/test/build.yml +0 -16
  24. data/test/tc_bee_task_python.rb +0 -27
  25. data/test/test_build.rb +0 -26
  26. data/test/test_build_listener.rb +0 -110
  27. data/test/ts_bee_python.rb +0 -26
  28. data/tools/common/__init__.py +0 -5
  29. data/tools/common/common/__init__.py +0 -140
  30. data/tools/common/common/__pkginfo__.py +0 -43
  31. data/tools/common/common/adbh.py +0 -35
  32. data/tools/common/common/cache.py +0 -114
  33. data/tools/common/common/changelog.py +0 -234
  34. data/tools/common/common/clcommands.py +0 -181
  35. data/tools/common/common/cli.py +0 -212
  36. data/tools/common/common/compat.py +0 -328
  37. data/tools/common/common/configuration.py +0 -1087
  38. data/tools/common/common/contexts.py +0 -58
  39. data/tools/common/common/corbautils.py +0 -117
  40. data/tools/common/common/daemon.py +0 -171
  41. data/tools/common/common/date.py +0 -279
  42. data/tools/common/common/db.py +0 -49
  43. data/tools/common/common/dbf.py +0 -229
  44. data/tools/common/common/debugger.py +0 -208
  45. data/tools/common/common/decorators.py +0 -190
  46. data/tools/common/common/deprecation.py +0 -118
  47. data/tools/common/common/fileutils.py +0 -409
  48. data/tools/common/common/graph.py +0 -259
  49. data/tools/common/common/html.py +0 -142
  50. data/tools/common/common/interface.py +0 -76
  51. data/tools/common/common/logging_ext.py +0 -166
  52. data/tools/common/common/modutils.py +0 -670
  53. data/tools/common/common/optik_ext.py +0 -383
  54. data/tools/common/common/optparser.py +0 -92
  55. data/tools/common/common/pdf_ext.py +0 -111
  56. data/tools/common/common/proc.py +0 -276
  57. data/tools/common/common/pyro_ext.py +0 -146
  58. data/tools/common/common/pytest.py +0 -754
  59. data/tools/common/common/shellutils.py +0 -383
  60. data/tools/common/common/sphinx_ext.py +0 -87
  61. data/tools/common/common/sphinxutils.py +0 -122
  62. data/tools/common/common/sqlgen.py +0 -31
  63. data/tools/common/common/table.py +0 -930
  64. data/tools/common/common/tasksqueue.py +0 -97
  65. data/tools/common/common/test/__init__.py +0 -1
  66. data/tools/common/common/test/data/ChangeLog +0 -184
  67. data/tools/common/common/test/data/MyPyPa-0.1.0-py2.5.egg +0 -0
  68. data/tools/common/common/test/data/__init__.py +0 -1
  69. data/tools/common/common/test/data/content_differ_dir/NOTHING +0 -0
  70. data/tools/common/common/test/data/content_differ_dir/README +0 -1
  71. data/tools/common/common/test/data/content_differ_dir/subdir/coin +0 -1
  72. data/tools/common/common/test/data/content_differ_dir/subdir/toto.txt +0 -53
  73. data/tools/common/common/test/data/file_differ_dir/NOTHING +0 -0
  74. data/tools/common/common/test/data/file_differ_dir/README +0 -1
  75. data/tools/common/common/test/data/file_differ_dir/subdir/toto.txt +0 -53
  76. data/tools/common/common/test/data/file_differ_dir/subdirtwo/Hello +0 -0
  77. data/tools/common/common/test/data/find_test/__init__.py +0 -0
  78. data/tools/common/common/test/data/find_test/foo.txt +0 -0
  79. data/tools/common/common/test/data/find_test/module.py +0 -0
  80. data/tools/common/common/test/data/find_test/module2.py +0 -0
  81. data/tools/common/common/test/data/find_test/newlines.txt +0 -0
  82. data/tools/common/common/test/data/find_test/noendingnewline.py +0 -0
  83. data/tools/common/common/test/data/find_test/nonregr.py +0 -0
  84. data/tools/common/common/test/data/find_test/normal_file.txt +0 -0
  85. data/tools/common/common/test/data/find_test/spam.txt +0 -0
  86. data/tools/common/common/test/data/find_test/sub/doc.txt +0 -0
  87. data/tools/common/common/test/data/find_test/sub/momo.py +0 -0
  88. data/tools/common/common/test/data/find_test/test.ini +0 -0
  89. data/tools/common/common/test/data/find_test/test1.msg +0 -0
  90. data/tools/common/common/test/data/find_test/test2.msg +0 -0
  91. data/tools/common/common/test/data/find_test/write_protected_file.txt +0 -0
  92. data/tools/common/common/test/data/foo.txt +0 -9
  93. data/tools/common/common/test/data/module.py +0 -88
  94. data/tools/common/common/test/data/module2.py +0 -77
  95. data/tools/common/common/test/data/newlines.txt +0 -3
  96. data/tools/common/common/test/data/noendingnewline.py +0 -36
  97. data/tools/common/common/test/data/nonregr.py +0 -14
  98. data/tools/common/common/test/data/normal_file.txt +0 -0
  99. data/tools/common/common/test/data/reference_dir/NOTHING +0 -0
  100. data/tools/common/common/test/data/reference_dir/README +0 -1
  101. data/tools/common/common/test/data/reference_dir/subdir/coin +0 -1
  102. data/tools/common/common/test/data/reference_dir/subdir/toto.txt +0 -53
  103. data/tools/common/common/test/data/same_dir/NOTHING +0 -0
  104. data/tools/common/common/test/data/same_dir/README +0 -1
  105. data/tools/common/common/test/data/same_dir/subdir/coin +0 -1
  106. data/tools/common/common/test/data/same_dir/subdir/toto.txt +0 -53
  107. data/tools/common/common/test/data/spam.txt +0 -9
  108. data/tools/common/common/test/data/sub/doc.txt +0 -1
  109. data/tools/common/common/test/data/sub/momo.py +0 -1
  110. data/tools/common/common/test/data/subdir_differ_dir/NOTHING +0 -0
  111. data/tools/common/common/test/data/subdir_differ_dir/README +0 -1
  112. data/tools/common/common/test/data/subdir_differ_dir/subdir/coin +0 -1
  113. data/tools/common/common/test/data/subdir_differ_dir/subdir/toto.txt +0 -53
  114. data/tools/common/common/test/data/test.ini +0 -20
  115. data/tools/common/common/test/data/test1.msg +0 -30
  116. data/tools/common/common/test/data/test2.msg +0 -42
  117. data/tools/common/common/test/data/write_protected_file.txt +0 -0
  118. data/tools/common/common/test/foomod.py +0 -17
  119. data/tools/common/common/test/unittest_cache.py +0 -129
  120. data/tools/common/common/test/unittest_changelog.py +0 -37
  121. data/tools/common/common/test/unittest_compat.py +0 -239
  122. data/tools/common/common/test/unittest_configuration.py +0 -348
  123. data/tools/common/common/test/unittest_date.py +0 -154
  124. data/tools/common/common/test/unittest_decorators.py +0 -62
  125. data/tools/common/common/test/unittest_deprecation.py +0 -76
  126. data/tools/common/common/test/unittest_fileutils.py +0 -133
  127. data/tools/common/common/test/unittest_graph.py +0 -50
  128. data/tools/common/common/test/unittest_html.py +0 -76
  129. data/tools/common/common/test/unittest_interface.py +0 -87
  130. data/tools/common/common/test/unittest_modutils.py +0 -244
  131. data/tools/common/common/test/unittest_pytest.py +0 -50
  132. data/tools/common/common/test/unittest_shellutils.py +0 -248
  133. data/tools/common/common/test/unittest_table.py +0 -448
  134. data/tools/common/common/test/unittest_taskqueue.py +0 -71
  135. data/tools/common/common/test/unittest_testlib.py +0 -956
  136. data/tools/common/common/test/unittest_textutils.py +0 -247
  137. data/tools/common/common/test/unittest_tree.py +0 -248
  138. data/tools/common/common/test/unittest_umessage.py +0 -55
  139. data/tools/common/common/test/unittest_ureports_html.py +0 -64
  140. data/tools/common/common/test/unittest_ureports_text.py +0 -105
  141. data/tools/common/common/test/unittest_xmlutils.py +0 -75
  142. data/tools/common/common/test/utils.py +0 -87
  143. data/tools/common/common/testlib.py +0 -1927
  144. data/tools/common/common/textutils.py +0 -476
  145. data/tools/common/common/tree.py +0 -372
  146. data/tools/common/common/umessage.py +0 -161
  147. data/tools/common/common/ureports/__init__.py +0 -174
  148. data/tools/common/common/ureports/docbook_writer.py +0 -139
  149. data/tools/common/common/ureports/html_writer.py +0 -131
  150. data/tools/common/common/ureports/nodes.py +0 -201
  151. data/tools/common/common/ureports/text_writer.py +0 -140
  152. data/tools/common/common/vcgutils.py +0 -216
  153. data/tools/common/common/visitor.py +0 -107
  154. data/tools/common/common/xmlrpcutils.py +0 -136
  155. data/tools/common/common/xmlutils.py +0 -61
  156. data/tools/coverage/coverage.py +0 -602
  157. data/tools/epydoc/__init__.py +0 -227
  158. data/tools/epydoc/__init__.pyc +0 -0
  159. data/tools/epydoc/apidoc.py +0 -2203
  160. data/tools/epydoc/apidoc.pyc +0 -0
  161. data/tools/epydoc/checker.py +0 -349
  162. data/tools/epydoc/checker.pyc +0 -0
  163. data/tools/epydoc/cli.py +0 -1470
  164. data/tools/epydoc/cli.pyc +0 -0
  165. data/tools/epydoc/compat.py +0 -250
  166. data/tools/epydoc/compat.pyc +0 -0
  167. data/tools/epydoc/docbuilder.py +0 -1358
  168. data/tools/epydoc/docbuilder.pyc +0 -0
  169. data/tools/epydoc/docintrospecter.py +0 -1056
  170. data/tools/epydoc/docintrospecter.pyc +0 -0
  171. data/tools/epydoc/docparser.py +0 -2113
  172. data/tools/epydoc/docparser.pyc +0 -0
  173. data/tools/epydoc/docstringparser.py +0 -1111
  174. data/tools/epydoc/docstringparser.pyc +0 -0
  175. data/tools/epydoc/docwriter/__init__.py +0 -12
  176. data/tools/epydoc/docwriter/__init__.pyc +0 -0
  177. data/tools/epydoc/docwriter/dotgraph.py +0 -1351
  178. data/tools/epydoc/docwriter/dotgraph.pyc +0 -0
  179. data/tools/epydoc/docwriter/html.py +0 -3491
  180. data/tools/epydoc/docwriter/html.pyc +0 -0
  181. data/tools/epydoc/docwriter/html_colorize.py +0 -909
  182. data/tools/epydoc/docwriter/html_colorize.pyc +0 -0
  183. data/tools/epydoc/docwriter/html_css.py +0 -550
  184. data/tools/epydoc/docwriter/html_css.pyc +0 -0
  185. data/tools/epydoc/docwriter/html_help.py +0 -190
  186. data/tools/epydoc/docwriter/html_help.pyc +0 -0
  187. data/tools/epydoc/docwriter/latex.py +0 -1187
  188. data/tools/epydoc/docwriter/latex.pyc +0 -0
  189. data/tools/epydoc/docwriter/plaintext.py +0 -276
  190. data/tools/epydoc/docwriter/plaintext.pyc +0 -0
  191. data/tools/epydoc/docwriter/xlink.py +0 -505
  192. data/tools/epydoc/docwriter/xlink.pyc +0 -0
  193. data/tools/epydoc/gui.py +0 -1148
  194. data/tools/epydoc/gui.pyc +0 -0
  195. data/tools/epydoc/log.py +0 -204
  196. data/tools/epydoc/log.pyc +0 -0
  197. data/tools/epydoc/markup/__init__.py +0 -623
  198. data/tools/epydoc/markup/__init__.pyc +0 -0
  199. data/tools/epydoc/markup/doctest.py +0 -311
  200. data/tools/epydoc/markup/doctest.pyc +0 -0
  201. data/tools/epydoc/markup/epytext.py +0 -2116
  202. data/tools/epydoc/markup/epytext.pyc +0 -0
  203. data/tools/epydoc/markup/javadoc.py +0 -250
  204. data/tools/epydoc/markup/javadoc.pyc +0 -0
  205. data/tools/epydoc/markup/plaintext.py +0 -78
  206. data/tools/epydoc/markup/plaintext.pyc +0 -0
  207. data/tools/epydoc/markup/pyval_repr.py +0 -532
  208. data/tools/epydoc/markup/pyval_repr.pyc +0 -0
  209. data/tools/epydoc/markup/restructuredtext.py +0 -906
  210. data/tools/epydoc/markup/restructuredtext.pyc +0 -0
  211. data/tools/epydoc/test/__init__.py +0 -97
  212. data/tools/epydoc/test/__init__.pyc +0 -0
  213. data/tools/epydoc/test/util.py +0 -226
  214. data/tools/epydoc/test/util.pyc +0 -0
  215. data/tools/epydoc/util.py +0 -289
  216. data/tools/epydoc/util.pyc +0 -0
  217. data/tools/logilab/logilab/__init__.py +0 -5
  218. data/tools/logilab/logilab/astng/__init__.py +0 -82
  219. data/tools/logilab/logilab/astng/__pkginfo__.py +0 -76
  220. data/tools/logilab/logilab/astng/_exceptions.py +0 -64
  221. data/tools/logilab/logilab/astng/_nodes_ast.py +0 -667
  222. data/tools/logilab/logilab/astng/_nodes_compiler.py +0 -758
  223. data/tools/logilab/logilab/astng/bases.py +0 -608
  224. data/tools/logilab/logilab/astng/builder.py +0 -239
  225. data/tools/logilab/logilab/astng/inference.py +0 -426
  226. data/tools/logilab/logilab/astng/inspector.py +0 -289
  227. data/tools/logilab/logilab/astng/manager.py +0 -421
  228. data/tools/logilab/logilab/astng/mixins.py +0 -165
  229. data/tools/logilab/logilab/astng/node_classes.py +0 -848
  230. data/tools/logilab/logilab/astng/nodes.py +0 -85
  231. data/tools/logilab/logilab/astng/nodes_as_string.py +0 -389
  232. data/tools/logilab/logilab/astng/patchcomptransformer.py +0 -159
  233. data/tools/logilab/logilab/astng/protocols.py +0 -333
  234. data/tools/logilab/logilab/astng/raw_building.py +0 -212
  235. data/tools/logilab/logilab/astng/rebuilder.py +0 -307
  236. data/tools/logilab/logilab/astng/scoped_nodes.py +0 -951
  237. data/tools/logilab/logilab/astng/test/__init__.py +0 -19
  238. data/tools/logilab/logilab/astng/test/data/MyPyPa-0.1.0-py2.5.egg +0 -0
  239. data/tools/logilab/logilab/astng/test/data/MyPyPa-0.1.0-py2.5.zip +0 -0
  240. data/tools/logilab/logilab/astng/test/data/SSL1/Connection1.py +0 -33
  241. data/tools/logilab/logilab/astng/test/data/SSL1/__init__.py +0 -20
  242. data/tools/logilab/logilab/astng/test/data/__init__.py +0 -20
  243. data/tools/logilab/logilab/astng/test/data/all.py +0 -29
  244. data/tools/logilab/logilab/astng/test/data/appl/__init__.py +0 -23
  245. data/tools/logilab/logilab/astng/test/data/appl/myConnection.py +0 -30
  246. data/tools/logilab/logilab/astng/test/data/format.py +0 -34
  247. data/tools/logilab/logilab/astng/test/data/module.py +0 -90
  248. data/tools/logilab/logilab/astng/test/data/module2.py +0 -112
  249. data/tools/logilab/logilab/astng/test/data/noendingnewline.py +0 -57
  250. data/tools/logilab/logilab/astng/test/data/nonregr.py +0 -76
  251. data/tools/logilab/logilab/astng/test/data/notall.py +0 -28
  252. data/tools/logilab/logilab/astng/test/data2/__init__.py +0 -20
  253. data/tools/logilab/logilab/astng/test/data2/clientmodule_test.py +0 -51
  254. data/tools/logilab/logilab/astng/test/data2/suppliermodule_test.py +0 -32
  255. data/tools/logilab/logilab/astng/test/regrtest.py +0 -135
  256. data/tools/logilab/logilab/astng/test/regrtest_data/absimport.py +0 -22
  257. data/tools/logilab/logilab/astng/test/regrtest_data/descriptor_crash.py +0 -31
  258. data/tools/logilab/logilab/astng/test/regrtest_data/import_package_subpackage_module.py +0 -68
  259. data/tools/logilab/logilab/astng/test/regrtest_data/package/__init__.py +0 -24
  260. data/tools/logilab/logilab/astng/test/regrtest_data/package/subpackage/__init__.py +0 -20
  261. data/tools/logilab/logilab/astng/test/regrtest_data/package/subpackage/module.py +0 -20
  262. data/tools/logilab/logilab/astng/test/unittest_builder.py +0 -684
  263. data/tools/logilab/logilab/astng/test/unittest_inference.py +0 -1112
  264. data/tools/logilab/logilab/astng/test/unittest_inspector.py +0 -105
  265. data/tools/logilab/logilab/astng/test/unittest_lookup.py +0 -302
  266. data/tools/logilab/logilab/astng/test/unittest_manager.py +0 -98
  267. data/tools/logilab/logilab/astng/test/unittest_nodes.py +0 -302
  268. data/tools/logilab/logilab/astng/test/unittest_scoped_nodes.py +0 -501
  269. data/tools/logilab/logilab/astng/test/unittest_utils.py +0 -104
  270. data/tools/logilab/logilab/astng/utils.py +0 -342
  271. data/tools/logilab/logilab/common/__init__.py +0 -140
  272. data/tools/logilab/logilab/common/__pkginfo__.py +0 -43
  273. data/tools/logilab/logilab/common/adbh.py +0 -35
  274. data/tools/logilab/logilab/common/cache.py +0 -114
  275. data/tools/logilab/logilab/common/changelog.py +0 -234
  276. data/tools/logilab/logilab/common/clcommands.py +0 -181
  277. data/tools/logilab/logilab/common/cli.py +0 -212
  278. data/tools/logilab/logilab/common/compat.py +0 -328
  279. data/tools/logilab/logilab/common/configuration.py +0 -1087
  280. data/tools/logilab/logilab/common/contexts.py +0 -58
  281. data/tools/logilab/logilab/common/corbautils.py +0 -117
  282. data/tools/logilab/logilab/common/daemon.py +0 -171
  283. data/tools/logilab/logilab/common/date.py +0 -279
  284. data/tools/logilab/logilab/common/db.py +0 -49
  285. data/tools/logilab/logilab/common/dbf.py +0 -229
  286. data/tools/logilab/logilab/common/debugger.py +0 -208
  287. data/tools/logilab/logilab/common/decorators.py +0 -190
  288. data/tools/logilab/logilab/common/deprecation.py +0 -118
  289. data/tools/logilab/logilab/common/fileutils.py +0 -409
  290. data/tools/logilab/logilab/common/graph.py +0 -259
  291. data/tools/logilab/logilab/common/html.py +0 -142
  292. data/tools/logilab/logilab/common/interface.py +0 -76
  293. data/tools/logilab/logilab/common/logging_ext.py +0 -166
  294. data/tools/logilab/logilab/common/modutils.py +0 -670
  295. data/tools/logilab/logilab/common/optik_ext.py +0 -383
  296. data/tools/logilab/logilab/common/optparser.py +0 -92
  297. data/tools/logilab/logilab/common/pdf_ext.py +0 -111
  298. data/tools/logilab/logilab/common/proc.py +0 -276
  299. data/tools/logilab/logilab/common/pyro_ext.py +0 -146
  300. data/tools/logilab/logilab/common/pytest.py +0 -754
  301. data/tools/logilab/logilab/common/shellutils.py +0 -383
  302. data/tools/logilab/logilab/common/sphinx_ext.py +0 -87
  303. data/tools/logilab/logilab/common/sphinxutils.py +0 -122
  304. data/tools/logilab/logilab/common/sqlgen.py +0 -31
  305. data/tools/logilab/logilab/common/table.py +0 -930
  306. data/tools/logilab/logilab/common/tasksqueue.py +0 -97
  307. data/tools/logilab/logilab/common/test/__init__.py +0 -1
  308. data/tools/logilab/logilab/common/test/data/ChangeLog +0 -184
  309. data/tools/logilab/logilab/common/test/data/MyPyPa-0.1.0-py2.5.egg +0 -0
  310. data/tools/logilab/logilab/common/test/data/__init__.py +0 -1
  311. data/tools/logilab/logilab/common/test/data/content_differ_dir/NOTHING +0 -0
  312. data/tools/logilab/logilab/common/test/data/content_differ_dir/README +0 -1
  313. data/tools/logilab/logilab/common/test/data/content_differ_dir/subdir/coin +0 -1
  314. data/tools/logilab/logilab/common/test/data/content_differ_dir/subdir/toto.txt +0 -53
  315. data/tools/logilab/logilab/common/test/data/file_differ_dir/NOTHING +0 -0
  316. data/tools/logilab/logilab/common/test/data/file_differ_dir/README +0 -1
  317. data/tools/logilab/logilab/common/test/data/file_differ_dir/subdir/toto.txt +0 -53
  318. data/tools/logilab/logilab/common/test/data/file_differ_dir/subdirtwo/Hello +0 -0
  319. data/tools/logilab/logilab/common/test/data/find_test/__init__.py +0 -0
  320. data/tools/logilab/logilab/common/test/data/find_test/foo.txt +0 -0
  321. data/tools/logilab/logilab/common/test/data/find_test/module.py +0 -0
  322. data/tools/logilab/logilab/common/test/data/find_test/module2.py +0 -0
  323. data/tools/logilab/logilab/common/test/data/find_test/newlines.txt +0 -0
  324. data/tools/logilab/logilab/common/test/data/find_test/noendingnewline.py +0 -0
  325. data/tools/logilab/logilab/common/test/data/find_test/nonregr.py +0 -0
  326. data/tools/logilab/logilab/common/test/data/find_test/normal_file.txt +0 -0
  327. data/tools/logilab/logilab/common/test/data/find_test/spam.txt +0 -0
  328. data/tools/logilab/logilab/common/test/data/find_test/sub/doc.txt +0 -0
  329. data/tools/logilab/logilab/common/test/data/find_test/sub/momo.py +0 -0
  330. data/tools/logilab/logilab/common/test/data/find_test/test.ini +0 -0
  331. data/tools/logilab/logilab/common/test/data/find_test/test1.msg +0 -0
  332. data/tools/logilab/logilab/common/test/data/find_test/test2.msg +0 -0
  333. data/tools/logilab/logilab/common/test/data/find_test/write_protected_file.txt +0 -0
  334. data/tools/logilab/logilab/common/test/data/foo.txt +0 -9
  335. data/tools/logilab/logilab/common/test/data/module.py +0 -88
  336. data/tools/logilab/logilab/common/test/data/module2.py +0 -77
  337. data/tools/logilab/logilab/common/test/data/newlines.txt +0 -3
  338. data/tools/logilab/logilab/common/test/data/noendingnewline.py +0 -36
  339. data/tools/logilab/logilab/common/test/data/nonregr.py +0 -14
  340. data/tools/logilab/logilab/common/test/data/normal_file.txt +0 -0
  341. data/tools/logilab/logilab/common/test/data/reference_dir/NOTHING +0 -0
  342. data/tools/logilab/logilab/common/test/data/reference_dir/README +0 -1
  343. data/tools/logilab/logilab/common/test/data/reference_dir/subdir/coin +0 -1
  344. data/tools/logilab/logilab/common/test/data/reference_dir/subdir/toto.txt +0 -53
  345. data/tools/logilab/logilab/common/test/data/same_dir/NOTHING +0 -0
  346. data/tools/logilab/logilab/common/test/data/same_dir/README +0 -1
  347. data/tools/logilab/logilab/common/test/data/same_dir/subdir/coin +0 -1
  348. data/tools/logilab/logilab/common/test/data/same_dir/subdir/toto.txt +0 -53
  349. data/tools/logilab/logilab/common/test/data/spam.txt +0 -9
  350. data/tools/logilab/logilab/common/test/data/sub/doc.txt +0 -1
  351. data/tools/logilab/logilab/common/test/data/sub/momo.py +0 -1
  352. data/tools/logilab/logilab/common/test/data/subdir_differ_dir/NOTHING +0 -0
  353. data/tools/logilab/logilab/common/test/data/subdir_differ_dir/README +0 -1
  354. data/tools/logilab/logilab/common/test/data/subdir_differ_dir/subdir/coin +0 -1
  355. data/tools/logilab/logilab/common/test/data/subdir_differ_dir/subdir/toto.txt +0 -53
  356. data/tools/logilab/logilab/common/test/data/test.ini +0 -20
  357. data/tools/logilab/logilab/common/test/data/test1.msg +0 -30
  358. data/tools/logilab/logilab/common/test/data/test2.msg +0 -42
  359. data/tools/logilab/logilab/common/test/data/write_protected_file.txt +0 -0
  360. data/tools/logilab/logilab/common/test/foomod.py +0 -17
  361. data/tools/logilab/logilab/common/test/unittest_cache.py +0 -129
  362. data/tools/logilab/logilab/common/test/unittest_changelog.py +0 -37
  363. data/tools/logilab/logilab/common/test/unittest_compat.py +0 -239
  364. data/tools/logilab/logilab/common/test/unittest_configuration.py +0 -348
  365. data/tools/logilab/logilab/common/test/unittest_date.py +0 -154
  366. data/tools/logilab/logilab/common/test/unittest_decorators.py +0 -62
  367. data/tools/logilab/logilab/common/test/unittest_deprecation.py +0 -76
  368. data/tools/logilab/logilab/common/test/unittest_fileutils.py +0 -133
  369. data/tools/logilab/logilab/common/test/unittest_graph.py +0 -50
  370. data/tools/logilab/logilab/common/test/unittest_html.py +0 -76
  371. data/tools/logilab/logilab/common/test/unittest_interface.py +0 -87
  372. data/tools/logilab/logilab/common/test/unittest_modutils.py +0 -244
  373. data/tools/logilab/logilab/common/test/unittest_pytest.py +0 -50
  374. data/tools/logilab/logilab/common/test/unittest_shellutils.py +0 -248
  375. data/tools/logilab/logilab/common/test/unittest_table.py +0 -448
  376. data/tools/logilab/logilab/common/test/unittest_taskqueue.py +0 -71
  377. data/tools/logilab/logilab/common/test/unittest_testlib.py +0 -956
  378. data/tools/logilab/logilab/common/test/unittest_textutils.py +0 -247
  379. data/tools/logilab/logilab/common/test/unittest_tree.py +0 -248
  380. data/tools/logilab/logilab/common/test/unittest_umessage.py +0 -55
  381. data/tools/logilab/logilab/common/test/unittest_ureports_html.py +0 -64
  382. data/tools/logilab/logilab/common/test/unittest_ureports_text.py +0 -105
  383. data/tools/logilab/logilab/common/test/unittest_xmlutils.py +0 -75
  384. data/tools/logilab/logilab/common/test/utils.py +0 -87
  385. data/tools/logilab/logilab/common/testlib.py +0 -1927
  386. data/tools/logilab/logilab/common/textutils.py +0 -476
  387. data/tools/logilab/logilab/common/tree.py +0 -372
  388. data/tools/logilab/logilab/common/umessage.py +0 -161
  389. data/tools/logilab/logilab/common/ureports/__init__.py +0 -174
  390. data/tools/logilab/logilab/common/ureports/docbook_writer.py +0 -139
  391. data/tools/logilab/logilab/common/ureports/html_writer.py +0 -131
  392. data/tools/logilab/logilab/common/ureports/nodes.py +0 -201
  393. data/tools/logilab/logilab/common/ureports/text_writer.py +0 -140
  394. data/tools/logilab/logilab/common/vcgutils.py +0 -216
  395. data/tools/logilab/logilab/common/visitor.py +0 -107
  396. data/tools/logilab/logilab/common/xmlrpcutils.py +0 -136
  397. data/tools/logilab/logilab/common/xmlutils.py +0 -61
  398. data/tools/pychecker/COPYRIGHT +0 -31
  399. data/tools/pychecker/ChangeLog +0 -349
  400. data/tools/pychecker/CodeChecks.py +0 -1969
  401. data/tools/pychecker/CodeChecks.pyc +0 -0
  402. data/tools/pychecker/CodeChecks.pyo +0 -0
  403. data/tools/pychecker/Config.py +0 -475
  404. data/tools/pychecker/Config.pyc +0 -0
  405. data/tools/pychecker/Config.pyo +0 -0
  406. data/tools/pychecker/KNOWN_BUGS +0 -100
  407. data/tools/pychecker/MAINTAINERS +0 -81
  408. data/tools/pychecker/NEWS +0 -406
  409. data/tools/pychecker/OP.py +0 -131
  410. data/tools/pychecker/OP.pyc +0 -0
  411. data/tools/pychecker/OP.pyo +0 -0
  412. data/tools/pychecker/OptionTypes.py +0 -117
  413. data/tools/pychecker/OptionTypes.pyc +0 -0
  414. data/tools/pychecker/OptionTypes.pyo +0 -0
  415. data/tools/pychecker/README +0 -152
  416. data/tools/pychecker/Stack.py +0 -115
  417. data/tools/pychecker/Stack.pyc +0 -0
  418. data/tools/pychecker/Stack.pyo +0 -0
  419. data/tools/pychecker/TODO +0 -101
  420. data/tools/pychecker/VERSION +0 -1
  421. data/tools/pychecker/Warning.py +0 -50
  422. data/tools/pychecker/Warning.pyc +0 -0
  423. data/tools/pychecker/Warning.pyo +0 -0
  424. data/tools/pychecker/__init__.py +0 -17
  425. data/tools/pychecker/__init__.pyc +0 -0
  426. data/tools/pychecker/__init__.pyo +0 -0
  427. data/tools/pychecker/checker.py +0 -961
  428. data/tools/pychecker/checker.pyc +0 -0
  429. data/tools/pychecker/checker.pyo +0 -0
  430. data/tools/pychecker/function.py +0 -159
  431. data/tools/pychecker/function.pyc +0 -0
  432. data/tools/pychecker/function.pyo +0 -0
  433. data/tools/pychecker/msgs.py +0 -175
  434. data/tools/pychecker/msgs.pyc +0 -0
  435. data/tools/pychecker/msgs.pyo +0 -0
  436. data/tools/pychecker/options.py +0 -275
  437. data/tools/pychecker/options.pyc +0 -0
  438. data/tools/pychecker/options.pyo +0 -0
  439. data/tools/pychecker/pcmodules.py +0 -19
  440. data/tools/pychecker/pcmodules.pyc +0 -0
  441. data/tools/pychecker/pcmodules.pyo +0 -0
  442. data/tools/pychecker/printer.py +0 -47
  443. data/tools/pychecker/printer.pyc +0 -0
  444. data/tools/pychecker/printer.pyo +0 -0
  445. data/tools/pychecker/python.py +0 -427
  446. data/tools/pychecker/python.pyc +0 -0
  447. data/tools/pychecker/python.pyo +0 -0
  448. data/tools/pychecker/utils.py +0 -102
  449. data/tools/pychecker/utils.pyc +0 -0
  450. data/tools/pychecker/utils.pyo +0 -0
  451. data/tools/pychecker/warn.py +0 -778
  452. data/tools/pychecker/warn.pyc +0 -0
  453. data/tools/pychecker/warn.pyo +0 -0
  454. data/tools/pylint2/pylint/__init__.py +0 -16
  455. data/tools/pylint2/pylint/__pkginfo__.py +0 -67
  456. data/tools/pylint2/pylint/checkers/__init__.py +0 -155
  457. data/tools/pylint2/pylint/checkers/base.py +0 -749
  458. data/tools/pylint2/pylint/checkers/classes.py +0 -527
  459. data/tools/pylint2/pylint/checkers/design_analysis.py +0 -344
  460. data/tools/pylint2/pylint/checkers/exceptions.py +0 -183
  461. data/tools/pylint2/pylint/checkers/format.py +0 -367
  462. data/tools/pylint2/pylint/checkers/imports.py +0 -379
  463. data/tools/pylint2/pylint/checkers/logging.py +0 -98
  464. data/tools/pylint2/pylint/checkers/misc.py +0 -128
  465. data/tools/pylint2/pylint/checkers/newstyle.py +0 -107
  466. data/tools/pylint2/pylint/checkers/raw_metrics.py +0 -125
  467. data/tools/pylint2/pylint/checkers/similar.py +0 -333
  468. data/tools/pylint2/pylint/checkers/string_format.py +0 -239
  469. data/tools/pylint2/pylint/checkers/typecheck.py +0 -364
  470. data/tools/pylint2/pylint/checkers/utils.py +0 -208
  471. data/tools/pylint2/pylint/checkers/variables.py +0 -498
  472. data/tools/pylint2/pylint/config.py +0 -149
  473. data/tools/pylint2/pylint/epylint.py +0 -149
  474. data/tools/pylint2/pylint/gui.py +0 -433
  475. data/tools/pylint2/pylint/interfaces.py +0 -98
  476. data/tools/pylint2/pylint/lint.py +0 -914
  477. data/tools/pylint2/pylint/pyreverse/__init__.py +0 -5
  478. data/tools/pylint2/pylint/pyreverse/diadefslib.py +0 -229
  479. data/tools/pylint2/pylint/pyreverse/diagrams.py +0 -247
  480. data/tools/pylint2/pylint/pyreverse/main.py +0 -123
  481. data/tools/pylint2/pylint/pyreverse/utils.py +0 -131
  482. data/tools/pylint2/pylint/pyreverse/writer.py +0 -196
  483. data/tools/pylint2/pylint/reporters/__init__.py +0 -67
  484. data/tools/pylint2/pylint/reporters/guireporter.py +0 -36
  485. data/tools/pylint2/pylint/reporters/html.py +0 -69
  486. data/tools/pylint2/pylint/reporters/text.py +0 -156
  487. data/tools/pylint2/pylint/utils.py +0 -518
  488. data/tools/pylint2/pylint.py +0 -16
@@ -1,1358 +0,0 @@
1
- # epydoc -- Documentation Builder
2
- #
3
- # Copyright (C) 2005 Edward Loper
4
- # Author: Edward Loper <edloper@loper.org>
5
- # URL: <http://epydoc.sf.net>
6
- #
7
- # $Id: docbuilder.py,v 1.1 2009/11/26 13:20:39 casa Exp $
8
-
9
- """
10
- Construct data structures that encode the API documentation for Python
11
- objects. These data structures are created using a series of steps:
12
-
13
- 1. B{Building docs}: Extract basic information about the objects,
14
- and objects that are related to them. This can be done by
15
- introspecting the objects' values (with L{epydoc.docintrospecter}; or
16
- by parsing their source code (with L{epydoc.docparser}.
17
-
18
- 2. B{Merging}: Combine the information obtained from introspection &
19
- parsing each object into a single structure.
20
-
21
- 3. B{Linking}: Replace any 'pointers' that were created for imported
22
- variables by their target (if it's available).
23
-
24
- 4. B{Naming}: Chose a unique 'canonical name' for each
25
- object.
26
-
27
- 5. B{Docstring Parsing}: Parse the docstring of each object, and
28
- extract any pertinant information.
29
-
30
- 6. B{Inheritance}: Add information about variables that classes
31
- inherit from their base classes.
32
-
33
- The documentation information for each individual object is
34
- represented using an L{APIDoc}; and the documentation for a collection
35
- of objects is represented using a L{DocIndex}.
36
-
37
- The main interface to C{epydoc.docbuilder} consists of two functions:
38
-
39
- - L{build_doc()} -- Builds documentation for a single item, and
40
- returns it as an L{APIDoc} object.
41
- - L{build_doc_index()} -- Builds documentation for a collection of
42
- items, and returns it as a L{DocIndex} object.
43
-
44
- The remaining functions are used by these two main functions to
45
- perform individual steps in the creation of the documentation.
46
-
47
- @group Documentation Construction: build_doc, build_doc_index,
48
- _get_docs_from_*, _report_valdoc_progress
49
- @group Merging: *MERGE*, *merge*
50
- @group Linking: link_imports
51
- @group Naming: _name_scores, _unreachable_names, assign_canonical_names,
52
- _var_shadows_self, _fix_self_shadowing_var, _unreachable_name_for
53
- @group Inheritance: inherit_docs, _inherit_info
54
- """
55
- __docformat__ = 'epytext en'
56
-
57
- ######################################################################
58
- ## Contents
59
- ######################################################################
60
- ## 1. build_doc() & build_doc_index() -- the main interface.
61
- ## 2. merge_docs() -- helper, used to merge parse & introspect info
62
- ## 3. link_imports() -- helper, used to connect imported vars w/ values
63
- ## 4. assign_canonical_names() -- helper, used to set canonical names
64
- ## 5. inherit_docs() -- helper, used to inherit docs from base classes
65
-
66
- ######################################################################
67
- ## Imports
68
- ######################################################################
69
-
70
- import sys, os, os.path, __builtin__, imp, re, inspect
71
- from epydoc.apidoc import *
72
- from epydoc.docintrospecter import introspect_docs
73
- from epydoc.docparser import parse_docs, ParseError
74
- from epydoc.docstringparser import parse_docstring
75
- from epydoc import log
76
- from epydoc.util import *
77
- from epydoc.compat import * # Backwards compatibility
78
-
79
- ######################################################################
80
- ## 1. build_doc()
81
- ######################################################################
82
-
83
- class BuildOptions:
84
- """
85
- Holds the parameters for a documentation building process.
86
- """
87
- def __init__(self, introspect=True, parse=True,
88
- exclude_introspect=None, exclude_parse=None,
89
- add_submodules=True):
90
- self.introspect = introspect
91
- self.parse = parse
92
- self.exclude_introspect = exclude_introspect
93
- self.exclude_parse = exclude_parse
94
- self.add_submodules = add_submodules
95
-
96
- # Test for pattern syntax and compile them into pattern objects.
97
- try:
98
- self._introspect_regexp = (exclude_introspect
99
- and re.compile(exclude_introspect) or None)
100
- self._parse_regexp = (exclude_parse
101
- and re.compile(exclude_parse) or None)
102
- except Exception, exc:
103
- log.error('Error in regular expression pattern: %s' % exc)
104
- raise
105
-
106
- def must_introspect(self, name):
107
- """
108
- Return C{True} if a module is to be introsepcted with the current
109
- settings.
110
-
111
- @param name: The name of the module to test
112
- @type name: L{DottedName} or C{str}
113
- """
114
- return self.introspect \
115
- and not self._matches_filter(name, self._introspect_regexp)
116
-
117
- def must_parse(self, name):
118
- """
119
- Return C{True} if a module is to be parsed with the current settings.
120
-
121
- @param name: The name of the module to test
122
- @type name: L{DottedName} or C{str}
123
- """
124
- return self.parse \
125
- and not self._matches_filter(name, self._parse_regexp)
126
-
127
- def _matches_filter(self, name, regexp):
128
- """
129
- Test if a module name matches a pattern.
130
-
131
- @param name: The name of the module to test
132
- @type name: L{DottedName} or C{str}
133
- @param regexp: The pattern object to match C{name} against.
134
- If C{None}, return C{False}
135
- @type regexp: C{pattern}
136
- @return: C{True} if C{name} in dotted format matches C{regexp},
137
- else C{False}
138
- @rtype: C{bool}
139
- """
140
- if regexp is None: return False
141
-
142
- if isinstance(name, DottedName):
143
- name = str(name)
144
-
145
- return bool(regexp.search(name))
146
-
147
-
148
- def build_doc(item, introspect=True, parse=True, add_submodules=True,
149
- exclude_introspect=None, exclude_parse=None):
150
- """
151
- Build API documentation for a given item, and return it as
152
- an L{APIDoc} object.
153
-
154
- @rtype: L{APIDoc}
155
- @param item: The item to document, specified using any of the
156
- following:
157
- - A string, naming a python package directory
158
- (e.g., C{'epydoc/markup'})
159
- - A string, naming a python file
160
- (e.g., C{'epydoc/docparser.py'})
161
- - A string, naming a python object
162
- (e.g., C{'epydoc.docparser.DocParser'})
163
- - Any (non-string) python object
164
- (e.g., C{list.append})
165
- @param introspect: If true, then use introspection to examine the
166
- specified items. Otherwise, just use parsing.
167
- @param parse: If true, then use parsing to examine the specified
168
- items. Otherwise, just use introspection.
169
- """
170
- docindex = build_doc_index([item], introspect, parse, add_submodules,
171
- exclude_introspect=exclude_introspect,
172
- exclude_parse=exclude_parse)
173
- return docindex.root[0]
174
-
175
- def build_doc_index(items, introspect=True, parse=True, add_submodules=True,
176
- exclude_introspect=None, exclude_parse=None):
177
- """
178
- Build API documentation for the given list of items, and
179
- return it in the form of a L{DocIndex}.
180
-
181
- @rtype: L{DocIndex}
182
- @param items: The items to document, specified using any of the
183
- following:
184
- - A string, naming a python package directory
185
- (e.g., C{'epydoc/markup'})
186
- - A string, naming a python file
187
- (e.g., C{'epydoc/docparser.py'})
188
- - A string, naming a python object
189
- (e.g., C{'epydoc.docparser.DocParser'})
190
- - Any (non-string) python object
191
- (e.g., C{list.append})
192
- @param introspect: If true, then use introspection to examine the
193
- specified items. Otherwise, just use parsing.
194
- @param parse: If true, then use parsing to examine the specified
195
- items. Otherwise, just use introspection.
196
- """
197
- try:
198
- options = BuildOptions(parse=parse, introspect=introspect,
199
- exclude_introspect=exclude_introspect, exclude_parse=exclude_parse,
200
- add_submodules=add_submodules)
201
- except Exception, e:
202
- # log.error already reported by constructor.
203
- return None
204
-
205
- # Get the basic docs for each item.
206
- doc_pairs = _get_docs_from_items(items, options)
207
-
208
- # Merge the introspection & parse docs.
209
- if options.parse and options.introspect:
210
- log.start_progress('Merging parsed & introspected information')
211
- docs = []
212
- for i, (introspect_doc, parse_doc) in enumerate(doc_pairs):
213
- if introspect_doc is not None and parse_doc is not None:
214
- if introspect_doc.canonical_name not in (None, UNKNOWN):
215
- name = introspect_doc.canonical_name
216
- else:
217
- name = parse_doc.canonical_name
218
- log.progress(float(i)/len(doc_pairs), name)
219
- docs.append(merge_docs(introspect_doc, parse_doc))
220
- elif introspect_doc is not None:
221
- docs.append(introspect_doc)
222
- elif parse_doc is not None:
223
- docs.append(parse_doc)
224
- log.end_progress()
225
- elif options.introspect:
226
- docs = [doc_pair[0] for doc_pair in doc_pairs if doc_pair[0]]
227
- else:
228
- docs = [doc_pair[1] for doc_pair in doc_pairs if doc_pair[1]]
229
-
230
- if len(docs) == 0:
231
- log.error('Nothing left to document!')
232
- return None
233
-
234
- # Collect the docs into a single index.
235
- docindex = DocIndex(docs)
236
-
237
- # Replace any proxy valuedocs that we got from importing with
238
- # their targets.
239
- if options.parse:
240
- log.start_progress('Linking imported variables')
241
- valdocs = sorted(docindex.reachable_valdocs(
242
- imports=False, submodules=False, packages=False, subclasses=False))
243
- for i, val_doc in enumerate(valdocs):
244
- _report_valdoc_progress(i, val_doc, valdocs)
245
- link_imports(val_doc, docindex)
246
- log.end_progress()
247
-
248
- # Assign canonical names.
249
- log.start_progress('Indexing documentation')
250
- for i, val_doc in enumerate(docindex.root):
251
- log.progress(float(i)/len(docindex.root), val_doc.canonical_name)
252
- assign_canonical_names(val_doc, val_doc.canonical_name, docindex)
253
- log.end_progress()
254
-
255
- # Set overrides pointers
256
- log.start_progress('Checking for overridden methods')
257
- valdocs = sorted(docindex.reachable_valdocs(
258
- imports=False, submodules=False, packages=False, subclasses=False))
259
- for i, val_doc in enumerate(valdocs):
260
- if isinstance(val_doc, ClassDoc):
261
- percent = float(i)/len(valdocs)
262
- log.progress(percent, val_doc.canonical_name)
263
- find_overrides(val_doc)
264
- log.end_progress()
265
-
266
- # Parse the docstrings for each object.
267
- log.start_progress('Parsing docstrings')
268
- suppress_warnings = set(valdocs).difference(
269
- docindex.reachable_valdocs(
270
- imports=False, submodules=False, packages=False, subclasses=False,
271
- bases=False, overrides=True))
272
- for i, val_doc in enumerate(valdocs):
273
- _report_valdoc_progress(i, val_doc, valdocs)
274
- # the value's docstring
275
- parse_docstring(val_doc, docindex, suppress_warnings)
276
- # the value's variables' docstrings
277
- if (isinstance(val_doc, NamespaceDoc) and
278
- val_doc.variables not in (None, UNKNOWN)):
279
- for var_doc in val_doc.variables.values():
280
- # Now we have a chance to propagate the defining module
281
- # to objects for which introspection is not possible,
282
- # such as properties.
283
- if (isinstance(var_doc.value, ValueDoc)
284
- and var_doc.value.defining_module is UNKNOWN):
285
- var_doc.value.defining_module = val_doc.defining_module
286
- parse_docstring(var_doc, docindex, suppress_warnings)
287
- log.end_progress()
288
-
289
- # Take care of inheritance.
290
- log.start_progress('Inheriting documentation')
291
- for i, val_doc in enumerate(valdocs):
292
- if isinstance(val_doc, ClassDoc):
293
- percent = float(i)/len(valdocs)
294
- log.progress(percent, val_doc.canonical_name)
295
- inherit_docs(val_doc)
296
- log.end_progress()
297
-
298
- # Initialize the groups & sortedvars attributes.
299
- log.start_progress('Sorting & Grouping')
300
- for i, val_doc in enumerate(valdocs):
301
- if isinstance(val_doc, NamespaceDoc):
302
- percent = float(i)/len(valdocs)
303
- log.progress(percent, val_doc.canonical_name)
304
- val_doc.init_sorted_variables()
305
- val_doc.init_variable_groups()
306
- if isinstance(val_doc, ModuleDoc):
307
- val_doc.init_submodule_groups()
308
- val_doc.report_unused_groups()
309
- log.end_progress()
310
-
311
- return docindex
312
-
313
- def _report_valdoc_progress(i, val_doc, val_docs):
314
- if (isinstance(val_doc, (ModuleDoc, ClassDoc)) and
315
- val_doc.canonical_name is not UNKNOWN and
316
- not val_doc.canonical_name[0].startswith('??')):
317
- log.progress(float(i)/len(val_docs), val_doc.canonical_name)
318
-
319
- #/////////////////////////////////////////////////////////////////
320
- # Documentation Generation
321
- #/////////////////////////////////////////////////////////////////
322
-
323
- def _get_docs_from_items(items, options):
324
-
325
- # Start the progress bar.
326
- log.start_progress('Building documentation')
327
- progress_estimator = _ProgressEstimator(items)
328
-
329
- # Check for duplicate item names.
330
- item_set = set()
331
- for item in items[:]:
332
- if item in item_set:
333
- log.warning("Name %r given multiple times" % item)
334
- items.remove(item)
335
- item_set.add(item)
336
-
337
- # Keep track of what top-level canonical names we've assigned, to
338
- # make sure there are no naming conflicts. This dict maps
339
- # canonical names to the item names they came from (so we can print
340
- # useful error messages).
341
- canonical_names = {}
342
-
343
- # Collect (introspectdoc, parsedoc) pairs for each item.
344
- doc_pairs = []
345
- for item in items:
346
- if isinstance(item, basestring):
347
- if is_module_file(item):
348
- doc_pairs.append(_get_docs_from_module_file(
349
- item, options, progress_estimator))
350
- elif is_package_dir(item):
351
- pkgfile = os.path.abspath(os.path.join(item, '__init__'))
352
- doc_pairs.append(_get_docs_from_module_file(
353
- pkgfile, options, progress_estimator))
354
- elif os.path.isfile(item):
355
- doc_pairs.append(_get_docs_from_pyscript(
356
- item, options, progress_estimator))
357
- elif hasattr(__builtin__, item):
358
- val = getattr(__builtin__, item)
359
- doc_pairs.append(_get_docs_from_pyobject(
360
- val, options, progress_estimator))
361
- elif is_pyname(item):
362
- doc_pairs.append(_get_docs_from_pyname(
363
- item, options, progress_estimator))
364
- elif os.path.isdir(item):
365
- log.error("Directory %r is not a package" % item)
366
- continue
367
- elif os.path.isfile(item):
368
- log.error("File %s is not a Python module" % item)
369
- continue
370
- else:
371
- log.error("Could not find a file or object named %s" %
372
- item)
373
- continue
374
- else:
375
- doc_pairs.append(_get_docs_from_pyobject(
376
- item, options, progress_estimator))
377
-
378
- # Make sure there are no naming conflicts.
379
- name = (getattr(doc_pairs[-1][0], 'canonical_name', None) or
380
- getattr(doc_pairs[-1][1], 'canonical_name', None))
381
- if name in canonical_names:
382
- log.error(
383
- 'Two of the specified items, %r and %r, have the same '
384
- 'canonical name ("%s"). This may mean that you specified '
385
- 'two different files that both use the same module name. '
386
- 'Ignoring the second item (%r)' %
387
- (canonical_names[name], item, name, canonical_names[name]))
388
- doc_pairs.pop()
389
- else:
390
- canonical_names[name] = item
391
-
392
- # This will only have an effect if doc_pairs[-1] contains a
393
- # package's docs. The 'not is_module_file(item)' prevents
394
- # us from adding subdirectories if they explicitly specify
395
- # a package's __init__.py file.
396
- if options.add_submodules and not is_module_file(item):
397
- doc_pairs += _get_docs_from_submodules(
398
- item, doc_pairs[-1], options, progress_estimator)
399
-
400
- log.end_progress()
401
- return doc_pairs
402
-
403
- def _get_docs_from_pyobject(obj, options, progress_estimator):
404
- progress_estimator.complete += 1
405
- log.progress(progress_estimator.progress(), repr(obj))
406
-
407
- if not options.introspect:
408
- log.error("Cannot get docs for Python objects without "
409
- "introspecting them.")
410
-
411
- introspect_doc = parse_doc = None
412
- introspect_error = parse_error = None
413
- try:
414
- introspect_doc = introspect_docs(value=obj)
415
- except ImportError, e:
416
- log.error(e)
417
- return (None, None)
418
- if options.parse:
419
- if introspect_doc.canonical_name is not None:
420
- prev_introspect = options.introspect
421
- options.introspect = False
422
- try:
423
- _, parse_docs = _get_docs_from_pyname(
424
- str(introspect_doc.canonical_name), options,
425
- progress_estimator, suppress_warnings=True)
426
- finally:
427
- options.introspect = prev_introspect
428
-
429
- # We need a name:
430
- if introspect_doc.canonical_name in (None, UNKNOWN):
431
- if hasattr(obj, '__name__'):
432
- introspect_doc.canonical_name = DottedName(
433
- DottedName.UNREACHABLE, obj.__name__)
434
- else:
435
- introspect_doc.canonical_name = DottedName(
436
- DottedName.UNREACHABLE)
437
- return (introspect_doc, parse_doc)
438
-
439
- def _get_docs_from_pyname(name, options, progress_estimator,
440
- suppress_warnings=False):
441
- progress_estimator.complete += 1
442
- if options.must_introspect(name) or options.must_parse(name):
443
- log.progress(progress_estimator.progress(), name)
444
-
445
- introspect_doc = parse_doc = None
446
- introspect_error = parse_error = None
447
- if options.must_introspect(name):
448
- try:
449
- introspect_doc = introspect_docs(name=name)
450
- except ImportError, e:
451
- introspect_error = str(e)
452
- if options.must_parse(name):
453
- try:
454
- parse_doc = parse_docs(name=name)
455
- except ParseError, e:
456
- parse_error = str(e)
457
- except ImportError, e:
458
- # If we get here, then there' probably no python source
459
- # available; don't bother to generate a warnining.
460
- pass
461
-
462
- # Report any errors we encountered.
463
- if not suppress_warnings:
464
- _report_errors(name, introspect_doc, parse_doc,
465
- introspect_error, parse_error)
466
-
467
- # Return the docs we found.
468
- return (introspect_doc, parse_doc)
469
-
470
- def _get_docs_from_pyscript(filename, options, progress_estimator):
471
- # [xx] I should be careful about what names I allow as filenames,
472
- # and maybe do some munging to prevent problems.
473
-
474
- introspect_doc = parse_doc = None
475
- introspect_error = parse_error = None
476
- if options.introspect:
477
- try:
478
- introspect_doc = introspect_docs(filename=filename, is_script=True)
479
- if introspect_doc.canonical_name is UNKNOWN:
480
- introspect_doc.canonical_name = munge_script_name(filename)
481
- except ImportError, e:
482
- introspect_error = str(e)
483
- if options.parse:
484
- try:
485
- parse_doc = parse_docs(filename=filename, is_script=True)
486
- except ParseError, e:
487
- parse_error = str(e)
488
- except ImportError, e:
489
- parse_error = str(e)
490
-
491
- # Report any errors we encountered.
492
- _report_errors(filename, introspect_doc, parse_doc,
493
- introspect_error, parse_error)
494
-
495
- # Return the docs we found.
496
- return (introspect_doc, parse_doc)
497
-
498
- def _get_docs_from_module_file(filename, options, progress_estimator,
499
- parent_docs=(None,None)):
500
- """
501
- Construct and return the API documentation for the python
502
- module with the given filename.
503
-
504
- @param parent_docs: The C{ModuleDoc} of the containing package.
505
- If C{parent_docs} is not provided, then this method will
506
- check if the given filename is contained in a package; and
507
- if so, it will construct a stub C{ModuleDoc} for the
508
- containing package(s). C{parent_docs} is a tuple, where
509
- the first element is the parent from introspection, and
510
- the second element is the parent from parsing.
511
- """
512
- # Record our progress.
513
- modulename = os.path.splitext(os.path.split(filename)[1])[0]
514
- if modulename == '__init__':
515
- modulename = os.path.split(os.path.split(filename)[0])[1]
516
- if parent_docs[0]:
517
- modulename = DottedName(parent_docs[0].canonical_name, modulename)
518
- elif parent_docs[1]:
519
- modulename = DottedName(parent_docs[1].canonical_name, modulename)
520
- if options.must_introspect(modulename) or options.must_parse(modulename):
521
- log.progress(progress_estimator.progress(),
522
- '%s (%s)' % (modulename, filename))
523
- progress_estimator.complete += 1
524
-
525
- # Normalize the filename.
526
- filename = os.path.normpath(os.path.abspath(filename))
527
-
528
- # When possible, use the source version of the file.
529
- try:
530
- filename = py_src_filename(filename)
531
- src_file_available = True
532
- except ValueError:
533
- src_file_available = False
534
-
535
- # Get the introspected & parsed docs (as appropriate)
536
- introspect_doc = parse_doc = None
537
- introspect_error = parse_error = None
538
- if options.must_introspect(modulename):
539
- try:
540
- introspect_doc = introspect_docs(
541
- filename=filename, context=parent_docs[0])
542
- if introspect_doc.canonical_name is UNKNOWN:
543
- introspect_doc.canonical_name = modulename
544
- except ImportError, e:
545
- introspect_error = str(e)
546
- if src_file_available and options.must_parse(modulename):
547
- try:
548
- parse_doc = parse_docs(
549
- filename=filename, context=parent_docs[1])
550
- except ParseError, e:
551
- parse_error = str(e)
552
- except ImportError, e:
553
- parse_error = str(e)
554
-
555
- # Report any errors we encountered.
556
- _report_errors(filename, introspect_doc, parse_doc,
557
- introspect_error, parse_error)
558
-
559
- # Return the docs we found.
560
- return (introspect_doc, parse_doc)
561
-
562
- def _get_docs_from_submodules(item, pkg_docs, options, progress_estimator):
563
- # Extract the package's __path__.
564
- if isinstance(pkg_docs[0], ModuleDoc) and pkg_docs[0].is_package:
565
- pkg_path = pkg_docs[0].path
566
- package_dir = os.path.split(pkg_docs[0].filename)[0]
567
- elif isinstance(pkg_docs[1], ModuleDoc) and pkg_docs[1].is_package:
568
- pkg_path = pkg_docs[1].path
569
- package_dir = os.path.split(pkg_docs[1].filename)[0]
570
- else:
571
- return []
572
-
573
- module_filenames = {}
574
- subpackage_dirs = set()
575
- for subdir in pkg_path:
576
- if os.path.isdir(subdir):
577
- for name in os.listdir(subdir):
578
- filename = os.path.join(subdir, name)
579
- # Is it a valid module filename?
580
- if is_module_file(filename):
581
- basename = os.path.splitext(filename)[0]
582
- if os.path.split(basename)[1] != '__init__':
583
- module_filenames[basename] = filename
584
- # Is it a valid package filename?
585
- if is_package_dir(filename):
586
- subpackage_dirs.add(filename)
587
-
588
- # Update our estimate of the number of modules in this package.
589
- progress_estimator.revise_estimate(item, module_filenames.items(),
590
- subpackage_dirs)
591
-
592
- docs = [pkg_docs]
593
- for module_filename in module_filenames.values():
594
- d = _get_docs_from_module_file(
595
- module_filename, options, progress_estimator, pkg_docs)
596
- docs.append(d)
597
- for subpackage_dir in subpackage_dirs:
598
- subpackage_file = os.path.join(subpackage_dir, '__init__')
599
- docs.append(_get_docs_from_module_file(
600
- subpackage_file, options, progress_estimator, pkg_docs))
601
- docs += _get_docs_from_submodules(
602
- subpackage_dir, docs[-1], options, progress_estimator)
603
- return docs
604
-
605
- def _report_errors(name, introspect_doc, parse_doc,
606
- introspect_error, parse_error):
607
- hdr = 'In %s:\n' % name
608
- if introspect_doc == parse_doc == None:
609
- log.start_block('%sNo documentation available!' % hdr)
610
- if introspect_error:
611
- log.error('Import failed:\n%s' % introspect_error)
612
- if parse_error:
613
- log.error('Source code parsing failed:\n%s' % parse_error)
614
- log.end_block()
615
- elif introspect_error:
616
- log.start_block('%sImport failed (but source code parsing '
617
- 'was successful).' % hdr)
618
- log.error(introspect_error)
619
- log.end_block()
620
- elif parse_error:
621
- log.start_block('%sSource code parsing failed (but '
622
- 'introspection was successful).' % hdr)
623
- log.error(parse_error)
624
- log.end_block()
625
-
626
-
627
- #/////////////////////////////////////////////////////////////////
628
- # Progress Estimation (for Documentation Generation)
629
- #/////////////////////////////////////////////////////////////////
630
-
631
- class _ProgressEstimator:
632
- """
633
- Used to keep track of progress when generating the initial docs
634
- for the given items. (It is not known in advance how many items a
635
- package directory will contain, since it might depend on those
636
- packages' __path__ values.)
637
- """
638
- def __init__(self, items):
639
- self.est_totals = {}
640
- self.complete = 0
641
-
642
- for item in items:
643
- if is_package_dir(item):
644
- self.est_totals[item] = self._est_pkg_modules(item)
645
- else:
646
- self.est_totals[item] = 1
647
-
648
- def progress(self):
649
- total = sum(self.est_totals.values())
650
- return float(self.complete) / total
651
-
652
- def revise_estimate(self, pkg_item, modules, subpackages):
653
- del self.est_totals[pkg_item]
654
- for item in modules:
655
- self.est_totals[item] = 1
656
- for item in subpackages:
657
- self.est_totals[item] = self._est_pkg_modules(item)
658
-
659
- def _est_pkg_modules(self, package_dir):
660
- num_items = 0
661
-
662
- if is_package_dir(package_dir):
663
- for name in os.listdir(package_dir):
664
- filename = os.path.join(package_dir, name)
665
- if is_module_file(filename):
666
- num_items += 1
667
- elif is_package_dir(filename):
668
- num_items += self._est_pkg_modules(filename)
669
-
670
- return num_items
671
-
672
- ######################################################################
673
- ## Doc Merger
674
- ######################################################################
675
-
676
- MERGE_PRECEDENCE = {
677
- 'repr': 'parse',
678
-
679
- # The names we get from introspection match the names that users
680
- # can actually use -- i.e., they take magic into account.
681
- 'canonical_name': 'introspect',
682
-
683
- # Only fall-back on the parser for is_imported if the introspecter
684
- # isn't sure. Otherwise, we can end up thinking that vars
685
- # containing modules are not imported, which can cause external
686
- # modules to show up in the docs (sf bug #1653486)
687
- 'is_imported': 'introspect',
688
-
689
- # The parser can tell if an assignment creates an alias or not.
690
- 'is_alias': 'parse',
691
-
692
- # The parser is better able to determine what text file something
693
- # came from; e.g., it can't be fooled by 'covert' imports.
694
- 'docformat': 'parse',
695
-
696
- # The parse should be able to tell definitively whether a module
697
- # is a package or not.
698
- 'is_package': 'parse',
699
-
700
- # Extract the sort spec from the order in which values are defined
701
- # in the source file.
702
- 'sort_spec': 'parse',
703
-
704
- 'submodules': 'introspect',
705
-
706
- # The filename used by 'parse' is the source file.
707
- 'filename': 'parse',
708
-
709
- # 'parse' is more likely to get the encoding right, but
710
- # 'introspect' will handle programatically generated docstrings.
711
- # Which is better?
712
- 'docstring': 'introspect',
713
- }
714
- """Indicates whether information from introspection or parsing should be
715
- given precedence, for specific attributes. This dictionary maps from
716
- attribute names to either C{'introspect'} or C{'parse'}."""
717
-
718
- DEFAULT_MERGE_PRECEDENCE = 'introspect'
719
- """Indicates whether information from introspection or parsing should be
720
- given precedence. Should be either C{'introspect'} or C{'parse'}"""
721
-
722
- _attribute_mergefunc_registry = {}
723
- def register_attribute_mergefunc(attrib, mergefunc):
724
- """
725
- Register an attribute merge function. This function will be
726
- called by L{merge_docs()} when it needs to merge the attribute
727
- values of two C{APIDoc}s.
728
-
729
- @param attrib: The name of the attribute whose values are merged
730
- by C{mergefunc}.
731
-
732
- @param mergefunc: The merge function, whose sinature is:
733
-
734
- >>> def mergefunc(introspect_val, parse_val, precedence, cyclecheck, path):
735
- ... return calculate_merged_value(introspect_val, parse_val)
736
-
737
- Where C{introspect_val} and C{parse_val} are the two values to
738
- combine; C{precedence} is a string indicating which value takes
739
- precedence for this attribute (C{'introspect'} or C{'parse'});
740
- C{cyclecheck} is a value used by C{merge_docs()} to make sure that
741
- it only visits each pair of docs once; and C{path} is a string
742
- describing the path that was taken from the root to this
743
- attribute (used to generate log messages).
744
-
745
- If the merge function needs to call C{merge_docs}, then it should
746
- pass C{cyclecheck} and C{path} back in. (When appropriate, a
747
- suffix should be added to C{path} to describe the path taken to
748
- the merged values.)
749
- """
750
- _attribute_mergefunc_registry[attrib] = mergefunc
751
-
752
- def merge_docs(introspect_doc, parse_doc, cyclecheck=None, path=None):
753
- """
754
- Merge the API documentation information that was obtained from
755
- introspection with information that was obtained from parsing.
756
- C{introspect_doc} and C{parse_doc} should be two C{APIDoc} instances
757
- that describe the same object. C{merge_docs} combines the
758
- information from these two instances, and returns the merged
759
- C{APIDoc}.
760
-
761
- If C{introspect_doc} and C{parse_doc} are compatible, then they will
762
- be I{merged} -- i.e., they will be coerced to a common class, and
763
- their state will be stored in a shared dictionary. Once they have
764
- been merged, any change made to the attributes of one will affect
765
- the other. The value for the each of the merged C{APIDoc}'s
766
- attributes is formed by combining the values of the source
767
- C{APIDoc}s' attributes, as follows:
768
-
769
- - If either of the source attributes' value is C{UNKNOWN}, then
770
- use the other source attribute's value.
771
- - Otherwise, if an attribute merge function has been registered
772
- for the attribute, then use that function to calculate the
773
- merged value from the two source attribute values.
774
- - Otherwise, if L{MERGE_PRECEDENCE} is defined for the
775
- attribute, then use the attribute value from the source that
776
- it indicates.
777
- - Otherwise, use the attribute value from the source indicated
778
- by L{DEFAULT_MERGE_PRECEDENCE}.
779
-
780
- If C{introspect_doc} and C{parse_doc} are I{not} compatible (e.g., if
781
- their values have incompatible types), then C{merge_docs()} will
782
- simply return either C{introspect_doc} or C{parse_doc}, depending on
783
- the value of L{DEFAULT_MERGE_PRECEDENCE}. The two input
784
- C{APIDoc}s will not be merged or modified in any way.
785
-
786
- @param cyclecheck, path: These arguments should only be provided
787
- when C{merge_docs()} is called by an attribute merge
788
- function. See L{register_attribute_mergefunc()} for more
789
- details.
790
- """
791
- assert isinstance(introspect_doc, APIDoc)
792
- assert isinstance(parse_doc, APIDoc)
793
-
794
- if cyclecheck is None:
795
- cyclecheck = set()
796
- if introspect_doc.canonical_name not in (None, UNKNOWN):
797
- path = '%s' % introspect_doc.canonical_name
798
- elif parse_doc.canonical_name not in (None, UNKNOWN):
799
- path = '%s' % parse_doc.canonical_name
800
- else:
801
- path = '??'
802
-
803
- # If we've already examined this pair, then there's nothing
804
- # more to do. The reason that we check id's here is that we
805
- # want to avoid hashing the APIDoc objects for now, so we can
806
- # use APIDoc.merge_and_overwrite() later.
807
- if (id(introspect_doc), id(parse_doc)) in cyclecheck:
808
- return introspect_doc
809
- cyclecheck.add( (id(introspect_doc), id(parse_doc)) )
810
-
811
- # If these two are already merged, then we're done. (Two
812
- # APIDoc's compare equal iff they are identical or have been
813
- # merged.)
814
- if introspect_doc == parse_doc:
815
- return introspect_doc
816
-
817
- # If both values are GenericValueDoc, then we don't want to merge
818
- # them. E.g., we don't want to merge 2+2 with 4. So just copy
819
- # the parse_doc's parse_repr to introspect_doc, & return it.
820
- # (In particular, do *not* call merge_and_overwrite.)
821
- if type(introspect_doc) == type(parse_doc) == GenericValueDoc:
822
- if parse_doc.parse_repr is not UNKNOWN:
823
- introspect_doc.parse_repr = parse_doc.parse_repr
824
- introspect_doc.docs_extracted_by = 'both'
825
- return introspect_doc
826
-
827
- # Perform several sanity checks here -- if we accidentally
828
- # merge values that shouldn't get merged, then bad things can
829
- # happen.
830
- mismatch = None
831
- if (introspect_doc.__class__ != parse_doc.__class__ and
832
- not (issubclass(introspect_doc.__class__, parse_doc.__class__) or
833
- issubclass(parse_doc.__class__, introspect_doc.__class__))):
834
- mismatch = ("value types don't match -- i=%r, p=%r." %
835
- (introspect_doc.__class__, parse_doc.__class__))
836
- if (isinstance(introspect_doc, ValueDoc) and
837
- isinstance(parse_doc, ValueDoc)):
838
- if (introspect_doc.pyval is not UNKNOWN and
839
- parse_doc.pyval is not UNKNOWN and
840
- introspect_doc.pyval is not parse_doc.pyval):
841
- mismatch = "values don't match."
842
- elif (introspect_doc.canonical_name not in (None, UNKNOWN) and
843
- parse_doc.canonical_name not in (None, UNKNOWN) and
844
- introspect_doc.canonical_name != parse_doc.canonical_name):
845
- mismatch = "canonical names don't match."
846
- if mismatch is not None:
847
- log.info("Not merging the parsed & introspected values of %s, "
848
- "since their %s" % (path, mismatch))
849
- if DEFAULT_MERGE_PRECEDENCE == 'introspect':
850
- return introspect_doc
851
- else:
852
- return parse_doc
853
-
854
- # If one apidoc's class is a superclass of the other's, then
855
- # specialize it to the more specific class.
856
- if introspect_doc.__class__ is not parse_doc.__class__:
857
- if issubclass(introspect_doc.__class__, parse_doc.__class__):
858
- parse_doc.specialize_to(introspect_doc.__class__)
859
- if issubclass(parse_doc.__class__, introspect_doc.__class__):
860
- introspect_doc.specialize_to(parse_doc.__class__)
861
- assert introspect_doc.__class__ is parse_doc.__class__
862
-
863
- # The posargs and defaults are tied together -- if we merge
864
- # the posargs one way, then we need to merge the defaults the
865
- # same way. So check them first. (This is a minor hack)
866
- if (isinstance(introspect_doc, RoutineDoc) and
867
- isinstance(parse_doc, RoutineDoc)):
868
- _merge_posargs_and_defaults(introspect_doc, parse_doc, path)
869
-
870
- # Merge the two api_doc's attributes.
871
- for attrib in set(introspect_doc.__dict__.keys() +
872
- parse_doc.__dict__.keys()):
873
- # Be sure not to merge any private attributes (especially
874
- # __mergeset or __has_been_hashed!)
875
- if attrib.startswith('_'): continue
876
- merge_attribute(attrib, introspect_doc, parse_doc,
877
- cyclecheck, path)
878
-
879
- # Set the dictionaries to be shared.
880
- return introspect_doc.merge_and_overwrite(parse_doc)
881
-
882
- def _merge_posargs_and_defaults(introspect_doc, parse_doc, path):
883
- # If either is unknown, then let merge_attrib handle it.
884
- if introspect_doc.posargs is UNKNOWN or parse_doc.posargs is UNKNOWN:
885
- return
886
-
887
- # If the introspected doc just has '...', then trust the parsed doc.
888
- if introspect_doc.posargs == ['...'] and parse_doc.posargs != ['...']:
889
- introspect_doc.posargs = parse_doc.posargs
890
- introspect_doc.posarg_defaults = parse_doc.posarg_defaults
891
-
892
- # If they are incompatible, then check the precedence.
893
- elif introspect_doc.posargs != parse_doc.posargs:
894
- log.info("Not merging the parsed & introspected arg "
895
- "lists for %s, since they don't match (%s vs %s)"
896
- % (path, introspect_doc.posargs, parse_doc.posargs))
897
- if (MERGE_PRECEDENCE.get('posargs', DEFAULT_MERGE_PRECEDENCE) ==
898
- 'introspect'):
899
- parse_doc.posargs = introspect_doc.posargs
900
- parse_doc.posarg_defaults = introspect_doc.posarg_defaults
901
- else:
902
- introspect_doc.posargs = parse_doc.posargs
903
- introspect_doc.posarg_defaults = parse_doc.posarg_defaults
904
-
905
- def merge_attribute(attrib, introspect_doc, parse_doc, cyclecheck, path):
906
- precedence = MERGE_PRECEDENCE.get(attrib, DEFAULT_MERGE_PRECEDENCE)
907
- if precedence not in ('parse', 'introspect'):
908
- raise ValueError('Bad precedence value %r' % precedence)
909
-
910
- if (getattr(introspect_doc, attrib) is UNKNOWN and
911
- getattr(parse_doc, attrib) is not UNKNOWN):
912
- setattr(introspect_doc, attrib, getattr(parse_doc, attrib))
913
- elif (getattr(introspect_doc, attrib) is not UNKNOWN and
914
- getattr(parse_doc, attrib) is UNKNOWN):
915
- setattr(parse_doc, attrib, getattr(introspect_doc, attrib))
916
- elif (getattr(introspect_doc, attrib) is UNKNOWN and
917
- getattr(parse_doc, attrib) is UNKNOWN):
918
- pass
919
- else:
920
- # Both APIDoc objects have values; we need to merge them.
921
- introspect_val = getattr(introspect_doc, attrib)
922
- parse_val = getattr(parse_doc, attrib)
923
- if attrib in _attribute_mergefunc_registry:
924
- handler = _attribute_mergefunc_registry[attrib]
925
- merged_val = handler(introspect_val, parse_val, precedence,
926
- cyclecheck, path)
927
- elif precedence == 'introspect':
928
- merged_val = introspect_val
929
- elif precedence == 'parse':
930
- merged_val = parse_val
931
-
932
- setattr(introspect_doc, attrib, merged_val)
933
- setattr(parse_doc, attrib, merged_val)
934
-
935
- def merge_variables(varlist1, varlist2, precedence, cyclecheck, path):
936
- # Merge all variables that are in both sets.
937
- for varname, var1 in varlist1.items():
938
- var2 = varlist2.get(varname)
939
- if var2 is not None:
940
- var = merge_docs(var1, var2, cyclecheck, path+'.'+varname)
941
- varlist1[varname] = var
942
- varlist2[varname] = var
943
-
944
- # Copy any variables that are not in varlist1 over.
945
- for varname, var in varlist2.items():
946
- varlist1.setdefault(varname, var)
947
-
948
- return varlist1
949
-
950
- def merge_value(value1, value2, precedence, cyclecheck, path):
951
- assert value1 is not None and value2 is not None
952
- return merge_docs(value1, value2, cyclecheck, path)
953
-
954
- def merge_overrides(v1, v2, precedence, cyclecheck, path):
955
- return merge_value(v1, v2, precedence, cyclecheck, path+'.<overrides>')
956
- def merge_fget(v1, v2, precedence, cyclecheck, path):
957
- return merge_value(v1, v2, precedence, cyclecheck, path+'.fget')
958
- def merge_fset(v1, v2, precedence, cyclecheck, path):
959
- return merge_value(v1, v2, precedence, cyclecheck, path+'.fset')
960
- def merge_fdel(v1, v2, precedence, cyclecheck, path):
961
- return merge_value(v1, v2, precedence, cyclecheck, path+'.fdel')
962
-
963
- def merge_proxy_for(v1, v2, precedence, cyclecheck, path):
964
- # Anything we got from introspection shouldn't have a proxy_for
965
- # attribute -- it should be the actual object's documentation.
966
- return v1
967
-
968
- def merge_bases(baselist1, baselist2, precedence, cyclecheck, path):
969
- # Be careful here -- if we get it wrong, then we could end up
970
- # merging two unrelated classes, which could lead to bad
971
- # things (e.g., a class that's its own subclass). So only
972
- # merge two bases if we're quite sure they're the same class.
973
- # (In particular, if they have the same canonical name.)
974
-
975
- # If the lengths don't match up, then give up. This is most
976
- # often caused by __metaclass__.
977
- if len(baselist1) != len(baselist2):
978
- log.info("Not merging the introspected & parsed base lists "
979
- "for %s, since their lengths don't match (%s vs %s)" %
980
- (path, len(baselist1), len(baselist2)))
981
- if precedence == 'introspect': return baselist1
982
- else: return baselist2
983
-
984
- # If any names disagree, then give up.
985
- for base1, base2 in zip(baselist1, baselist2):
986
- if ((base1.canonical_name not in (None, UNKNOWN) and
987
- base2.canonical_name not in (None, UNKNOWN)) and
988
- base1.canonical_name != base2.canonical_name):
989
- log.info("Not merging the parsed & introspected base "
990
- "lists for %s, since the bases' names don't match "
991
- "(%s vs %s)" % (path, base1.canonical_name,
992
- base2.canonical_name))
993
- if precedence == 'introspect': return baselist1
994
- else: return baselist2
995
-
996
- for i, (base1, base2) in enumerate(zip(baselist1, baselist2)):
997
- base = merge_docs(base1, base2, cyclecheck,
998
- '%s.__bases__[%d]' % (path, i))
999
- baselist1[i] = baselist2[i] = base
1000
-
1001
- return baselist1
1002
-
1003
- def merge_posarg_defaults(defaults1, defaults2, precedence, cyclecheck, path):
1004
- if len(defaults1) != len(defaults2):
1005
- if precedence == 'introspect': return defaults1
1006
- else: return defaults2
1007
- defaults = []
1008
- for i, (d1, d2) in enumerate(zip(defaults1, defaults2)):
1009
- if d1 is not None and d2 is not None:
1010
- d_path = '%s.<default-arg-val>[%d]' % (path, i)
1011
- defaults.append(merge_docs(d1, d2, cyclecheck, d_path))
1012
- elif precedence == 'introspect':
1013
- defaults.append(d1)
1014
- else:
1015
- defaults.append(d2)
1016
- return defaults
1017
-
1018
- def merge_docstring(docstring1, docstring2, precedence, cyclecheck, path):
1019
- if docstring1 is None or docstring1 is UNKNOWN or precedence=='parse':
1020
- return docstring2
1021
- else:
1022
- return docstring1
1023
-
1024
- def merge_docs_extracted_by(v1, v2, precedence, cyclecheck, path):
1025
- return 'both'
1026
-
1027
- def merge_submodules(v1, v2, precedence, cyclecheck, path):
1028
- n1 = sorted([m.canonical_name for m in v1])
1029
- n2 = sorted([m.canonical_name for m in v2])
1030
- if (n1 != n2) and (n2 != []):
1031
- log.info('Introspector & parser disagree about submodules '
1032
- 'for %s: (%s) vs (%s)' % (path,
1033
- ', '.join([str(n) for n in n1]),
1034
- ', '.join([str(n) for n in n2])))
1035
- return v1 + [m for m in v2 if m.canonical_name not in n1]
1036
-
1037
- return v1
1038
-
1039
- register_attribute_mergefunc('variables', merge_variables)
1040
- register_attribute_mergefunc('value', merge_value)
1041
- register_attribute_mergefunc('overrides', merge_overrides)
1042
- register_attribute_mergefunc('fget', merge_fget)
1043
- register_attribute_mergefunc('fset', merge_fset)
1044
- register_attribute_mergefunc('fdel', merge_fdel)
1045
- register_attribute_mergefunc('proxy_for', merge_proxy_for)
1046
- register_attribute_mergefunc('bases', merge_bases)
1047
- register_attribute_mergefunc('posarg_defaults', merge_posarg_defaults)
1048
- register_attribute_mergefunc('docstring', merge_docstring)
1049
- register_attribute_mergefunc('docs_extracted_by', merge_docs_extracted_by)
1050
- register_attribute_mergefunc('submodules', merge_submodules)
1051
-
1052
- ######################################################################
1053
- ## Import Linking
1054
- ######################################################################
1055
-
1056
- def link_imports(val_doc, docindex):
1057
- # Check if the ValueDoc has an unresolved proxy_for link.
1058
- # If so, then resolve it.
1059
- while val_doc.proxy_for not in (UNKNOWN, None):
1060
- # Find the valuedoc that the proxy_for name points to.
1061
- src_doc = docindex.get_valdoc(val_doc.proxy_for)
1062
-
1063
- # If we don't have any valuedoc at that address, then
1064
- # set that address as its canonical name.
1065
- # [XXX] Do I really want to do this?
1066
- if src_doc is None:
1067
- val_doc.canonical_name = val_doc.proxy_for
1068
- return
1069
-
1070
- # If we *do* have something at that address, then
1071
- # merge the proxy `val_doc` with it.
1072
- elif src_doc != val_doc:
1073
- # Copy any subclass information from val_doc->src_doc.
1074
- if (isinstance(val_doc, ClassDoc) and
1075
- isinstance(src_doc, ClassDoc)):
1076
- for subclass in val_doc.subclasses:
1077
- if subclass not in src_doc.subclasses:
1078
- src_doc.subclasses.append(subclass)
1079
- # Then overwrite val_doc with the contents of src_doc.
1080
- src_doc.merge_and_overwrite(val_doc, ignore_hash_conflict=True)
1081
-
1082
- # If the proxy_for link points back at src_doc
1083
- # itself, then we most likely have a variable that's
1084
- # shadowing a submodule that it should be equal to.
1085
- # So just get rid of the variable.
1086
- elif src_doc == val_doc:
1087
- parent_name = val_doc.proxy_for[:-1]
1088
- var_name = val_doc.proxy_for[-1]
1089
- parent = docindex.get_valdoc(parent_name)
1090
- if parent is not None and var_name in parent.variables:
1091
- del parent.variables[var_name]
1092
- src_doc.proxy_for = None
1093
-
1094
- ######################################################################
1095
- ## Canonical Name Assignment
1096
- ######################################################################
1097
-
1098
- _name_scores = {}
1099
- """A dictionary mapping from each C{ValueDoc} to the score that has
1100
- been assigned to its current cannonical name. If
1101
- L{assign_canonical_names()} finds a canonical name with a better
1102
- score, then it will replace the old name."""
1103
-
1104
- _unreachable_names = {DottedName(DottedName.UNREACHABLE):1}
1105
- """The set of names that have been used for unreachable objects. This
1106
- is used to ensure there are no duplicate cannonical names assigned.
1107
- C{_unreachable_names} is a dictionary mapping from dotted names to
1108
- integer ids, where the next unused unreachable name derived from
1109
- dotted name C{n} is
1110
- C{DottedName('%s-%s' % (n, str(_unreachable_names[n]+1))}"""
1111
-
1112
- def assign_canonical_names(val_doc, name, docindex, score=0):
1113
- """
1114
- Assign a canonical name to C{val_doc} (if it doesn't have one
1115
- already), and (recursively) to each variable in C{val_doc}.
1116
- In particular, C{val_doc} will be assigned the canonical name
1117
- C{name} iff either:
1118
- - C{val_doc}'s canonical name is C{UNKNOWN}; or
1119
- - C{val_doc}'s current canonical name was assigned by this
1120
- method; but the score of the new name (C{score}) is higher
1121
- than the score of the current name (C{score_dict[val_doc]}).
1122
-
1123
- Note that canonical names will even be assigned to values
1124
- like integers and C{None}; but these should be harmless.
1125
- """
1126
- # If we've already visited this node, and our new score
1127
- # doesn't beat our old score, then there's nothing more to do.
1128
- # Note that since score increases strictly monotonically, this
1129
- # also prevents us from going in cycles.
1130
- if val_doc in _name_scores and score <= _name_scores[val_doc]:
1131
- return
1132
-
1133
- # Update val_doc's canonical name, if appropriate.
1134
- if (val_doc not in _name_scores and
1135
- val_doc.canonical_name is not UNKNOWN):
1136
- # If this is the first time we've seen val_doc, and it
1137
- # already has a name, then don't change that name.
1138
- _name_scores[val_doc] = sys.maxint
1139
- name = val_doc.canonical_name
1140
- score = 0
1141
- else:
1142
- # Otherwise, update the name iff the new score is better
1143
- # than the old one.
1144
- if (val_doc not in _name_scores or
1145
- score > _name_scores[val_doc]):
1146
- val_doc.canonical_name = name
1147
- _name_scores[val_doc] = score
1148
-
1149
- # Recurse to any contained values.
1150
- if isinstance(val_doc, NamespaceDoc):
1151
- for var_doc in val_doc.variables.values():
1152
- # Set the variable's canonical name.
1153
- varname = DottedName(name, var_doc.name)
1154
- var_doc.canonical_name = varname
1155
-
1156
- # If the value is unknown, or is a generic value doc, then
1157
- # the valuedoc doesn't get assigned a name; move on.
1158
- if (var_doc.value is UNKNOWN
1159
- or isinstance(var_doc.value, GenericValueDoc)):
1160
- continue
1161
-
1162
- # [XX] After svn commit 1644-1647, I'm not sure if this
1163
- # ever gets used: This check is for cases like
1164
- # curses.wrapper, where an imported variable shadows its
1165
- # value's "real" location.
1166
- if _var_shadows_self(var_doc, varname):
1167
- _fix_self_shadowing_var(var_doc, varname, docindex)
1168
-
1169
- # Find the score for this new name.
1170
- vardoc_score = score-1
1171
- if var_doc.is_imported is UNKNOWN: vardoc_score -= 10
1172
- elif var_doc.is_imported: vardoc_score -= 100
1173
- if var_doc.is_alias is UNKNOWN: vardoc_score -= 10
1174
- elif var_doc.is_alias: vardoc_score -= 1000
1175
-
1176
- assign_canonical_names(var_doc.value, varname,
1177
- docindex, vardoc_score)
1178
-
1179
- # Recurse to any directly reachable values.
1180
- for val_doc_2 in val_doc.apidoc_links(variables=False):
1181
- val_name, val_score = _unreachable_name_for(val_doc_2, docindex)
1182
- assign_canonical_names(val_doc_2, val_name, docindex, val_score)
1183
-
1184
- def _var_shadows_self(var_doc, varname):
1185
- return (var_doc.value not in (None, UNKNOWN) and
1186
- var_doc.value.canonical_name not in (None, UNKNOWN) and
1187
- var_doc.value.canonical_name != varname and
1188
- varname.dominates(var_doc.value.canonical_name))
1189
-
1190
- def _fix_self_shadowing_var(var_doc, varname, docindex):
1191
- # If possible, find another name for the shadowed value.
1192
- cname = var_doc.value.canonical_name
1193
- for i in range(1, len(cname)-1):
1194
- new_name = cname[:i] + (cname[i]+"'") + cname[i+1:]
1195
- val_doc = docindex.get_valdoc(new_name)
1196
- if val_doc is not None:
1197
- log.warning("%s shadows its own value -- using %s instead" %
1198
- (varname, new_name))
1199
- var_doc.value = val_doc
1200
- return
1201
-
1202
- # If we couldn't find the actual value, use an unreachable name.
1203
- name, score = _unreachable_name_for(var_doc.value, docindex)
1204
- log.warning('%s shadows itself -- using %s instead' % (varname, name))
1205
- var_doc.value.canonical_name = name
1206
-
1207
- def _unreachable_name_for(val_doc, docindex):
1208
- assert isinstance(val_doc, ValueDoc)
1209
-
1210
- # [xx] (when) does this help?
1211
- if (isinstance(val_doc, ModuleDoc) and
1212
- len(val_doc.canonical_name)==1 and val_doc.package is None):
1213
- for root_val in docindex.root:
1214
- if root_val.canonical_name == val_doc.canonical_name:
1215
- if root_val != val_doc:
1216
- log.error("Name conflict: %r vs %r" %
1217
- (val_doc, root_val))
1218
- break
1219
- else:
1220
- return val_doc.canonical_name, -1000
1221
-
1222
- # Assign it an 'unreachable' name:
1223
- if (val_doc.pyval is not UNKNOWN and
1224
- hasattr(val_doc.pyval, '__name__')):
1225
- try:
1226
- name = DottedName(DottedName.UNREACHABLE,
1227
- val_doc.pyval.__name__, strict=True)
1228
- except DottedName.InvalidDottedName:
1229
- name = DottedName(DottedName.UNREACHABLE)
1230
- else:
1231
- name = DottedName(DottedName.UNREACHABLE)
1232
-
1233
- # Uniquify the name.
1234
- if name in _unreachable_names:
1235
- _unreachable_names[name] += 1
1236
- name = DottedName('%s-%s' % (name, _unreachable_names[name]-1))
1237
- else:
1238
- _unreachable_names[name] = 1
1239
-
1240
- return name, -10000
1241
-
1242
- ######################################################################
1243
- ## Documentation Inheritance
1244
- ######################################################################
1245
-
1246
- def find_overrides(class_doc):
1247
- """
1248
- Set the C{overrides} attribute for all variables in C{class_doc}.
1249
- This needs to be done early (before docstring parsing), so we can
1250
- know which docstrings to suppress warnings for.
1251
- """
1252
- for base_class in list(class_doc.mro(warn_about_bad_bases=True)):
1253
- if base_class == class_doc: continue
1254
- if base_class.variables is UNKNOWN: continue
1255
- for name, var_doc in base_class.variables.items():
1256
- if ( not (name.startswith('__') and not name.endswith('__')) and
1257
- base_class == var_doc.container and
1258
- name in class_doc.variables and
1259
- class_doc.variables[name].container==class_doc and
1260
- class_doc.variables[name].overrides is UNKNOWN ):
1261
- class_doc.variables[name].overrides = var_doc
1262
-
1263
-
1264
- def inherit_docs(class_doc):
1265
- for base_class in list(class_doc.mro(warn_about_bad_bases=True)):
1266
- if base_class == class_doc: continue
1267
-
1268
- # Inherit any groups. Place them *after* this class's groups,
1269
- # so that any groups that are important to this class come
1270
- # first.
1271
- if base_class.group_specs not in (None, UNKNOWN):
1272
- class_doc.group_specs += [gs for gs in base_class.group_specs
1273
- if gs not in class_doc.group_specs]
1274
-
1275
- # Inherit any variables.
1276
- if base_class.variables is UNKNOWN: continue
1277
- for name, var_doc in base_class.variables.items():
1278
- # If it's a __private variable, then don't inherit it.
1279
- if name.startswith('__') and not name.endswith('__'):
1280
- continue
1281
-
1282
- # Inhetit only from the defining class. Or else, in case of
1283
- # multiple inheritance, we may import from a grand-ancestor
1284
- # variables overridden by a class that follows in mro.
1285
- if base_class != var_doc.container:
1286
- continue
1287
-
1288
- # If class_doc doesn't have a variable with this name,
1289
- # then inherit it.
1290
- if name not in class_doc.variables:
1291
- class_doc.variables[name] = var_doc
1292
-
1293
- # Otherwise, class_doc already contains a variable
1294
- # that shadows var_doc. But if class_doc's var is
1295
- # local, then record the fact that it overrides
1296
- # var_doc.
1297
- elif class_doc.variables[name].container==class_doc:
1298
- class_doc.variables[name].overrides = var_doc
1299
- _inherit_info(class_doc.variables[name])
1300
-
1301
- _INHERITED_ATTRIBS = [
1302
- 'descr', 'summary', 'metadata', 'extra_docstring_fields',
1303
- 'type_descr', 'arg_descrs', 'arg_types', 'return_descr',
1304
- 'return_type', 'exception_descrs']
1305
-
1306
- _method_descriptor = type(list.append)
1307
-
1308
- def _inherit_info(var_doc):
1309
- """
1310
- Copy any relevant documentation information from the variable that
1311
- C{var_doc} overrides into C{var_doc} itself.
1312
- """
1313
- src_var = var_doc.overrides
1314
- src_val = var_doc.overrides.value
1315
- val_doc = var_doc.value
1316
-
1317
- # Special case: if the source value and target values are both c
1318
- # extension methods, and the target value's signature is not
1319
- # specified, then inherit the source value's signature.
1320
- if (isinstance(val_doc, RoutineDoc) and
1321
- isinstance(src_val, RoutineDoc) and
1322
- (inspect.isbuiltin(val_doc.pyval) or
1323
- isinstance(val_doc.pyval, _method_descriptor)) and
1324
- (inspect.isbuiltin(src_val.pyval) or
1325
- isinstance(src_val.pyval, _method_descriptor)) and
1326
- val_doc.all_args() in (['...'], UNKNOWN) and
1327
- src_val.all_args() not in (['...'], UNKNOWN)):
1328
- for attrib in ['posargs', 'posarg_defaults', 'vararg',
1329
- 'kwarg', 'return_type']:
1330
- setattr(val_doc, attrib, getattr(src_val, attrib))
1331
-
1332
- # If the new variable has a docstring, then don't inherit
1333
- # anything, even if the docstring is blank.
1334
- if var_doc.docstring not in (None, UNKNOWN):
1335
- return
1336
- # [xx] Do I want a check like this:?
1337
- # # If it's a method and the signature doesn't match well enough,
1338
- # # then give up.
1339
- # if (isinstance(src_val, RoutineDoc) and
1340
- # isinstance(val_doc, RoutineDoc)):
1341
- # if (src_val.posargs != val_doc.posargs[:len(src_val.posargs)] or
1342
- # src_val.vararg != None and src_val.vararg != val_doc.vararg):
1343
- # log.docstring_warning(
1344
- # "The signature of %s does not match the signature of the "
1345
- # "method it overrides (%s); not inheriting documentation." %
1346
- # (var_doc.canonical_name, src_var.canonical_name))
1347
- # return
1348
-
1349
- # Inherit attributes!
1350
- for attrib in _INHERITED_ATTRIBS:
1351
- if (hasattr(var_doc, attrib) and hasattr(src_var, attrib) and
1352
- getattr(src_var, attrib) not in (None, UNKNOWN)):
1353
- setattr(var_doc, attrib, getattr(src_var, attrib))
1354
- elif (src_val is not None and
1355
- hasattr(val_doc, attrib) and hasattr(src_val, attrib) and
1356
- getattr(src_val, attrib) not in (None, UNKNOWN) and
1357
- getattr(val_doc, attrib) in (None, UNKNOWN, [])):
1358
- setattr(val_doc, attrib, getattr(src_val, attrib))