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
data/docs/TagsArch.md ADDED
@@ -0,0 +1,123 @@
1
+ # @title Tags Architecture
2
+
3
+ # Tags Architecture
4
+
5
+ ## Programmatic API
6
+
7
+ ### Accessing Tag Information
8
+
9
+ Tag metadata is added when a {YARD::Docstring} is added to a {file:docs/CodeObjects.md code object}
10
+ using the {YARD::CodeObjects::Base#docstring=} attribute. In addition to adding
11
+ conventional comments, tags are parsed and associated with the object. The easiest
12
+ way to access tags on an object is to use the {YARD::CodeObjects::Base#tag} and `#tags`
13
+ methods, for example:
14
+
15
+ # Using the Foo class object from above
16
+ obj.tags(:tagname).first.text #=> "some data"
17
+
18
+ Because multiple tags can be stored with the same name, they are stored as a list
19
+ of tags. The `#tag` method is an alias for the first item in the list of tags.
20
+ Also note that the `#tag`, `#tags` and `#has_tag?` methods are all convenience
21
+ methods that delegate to the {YARD::Docstring} object described above.
22
+
23
+ ### Adding Custom Tags
24
+
25
+ The `@tagname` tag used in the above examples is clearly not part of the tags
26
+ that come with YARD. If such a tag would actually be part of documentation under
27
+ a default install, YARD would raise a warning that the tag does not exist. It is,
28
+ however, trivial to add this tag to be recognized by YARD.
29
+
30
+ All tags in YARD are added to the {YARD::Tags::Library tag library} which makes
31
+ use of a tag factory class to parse the data inside the tags. To simply add a
32
+ tag that stores simple text like our `@tagname` tag above, use:
33
+
34
+ YARD::Tags::Library.define_tag("A Sample Tag", :tagname)
35
+
36
+ This will now allow YARD to add the metadata from `@tagname` to the docstring.
37
+
38
+ ## Tag Factory Architecture
39
+
40
+ Recognizing a tag is one part of the process. Parsing the tag contents is the
41
+ second step. YARD has a tag architecture that allows developers to add or completely
42
+ change the way tags contents can be parsed.
43
+
44
+ The separation of registration and tag creation can be seen in the following
45
+ class diagram:
46
+
47
+ ![Tags Architecture Class Diagram](images/tags-class-diagram.png)
48
+
49
+ ### DefaultFactory
50
+
51
+ By default, YARD has a few standard syntaxes that can be parsed for tags. These
52
+ are all implemented by the {YARD::Tags::DefaultFactory} class. These syntaxes
53
+ are:
54
+
55
+ * Standard text: no parsing is done, but text is stripped of newlines and
56
+ multiple spaces.
57
+
58
+ * Raw text: does no parsing at all, no stripping of newlines or spaces. This
59
+ is best used for code snippets.
60
+
61
+ * Raw text with title: does no parsing on the text but extracts the first line
62
+ of the metadata as the "title", useful for tags such as `@example`:
63
+
64
+ # @example Inspect an element
65
+ # myobj.inspect #=> #<Object:0x123525>
66
+
67
+ * Text with types: parses a list of types at the beginning of the text. Types
68
+ are optional. The standard syntax is in the form `[type1, type2, ...]`,
69
+ for example:
70
+
71
+ # @return [String, Symbol] a description here
72
+ # @return description here with no types
73
+
74
+ * Text with types and a name: parses a list of types at the beginning of text
75
+ followed by a name and extra descriptive text. For example:
76
+
77
+ # @param [String] str the string to reverse
78
+ def reverse(str) '...' end
79
+
80
+ As mentioned above, this syntax is implemented by the `DefaultFactory` which can
81
+ be swapped out for any factory. In some cases, a developer may want to change
82
+ the type declaration syntax to be in the form:
83
+
84
+ # @tagname name <Types, here> description
85
+
86
+ This can be done by simply implementing a new factory that parses the data in
87
+ this form.
88
+
89
+ ### Implementing a Factory
90
+
91
+ Factories should implement the method `parse_tag` as well as any `parse_tag_SUFFIX`
92
+ method where SUFFIX refers to the suffix added when declaring the tag. For example,
93
+ a tag can also be declared as follows:
94
+
95
+ YARD::Tags::Library.define_tag "Parameter", :param, :with_types
96
+
97
+ In such a case, the factory will be called with method `parse_tag_with_types`. In
98
+ all cases, the method should return a new {YARD::Tags::Tag} object. Generally,
99
+ the `parse_tag` methods take 2 or 3 parameters. A simple tag can be implemented
100
+ as:
101
+
102
+ def parse_tag(tag_name, text)
103
+ Tag.new(tag_name, text)
104
+ end
105
+
106
+ The text parameter contains pre-parsed text with extra spaces and newlines removed.
107
+ If required, the method could also be declared with a third parameter containing
108
+ unmodified raw text:
109
+
110
+ def parse_tag_with_raw_text(tag_name, text, raw_text)
111
+ Tag.new(tag_name, raw_text)
112
+ end
113
+
114
+ Note that this method would be invoked for a tag declared with the `:with_raw_text`
115
+ suffix.
116
+
117
+ ### Changing the Factory
118
+
119
+ To change the factory, set the {YARD::Tags::Library.default_factory} attribute:
120
+
121
+ YARD::Tags::Library.default_factory = MyFactory
122
+
123
+ This must be done before any parsing is done, or the factory will not be used.
data/docs/Templates.md CHANGED
@@ -29,32 +29,32 @@ The design goals can be summarized as follows:
29
29
  3. Sections should be able to be inserted into any object without affecting
30
30
  any existing sections in the document. This allows for easy modification
31
31
  of templates by plugins.
32
-
32
+
33
33
  ## Templates
34
34
 
35
- Template modules are the objects used to orchestrate the design goals listed
35
+ Template modules are the objects used to orchestrate the design goals listed
36
36
  above. Specifically, they organize the sections and render the template contents
37
- depending on the format.
37
+ depending on the format.
38
38
 
39
39
  ## Engine
40
40
 
41
- The Engine class orchestrates the creation and rendering of Template modules and
41
+ The Engine class orchestrates the creation and rendering of Template modules and
42
42
  handles serialization or specific rendering scenarios (like HTML). To create
43
- a template, use the {YARD::Templates::Engine.template template} method. The two most
44
- common methods used to initiate output are the {YARD::Templates::Engine.render render}
45
- and {YARD::Templates::Engine.generate generate} methods which generate and
46
- optionally serialize output to a file. The latter, `#generate`, is used
47
- specially to generate HTML documentation and copy over assets that may be
43
+ a template, use the {YARD::Templates::Engine.template template} method. The two most
44
+ common methods used to initiate output are the {YARD::Templates::Engine.render render}
45
+ and {YARD::Templates::Engine.generate generate} methods which generate and
46
+ optionally serialize output to a file. The latter, `#generate`, is used
47
+ specially to generate HTML documentation and copy over assets that may be
48
48
  needed. For instance, an object may be rendered with:
49
49
 
50
50
  YARD::Templates::Engine.render(:object => myobject)
51
-
51
+
52
52
  A set of objects may be rendered into HTML documentation by using:
53
53
 
54
54
  # all_objects is an array of module and class objects
55
55
  # options includes a :serializer key to copy output to the file system
56
56
  YARD::Templates::Engine.generate(all_objects, options)
57
-
57
+
58
58
  Note that these methods should not be called directly. The {YARD::CodeObjects::Base}
59
59
  class has a {YARD::CodeObjects::Base#format #format} helper method to render an
60
60
  object. For instance, the above render example is equivalent to the simple
@@ -67,11 +67,11 @@ A template keeps state when it is rendering output. This state is kept in
67
67
  an options hash which is initially passed to it during instantiation. Some
68
68
  default options set the template style (`:template`), the output format (`:format`),
69
69
  and the serializer to use (`:serializer`). This options hash is modifiable
70
- from all methods seen above. For example, initializing a template to output as
70
+ from all methods seen above. For example, initializing a template to output as
71
71
  HTML instead of text can be done as follows:
72
72
 
73
73
  myobject.format(:format => :html)
74
-
74
+
75
75
  ## Serializer
76
76
 
77
77
  This class abstracts the logic involved in deciding how to serialize data to
@@ -82,7 +82,7 @@ are used (like files or URLs), the serializer implements the {YARD::Serializers:
82
82
  method. This allows the translation from a code object to its path at the endpoint,
83
83
  which enables inter-document linking.
84
84
 
85
- Rendered objects are automatically serialized using the object if present,
85
+ Rendered objects are automatically serialized using the object if present,
86
86
  otherwise the rendered object is returned as a string to its parent. Nested
87
87
  Templates automatically set the serializer to nil so that they return
88
88
  as a String to their parent.
@@ -120,13 +120,13 @@ on disk. A standard template directory looks like the following tree:
120
120
  | |-- index.erb
121
121
  | `-- text.erb
122
122
 
123
- The path `default` refers to the template style (:template key in options hash)
123
+ The path `default` refers to the template style (:template key in options hash)
124
124
  and the directories at the next level (such as `class`) refer to template
125
- `:type` (options hash key) for a template. The next directory refers to the
126
- output format being used defined by the `:format` template option.
125
+ `:type` (options hash key) for a template. The next directory refers to the
126
+ output format being used defined by the `:format` template option.
127
127
 
128
128
  As we saw in the above example, the format option can be set to `:html`, which
129
- would use the `html/` directory instead of `text/`. Finally, the individual .erb
129
+ would use the `html/` directory instead of `text/`. Finally, the individual .erb
130
130
  files are the sections that make up the template.
131
131
 
132
132
  Note that the subdirectory `html/` is also its own "template" that inherits
@@ -134,8 +134,8 @@ from the parent directory. We will see more on this later.
134
134
 
135
135
  ## setup.rb
136
136
 
137
- Every template should have at least one `setup.rb` file that defines the
138
- {YARD::Templates::Template#init #init} method to set the
137
+ Every template should have at least one `setup.rb` file that defines the
138
+ {YARD::Templates::Template#init #init} method to set the
139
139
  {YARD::Templates::Template#sections #sections} used by the template. If
140
140
  a setup.rb is not defined in the template itself, there should be a template
141
141
  that is inherited (via parent directory or explcitly) that sets the sections
@@ -150,9 +150,9 @@ A standard setup.rb file looks like:
150
150
  ## Sections
151
151
 
152
152
  Sections are smaller components that correlate to template
153
- fragments. Practically speaking, a section can either be a template fragment
154
- (a conventional .erb file or other supported templating language), a method
155
- (which returns a String) or another {YARD::Templates::Template} (which in turn has its own
153
+ fragments. Practically speaking, a section can either be a template fragment
154
+ (a conventional .erb file or other supported templating language), a method
155
+ (which returns a String) or another {YARD::Templates::Template} (which in turn has its own
156
156
  list of sections).
157
157
 
158
158
  ## Nested Sections
@@ -165,7 +165,7 @@ a section, for example:
165
165
  def init
166
166
  sections :header, [:section_a, :section_b]
167
167
  end
168
-
168
+
169
169
  The above example nests `section_a` and `section_b` within the `header` section.
170
170
  Practically speaking, these sections can be placed in the result by `yield`ing
171
171
  to them. A sample header.erb template might contain:
@@ -174,7 +174,7 @@ to them. A sample header.erb template might contain:
174
174
  <div id="contents">
175
175
  <%= yieldall %>
176
176
  </div>
177
-
177
+
178
178
  This template code would place the output of `section_a` and `section_b` within
179
179
  the above div element. Using `yieldall`, we can also change the object that is being
180
180
  rendered. For example, we may want to yield the first method of the class.
@@ -197,7 +197,7 @@ more accurate) by the current template. This means that the 'default/class/html'
197
197
  template automatically inherits from 'default/class'. This also means that anything
198
198
  defined in 'default/class/setup.rb' can be overridden by 'default/class/html/setup.rb'.
199
199
 
200
- Since the Template module is a module, and not a class, they can be mixed in
200
+ Since the Template module is a module, and not a class, they can be mixed in
201
201
  explicitly (via include/extend) from other templates, which allows templates
202
202
  to share erb files or helper logic. The 'default/class' template explicitly
203
203
  mixes in the 'default/module' template, since it uses much of the same sections.
@@ -225,29 +225,29 @@ instance, will modify the #init method to insert class specific sections:
225
225
  sections.delete(:children)
226
226
  sections.place([:constructor_details, [T('method_details')]]).before(:methodmissing)
227
227
  end
228
-
228
+
229
229
  Observe how sections has been modified after the super method was called (the
230
230
  super method would have been defined in `default/module/setup.rb`). The
231
231
  `sections` object is of the {YARD::Templates::Section} class and allows sections to be inserted
232
- before or after another section using {Array#place} by it's given name rather
232
+ before or after another section using {Array#place} by it's given name rather
233
233
  than index. This allows the overriding of templates in a way that does not
234
- depend on where the section is located (since it may have been overriden by
234
+ depend on where the section is located (since it may have been overriden by
235
235
  another module).
236
236
 
237
237
  You can also use `sections[:name]` to find the first child section named `:name`.
238
238
  For instance, with the following sections declaration:
239
239
 
240
240
  sections :a, [:b, :c, [:d]]
241
-
241
+
242
242
  You can get to the :d section with:
243
243
 
244
244
  sections[:a][:c][:d]
245
-
245
+
246
246
  You can use this to insert a section inside a nested set without using indexed
247
247
  access. The following command would result in `[:a, [:b, :c, [:d, :e]]]`:
248
248
 
249
249
  sections[:a][:c].place(:e).after(:d)
250
-
250
+
251
251
  There are also two methods, {Insertion#before_any} and {Insertion#after_any},
252
252
  which allow you to insert sections before or after the first matching section name
253
253
  recursively. The above example could simply be rewritten as:
@@ -265,16 +265,16 @@ YARD solves this problem by allowing other template paths to be registered.
265
265
  Because template modules are represented by a relative path such as 'default/class',
266
266
  they can be found within any of the registered template paths. A new template
267
267
  path is registered as:
268
-
268
+
269
269
  YARD::Templates::Engine.register_template_path '/path/to/mytemplates'
270
-
270
+
271
271
  At this point, any time the 'default/class' template is loaded, the template
272
272
  will first be looked for inside the newly registered template path. If found,
273
273
  it will be used as the template module, with the modules from the other
274
- template paths implicitly mixed in.
274
+ template paths implicitly mixed in.
275
275
 
276
276
  Therefore, by using the same directory structure as a builtin YARD template,
277
- a user can customize or override individual templates as if the old ones were
277
+ a user can customize or override individual templates as if the old ones were
278
278
  inherited. A real world example would further modify the 'default/class' template
279
279
  seen above by creating such a path in our '/path/to/mytemplates' custom template
280
280
  path:
@@ -292,7 +292,7 @@ The `setup.rb` file would look like:
292
292
  sections.push :customsection
293
293
  end
294
294
 
295
- Now, when a class object is formatted as HTML, our customsection.erb will be
295
+ Now, when a class object is formatted as HTML, our customsection.erb will be
296
296
  appended to the rendered data.
297
297
 
298
298
 
@@ -344,7 +344,7 @@ The `jquery.js` is copy of the jquery javascript library.
344
344
  To load additional stylesheets and javascripts with every page (except the search
345
345
  field menus) generated from the base `layout` template:
346
346
 
347
- 1. Define your own custom stylesheet and/or javascript file
347
+ 1. Define your own custom stylesheet and/or javascript file
348
348
  (default/ is the default template name inside of the /template root directory):
349
349
 
350
350
  /template/default/:
@@ -355,28 +355,28 @@ field menus) generated from the base `layout` template:
355
355
  | | |-- js
356
356
  | | | |-- custom.js
357
357
 
358
- 2. Create a `setup.rb` in the `layout` template directory and override the methods
358
+ 2. Create a `setup.rb` in the `layout` template directory and override the methods
359
359
  `stylesheets` and `javascripts`. The path to the template would be:
360
-
360
+
361
361
  /template/default/:
362
362
  |-- layout
363
363
  | |-- html
364
364
  | | |-- setup.rb
365
-
365
+
366
366
  And the code would look like:
367
-
367
+
368
368
  def stylesheets
369
369
  # Load the existing stylesheets while appending the custom one
370
370
  super + %w(css/custom.css)
371
371
  end
372
-
372
+
373
373
  def javascripts
374
374
  # Load the existing javascripts while appending the custom one
375
375
  super + %w(js/custom.js)
376
376
  end
377
-
378
377
 
379
- To load additional stylesheets and javascripts for the search menus loaded from
378
+
379
+ To load additional stylesheets and javascripts for the search menus loaded from
380
380
  the `fulldoc` template:
381
381
 
382
382
  1. Define your own custom stylesheet and/or javascript file.
@@ -416,21 +416,21 @@ Their contents are rendered in methods within the `fulldoc` template:
416
416
  * `generate_class_list`
417
417
  * `generate_method_list`
418
418
  * `generate_file_list`
419
-
419
+
420
420
  To override these lists you will need to:
421
421
 
422
422
  1. Create a `setup.rb` in the `fulldoc` template directory and override the
423
423
  particular method.
424
-
424
+
425
425
  /path/to/mytemplates/:
426
426
  |-- fulldoc
427
427
  | |-- html
428
428
  | | |-- setup.rb
429
-
429
+
430
430
  def generate_method_list
431
431
  @items = prune_method_listing(Registry.all(:method), false)
432
432
  @items = @items.reject {|m| m.name.to_s =~ /=$/ && m.is_attribute? }
433
-
433
+
434
434
  # Here we changed the functionality to reverse the order of displayed methods
435
435
  @items = @items.sort_by {|m| m.name.to_s }.reverse
436
436
  @list_title = "Method List"
@@ -452,11 +452,11 @@ the `fulldoc` template through a similarly named method.
452
452
  To load an additional menu item:
453
453
 
454
454
 
455
- 1. Create a `setup.rb` in the `layout` template directory and override the methods
455
+ 1. Create a `setup.rb` in the `layout` template directory and override the methods
456
456
  `menu_lists`. The `type` informs the search field the name of the file.
457
457
  The `title` is the name that appears above the section when viewed in frames.
458
458
  The `search_title` is the name that appears in the search field tab on the page.
459
-
459
+
460
460
 
461
461
  /path/to/mytemplates/:
462
462
  |-- layout
@@ -467,52 +467,30 @@ To load an additional menu item:
467
467
  # Load the existing menus
468
468
  super + [ { :type => 'feature', :title => 'Features', :search_title => 'Feature List' } ]
469
469
  end
470
-
470
+
471
471
  2. Create a `setup.rb` in the `fulldoc` template directory and create a method
472
- to generate a menu for the specified `type`.
472
+ to generate a menu for the specified `type`.
473
473
  The method `generate_assets` will look for a function with a signature prefixed
474
- with `generate`, the type value specified, and the suffix `list`. Within that
474
+ with `generate`, the type value specified, and the suffix `list`. Within that
475
475
  method you can configure and load the specific objects you wish to display.
476
-
476
+
477
477
  /path/to/mytemplates/:
478
478
  |-- fulldoc
479
479
  | |-- html
480
480
  | | |-- setup.rb
481
481
 
482
482
  def generate_feature_list
483
-
483
+
484
484
  # load all the features from the Registry
485
485
  @items = Registry.all(:feature)
486
486
  @list_title = "Feature List"
487
487
  @list_type = "feature"
488
-
488
+
489
489
  # optional: the specified stylesheet class
490
490
  # when not specified it will default to the value of @list_type
491
491
  @list_class = "class"
492
-
492
+
493
493
  # Generate the full list html file with named feature_list.html
494
494
  # @note this file must be match the name of the type
495
495
  asset('feature_list.html', erb(:full_list))
496
496
  end
497
-
498
-
499
- 3. Define custom javascript to load the search fields and the keyboard shortcuts.
500
-
501
- function featureSearchFrameLinks() {
502
- $('#feature_list_link').click(function() {
503
- toggleSearchFrame(this, relpath + 'feature_list.html');
504
- });
505
- }
506
-
507
- function featureKeyboardShortcuts() {
508
- if (window.top.frames.main) return;
509
- $(document).keypress(function(evt) {
510
- if (evt.altKey || evt.ctrlKey || evt.metaKey || evt.shiftKey) return;
511
- if (typeof evt.orignalTarget !== "undefined" &&
512
- (evt.originalTarget.nodeName == "INPUT" ||
513
- evt.originalTarget.nodeName == "TEXTAREA")) return;
514
- switch (evt.charCode) {
515
- case 82: case 114: $('#feature_list_link').click(); break; // 'r'
516
- }
517
- });
518
- }