yard 0.7.5 → 0.8.0

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