yard 0.9.18 → 0.9.19

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of yard might be problematic. Click here for more details.

Files changed (567) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +26 -26
  3. data/CHANGELOG.md +742 -728
  4. data/LEGAL +66 -66
  5. data/LICENSE +22 -22
  6. data/README.md +328 -328
  7. data/Rakefile +42 -53
  8. data/benchmarks/builtins_vs_eval.rb +24 -24
  9. data/benchmarks/concat_vs_join.rb +13 -13
  10. data/benchmarks/erb_vs_erubis.rb +54 -54
  11. data/benchmarks/format_args.rb +47 -47
  12. data/benchmarks/generation.rb +38 -38
  13. data/benchmarks/marshal_vs_dbm.rb +64 -64
  14. data/benchmarks/parsing.rb +46 -46
  15. data/benchmarks/pathname_vs_string.rb +50 -50
  16. data/benchmarks/rdoc_vs_yardoc.rb +11 -11
  17. data/benchmarks/registry_store_types.rb +49 -49
  18. data/benchmarks/ri_vs_yri.rb +19 -19
  19. data/benchmarks/ripper_parser.rb +13 -13
  20. data/benchmarks/splat_vs_flatten.rb +13 -13
  21. data/benchmarks/template_erb.rb +23 -23
  22. data/benchmarks/template_format.rb +7 -7
  23. data/benchmarks/template_profile.rb +18 -18
  24. data/benchmarks/yri_cache.rb +20 -20
  25. data/bin/yard +13 -13
  26. data/bin/yardoc +13 -13
  27. data/bin/yri +13 -13
  28. data/docs/CodeObjects.md +115 -115
  29. data/docs/GettingStarted.md +679 -679
  30. data/docs/Handlers.md +152 -152
  31. data/docs/Overview.md +61 -61
  32. data/docs/Parser.md +191 -191
  33. data/docs/Tags.md +283 -283
  34. data/docs/TagsArch.md +123 -123
  35. data/docs/Templates.md +496 -496
  36. data/docs/WhatsNew.md +1245 -1245
  37. data/docs/templates/default/fulldoc/html/full_list_tag.erb +8 -8
  38. data/docs/templates/default/fulldoc/html/setup.rb +6 -6
  39. data/docs/templates/default/layout/html/setup.rb +9 -9
  40. data/docs/templates/default/layout/html/tag_list.erb +11 -11
  41. data/docs/templates/default/yard_tags/html/list.erb +18 -18
  42. data/docs/templates/default/yard_tags/html/setup.rb +26 -26
  43. data/docs/templates/plugin.rb +70 -70
  44. data/lib/rubygems_plugin.rb +9 -9
  45. data/lib/yard.rb +69 -69
  46. data/lib/yard/autoload.rb +308 -303
  47. data/lib/yard/cli/command.rb +85 -85
  48. data/lib/yard/cli/command_parser.rb +93 -93
  49. data/lib/yard/cli/config.rb +198 -198
  50. data/lib/yard/cli/diff.rb +270 -270
  51. data/lib/yard/cli/display.rb +69 -69
  52. data/lib/yard/cli/gems.rb +84 -84
  53. data/lib/yard/cli/graph.rb +125 -125
  54. data/lib/yard/cli/help.rb +20 -20
  55. data/lib/yard/cli/i18n.rb +70 -70
  56. data/lib/yard/cli/list.rb +23 -23
  57. data/lib/yard/cli/markup_types.rb +32 -32
  58. data/lib/yard/cli/server.rb +257 -257
  59. data/lib/yard/cli/stats.rb +231 -231
  60. data/lib/yard/cli/yardoc.rb +789 -788
  61. data/lib/yard/cli/yardopts_command.rb +110 -110
  62. data/lib/yard/cli/yri.rb +215 -215
  63. data/lib/yard/code_objects/base.rb +615 -615
  64. data/lib/yard/code_objects/class_object.rb +146 -146
  65. data/lib/yard/code_objects/class_variable_object.rb +11 -11
  66. data/lib/yard/code_objects/constant_object.rb +16 -16
  67. data/lib/yard/code_objects/extended_method_object.rb +24 -24
  68. data/lib/yard/code_objects/extra_file_object.rb +134 -131
  69. data/lib/yard/code_objects/macro_object.rb +172 -172
  70. data/lib/yard/code_objects/method_object.rb +196 -196
  71. data/lib/yard/code_objects/module_object.rb +21 -21
  72. data/lib/yard/code_objects/namespace_mapper.rb +114 -114
  73. data/lib/yard/code_objects/namespace_object.rb +200 -200
  74. data/lib/yard/code_objects/proxy.rb +240 -240
  75. data/lib/yard/code_objects/root_object.rb +19 -19
  76. data/lib/yard/config.rb +270 -270
  77. data/lib/yard/core_ext/array.rb +16 -16
  78. data/lib/yard/core_ext/file.rb +69 -69
  79. data/lib/yard/core_ext/hash.rb +16 -16
  80. data/lib/yard/core_ext/insertion.rb +63 -63
  81. data/lib/yard/core_ext/module.rb +11 -20
  82. data/lib/yard/core_ext/string.rb +68 -68
  83. data/lib/yard/core_ext/symbol_hash.rb +75 -75
  84. data/lib/yard/docstring.rb +386 -386
  85. data/lib/yard/docstring_parser.rb +345 -345
  86. data/lib/yard/gem_index.rb +29 -29
  87. data/lib/yard/globals.rb +22 -22
  88. data/lib/yard/handlers/base.rb +595 -595
  89. data/lib/yard/handlers/c/alias_handler.rb +16 -16
  90. data/lib/yard/handlers/c/attribute_handler.rb +13 -13
  91. data/lib/yard/handlers/c/base.rb +129 -129
  92. data/lib/yard/handlers/c/class_handler.rb +27 -27
  93. data/lib/yard/handlers/c/constant_handler.rb +13 -13
  94. data/lib/yard/handlers/c/handler_methods.rb +212 -211
  95. data/lib/yard/handlers/c/init_handler.rb +20 -20
  96. data/lib/yard/handlers/c/method_handler.rb +45 -45
  97. data/lib/yard/handlers/c/mixin_handler.rb +21 -21
  98. data/lib/yard/handlers/c/module_handler.rb +17 -17
  99. data/lib/yard/handlers/c/override_comment_handler.rb +31 -31
  100. data/lib/yard/handlers/c/path_handler.rb +11 -11
  101. data/lib/yard/handlers/c/struct_handler.rb +13 -13
  102. data/lib/yard/handlers/c/symbol_handler.rb +8 -8
  103. data/lib/yard/handlers/common/method_handler.rb +19 -0
  104. data/lib/yard/handlers/processor.rb +200 -200
  105. data/lib/yard/handlers/ruby/alias_handler.rb +44 -44
  106. data/lib/yard/handlers/ruby/attribute_handler.rb +87 -87
  107. data/lib/yard/handlers/ruby/base.rb +165 -165
  108. data/lib/yard/handlers/ruby/class_condition_handler.rb +92 -92
  109. data/lib/yard/handlers/ruby/class_handler.rb +119 -119
  110. data/lib/yard/handlers/ruby/class_variable_handler.rb +17 -17
  111. data/lib/yard/handlers/ruby/comment_handler.rb +10 -10
  112. data/lib/yard/handlers/ruby/constant_handler.rb +59 -59
  113. data/lib/yard/handlers/ruby/decorator_handler_methods.rb +123 -123
  114. data/lib/yard/handlers/ruby/dsl_handler.rb +15 -15
  115. data/lib/yard/handlers/ruby/dsl_handler_methods.rb +96 -96
  116. data/lib/yard/handlers/ruby/exception_handler.rb +27 -27
  117. data/lib/yard/handlers/ruby/extend_handler.rb +22 -22
  118. data/lib/yard/handlers/ruby/legacy/alias_handler.rb +37 -37
  119. data/lib/yard/handlers/ruby/legacy/attribute_handler.rb +65 -65
  120. data/lib/yard/handlers/ruby/legacy/base.rb +245 -245
  121. data/lib/yard/handlers/ruby/legacy/class_condition_handler.rb +83 -83
  122. data/lib/yard/handlers/ruby/legacy/class_handler.rb +113 -113
  123. data/lib/yard/handlers/ruby/legacy/class_variable_handler.rb +15 -15
  124. data/lib/yard/handlers/ruby/legacy/comment_handler.rb +10 -10
  125. data/lib/yard/handlers/ruby/legacy/constant_handler.rb +29 -29
  126. data/lib/yard/handlers/ruby/legacy/dsl_handler.rb +17 -17
  127. data/lib/yard/handlers/ruby/legacy/exception_handler.rb +13 -13
  128. data/lib/yard/handlers/ruby/legacy/extend_handler.rb +21 -21
  129. data/lib/yard/handlers/ruby/legacy/method_handler.rb +90 -90
  130. data/lib/yard/handlers/ruby/legacy/mixin_handler.rb +39 -39
  131. data/lib/yard/handlers/ruby/legacy/module_function_handler.rb +19 -19
  132. data/lib/yard/handlers/ruby/legacy/module_handler.rb +12 -12
  133. data/lib/yard/handlers/ruby/legacy/private_class_method_handler.rb +22 -22
  134. data/lib/yard/handlers/ruby/legacy/private_constant_handler.rb +22 -22
  135. data/lib/yard/handlers/ruby/legacy/visibility_handler.rb +17 -17
  136. data/lib/yard/handlers/ruby/legacy/yield_handler.rb +29 -29
  137. data/lib/yard/handlers/ruby/method_condition_handler.rb +9 -9
  138. data/lib/yard/handlers/ruby/method_handler.rb +114 -118
  139. data/lib/yard/handlers/ruby/mixin_handler.rb +37 -37
  140. data/lib/yard/handlers/ruby/module_function_handler.rb +27 -27
  141. data/lib/yard/handlers/ruby/module_handler.rb +12 -12
  142. data/lib/yard/handlers/ruby/private_class_method_handler.rb +14 -14
  143. data/lib/yard/handlers/ruby/private_constant_handler.rb +43 -43
  144. data/lib/yard/handlers/ruby/public_class_method_handler.rb +14 -14
  145. data/lib/yard/handlers/ruby/struct_handler_methods.rb +143 -143
  146. data/lib/yard/handlers/ruby/visibility_handler.rb +22 -22
  147. data/lib/yard/handlers/ruby/yield_handler.rb +31 -31
  148. data/lib/yard/i18n/locale.rb +67 -67
  149. data/lib/yard/i18n/message.rb +57 -57
  150. data/lib/yard/i18n/messages.rb +56 -56
  151. data/lib/yard/i18n/po_parser.rb +61 -61
  152. data/lib/yard/i18n/pot_generator.rb +290 -290
  153. data/lib/yard/i18n/text.rb +173 -173
  154. data/lib/yard/logging.rb +205 -205
  155. data/lib/yard/options.rb +217 -217
  156. data/lib/yard/parser/base.rb +57 -57
  157. data/lib/yard/parser/c/c_parser.rb +235 -235
  158. data/lib/yard/parser/c/comment_parser.rb +134 -134
  159. data/lib/yard/parser/c/statement.rb +64 -64
  160. data/lib/yard/parser/ruby/ast_node.rb +540 -540
  161. data/lib/yard/parser/ruby/legacy/ruby_lex.rb +1354 -1354
  162. data/lib/yard/parser/ruby/legacy/ruby_parser.rb +32 -32
  163. data/lib/yard/parser/ruby/legacy/statement.rb +66 -66
  164. data/lib/yard/parser/ruby/legacy/statement_list.rb +394 -394
  165. data/lib/yard/parser/ruby/legacy/token_list.rb +74 -74
  166. data/lib/yard/parser/ruby/ruby_parser.rb +687 -687
  167. data/lib/yard/parser/ruby/token_resolver.rb +156 -156
  168. data/lib/yard/parser/source_parser.rb +526 -526
  169. data/lib/yard/rake/yardoc_task.rb +81 -81
  170. data/lib/yard/registry.rb +439 -439
  171. data/lib/yard/registry_resolver.rb +189 -189
  172. data/lib/yard/registry_store.rb +337 -337
  173. data/lib/yard/rubygems/backports.rb +10 -10
  174. data/lib/yard/rubygems/backports/LICENSE.txt +57 -57
  175. data/lib/yard/rubygems/backports/MIT.txt +20 -20
  176. data/lib/yard/rubygems/backports/gem.rb +10 -10
  177. data/lib/yard/rubygems/backports/source_index.rb +365 -365
  178. data/lib/yard/rubygems/doc_manager.rb +90 -90
  179. data/lib/yard/rubygems/hook.rb +197 -197
  180. data/lib/yard/rubygems/specification.rb +50 -50
  181. data/lib/yard/serializers/base.rb +83 -83
  182. data/lib/yard/serializers/file_system_serializer.rb +123 -123
  183. data/lib/yard/serializers/process_serializer.rb +24 -24
  184. data/lib/yard/serializers/stdout_serializer.rb +34 -34
  185. data/lib/yard/serializers/yardoc_serializer.rb +152 -152
  186. data/lib/yard/server.rb +13 -13
  187. data/lib/yard/server/adapter.rb +100 -100
  188. data/lib/yard/server/commands/base.rb +209 -209
  189. data/lib/yard/server/commands/display_file_command.rb +29 -29
  190. data/lib/yard/server/commands/display_object_command.rb +65 -65
  191. data/lib/yard/server/commands/frames_command.rb +16 -16
  192. data/lib/yard/server/commands/library_command.rb +187 -187
  193. data/lib/yard/server/commands/library_index_command.rb +28 -28
  194. data/lib/yard/server/commands/list_command.rb +25 -25
  195. data/lib/yard/server/commands/root_request_command.rb +15 -15
  196. data/lib/yard/server/commands/search_command.rb +79 -79
  197. data/lib/yard/server/commands/static_file_command.rb +23 -23
  198. data/lib/yard/server/commands/static_file_helpers.rb +62 -62
  199. data/lib/yard/server/doc_server_helper.rb +91 -91
  200. data/lib/yard/server/doc_server_serializer.rb +39 -39
  201. data/lib/yard/server/library_version.rb +277 -277
  202. data/lib/yard/server/rack_adapter.rb +89 -89
  203. data/lib/yard/server/router.rb +187 -187
  204. data/lib/yard/server/static_caching.rb +46 -46
  205. data/lib/yard/server/templates/default/fulldoc/html/css/custom.css +127 -127
  206. data/lib/yard/server/templates/default/fulldoc/html/js/autocomplete.js +11 -11
  207. data/lib/yard/server/templates/default/layout/html/breadcrumb.erb +37 -37
  208. data/lib/yard/server/templates/default/layout/html/script_setup.erb +7 -7
  209. data/lib/yard/server/templates/default/layout/html/setup.rb +8 -8
  210. data/lib/yard/server/templates/default/method_details/html/permalink.erb +4 -4
  211. data/lib/yard/server/templates/default/method_details/html/setup.rb +5 -5
  212. data/lib/yard/server/templates/doc_server/library_list/html/headers.erb +8 -8
  213. data/lib/yard/server/templates/doc_server/library_list/html/library_list.erb +14 -14
  214. data/lib/yard/server/templates/doc_server/library_list/html/listing.erb +13 -13
  215. data/lib/yard/server/templates/doc_server/library_list/html/setup.rb +6 -6
  216. data/lib/yard/server/templates/doc_server/library_list/html/title.erb +2 -2
  217. data/lib/yard/server/templates/doc_server/processing/html/processing.erb +52 -52
  218. data/lib/yard/server/templates/doc_server/processing/html/setup.rb +4 -4
  219. data/lib/yard/server/templates/doc_server/search/html/search.erb +18 -18
  220. data/lib/yard/server/templates/doc_server/search/html/setup.rb +9 -9
  221. data/lib/yard/server/webrick_adapter.rb +45 -45
  222. data/lib/yard/tags/default_factory.rb +191 -191
  223. data/lib/yard/tags/default_tag.rb +13 -13
  224. data/lib/yard/tags/directives.rb +616 -616
  225. data/lib/yard/tags/library.rb +633 -633
  226. data/lib/yard/tags/option_tag.rb +13 -13
  227. data/lib/yard/tags/overload_tag.rb +71 -71
  228. data/lib/yard/tags/ref_tag.rb +8 -8
  229. data/lib/yard/tags/ref_tag_list.rb +28 -28
  230. data/lib/yard/tags/tag.rb +71 -71
  231. data/lib/yard/tags/tag_format_error.rb +7 -7
  232. data/lib/yard/tags/types_explainer.rb +162 -162
  233. data/lib/yard/templates/engine.rb +186 -186
  234. data/lib/yard/templates/erb_cache.rb +23 -23
  235. data/lib/yard/templates/helpers/base_helper.rb +215 -215
  236. data/lib/yard/templates/helpers/filter_helper.rb +27 -27
  237. data/lib/yard/templates/helpers/html_helper.rb +646 -646
  238. data/lib/yard/templates/helpers/html_syntax_highlight_helper.rb +78 -78
  239. data/lib/yard/templates/helpers/markup/rdoc_markdown.rb +23 -23
  240. data/lib/yard/templates/helpers/markup/rdoc_markup.rb +109 -109
  241. data/lib/yard/templates/helpers/markup_helper.rb +172 -172
  242. data/lib/yard/templates/helpers/method_helper.rb +75 -75
  243. data/lib/yard/templates/helpers/module_helper.rb +21 -21
  244. data/lib/yard/templates/helpers/text_helper.rb +112 -112
  245. data/lib/yard/templates/helpers/uml_helper.rb +47 -47
  246. data/lib/yard/templates/section.rb +105 -105
  247. data/lib/yard/templates/template.rb +418 -418
  248. data/lib/yard/templates/template_options.rb +92 -92
  249. data/lib/yard/verifier.rb +151 -151
  250. data/lib/yard/version.rb +6 -6
  251. data/spec/cli/command_parser_spec.rb +43 -43
  252. data/spec/cli/command_spec.rb +36 -36
  253. data/spec/cli/config_spec.rb +148 -148
  254. data/spec/cli/diff_spec.rb +254 -254
  255. data/spec/cli/display_spec.rb +30 -30
  256. data/spec/cli/gems_spec.rb +81 -81
  257. data/spec/cli/graph_spec.rb +18 -18
  258. data/spec/cli/help_spec.rb +22 -22
  259. data/spec/cli/i18n_spec.rb +107 -107
  260. data/spec/cli/list_spec.rb +8 -8
  261. data/spec/cli/markup_types_spec.rb +22 -22
  262. data/spec/cli/server_spec.rb +324 -324
  263. data/spec/cli/stats_spec.rb +96 -96
  264. data/spec/cli/yard_on_yard_spec.rb +38 -38
  265. data/spec/cli/yardoc_spec.rb +896 -862
  266. data/spec/cli/yri_spec.rb +101 -101
  267. data/spec/code_objects/base_spec.rb +470 -470
  268. data/spec/code_objects/class_object_spec.rb +226 -226
  269. data/spec/code_objects/code_object_list_spec.rb +36 -36
  270. data/spec/code_objects/constants_spec.rb +116 -116
  271. data/spec/code_objects/extra_file_object_spec.rb +160 -160
  272. data/spec/code_objects/macro_object_spec.rb +150 -150
  273. data/spec/code_objects/method_object_spec.rb +184 -184
  274. data/spec/code_objects/module_object_spec.rb +142 -142
  275. data/spec/code_objects/namespace_object_spec.rb +171 -171
  276. data/spec/code_objects/proxy_spec.rb +141 -141
  277. data/spec/code_objects/spec_helper.rb +3 -3
  278. data/spec/config_spec.rb +171 -171
  279. data/spec/core_ext/array_spec.rb +13 -13
  280. data/spec/core_ext/file_spec.rb +72 -72
  281. data/spec/core_ext/hash_spec.rb +14 -14
  282. data/spec/core_ext/insertion_spec.rb +37 -37
  283. data/spec/core_ext/module_spec.rb +9 -15
  284. data/spec/core_ext/string_spec.rb +42 -42
  285. data/spec/core_ext/symbol_hash_spec.rb +89 -89
  286. data/spec/docstring_parser_spec.rb +280 -280
  287. data/spec/docstring_spec.rb +373 -373
  288. data/spec/examples.txt +1883 -1875
  289. data/spec/handlers/alias_handler_spec.rb +82 -82
  290. data/spec/handlers/attribute_handler_spec.rb +96 -96
  291. data/spec/handlers/base_spec.rb +216 -216
  292. data/spec/handlers/c/alias_handler_spec.rb +34 -34
  293. data/spec/handlers/c/attribute_handler_spec.rb +41 -41
  294. data/spec/handlers/c/class_handler_spec.rb +78 -78
  295. data/spec/handlers/c/constant_handler_spec.rb +71 -71
  296. data/spec/handlers/c/init_handler_spec.rb +48 -48
  297. data/spec/handlers/c/method_handler_spec.rb +327 -325
  298. data/spec/handlers/c/mixin_handler_spec.rb +44 -44
  299. data/spec/handlers/c/module_handler_spec.rb +71 -71
  300. data/spec/handlers/c/override_comment_handler_spec.rb +47 -47
  301. data/spec/handlers/c/path_handler_spec.rb +36 -36
  302. data/spec/handlers/c/spec_helper.rb +23 -23
  303. data/spec/handlers/c/struct_handler_spec.rb +16 -16
  304. data/spec/handlers/class_condition_handler_spec.rb +87 -87
  305. data/spec/handlers/class_handler_spec.rb +247 -247
  306. data/spec/handlers/class_method_handler_shared_examples.rb +133 -133
  307. data/spec/handlers/class_variable_handler_spec.rb +12 -12
  308. data/spec/handlers/constant_handler_spec.rb +112 -112
  309. data/spec/handlers/decorator_handler_methods_spec.rb +393 -393
  310. data/spec/handlers/dsl_handler_spec.rb +219 -219
  311. data/spec/handlers/examples/alias_handler_001.rb.txt +45 -45
  312. data/spec/handlers/examples/attribute_handler_001.rb.txt +31 -31
  313. data/spec/handlers/examples/class_condition_handler_001.rb.txt +68 -68
  314. data/spec/handlers/examples/class_handler_001.rb.txt +120 -120
  315. data/spec/handlers/examples/class_variable_handler_001.rb.txt +9 -9
  316. data/spec/handlers/examples/constant_handler_001.rb.txt +35 -35
  317. data/spec/handlers/examples/dsl_handler_001.rb.txt +154 -154
  318. data/spec/handlers/examples/exception_handler_001.rb.txt +58 -58
  319. data/spec/handlers/examples/extend_handler_001.rb.txt +15 -15
  320. data/spec/handlers/examples/method_condition_handler_001.rb.txt +9 -9
  321. data/spec/handlers/examples/method_handler_001.rb.txt +128 -128
  322. data/spec/handlers/examples/mixin_handler_001.rb.txt +37 -37
  323. data/spec/handlers/examples/module_handler_001.rb.txt +29 -29
  324. data/spec/handlers/examples/private_constant_handler_001.rb.txt +8 -8
  325. data/spec/handlers/examples/process_handler_001.rb.txt +11 -11
  326. data/spec/handlers/examples/visibility_handler_001.rb.txt +35 -35
  327. data/spec/handlers/examples/yield_handler_001.rb.txt +54 -54
  328. data/spec/handlers/exception_handler_spec.rb +49 -49
  329. data/spec/handlers/extend_handler_spec.rb +24 -24
  330. data/spec/handlers/legacy_base_spec.rb +128 -128
  331. data/spec/handlers/method_condition_handler_spec.rb +15 -15
  332. data/spec/handlers/method_handler_spec.rb +190 -190
  333. data/spec/handlers/mixin_handler_spec.rb +56 -56
  334. data/spec/handlers/module_function_handler_spec.rb +106 -106
  335. data/spec/handlers/module_handler_spec.rb +35 -35
  336. data/spec/handlers/private_class_method_handler_spec.rb +11 -11
  337. data/spec/handlers/private_constant_handler_spec.rb +25 -25
  338. data/spec/handlers/processor_spec.rb +35 -35
  339. data/spec/handlers/public_class_method_handler_spec.rb +11 -11
  340. data/spec/handlers/ruby/base_spec.rb +95 -95
  341. data/spec/handlers/ruby/legacy/base_spec.rb +84 -84
  342. data/spec/handlers/spec_helper.rb +33 -33
  343. data/spec/handlers/visibility_handler_spec.rb +44 -44
  344. data/spec/handlers/yield_handler_spec.rb +52 -52
  345. data/spec/i18n/locale_spec.rb +81 -81
  346. data/spec/i18n/message_spec.rb +52 -52
  347. data/spec/i18n/messages_spec.rb +67 -67
  348. data/spec/i18n/pot_generator_spec.rb +295 -295
  349. data/spec/i18n/text_spec.rb +184 -184
  350. data/spec/logging_spec.rb +44 -44
  351. data/spec/options_spec.rb +171 -171
  352. data/spec/parser/base_spec.rb +24 -24
  353. data/spec/parser/c_parser_spec.rb +236 -236
  354. data/spec/parser/examples/array.c.txt +6267 -6267
  355. data/spec/parser/examples/example1.rb.txt +7 -7
  356. data/spec/parser/examples/extrafile.c.txt +8 -8
  357. data/spec/parser/examples/file.c.txt +28 -28
  358. data/spec/parser/examples/multifile.c.txt +22 -22
  359. data/spec/parser/examples/namespace.cpp.txt +68 -68
  360. data/spec/parser/examples/override.c.txt +424 -424
  361. data/spec/parser/examples/parse_in_order_001.rb.txt +2 -2
  362. data/spec/parser/examples/parse_in_order_002.rb.txt +1 -1
  363. data/spec/parser/examples/tag_handler_001.rb.txt +7 -7
  364. data/spec/parser/ruby/ast_node_spec.rb +33 -33
  365. data/spec/parser/ruby/legacy/statement_list_spec.rb +299 -299
  366. data/spec/parser/ruby/legacy/token_list_spec.rb +79 -79
  367. data/spec/parser/ruby/ruby_parser_spec.rb +508 -508
  368. data/spec/parser/ruby/token_resolver_spec.rb +165 -165
  369. data/spec/parser/source_parser_spec.rb +727 -727
  370. data/spec/parser/tag_parsing_spec.rb +17 -17
  371. data/spec/rake/yardoc_task_spec.rb +118 -118
  372. data/spec/registry_spec.rb +463 -463
  373. data/spec/registry_store_spec.rb +316 -316
  374. data/spec/rubygems/doc_manager_spec.rb +112 -112
  375. data/spec/serializers/data/serialized_yardoc/checksums +1 -1
  376. data/spec/serializers/file_system_serializer_spec.rb +145 -145
  377. data/spec/serializers/spec_helper.rb +2 -2
  378. data/spec/serializers/yardoc_serializer_spec.rb +78 -78
  379. data/spec/server/adapter_spec.rb +39 -39
  380. data/spec/server/commands/base_spec.rb +91 -91
  381. data/spec/server/commands/library_command_spec.rb +39 -39
  382. data/spec/server/doc_server_helper_spec.rb +72 -72
  383. data/spec/server/doc_server_serializer_spec.rb +60 -60
  384. data/spec/server/rack_adapter_spec.rb +21 -21
  385. data/spec/server/router_spec.rb +123 -123
  386. data/spec/server/spec_helper.rb +22 -22
  387. data/spec/server/static_caching_spec.rb +47 -47
  388. data/spec/server/webrick_servlet_spec.rb +20 -20
  389. data/spec/server_spec.rb +19 -19
  390. data/spec/spec_helper.rb +212 -212
  391. data/spec/tags/default_factory_spec.rb +168 -168
  392. data/spec/tags/default_tag_spec.rb +11 -11
  393. data/spec/tags/directives_spec.rb +463 -463
  394. data/spec/tags/library_spec.rb +48 -48
  395. data/spec/tags/overload_tag_spec.rb +53 -53
  396. data/spec/tags/ref_tag_list_spec.rb +53 -53
  397. data/spec/tags/types_explainer_spec.rb +203 -203
  398. data/spec/templates/class_spec.rb +45 -45
  399. data/spec/templates/constant_spec.rb +41 -41
  400. data/spec/templates/engine_spec.rb +131 -131
  401. data/spec/templates/examples/class001.html +308 -308
  402. data/spec/templates/examples/class001.txt +36 -36
  403. data/spec/templates/examples/class002.html +39 -39
  404. data/spec/templates/examples/constant001.txt +24 -24
  405. data/spec/templates/examples/constant002.txt +6 -6
  406. data/spec/templates/examples/constant003.txt +10 -10
  407. data/spec/templates/examples/method001.html +137 -137
  408. data/spec/templates/examples/method001.txt +35 -35
  409. data/spec/templates/examples/method002.html +91 -91
  410. data/spec/templates/examples/method002.txt +20 -20
  411. data/spec/templates/examples/method003.html +165 -165
  412. data/spec/templates/examples/method003.txt +45 -45
  413. data/spec/templates/examples/method004.html +48 -48
  414. data/spec/templates/examples/method004.txt +10 -10
  415. data/spec/templates/examples/method005.html +105 -105
  416. data/spec/templates/examples/method005.txt +33 -33
  417. data/spec/templates/examples/method006.html +107 -107
  418. data/spec/templates/examples/method006.txt +20 -20
  419. data/spec/templates/examples/module001.dot +33 -33
  420. data/spec/templates/examples/module001.html +833 -833
  421. data/spec/templates/examples/module001.txt +33 -33
  422. data/spec/templates/examples/module002.html +341 -341
  423. data/spec/templates/examples/module003.html +202 -202
  424. data/spec/templates/examples/module004.html +394 -394
  425. data/spec/templates/examples/module005.html +81 -81
  426. data/spec/templates/examples/tag001.txt +82 -82
  427. data/spec/templates/helpers/base_helper_spec.rb +171 -171
  428. data/spec/templates/helpers/html_helper_spec.rb +687 -668
  429. data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +65 -65
  430. data/spec/templates/helpers/markup/rdoc_markup_spec.rb +84 -84
  431. data/spec/templates/helpers/markup_helper_spec.rb +136 -136
  432. data/spec/templates/helpers/method_helper_spec.rb +107 -107
  433. data/spec/templates/helpers/module_helper_spec.rb +35 -35
  434. data/spec/templates/helpers/shared_signature_examples.rb +126 -126
  435. data/spec/templates/helpers/text_helper_spec.rb +65 -65
  436. data/spec/templates/method_spec.rb +118 -118
  437. data/spec/templates/module_spec.rb +203 -203
  438. data/spec/templates/onefile_spec.rb +66 -66
  439. data/spec/templates/section_spec.rb +144 -144
  440. data/spec/templates/spec_helper.rb +76 -76
  441. data/spec/templates/tag_spec.rb +52 -52
  442. data/spec/templates/template_spec.rb +410 -410
  443. data/spec/verifier_spec.rb +106 -106
  444. data/templates/default/class/dot/setup.rb +7 -7
  445. data/templates/default/class/dot/superklass.erb +2 -2
  446. data/templates/default/class/html/constructor_details.erb +8 -8
  447. data/templates/default/class/html/setup.rb +2 -2
  448. data/templates/default/class/html/subclasses.erb +4 -4
  449. data/templates/default/class/setup.rb +36 -36
  450. data/templates/default/class/text/setup.rb +12 -12
  451. data/templates/default/class/text/subclasses.erb +5 -5
  452. data/templates/default/constant/text/header.erb +11 -11
  453. data/templates/default/constant/text/setup.rb +4 -4
  454. data/templates/default/docstring/html/abstract.erb +4 -4
  455. data/templates/default/docstring/html/deprecated.erb +1 -1
  456. data/templates/default/docstring/html/index.erb +5 -5
  457. data/templates/default/docstring/html/note.erb +6 -6
  458. data/templates/default/docstring/html/private.erb +4 -4
  459. data/templates/default/docstring/html/text.erb +1 -1
  460. data/templates/default/docstring/html/todo.erb +6 -6
  461. data/templates/default/docstring/setup.rb +52 -52
  462. data/templates/default/docstring/text/abstract.erb +2 -2
  463. data/templates/default/docstring/text/deprecated.erb +2 -2
  464. data/templates/default/docstring/text/index.erb +2 -2
  465. data/templates/default/docstring/text/note.erb +3 -3
  466. data/templates/default/docstring/text/private.erb +2 -2
  467. data/templates/default/docstring/text/text.erb +1 -1
  468. data/templates/default/docstring/text/todo.erb +3 -3
  469. data/templates/default/fulldoc/html/css/full_list.css +58 -58
  470. data/templates/default/fulldoc/html/css/style.css +496 -496
  471. data/templates/default/fulldoc/html/frames.erb +17 -17
  472. data/templates/default/fulldoc/html/full_list.erb +37 -37
  473. data/templates/default/fulldoc/html/full_list_class.erb +2 -2
  474. data/templates/default/fulldoc/html/full_list_file.erb +7 -7
  475. data/templates/default/fulldoc/html/full_list_method.erb +10 -10
  476. data/templates/default/fulldoc/html/js/app.js +303 -292
  477. data/templates/default/fulldoc/html/js/full_list.js +216 -216
  478. data/templates/default/fulldoc/html/js/jquery.js +3 -3
  479. data/templates/default/fulldoc/html/setup.rb +241 -241
  480. data/templates/default/layout/dot/header.erb +5 -5
  481. data/templates/default/layout/dot/setup.rb +15 -15
  482. data/templates/default/layout/html/breadcrumb.erb +11 -11
  483. data/templates/default/layout/html/files.erb +11 -11
  484. data/templates/default/layout/html/footer.erb +5 -5
  485. data/templates/default/layout/html/headers.erb +15 -15
  486. data/templates/default/layout/html/index.erb +2 -2
  487. data/templates/default/layout/html/layout.erb +23 -23
  488. data/templates/default/layout/html/listing.erb +4 -4
  489. data/templates/default/layout/html/objects.erb +32 -32
  490. data/templates/default/layout/html/script_setup.erb +4 -4
  491. data/templates/default/layout/html/search.erb +12 -12
  492. data/templates/default/layout/html/setup.rb +89 -89
  493. data/templates/default/method/html/header.erb +16 -16
  494. data/templates/default/method/setup.rb +4 -4
  495. data/templates/default/method_details/html/header.erb +2 -2
  496. data/templates/default/method_details/html/method_signature.erb +24 -24
  497. data/templates/default/method_details/html/source.erb +9 -9
  498. data/templates/default/method_details/setup.rb +11 -11
  499. data/templates/default/method_details/text/header.erb +10 -10
  500. data/templates/default/method_details/text/method_signature.erb +12 -12
  501. data/templates/default/method_details/text/setup.rb +11 -11
  502. data/templates/default/module/dot/child.erb +1 -1
  503. data/templates/default/module/dot/dependencies.erb +2 -2
  504. data/templates/default/module/dot/header.erb +6 -6
  505. data/templates/default/module/dot/info.erb +13 -13
  506. data/templates/default/module/dot/setup.rb +15 -15
  507. data/templates/default/module/html/attribute_details.erb +10 -10
  508. data/templates/default/module/html/attribute_summary.erb +8 -8
  509. data/templates/default/module/html/box_info.erb +43 -43
  510. data/templates/default/module/html/children.erb +8 -8
  511. data/templates/default/module/html/constant_summary.erb +17 -17
  512. data/templates/default/module/html/defines.erb +2 -2
  513. data/templates/default/module/html/header.erb +5 -5
  514. data/templates/default/module/html/inherited_attributes.erb +14 -14
  515. data/templates/default/module/html/inherited_constants.erb +8 -8
  516. data/templates/default/module/html/inherited_methods.erb +18 -18
  517. data/templates/default/module/html/item_summary.erb +40 -40
  518. data/templates/default/module/html/method_details_list.erb +9 -9
  519. data/templates/default/module/html/method_summary.erb +13 -13
  520. data/templates/default/module/html/methodmissing.erb +12 -12
  521. data/templates/default/module/setup.rb +167 -167
  522. data/templates/default/module/text/children.erb +9 -9
  523. data/templates/default/module/text/class_meths_list.erb +7 -7
  524. data/templates/default/module/text/extends.erb +7 -7
  525. data/templates/default/module/text/header.erb +7 -7
  526. data/templates/default/module/text/includes.erb +7 -7
  527. data/templates/default/module/text/instance_meths_list.erb +7 -7
  528. data/templates/default/module/text/setup.rb +13 -13
  529. data/templates/default/onefile/html/files.erb +4 -4
  530. data/templates/default/onefile/html/headers.erb +6 -6
  531. data/templates/default/onefile/html/layout.erb +17 -17
  532. data/templates/default/onefile/html/readme.erb +2 -2
  533. data/templates/default/onefile/html/setup.rb +62 -62
  534. data/templates/default/root/dot/child.erb +2 -2
  535. data/templates/default/root/dot/setup.rb +6 -6
  536. data/templates/default/root/html/setup.rb +2 -2
  537. data/templates/default/tags/html/example.erb +10 -10
  538. data/templates/default/tags/html/index.erb +2 -2
  539. data/templates/default/tags/html/option.erb +24 -24
  540. data/templates/default/tags/html/overload.erb +13 -13
  541. data/templates/default/tags/html/see.erb +7 -7
  542. data/templates/default/tags/html/tag.erb +20 -20
  543. data/templates/default/tags/setup.rb +57 -57
  544. data/templates/default/tags/text/example.erb +12 -12
  545. data/templates/default/tags/text/index.erb +1 -1
  546. data/templates/default/tags/text/option.erb +20 -20
  547. data/templates/default/tags/text/overload.erb +19 -19
  548. data/templates/default/tags/text/see.erb +11 -11
  549. data/templates/default/tags/text/tag.erb +13 -13
  550. data/templates/guide/class/html/setup.rb +2 -2
  551. data/templates/guide/docstring/html/setup.rb +2 -2
  552. data/templates/guide/fulldoc/html/css/style.css +108 -108
  553. data/templates/guide/fulldoc/html/js/app.js +33 -33
  554. data/templates/guide/fulldoc/html/setup.rb +74 -74
  555. data/templates/guide/layout/html/layout.erb +81 -81
  556. data/templates/guide/layout/html/setup.rb +25 -25
  557. data/templates/guide/method/html/header.erb +17 -17
  558. data/templates/guide/method/html/setup.rb +22 -22
  559. data/templates/guide/module/html/header.erb +6 -6
  560. data/templates/guide/module/html/method_list.erb +4 -4
  561. data/templates/guide/module/html/setup.rb +27 -27
  562. data/templates/guide/onefile/html/files.erb +4 -4
  563. data/templates/guide/onefile/html/setup.rb +6 -6
  564. data/templates/guide/onefile/html/toc.erb +3 -3
  565. data/templates/guide/tags/html/setup.rb +9 -9
  566. data/yard.gemspec +43 -43
  567. metadata +4 -3
