deg-yard 0.8.7.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 (558) hide show
  1. data/.travis.yml +39 -0
  2. data/.yardopts +25 -0
  3. data/.yardopts_guide +19 -0
  4. data/.yardopts_i18n +22 -0
  5. data/Gemfile +35 -0
  6. data/LEGAL +66 -0
  7. data/LICENSE +22 -0
  8. data/README.md +609 -0
  9. data/Rakefile +66 -0
  10. data/benchmarks/builtins_vs_eval.rb +23 -0
  11. data/benchmarks/concat_vs_join.rb +12 -0
  12. data/benchmarks/erb_vs_erubis.rb +53 -0
  13. data/benchmarks/format_args.rb +46 -0
  14. data/benchmarks/generation.rb +37 -0
  15. data/benchmarks/marshal_vs_dbm.rb +63 -0
  16. data/benchmarks/parsing.rb +46 -0
  17. data/benchmarks/pathname_vs_string.rb +50 -0
  18. data/benchmarks/rdoc_vs_yardoc.rb +10 -0
  19. data/benchmarks/registry_store_types.rb +48 -0
  20. data/benchmarks/ri_vs_yri.rb +18 -0
  21. data/benchmarks/ripper_parser.rb +12 -0
  22. data/benchmarks/splat_vs_flatten.rb +12 -0
  23. data/benchmarks/template_erb.rb +22 -0
  24. data/benchmarks/template_format.rb +6 -0
  25. data/benchmarks/template_profile.rb +17 -0
  26. data/benchmarks/yri_cache.rb +19 -0
  27. data/bin/yard +12 -0
  28. data/bin/yardoc +12 -0
  29. data/bin/yri +12 -0
  30. data/docs/CodeObjects.md +115 -0
  31. data/docs/GettingStarted.md +592 -0
  32. data/docs/Handlers.md +152 -0
  33. data/docs/Overview.md +61 -0
  34. data/docs/Parser.md +191 -0
  35. data/docs/Tags.md +282 -0
  36. data/docs/TagsArch.md +123 -0
  37. data/docs/Templates.md +496 -0
  38. data/docs/WhatsNew.md +1244 -0
  39. data/docs/images/code-objects-class-diagram.png +0 -0
  40. data/docs/images/handlers-class-diagram.png +0 -0
  41. data/docs/images/overview-class-diagram.png +0 -0
  42. data/docs/images/parser-class-diagram.png +0 -0
  43. data/docs/images/tags-class-diagram.png +0 -0
  44. data/docs/templates/default/fulldoc/html/full_list_tag.erb +7 -0
  45. data/docs/templates/default/fulldoc/html/setup.rb +6 -0
  46. data/docs/templates/default/layout/html/setup.rb +8 -0
  47. data/docs/templates/default/layout/html/tag_list.erb +11 -0
  48. data/docs/templates/default/yard_tags/html/list.erb +18 -0
  49. data/docs/templates/default/yard_tags/html/setup.rb +27 -0
  50. data/docs/templates/plugin.rb +65 -0
  51. data/lib/rubygems_plugin.rb +4 -0
  52. data/lib/yard/autoload.rb +290 -0
  53. data/lib/yard/cli/command.rb +84 -0
  54. data/lib/yard/cli/command_parser.rb +92 -0
  55. data/lib/yard/cli/config.rb +136 -0
  56. data/lib/yard/cli/diff.rb +270 -0
  57. data/lib/yard/cli/display.rb +68 -0
  58. data/lib/yard/cli/gems.rb +83 -0
  59. data/lib/yard/cli/graph.rb +126 -0
  60. data/lib/yard/cli/help.rb +18 -0
  61. data/lib/yard/cli/i18n.rb +69 -0
  62. data/lib/yard/cli/list.rb +22 -0
  63. data/lib/yard/cli/markup_types.rb +33 -0
  64. data/lib/yard/cli/server.rb +253 -0
  65. data/lib/yard/cli/stats.rb +213 -0
  66. data/lib/yard/cli/yardoc.rb +752 -0
  67. data/lib/yard/cli/yardopts_command.rb +109 -0
  68. data/lib/yard/cli/yri.rb +214 -0
  69. data/lib/yard/code_objects/base.rb +585 -0
  70. data/lib/yard/code_objects/class_object.rb +143 -0
  71. data/lib/yard/code_objects/class_variable_object.rb +8 -0
  72. data/lib/yard/code_objects/constant_object.rb +13 -0
  73. data/lib/yard/code_objects/extended_method_object.rb +23 -0
  74. data/lib/yard/code_objects/extra_file_object.rb +128 -0
  75. data/lib/yard/code_objects/macro_object.rb +172 -0
  76. data/lib/yard/code_objects/method_object.rb +191 -0
  77. data/lib/yard/code_objects/module_object.rb +18 -0
  78. data/lib/yard/code_objects/namespace_object.rb +200 -0
  79. data/lib/yard/code_objects/proxy.rb +258 -0
  80. data/lib/yard/code_objects/root_object.rb +17 -0
  81. data/lib/yard/config.rb +269 -0
  82. data/lib/yard/core_ext/array.rb +15 -0
  83. data/lib/yard/core_ext/file.rb +65 -0
  84. data/lib/yard/core_ext/hash.rb +15 -0
  85. data/lib/yard/core_ext/insertion.rb +60 -0
  86. data/lib/yard/core_ext/module.rb +19 -0
  87. data/lib/yard/core_ext/string.rb +67 -0
  88. data/lib/yard/core_ext/symbol_hash.rb +73 -0
  89. data/lib/yard/docstring.rb +362 -0
  90. data/lib/yard/docstring_parser.rb +321 -0
  91. data/lib/yard/globals.rb +18 -0
  92. data/lib/yard/handlers/base.rb +597 -0
  93. data/lib/yard/handlers/c/alias_handler.rb +15 -0
  94. data/lib/yard/handlers/c/attribute_handler.rb +13 -0
  95. data/lib/yard/handlers/c/base.rb +110 -0
  96. data/lib/yard/handlers/c/class_handler.rb +26 -0
  97. data/lib/yard/handlers/c/constant_handler.rb +12 -0
  98. data/lib/yard/handlers/c/handler_methods.rb +166 -0
  99. data/lib/yard/handlers/c/init_handler.rb +18 -0
  100. data/lib/yard/handlers/c/method_handler.rb +35 -0
  101. data/lib/yard/handlers/c/mixin_handler.rb +13 -0
  102. data/lib/yard/handlers/c/module_handler.rb +16 -0
  103. data/lib/yard/handlers/c/override_comment_handler.rb +30 -0
  104. data/lib/yard/handlers/c/path_handler.rb +10 -0
  105. data/lib/yard/handlers/c/struct_handler.rb +12 -0
  106. data/lib/yard/handlers/c/symbol_handler.rb +7 -0
  107. data/lib/yard/handlers/processor.rb +201 -0
  108. data/lib/yard/handlers/ruby/alias_handler.rb +41 -0
  109. data/lib/yard/handlers/ruby/attribute_handler.rb +82 -0
  110. data/lib/yard/handlers/ruby/base.rb +164 -0
  111. data/lib/yard/handlers/ruby/class_condition_handler.rb +86 -0
  112. data/lib/yard/handlers/ruby/class_handler.rb +121 -0
  113. data/lib/yard/handlers/ruby/class_variable_handler.rb +16 -0
  114. data/lib/yard/handlers/ruby/comment_handler.rb +9 -0
  115. data/lib/yard/handlers/ruby/constant_handler.rb +45 -0
  116. data/lib/yard/handlers/ruby/dsl_handler.rb +14 -0
  117. data/lib/yard/handlers/ruby/dsl_handler_methods.rb +77 -0
  118. data/lib/yard/handlers/ruby/exception_handler.rb +26 -0
  119. data/lib/yard/handlers/ruby/extend_handler.rb +21 -0
  120. data/lib/yard/handlers/ruby/legacy/alias_handler.rb +34 -0
  121. data/lib/yard/handlers/ruby/legacy/attribute_handler.rb +60 -0
  122. data/lib/yard/handlers/ruby/legacy/base.rb +250 -0
  123. data/lib/yard/handlers/ruby/legacy/class_condition_handler.rb +83 -0
  124. data/lib/yard/handlers/ruby/legacy/class_handler.rb +111 -0
  125. data/lib/yard/handlers/ruby/legacy/class_variable_handler.rb +14 -0
  126. data/lib/yard/handlers/ruby/legacy/comment_handler.rb +9 -0
  127. data/lib/yard/handlers/ruby/legacy/constant_handler.rb +28 -0
  128. data/lib/yard/handlers/ruby/legacy/dsl_handler.rb +16 -0
  129. data/lib/yard/handlers/ruby/legacy/exception_handler.rb +12 -0
  130. data/lib/yard/handlers/ruby/legacy/extend_handler.rb +20 -0
  131. data/lib/yard/handlers/ruby/legacy/method_handler.rb +85 -0
  132. data/lib/yard/handlers/ruby/legacy/mixin_handler.rb +39 -0
  133. data/lib/yard/handlers/ruby/legacy/module_function_handler.rb +18 -0
  134. data/lib/yard/handlers/ruby/legacy/module_handler.rb +11 -0
  135. data/lib/yard/handlers/ruby/legacy/private_constant_handler.rb +21 -0
  136. data/lib/yard/handlers/ruby/legacy/visibility_handler.rb +16 -0
  137. data/lib/yard/handlers/ruby/legacy/yield_handler.rb +28 -0
  138. data/lib/yard/handlers/ruby/method_condition_handler.rb +8 -0
  139. data/lib/yard/handlers/ruby/method_handler.rb +92 -0
  140. data/lib/yard/handlers/ruby/mixin_handler.rb +36 -0
  141. data/lib/yard/handlers/ruby/module_function_handler.rb +26 -0
  142. data/lib/yard/handlers/ruby/module_handler.rb +11 -0
  143. data/lib/yard/handlers/ruby/private_constant_handler.rb +36 -0
  144. data/lib/yard/handlers/ruby/struct_handler_methods.rb +141 -0
  145. data/lib/yard/handlers/ruby/visibility_handler.rb +24 -0
  146. data/lib/yard/handlers/ruby/yield_handler.rb +30 -0
  147. data/lib/yard/i18n/locale.rb +74 -0
  148. data/lib/yard/i18n/message.rb +56 -0
  149. data/lib/yard/i18n/messages.rb +55 -0
  150. data/lib/yard/i18n/pot_generator.rb +280 -0
  151. data/lib/yard/i18n/text.rb +173 -0
  152. data/lib/yard/logging.rb +190 -0
  153. data/lib/yard/options.rb +216 -0
  154. data/lib/yard/parser/base.rb +56 -0
  155. data/lib/yard/parser/c/c_parser.rb +231 -0
  156. data/lib/yard/parser/c/comment_parser.rb +131 -0
  157. data/lib/yard/parser/c/statement.rb +63 -0
  158. data/lib/yard/parser/ruby/ast_node.rb +496 -0
  159. data/lib/yard/parser/ruby/legacy/ruby_lex.rb +1378 -0
  160. data/lib/yard/parser/ruby/legacy/ruby_parser.rb +31 -0
  161. data/lib/yard/parser/ruby/legacy/statement.rb +65 -0
  162. data/lib/yard/parser/ruby/legacy/statement_list.rb +384 -0
  163. data/lib/yard/parser/ruby/legacy/token_list.rb +71 -0
  164. data/lib/yard/parser/ruby/ruby_parser.rb +625 -0
  165. data/lib/yard/parser/source_parser.rb +517 -0
  166. data/lib/yard/rake/yardoc_task.rb +74 -0
  167. data/lib/yard/registry.rb +438 -0
  168. data/lib/yard/registry_store.rb +319 -0
  169. data/lib/yard/rubygems/backports/LICENSE.txt +57 -0
  170. data/lib/yard/rubygems/backports/MIT.txt +20 -0
  171. data/lib/yard/rubygems/backports/gem.rb +9 -0
  172. data/lib/yard/rubygems/backports/source_index.rb +370 -0
  173. data/lib/yard/rubygems/backports.rb +8 -0
  174. data/lib/yard/rubygems/doc_manager.rb +88 -0
  175. data/lib/yard/rubygems/specification.rb +41 -0
  176. data/lib/yard/serializers/base.rb +80 -0
  177. data/lib/yard/serializers/file_system_serializer.rb +90 -0
  178. data/lib/yard/serializers/process_serializer.rb +24 -0
  179. data/lib/yard/serializers/stdout_serializer.rb +32 -0
  180. data/lib/yard/serializers/yardoc_serializer.rb +124 -0
  181. data/lib/yard/server/adapter.rb +100 -0
  182. data/lib/yard/server/commands/base.rb +192 -0
  183. data/lib/yard/server/commands/display_file_command.rb +24 -0
  184. data/lib/yard/server/commands/display_object_command.rb +58 -0
  185. data/lib/yard/server/commands/frames_command.rb +15 -0
  186. data/lib/yard/server/commands/library_command.rb +148 -0
  187. data/lib/yard/server/commands/library_index_command.rb +24 -0
  188. data/lib/yard/server/commands/list_command.rb +24 -0
  189. data/lib/yard/server/commands/search_command.rb +78 -0
  190. data/lib/yard/server/commands/static_file_command.rb +57 -0
  191. data/lib/yard/server/doc_server_helper.rb +76 -0
  192. data/lib/yard/server/doc_server_serializer.rb +33 -0
  193. data/lib/yard/server/library_version.rb +227 -0
  194. data/lib/yard/server/rack_adapter.rb +88 -0
  195. data/lib/yard/server/router.rb +176 -0
  196. data/lib/yard/server/static_caching.rb +45 -0
  197. data/lib/yard/server/templates/default/fulldoc/html/css/custom.css +78 -0
  198. data/lib/yard/server/templates/default/fulldoc/html/images/processing.gif +0 -0
  199. data/lib/yard/server/templates/default/fulldoc/html/js/autocomplete.js +12 -0
  200. data/lib/yard/server/templates/default/layout/html/breadcrumb.erb +46 -0
  201. data/lib/yard/server/templates/default/layout/html/script_setup.erb +8 -0
  202. data/lib/yard/server/templates/default/layout/html/setup.rb +7 -0
  203. data/lib/yard/server/templates/default/method_details/html/permalink.erb +4 -0
  204. data/lib/yard/server/templates/default/method_details/html/setup.rb +4 -0
  205. data/lib/yard/server/templates/doc_server/library_list/html/contents.erb +13 -0
  206. data/lib/yard/server/templates/doc_server/library_list/html/headers.erb +26 -0
  207. data/lib/yard/server/templates/doc_server/library_list/html/library_list.erb +12 -0
  208. data/lib/yard/server/templates/doc_server/library_list/html/setup.rb +3 -0
  209. data/lib/yard/server/templates/doc_server/library_list/html/title.erb +2 -0
  210. data/lib/yard/server/templates/doc_server/processing/html/processing.erb +51 -0
  211. data/lib/yard/server/templates/doc_server/processing/html/setup.rb +3 -0
  212. data/lib/yard/server/templates/doc_server/search/html/search.erb +18 -0
  213. data/lib/yard/server/templates/doc_server/search/html/setup.rb +8 -0
  214. data/lib/yard/server/webrick_adapter.rb +43 -0
  215. data/lib/yard/server.rb +11 -0
  216. data/lib/yard/tags/default_factory.rb +176 -0
  217. data/lib/yard/tags/default_tag.rb +12 -0
  218. data/lib/yard/tags/directives.rb +599 -0
  219. data/lib/yard/tags/library.rb +630 -0
  220. data/lib/yard/tags/option_tag.rb +12 -0
  221. data/lib/yard/tags/overload_tag.rb +66 -0
  222. data/lib/yard/tags/ref_tag.rb +7 -0
  223. data/lib/yard/tags/ref_tag_list.rb +27 -0
  224. data/lib/yard/tags/tag.rb +57 -0
  225. data/lib/yard/tags/tag_format_error.rb +6 -0
  226. data/lib/yard/templates/engine.rb +185 -0
  227. data/lib/yard/templates/erb_cache.rb +22 -0
  228. data/lib/yard/templates/helpers/base_helper.rb +212 -0
  229. data/lib/yard/templates/helpers/filter_helper.rb +26 -0
  230. data/lib/yard/templates/helpers/html_helper.rb +599 -0
  231. data/lib/yard/templates/helpers/html_syntax_highlight_helper.rb +59 -0
  232. data/lib/yard/templates/helpers/markup/rdoc_markdown.rb +22 -0
  233. data/lib/yard/templates/helpers/markup/rdoc_markup.rb +106 -0
  234. data/lib/yard/templates/helpers/markup_helper.rb +169 -0
  235. data/lib/yard/templates/helpers/method_helper.rb +74 -0
  236. data/lib/yard/templates/helpers/module_helper.rb +19 -0
  237. data/lib/yard/templates/helpers/text_helper.rb +95 -0
  238. data/lib/yard/templates/helpers/uml_helper.rb +46 -0
  239. data/lib/yard/templates/section.rb +106 -0
  240. data/lib/yard/templates/template.rb +407 -0
  241. data/lib/yard/templates/template_options.rb +88 -0
  242. data/lib/yard/verifier.rb +148 -0
  243. data/lib/yard/version.rb +3 -0
  244. data/lib/yard.rb +71 -0
  245. data/po/ja.po +31118 -0
  246. data/spec/cli/command_parser_spec.rb +43 -0
  247. data/spec/cli/command_spec.rb +36 -0
  248. data/spec/cli/config_spec.rb +92 -0
  249. data/spec/cli/diff_spec.rb +260 -0
  250. data/spec/cli/display_spec.rb +30 -0
  251. data/spec/cli/gems_spec.rb +81 -0
  252. data/spec/cli/graph_spec.rb +17 -0
  253. data/spec/cli/help_spec.rb +22 -0
  254. data/spec/cli/i18n_spec.rb +111 -0
  255. data/spec/cli/list_spec.rb +8 -0
  256. data/spec/cli/markup_types_spec.rb +22 -0
  257. data/spec/cli/server_spec.rb +327 -0
  258. data/spec/cli/stats_spec.rb +90 -0
  259. data/spec/cli/yardoc_spec.rb +804 -0
  260. data/spec/cli/yri_spec.rb +99 -0
  261. data/spec/code_objects/base_spec.rb +438 -0
  262. data/spec/code_objects/class_object_spec.rb +225 -0
  263. data/spec/code_objects/code_object_list_spec.rb +33 -0
  264. data/spec/code_objects/constants_spec.rb +82 -0
  265. data/spec/code_objects/extra_file_object_spec.rb +147 -0
  266. data/spec/code_objects/macro_object_spec.rb +148 -0
  267. data/spec/code_objects/method_object_spec.rb +175 -0
  268. data/spec/code_objects/module_object_spec.rb +141 -0
  269. data/spec/code_objects/namespace_object_spec.rb +170 -0
  270. data/spec/code_objects/proxy_spec.rb +140 -0
  271. data/spec/code_objects/spec_helper.rb +3 -0
  272. data/spec/config_spec.rb +176 -0
  273. data/spec/core_ext/array_spec.rb +14 -0
  274. data/spec/core_ext/file_spec.rb +68 -0
  275. data/spec/core_ext/hash_spec.rb +14 -0
  276. data/spec/core_ext/insertion_spec.rb +37 -0
  277. data/spec/core_ext/module_spec.rb +15 -0
  278. data/spec/core_ext/string_spec.rb +42 -0
  279. data/spec/core_ext/symbol_hash_spec.rb +86 -0
  280. data/spec/docstring_parser_spec.rb +228 -0
  281. data/spec/docstring_spec.rb +335 -0
  282. data/spec/handlers/alias_handler_spec.rb +80 -0
  283. data/spec/handlers/attribute_handler_spec.rb +94 -0
  284. data/spec/handlers/base_spec.rb +206 -0
  285. data/spec/handlers/c/alias_handler_spec.rb +33 -0
  286. data/spec/handlers/c/attribute_handler_spec.rb +40 -0
  287. data/spec/handlers/c/class_handler_spec.rb +63 -0
  288. data/spec/handlers/c/constant_handler_spec.rb +68 -0
  289. data/spec/handlers/c/init_handler_spec.rb +47 -0
  290. data/spec/handlers/c/method_handler_spec.rb +229 -0
  291. data/spec/handlers/c/mixin_handler_spec.rb +27 -0
  292. data/spec/handlers/c/module_handler_spec.rb +38 -0
  293. data/spec/handlers/c/override_comment_handler_spec.rb +46 -0
  294. data/spec/handlers/c/path_handler_spec.rb +35 -0
  295. data/spec/handlers/c/spec_helper.rb +13 -0
  296. data/spec/handlers/c/struct_handler_spec.rb +15 -0
  297. data/spec/handlers/class_condition_handler_spec.rb +67 -0
  298. data/spec/handlers/class_handler_spec.rb +246 -0
  299. data/spec/handlers/class_variable_handler_spec.rb +11 -0
  300. data/spec/handlers/constant_handler_spec.rb +64 -0
  301. data/spec/handlers/dsl_handler_spec.rb +197 -0
  302. data/spec/handlers/examples/alias_handler_001.rb.txt +44 -0
  303. data/spec/handlers/examples/attribute_handler_001.rb.txt +32 -0
  304. data/spec/handlers/examples/class_condition_handler_001.rb.txt +69 -0
  305. data/spec/handlers/examples/class_handler_001.rb.txt +120 -0
  306. data/spec/handlers/examples/class_variable_handler_001.rb.txt +10 -0
  307. data/spec/handlers/examples/constant_handler_001.rb.txt +25 -0
  308. data/spec/handlers/examples/dsl_handler_001.rb.txt +125 -0
  309. data/spec/handlers/examples/exception_handler_001.rb.txt +59 -0
  310. data/spec/handlers/examples/extend_handler_001.rb.txt +16 -0
  311. data/spec/handlers/examples/method_condition_handler_001.rb.txt +10 -0
  312. data/spec/handlers/examples/method_handler_001.rb.txt +126 -0
  313. data/spec/handlers/examples/mixin_handler_001.rb.txt +37 -0
  314. data/spec/handlers/examples/module_handler_001.rb.txt +29 -0
  315. data/spec/handlers/examples/private_constant_handler_001.rb.txt +8 -0
  316. data/spec/handlers/examples/process_handler_001.rb.txt +11 -0
  317. data/spec/handlers/examples/visibility_handler_001.rb.txt +32 -0
  318. data/spec/handlers/examples/yield_handler_001.rb.txt +54 -0
  319. data/spec/handlers/exception_handler_spec.rb +48 -0
  320. data/spec/handlers/extend_handler_spec.rb +23 -0
  321. data/spec/handlers/legacy_base_spec.rb +128 -0
  322. data/spec/handlers/method_condition_handler_spec.rb +14 -0
  323. data/spec/handlers/method_handler_spec.rb +184 -0
  324. data/spec/handlers/mixin_handler_spec.rb +55 -0
  325. data/spec/handlers/module_function_handler_spec.rb +105 -0
  326. data/spec/handlers/module_handler_spec.rb +34 -0
  327. data/spec/handlers/private_constant_handler_spec.rb +24 -0
  328. data/spec/handlers/processor_spec.rb +34 -0
  329. data/spec/handlers/ruby/base_spec.rb +94 -0
  330. data/spec/handlers/ruby/legacy/base_spec.rb +82 -0
  331. data/spec/handlers/spec_helper.rb +33 -0
  332. data/spec/handlers/visibility_handler_spec.rb +39 -0
  333. data/spec/handlers/yield_handler_spec.rb +51 -0
  334. data/spec/i18n/locale_spec.rb +68 -0
  335. data/spec/i18n/message_spec.rb +52 -0
  336. data/spec/i18n/messages_spec.rb +67 -0
  337. data/spec/i18n/pot_generator_spec.rb +262 -0
  338. data/spec/i18n/text_spec.rb +180 -0
  339. data/spec/logging_spec.rb +35 -0
  340. data/spec/options_spec.rb +171 -0
  341. data/spec/parser/base_spec.rb +24 -0
  342. data/spec/parser/c_parser_spec.rb +171 -0
  343. data/spec/parser/examples/array.c.txt +3887 -0
  344. data/spec/parser/examples/example1.rb.txt +8 -0
  345. data/spec/parser/examples/extrafile.c.txt +8 -0
  346. data/spec/parser/examples/multifile.c.txt +22 -0
  347. data/spec/parser/examples/override.c.txt +424 -0
  348. data/spec/parser/examples/parse_in_order_001.rb.txt +2 -0
  349. data/spec/parser/examples/parse_in_order_002.rb.txt +2 -0
  350. data/spec/parser/examples/tag_handler_001.rb.txt +8 -0
  351. data/spec/parser/ruby/ast_node_spec.rb +33 -0
  352. data/spec/parser/ruby/legacy/statement_list_spec.rb +299 -0
  353. data/spec/parser/ruby/legacy/token_list_spec.rb +77 -0
  354. data/spec/parser/ruby/ruby_parser_spec.rb +334 -0
  355. data/spec/parser/source_parser_spec.rb +717 -0
  356. data/spec/parser/tag_parsing_spec.rb +18 -0
  357. data/spec/rake/yardoc_task_spec.rb +101 -0
  358. data/spec/registry_spec.rb +393 -0
  359. data/spec/registry_store_spec.rb +315 -0
  360. data/spec/rubygems/doc_manager_spec.rb +112 -0
  361. data/spec/serializers/data/serialized_yardoc/checksums +1 -0
  362. data/spec/serializers/data/serialized_yardoc/objects/Foo/bar_i.dat +0 -0
  363. data/spec/serializers/data/serialized_yardoc/objects/Foo/baz_i.dat +0 -0
  364. data/spec/serializers/data/serialized_yardoc/objects/Foo.dat +0 -0
  365. data/spec/serializers/data/serialized_yardoc/objects/root.dat +0 -0
  366. data/spec/serializers/data/serialized_yardoc/proxy_types +2 -0
  367. data/spec/serializers/file_system_serializer_spec.rb +124 -0
  368. data/spec/serializers/spec_helper.rb +2 -0
  369. data/spec/serializers/yardoc_serializer_spec.rb +46 -0
  370. data/spec/server/adapter_spec.rb +38 -0
  371. data/spec/server/commands/base_spec.rb +87 -0
  372. data/spec/server/commands/library_command_spec.rb +39 -0
  373. data/spec/server/commands/static_file_command_spec.rb +84 -0
  374. data/spec/server/doc_server_helper_spec.rb +53 -0
  375. data/spec/server/doc_server_serializer_spec.rb +45 -0
  376. data/spec/server/rack_adapter_spec.rb +20 -0
  377. data/spec/server/router_spec.rb +122 -0
  378. data/spec/server/spec_helper.rb +17 -0
  379. data/spec/server/static_caching_spec.rb +39 -0
  380. data/spec/server/webrick_servlet_spec.rb +20 -0
  381. data/spec/server_spec.rb +10 -0
  382. data/spec/spec_helper.rb +128 -0
  383. data/spec/tags/default_factory_spec.rb +152 -0
  384. data/spec/tags/default_tag_spec.rb +11 -0
  385. data/spec/tags/directives_spec.rb +453 -0
  386. data/spec/tags/library_spec.rb +34 -0
  387. data/spec/tags/overload_tag_spec.rb +53 -0
  388. data/spec/tags/ref_tag_list_spec.rb +53 -0
  389. data/spec/templates/class_spec.rb +44 -0
  390. data/spec/templates/constant_spec.rb +40 -0
  391. data/spec/templates/engine_spec.rb +121 -0
  392. data/spec/templates/examples/class001.html +280 -0
  393. data/spec/templates/examples/class001.txt +36 -0
  394. data/spec/templates/examples/class002.html +35 -0
  395. data/spec/templates/examples/constant001.txt +25 -0
  396. data/spec/templates/examples/constant002.txt +7 -0
  397. data/spec/templates/examples/constant003.txt +11 -0
  398. data/spec/templates/examples/method001.html +130 -0
  399. data/spec/templates/examples/method001.txt +35 -0
  400. data/spec/templates/examples/method002.html +86 -0
  401. data/spec/templates/examples/method002.txt +20 -0
  402. data/spec/templates/examples/method003.html +159 -0
  403. data/spec/templates/examples/method003.txt +45 -0
  404. data/spec/templates/examples/method004.html +44 -0
  405. data/spec/templates/examples/method004.txt +10 -0
  406. data/spec/templates/examples/method005.html +99 -0
  407. data/spec/templates/examples/method005.txt +33 -0
  408. data/spec/templates/examples/module001.dot +33 -0
  409. data/spec/templates/examples/module001.html +825 -0
  410. data/spec/templates/examples/module001.txt +33 -0
  411. data/spec/templates/examples/module002.html +318 -0
  412. data/spec/templates/examples/module003.html +185 -0
  413. data/spec/templates/examples/module004.html +387 -0
  414. data/spec/templates/examples/tag001.txt +82 -0
  415. data/spec/templates/helpers/base_helper_spec.rb +175 -0
  416. data/spec/templates/helpers/html_helper_spec.rb +612 -0
  417. data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +48 -0
  418. data/spec/templates/helpers/markup/rdoc_markup_spec.rb +93 -0
  419. data/spec/templates/helpers/markup_helper_spec.rb +135 -0
  420. data/spec/templates/helpers/method_helper_spec.rb +82 -0
  421. data/spec/templates/helpers/shared_signature_examples.rb +123 -0
  422. data/spec/templates/helpers/text_helper_spec.rb +44 -0
  423. data/spec/templates/method_spec.rb +102 -0
  424. data/spec/templates/module_spec.rb +181 -0
  425. data/spec/templates/onefile_spec.rb +64 -0
  426. data/spec/templates/section_spec.rb +146 -0
  427. data/spec/templates/spec_helper.rb +73 -0
  428. data/spec/templates/tag_spec.rb +51 -0
  429. data/spec/templates/template_spec.rb +409 -0
  430. data/spec/verifier_spec.rb +106 -0
  431. data/templates/default/class/dot/setup.rb +6 -0
  432. data/templates/default/class/dot/superklass.erb +3 -0
  433. data/templates/default/class/html/constructor_details.erb +8 -0
  434. data/templates/default/class/html/setup.rb +1 -0
  435. data/templates/default/class/html/subclasses.erb +4 -0
  436. data/templates/default/class/setup.rb +36 -0
  437. data/templates/default/class/text/setup.rb +11 -0
  438. data/templates/default/class/text/subclasses.erb +5 -0
  439. data/templates/default/constant/text/header.erb +11 -0
  440. data/templates/default/constant/text/setup.rb +3 -0
  441. data/templates/default/docstring/html/abstract.erb +4 -0
  442. data/templates/default/docstring/html/deprecated.erb +1 -0
  443. data/templates/default/docstring/html/index.erb +5 -0
  444. data/templates/default/docstring/html/note.erb +6 -0
  445. data/templates/default/docstring/html/private.erb +4 -0
  446. data/templates/default/docstring/html/returns_void.erb +1 -0
  447. data/templates/default/docstring/html/text.erb +1 -0
  448. data/templates/default/docstring/html/todo.erb +6 -0
  449. data/templates/default/docstring/setup.rb +51 -0
  450. data/templates/default/docstring/text/abstract.erb +2 -0
  451. data/templates/default/docstring/text/deprecated.erb +2 -0
  452. data/templates/default/docstring/text/index.erb +2 -0
  453. data/templates/default/docstring/text/note.erb +4 -0
  454. data/templates/default/docstring/text/private.erb +2 -0
  455. data/templates/default/docstring/text/returns_void.erb +1 -0
  456. data/templates/default/docstring/text/text.erb +1 -0
  457. data/templates/default/docstring/text/todo.erb +4 -0
  458. data/templates/default/fulldoc/html/css/common.css +1 -0
  459. data/templates/default/fulldoc/html/css/full_list.css +57 -0
  460. data/templates/default/fulldoc/html/css/style.css +338 -0
  461. data/templates/default/fulldoc/html/frames.erb +28 -0
  462. data/templates/default/fulldoc/html/full_list.erb +40 -0
  463. data/templates/default/fulldoc/html/full_list_class.erb +2 -0
  464. data/templates/default/fulldoc/html/full_list_file.erb +5 -0
  465. data/templates/default/fulldoc/html/full_list_method.erb +8 -0
  466. data/templates/default/fulldoc/html/js/app.js +214 -0
  467. data/templates/default/fulldoc/html/js/full_list.js +178 -0
  468. data/templates/default/fulldoc/html/js/jquery.js +4 -0
  469. data/templates/default/fulldoc/html/setup.rb +199 -0
  470. data/templates/default/layout/dot/header.erb +6 -0
  471. data/templates/default/layout/dot/setup.rb +14 -0
  472. data/templates/default/layout/html/breadcrumb.erb +13 -0
  473. data/templates/default/layout/html/files.erb +11 -0
  474. data/templates/default/layout/html/footer.erb +5 -0
  475. data/templates/default/layout/html/headers.erb +14 -0
  476. data/templates/default/layout/html/index.erb +2 -0
  477. data/templates/default/layout/html/layout.erb +20 -0
  478. data/templates/default/layout/html/listing.erb +4 -0
  479. data/templates/default/layout/html/objects.erb +32 -0
  480. data/templates/default/layout/html/script_setup.erb +5 -0
  481. data/templates/default/layout/html/search.erb +8 -0
  482. data/templates/default/layout/html/setup.rb +71 -0
  483. data/templates/default/method/html/header.erb +16 -0
  484. data/templates/default/method/setup.rb +3 -0
  485. data/templates/default/method/text/header.erb +1 -0
  486. data/templates/default/method_details/html/header.erb +3 -0
  487. data/templates/default/method_details/html/method_signature.erb +25 -0
  488. data/templates/default/method_details/html/source.erb +10 -0
  489. data/templates/default/method_details/setup.rb +10 -0
  490. data/templates/default/method_details/text/header.erb +10 -0
  491. data/templates/default/method_details/text/method_signature.erb +12 -0
  492. data/templates/default/method_details/text/setup.rb +10 -0
  493. data/templates/default/module/dot/child.erb +1 -0
  494. data/templates/default/module/dot/dependencies.erb +3 -0
  495. data/templates/default/module/dot/header.erb +6 -0
  496. data/templates/default/module/dot/info.erb +14 -0
  497. data/templates/default/module/dot/setup.rb +14 -0
  498. data/templates/default/module/html/attribute_details.erb +10 -0
  499. data/templates/default/module/html/attribute_summary.erb +8 -0
  500. data/templates/default/module/html/box_info.erb +37 -0
  501. data/templates/default/module/html/children.erb +8 -0
  502. data/templates/default/module/html/constant_summary.erb +13 -0
  503. data/templates/default/module/html/defines.erb +3 -0
  504. data/templates/default/module/html/header.erb +5 -0
  505. data/templates/default/module/html/inherited_attributes.erb +14 -0
  506. data/templates/default/module/html/inherited_constants.erb +8 -0
  507. data/templates/default/module/html/inherited_methods.erb +19 -0
  508. data/templates/default/module/html/item_summary.erb +40 -0
  509. data/templates/default/module/html/method_details_list.erb +9 -0
  510. data/templates/default/module/html/method_summary.erb +14 -0
  511. data/templates/default/module/html/methodmissing.erb +12 -0
  512. data/templates/default/module/html/pre_docstring.erb +1 -0
  513. data/templates/default/module/setup.rb +164 -0
  514. data/templates/default/module/text/children.erb +10 -0
  515. data/templates/default/module/text/class_meths_list.erb +8 -0
  516. data/templates/default/module/text/extends.erb +8 -0
  517. data/templates/default/module/text/header.erb +7 -0
  518. data/templates/default/module/text/includes.erb +8 -0
  519. data/templates/default/module/text/instance_meths_list.erb +8 -0
  520. data/templates/default/module/text/setup.rb +12 -0
  521. data/templates/default/onefile/html/files.erb +5 -0
  522. data/templates/default/onefile/html/headers.erb +6 -0
  523. data/templates/default/onefile/html/layout.erb +17 -0
  524. data/templates/default/onefile/html/readme.erb +3 -0
  525. data/templates/default/onefile/html/setup.rb +61 -0
  526. data/templates/default/root/dot/child.erb +3 -0
  527. data/templates/default/root/dot/setup.rb +5 -0
  528. data/templates/default/root/html/setup.rb +1 -0
  529. data/templates/default/tags/html/example.erb +11 -0
  530. data/templates/default/tags/html/index.erb +3 -0
  531. data/templates/default/tags/html/option.erb +24 -0
  532. data/templates/default/tags/html/overload.erb +14 -0
  533. data/templates/default/tags/html/see.erb +8 -0
  534. data/templates/default/tags/html/tag.erb +20 -0
  535. data/templates/default/tags/setup.rb +55 -0
  536. data/templates/default/tags/text/example.erb +12 -0
  537. data/templates/default/tags/text/index.erb +1 -0
  538. data/templates/default/tags/text/option.erb +20 -0
  539. data/templates/default/tags/text/overload.erb +19 -0
  540. data/templates/default/tags/text/see.erb +11 -0
  541. data/templates/default/tags/text/tag.erb +13 -0
  542. data/templates/guide/class/html/setup.rb +1 -0
  543. data/templates/guide/docstring/html/setup.rb +1 -0
  544. data/templates/guide/fulldoc/html/css/style.css +108 -0
  545. data/templates/guide/fulldoc/html/js/app.js +33 -0
  546. data/templates/guide/fulldoc/html/setup.rb +73 -0
  547. data/templates/guide/layout/html/layout.erb +81 -0
  548. data/templates/guide/layout/html/setup.rb +28 -0
  549. data/templates/guide/method/html/header.erb +18 -0
  550. data/templates/guide/method/html/setup.rb +21 -0
  551. data/templates/guide/module/html/header.erb +7 -0
  552. data/templates/guide/module/html/method_list.erb +5 -0
  553. data/templates/guide/module/html/setup.rb +26 -0
  554. data/templates/guide/onefile/html/files.erb +4 -0
  555. data/templates/guide/onefile/html/setup.rb +5 -0
  556. data/templates/guide/onefile/html/toc.erb +3 -0
  557. data/templates/guide/tags/html/setup.rb +8 -0
  558. metadata +689 -0
