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,41 @@
1
+ # Handles alias and alias_method calls
2
+ class YARD::Handlers::Ruby::AliasHandler < YARD::Handlers::Ruby::Base
3
+ handles :alias, method_call(:alias_method)
4
+ namespace_only
5
+
6
+ process do
7
+ names = []
8
+ if statement.type == :alias
9
+ names = statement.map {|o| o.jump(:ident, :op, :kw, :const).source }
10
+ elsif statement.call?
11
+ statement.parameters(false).each do |obj|
12
+ case obj.type
13
+ when :symbol_literal
14
+ names << obj.jump(:ident, :op, :kw, :const).source
15
+ when :string_literal
16
+ names << obj.jump(:string_content).source
17
+ end
18
+ end
19
+ end
20
+ raise YARD::Parser::UndocumentableError, "alias/alias_method" if names.size != 2
21
+
22
+ new_meth, old_meth = names[0].to_sym, names[1].to_sym
23
+ old_obj = namespace.child(:name => old_meth, :scope => scope)
24
+ new_obj = register MethodObject.new(namespace, new_meth, scope) do |o|
25
+ o.add_file(parser.file, statement.line)
26
+ end
27
+
28
+ if old_obj
29
+ new_obj.signature = old_obj.signature
30
+ new_obj.source = old_obj.source
31
+ new_obj.docstring = old_obj.docstring + YARD::Docstring.new(statement.comments)
32
+ new_obj.docstring.line_range = statement.comments_range
33
+ new_obj.docstring.hash_flag = statement.comments_hash_flag
34
+ new_obj.docstring.object = new_obj
35
+ else
36
+ new_obj.signature = "def #{new_meth}" # this is all we know.
37
+ end
38
+
39
+ namespace.aliases[new_obj] = old_meth
40
+ end
41
+ end
@@ -0,0 +1,82 @@
1
+ # Handles +attr_*+ statements in modules/classes
2
+ class YARD::Handlers::Ruby::AttributeHandler < YARD::Handlers::Ruby::Base
3
+ handles method_call(:attr)
4
+ handles method_call(:attr_reader)
5
+ handles method_call(:attr_writer)
6
+ handles method_call(:attr_accessor)
7
+ namespace_only
8
+
9
+ process do
10
+ return if statement.type == :var_ref || statement.type == :vcall
11
+ read, write = true, false
12
+ params = statement.parameters(false).dup
13
+
14
+ # Change read/write based on attr_reader/writer/accessor
15
+ case statement.method_name(true)
16
+ when :attr
17
+ # In the case of 'attr', the second parameter (if given) isn't a symbol.
18
+ if params.size == 2
19
+ write = true if params.pop == s(:var_ref, s(:kw, "true"))
20
+ end
21
+ when :attr_accessor
22
+ write = true
23
+ when :attr_reader
24
+ # change nothing
25
+ when :attr_writer
26
+ read, write = false, true
27
+ end
28
+
29
+ # Add all attributes
30
+ validated_attribute_names(params).each do |name|
31
+ namespace.attributes[scope][name] ||= SymbolHash[:read => nil, :write => nil]
32
+
33
+ # Show their methods as well
34
+ {:read => name, :write => "#{name}="}.each do |type, meth|
35
+ if (type == :read ? read : write)
36
+ o = MethodObject.new(namespace, meth, scope)
37
+ if type == :write
38
+ o.parameters = [['value', nil]]
39
+ src = "def #{meth}(value)"
40
+ full_src = "#{src}\n @#{name} = value\nend"
41
+ doc = "Sets the attribute #{name}\n@param value the value to set the attribute #{name} to."
42
+ else
43
+ src = "def #{meth}"
44
+ full_src = "#{src}\n @#{name}\nend"
45
+ doc = "Returns the value of attribute #{name}"
46
+ end
47
+ o.source ||= full_src
48
+ o.signature ||= src
49
+ register(o)
50
+ o.docstring = doc if o.docstring.blank?(false)
51
+
52
+ # Regsiter the object explicitly
53
+ namespace.attributes[scope][name][type] = o
54
+ elsif obj = namespace.children.find {|o| o.name == meth.to_sym && o.scope == scope }
55
+ # register an existing method as attribute
56
+ namespace.attributes[scope][name][type] = obj
57
+ end
58
+ end
59
+ end
60
+ end
61
+
62
+ protected
63
+
64
+ # Strips out any non-essential arguments from the attr statement.
65
+ #
66
+ # @param [Array<Parser::Ruby::AstNode>] params a list of the parameters
67
+ # in the attr call.
68
+ # @return [Array<String>] the validated attribute names
69
+ # @raise [Parser::UndocumentableError] if the arguments are not valid.
70
+ def validated_attribute_names(params)
71
+ params.map do |obj|
72
+ case obj.type
73
+ when :symbol_literal
74
+ obj.jump(:ident, :op, :kw, :const).source
75
+ when :string_literal
76
+ obj.jump(:string_content).source
77
+ else
78
+ raise YARD::Parser::UndocumentableError, obj.source
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,164 @@
1
+ module YARD
2
+ module Handlers
3
+ module Ruby
4
+ # To implement a custom handler matcher, subclass this class and implement
5
+ # {#matches?} to return whether a node matches the handler.
6
+ #
7
+ # @example A Custom Handler Matcher Extension
8
+ # # Implements a handler that checks for a specific string
9
+ # # in the node's source.
10
+ # class MyExtension < HandlesExtension
11
+ # def matches?(node) node.source.include?(name) end
12
+ # end
13
+ #
14
+ # # This handler will handle any node where the source includes 'foo'
15
+ # class MyHandler < Handlers::Ruby::Base
16
+ # handles MyExtension.new('foo')
17
+ # end
18
+ class HandlesExtension
19
+ # Creates a new extension with a specific matcher value +name+
20
+ # @param [Object] name the matcher value to check against {#matches?}
21
+ def initialize(name) @name = name end
22
+
23
+ # Tests if the node matches the handler
24
+ # @param [Parser::Ruby::AstNode] node a Ruby node
25
+ # @return [Boolean] whether the +node+ matches the handler
26
+ def matches?(node) raise NotImplementedError end
27
+
28
+ protected
29
+
30
+ # @return [String] the extension matcher value
31
+ attr_reader :name
32
+ end
33
+
34
+ class MethodCallWrapper < HandlesExtension
35
+ def matches?(node)
36
+ case node.type
37
+ when :var_ref
38
+ if !node.parent || node.parent.type == :list
39
+ return true if node[0].type == :ident && (name.nil? || node[0][0] == name)
40
+ end
41
+ when :fcall, :command, :vcall
42
+ return true if name.nil? || node[0][0] == name
43
+ when :call, :command_call
44
+ return true if name.nil? || node[2][0] == name
45
+ end
46
+ false
47
+ end
48
+ end
49
+
50
+ class TestNodeWrapper < HandlesExtension
51
+ def matches?(node) !node.send(name).is_a?(FalseClass) end
52
+ end
53
+
54
+ # This is the base handler class for the new-style (1.9) Ruby parser.
55
+ # All handlers that subclass this base class will be used when the
56
+ # new-style parser is used. For implementing legacy handlers, see
57
+ # {Legacy::Base}.
58
+ #
59
+ # @abstract See {Handlers::Base} for subclassing information.
60
+ # @see Handlers::Base
61
+ # @see Legacy::Base
62
+ class Base < Handlers::Base
63
+ class << self
64
+ include Parser::Ruby
65
+
66
+ # @group Statement Matcher Extensions
67
+
68
+ # Matcher for handling any type of method call. Method calls can
69
+ # be expressed by many {AstNode} types depending on the syntax
70
+ # with which it is called, so YARD allows you to use this matcher
71
+ # to simplify matching a method call.
72
+ #
73
+ # @example Match the "describe" method call
74
+ # handles method_call(:describe)
75
+ #
76
+ # # The following will be matched:
77
+ # # describe(...)
78
+ # # object.describe(...)
79
+ # # describe "argument" do ... end
80
+ #
81
+ # @param [#to_s] name matches the method call of this name
82
+ # @return [void]
83
+ def method_call(name = nil)
84
+ MethodCallWrapper.new(name ? name.to_s : nil)
85
+ end
86
+
87
+ # Matcher for handling a node with a specific meta-type. An {AstNode}
88
+ # has a {AstNode#type} to define its type but can also be associated
89
+ # with a set of types. For instance, +:if+ and +:unless+ are both
90
+ # of the meta-type +:condition+.
91
+ #
92
+ # A meta-type is any method on the {AstNode} class ending in "?",
93
+ # though you should not include the "?" suffix in your declaration.
94
+ # Some examples are: "condition", "call", "literal", "kw", "token",
95
+ # "ref".
96
+ #
97
+ # @example Handling any conditional statement (if, unless)
98
+ # handles meta_type(:condition)
99
+ # @param [Symbol] type the meta-type to match. A meta-type can be
100
+ # any method name + "?" that {AstNode} responds to.
101
+ # @return [void]
102
+ def meta_type(type)
103
+ TestNodeWrapper.new(type.to_s + "?")
104
+ end
105
+
106
+ # @group Testing for a Handler
107
+
108
+ # @return [Boolean] whether or not an {AstNode} object should be
109
+ # handled by this handler
110
+ def handles?(node)
111
+ handlers.any? do |a_handler|
112
+ case a_handler
113
+ when Symbol
114
+ a_handler == node.type
115
+ when String
116
+ node.source == a_handler
117
+ when Regexp
118
+ node.source =~ a_handler
119
+ when Parser::Ruby::AstNode
120
+ a_handler == node
121
+ when HandlesExtension
122
+ a_handler.matches?(node)
123
+ end
124
+ end
125
+ end
126
+ end
127
+
128
+ include Parser::Ruby
129
+
130
+ # @group Parsing an Inner Block
131
+
132
+ def parse_block(inner_node, opts = {})
133
+ push_state(opts) do
134
+ nodes = inner_node.type == :list ? inner_node.children : [inner_node]
135
+ parser.process(nodes)
136
+ end
137
+ end
138
+
139
+ # @group Macro Handling
140
+
141
+ def call_params
142
+ return [] unless statement.respond_to?(:parameters)
143
+ statement.parameters(false).compact.map do |param|
144
+ if param.type == :list
145
+ param.map {|n| n.jump(:ident, :kw, :tstring_content).source }
146
+ else
147
+ param.jump(:ident, :kw, :tstring_content).source
148
+ end
149
+ end.flatten
150
+ end
151
+
152
+ def caller_method
153
+ if statement.call? || statement.def?
154
+ statement.method_name(true).to_s
155
+ elsif statement.type == :var_ref || statement.type == :vcall
156
+ statement[0].jump(:ident, :kw).source
157
+ else
158
+ nil
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end
@@ -0,0 +1,86 @@
1
+ # Matches if/unless conditions inside classes and attempts to process only
2
+ # one branch (by evaluating the condition if possible).
3
+ #
4
+ # @example A simple class conditional
5
+ # class Foo
6
+ # if 0
7
+ # # This method is ignored
8
+ # def xyz; end
9
+ # end
10
+ # end
11
+ class YARD::Handlers::Ruby::ClassConditionHandler < YARD::Handlers::Ruby::Base
12
+ handles meta_type(:condition)
13
+ namespace_only
14
+
15
+ process do
16
+ condition = parse_condition
17
+ if condition == nil
18
+ # Parse both blocks if we're unsure of the condition
19
+ parse_then_block
20
+ parse_else_block
21
+ elsif condition
22
+ parse_then_block
23
+ else
24
+ parse_else_block
25
+ end
26
+ end
27
+
28
+ protected
29
+
30
+ # Parses the condition part of the if/unless statement
31
+ #
32
+ # @return [true, false, nil] true if the condition can be definitely
33
+ # parsed to true, false if not, and nil if the condition cannot be
34
+ # parsed with certainty (it's dynamic)
35
+ def parse_condition
36
+ condition = nil
37
+
38
+ # Right now we can handle very simple unary conditions like:
39
+ # if true
40
+ # if false
41
+ # if 0
42
+ # if 100 (not 0)
43
+ # if defined? SOME_CONSTANT
44
+ #
45
+ # The last case will do a lookup in the registry and then one
46
+ # in the Ruby world (using eval).
47
+ case statement.condition.type
48
+ when :int
49
+ condition = statement.condition[0] != "0"
50
+ when :defined
51
+ # defined? keyword used, let's see if we can look up the name
52
+ # in the registry, then we'll try using Ruby's powers. eval() is not
53
+ # *too* dangerous here since code is not actually executed.
54
+ name = statement.condition[0].source
55
+ obj = YARD::Registry.resolve(namespace, name, true)
56
+ begin
57
+ condition = true if obj || Object.instance_eval("defined? #{name}")
58
+ rescue SyntaxError, NameError
59
+ condition = false
60
+ end
61
+ when :var_ref
62
+ var = statement.condition[0]
63
+ if var == s(:kw, "true")
64
+ condition = true
65
+ elsif var == s(:kw, "false")
66
+ condition = false
67
+ end
68
+ end
69
+
70
+ # Invert an unless condition
71
+ if statement.type == :unless || statement.type == :unless_mod
72
+ condition = !condition if condition != nil
73
+ end
74
+ condition
75
+ end
76
+
77
+ def parse_then_block
78
+ parse_block(statement.then_block, :visibility => visibility)
79
+ end
80
+
81
+ def parse_else_block
82
+ if statement.else_block
83
+ parse_block(statement.else_block, :visibility => visibility)
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,121 @@
1
+ # Handles class declarations
2
+ class YARD::Handlers::Ruby::ClassHandler < YARD::Handlers::Ruby::Base
3
+ include YARD::Handlers::Ruby::StructHandlerMethods
4
+ handles :class, :sclass
5
+ namespace_only
6
+
7
+ process do
8
+ classname = statement[0].source.gsub(/\s/, '')
9
+ if statement.type == :class
10
+ superclass = parse_superclass(statement[1])
11
+ if superclass == "Struct"
12
+ is_a_struct = true
13
+ superclass = struct_superclass_name(statement[1]) # refine the superclass if possible
14
+ create_struct_superclass(superclass, statement[1])
15
+ end
16
+ undocsuper = statement[1] && superclass.nil?
17
+ klass = register ClassObject.new(namespace, classname) do |o|
18
+ o.superclass = superclass if superclass
19
+ o.superclass.type = :class if o.superclass.is_a?(Proxy)
20
+ end
21
+ if is_a_struct
22
+ parse_struct_superclass(klass, statement[1])
23
+ elsif klass
24
+ create_attributes(klass, members_from_tags(klass))
25
+ end
26
+ parse_block(statement[2], :namespace => klass)
27
+
28
+ if undocsuper
29
+ raise YARD::Parser::UndocumentableError, 'superclass (class was added without superclass)'
30
+ end
31
+ elsif statement.type == :sclass
32
+ if statement[0] == s(:var_ref, s(:kw, "self"))
33
+ parse_block(statement[1], :namespace => namespace, :scope => :class)
34
+ else
35
+ proxy = Proxy.new(namespace, classname)
36
+
37
+ # Allow constants to reference class names
38
+ if ConstantObject === proxy
39
+ if proxy.value =~ /\A#{NAMESPACEMATCH}\Z/
40
+ proxy = Proxy.new(namespace, proxy.value)
41
+ else
42
+ raise YARD::Parser::UndocumentableError, "constant class reference '#{classname}'"
43
+ end
44
+ end
45
+
46
+ if classname[0,1] =~ /[A-Z]/
47
+ register ClassObject.new(namespace, classname) if Proxy === proxy
48
+ parse_block(statement[1], :namespace => proxy, :scope => :class)
49
+ else
50
+ raise YARD::Parser::UndocumentableError, "class '#{classname}'"
51
+ end
52
+ end
53
+ else
54
+ sig_end = (statement[1] ? statement[1].source_end : statement[0].source_end) - statement.source_start
55
+ raise YARD::Parser::UndocumentableError, "class: #{statement.source[0..sig_end]}"
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ # Extract the parameters from the Struct.new AST node, returning them as a list
62
+ # of strings
63
+ #
64
+ # @param [MethodCallNode] superclass the AST node for the Struct.new call
65
+ # @return [Array<String>] the member names to generate methods for
66
+ def extract_parameters(superclass)
67
+ members = superclass.parameters.select {|x| x && x.type == :symbol_literal}
68
+ members.map! {|x| x.source.strip[1..-1]}
69
+ members
70
+ end
71
+
72
+ def create_struct_superclass(superclass, superclass_def)
73
+ return if superclass == "Struct"
74
+ the_super = register ClassObject.new(P("Struct"), superclass[8..-1]) do |o|
75
+ o.superclass = "Struct"
76
+ end
77
+ parse_struct_superclass(the_super, superclass_def)
78
+ the_super
79
+ end
80
+
81
+ def struct_superclass_name(superclass)
82
+ if superclass.call?
83
+ first = superclass.parameters.first
84
+ if first.type == :string_literal && first[0].type == :string_content && first[0].size == 1
85
+ return "Struct::#{first[0][0][0]}"
86
+ end
87
+ end
88
+ "Struct"
89
+ end
90
+
91
+ def parse_struct_superclass(klass, superclass)
92
+ return unless superclass.call? && superclass.parameters
93
+ members = extract_parameters(superclass)
94
+ create_attributes(klass, members)
95
+ end
96
+
97
+ def parse_superclass(superclass)
98
+ return nil unless superclass
99
+
100
+ case superclass.type
101
+ when :var_ref
102
+ return namespace.path if superclass.first == s(:kw, "self")
103
+ return superclass.source if superclass.first.type == :const
104
+ when :const, :const_ref, :const_path_ref, :top_const_ref
105
+ return superclass.source
106
+ when :fcall, :command
107
+ methname = superclass.method_name.source
108
+ if methname == "DelegateClass"
109
+ return superclass.parameters.first.source
110
+ elsif superclass.method_name.type == :const
111
+ return methname
112
+ end
113
+ when :call, :command_call
114
+ cname = superclass.namespace.source
115
+ if cname =~ /^O?Struct$/ && superclass.method_name(true) == :new
116
+ return cname
117
+ end
118
+ end
119
+ nil
120
+ end
121
+ end
@@ -0,0 +1,16 @@
1
+ # Handles a class variable (@@variable)
2
+ class YARD::Handlers::Ruby::ClassVariableHandler < YARD::Handlers::Ruby::Base
3
+ handles :assign
4
+ namespace_only
5
+
6
+ process do
7
+ if statement[0].type == :var_field && statement[0][0].type == :cvar
8
+ name = statement[0][0][0]
9
+ value = statement[1].source
10
+ register ClassVariableObject.new(namespace, name) do |o|
11
+ o.source = statement
12
+ o.value = value
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,9 @@
1
+ # Handles any lone comment statement in a Ruby file
2
+ class YARD::Handlers::Ruby::CommentHandler < YARD::Handlers::Ruby::Base
3
+ handles :comment, :void_stmt
4
+ namespace_only
5
+
6
+ process do
7
+ register_docstring(nil)
8
+ end
9
+ end
@@ -0,0 +1,45 @@
1
+ # Handles any constant assignment
2
+ class YARD::Handlers::Ruby::ConstantHandler < YARD::Handlers::Ruby::Base
3
+ include YARD::Handlers::Ruby::StructHandlerMethods
4
+ handles :assign
5
+ namespace_only
6
+
7
+ process do
8
+ if statement[1].call? && statement[1][0][0] == s(:const, "Struct") &&
9
+ statement[1][2] == s(:ident, "new")
10
+ process_structclass(statement)
11
+ elsif statement[0].type == :var_field && statement[0][0].type == :const
12
+ process_constant(statement)
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def process_constant(statement)
19
+ name = statement[0][0][0]
20
+ value = statement[1].source
21
+ register ConstantObject.new(namespace, name) {|o| o.source = statement; o.value = value.strip }
22
+ end
23
+
24
+ def process_structclass(statement)
25
+ lhs = statement[0][0]
26
+ if lhs.type == :const
27
+ klass = create_class(lhs[0], P(:Struct))
28
+ create_attributes(klass, extract_parameters(statement[1]))
29
+ else
30
+ raise YARD::Parser::UndocumentableError, "Struct assignment to #{statement[0].source}"
31
+ end
32
+ end
33
+
34
+ # Extract the parameters from the Struct.new AST node, returning them as a list
35
+ # of strings
36
+ #
37
+ # @param [MethodCallNode] superclass the AST node for the Struct.new call
38
+ # @return [Array<String>] the member names to generate methods for
39
+ def extract_parameters(superclass)
40
+ return [] unless superclass.parameters
41
+ members = superclass.parameters.select {|x| x && x.type == :symbol_literal}
42
+ members.map! {|x| x.source.strip[1..-1]}
43
+ members
44
+ end
45
+ end
@@ -0,0 +1,14 @@
1
+ module YARD
2
+ module Handlers
3
+ module Ruby
4
+ # Handles automatic detection of dsl-style methods
5
+ class DSLHandler < Base
6
+ include CodeObjects
7
+ include DSLHandlerMethods
8
+ handles method_call
9
+ namespace_only
10
+ process { handle_comments }
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,77 @@
1
+ module YARD
2
+ module Handlers
3
+ module Ruby
4
+ module DSLHandlerMethods
5
+ include CodeObjects
6
+ include Parser
7
+
8
+ IGNORE_METHODS = Hash[*%w(alias alias_method autoload attr attr_accessor
9
+ attr_reader attr_writer extend include public private protected
10
+ private_constant).map {|n| [n, true] }.flatten]
11
+
12
+ def handle_comments
13
+ return if IGNORE_METHODS[caller_method]
14
+
15
+ @docstring = statement.comments || ""
16
+ @docstring = @docstring.join("\n") if @docstring.is_a?(Array)
17
+
18
+ if @docstring =~ /^@!?macro\s+\[[^\]]*attach/
19
+ register_docstring(nil)
20
+ @docstring = ""
21
+ end
22
+
23
+ if macro = find_attached_macro
24
+ @docstring += "\n" +
25
+ macro.expand([caller_method, *call_params], statement.source)
26
+ elsif !statement.comments_hash_flag && !implicit_docstring?
27
+ return register_docstring(nil)
28
+ end
29
+
30
+ # ignore DSL definitions if @method/@attribute directive is used
31
+ if @docstring =~ /^@!?(method|attribute)\b/
32
+ return register_docstring(nil)
33
+ end
34
+
35
+ object = MethodObject.new(namespace, method_name, scope)
36
+ object.signature = method_signature
37
+ register(object)
38
+ end
39
+
40
+ def register_docstring(object, docstring = @docstring, stmt = statement)
41
+ super
42
+ end
43
+
44
+ private
45
+
46
+ def implicit_docstring?
47
+ tags = %w(method attribute overload visibility scope return)
48
+ tags.any? {|tag| @docstring =~ /^@!?#{tag}\b/ }
49
+ end
50
+
51
+ def method_name
52
+ name = call_params.first || ""
53
+ if name =~ /^#{CodeObjects::METHODNAMEMATCH}$/
54
+ name
55
+ else
56
+ raise UndocumentableError, "method, missing name"
57
+ end
58
+ end
59
+
60
+ def method_signature
61
+ "def #{method_name}"
62
+ end
63
+
64
+ def find_attached_macro
65
+ Registry.all(:macro).each do |macro|
66
+ next unless macro.method_object
67
+ next unless macro.method_object.name.to_s == caller_method.to_s
68
+ (namespace.inheritance_tree(true) + [P('Object')]).each do |obj|
69
+ return macro if obj == macro.method_object.namespace
70
+ end
71
+ end
72
+ nil
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,26 @@
1
+ # Handles 'raise' calls inside methods
2
+ class YARD::Handlers::Ruby::ExceptionHandler < YARD::Handlers::Ruby::Base
3
+ handles method_call(:raise)
4
+
5
+ process do
6
+ return unless owner.is_a?(MethodObject) # Only methods yield
7
+ return if [:command_call, :call].include? statement.type
8
+ return if owner.has_tag?(:raise)
9
+
10
+ klass = nil
11
+ if statement.call?
12
+ params = statement.parameters(false)
13
+ if params.size == 1
14
+ if params.first.ref? && params.first.first.type != :ident
15
+ klass = params.first.source
16
+ elsif params.first.call? && params.first.method_name(true) == :new
17
+ klass = params.first.namespace.source
18
+ end
19
+ elsif params.size > 1
20
+ klass = params.first.source
21
+ end
22
+ end
23
+
24
+ owner.add_tag YARD::Tags::Tag.new(:raise, '', klass) if klass
25
+ end
26
+ end