@@ -1,633 +1,633 @@
1
- # frozen_string_literal: true
2
- module YARD
3
- module Tags
4
- # Keeps track of all the registered meta-data tags and directives.
5
- # Also allows for defining of custom tags and customizing the tag parsing
6
- # syntax.
7
- #
8
- # == Defining Custom Meta-Data Tags
9
- #
10
- # To define a custom tag, use {define_tag}. You should pass the tag
11
- # name and the factory method to use when creating the tag. If you do not
12
- # provide a factory method to use, it will default to {DefaultFactory#parse_tag}
13
- #
14
- # You can also define tag objects manually by simply implementing a "tagname_tag"
15
- # method that returns a {Tag} object, but they will not take advantage of tag factory
16
- # parsing:
17
- #
18
- # def mytag_tag(text)
19
- # Tag.new(:mytag, text)
20
- # end
21
- #
22
- # == Defining Custom Directives
23
- #
24
- # Directives can be defined by calling the {define_directive} method, taking
25
- # the directive name, an optional tag factory parser method (to parse the
26
- # data in the directive into a temporary {Tag} object) and a {Directive} subclass
27
- # that performs the directive processing. For more information on creating a
28
- # Directive subclass, see the {Directive} class documentation.
29
- #
30
- # Similar to tags, Directives can also be defined manually, in this case using
31
- # the method name "mydirective_directive" and returning a new {Directive} object:
32
- #
33
- # def mydirective_directive(tag, parser)
34
- # MyDirective.new(tag, parser)
35
- # end
36
- #
37
- # == Namespaced Tags
38
- #
39
- # In YARD 0.8.0+, tags can be namespaced using the '.' character. It is recommended
40
- # to namespace project specific tags, like +@yard.tag_name+, so that tags do not
41
- # collide with other plugins or new built-in tags.
42
- #
43
- # == Adding/Changing the Tag Syntax
44
- #
45
- # If you have specialized tag parsing needs you can substitute the {#factory}
46
- # object with your own by setting {Library.default_factory= Library.default_factory}
47
- # to a new class with its own parsing methods before running YARD. This is useful
48
- # if you want to change the syntax of existing tags (@see, @since, etc.)
49
- #
50
- # @example Defining a custom tag
51
- # define_tag "Parameter", :param, :with_types_and_name
52
- # define_tag "Author", :author
53
- # @example Defining a custom directive
54
- # define_directive :method, :with_title_and_text, MethodDirective
55
- # @see DefaultFactory
56
- # @see define_tag
57
- # @see define_directive
58
- # @see Directive
59
- class Library
60
- class << self
61
- # @return [SymbolHash{Symbol=>String}] the map of tag names and their
62
- # respective display labels.
63
- attr_reader :labels
64
-
65
- # @!attribute instance
66
- # @return [Library] the main Library instance object.
67
- def instance
68
- @instance ||= new
69
- end
70
-
71
- # @!attribute default_factory
72
- # Replace the factory object responsible for parsing tags by setting
73
- # this to an object (or class) that responds to +parse_TAGNAME+ methods
74
- # where +TAGNAME+ is the name of the tag.
75
- #
76
- # You should set this value before performing any source parsing with
77
- # YARD, otherwise your factory class will not be used.
78
- #
79
- # @example
80
- # YARD::Tags::Library.default_factory = MyFactory
81
- #
82
- # @see DefaultFactory
83
- def default_factory
84
- @default_factory ||= DefaultFactory.new
85
- end
86
-
87
- def default_factory=(factory)
88
- @default_factory = factory.is_a?(Class) ? factory.new : factory
89
- end
90
-
91
- # Returns the factory method used to parse the tag text for a specific tag
92
- #
93
- # @param [Symbol] tag the tag name
94
- # @return [Symbol] the factory method name for the tag
95
- # @return [Class<Tag>,Symbol] the Tag class to use to parse the tag
96
- # or the method to call on the factory class
97
- # @return [nil] if the tag is freeform text
98
- # @since 0.6.0
99
- def factory_method_for(tag)
100
- @factory_methods[tag]
101
- end
102
-
103
- # Returns the factory method used to parse the tag text for a specific
104
- # directive
105
- #
106
- # @param [Symbol] directive the directive name
107
- # @return [Symbol] the factory method name for the tag
108
- # @return [Class<Tag>,Symbol] the Tag class to use to parse the tag or
109
- # the methods to call on the factory class
110
- # @return [nil] if the tag is freeform text
111
- # @since 0.8.0
112
- def factory_method_for_directive(directive)
113
- @directive_factory_classes[directive]
114
- end
115
-
116
- # Sets the list of tags to display when rendering templates. The order of
117
- # tags in the list is also significant, as it represents the order that
118
- # tags are displayed in templates.
119
- #
120
- # You can use the {Array#place} to insert new tags to be displayed in
121
- # the templates at specific positions:
122
- #
123
- # Library.visible_tags.place(:mytag).before(:return)
124
- #
125
- # @return [Array<Symbol>] a list of ordered tags
126
- # @since 0.6.0
127
- attr_accessor :visible_tags
128
-
129
- # Sets the list of tags that should apply to any children inside the
130
- # namespace they are defined in. For instance, a "@since" tag should
131
- # apply to all methods inside a module it is defined in. Transitive
132
- # tags can be overridden by directly defining a tag on the child object.
133
- #
134
- # @return [Array<Symbol>] a list of transitive tags
135
- # @since 0.6.0
136
- attr_accessor :transitive_tags
137
-
138
- # Sorts the labels lexically by their label name, often used when displaying
139
- # the tags.
140
- #
141
- # @return [Array<Symbol>, String] the sorted labels as an array of the tag name and label
142
- def sorted_labels
143
- labels.sort_by {|a| a.last.downcase }
144
- end
145
-
146
- # Convenience method to define a new tag using one of {Tag}'s factory methods, or the
147
- # regular {DefaultFactory#parse_tag} factory method if none is supplied.
148
- #
149
- # @!macro [attach] yard.tag
150
- # @!method $2_tag
151
- # @!visibility private
152
- # @yard.tag $2 [$3] $1
153
- # @param [#to_s] label the label used when displaying the tag in templates
154
- # @param [#to_s] tag the tag name to create
155
- # @param [#to_s, Class<Tag>] meth the {Tag} factory method to call when
156
- # creating the tag or the name of the class to directly create a tag for
157
- def define_tag(label, tag, meth = nil)
158
- tag_meth = tag_method_name(tag)
159
- if meth.is_a?(Class) && Tag > meth
160
- class_eval(<<-eof, __FILE__, __LINE__ + 1)
161
- def #{tag_meth}(text)
162
- #{meth}.new(#{tag.inspect}, text)
163
- end
164
- eof
165
- else
166
- class_eval(<<-eof, __FILE__, __LINE__ + 1)
167
- begin; undef #{tag_meth}; rescue NameError; end
168
- def #{tag_meth}(text)
169
- send_to_factory(#{tag.inspect}, #{meth.inspect}, text)
170
- end
171
- eof
172
- end
173
-
174
- @labels ||= SymbolHash.new(false)
175
- @labels.update(tag => label)
176
- @factory_methods ||= SymbolHash.new(false)
177
- @factory_methods.update(tag => meth)
178
- tag
179
- end
180
-
181
- # @macro [attach] yard.directive
182
- # @!method $1_directive
183
- # @!visibility private
184
- # @yard.directive $1 [$2] $-1
185
- # @overload define_directive(tag, tag_meth = nil, directive_class)
186
- # Convenience method to define a new directive using a {Tag} factory
187
- # method and {Directive} subclass that implements the directive
188
- # callbacks.
189
- #
190
- # @param [#to_s] tag the tag name of the directive
191
- # @param [#to_s] tag_meth the tag factory method to use when
192
- # parsing tag information
193
- # @param [Class<Directive>] the directive class that implements the
194
- # directive behaviour
195
- # @see define_tag
196
- def define_directive(tag, tag_meth = nil, directive_class = nil)
197
- directive_meth = directive_method_name(tag)
198
- if directive_class.nil?
199
- directive_class = tag_meth
200
- tag_meth = nil
201
- end
202
- class_eval <<-eof, __FILE__, __LINE__
203
- def #{directive_meth}(tag, parser)
204
- directive_call(tag, parser)
205
- end
206
- eof
207
-
208
- @factory_methods ||= SymbolHash.new(false)
209
- @factory_methods.update(tag => tag_meth)
210
- @directive_factory_classes ||= SymbolHash.new(false)
211
- @directive_factory_classes.update(tag => directive_class)
212
-
213
- tag
214
- end
215
-
216
- def tag_method_name(tag_name)
217
- tag_or_directive_method_name(tag_name)
218
- end
219
-
220
- def directive_method_name(tag_name)
221
- tag_or_directive_method_name(tag_name, 'directive')
222
- end
223
-
224
- private
225
-
226
- def tag_or_directive_method_name(tag_name, type = 'tag')
227
- "#{tag_name.to_s.tr('.', '_')}_#{type}"
228
- end
229
- end
230
-
231
- private
232
-
233
- def send_to_factory(tag_name, meth, text)
234
- meth = meth.to_s
235
- send_name = "parse_tag" + (meth.empty? ? "" : "_" + meth)
236
- if @factory.respond_to?(send_name)
237
- @factory.send(send_name, tag_name, text)
238
- else
239
- raise NoMethodError, "Factory #{@factory.class_name} does not implement factory method :#{meth}."
240
- end
241
- end
242
-
243
- # @return [Directive]
244
- def directive_call(tag, parser)
245
- meth = self.class.factory_method_for_directive(tag.tag_name)
246
- if meth <= Directive
247
- meth = meth.new(tag, parser)
248
- meth.call
249
- meth
250
- else
251
- meth.call(tag, parser)
252
- end
253
- end
254
-
255
- public
256
-
257
- # A factory class to handle parsing of tags, defaults to {default_factory}
258
- attr_accessor :factory
259
-
260
- def initialize(factory = Library.default_factory)
261
- self.factory = factory
262
- end
263
-
264
- # @param [#to_s] tag_name the name of the tag to look for
265
- # @return [Boolean] whether a tag by the given name is registered in
266
- # the library.
267
- def has_tag?(tag_name)
268
- tag_name && respond_to?(self.class.tag_method_name(tag_name))
269
- end
270
-
271
- # Creates a new {Tag} object with a given tag name and data
272
- # @return [Tag] the newly created tag object
273
- def tag_create(tag_name, tag_buf)
274
- send(self.class.tag_method_name(tag_name), tag_buf)
275
- end
276
-
277
- # @param [#to_s] tag_name the name of the tag to look for
278
- # @return [Boolean] whether a directive by the given name is registered in
279
- # the library.
280
- def has_directive?(tag_name)
281
- tag_name && respond_to?(self.class.directive_method_name(tag_name))
282
- end
283
-
284
- # Creates a new directive with tag information and a docstring parser
285
- # object.
286
- # @param [String] tag_name the name of the tag
287
- # @param [String] tag_buf the tag data
288
- # @param [DocstringParser] parser the parser object parsing the docstring
289
- # @return [Directive] the newly created directive
290
- def directive_create(tag_name, tag_buf, parser)
291
- meth = self.class.factory_method_for(tag_name)
292
- tag = send_to_factory(tag_name, meth, tag_buf)
293
- meth = self.class.directive_method_name(tag_name)
294
- send(meth, tag, parser)
295
- end
296
-
297
- # @!macro yard.tag.transitive
298
- # @note This tag is *transitive*. If it is applied on a
299
- # namespace (module or class), it will immediately be
300
- # applied to all children objects of that namespace unless
301
- # it is redefined on the child object.
302
-
303
- # Marks a class/module/method as abstract with optional
304
- # implementor information.
305
- #
306
- # @example
307
- # # @abstract Subclass and override {#run} to implement
308
- # # a custom Threadable class.
309
- # class Runnable
310
- # def run; raise NotImplementedError end
311
- # end
312
- define_tag "Abstract", :abstract
313
-
314
- # Declares the API that the object belongs to. Does not display in
315
- # output, but useful for performing queries (+yardoc --query+). Any text is
316
- # allowable in this tag, and there are no predefined values.
317
- #
318
- # @!macro yard.tag.transitive
319
- # @note The special name +@api private+ does display a notice in
320
- # documentation if it is listed, letting users know that the
321
- # method is not to be used by external components.
322
- # @example
323
- # class Post
324
- # # @api private
325
- # def reset_table!; table.flush end
326
- # end
327
- define_tag "API Visibility", :api
328
-
329
- # Declares a readwrite attribute on a Struct or class.
330
- #
331
- # @note This attribute is only applicable on class docstrings
332
- # @deprecated Use the more powerful {tag:!attribute} directive instead.
333
- # @example
334
- # # @attr [String] name the name of the structure
335
- # # @attr [Fixnum] size the size of the structure
336
- # class MyStruct < Struct; end
337
- define_tag "Attribute", :attr, :with_types_and_name
338
-
339
- # Declares a readonly attribute on a Struct or class.
340
- #
341
- # @note This attribute is only applicable on class docstrings
342
- # @deprecated Use the more powerful {tag:!attribute} directive instead.
343
- # @example
344
- # # @attr_reader [String] name the name of the structure
345
- # # @attr_reader [Fixnum] size the size of the structure
346
- # class MyStruct < Struct; end
347
- define_tag "Attribute Getter", :attr_reader, :with_types_and_name
348
-
349
- # Declares a writeonly attribute on a Struct or class.
350
- #
351
- # @note This attribute is only applicable on class docstrings
352
- # @deprecated Use the more powerful {tag:!attribute} directive instead.
353
- # @example
354
- # # @attr_reader [String] name the name of the structure
355
- # # @attr_reader [Fixnum] size the size of the structure
356
- # class MyStruct < Struct; end
357
- define_tag "Attribute Setter", :attr_writer, :with_types_and_name
358
-
359
- # List the author or authors of a class, module, or method.
360
- #
361
- # @example
362
- # # @author Foo Bar <foo@bar.com>
363
- # class MyClass; end
364
- define_tag "Author", :author
365
-
366
- # Marks a method/class as deprecated with an optional description.
367
- # The description should be used to inform users of the recommended
368
- # migration path, and/or any useful information about why the object
369
- # was marked as deprecated.
370
- #
371
- # @example Deprecate a method with a replacement API
372
- # # @deprecated Use {#bar} instead.
373
- # def foo; end
374
- # @example Deprecate a method with no replacement
375
- # class Thread
376
- # # @deprecated Exiting a thread in this way is not reliable and
377
- # # can cause a program crash.
378
- # def kill; end
379
- # end
380
- define_tag "Deprecated", :deprecated
381
-
382
- # Show an example snippet of code for an object. The first line
383
- # is an optional title.
384
- #
385
- # @example
386
- # # @example Reverse a String
387
- # # "mystring".reverse #=> "gnirtsym"
388
- # def reverse; end
389
- # @yard.signature Optional title
390
- # Code block
391
- define_tag "Example", :example, :with_title_and_text
392
-
393
- # Adds an emphasized note at the top of the docstring for the object
394
- #
395
- # @example
396
- # # @note This method should only be used in outer space.
397
- # def eject; end
398
- # @see tag:todo
399
- define_tag "Note", :note
400
-
401
- # Describe an options hash in a method. The tag takes the
402
- # name of the options parameter first, followed by optional types,
403
- # the option key name, a default value for the key and a
404
- # description of the option. The default value should be placed within
405
- # parentheses and is optional (can be omitted).
406
- #
407
- # Note that a +@param+ tag need not be defined for the options
408
- # hash itself, though it is useful to do so for completeness.
409
- #
410
- # @note For keyword parameters, use +@param+, not +@option+.
411
- #
412
- # @example
413
- # # @param [Hash] opts the options to create a message with.
414
- # # @option opts [String] :subject The subject
415
- # # @option opts [String] :from ('nobody') From address
416
- # # @option opts [String] :to Recipient email
417
- # # @option opts [String] :body ('') The email's body
418
- # def send_email(opts = {}) end
419
- # @yard.signature name [Types] option_key (default_value) description
420
- define_tag "Options Hash", :option, :with_options
421
-
422
- # Describe that your method can be used in various
423
- # contexts with various parameters or return types. The first
424
- # line should declare the new method signature, and the following
425
- # indented tag data will be a new documentation string with its
426
- # own tags adding metadata for such an overload.
427
- #
428
- # @example
429
- # # @overload set(key, value)
430
- # # Sets a value on key
431
- # # @param key [Symbol] describe key param
432
- # # @param value [Object] describe value param
433
- # # @overload set(value)
434
- # # Sets a value on the default key +:foo+
435
- # # @param value [Object] describe value param
436
- # def set(*args) end
437
- # @yard.signature method_signature(parameters)
438
- # Indented docstring for overload method
439
- define_tag "Overloads", :overload, OverloadTag
440
-
441
- # Documents a single method parameter (either regular or keyword) with a given name, type
442
- # and optional description.
443
- #
444
- # @example
445
- # # @param url [String] the URL of the page to download
446
- # # @param directory [String] the name of the directory to save to
447
- # def load_page(url, directory: 'pages') end
448
- define_tag "Parameters", :param, :with_types_and_name
449
-
450
- # Declares that the _logical_ visibility of an object is private.
451
- # In other words, it specifies that this method should be marked
452
- # private but cannot due to Ruby's visibility restrictions. This
453
- # exists for classes, modules and constants that do not obey Ruby's
454
- # visibility rules. For instance, an inner class might be considered
455
- # "private", though Ruby would make no such distinction.
456
- #
457
- # This tag is meant to be used in conjunction with the +--no-private+
458
- # command-line option, and is required to actually remove these objects
459
- # from documentation output. See {file:README.md} for more information on
460
- # switches.
461
- #
462
- # If you simply want to set the API visibility of a method, you should
463
- # look at the {tag:api} tag instead.
464
- #
465
- # @note This method is not recommended for hiding undocumented or
466
- # "unimportant" methods. This tag should only be used to mark objects
467
- # private when Ruby visibility rules cannot do so. In Ruby 1.9.3, you
468
- # can use +private_constant+ to declare constants (like classes or
469
- # modules) as private, and should be used instead of +@private+.
470
- # @macro yard.tag.transitive
471
- # @example
472
- # # @private
473
- # class InteralImplementation; end
474
- # @see tag:api
475
- # @yard.signature
476
- define_tag "Private", :private
477
-
478
- # Describes that a method may raise a given exception, with
479
- # an optional description of what it may mean.
480
- #
481
- # @example
482
- # # @raise [AccountBalanceError] if the account does not have
483
- # # sufficient funds to perform the transaction
484
- # def withdraw(amount) end
485
- define_tag "Raises", :raise, :with_types
486
-
487
- # Describes the return value (and type or types) of a method.
488
- # You can list multiple return tags for a method in the case
489
- # where a method has distinct return cases. In this case, each
490
- # case should begin with "if ...".
491
- #
492
- # @example A regular return value
493
- # # @return [Fixnum] the size of the file
494
- # def size; @file.size end
495
- # @example A method returns an Array or a single object
496
- # # @return [String] if a single object was returned
497
- # # from the database.
498
- # # @return [Array<String>] if multiple objects were
499
- # # returned.
500
- # def find(query) end
501
- define_tag "Returns", :return, :with_types
502
-
503
- # "See Also" references for an object. Accepts URLs or
504
- # other code objects with an optional description at the end.
505
- # Note that the URL or object will be automatically linked by
506
- # YARD and does not need to be formatted with markup.
507
- #
508
- # @example
509
- # # Synchronizes system time using NTP.
510
- # # @see http://ntp.org/documentation.html NTP Documentation
511
- # # @see NTPHelperMethods
512
- # class NTPUpdater; end
513
- define_tag "See Also", :see, :with_name
514
-
515
- # Lists the version that the object was first added.
516
- #
517
- # @!macro yard.tag.transitive
518
- # @example
519
- # # @since 1.2.4
520
- # def clear_routes; end
521
- define_tag "Since", :since
522
-
523
- # Marks a TODO note in the object being documented.
524
- # For reference, objects with TODO items can be enumerated
525
- # from the command line with a simple command:
526
- #
527
- # !!!sh
528
- # mocker$ yard list --query '@todo'
529
- # lib/mocker/mocker.rb:15: Mocker
530
- # lib/mocker/report/html.rb:5: Mocker::Report::Html
531
- #
532
- # YARD can also be used to enumerate the TODO items from
533
- # a short script:
534
- #
535
- # !!!ruby
536
- # require 'yard'
537
- # YARD::Registry.load!.all.each do |o|
538
- # puts o.tag(:todo).text if o.tag(:todo)
539
- # end
540
- #
541
- # @example
542
- # # @todo Add support for Jabberwocky service.
543
- # # There is an open source Jabberwocky library available
544
- # # at http://jbrwcky.org that can be easily integrated.
545
- # class Wonderlander; end
546
- # @see tag:note
547
- define_tag "Todo Item", :todo
548
-
549
- # Lists the version of a class, module or method. This is
550
- # similar to a library version, but at finer granularity.
551
- # In some cases, version of specific modules, classes, methods
552
- # or generalized components might change independently between
553
- # releases. A version tag is used to infer the API compatibility
554
- # of a specific object.
555
- #
556
- # @example
557
- # # The public REST API for http://jbrwcky.org
558
- # # @version 2.0
559
- # class JabberwockyAPI; end
560
- define_tag "Version", :version
561
-
562
- # Describes what a method might yield to a given block.
563
- # The types specifier list should not list types, but names
564
- # of the parameters yielded to the block. If you define
565
- # parameters with +@yieldparam+, you do not need to define
566
- # the parameters in the type specification of +@yield+ as
567
- # well.
568
- #
569
- # @example
570
- # # For a block {|a,b,c| ... }
571
- # # @yield [a, b, c] Gives 3 random numbers to the block
572
- # def provide3values(&block) yield(42, 42, 42) end
573
- # @see tag:yieldparam
574
- # @see tag:yieldreturn
575
- # @yard.signature [parameters] description
576
- define_tag "Yields", :yield, :with_types
577
-
578
- # Defines a parameter yielded by a block. If you define the
579
- # parameters with +@yieldparam+, you do not need to define
580
- # them via +@yield+ as well.
581
- #
582
- # @example
583
- # # @yieldparam [String] name the name that is yielded
584
- # def with_name(name) yield(name) end
585
- define_tag "Yield Parameters", :yieldparam, :with_types_and_name
586
-
587
- # Documents the value and type that the block is expected
588
- # to return to the method.
589
- #
590
- # @example
591
- # # @yieldreturn [Fixnum] the number to add 5 to.
592
- # def add5_block(&block) 5 + yield end
593
- # @see tag:return
594
- define_tag "Yield Returns", :yieldreturn, :with_types
595
-
596
- # @yard.signature [r | w | rw] attribute_name
597
- # Indented attribute docstring
598
- define_directive :attribute, :with_types_and_title, AttributeDirective
599
-
600
- # @yard.signature
601
- define_directive :endgroup, EndGroupDirective
602
-
603
- define_directive :group, GroupDirective
604
-
605
- # @yard.signature [attach | new] optional_name
606
- # Optional macro expansion data
607
- define_directive :macro, :with_types_and_title, MacroDirective
608
-
609
- # @yard.signature method_signature(parameters)
610
- # Indented method docstring
611
- define_directive :method, :with_title_and_text, MethodDirective
612
-
613
- # @yard.signature [language] code
614
- define_directive :parse, :with_types, ParseDirective
615
-
616
- # Sets the scope of a DSL method. Only applicable to DSL method
617
- # calls. Acceptable values are 'class' or 'instance'
618
- # @yard.signature class | instance
619
- define_directive :scope, ScopeDirective
620
-
621
- # Sets the visibility of a DSL method. Only applicable to
622
- # DSL method calls. Acceptable values are public, protected, or private.
623
- # @yard.signature public | protected | private
624
- define_directive :visibility, VisibilityDirective
625
-
626
- self.visible_tags = [:abstract, :deprecated, :note, :todo, :example, :overload,
627
- :param, :option, :yield, :yieldparam, :yieldreturn, :return, :raise,
628
- :see, :author, :since, :version]
629
-
630
- self.transitive_tags = [:since, :api]
631
- end
632
- end
633
- end
1
+ # frozen_string_literal: true
2
+ module YARD
3
+ module Tags
4
+ # Keeps track of all the registered meta-data tags and directives.
5
+ # Also allows for defining of custom tags and customizing the tag parsing
6
+ # syntax.
7
+ #
8
+ # == Defining Custom Meta-Data Tags
9
+ #
10
+ # To define a custom tag, use {define_tag}. You should pass the tag
11
+ # name and the factory method to use when creating the tag. If you do not
12
+ # provide a factory method to use, it will default to {DefaultFactory#parse_tag}
13
+ #
14
+ # You can also define tag objects manually by simply implementing a "tagname_tag"
15
+ # method that returns a {Tag} object, but they will not take advantage of tag factory
16
+ # parsing:
17
+ #
18
+ # def mytag_tag(text)
19
+ # Tag.new(:mytag, text)
20
+ # end
21
+ #
22
+ # == Defining Custom Directives
23
+ #
24
+ # Directives can be defined by calling the {define_directive} method, taking
25
+ # the directive name, an optional tag factory parser method (to parse the
26
+ # data in the directive into a temporary {Tag} object) and a {Directive} subclass
27
+ # that performs the directive processing. For more information on creating a
28
+ # Directive subclass, see the {Directive} class documentation.
29
+ #
30
+ # Similar to tags, Directives can also be defined manually, in this case using
31
+ # the method name "mydirective_directive" and returning a new {Directive} object:
32
+ #
33
+ # def mydirective_directive(tag, parser)
34
+ # MyDirective.new(tag, parser)
35
+ # end
36
+ #
37
+ # == Namespaced Tags
38
+ #
39
+ # In YARD 0.8.0+, tags can be namespaced using the '.' character. It is recommended
40
+ # to namespace project specific tags, like +@yard.tag_name+, so that tags do not
41
+ # collide with other plugins or new built-in tags.
42
+ #
43
+ # == Adding/Changing the Tag Syntax
44
+ #
45
+ # If you have specialized tag parsing needs you can substitute the {#factory}
46
+ # object with your own by setting {Library.default_factory= Library.default_factory}
47
+ # to a new class with its own parsing methods before running YARD. This is useful
48
+ # if you want to change the syntax of existing tags (@see, @since, etc.)
49
+ #
50
+ # @example Defining a custom tag
51
+ # define_tag "Parameter", :param, :with_types_and_name
52
+ # define_tag "Author", :author
53
+ # @example Defining a custom directive
54
+ # define_directive :method, :with_title_and_text, MethodDirective
55
+ # @see DefaultFactory
56
+ # @see define_tag
57
+ # @see define_directive
58
+ # @see Directive
59
+ class Library
60
+ class << self
61
+ # @return [SymbolHash{Symbol=>String}] the map of tag names and their
62
+ # respective display labels.
63
+ attr_reader :labels
64
+
65
+ # @!attribute instance
66
+ # @return [Library] the main Library instance object.
67
+ def instance
68
+ @instance ||= new
69
+ end
70
+
71
+ # @!attribute default_factory
72
+ # Replace the factory object responsible for parsing tags by setting
73
+ # this to an object (or class) that responds to +parse_TAGNAME+ methods
74
+ # where +TAGNAME+ is the name of the tag.
75
+ #
76
+ # You should set this value before performing any source parsing with
77
+ # YARD, otherwise your factory class will not be used.
78
+ #
79
+ # @example
80
+ # YARD::Tags::Library.default_factory = MyFactory
81
+ #
82
+ # @see DefaultFactory
83
+ def default_factory
84
+ @default_factory ||= DefaultFactory.new
85
+ end
86
+
87
+ def default_factory=(factory)
88
+ @default_factory = factory.is_a?(Class) ? factory.new : factory
89
+ end
90
+
91
+ # Returns the factory method used to parse the tag text for a specific tag
92
+ #
93
+ # @param [Symbol] tag the tag name
94
+ # @return [Symbol] the factory method name for the tag
95
+ # @return [Class<Tag>,Symbol] the Tag class to use to parse the tag
96
+ # or the method to call on the factory class
97
+ # @return [nil] if the tag is freeform text
98
+ # @since 0.6.0
99
+ def factory_method_for(tag)
100
+ @factory_methods[tag]
101
+ end
102
+
103
+ # Returns the factory method used to parse the tag text for a specific
104
+ # directive
105
+ #
106
+ # @param [Symbol] directive the directive name
107
+ # @return [Symbol] the factory method name for the tag
108
+ # @return [Class<Tag>,Symbol] the Tag class to use to parse the tag or
109
+ # the methods to call on the factory class
110
+ # @return [nil] if the tag is freeform text
111
+ # @since 0.8.0
112
+ def factory_method_for_directive(directive)
113
+ @directive_factory_classes[directive]
114
+ end
115
+
116
+ # Sets the list of tags to display when rendering templates. The order of
117
+ # tags in the list is also significant, as it represents the order that
118
+ # tags are displayed in templates.
119
+ #
120
+ # You can use the {Array#place} to insert new tags to be displayed in
121
+ # the templates at specific positions:
122
+ #
123
+ # Library.visible_tags.place(:mytag).before(:return)
124
+ #
125
+ # @return [Array<Symbol>] a list of ordered tags
126
+ # @since 0.6.0
127
+ attr_accessor :visible_tags
128
+
129
+ # Sets the list of tags that should apply to any children inside the
130
+ # namespace they are defined in. For instance, a "@since" tag should
131
+ # apply to all methods inside a module it is defined in. Transitive
132
+ # tags can be overridden by directly defining a tag on the child object.
133
+ #
134
+ # @return [Array<Symbol>] a list of transitive tags
135
+ # @since 0.6.0
136
+ attr_accessor :transitive_tags
137
+
138
+ # Sorts the labels lexically by their label name, often used when displaying
139
+ # the tags.
140
+ #
141
+ # @return [Array<Symbol>, String] the sorted labels as an array of the tag name and label
142
+ def sorted_labels
143
+ labels.sort_by {|a| a.last.downcase }
144
+ end
145
+
146
+ # Convenience method to define a new tag using one of {Tag}'s factory methods, or the
147
+ # regular {DefaultFactory#parse_tag} factory method if none is supplied.
148
+ #
149
+ # @!macro [attach] yard.tag
150
+ # @!method $2_tag
151
+ # @!visibility private
152
+ # @yard.tag $2 [$3] $1
153
+ # @param [#to_s] label the label used when displaying the tag in templates
154
+ # @param [#to_s] tag the tag name to create
155
+ # @param [#to_s, Class<Tag>] meth the {Tag} factory method to call when
156
+ # creating the tag or the name of the class to directly create a tag for
157
+ def define_tag(label, tag, meth = nil)
158
+ tag_meth = tag_method_name(tag)
159
+ if meth.is_a?(Class) && Tag > meth
160
+ class_eval(<<-eof, __FILE__, __LINE__ + 1)
161
+ def #{tag_meth}(text)
162
+ #{meth}.new(#{tag.inspect}, text)
163
+ end
164
+ eof
165
+ else
166
+ class_eval(<<-eof, __FILE__, __LINE__ + 1)
167
+ begin; undef #{tag_meth}; rescue NameError; end
168
+ def #{tag_meth}(text)
169
+ send_to_factory(#{tag.inspect}, #{meth.inspect}, text)
170
+ end
171
+ eof
172
+ end
173
+
174
+ @labels ||= SymbolHash.new(false)
175
+ @labels.update(tag => label)
176
+ @factory_methods ||= SymbolHash.new(false)
177
+ @factory_methods.update(tag => meth)
178
+ tag
179
+ end
180
+
181
+ # @macro [attach] yard.directive
182
+ # @!method $1_directive
183
+ # @!visibility private
184
+ # @yard.directive $1 [$2] $-1
185
+ # @overload define_directive(tag, tag_meth = nil, directive_class)
186
+ # Convenience method to define a new directive using a {Tag} factory
187
+ # method and {Directive} subclass that implements the directive
188
+ # callbacks.
189
+ #
190
+ # @param [#to_s] tag the tag name of the directive
191
+ # @param [#to_s] tag_meth the tag factory method to use when
192
+ # parsing tag information
193
+ # @param [Class<Directive>] the directive class that implements the
194
+ # directive behaviour
195
+ # @see define_tag
196
+ def define_directive(tag, tag_meth = nil, directive_class = nil)
197
+ directive_meth = directive_method_name(tag)
198
+ if directive_class.nil?
199
+ directive_class = tag_meth
200
+ tag_meth = nil
201
+ end
202
+ class_eval <<-eof, __FILE__, __LINE__
203
+ def #{directive_meth}(tag, parser)
204
+ directive_call(tag, parser)
205
+ end
206
+ eof
207
+
208
+ @factory_methods ||= SymbolHash.new(false)
209
+ @factory_methods.update(tag => tag_meth)
210
+ @directive_factory_classes ||= SymbolHash.new(false)
211
+ @directive_factory_classes.update(tag => directive_class)
212
+
213
+ tag
214
+ end
215
+
216
+ def tag_method_name(tag_name)
217
+ tag_or_directive_method_name(tag_name)
218
+ end
219
+
220
+ def directive_method_name(tag_name)
221
+ tag_or_directive_method_name(tag_name, 'directive')
222
+ end
223
+
224
+ private
225
+
226
+ def tag_or_directive_method_name(tag_name, type = 'tag')
227
+ "#{tag_name.to_s.tr('.', '_')}_#{type}"
228
+ end
229
+ end
230
+
231
+ private
232
+
233
+ def send_to_factory(tag_name, meth, text)
234
+ meth = meth.to_s
235
+ send_name = "parse_tag" + (meth.empty? ? "" : "_" + meth)
236
+ if @factory.respond_to?(send_name)
237
+ @factory.send(send_name, tag_name, text)
238
+ else
239
+ raise NoMethodError, "Factory #{@factory.class_name} does not implement factory method :#{meth}."
240
+ end
241
+ end
242
+
243
+ # @return [Directive]
244
+ def directive_call(tag, parser)
245
+ meth = self.class.factory_method_for_directive(tag.tag_name)
246
+ if meth <= Directive
247
+ meth = meth.new(tag, parser)
248
+ meth.call
249
+ meth
250
+ else
251
+ meth.call(tag, parser)
252
+ end
253
+ end
254
+
255
+ public
256
+
257
+ # A factory class to handle parsing of tags, defaults to {default_factory}
258
+ attr_accessor :factory
259
+
260
+ def initialize(factory = Library.default_factory)
261
+ self.factory = factory
262
+ end
263
+
264
+ # @param [#to_s] tag_name the name of the tag to look for
265
+ # @return [Boolean] whether a tag by the given name is registered in
266
+ # the library.
267
+ def has_tag?(tag_name)
268
+ tag_name && respond_to?(self.class.tag_method_name(tag_name))
269
+ end
270
+
271
+ # Creates a new {Tag} object with a given tag name and data
272
+ # @return [Tag] the newly created tag object
273
+ def tag_create(tag_name, tag_buf)
274
+ send(self.class.tag_method_name(tag_name), tag_buf)
275
+ end
276
+
277
+ # @param [#to_s] tag_name the name of the tag to look for
278
+ # @return [Boolean] whether a directive by the given name is registered in
279
+ # the library.
280
+ def has_directive?(tag_name)
281
+ tag_name && respond_to?(self.class.directive_method_name(tag_name))
282
+ end
283
+
284
+ # Creates a new directive with tag information and a docstring parser
285
+ # object.
286
+ # @param [String] tag_name the name of the tag
287
+ # @param [String] tag_buf the tag data
288
+ # @param [DocstringParser] parser the parser object parsing the docstring
289
+ # @return [Directive] the newly created directive
290
+ def directive_create(tag_name, tag_buf, parser)
291
+ meth = self.class.factory_method_for(tag_name)
292
+ tag = send_to_factory(tag_name, meth, tag_buf)
293
+ meth = self.class.directive_method_name(tag_name)
294
+ send(meth, tag, parser)
295
+ end
296
+
297
+ # @!macro yard.tag.transitive
298
+ # @note This tag is *transitive*. If it is applied on a
299
+ # namespace (module or class), it will immediately be
300
+ # applied to all children objects of that namespace unless
301
+ # it is redefined on the child object.
302
+
303
+ # Marks a class/module/method as abstract with optional
304
+ # implementor information.
305
+ #
306
+ # @example
307
+ # # @abstract Subclass and override {#run} to implement
308
+ # # a custom Threadable class.
309
+ # class Runnable
310
+ # def run; raise NotImplementedError end
311
+ # end
312
+ define_tag "Abstract", :abstract
313
+
314
+ # Declares the API that the object belongs to. Does not display in
315
+ # output, but useful for performing queries (+yardoc --query+). Any text is
316
+ # allowable in this tag, and there are no predefined values.
317
+ #
318
+ # @!macro yard.tag.transitive
319
+ # @note The special name +@api private+ does display a notice in
320
+ # documentation if it is listed, letting users know that the
321
+ # method is not to be used by external components.
322
+ # @example
323
+ # class Post
324
+ # # @api private
325
+ # def reset_table!; table.flush end
326
+ # end
327
+ define_tag "API Visibility", :api
328
+
329
+ # Declares a readwrite attribute on a Struct or class.
330
+ #
331
+ # @note This attribute is only applicable on class docstrings
332
+ # @deprecated Use the more powerful {tag:!attribute} directive instead.
333
+ # @example
334
+ # # @attr [String] name the name of the structure
335
+ # # @attr [Fixnum] size the size of the structure
336
+ # class MyStruct < Struct; end
337
+ define_tag "Attribute", :attr, :with_types_and_name
338
+
339
+ # Declares a readonly attribute on a Struct or class.
340
+ #
341
+ # @note This attribute is only applicable on class docstrings
342
+ # @deprecated Use the more powerful {tag:!attribute} directive instead.
343
+ # @example
344
+ # # @attr_reader [String] name the name of the structure
345
+ # # @attr_reader [Fixnum] size the size of the structure
346
+ # class MyStruct < Struct; end
347
+ define_tag "Attribute Getter", :attr_reader, :with_types_and_name
348
+
349
+ # Declares a writeonly attribute on a Struct or class.
350
+ #
351
+ # @note This attribute is only applicable on class docstrings
352
+ # @deprecated Use the more powerful {tag:!attribute} directive instead.
353
+ # @example
354
+ # # @attr_reader [String] name the name of the structure
355
+ # # @attr_reader [Fixnum] size the size of the structure
356
+ # class MyStruct < Struct; end
357
+ define_tag "Attribute Setter", :attr_writer, :with_types_and_name
358
+
359
+ # List the author or authors of a class, module, or method.
360
+ #
361
+ # @example
362
+ # # @author Foo Bar <foo@bar.com>
363
+ # class MyClass; end
364
+ define_tag "Author", :author
365
+
366
+ # Marks a method/class as deprecated with an optional description.
367
+ # The description should be used to inform users of the recommended
368
+ # migration path, and/or any useful information about why the object
369
+ # was marked as deprecated.
370
+ #
371
+ # @example Deprecate a method with a replacement API
372
+ # # @deprecated Use {#bar} instead.
373
+ # def foo; end
374
+ # @example Deprecate a method with no replacement
375
+ # class Thread
376
+ # # @deprecated Exiting a thread in this way is not reliable and
377
+ # # can cause a program crash.
378
+ # def kill; end
379
+ # end
380
+ define_tag "Deprecated", :deprecated
381
+
382
+ # Show an example snippet of code for an object. The first line
383
+ # is an optional title.
384
+ #
385
+ # @example
386
+ # # @example Reverse a String
387
+ # # "mystring".reverse #=> "gnirtsym"
388
+ # def reverse; end
389
+ # @yard.signature Optional title
390
+ # Code block
391
+ define_tag "Example", :example, :with_title_and_text
392
+
393
+ # Adds an emphasized note at the top of the docstring for the object
394
+ #
395
+ # @example
396
+ # # @note This method should only be used in outer space.
397
+ # def eject; end
398
+ # @see tag:todo
399
+ define_tag "Note", :note
400
+
401
+ # Describe an options hash in a method. The tag takes the
402
+ # name of the options parameter first, followed by optional types,
403
+ # the option key name, a default value for the key and a
404
+ # description of the option. The default value should be placed within
405
+ # parentheses and is optional (can be omitted).
406
+ #
407
+ # Note that a +@param+ tag need not be defined for the options
408
+ # hash itself, though it is useful to do so for completeness.
409
+ #
410
+ # @note For keyword parameters, use +@param+, not +@option+.
411
+ #
412
+ # @example
413
+ # # @param [Hash] opts the options to create a message with.
414
+ # # @option opts [String] :subject The subject
415
+ # # @option opts [String] :from ('nobody') From address
416
+ # # @option opts [String] :to Recipient email
417
+ # # @option opts [String] :body ('') The email's body
418
+ # def send_email(opts = {}) end
419
+ # @yard.signature name [Types] option_key (default_value) description
420
+ define_tag "Options Hash", :option, :with_options
421
+
422
+ # Describe that your method can be used in various
423
+ # contexts with various parameters or return types. The first
424
+ # line should declare the new method signature, and the following
425
+ # indented tag data will be a new documentation string with its
426
+ # own tags adding metadata for such an overload.
427
+ #
428
+ # @example
429
+ # # @overload set(key, value)
430
+ # # Sets a value on key
431
+ # # @param key [Symbol] describe key param
432
+ # # @param value [Object] describe value param
433
+ # # @overload set(value)
434
+ # # Sets a value on the default key +:foo+
435
+ # # @param value [Object] describe value param
436
+ # def set(*args) end
437
+ # @yard.signature method_signature(parameters)
438
+ # Indented docstring for overload method
439
+ define_tag "Overloads", :overload, OverloadTag
440
+
441
+ # Documents a single method parameter (either regular or keyword) with a given name, type
442
+ # and optional description.
443
+ #
444
+ # @example
445
+ # # @param url [String] the URL of the page to download
446
+ # # @param directory [String] the name of the directory to save to
447
+ # def load_page(url, directory: 'pages') end
448
+ define_tag "Parameters", :param, :with_types_and_name
449
+
450
+ # Declares that the _logical_ visibility of an object is private.
451
+ # In other words, it specifies that this method should be marked
452
+ # private but cannot due to Ruby's visibility restrictions. This
453
+ # exists for classes, modules and constants that do not obey Ruby's
454
+ # visibility rules. For instance, an inner class might be considered
455
+ # "private", though Ruby would make no such distinction.
456
+ #
457
+ # This tag is meant to be used in conjunction with the +--no-private+
458
+ # command-line option, and is required to actually remove these objects
459
+ # from documentation output. See {file:README.md} for more information on
460
+ # switches.
461
+ #
462
+ # If you simply want to set the API visibility of a method, you should
463
+ # look at the {tag:api} tag instead.
464
+ #
465
+ # @note This method is not recommended for hiding undocumented or
466
+ # "unimportant" methods. This tag should only be used to mark objects
467
+ # private when Ruby visibility rules cannot do so. In Ruby 1.9.3, you
468
+ # can use +private_constant+ to declare constants (like classes or
469
+ # modules) as private, and should be used instead of +@private+.
470
+ # @macro yard.tag.transitive
471
+ # @example
472
+ # # @private
473
+ # class InteralImplementation; end
474
+ # @see tag:api
475
+ # @yard.signature
476
+ define_tag "Private", :private
477
+
478
+ # Describes that a method may raise a given exception, with
479
+ # an optional description of what it may mean.
480
+ #
481
+ # @example
482
+ # # @raise [AccountBalanceError] if the account does not have
483
+ # # sufficient funds to perform the transaction
484
+ # def withdraw(amount) end
485
+ define_tag "Raises", :raise, :with_types
486
+
487
+ # Describes the return value (and type or types) of a method.
488
+ # You can list multiple return tags for a method in the case
489
+ # where a method has distinct return cases. In this case, each
490
+ # case should begin with "if ...".
491
+ #
492
+ # @example A regular return value
493
+ # # @return [Fixnum] the size of the file
494
+ # def size; @file.size end
495
+ # @example A method returns an Array or a single object
496
+ # # @return [String] if a single object was returned
497
+ # # from the database.
498
+ # # @return [Array<String>] if multiple objects were
499
+ # # returned.
500
+ # def find(query) end
501
+ define_tag "Returns", :return, :with_types
502
+
503
+ # "See Also" references for an object. Accepts URLs or
504
+ # other code objects with an optional description at the end.
505
+ # Note that the URL or object will be automatically linked by
506
+ # YARD and does not need to be formatted with markup.
507
+ #
508
+ # @example
509
+ # # Synchronizes system time using NTP.
510
+ # # @see http://ntp.org/documentation.html NTP Documentation
511
+ # # @see NTPHelperMethods
512
+ # class NTPUpdater; end
513
+ define_tag "See Also", :see, :with_name
514
+
515
+ # Lists the version that the object was first added.
516
+ #
517
+ # @!macro yard.tag.transitive
518
+ # @example
519
+ # # @since 1.2.4
520
+ # def clear_routes; end
521
+ define_tag "Since", :since
522
+
523
+ # Marks a TODO note in the object being documented.
524
+ # For reference, objects with TODO items can be enumerated
525
+ # from the command line with a simple command:
526
+ #
527
+ # !!!sh
528
+ # mocker$ yard list --query '@todo'
529
+ # lib/mocker/mocker.rb:15: Mocker
530
+ # lib/mocker/report/html.rb:5: Mocker::Report::Html
531
+ #
532
+ # YARD can also be used to enumerate the TODO items from
533
+ # a short script:
534
+ #
535
+ # !!!ruby
536
+ # require 'yard'
537
+ # YARD::Registry.load!.all.each do |o|
538
+ # puts o.tag(:todo).text if o.tag(:todo)
539
+ # end
540
+ #
541
+ # @example
542
+ # # @todo Add support for Jabberwocky service.
543
+ # # There is an open source Jabberwocky library available
544
+ # # at http://jbrwcky.org that can be easily integrated.
545
+ # class Wonderlander; end
546
+ # @see tag:note
547
+ define_tag "Todo Item", :todo
548
+
549
+ # Lists the version of a class, module or method. This is
550
+ # similar to a library version, but at finer granularity.
551
+ # In some cases, version of specific modules, classes, methods
552
+ # or generalized components might change independently between
553
+ # releases. A version tag is used to infer the API compatibility
554
+ # of a specific object.
555
+ #
556
+ # @example
557
+ # # The public REST API for http://jbrwcky.org
558
+ # # @version 2.0
559
+ # class JabberwockyAPI; end
560
+ define_tag "Version", :version
561
+
562
+ # Describes what a method might yield to a given block.
563
+ # The types specifier list should not list types, but names
564
+ # of the parameters yielded to the block. If you define
565
+ # parameters with +@yieldparam+, you do not need to define
566
+ # the parameters in the type specification of +@yield+ as
567
+ # well.
568
+ #
569
+ # @example
570
+ # # For a block {|a,b,c| ... }
571
+ # # @yield [a, b, c] Gives 3 random numbers to the block
572
+ # def provide3values(&block) yield(42, 42, 42) end
573
+ # @see tag:yieldparam
574
+ # @see tag:yieldreturn
575
+ # @yard.signature [parameters] description
576
+ define_tag "Yields", :yield, :with_types
577
+
578
+ # Defines a parameter yielded by a block. If you define the
579
+ # parameters with +@yieldparam+, you do not need to define
580
+ # them via +@yield+ as well.
581
+ #
582
+ # @example
583
+ # # @yieldparam [String] name the name that is yielded
584
+ # def with_name(name) yield(name) end
585
+ define_tag "Yield Parameters", :yieldparam, :with_types_and_name
586
+
587
+ # Documents the value and type that the block is expected
588
+ # to return to the method.
589
+ #
590
+ # @example
591
+ # # @yieldreturn [Fixnum] the number to add 5 to.
592
+ # def add5_block(&block) 5 + yield end
593
+ # @see tag:return
594
+ define_tag "Yield Returns", :yieldreturn, :with_types
595
+
596
+ # @yard.signature [r | w | rw] attribute_name
597
+ # Indented attribute docstring
598
+ define_directive :attribute, :with_types_and_title, AttributeDirective
599
+
600
+ # @yard.signature
601
+ define_directive :endgroup, EndGroupDirective
602
+
603
+ define_directive :group, GroupDirective
604
+
605
+ # @yard.signature [attach | new] optional_name
606
+ # Optional macro expansion data
607
+ define_directive :macro, :with_types_and_title, MacroDirective
608
+
609
+ # @yard.signature method_signature(parameters)
610
+ # Indented method docstring
611
+ define_directive :method, :with_title_and_text, MethodDirective
612
+
613
+ # @yard.signature [language] code
614
+ define_directive :parse, :with_types, ParseDirective
615
+
616
+ # Sets the scope of a DSL method. Only applicable to DSL method
617
+ # calls. Acceptable values are 'class' or 'instance'
618
+ # @yard.signature class | instance
619
+ define_directive :scope, ScopeDirective
620
+
621
+ # Sets the visibility of a DSL method. Only applicable to
622
+ # DSL method calls. Acceptable values are public, protected, or private.
623
+ # @yard.signature public | protected | private
624
+ define_directive :visibility, VisibilityDirective
625
+
626
+ self.visible_tags = [:abstract, :deprecated, :note, :todo, :example, :overload,
627
+ :param, :option, :yield, :yieldparam, :yieldreturn, :return, :raise,
628
+ :see, :author, :since, :version]
629
+
630
+ self.transitive_tags = [:since, :api]
631
+ end
632
+ end
633
+ end