@@ -0,0 +1,517 @@
1
+ require 'stringio'
2
+ require 'ostruct'
3
+
4
+ module YARD
5
+ module Parser
6
+ # Raised when an object is recognized but cannot be documented. This
7
+ # generally occurs when the Ruby syntax used to declare an object is
8
+ # too dynamic in nature.
9
+ class UndocumentableError < Exception; end
10
+
11
+ # Raised when the parser sees a Ruby syntax error
12
+ class ParserSyntaxError < UndocumentableError; end
13
+
14
+ # Responsible for parsing a list of files in order. The
15
+ # {#parse} method of this class can be called from the
16
+ # {SourceParser#globals} globals state list to re-enter
17
+ # parsing for the remainder of files in the list recursively.
18
+ #
19
+ # @see Processor#parse_remaining_files
20
+ class OrderedParser
21
+ # @return [Array<String>] the list of remaining files to parse
22
+ attr_accessor :files
23
+
24
+ # Creates a new OrderedParser with the global state and a list
25
+ # of files to parse.
26
+ #
27
+ # @note OrderedParser sets itself as the +ordered_parser+ key on
28
+ # global_state for later use in {Handlers::Processor}.
29
+ # @param [OpenStruct] global_state a structure containing all global
30
+ # state during parsing
31
+ # @param [Array<String>] files the list of files to parse
32
+ def initialize(global_state, files)
33
+ @global_state = global_state
34
+ @files = files.dup
35
+ @global_state.ordered_parser = self
36
+ end
37
+
38
+ # Parses the remainder of the {#files} list.
39
+ #
40
+ # @see Processor#parse_remaining_files
41
+ def parse
42
+ while file = files.shift
43
+ log.capture("Parsing #{file}") do
44
+ SourceParser.new(SourceParser.parser_type, @global_state).parse(file)
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ # Responsible for parsing a source file into the namespace. Parsing
51
+ # also invokes handlers to process the parsed statements and generate
52
+ # any code objects that may be recognized.
53
+ #
54
+ # == Custom Parsers
55
+ # SourceParser allows custom parsers to be registered and called when
56
+ # a certain filetype is recognized. To register a parser and hook it
57
+ # up to a set of file extensions, call {register_parser_type}
58
+ #
59
+ # @see register_parser_type
60
+ # @see Handlers::Base
61
+ # @see CodeObjects::Base
62
+ class SourceParser
63
+ SHEBANG_LINE = /\A\s*#!\S+/
64
+ ENCODING_LINE = /\A(?:\s*#*!.*\r?\n)?\s*(?:#+|\/\*+|\/\/+).*coding\s*[:=]{1,2}\s*([a-z\d_\-]+)/i
65
+
66
+ # Byte order marks for various encodings
67
+ # @since 0.7.0
68
+ ENCODING_BYTE_ORDER_MARKS = {
69
+ 'utf-8' => "\xEF\xBB\xBF",
70
+ # Not yet supported
71
+ #'utf-16be' => "\xFE\xFF",
72
+ #'utf-16le' => "\xFF\xFE",
73
+ #'utf-32be' => "\x00\x00\xFF\xFE",
74
+ #'utf-32le' => "\xFF\xFE",
75
+ }
76
+
77
+ class << self
78
+ # @return [Symbol] the default parser type (defaults to :ruby)
79
+ attr_reader :parser_type
80
+
81
+ def parser_type=(value)
82
+ @parser_type = validated_parser_type(value)
83
+ end
84
+
85
+ # Parses a path or set of paths
86
+ #
87
+ # @param [String, Array<String>] paths a path, glob, or list of paths to
88
+ # parse
89
+ # @param [Array<String, Regexp>] excluded a list of excluded path matchers
90
+ # @param [Fixnum] level the logger level to use during parsing. See
91
+ # {YARD::Logger}
92
+ # @return [void]
93
+ def parse(paths = ["{lib,app}/**/*.rb", "ext/**/*.c"], excluded = [], level = log.level)
94
+ log.debug("Parsing #{paths.inspect} with `#{parser_type}` parser")
95
+ excluded = excluded.map do |path|
96
+ case path
97
+ when Regexp; path
98
+ else Regexp.new(path.to_s, Regexp::IGNORECASE)
99
+ end
100
+ end
101
+ files = [paths].flatten.
102
+ map {|p| File.directory?(p) ? "#{p}/**/*.{rb,c}" : p }.
103
+ map {|p| p.include?("*") ? Dir[p].sort_by {|f| f.length } : p }.flatten.
104
+ reject {|p| !File.file?(p) || excluded.any? {|re| p =~ re } }
105
+
106
+ log.enter_level(level) do
107
+ parse_in_order(*files.uniq)
108
+ end
109
+ end
110
+
111
+ # Parses a string +content+
112
+ #
113
+ # @param [String] content the block of code to parse
114
+ # @param [Symbol] ptype the parser type to use. See {parser_type}.
115
+ # @return the parser object that was used to parse +content+
116
+ def parse_string(content, ptype = parser_type)
117
+ new(ptype).parse(StringIO.new(content))
118
+ end
119
+
120
+ # Tokenizes but does not parse the block of code
121
+ #
122
+ # @param [String] content the block of code to tokenize
123
+ # @param [Symbol] ptype the parser type to use. See {parser_type}.
124
+ # @return [Array] a list of tokens
125
+ def tokenize(content, ptype = parser_type)
126
+ new(ptype).tokenize(content)
127
+ end
128
+
129
+ # Registers a new parser type.
130
+ #
131
+ # @example Registering a parser for "java" files
132
+ # SourceParser.register_parser_type :java, JavaParser, 'java'
133
+ # @param [Symbol] type a symbolic name for the parser type
134
+ # @param [Base] parser_klass a class that implements parsing and tokenization
135
+ # @param [Array<String>, String, Regexp] extensions a list of extensions or a
136
+ # regex to match against the file extension
137
+ # @return [void]
138
+ # @see Parser::Base
139
+ def register_parser_type(type, parser_klass, extensions = nil)
140
+ unless Base > parser_klass
141
+ raise ArgumentError, "expecting parser_klass to be a subclass of YARD::Parser::Base"
142
+ end
143
+ parser_type_extensions[type.to_sym] = extensions if extensions
144
+ parser_types[type.to_sym] = parser_klass
145
+ end
146
+
147
+ # @return [Hash{Symbol=>Object}] a list of registered parser types
148
+ # @private
149
+ # @since 0.5.6
150
+ attr_reader :parser_types
151
+ undef parser_types
152
+ def parser_types; @@parser_types ||= {} end
153
+ def parser_types=(value) @@parser_types = value end
154
+
155
+ # @return [Hash] a list of registered parser type extensions
156
+ # @private
157
+ # @since 0.5.6
158
+ attr_reader :parser_type_extensions
159
+ undef parser_type_extensions
160
+ def parser_type_extensions; @@parser_type_extensions ||= {} end
161
+ def parser_type_extensions=(value) @@parser_type_extensions = value end
162
+
163
+ # Finds a parser type that is registered for the extension. If no
164
+ # type is found, the default Ruby type is returned.
165
+ #
166
+ # @return [Symbol] the parser type to be used for the extension
167
+ # @since 0.5.6
168
+ def parser_type_for_extension(extension)
169
+ type = parser_type_extensions.find do |t, exts|
170
+ [exts].flatten.any? {|ext| ext === extension }
171
+ end
172
+ validated_parser_type(type ? type.first : :ruby)
173
+ end
174
+
175
+ # Returns the validated parser type. Basically, enforces that :ruby
176
+ # type is never set if the Ripper library is not available
177
+ #
178
+ # @param [Symbol] type the parser type to set
179
+ # @return [Symbol] the validated parser type
180
+ # @private
181
+ def validated_parser_type(type)
182
+ !defined?(::Ripper) && type == :ruby ? :ruby18 : type
183
+ end
184
+
185
+ # @group Parser Callbacks
186
+
187
+ # Registers a callback to be called before a list of files is parsed
188
+ # via {parse}. The block passed to this method will be called on
189
+ # subsequent parse calls.
190
+ #
191
+ # @example Installing a simple callback
192
+ # SourceParser.before_parse_list do |files, globals|
193
+ # puts "Starting to parse..."
194
+ # end
195
+ # YARD.parse('lib/**/*.rb')
196
+ # # prints "Starting to parse..."
197
+ #
198
+ # @example Setting global state
199
+ # SourceParser.before_parse_list do |files, globals|
200
+ # globals.method_count = 0
201
+ # end
202
+ # SourceParser.after_parse_list do |files, globals|
203
+ # puts "Found #{globals.method_count} methods"
204
+ # end
205
+ # class MyCountHandler < Handlers::Ruby::Base
206
+ # handles :def, :defs
207
+ # process { globals.method_count += 1 }
208
+ # end
209
+ # YARD.parse
210
+ # # Prints: "Found 37 methods"
211
+ #
212
+ # @example Using a global callback to cancel parsing
213
+ # SourceParser.before_parse_list do |files, globals|
214
+ # return false if files.include?('foo.rb')
215
+ # end
216
+ #
217
+ # YARD.parse(['foo.rb', 'bar.rb']) # callback cancels this method
218
+ # YARD.parse('bar.rb') # parses normally
219
+ #
220
+ # @yield [files, globals] the yielded block is called once before
221
+ # parsing all files
222
+ # @yieldparam [Array<String>] files the list of files that will be parsed.
223
+ # @yieldparam [OpenStruct] globals a global structure to store arbitrary
224
+ # state for post processing (see {Handlers::Processor#globals})
225
+ # @yieldreturn [Boolean] if the block returns +false+, parsing is
226
+ # cancelled.
227
+ # @return [Proc] the yielded block
228
+ # @see after_parse_list
229
+ # @see before_parse_file
230
+ # @since 0.7.0
231
+ def before_parse_list(&block)
232
+ before_parse_list_callbacks << block
233
+ end
234
+
235
+ # Registers a callback to be called after a list of files is parsed
236
+ # via {parse}. The block passed to this method will be called on
237
+ # subsequent parse calls.
238
+ #
239
+ # @example Printing results after parsing occurs
240
+ # SourceParser.after_parse_list do
241
+ # puts "Finished parsing!"
242
+ # end
243
+ # YARD.parse
244
+ # # Prints "Finished parsing!" after parsing files
245
+ # @yield [files, globals] the yielded block is called once before
246
+ # parsing all files
247
+ # @yieldparam [Array<String>] files the list of files that will be parsed.
248
+ # @yieldparam [OpenStruct] globals a global structure to store arbitrary
249
+ # state for post processing (see {Handlers::Processor#globals})
250
+ # @yieldreturn [void] the return value for the block is ignored.
251
+ # @return [Proc] the yielded block
252
+ # @see before_parse_list
253
+ # @see before_parse_file
254
+ # @since 0.7.0
255
+ def after_parse_list(&block)
256
+ after_parse_list_callbacks << block
257
+ end
258
+
259
+ # Registers a callback to be called before an individual file is parsed.
260
+ # The block passed to this method will be called on subsequent parse
261
+ # calls.
262
+ #
263
+ # To register a callback that is called before the entire list of files
264
+ # is processed, see {before_parse_list}.
265
+ #
266
+ # @example Installing a simple callback
267
+ # SourceParser.before_parse_file do |parser|
268
+ # puts "I'm parsing #{parser.file}"
269
+ # end
270
+ # YARD.parse('lib/**/*.rb')
271
+ # # prints:
272
+ # "I'm parsing lib/foo.rb"
273
+ # "I'm parsing lib/foo_bar.rb"
274
+ # "I'm parsing lib/last_file.rb"
275
+ #
276
+ # @example Cancel parsing of any test_*.rb files
277
+ # SourceParser.before_parse_file do |parser|
278
+ # return false if parser.file =~ /^test_.+\.rb$/
279
+ # end
280
+ #
281
+ # @yield [parser] the yielded block is called once before each
282
+ # file that is parsed. This might happen many times for a single
283
+ # codebase.
284
+ # @yieldparam [SourceParser] parser the parser object that will {#parse}
285
+ # the file.
286
+ # @yieldreturn [Boolean] if the block returns +false+, parsing for
287
+ # the file is cancelled.
288
+ # @return [Proc] the yielded block
289
+ # @see after_parse_file
290
+ # @see before_parse_list
291
+ # @since 0.7.0
292
+ def before_parse_file(&block)
293
+ before_parse_file_callbacks << block
294
+ end
295
+
296
+ # Registers a callback to be called after an individual file is parsed.
297
+ # The block passed to this method will be called on subsequent parse
298
+ # calls.
299
+ #
300
+ # To register a callback that is called after the entire list of files
301
+ # is processed, see {after_parse_list}.
302
+ #
303
+ # @example Printing the length of each file after it is parsed
304
+ # SourceParser.after_parse_file do |parser|
305
+ # puts "#{parser.file} is #{parser.contents.size} characters"
306
+ # end
307
+ # YARD.parse('lib/**/*.rb')
308
+ # # prints:
309
+ # "lib/foo.rb is 1240 characters"
310
+ # "lib/foo_bar.rb is 248 characters"
311
+ #
312
+ # @yield [parser] the yielded block is called once after each file
313
+ # that is parsed. This might happen many times for a single codebase.
314
+ # @yieldparam [SourceParser] parser the parser object that parsed
315
+ # the file.
316
+ # @yieldreturn [void] the return value for the block is ignored.
317
+ # @return [Proc] the yielded block
318
+ # @see before_parse_file
319
+ # @see after_parse_list
320
+ # @since 0.7.0
321
+ def after_parse_file(&block)
322
+ after_parse_file_callbacks << block
323
+ end
324
+
325
+ # @return [Array<Proc>] the list of callbacks to be called before
326
+ # parsing a list of files. Should only be used for testing.
327
+ # @since 0.7.0
328
+ def before_parse_list_callbacks
329
+ @before_parse_list_callbacks ||= []
330
+ end
331
+
332
+ # @return [Array<Proc>] the list of callbacks to be called after
333
+ # parsing a list of files. Should only be used for testing.
334
+ # @since 0.7.0
335
+ def after_parse_list_callbacks
336
+ @after_parse_list_callbacks ||= []
337
+ end
338
+
339
+ # @return [Array<Proc>] the list of callbacks to be called before
340
+ # parsing a file. Should only be used for testing.
341
+ # @since 0.7.0
342
+ def before_parse_file_callbacks
343
+ @before_parse_file_callbacks ||= []
344
+ end
345
+
346
+ # @return [Array<Proc>] the list of callbacks to be called after
347
+ # parsing a file. Should only be used for testing.
348
+ # @since 0.7.0
349
+ def after_parse_file_callbacks
350
+ @after_parse_file_callbacks ||= []
351
+ end
352
+
353
+ # @endgroup
354
+
355
+ private
356
+
357
+ # Parses a list of files in a queue.
358
+ #
359
+ # @param [Array<String>] files a list of files to queue for parsing
360
+ # @return [void]
361
+ def parse_in_order(*files)
362
+ global_state = OpenStruct.new
363
+
364
+ before_parse_list_callbacks.each do |cb|
365
+ return if cb.call(files, global_state) == false
366
+ end
367
+
368
+ OrderedParser.new(global_state, files).parse
369
+
370
+ after_parse_list_callbacks.each do |cb|
371
+ cb.call(files, global_state)
372
+ end
373
+ end
374
+ end
375
+
376
+ register_parser_type :ruby, Ruby::RubyParser
377
+ register_parser_type :ruby18, Ruby::Legacy::RubyParser
378
+ register_parser_type :c, C::CParser, ['c', 'cc', 'cxx', 'cpp']
379
+
380
+ self.parser_type = :ruby
381
+
382
+ # @return [String] the filename being parsed by the parser.
383
+ attr_accessor :file
384
+
385
+ # @return [Symbol] the parser type associated with the parser instance.
386
+ # This should be set by the {#initialize constructor}.
387
+ attr_reader :parser_type
388
+
389
+ # @return [OpenStruct] an open struct containing arbitrary global state
390
+ # shared between files and handlers.
391
+ # @since 0.7.0
392
+ attr_reader :globals
393
+
394
+ # @return [String] the contents of the file to be parsed
395
+ # @since 0.7.0
396
+ attr_reader :contents
397
+
398
+ # @overload initialize(parser_type = SourceParser.parser_type, globals = nil)
399
+ # Creates a new parser object for code parsing with a specific parser type.
400
+ #
401
+ # @param [Symbol] parser_type the parser type to use
402
+ # @param [OpenStruct] globals global state to be re-used across separate source files
403
+ def initialize(parser_type = SourceParser.parser_type, globals1 = nil, globals2 = nil)
404
+ globals = [true, false].include?(globals1) ? globals2 : globals1
405
+ @file = '(stdin)'
406
+ @globals = globals || OpenStruct.new
407
+ self.parser_type = parser_type
408
+ end
409
+
410
+ # The main parser method. This should not be called directly. Instead,
411
+ # use the class methods {parse} and {parse_string}.
412
+ #
413
+ # @param [String, #read, Object] content the source file to parse
414
+ # @return [Object, nil] the parser object used to parse the source
415
+ def parse(content = __FILE__)
416
+ case content
417
+ when String
418
+ @file = File.cleanpath(content)
419
+ content = convert_encoding(File.read_binary(file))
420
+ checksum = Registry.checksum_for(content)
421
+ return if Registry.checksums[file] == checksum
422
+
423
+ if Registry.checksums.has_key?(file)
424
+ log.info "File '#{file}' was modified, re-processing..."
425
+ end
426
+ Registry.checksums[@file] = checksum
427
+ self.parser_type = parser_type_for_filename(file)
428
+ else
429
+ content = content.read if content.respond_to? :read
430
+ end
431
+
432
+ @contents = content
433
+ @parser = parser_class.new(content, file)
434
+
435
+ self.class.before_parse_file_callbacks.each do |cb|
436
+ return @parser if cb.call(self) == false
437
+ end
438
+
439
+ @parser.parse
440
+ post_process
441
+
442
+ self.class.after_parse_file_callbacks.each do |cb|
443
+ cb.call(self)
444
+ end
445
+
446
+ @parser
447
+ rescue ArgumentError, NotImplementedError => e
448
+ log.warn("Cannot parse `#{file}': #{e.message}")
449
+ log.backtrace(e, :warn)
450
+ rescue ParserSyntaxError => e
451
+ log.warn(e.message.capitalize)
452
+ log.backtrace(e, :warn)
453
+ end
454
+
455
+ # Tokenizes but does not parse the block of code using the current {#parser_type}
456
+ #
457
+ # @param [String] content the block of code to tokenize
458
+ # @return [Array] a list of tokens
459
+ def tokenize(content)
460
+ @parser = parser_class.new(content, file)
461
+ @parser.tokenize
462
+ end
463
+
464
+ private
465
+
466
+ # Searches for encoding line and forces encoding
467
+ # @since 0.5.3
468
+ def convert_encoding(content)
469
+ return content unless content.respond_to?(:force_encoding)
470
+ if content =~ ENCODING_LINE
471
+ content.force_encoding($1)
472
+ else
473
+ content.force_encoding('binary')
474
+ ENCODING_BYTE_ORDER_MARKS.each do |encoding, bom|
475
+ bom.force_encoding('binary')
476
+ if content[0,bom.size] == bom
477
+ content.force_encoding(encoding)
478
+ return content
479
+ end
480
+ end
481
+ content.force_encoding('utf-8') # UTF-8 is default encoding
482
+ content
483
+ end
484
+ end
485
+
486
+ # Runs a {Handlers::Processor} object to post process the parsed statements.
487
+ # @return [void]
488
+ def post_process
489
+ return unless @parser.respond_to? :enumerator
490
+ return unless enumerator = @parser.enumerator
491
+ post = Handlers::Processor.new(self)
492
+ post.process(enumerator)
493
+ end
494
+
495
+ def parser_type=(value)
496
+ @parser_type = self.class.validated_parser_type(value)
497
+ end
498
+
499
+ # Guesses the parser type to use depending on the file extension.
500
+ #
501
+ # @param [String] filename the filename to use to guess the parser type
502
+ # @return [Symbol] a parser type that matches the filename
503
+ def parser_type_for_filename(filename)
504
+ ext = (File.extname(filename)[1..-1] || "").downcase
505
+ type = self.class.parser_type_for_extension(ext)
506
+ parser_type == :ruby18 && type == :ruby ? :ruby18 : type
507
+ end
508
+
509
+ # @since 0.5.6
510
+ def parser_class
511
+ klass = self.class.parser_types[parser_type]
512
+ raise ArgumentError, "invalid parser type '#{parser_type}' or unrecognized file", caller[1..-1] if !klass
513
+ klass
514
+ end
515
+ end
516
+ end
517
+ end
@@ -0,0 +1,74 @@
1
+ require 'rake'
2
+ require 'rake/tasklib'
3
+
4
+ module YARD
5
+ module Rake
6
+
7
+ # The rake task to run {CLI::Yardoc} and generate documentation.
8
+ class YardocTask < ::Rake::TaskLib
9
+ # The name of the task
10
+ # @return [String] the task name
11
+ attr_accessor :name
12
+
13
+ # Options to pass to {CLI::Yardoc}
14
+ # @return [Array<String>] the options passed to the commandline utility
15
+ attr_accessor :options
16
+
17
+ # The Ruby source files (and any extra documentation files separated by '-')
18
+ # to process.
19
+ # @example Task files assignment
20
+ # YARD::Rake::YardocTask.new do |t|
21
+ # t.files = ['app/**/*.rb', 'lib/**/*.rb', '-', 'doc/FAQ.md', 'doc/Changes.md']
22
+ # end
23
+ # @return [Array<String>] a list of files
24
+ attr_accessor :files
25
+
26
+ # Runs a +Proc+ before the task
27
+ # @return [Proc] a proc to call before running the task
28
+ attr_accessor :before
29
+
30
+ # Runs a +Proc+ after the task
31
+ # @return [Proc] a proc to call after running the task
32
+ attr_accessor :after
33
+
34
+ # @return [Verifier, Proc] an optional {Verifier} to run against all objects
35
+ # being generated. Any object that the verifier returns false for will be
36
+ # excluded from documentation. This attribute can also be a lambda.
37
+ # @see Verifier
38
+ attr_accessor :verifier
39
+
40
+ # Creates a new task with name +name+.
41
+ #
42
+ # @param [String, Symbol] name the name of the rake task
43
+ # @yield a block to allow any options to be modified on the task
44
+ # @yieldparam [YardocTask] _self the task object to allow any parameters
45
+ # to be changed.
46
+ def initialize(name = :yard)
47
+ @name = name
48
+ @options = []
49
+ @files = []
50
+
51
+ yield self if block_given?
52
+ self.options += ENV['OPTS'].split(/[ ,]/) if ENV['OPTS']
53
+ self.files += ENV['FILES'].split(/[ ,]/) if ENV['FILES']
54
+
55
+ define
56
+ end
57
+
58
+ protected
59
+
60
+ # Defines the rake task
61
+ # @return [void]
62
+ def define
63
+ desc "Generate YARD Documentation"
64
+ task(name) do
65
+ before.call if before.is_a?(Proc)
66
+ yardoc = YARD::CLI::Yardoc.new
67
+ yardoc.options[:verifier] = verifier if verifier
68
+ yardoc.run *(options + files)
69
+ after.call if after.is_a?(Proc)
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end