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,123 +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.
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.
@@ -1,496 +1,496 @@
1
- # @title Templates Architecture
2
-
3
- # Templates Architecture
4
-
5
- Templates are the main component in the output rendering process of YARD,
6
- which is invoked when conventional HTML/text output needs to be rendered
7
- for a set of code objects.
8
-
9
- ## Design Goals
10
-
11
- The general design attempts to be as abstracted from actual content and templates
12
- as possible. Unlike RDoc which uses one file to describe the entire template,
13
- YARD splits up the rendering of code objects into small components, allowing
14
- template modification for smaller subsets of a full template without having to
15
- duplicate the entire template itself. This is necessary because of YARD's support
16
- for plugins. YARD is designed for extensibility by external plugins, and because
17
- of this, no one plugin can be responsible for the entire template because no
18
- one plugin knows about the other plugins being used. For instance, if an RSpec
19
- plugin was added to support and document specifications in class templates,
20
- this information would need to be transparently added to the template to work
21
- in conjunction with any other plugin that performed similar template modifications.
22
- The design goals can be summarized as follows:
23
-
24
- 1. Output should be able to be rendered for any arbitrary format with little
25
- modification to YARD's source code. The addition of extra templates should
26
- be sufficient.
27
- 2. The output rendered for an object should independently rendered data
28
- from arbitrary sources. These independent components are called "sections".
29
- 3. Sections should be able to be inserted into any object without affecting
30
- any existing sections in the document. This allows for easy modification
31
- of templates by plugins.
32
-
33
- ## Templates
34
-
35
- Template modules are the objects used to orchestrate the design goals listed
36
- above. Specifically, they organize the sections and render the template contents
37
- depending on the format.
38
-
39
- ## Engine
40
-
41
- The Engine class orchestrates the creation and rendering of Template modules and
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
48
- needed. For instance, an object may be rendered with:
49
-
50
- YARD::Templates::Engine.render(:object => myobject)
51
-
52
- A set of objects may be rendered into HTML documentation by using:
53
-
54
- # all_objects is an array of module and class objects
55
- # options includes a :serializer key to copy output to the file system
56
- YARD::Templates::Engine.generate(all_objects, options)
57
-
58
- Note that these methods should not be called directly. The {YARD::CodeObjects::Base}
59
- class has a {YARD::CodeObjects::Base#format #format} helper method to render an
60
- object. For instance, the above render example is equivalent to the simple
61
- call `myobject.format`. The `generate` method is a special kind of render
62
- and is called from the {YARD::CLI::Yardoc} command line utility.
63
-
64
- ## Template Options
65
-
66
- A template keeps state when it is rendering output. This state is kept in
67
- an options hash which is initially passed to it during instantiation. Some
68
- default options set the template style (`:template`), the output format (`:format`),
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
71
- HTML instead of text can be done as follows:
72
-
73
- myobject.format(:format => :html)
74
-
75
- ## Serializer
76
-
77
- This class abstracts the logic involved in deciding how to serialize data to
78
- the expected endpoint. For instance, there is both a {YARD::Serializers::StdoutSerializer StdoutSerializer}
79
- and {YARD::Serializers::FileSystemSerializer FileSystemSerializer} class for
80
- outputting to console or to a file respectively. When endpoints with locations
81
- are used (like files or URLs), the serializer implements the {YARD::Serializers::Base#serialized_path #serialized_path}
82
- method. This allows the translation from a code object to its path at the endpoint,
83
- which enables inter-document linking.
84
-
85
- Rendered objects are automatically serialized using the object if present,
86
- otherwise the rendered object is returned as a string to its parent. Nested
87
- Templates automatically set the serializer to nil so that they return
88
- as a String to their parent.
89
-
90
- ## Creating a Template
91
-
92
- Templates are represented by a directory inside the {YARD::Templates::Engine.template_paths}
93
- on disk. A standard template directory looks like the following tree:
94
-
95
- (Assuming templates/ is a template path)
96
- templates
97
- `-- default
98
- |-- class
99
- | |-- dot
100
- | | |-- setup.rb
101
- | | `-- superklass.erb
102
- | |-- html
103
- | | |-- constructor_details.erb
104
- | | |-- setup.rb
105
- | | `-- subclasses.erb
106
- | |-- setup.rb
107
- | `-- text
108
- | |-- setup.rb
109
- | `-- subclasses.erb
110
- |-- docstring
111
- | |-- html
112
- | | |-- abstract.erb
113
- | | |-- deprecated.erb
114
- | | |-- index.erb
115
- | | `-- text.erb
116
- | |-- setup.rb
117
- | `-- text
118
- | |-- abstract.erb
119
- | |-- deprecated.erb
120
- | |-- index.erb
121
- | `-- text.erb
122
-
123
- The path `default` refers to the template style (:template key in options hash)
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.
127
-
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
130
- files are the sections that make up the template.
131
-
132
- Note that the subdirectory `html/` is also its own "template" that inherits
133
- from the parent directory. We will see more on this later.
134
-
135
- ## setup.rb
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
139
- {YARD::Templates::Template#sections #sections} used by the template. If
140
- a setup.rb is not defined in the template itself, there should be a template
141
- that is inherited (via parent directory or explicitly) that sets the sections
142
- on a newly created template.
143
-
144
- A standard setup.rb file looks like:
145
-
146
- def init
147
- sections :section1, :section2, :section3
148
- end
149
-
150
- ## Sections
151
-
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
156
- list of sections).
157
-
158
- ## Nested Sections
159
-
160
- Sections often require the ability to encapsulate a set of sub-sections in markup
161
- (HTML, for instance). Rather than use heavier Template subclass objects, a more
162
- lightweight solution is to nest a set of sub-sections as a list that follows
163
- a section, for example:
164
-
165
- def init
166
- sections :header, [:section_a, :section_b]
167
- end
168
-
169
- The above example nests `section_a` and `section_b` within the `header` section.
170
- Practically speaking, these sections can be placed in the result by `yield`ing
171
- to them. A sample header.erb template might contain:
172
-
173
- <h2>Header</h2>
174
- <div id="contents">
175
- <%= yieldall %>
176
- </div>
177
-
178
- This template code would place the output of `section_a` and `section_b` within
179
- the above div element. Using `yieldall`, we can also change the object that is being
180
- rendered. For example, we may want to yield the first method of the class.
181
- We can do this like so:
182
-
183
- <h2>First method</h2>
184
- <%= yieldall :object => object.meths.first %>
185
-
186
- This would run the nested sections for the method object instead of the class.
187
-
188
- Note that `yieldall` yields to all subsections, whereas `yield` will yield
189
- to each individually (in order) until there are no more left to yield to.
190
- In the vast majority of cases, you'd want to use `yieldall`, since `yield`
191
- makes it hard for users to override your template.
192
-
193
- ## Inheriting Templates
194
-
195
- Parent directory templates are automatically inherited (or mixed in, to be
196
- more accurate) by the current template. This means that the 'default/class/html'
197
- template automatically inherits from 'default/class'. This also means that anything
198
- defined in 'default/class/setup.rb' can be overridden by 'default/class/html/setup.rb'.
199
-
200
- Since the Template module is a module, and not a class, they can be mixed in
201
- explicitly (via include/extend) from other templates, which allows templates
202
- to share erb files or helper logic. The 'default/class' template explicitly
203
- mixes in the 'default/module' template, since it uses much of the same sections.
204
- This is done with the helper {YARD::Templates::Template::ClassMethods#T T} method, which
205
- is simply a shorthand for {YARD::Templates::Engine.template Engine.template}.
206
- It can then override (using standard inheritance) the sections from the module
207
- template and insert sections pertaining to classes. This is one of the design
208
- goals described above.
209
-
210
- For instance, the first line in `default/class/html/setup.rb` is:
211
-
212
- include T('default/module/html')
213
-
214
- This includes the 'default/module/html', which means it also includes 'default/module'
215
- by extension. This allows class to make use of any of module's erb files.
216
-
217
- ## Inserting and Traversing Sections
218
-
219
- The ability to insert sections was mentioned above. The class template, for
220
- instance, will modify the #init method to insert class specific sections:
221
-
222
- def init
223
- super
224
- sections.place(:subclasses).before(:children)
225
- sections.delete(:children)
226
- sections.place([:constructor_details, [T('method_details')]]).before(:methodmissing)
227
- end
228
-
229
- Observe how sections has been modified after the super method was called (the
230
- super method would have been defined in `default/module/setup.rb`). The
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
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 overridden by
235
- another module).
236
-
237
- You can also use `sections[:name]` to find the first child section named `:name`.
238
- For instance, with the following sections declaration:
239
-
240
- sections :a, [:b, :c, [:d]]
241
-
242
- You can get to the :d section with:
243
-
244
- sections[:a][:c][:d]
245
-
246
- You can use this to insert a section inside a nested set without using indexed
247
- access. The following command would result in `[:a, [:b, :c, [:d, :e]]]`:
248
-
249
- sections[:a][:c].place(:e).after(:d)
250
-
251
- There are also two methods, {Insertion#before_any} and {Insertion#after_any},
252
- which allow you to insert sections before or after the first matching section name
253
- recursively. The above example could simply be rewritten as:
254
-
255
- sections.place(:e).after_any(:d)
256
-
257
- ## Overriding Templates by Registering a Template Path
258
-
259
- Inheriting templates explicitly is useful when creating a customized template
260
- that wants to take advantage of code re-use. However, most users who want
261
- to customize YARD templates will want to override existing behaviour without
262
- creating a template from scratch.
263
-
264
- YARD solves this problem by allowing other template paths to be registered.
265
- Because template modules are represented by a relative path such as 'default/class',
266
- they can be found within any of the registered template paths. A new template
267
- path is registered as:
268
-
269
- YARD::Templates::Engine.register_template_path '/path/to/mytemplates'
270
-
271
- At this point, any time the 'default/class' template is loaded, the template
272
- will first be looked for inside the newly registered template path. If found,
273
- it will be used as the template module, with the modules from the other
274
- template paths implicitly mixed in.
275
-
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
278
- inherited. A real world example would further modify the 'default/class' template
279
- seen above by creating such a path in our '/path/to/mytemplates' custom template
280
- path:
281
-
282
- /path/to/mytemplates/:
283
- |-- class
284
- | |-- html
285
- | | |-- customsection.erb
286
- | |-- setup.rb
287
-
288
- The `setup.rb` file would look like:
289
-
290
- def init
291
- super
292
- sections.push :customsection
293
- end
294
-
295
- Now, when a class object is formatted as HTML, our customsection.erb will be
296
- appended to the rendered data.
297
-
298
-
299
- ### Overriding Stylesheets and Javascripts
300
-
301
- Template authors can override existing stylesheets and javascripts by creating
302
- a file with the same name as existing files within the `fulldoc` template. The
303
- documentation output will utilize the new replacement file.
304
-
305
- YARD's `fulldoc` template defines three stylesheets:
306
-
307
- /yard/templates/default/:
308
- |-- fulldoc
309
- | |-- html
310
- | | |-- css
311
- | | | |-- common.css
312
- | | | |-- full_list.css
313
- | | | |-- style.css
314
-
315
- The `style.css` is the primary stylesheet for the HTML output.
316
-
317
- The `full_list.css` is an additional stylesheet loaded specifically for the
318
- search field menus (i.e. class list, method list, and file list).
319
-
320
- The `common.css` is an empty css file that an template author can easily override
321
- to provide custom styles for their plugin. However, if a user installs multiple
322
- plugins that utilize this same file to deliver styles, it is possible that they
323
- will be overridden.
324
-
325
- YARD's `fulldoc` template defines three javascript files:
326
-
327
- /yard/templates/default/:
328
- |-- fulldoc
329
- | |-- html
330
- | | |-- js
331
- | | | |-- app.js
332
- | | | |-- full_list.js
333
- | | | |-- jquery.js
334
-
335
- The `app.js` is the primary javascript file for the HTML output.
336
-
337
- The `full_list.js` defines additional javascript loaded specifically for the
338
- search field menus (i.e. class list, method list, and file list).
339
-
340
- The `jquery.js` is copy of the jquery javascript library.
341
-
342
- ### Adding a Custom Stylesheet or Javascript
343
-
344
- To load additional stylesheets and javascripts with every page (except the search
345
- field menus) generated from the base `layout` template:
346
-
347
- 1. Define your own custom stylesheet and/or javascript file
348
- (default/ is the default template name inside of the /template root directory):
349
-
350
- /template/default/:
351
- |-- fulldoc
352
- | |-- html
353
- | | |-- css
354
- | | | |-- custom.css
355
- | | |-- js
356
- | | | |-- custom.js
357
-
358
- 2. Create a `setup.rb` in the `layout` template directory and override the methods
359
- `stylesheets` and `javascripts`. The path to the template would be:
360
-
361
- /template/default/:
362
- |-- layout
363
- | |-- html
364
- | | |-- setup.rb
365
-
366
- And the code would look like:
367
-
368
- def stylesheets
369
- # Load the existing stylesheets while appending the custom one
370
- super + %w(css/custom.css)
371
- end
372
-
373
- def javascripts
374
- # Load the existing javascripts while appending the custom one
375
- super + %w(js/custom.js)
376
- end
377
-
378
-
379
- To load additional stylesheets and javascripts for the search menus loaded from
380
- the `fulldoc` template:
381
-
382
- 1. Define your own custom stylesheet and/or javascript file.
383
-
384
- /path/to/mytemplates/:
385
- |-- fulldoc
386
- | |-- html
387
- | | |-- css
388
- | | | |-- custom_full_menu.css
389
- | | |-- js
390
- | | | |-- custom_full_menu.js
391
-
392
-
393
- 3. Override the methods `stylesheets_full_list` and `javascripts_full_list`
394
- in the `setup.rb` file inside fulldoc/html.
395
-
396
- def stylesheets_full_list
397
- # Load the existing stylesheets while appending the custom one
398
- super + %w(css/custom.css)
399
- end
400
-
401
- def javascripts_full_list
402
- # Load the existing javascripts while appending the custom one
403
- super + %w(js/custom.js)
404
- end
405
-
406
- ### Overriding Search Menus
407
-
408
- By default YARD's `fulldoc` template generates three search fields:
409
-
410
- * Class List
411
- * Method List
412
- * File List
413
-
414
- Their contents are rendered in methods within the `fulldoc` template:
415
-
416
- * `generate_class_list`
417
- * `generate_method_list`
418
- * `generate_file_list`
419
-
420
- To override these lists you will need to:
421
-
422
- 1. Create a `setup.rb` in the `fulldoc` template directory and override the
423
- particular method.
424
-
425
- /path/to/mytemplates/:
426
- |-- fulldoc
427
- | |-- html
428
- | | |-- setup.rb
429
-
430
- def generate_method_list
431
- @items = prune_method_listing(Registry.all(:method), false)
432
- @items = @items.reject {|m| m.name.to_s =~ /=$/ && m.is_attribute? }
433
-
434
- # Here we changed the functionality to reverse the order of displayed methods
435
- @items = @items.sort_by {|m| m.name.to_s }.reverse
436
- @list_title = "Method List"
437
- @list_type = "methods"
438
- asset('method_list.html', erb(:full_list))
439
- end
440
-
441
- ### Adding Additional Search Menus
442
-
443
- By default YARD's `fulldoc` template generates three search fields:
444
-
445
- * Class List
446
- * Method List
447
- * File List
448
-
449
- These are defined in the `layout` template method `menu_lists` and pulled into
450
- the `fulldoc` template through a similarly named method.
451
-
452
- To load an additional menu item:
453
-
454
-
455
- 1. Create a `setup.rb` in the `layout` template directory and override the methods
456
- `menu_lists`. The `type` informs the search field the name of the file.
457
- The `title` is the name that appears above the section when viewed in frames.
458
- The `search_title` is the name that appears in the search field tab on the page.
459
-
460
-
461
- /path/to/mytemplates/:
462
- |-- layout
463
- | |-- html
464
- | | |-- setup.rb
465
-
466
- def menu_lists
467
- # Load the existing menus
468
- super + [ { :type => 'feature', :title => 'Features', :search_title => 'Feature List' } ]
469
- end
470
-
471
- 2. Create a `setup.rb` in the `fulldoc` template directory and create a method
472
- to generate a menu for the specified `type`.
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
475
- method you can configure and load the specific objects you wish to display.
476
-
477
- /path/to/mytemplates/:
478
- |-- fulldoc
479
- | |-- html
480
- | | |-- setup.rb
481
-
482
- def generate_feature_list
483
-
484
- # load all the features from the Registry
485
- @items = Registry.all(:feature)
486
- @list_title = "Feature List"
487
- @list_type = "feature"
488
-
489
- # optional: the specified stylesheet class
490
- # when not specified it will default to the value of @list_type
491
- @list_class = "class"
492
-
493
- # Generate the full list html file with named feature_list.html
494
- # @note this file must be match the name of the type
495
- asset('feature_list.html', erb(:full_list))
496
- end
1
+ # @title Templates Architecture
2
+
3
+ # Templates Architecture
4
+
5
+ Templates are the main component in the output rendering process of YARD,
6
+ which is invoked when conventional HTML/text output needs to be rendered
7
+ for a set of code objects.
8
+
9
+ ## Design Goals
10
+
11
+ The general design attempts to be as abstracted from actual content and templates
12
+ as possible. Unlike RDoc which uses one file to describe the entire template,
13
+ YARD splits up the rendering of code objects into small components, allowing
14
+ template modification for smaller subsets of a full template without having to
15
+ duplicate the entire template itself. This is necessary because of YARD's support
16
+ for plugins. YARD is designed for extensibility by external plugins, and because
17
+ of this, no one plugin can be responsible for the entire template because no
18
+ one plugin knows about the other plugins being used. For instance, if an RSpec
19
+ plugin was added to support and document specifications in class templates,
20
+ this information would need to be transparently added to the template to work
21
+ in conjunction with any other plugin that performed similar template modifications.
22
+ The design goals can be summarized as follows:
23
+
24
+ 1. Output should be able to be rendered for any arbitrary format with little
25
+ modification to YARD's source code. The addition of extra templates should
26
+ be sufficient.
27
+ 2. The output rendered for an object should independently rendered data
28
+ from arbitrary sources. These independent components are called "sections".
29
+ 3. Sections should be able to be inserted into any object without affecting
30
+ any existing sections in the document. This allows for easy modification
31
+ of templates by plugins.
32
+
33
+ ## Templates
34
+
35
+ Template modules are the objects used to orchestrate the design goals listed
36
+ above. Specifically, they organize the sections and render the template contents
37
+ depending on the format.
38
+
39
+ ## Engine
40
+
41
+ The Engine class orchestrates the creation and rendering of Template modules and
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
48
+ needed. For instance, an object may be rendered with:
49
+
50
+ YARD::Templates::Engine.render(:object => myobject)
51
+
52
+ A set of objects may be rendered into HTML documentation by using:
53
+
54
+ # all_objects is an array of module and class objects
55
+ # options includes a :serializer key to copy output to the file system
56
+ YARD::Templates::Engine.generate(all_objects, options)
57
+
58
+ Note that these methods should not be called directly. The {YARD::CodeObjects::Base}
59
+ class has a {YARD::CodeObjects::Base#format #format} helper method to render an
60
+ object. For instance, the above render example is equivalent to the simple
61
+ call `myobject.format`. The `generate` method is a special kind of render
62
+ and is called from the {YARD::CLI::Yardoc} command line utility.
63
+
64
+ ## Template Options
65
+
66
+ A template keeps state when it is rendering output. This state is kept in
67
+ an options hash which is initially passed to it during instantiation. Some
68
+ default options set the template style (`:template`), the output format (`:format`),
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
71
+ HTML instead of text can be done as follows:
72
+
73
+ myobject.format(:format => :html)
74
+
75
+ ## Serializer
76
+
77
+ This class abstracts the logic involved in deciding how to serialize data to
78
+ the expected endpoint. For instance, there is both a {YARD::Serializers::StdoutSerializer StdoutSerializer}
79
+ and {YARD::Serializers::FileSystemSerializer FileSystemSerializer} class for
80
+ outputting to console or to a file respectively. When endpoints with locations
81
+ are used (like files or URLs), the serializer implements the {YARD::Serializers::Base#serialized_path #serialized_path}
82
+ method. This allows the translation from a code object to its path at the endpoint,
83
+ which enables inter-document linking.
84
+
85
+ Rendered objects are automatically serialized using the object if present,
86
+ otherwise the rendered object is returned as a string to its parent. Nested
87
+ Templates automatically set the serializer to nil so that they return
88
+ as a String to their parent.
89
+
90
+ ## Creating a Template
91
+
92
+ Templates are represented by a directory inside the {YARD::Templates::Engine.template_paths}
93
+ on disk. A standard template directory looks like the following tree:
94
+
95
+ (Assuming templates/ is a template path)
96
+ templates
97
+ `-- default
98
+ |-- class
99
+ | |-- dot
100
+ | | |-- setup.rb
101
+ | | `-- superklass.erb
102
+ | |-- html
103
+ | | |-- constructor_details.erb
104
+ | | |-- setup.rb
105
+ | | `-- subclasses.erb
106
+ | |-- setup.rb
107
+ | `-- text
108
+ | |-- setup.rb
109
+ | `-- subclasses.erb
110
+ |-- docstring
111
+ | |-- html
112
+ | | |-- abstract.erb
113
+ | | |-- deprecated.erb
114
+ | | |-- index.erb
115
+ | | `-- text.erb
116
+ | |-- setup.rb
117
+ | `-- text
118
+ | |-- abstract.erb
119
+ | |-- deprecated.erb
120
+ | |-- index.erb
121
+ | `-- text.erb
122
+
123
+ The path `default` refers to the template style (:template key in options hash)
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.
127
+
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
130
+ files are the sections that make up the template.
131
+
132
+ Note that the subdirectory `html/` is also its own "template" that inherits
133
+ from the parent directory. We will see more on this later.
134
+
135
+ ## setup.rb
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
139
+ {YARD::Templates::Template#sections #sections} used by the template. If
140
+ a setup.rb is not defined in the template itself, there should be a template
141
+ that is inherited (via parent directory or explicitly) that sets the sections
142
+ on a newly created template.
143
+
144
+ A standard setup.rb file looks like:
145
+
146
+ def init
147
+ sections :section1, :section2, :section3
148
+ end
149
+
150
+ ## Sections
151
+
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
156
+ list of sections).
157
+
158
+ ## Nested Sections
159
+
160
+ Sections often require the ability to encapsulate a set of sub-sections in markup
161
+ (HTML, for instance). Rather than use heavier Template subclass objects, a more
162
+ lightweight solution is to nest a set of sub-sections as a list that follows
163
+ a section, for example:
164
+
165
+ def init
166
+ sections :header, [:section_a, :section_b]
167
+ end
168
+
169
+ The above example nests `section_a` and `section_b` within the `header` section.
170
+ Practically speaking, these sections can be placed in the result by `yield`ing
171
+ to them. A sample header.erb template might contain:
172
+
173
+ <h2>Header</h2>
174
+ <div id="contents">
175
+ <%= yieldall %>
176
+ </div>
177
+
178
+ This template code would place the output of `section_a` and `section_b` within
179
+ the above div element. Using `yieldall`, we can also change the object that is being
180
+ rendered. For example, we may want to yield the first method of the class.
181
+ We can do this like so:
182
+
183
+ <h2>First method</h2>
184
+ <%= yieldall :object => object.meths.first %>
185
+
186
+ This would run the nested sections for the method object instead of the class.
187
+
188
+ Note that `yieldall` yields to all subsections, whereas `yield` will yield
189
+ to each individually (in order) until there are no more left to yield to.
190
+ In the vast majority of cases, you'd want to use `yieldall`, since `yield`
191
+ makes it hard for users to override your template.
192
+
193
+ ## Inheriting Templates
194
+
195
+ Parent directory templates are automatically inherited (or mixed in, to be
196
+ more accurate) by the current template. This means that the 'default/class/html'
197
+ template automatically inherits from 'default/class'. This also means that anything
198
+ defined in 'default/class/setup.rb' can be overridden by 'default/class/html/setup.rb'.
199
+
200
+ Since the Template module is a module, and not a class, they can be mixed in
201
+ explicitly (via include/extend) from other templates, which allows templates
202
+ to share erb files or helper logic. The 'default/class' template explicitly
203
+ mixes in the 'default/module' template, since it uses much of the same sections.
204
+ This is done with the helper {YARD::Templates::Template::ClassMethods#T T} method, which
205
+ is simply a shorthand for {YARD::Templates::Engine.template Engine.template}.
206
+ It can then override (using standard inheritance) the sections from the module
207
+ template and insert sections pertaining to classes. This is one of the design
208
+ goals described above.
209
+
210
+ For instance, the first line in `default/class/html/setup.rb` is:
211
+
212
+ include T('default/module/html')
213
+
214
+ This includes the 'default/module/html', which means it also includes 'default/module'
215
+ by extension. This allows class to make use of any of module's erb files.
216
+
217
+ ## Inserting and Traversing Sections
218
+
219
+ The ability to insert sections was mentioned above. The class template, for
220
+ instance, will modify the #init method to insert class specific sections:
221
+
222
+ def init
223
+ super
224
+ sections.place(:subclasses).before(:children)
225
+ sections.delete(:children)
226
+ sections.place([:constructor_details, [T('method_details')]]).before(:methodmissing)
227
+ end
228
+
229
+ Observe how sections has been modified after the super method was called (the
230
+ super method would have been defined in `default/module/setup.rb`). The
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
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 overridden by
235
+ another module).
236
+
237
+ You can also use `sections[:name]` to find the first child section named `:name`.
238
+ For instance, with the following sections declaration:
239
+
240
+ sections :a, [:b, :c, [:d]]
241
+
242
+ You can get to the :d section with:
243
+
244
+ sections[:a][:c][:d]
245
+
246
+ You can use this to insert a section inside a nested set without using indexed
247
+ access. The following command would result in `[:a, [:b, :c, [:d, :e]]]`:
248
+
249
+ sections[:a][:c].place(:e).after(:d)
250
+
251
+ There are also two methods, {Insertion#before_any} and {Insertion#after_any},
252
+ which allow you to insert sections before or after the first matching section name
253
+ recursively. The above example could simply be rewritten as:
254
+
255
+ sections.place(:e).after_any(:d)
256
+
257
+ ## Overriding Templates by Registering a Template Path
258
+
259
+ Inheriting templates explicitly is useful when creating a customized template
260
+ that wants to take advantage of code re-use. However, most users who want
261
+ to customize YARD templates will want to override existing behaviour without
262
+ creating a template from scratch.
263
+
264
+ YARD solves this problem by allowing other template paths to be registered.
265
+ Because template modules are represented by a relative path such as 'default/class',
266
+ they can be found within any of the registered template paths. A new template
267
+ path is registered as:
268
+
269
+ YARD::Templates::Engine.register_template_path '/path/to/mytemplates'
270
+
271
+ At this point, any time the 'default/class' template is loaded, the template
272
+ will first be looked for inside the newly registered template path. If found,
273
+ it will be used as the template module, with the modules from the other
274
+ template paths implicitly mixed in.
275
+
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
278
+ inherited. A real world example would further modify the 'default/class' template
279
+ seen above by creating such a path in our '/path/to/mytemplates' custom template
280
+ path:
281
+
282
+ /path/to/mytemplates/:
283
+ |-- class
284
+ | |-- html
285
+ | | |-- customsection.erb
286
+ | |-- setup.rb
287
+
288
+ The `setup.rb` file would look like:
289
+
290
+ def init
291
+ super
292
+ sections.push :customsection
293
+ end
294
+
295
+ Now, when a class object is formatted as HTML, our customsection.erb will be
296
+ appended to the rendered data.
297
+
298
+
299
+ ### Overriding Stylesheets and Javascripts
300
+
301
+ Template authors can override existing stylesheets and javascripts by creating
302
+ a file with the same name as existing files within the `fulldoc` template. The
303
+ documentation output will utilize the new replacement file.
304
+
305
+ YARD's `fulldoc` template defines three stylesheets:
306
+
307
+ /yard/templates/default/:
308
+ |-- fulldoc
309
+ | |-- html
310
+ | | |-- css
311
+ | | | |-- common.css
312
+ | | | |-- full_list.css
313
+ | | | |-- style.css
314
+
315
+ The `style.css` is the primary stylesheet for the HTML output.
316
+
317
+ The `full_list.css` is an additional stylesheet loaded specifically for the
318
+ search field menus (i.e. class list, method list, and file list).
319
+
320
+ The `common.css` is an empty css file that an template author can easily override
321
+ to provide custom styles for their plugin. However, if a user installs multiple
322
+ plugins that utilize this same file to deliver styles, it is possible that they
323
+ will be overridden.
324
+
325
+ YARD's `fulldoc` template defines three javascript files:
326
+
327
+ /yard/templates/default/:
328
+ |-- fulldoc
329
+ | |-- html
330
+ | | |-- js
331
+ | | | |-- app.js
332
+ | | | |-- full_list.js
333
+ | | | |-- jquery.js
334
+
335
+ The `app.js` is the primary javascript file for the HTML output.
336
+
337
+ The `full_list.js` defines additional javascript loaded specifically for the
338
+ search field menus (i.e. class list, method list, and file list).
339
+
340
+ The `jquery.js` is copy of the jquery javascript library.
341
+
342
+ ### Adding a Custom Stylesheet or Javascript
343
+
344
+ To load additional stylesheets and javascripts with every page (except the search
345
+ field menus) generated from the base `layout` template:
346
+
347
+ 1. Define your own custom stylesheet and/or javascript file
348
+ (default/ is the default template name inside of the /template root directory):
349
+
350
+ /template/default/:
351
+ |-- fulldoc
352
+ | |-- html
353
+ | | |-- css
354
+ | | | |-- custom.css
355
+ | | |-- js
356
+ | | | |-- custom.js
357
+
358
+ 2. Create a `setup.rb` in the `layout` template directory and override the methods
359
+ `stylesheets` and `javascripts`. The path to the template would be:
360
+
361
+ /template/default/:
362
+ |-- layout
363
+ | |-- html
364
+ | | |-- setup.rb
365
+
366
+ And the code would look like:
367
+
368
+ def stylesheets
369
+ # Load the existing stylesheets while appending the custom one
370
+ super + %w(css/custom.css)
371
+ end
372
+
373
+ def javascripts
374
+ # Load the existing javascripts while appending the custom one
375
+ super + %w(js/custom.js)
376
+ end
377
+
378
+
379
+ To load additional stylesheets and javascripts for the search menus loaded from
380
+ the `fulldoc` template:
381
+
382
+ 1. Define your own custom stylesheet and/or javascript file.
383
+
384
+ /path/to/mytemplates/:
385
+ |-- fulldoc
386
+ | |-- html
387
+ | | |-- css
388
+ | | | |-- custom_full_menu.css
389
+ | | |-- js
390
+ | | | |-- custom_full_menu.js
391
+
392
+
393
+ 3. Override the methods `stylesheets_full_list` and `javascripts_full_list`
394
+ in the `setup.rb` file inside fulldoc/html.
395
+
396
+ def stylesheets_full_list
397
+ # Load the existing stylesheets while appending the custom one
398
+ super + %w(css/custom.css)
399
+ end
400
+
401
+ def javascripts_full_list
402
+ # Load the existing javascripts while appending the custom one
403
+ super + %w(js/custom.js)
404
+ end
405
+
406
+ ### Overriding Search Menus
407
+
408
+ By default YARD's `fulldoc` template generates three search fields:
409
+
410
+ * Class List
411
+ * Method List
412
+ * File List
413
+
414
+ Their contents are rendered in methods within the `fulldoc` template:
415
+
416
+ * `generate_class_list`
417
+ * `generate_method_list`
418
+ * `generate_file_list`
419
+
420
+ To override these lists you will need to:
421
+
422
+ 1. Create a `setup.rb` in the `fulldoc` template directory and override the
423
+ particular method.
424
+
425
+ /path/to/mytemplates/:
426
+ |-- fulldoc
427
+ | |-- html
428
+ | | |-- setup.rb
429
+
430
+ def generate_method_list
431
+ @items = prune_method_listing(Registry.all(:method), false)
432
+ @items = @items.reject {|m| m.name.to_s =~ /=$/ && m.is_attribute? }
433
+
434
+ # Here we changed the functionality to reverse the order of displayed methods
435
+ @items = @items.sort_by {|m| m.name.to_s }.reverse
436
+ @list_title = "Method List"
437
+ @list_type = "methods"
438
+ asset('method_list.html', erb(:full_list))
439
+ end
440
+
441
+ ### Adding Additional Search Menus
442
+
443
+ By default YARD's `fulldoc` template generates three search fields:
444
+
445
+ * Class List
446
+ * Method List
447
+ * File List
448
+
449
+ These are defined in the `layout` template method `menu_lists` and pulled into
450
+ the `fulldoc` template through a similarly named method.
451
+
452
+ To load an additional menu item:
453
+
454
+
455
+ 1. Create a `setup.rb` in the `layout` template directory and override the methods
456
+ `menu_lists`. The `type` informs the search field the name of the file.
457
+ The `title` is the name that appears above the section when viewed in frames.
458
+ The `search_title` is the name that appears in the search field tab on the page.
459
+
460
+
461
+ /path/to/mytemplates/:
462
+ |-- layout
463
+ | |-- html
464
+ | | |-- setup.rb
465
+
466
+ def menu_lists
467
+ # Load the existing menus
468
+ super + [ { :type => 'feature', :title => 'Features', :search_title => 'Feature List' } ]
469
+ end
470
+
471
+ 2. Create a `setup.rb` in the `fulldoc` template directory and create a method
472
+ to generate a menu for the specified `type`.
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
475
+ method you can configure and load the specific objects you wish to display.
476
+
477
+ /path/to/mytemplates/:
478
+ |-- fulldoc
479
+ | |-- html
480
+ | | |-- setup.rb
481
+
482
+ def generate_feature_list
483
+
484
+ # load all the features from the Registry
485
+ @items = Registry.all(:feature)
486
+ @list_title = "Feature List"
487
+ @list_type = "feature"
488
+
489
+ # optional: the specified stylesheet class
490
+ # when not specified it will default to the value of @list_type
491
+ @list_class = "class"
492
+
493
+ # Generate the full list html file with named feature_list.html
494
+ # @note this file must be match the name of the type
495
+ asset('feature_list.html', erb(:full_list))
496
+ end