yard 0.9.16 → 0.9.17

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 (566) hide show
  1. checksums.yaml +5 -5
  2. data/.yardopts +26 -26
  3. data/CHANGELOG.md +728 -728
  4. data/LEGAL +66 -66
  5. data/LICENSE +22 -22
  6. data/README.md +328 -328
  7. data/Rakefile +53 -47
  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 +303 -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 +788 -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 -610
  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 +131 -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 +20 -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 -378
  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 +211 -211
  95. data/lib/yard/handlers/c/init_handler.rb +20 -20
  96. data/lib/yard/handlers/c/method_handler.rb +45 -36
  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/processor.rb +200 -200
  104. data/lib/yard/handlers/ruby/alias_handler.rb +44 -44
  105. data/lib/yard/handlers/ruby/attribute_handler.rb +87 -87
  106. data/lib/yard/handlers/ruby/base.rb +165 -165
  107. data/lib/yard/handlers/ruby/class_condition_handler.rb +92 -92
  108. data/lib/yard/handlers/ruby/class_handler.rb +119 -119
  109. data/lib/yard/handlers/ruby/class_variable_handler.rb +17 -17
  110. data/lib/yard/handlers/ruby/comment_handler.rb +10 -10
  111. data/lib/yard/handlers/ruby/constant_handler.rb +59 -59
  112. data/lib/yard/handlers/ruby/decorator_handler_methods.rb +123 -123
  113. data/lib/yard/handlers/ruby/dsl_handler.rb +15 -15
  114. data/lib/yard/handlers/ruby/dsl_handler_methods.rb +96 -95
  115. data/lib/yard/handlers/ruby/exception_handler.rb +27 -27
  116. data/lib/yard/handlers/ruby/extend_handler.rb +22 -22
  117. data/lib/yard/handlers/ruby/legacy/alias_handler.rb +37 -37
  118. data/lib/yard/handlers/ruby/legacy/attribute_handler.rb +65 -65
  119. data/lib/yard/handlers/ruby/legacy/base.rb +245 -245
  120. data/lib/yard/handlers/ruby/legacy/class_condition_handler.rb +83 -83
  121. data/lib/yard/handlers/ruby/legacy/class_handler.rb +113 -113
  122. data/lib/yard/handlers/ruby/legacy/class_variable_handler.rb +15 -15
  123. data/lib/yard/handlers/ruby/legacy/comment_handler.rb +10 -10
  124. data/lib/yard/handlers/ruby/legacy/constant_handler.rb +29 -29
  125. data/lib/yard/handlers/ruby/legacy/dsl_handler.rb +17 -17
  126. data/lib/yard/handlers/ruby/legacy/exception_handler.rb +13 -13
  127. data/lib/yard/handlers/ruby/legacy/extend_handler.rb +21 -21
  128. data/lib/yard/handlers/ruby/legacy/method_handler.rb +90 -90
  129. data/lib/yard/handlers/ruby/legacy/mixin_handler.rb +39 -39
  130. data/lib/yard/handlers/ruby/legacy/module_function_handler.rb +19 -19
  131. data/lib/yard/handlers/ruby/legacy/module_handler.rb +12 -12
  132. data/lib/yard/handlers/ruby/legacy/private_class_method_handler.rb +22 -22
  133. data/lib/yard/handlers/ruby/legacy/private_constant_handler.rb +22 -22
  134. data/lib/yard/handlers/ruby/legacy/visibility_handler.rb +17 -17
  135. data/lib/yard/handlers/ruby/legacy/yield_handler.rb +29 -29
  136. data/lib/yard/handlers/ruby/method_condition_handler.rb +9 -9
  137. data/lib/yard/handlers/ruby/method_handler.rb +118 -118
  138. data/lib/yard/handlers/ruby/mixin_handler.rb +37 -37
  139. data/lib/yard/handlers/ruby/module_function_handler.rb +27 -27
  140. data/lib/yard/handlers/ruby/module_handler.rb +12 -12
  141. data/lib/yard/handlers/ruby/private_class_method_handler.rb +14 -14
  142. data/lib/yard/handlers/ruby/private_constant_handler.rb +43 -43
  143. data/lib/yard/handlers/ruby/public_class_method_handler.rb +14 -14
  144. data/lib/yard/handlers/ruby/struct_handler_methods.rb +143 -143
  145. data/lib/yard/handlers/ruby/visibility_handler.rb +22 -22
  146. data/lib/yard/handlers/ruby/yield_handler.rb +31 -31
  147. data/lib/yard/i18n/locale.rb +67 -67
  148. data/lib/yard/i18n/message.rb +57 -57
  149. data/lib/yard/i18n/messages.rb +56 -56
  150. data/lib/yard/i18n/po_parser.rb +61 -61
  151. data/lib/yard/i18n/pot_generator.rb +290 -290
  152. data/lib/yard/i18n/text.rb +173 -173
  153. data/lib/yard/logging.rb +205 -205
  154. data/lib/yard/options.rb +217 -217
  155. data/lib/yard/parser/base.rb +57 -57
  156. data/lib/yard/parser/c/c_parser.rb +235 -235
  157. data/lib/yard/parser/c/comment_parser.rb +134 -134
  158. data/lib/yard/parser/c/statement.rb +64 -64
  159. data/lib/yard/parser/ruby/ast_node.rb +540 -540
  160. data/lib/yard/parser/ruby/legacy/ruby_lex.rb +1354 -1354
  161. data/lib/yard/parser/ruby/legacy/ruby_parser.rb +32 -32
  162. data/lib/yard/parser/ruby/legacy/statement.rb +66 -66
  163. data/lib/yard/parser/ruby/legacy/statement_list.rb +394 -394
  164. data/lib/yard/parser/ruby/legacy/token_list.rb +74 -74
  165. data/lib/yard/parser/ruby/ruby_parser.rb +687 -687
  166. data/lib/yard/parser/ruby/token_resolver.rb +156 -156
  167. data/lib/yard/parser/source_parser.rb +526 -526
  168. data/lib/yard/rake/yardoc_task.rb +81 -81
  169. data/lib/yard/registry.rb +439 -439
  170. data/lib/yard/registry_resolver.rb +189 -189
  171. data/lib/yard/registry_store.rb +337 -337
  172. data/lib/yard/rubygems/backports.rb +10 -10
  173. data/lib/yard/rubygems/backports/LICENSE.txt +57 -57
  174. data/lib/yard/rubygems/backports/MIT.txt +20 -20
  175. data/lib/yard/rubygems/backports/gem.rb +10 -10
  176. data/lib/yard/rubygems/backports/source_index.rb +365 -365
  177. data/lib/yard/rubygems/doc_manager.rb +90 -90
  178. data/lib/yard/rubygems/hook.rb +197 -197
  179. data/lib/yard/rubygems/specification.rb +50 -50
  180. data/lib/yard/serializers/base.rb +83 -83
  181. data/lib/yard/serializers/file_system_serializer.rb +123 -123
  182. data/lib/yard/serializers/process_serializer.rb +24 -24
  183. data/lib/yard/serializers/stdout_serializer.rb +34 -34
  184. data/lib/yard/serializers/yardoc_serializer.rb +152 -152
  185. data/lib/yard/server.rb +13 -13
  186. data/lib/yard/server/adapter.rb +100 -100
  187. data/lib/yard/server/commands/base.rb +209 -209
  188. data/lib/yard/server/commands/display_file_command.rb +29 -29
  189. data/lib/yard/server/commands/display_object_command.rb +65 -65
  190. data/lib/yard/server/commands/frames_command.rb +16 -16
  191. data/lib/yard/server/commands/library_command.rb +187 -187
  192. data/lib/yard/server/commands/library_index_command.rb +28 -28
  193. data/lib/yard/server/commands/list_command.rb +25 -25
  194. data/lib/yard/server/commands/root_request_command.rb +15 -15
  195. data/lib/yard/server/commands/search_command.rb +79 -79
  196. data/lib/yard/server/commands/static_file_command.rb +23 -23
  197. data/lib/yard/server/commands/static_file_helpers.rb +62 -62
  198. data/lib/yard/server/doc_server_helper.rb +91 -91
  199. data/lib/yard/server/doc_server_serializer.rb +39 -39
  200. data/lib/yard/server/library_version.rb +277 -277
  201. data/lib/yard/server/rack_adapter.rb +89 -89
  202. data/lib/yard/server/router.rb +187 -187
  203. data/lib/yard/server/static_caching.rb +46 -46
  204. data/lib/yard/server/templates/default/fulldoc/html/css/custom.css +127 -127
  205. data/lib/yard/server/templates/default/fulldoc/html/js/autocomplete.js +11 -11
  206. data/lib/yard/server/templates/default/layout/html/breadcrumb.erb +37 -37
  207. data/lib/yard/server/templates/default/layout/html/script_setup.erb +7 -7
  208. data/lib/yard/server/templates/default/layout/html/setup.rb +8 -8
  209. data/lib/yard/server/templates/default/method_details/html/permalink.erb +4 -4
  210. data/lib/yard/server/templates/default/method_details/html/setup.rb +5 -5
  211. data/lib/yard/server/templates/doc_server/library_list/html/headers.erb +8 -8
  212. data/lib/yard/server/templates/doc_server/library_list/html/library_list.erb +14 -14
  213. data/lib/yard/server/templates/doc_server/library_list/html/listing.erb +13 -13
  214. data/lib/yard/server/templates/doc_server/library_list/html/setup.rb +6 -6
  215. data/lib/yard/server/templates/doc_server/library_list/html/title.erb +2 -2
  216. data/lib/yard/server/templates/doc_server/processing/html/processing.erb +52 -52
  217. data/lib/yard/server/templates/doc_server/processing/html/setup.rb +4 -4
  218. data/lib/yard/server/templates/doc_server/search/html/search.erb +18 -18
  219. data/lib/yard/server/templates/doc_server/search/html/setup.rb +9 -9
  220. data/lib/yard/server/webrick_adapter.rb +45 -45
  221. data/lib/yard/tags/default_factory.rb +191 -191
  222. data/lib/yard/tags/default_tag.rb +13 -13
  223. data/lib/yard/tags/directives.rb +616 -616
  224. data/lib/yard/tags/library.rb +633 -633
  225. data/lib/yard/tags/option_tag.rb +13 -13
  226. data/lib/yard/tags/overload_tag.rb +71 -71
  227. data/lib/yard/tags/ref_tag.rb +8 -8
  228. data/lib/yard/tags/ref_tag_list.rb +28 -28
  229. data/lib/yard/tags/tag.rb +71 -71
  230. data/lib/yard/tags/tag_format_error.rb +7 -7
  231. data/lib/yard/tags/types_explainer.rb +162 -162
  232. data/lib/yard/templates/engine.rb +186 -186
  233. data/lib/yard/templates/erb_cache.rb +23 -23
  234. data/lib/yard/templates/helpers/base_helper.rb +215 -215
  235. data/lib/yard/templates/helpers/filter_helper.rb +27 -27
  236. data/lib/yard/templates/helpers/html_helper.rb +646 -642
  237. data/lib/yard/templates/helpers/html_syntax_highlight_helper.rb +78 -78
  238. data/lib/yard/templates/helpers/markup/rdoc_markdown.rb +23 -23
  239. data/lib/yard/templates/helpers/markup/rdoc_markup.rb +109 -109
  240. data/lib/yard/templates/helpers/markup_helper.rb +172 -172
  241. data/lib/yard/templates/helpers/method_helper.rb +75 -75
  242. data/lib/yard/templates/helpers/module_helper.rb +21 -21
  243. data/lib/yard/templates/helpers/text_helper.rb +112 -112
  244. data/lib/yard/templates/helpers/uml_helper.rb +47 -47
  245. data/lib/yard/templates/section.rb +105 -105
  246. data/lib/yard/templates/template.rb +418 -418
  247. data/lib/yard/templates/template_options.rb +92 -92
  248. data/lib/yard/verifier.rb +151 -151
  249. data/lib/yard/version.rb +3 -1
  250. data/spec/cli/command_parser_spec.rb +43 -43
  251. data/spec/cli/command_spec.rb +36 -36
  252. data/spec/cli/config_spec.rb +148 -148
  253. data/spec/cli/diff_spec.rb +254 -254
  254. data/spec/cli/display_spec.rb +30 -30
  255. data/spec/cli/gems_spec.rb +81 -81
  256. data/spec/cli/graph_spec.rb +18 -18
  257. data/spec/cli/help_spec.rb +22 -22
  258. data/spec/cli/i18n_spec.rb +107 -107
  259. data/spec/cli/list_spec.rb +8 -8
  260. data/spec/cli/markup_types_spec.rb +22 -22
  261. data/spec/cli/server_spec.rb +324 -324
  262. data/spec/cli/stats_spec.rb +96 -96
  263. data/spec/cli/yard_on_yard_spec.rb +38 -38
  264. data/spec/cli/yardoc_spec.rb +862 -849
  265. data/spec/cli/yri_spec.rb +101 -101
  266. data/spec/code_objects/base_spec.rb +470 -460
  267. data/spec/code_objects/class_object_spec.rb +226 -226
  268. data/spec/code_objects/code_object_list_spec.rb +36 -36
  269. data/spec/code_objects/constants_spec.rb +116 -116
  270. data/spec/code_objects/extra_file_object_spec.rb +160 -160
  271. data/spec/code_objects/macro_object_spec.rb +150 -150
  272. data/spec/code_objects/method_object_spec.rb +184 -184
  273. data/spec/code_objects/module_object_spec.rb +142 -142
  274. data/spec/code_objects/namespace_object_spec.rb +171 -171
  275. data/spec/code_objects/proxy_spec.rb +141 -141
  276. data/spec/code_objects/spec_helper.rb +3 -3
  277. data/spec/config_spec.rb +171 -171
  278. data/spec/core_ext/array_spec.rb +13 -13
  279. data/spec/core_ext/file_spec.rb +72 -72
  280. data/spec/core_ext/hash_spec.rb +14 -14
  281. data/spec/core_ext/insertion_spec.rb +37 -37
  282. data/spec/core_ext/module_spec.rb +15 -15
  283. data/spec/core_ext/string_spec.rb +42 -42
  284. data/spec/core_ext/symbol_hash_spec.rb +89 -89
  285. data/spec/docstring_parser_spec.rb +280 -262
  286. data/spec/docstring_spec.rb +373 -364
  287. data/spec/examples.txt +1875 -1871
  288. data/spec/handlers/alias_handler_spec.rb +82 -82
  289. data/spec/handlers/attribute_handler_spec.rb +96 -96
  290. data/spec/handlers/base_spec.rb +216 -216
  291. data/spec/handlers/c/alias_handler_spec.rb +34 -34
  292. data/spec/handlers/c/attribute_handler_spec.rb +41 -41
  293. data/spec/handlers/c/class_handler_spec.rb +78 -78
  294. data/spec/handlers/c/constant_handler_spec.rb +71 -71
  295. data/spec/handlers/c/init_handler_spec.rb +48 -48
  296. data/spec/handlers/c/method_handler_spec.rb +325 -325
  297. data/spec/handlers/c/mixin_handler_spec.rb +44 -44
  298. data/spec/handlers/c/module_handler_spec.rb +71 -71
  299. data/spec/handlers/c/override_comment_handler_spec.rb +47 -47
  300. data/spec/handlers/c/path_handler_spec.rb +36 -36
  301. data/spec/handlers/c/spec_helper.rb +23 -23
  302. data/spec/handlers/c/struct_handler_spec.rb +16 -16
  303. data/spec/handlers/class_condition_handler_spec.rb +87 -87
  304. data/spec/handlers/class_handler_spec.rb +247 -247
  305. data/spec/handlers/class_method_handler_shared_examples.rb +133 -133
  306. data/spec/handlers/class_variable_handler_spec.rb +12 -12
  307. data/spec/handlers/constant_handler_spec.rb +112 -112
  308. data/spec/handlers/decorator_handler_methods_spec.rb +393 -393
  309. data/spec/handlers/dsl_handler_spec.rb +219 -219
  310. data/spec/handlers/examples/alias_handler_001.rb.txt +45 -45
  311. data/spec/handlers/examples/attribute_handler_001.rb.txt +31 -31
  312. data/spec/handlers/examples/class_condition_handler_001.rb.txt +68 -68
  313. data/spec/handlers/examples/class_handler_001.rb.txt +120 -120
  314. data/spec/handlers/examples/class_variable_handler_001.rb.txt +9 -9
  315. data/spec/handlers/examples/constant_handler_001.rb.txt +35 -35
  316. data/spec/handlers/examples/dsl_handler_001.rb.txt +154 -154
  317. data/spec/handlers/examples/exception_handler_001.rb.txt +58 -58
  318. data/spec/handlers/examples/extend_handler_001.rb.txt +15 -15
  319. data/spec/handlers/examples/method_condition_handler_001.rb.txt +9 -9
  320. data/spec/handlers/examples/method_handler_001.rb.txt +128 -128
  321. data/spec/handlers/examples/mixin_handler_001.rb.txt +37 -37
  322. data/spec/handlers/examples/module_handler_001.rb.txt +29 -29
  323. data/spec/handlers/examples/private_constant_handler_001.rb.txt +8 -8
  324. data/spec/handlers/examples/process_handler_001.rb.txt +11 -11
  325. data/spec/handlers/examples/visibility_handler_001.rb.txt +35 -35
  326. data/spec/handlers/examples/yield_handler_001.rb.txt +54 -54
  327. data/spec/handlers/exception_handler_spec.rb +49 -49
  328. data/spec/handlers/extend_handler_spec.rb +24 -24
  329. data/spec/handlers/legacy_base_spec.rb +128 -128
  330. data/spec/handlers/method_condition_handler_spec.rb +15 -15
  331. data/spec/handlers/method_handler_spec.rb +190 -190
  332. data/spec/handlers/mixin_handler_spec.rb +56 -56
  333. data/spec/handlers/module_function_handler_spec.rb +106 -106
  334. data/spec/handlers/module_handler_spec.rb +35 -35
  335. data/spec/handlers/private_class_method_handler_spec.rb +11 -11
  336. data/spec/handlers/private_constant_handler_spec.rb +25 -25
  337. data/spec/handlers/processor_spec.rb +35 -35
  338. data/spec/handlers/public_class_method_handler_spec.rb +11 -11
  339. data/spec/handlers/ruby/base_spec.rb +95 -95
  340. data/spec/handlers/ruby/legacy/base_spec.rb +84 -84
  341. data/spec/handlers/spec_helper.rb +33 -33
  342. data/spec/handlers/visibility_handler_spec.rb +44 -44
  343. data/spec/handlers/yield_handler_spec.rb +52 -52
  344. data/spec/i18n/locale_spec.rb +81 -81
  345. data/spec/i18n/message_spec.rb +52 -52
  346. data/spec/i18n/messages_spec.rb +67 -67
  347. data/spec/i18n/pot_generator_spec.rb +295 -295
  348. data/spec/i18n/text_spec.rb +184 -184
  349. data/spec/logging_spec.rb +44 -44
  350. data/spec/options_spec.rb +171 -171
  351. data/spec/parser/base_spec.rb +24 -24
  352. data/spec/parser/c_parser_spec.rb +236 -223
  353. data/spec/parser/examples/array.c.txt +6267 -6267
  354. data/spec/parser/examples/example1.rb.txt +7 -7
  355. data/spec/parser/examples/extrafile.c.txt +8 -8
  356. data/spec/parser/examples/file.c.txt +28 -0
  357. data/spec/parser/examples/multifile.c.txt +22 -22
  358. data/spec/parser/examples/namespace.cpp.txt +68 -68
  359. data/spec/parser/examples/override.c.txt +424 -424
  360. data/spec/parser/examples/parse_in_order_001.rb.txt +2 -2
  361. data/spec/parser/examples/parse_in_order_002.rb.txt +1 -1
  362. data/spec/parser/examples/tag_handler_001.rb.txt +7 -7
  363. data/spec/parser/ruby/ast_node_spec.rb +33 -33
  364. data/spec/parser/ruby/legacy/statement_list_spec.rb +299 -299
  365. data/spec/parser/ruby/legacy/token_list_spec.rb +79 -79
  366. data/spec/parser/ruby/ruby_parser_spec.rb +508 -508
  367. data/spec/parser/ruby/token_resolver_spec.rb +165 -165
  368. data/spec/parser/source_parser_spec.rb +727 -727
  369. data/spec/parser/tag_parsing_spec.rb +17 -17
  370. data/spec/rake/yardoc_task_spec.rb +118 -118
  371. data/spec/registry_spec.rb +463 -463
  372. data/spec/registry_store_spec.rb +316 -316
  373. data/spec/rubygems/doc_manager_spec.rb +112 -112
  374. data/spec/serializers/data/serialized_yardoc/checksums +1 -1
  375. data/spec/serializers/file_system_serializer_spec.rb +145 -145
  376. data/spec/serializers/spec_helper.rb +2 -2
  377. data/spec/serializers/yardoc_serializer_spec.rb +78 -78
  378. data/spec/server/adapter_spec.rb +39 -39
  379. data/spec/server/commands/base_spec.rb +91 -91
  380. data/spec/server/commands/library_command_spec.rb +39 -39
  381. data/spec/server/doc_server_helper_spec.rb +72 -72
  382. data/spec/server/doc_server_serializer_spec.rb +60 -60
  383. data/spec/server/rack_adapter_spec.rb +21 -21
  384. data/spec/server/router_spec.rb +123 -123
  385. data/spec/server/spec_helper.rb +22 -22
  386. data/spec/server/static_caching_spec.rb +47 -47
  387. data/spec/server/webrick_servlet_spec.rb +20 -20
  388. data/spec/server_spec.rb +19 -19
  389. data/spec/spec_helper.rb +212 -212
  390. data/spec/tags/default_factory_spec.rb +168 -168
  391. data/spec/tags/default_tag_spec.rb +11 -11
  392. data/spec/tags/directives_spec.rb +463 -463
  393. data/spec/tags/library_spec.rb +48 -48
  394. data/spec/tags/overload_tag_spec.rb +53 -53
  395. data/spec/tags/ref_tag_list_spec.rb +53 -53
  396. data/spec/tags/types_explainer_spec.rb +203 -203
  397. data/spec/templates/class_spec.rb +45 -45
  398. data/spec/templates/constant_spec.rb +41 -41
  399. data/spec/templates/engine_spec.rb +131 -131
  400. data/spec/templates/examples/class001.html +308 -308
  401. data/spec/templates/examples/class001.txt +36 -36
  402. data/spec/templates/examples/class002.html +39 -39
  403. data/spec/templates/examples/constant001.txt +24 -24
  404. data/spec/templates/examples/constant002.txt +6 -6
  405. data/spec/templates/examples/constant003.txt +10 -10
  406. data/spec/templates/examples/method001.html +137 -137
  407. data/spec/templates/examples/method001.txt +35 -35
  408. data/spec/templates/examples/method002.html +91 -91
  409. data/spec/templates/examples/method002.txt +20 -20
  410. data/spec/templates/examples/method003.html +165 -165
  411. data/spec/templates/examples/method003.txt +45 -45
  412. data/spec/templates/examples/method004.html +48 -48
  413. data/spec/templates/examples/method004.txt +10 -10
  414. data/spec/templates/examples/method005.html +105 -105
  415. data/spec/templates/examples/method005.txt +33 -33
  416. data/spec/templates/examples/method006.html +107 -107
  417. data/spec/templates/examples/method006.txt +20 -20
  418. data/spec/templates/examples/module001.dot +33 -33
  419. data/spec/templates/examples/module001.html +833 -833
  420. data/spec/templates/examples/module001.txt +33 -33
  421. data/spec/templates/examples/module002.html +341 -341
  422. data/spec/templates/examples/module003.html +202 -202
  423. data/spec/templates/examples/module004.html +394 -394
  424. data/spec/templates/examples/module005.html +81 -81
  425. data/spec/templates/examples/tag001.txt +82 -82
  426. data/spec/templates/helpers/base_helper_spec.rb +171 -171
  427. data/spec/templates/helpers/html_helper_spec.rb +668 -653
  428. data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +65 -65
  429. data/spec/templates/helpers/markup/rdoc_markup_spec.rb +84 -84
  430. data/spec/templates/helpers/markup_helper_spec.rb +136 -136
  431. data/spec/templates/helpers/method_helper_spec.rb +107 -107
  432. data/spec/templates/helpers/module_helper_spec.rb +35 -35
  433. data/spec/templates/helpers/shared_signature_examples.rb +126 -126
  434. data/spec/templates/helpers/text_helper_spec.rb +65 -65
  435. data/spec/templates/method_spec.rb +118 -118
  436. data/spec/templates/module_spec.rb +203 -203
  437. data/spec/templates/onefile_spec.rb +66 -66
  438. data/spec/templates/section_spec.rb +144 -144
  439. data/spec/templates/spec_helper.rb +76 -76
  440. data/spec/templates/tag_spec.rb +52 -52
  441. data/spec/templates/template_spec.rb +410 -410
  442. data/spec/verifier_spec.rb +106 -106
  443. data/templates/default/class/dot/setup.rb +7 -7
  444. data/templates/default/class/dot/superklass.erb +2 -2
  445. data/templates/default/class/html/constructor_details.erb +8 -8
  446. data/templates/default/class/html/setup.rb +2 -2
  447. data/templates/default/class/html/subclasses.erb +4 -4
  448. data/templates/default/class/setup.rb +36 -36
  449. data/templates/default/class/text/setup.rb +12 -12
  450. data/templates/default/class/text/subclasses.erb +5 -5
  451. data/templates/default/constant/text/header.erb +11 -11
  452. data/templates/default/constant/text/setup.rb +4 -4
  453. data/templates/default/docstring/html/abstract.erb +4 -4
  454. data/templates/default/docstring/html/deprecated.erb +1 -1
  455. data/templates/default/docstring/html/index.erb +5 -5
  456. data/templates/default/docstring/html/note.erb +6 -6
  457. data/templates/default/docstring/html/private.erb +4 -4
  458. data/templates/default/docstring/html/text.erb +1 -1
  459. data/templates/default/docstring/html/todo.erb +6 -6
  460. data/templates/default/docstring/setup.rb +52 -52
  461. data/templates/default/docstring/text/abstract.erb +2 -2
  462. data/templates/default/docstring/text/deprecated.erb +2 -2
  463. data/templates/default/docstring/text/index.erb +2 -2
  464. data/templates/default/docstring/text/note.erb +3 -3
  465. data/templates/default/docstring/text/private.erb +2 -2
  466. data/templates/default/docstring/text/text.erb +1 -1
  467. data/templates/default/docstring/text/todo.erb +3 -3
  468. data/templates/default/fulldoc/html/css/full_list.css +58 -58
  469. data/templates/default/fulldoc/html/css/style.css +496 -496
  470. data/templates/default/fulldoc/html/frames.erb +17 -17
  471. data/templates/default/fulldoc/html/full_list.erb +37 -37
  472. data/templates/default/fulldoc/html/full_list_class.erb +2 -2
  473. data/templates/default/fulldoc/html/full_list_file.erb +7 -7
  474. data/templates/default/fulldoc/html/full_list_method.erb +10 -10
  475. data/templates/default/fulldoc/html/js/app.js +292 -292
  476. data/templates/default/fulldoc/html/js/full_list.js +216 -216
  477. data/templates/default/fulldoc/html/js/jquery.js +3 -3
  478. data/templates/default/fulldoc/html/setup.rb +241 -241
  479. data/templates/default/layout/dot/header.erb +5 -5
  480. data/templates/default/layout/dot/setup.rb +15 -15
  481. data/templates/default/layout/html/breadcrumb.erb +11 -11
  482. data/templates/default/layout/html/files.erb +11 -11
  483. data/templates/default/layout/html/footer.erb +5 -5
  484. data/templates/default/layout/html/headers.erb +15 -15
  485. data/templates/default/layout/html/index.erb +2 -2
  486. data/templates/default/layout/html/layout.erb +23 -23
  487. data/templates/default/layout/html/listing.erb +4 -4
  488. data/templates/default/layout/html/objects.erb +32 -32
  489. data/templates/default/layout/html/script_setup.erb +4 -4
  490. data/templates/default/layout/html/search.erb +12 -12
  491. data/templates/default/layout/html/setup.rb +89 -89
  492. data/templates/default/method/html/header.erb +16 -16
  493. data/templates/default/method/setup.rb +4 -4
  494. data/templates/default/method_details/html/header.erb +2 -2
  495. data/templates/default/method_details/html/method_signature.erb +24 -24
  496. data/templates/default/method_details/html/source.erb +9 -9
  497. data/templates/default/method_details/setup.rb +11 -11
  498. data/templates/default/method_details/text/header.erb +10 -10
  499. data/templates/default/method_details/text/method_signature.erb +12 -12
  500. data/templates/default/method_details/text/setup.rb +11 -11
  501. data/templates/default/module/dot/child.erb +1 -1
  502. data/templates/default/module/dot/dependencies.erb +2 -2
  503. data/templates/default/module/dot/header.erb +6 -6
  504. data/templates/default/module/dot/info.erb +13 -13
  505. data/templates/default/module/dot/setup.rb +15 -15
  506. data/templates/default/module/html/attribute_details.erb +10 -10
  507. data/templates/default/module/html/attribute_summary.erb +8 -8
  508. data/templates/default/module/html/box_info.erb +43 -43
  509. data/templates/default/module/html/children.erb +8 -8
  510. data/templates/default/module/html/constant_summary.erb +17 -17
  511. data/templates/default/module/html/defines.erb +2 -2
  512. data/templates/default/module/html/header.erb +5 -5
  513. data/templates/default/module/html/inherited_attributes.erb +14 -14
  514. data/templates/default/module/html/inherited_constants.erb +8 -8
  515. data/templates/default/module/html/inherited_methods.erb +18 -18
  516. data/templates/default/module/html/item_summary.erb +40 -40
  517. data/templates/default/module/html/method_details_list.erb +9 -9
  518. data/templates/default/module/html/method_summary.erb +13 -13
  519. data/templates/default/module/html/methodmissing.erb +12 -12
  520. data/templates/default/module/setup.rb +167 -167
  521. data/templates/default/module/text/children.erb +9 -9
  522. data/templates/default/module/text/class_meths_list.erb +7 -7
  523. data/templates/default/module/text/extends.erb +7 -7
  524. data/templates/default/module/text/header.erb +7 -7
  525. data/templates/default/module/text/includes.erb +7 -7
  526. data/templates/default/module/text/instance_meths_list.erb +7 -7
  527. data/templates/default/module/text/setup.rb +13 -13
  528. data/templates/default/onefile/html/files.erb +4 -4
  529. data/templates/default/onefile/html/headers.erb +6 -6
  530. data/templates/default/onefile/html/layout.erb +17 -17
  531. data/templates/default/onefile/html/readme.erb +2 -2
  532. data/templates/default/onefile/html/setup.rb +62 -62
  533. data/templates/default/root/dot/child.erb +2 -2
  534. data/templates/default/root/dot/setup.rb +6 -6
  535. data/templates/default/root/html/setup.rb +2 -2
  536. data/templates/default/tags/html/example.erb +10 -10
  537. data/templates/default/tags/html/index.erb +2 -2
  538. data/templates/default/tags/html/option.erb +24 -24
  539. data/templates/default/tags/html/overload.erb +13 -13
  540. data/templates/default/tags/html/see.erb +7 -7
  541. data/templates/default/tags/html/tag.erb +20 -20
  542. data/templates/default/tags/setup.rb +57 -57
  543. data/templates/default/tags/text/example.erb +12 -12
  544. data/templates/default/tags/text/index.erb +1 -1
  545. data/templates/default/tags/text/option.erb +20 -20
  546. data/templates/default/tags/text/overload.erb +19 -19
  547. data/templates/default/tags/text/see.erb +11 -11
  548. data/templates/default/tags/text/tag.erb +13 -13
  549. data/templates/guide/class/html/setup.rb +2 -2
  550. data/templates/guide/docstring/html/setup.rb +2 -2
  551. data/templates/guide/fulldoc/html/css/style.css +108 -108
  552. data/templates/guide/fulldoc/html/js/app.js +33 -33
  553. data/templates/guide/fulldoc/html/setup.rb +74 -74
  554. data/templates/guide/layout/html/layout.erb +81 -81
  555. data/templates/guide/layout/html/setup.rb +25 -25
  556. data/templates/guide/method/html/header.erb +17 -17
  557. data/templates/guide/method/html/setup.rb +22 -22
  558. data/templates/guide/module/html/header.erb +6 -6
  559. data/templates/guide/module/html/method_list.erb +4 -4
  560. data/templates/guide/module/html/setup.rb +27 -27
  561. data/templates/guide/onefile/html/files.erb +4 -4
  562. data/templates/guide/onefile/html/setup.rb +6 -6
  563. data/templates/guide/onefile/html/toc.erb +3 -3
  564. data/templates/guide/tags/html/setup.rb +9 -9
  565. data/yard.gemspec +43 -43
  566. metadata +4 -4
@@ -1,105 +1,105 @@
1
- # frozen_string_literal: true
2
- module YARD
3
- module Templates
4
- # Abstracts the structure for a section and its subsections into an ordered
5
- # list of sections and subsections.
6
- # @since 0.6.0
7
- class Section < Array
8
- attr_accessor :name
9
-
10
- def initialize(name, *args)
11
- self.name = name
12
- replace(parse_sections(args))
13
- end
14
-
15
- def dup
16
- obj = super
17
- obj.name = name
18
- obj
19
- end
20
-
21
- def [](*args)
22
- if args.first.is_a?(Range) || args.size > 1
23
- obj = super(*args)
24
- obj.name = name
25
- return obj
26
- elsif args.first.is_a?(Integer)
27
- return super(*args)
28
- end
29
- find {|o| o.name == args.first }
30
- end
31
-
32
- def eql?(other)
33
- super(other) && name == other.name
34
- end
35
-
36
- def ==(other)
37
- case other
38
- when Section
39
- eql?(other)
40
- when Array
41
- to_a == other
42
- else
43
- name == other
44
- end
45
- end
46
-
47
- def push(*args)
48
- super(*parse_sections(args))
49
- end
50
- alias << push
51
-
52
- def unshift(*args)
53
- super(*parse_sections(args))
54
- end
55
-
56
- def inspect
57
- n = name.respond_to?(:path) ? "T('#{name.path}')" : name.inspect
58
- subsects = empty? ? "" : ", subsections=#{super}"
59
- "Section(#{n}#{subsects})"
60
- end
61
-
62
- def place(*args)
63
- super(*parse_sections(args))
64
- end
65
-
66
- def to_a
67
- list = [name]
68
- unless empty?
69
- subsects = []
70
- each {|s| subsects += s.to_a }
71
- list << subsects
72
- end
73
- list
74
- end
75
-
76
- def any(item)
77
- find do |section|
78
- return section if section == item
79
- return section.any(item) unless section.empty?
80
- end
81
- nil
82
- end
83
-
84
- private
85
-
86
- def parse_sections(args)
87
- if args.size == 1 && args.first.is_a?(Array) && !args.first.is_a?(Section)
88
- args = args.first
89
- end
90
- sections = []
91
- args.each_with_index do |name, index|
92
- case name
93
- when Section; sections << name
94
- when Array; next
95
- else
96
- subsections = args[index + 1].is_a?(Array) ? args[index + 1] : []
97
- subsections = [] if subsections.is_a?(Section)
98
- sections << Section.new(name, subsections)
99
- end
100
- end
101
- sections
102
- end
103
- end
104
- end
105
- end
1
+ # frozen_string_literal: true
2
+ module YARD
3
+ module Templates
4
+ # Abstracts the structure for a section and its subsections into an ordered
5
+ # list of sections and subsections.
6
+ # @since 0.6.0
7
+ class Section < Array
8
+ attr_accessor :name
9
+
10
+ def initialize(name, *args)
11
+ self.name = name
12
+ replace(parse_sections(args))
13
+ end
14
+
15
+ def dup
16
+ obj = super
17
+ obj.name = name
18
+ obj
19
+ end
20
+
21
+ def [](*args)
22
+ if args.first.is_a?(Range) || args.size > 1
23
+ obj = super(*args)
24
+ obj.name = name
25
+ return obj
26
+ elsif args.first.is_a?(Integer)
27
+ return super(*args)
28
+ end
29
+ find {|o| o.name == args.first }
30
+ end
31
+
32
+ def eql?(other)
33
+ super(other) && name == other.name
34
+ end
35
+
36
+ def ==(other)
37
+ case other
38
+ when Section
39
+ eql?(other)
40
+ when Array
41
+ to_a == other
42
+ else
43
+ name == other
44
+ end
45
+ end
46
+
47
+ def push(*args)
48
+ super(*parse_sections(args))
49
+ end
50
+ alias << push
51
+
52
+ def unshift(*args)
53
+ super(*parse_sections(args))
54
+ end
55
+
56
+ def inspect
57
+ n = name.respond_to?(:path) ? "T('#{name.path}')" : name.inspect
58
+ subsects = empty? ? "" : ", subsections=#{super}"
59
+ "Section(#{n}#{subsects})"
60
+ end
61
+
62
+ def place(*args)
63
+ super(*parse_sections(args))
64
+ end
65
+
66
+ def to_a
67
+ list = [name]
68
+ unless empty?
69
+ subsects = []
70
+ each {|s| subsects += s.to_a }
71
+ list << subsects
72
+ end
73
+ list
74
+ end
75
+
76
+ def any(item)
77
+ find do |section|
78
+ return section if section == item
79
+ return section.any(item) unless section.empty?
80
+ end
81
+ nil
82
+ end
83
+
84
+ private
85
+
86
+ def parse_sections(args)
87
+ if args.size == 1 && args.first.is_a?(Array) && !args.first.is_a?(Section)
88
+ args = args.first
89
+ end
90
+ sections = []
91
+ args.each_with_index do |name, index|
92
+ case name
93
+ when Section; sections << name
94
+ when Array; next
95
+ else
96
+ subsections = args[index + 1].is_a?(Array) ? args[index + 1] : []
97
+ subsections = [] if subsections.is_a?(Section)
98
+ sections << Section.new(name, subsections)
99
+ end
100
+ end
101
+ sections
102
+ end
103
+ end
104
+ end
105
+ end
@@ -1,418 +1,418 @@
1
- # frozen_string_literal: true
2
- require 'erb'
3
-
4
- module YARD
5
- module Templates
6
- module Template
7
- attr_accessor :class, :section
8
- attr_reader :options
9
-
10
- class << self
11
- # Extra includes are mixins that are included after a template is created. These
12
- # mixins can be registered by plugins to operate on templates and override behaviour.
13
- #
14
- # Note that this array can be filled with modules or proc objects. If a proc object
15
- # is given, the proc will be called with the {Template#options} hash containing
16
- # relevant template information like the object, format, and more. The proc should
17
- # return a module or nil if there is none.
18
- #
19
- # @example Adding in extra mixins to include on a template
20
- # Template.extra_includes << MyHelper
21
- # @example Conditionally including a mixin if the format is html
22
- # Template.extra_includes << proc {|opts| MyHelper if opts.format == :html }
23
- # @return [Array<Module, Proc>] a list of modules to be automatically included
24
- # into any new template module
25
- attr_accessor :extra_includes
26
-
27
- # @!parse extend ClassMethods
28
- # @private
29
- def included(klass)
30
- klass.extend(ClassMethods)
31
- end
32
-
33
- # Includes the {extra_includes} modules into the template object.
34
- #
35
- # @param [Template] template the template object to mixin the extra includes.
36
- # @param [SymbolHash] options the options hash containing all template information
37
- # @return [void]
38
- def include_extra(template, options)
39
- extra_includes.each do |mod|
40
- mod = mod.call(options) if mod.is_a?(Proc)
41
- next unless mod.is_a?(Module)
42
- template.extend(mod)
43
- end
44
- end
45
- end
46
-
47
- self.extra_includes = [
48
- proc do |options|
49
- {:html => Helpers::HtmlHelper,
50
- :text => Helpers::TextHelper,
51
- :dot => Helpers::UMLHelper}[options.format]
52
- end
53
- ]
54
-
55
- include ErbCache
56
- include Helpers::BaseHelper
57
- include Helpers::MethodHelper
58
-
59
- module ClassMethods
60
- attr_accessor :path, :full_path
61
-
62
- # @return [Array<String>] a list of full paths
63
- # @note This method caches path results. Paths should not be modified
64
- # after this method is called; call {#reset_full_paths} to reset cache.
65
- def full_paths
66
- reset_full_paths unless defined? @cached_included_modules
67
- return @full_paths if included_modules == @cached_included_modules
68
-
69
- @cached_included_modules = included_modules
70
- @full_paths = included_modules.inject([full_path]) do |paths, mod|
71
- paths |= mod.full_paths if mod.respond_to?(:full_paths)
72
- paths
73
- end
74
- end
75
-
76
- # Resets cache for {#full_paths}
77
- def reset_full_paths
78
- @cached_included_modules = nil
79
- end
80
-
81
- def initialize(path, full_paths)
82
- full_path = full_paths.shift
83
- self.path = path
84
- self.full_path = full_path
85
- include_inherited(full_paths)
86
- include_parent
87
- load_setup_rb
88
- end
89
-
90
- # Searches for a file identified by +basename+ in the template's
91
- # path as well as any mixed in template paths. Equivalent to calling
92
- # {ClassMethods#find_nth_file} with index of 1.
93
- #
94
- # @param [String] basename the filename to search for
95
- # @return [String] the full path of a file on disk with filename
96
- # +basename+ in one of the template's paths.
97
- # @see find_nth_file
98
- def find_file(basename)
99
- find_nth_file(basename)
100
- end
101
-
102
- # Searches for the nth file (where n = +index+) identified
103
- # by basename in the template's path and any mixed in template paths.
104
- #
105
- # @param [String] basename the filename to search for
106
- # @param [Fixnum] index the nth existing file to return
107
- # @return [String] the full path of the nth file on disk with
108
- # filename +basename+ in one of the template paths
109
- def find_nth_file(basename, index = 1)
110
- n = 1
111
- full_paths.each do |path|
112
- file = File.join(path, basename)
113
- if File.file?(file)
114
- return file if index == n
115
- n += 1
116
- end
117
- end
118
-
119
- nil
120
- end
121
-
122
- def is_a?(klass)
123
- return true if klass == Template
124
- super(klass)
125
- end
126
-
127
- # Creates a new template object to be rendered with {Template#run}
128
- def new(*args)
129
- obj = Object.new.extend(self)
130
- obj.class = self
131
- obj.send(:initialize, *args)
132
- obj
133
- end
134
-
135
- def run(*args)
136
- new(*args).run
137
- end
138
-
139
- # rubocop:disable Style/MethodName
140
-
141
- # Alias for creating {Engine.template}.
142
- def T(*path)
143
- Engine.template(*path)
144
- end
145
-
146
- # Alias for creating a {Section} with arguments
147
- # @see Section#initialize
148
- # @since 0.6.0
149
- def S(*args)
150
- Section.new(*args)
151
- end
152
-
153
- # rubocop:enable Style/MethodName
154
-
155
- private
156
-
157
- def include_parent
158
- pc = path.to_s.split('/')
159
- if pc.size > 1
160
- pc.pop
161
- pc = pc.join('/')
162
- begin
163
- include Engine.template(pc)
164
- rescue ArgumentError
165
- include Engine.template!(pc, full_path.gsub(%r{/[^/]+$}, ''))
166
- end
167
- end
168
- end
169
-
170
- def include_inherited(full_paths)
171
- full_paths.reverse.each do |full_path|
172
- include Engine.template!(path, full_path)
173
- end
174
- end
175
-
176
- def load_setup_rb
177
- setup_file = File.join(full_path, 'setup.rb')
178
- if File.file? setup_file
179
- module_eval(File.read(setup_file).taint, setup_file, 1)
180
- end
181
- end
182
- end
183
-
184
- def initialize(opts = TemplateOptions.new)
185
- opts_class = opts.class
186
- opts_class = TemplateOptions if opts_class == Hash
187
- @cache = {}
188
- @cache_filename = {}
189
- @sections = []
190
- @options = opts_class.new
191
- add_options(opts)
192
- Template.include_extra(self, options)
193
- init
194
- end
195
-
196
- # Loads a template specified by path. If +:template+ or +:format+ is
197
- # specified in the {#options} hash, they are prepended and appended
198
- # to the path respectively.
199
- #
200
- # @param [Array<String, Symbol>] path the path of the template
201
- # @return [Template] the loaded template module
202
- def T(*path) # rubocop:disable Style/MethodName
203
- path.unshift(options.template) if options.template
204
- path.push(options.format) if options.format
205
- self.class.T(*path)
206
- end
207
-
208
- # Sets the sections (and subsections) to be rendered for the template
209
- #
210
- # @example Sets a set of erb sections
211
- # sections :a, :b, :c # searches for a.erb, b.erb, c.erb
212
- # @example Sets a set of method and erb sections
213
- # sections :a, :b, :c # a is a method, the rest are erb files
214
- # @example Sections with subsections
215
- # sections :header, [:name, :children]
216
- # # the above will call header.erb and only renders the subsections
217
- # # if they are yielded by the template (see #yieldall)
218
- # @param [Array<Symbol, String, Template, Array>] args the sections
219
- # to use to render the template. For symbols and strings, the
220
- # section will be executed as a method (if one exists), or rendered
221
- # from the file "name.erb" where name is the section name. For
222
- # templates, they will have {Template::ClassMethods#run} called on them.
223
- # Any subsections can be yielded to using yield or {#yieldall}
224
- def sections(*args)
225
- @sections = Section.new(nil, *args) unless args.empty?
226
- @sections
227
- end
228
-
229
- # Initialization called on the template. Override this in a 'setup.rb'
230
- # file in the template's path to implement a template
231
- #
232
- # @example A default set of sections
233
- # def init
234
- # sections :section1, :section2, [:subsection1, :etc]
235
- # end
236
- # @see #sections
237
- def init
238
- end
239
-
240
- # Runs a template on +sects+ using extra options. This method should
241
- # not be called directly. Instead, call the class method {ClassMethods#run}
242
- #
243
- # @param [Hash, nil] opts any extra options to apply to sections
244
- # @param [Section, Array] sects a section list of sections to render
245
- # @param [Fixnum] start_at the index in the section list to start from
246
- # @param [Boolean] break_first if true, renders only the first section
247
- # @yield [opts] calls for the subsections to be rendered
248
- # @yieldparam [Hash] opts any extra options to yield
249
- # @return [String] the rendered sections joined together
250
- def run(opts = nil, sects = sections, start_at = 0, break_first = false, &block)
251
- out = String.new("")
252
- return out if sects.nil?
253
- sects = sects[start_at..-1] if start_at > 0
254
- sects = Section.new(nil, sects) unless sects.is_a?(Section)
255
- add_options(opts) do
256
- sects.each do |s|
257
- self.section = s
258
- subsection_index = 0
259
- value = render_section(section) do |*args|
260
- value = with_section do
261
- run(args.first, section, subsection_index, true, &block)
262
- end
263
- subsection_index += 1
264
- value
265
- end
266
- out << (value || "")
267
- break if break_first
268
- end
269
- end
270
- out
271
- end
272
-
273
- # Yields all subsections with any extra options
274
- #
275
- # @param [Hash] opts extra options to be applied to subsections
276
- def yieldall(opts = nil, &block)
277
- with_section { run(opts, section, &block) }
278
- end
279
-
280
- # @param [String, Symbol] section the section name
281
- # @yield calls subsections to be rendered
282
- # @return [String] the contents of the ERB rendered section
283
- def erb(section, &block)
284
- method_name = ErbCache.method_for(cache_filename(section)) do
285
- erb_with(cache(section), cache_filename(section))
286
- end
287
- send(method_name, &block)
288
- end
289
-
290
- # Returns the contents of a file. If +allow_inherited+ is set to +true+,
291
- # use +{{{__super__}}}+ inside the file contents to insert the contents
292
- # of the file from an inherited template. For instance, if +templates/b+
293
- # inherits from +templates/a+ and file "test.css" exists in both directories,
294
- # both file contents can be retrieved by having +templates/b/test.css+ look
295
- # like:
296
- #
297
- # {{{__super__}}}
298
- # ...
299
- # body { css styles here }
300
- # p.class { other styles }
301
- #
302
- # @param [String] basename the name of the file
303
- # @param [Boolean] allow_inherited whether inherited templates can
304
- # be inserted with +{{{__super__}}}+
305
- # @return [String] the contents of a file identified by +basename+. All
306
- # template paths (including any mixed in templates) are searched for
307
- # the file
308
- # @see ClassMethods#find_file
309
- # @see ClassMethods#find_nth_file
310
- def file(basename, allow_inherited = false)
311
- file = self.class.find_file(basename)
312
- raise ArgumentError, "no file for '#{basename}' in #{self.class.path}" unless file
313
-
314
- data = IO.read(file)
315
- if allow_inherited
316
- superfile = self.class.find_nth_file(basename, 2)
317
- data.gsub!('{{{__super__}}}', superfile ? IO.read(superfile) : "")
318
- end
319
-
320
- data
321
- end
322
-
323
- # Calls the ERB file from the last inherited template with {#section}.erb
324
- #
325
- # @param [Symbol, String] sect if provided, uses a specific section name
326
- # @return [String] the rendered ERB file in any of the inherited template
327
- # paths.
328
- def superb(sect = section, &block)
329
- filename = self.class.find_nth_file(erb_file_for(sect), 2)
330
- return "" unless filename
331
- method_name = ErbCache.method_for(filename) { erb_with(IO.read(filename), filename) }
332
- send(method_name, &block)
333
- end
334
-
335
- def options=(value)
336
- @options = value
337
- set_ivars
338
- end
339
-
340
- def inspect
341
- "Template(#{self.class.path}) [section=#{section.name}]"
342
- end
343
-
344
- protected
345
-
346
- def erb_file_for(section)
347
- "#{section}.erb"
348
- end
349
-
350
- def erb_with(content, filename = nil)
351
- erb = if ERB.instance_method(:initialize).parameters.assoc(:key) # Ruby 2.6+
352
- ERB.new(content, :trim_mode => options.format == :text ? '<>' : nil)
353
- else
354
- ERB.new(content, nil, options.format == :text ? '<>' : nil)
355
- end
356
- erb.filename = filename if filename
357
- erb
358
- end
359
-
360
- private
361
-
362
- def render_section(section, &block)
363
- section = section.name if section.is_a?(Section)
364
- case section
365
- when Section, String, Symbol
366
- if respond_to?(section)
367
- send(section, &block)
368
- else
369
- erb(section, &block)
370
- end
371
- when Module, Template
372
- section.run(options, &block) if section.is_a?(Template)
373
- end || ""
374
- end
375
-
376
- def cache(section)
377
- content = @cache[section.to_sym]
378
- return content if content
379
-
380
- file = cache_filename(section)
381
- @cache_filename[section.to_sym] = file
382
- raise ArgumentError, "no template for section '#{section}' in #{self.class.path}" unless file
383
- @cache[section.to_sym] = IO.read(file)
384
- end
385
-
386
- def cache_filename(section)
387
- @cache_filename[section.to_sym] ||=
388
- self.class.find_file(erb_file_for(section))
389
- end
390
-
391
- def set_ivars
392
- options.each do |k, v|
393
- instance_variable_set("@#{k}", v)
394
- end
395
- end
396
-
397
- def add_options(opts = nil)
398
- return(yield) if opts.nil? && block_given?
399
- cur_opts = options if block_given?
400
-
401
- self.options = options.merge(opts)
402
-
403
- if block_given?
404
- value = yield
405
- self.options = cur_opts
406
- value
407
- end
408
- end
409
-
410
- def with_section
411
- sect = section
412
- value = yield
413
- self.section = sect
414
- value
415
- end
416
- end
417
- end
418
- end
1
+ # frozen_string_literal: true
2
+ require 'erb'
3
+
4
+ module YARD
5
+ module Templates
6
+ module Template
7
+ attr_accessor :class, :section
8
+ attr_reader :options
9
+
10
+ class << self
11
+ # Extra includes are mixins that are included after a template is created. These
12
+ # mixins can be registered by plugins to operate on templates and override behaviour.
13
+ #
14
+ # Note that this array can be filled with modules or proc objects. If a proc object
15
+ # is given, the proc will be called with the {Template#options} hash containing
16
+ # relevant template information like the object, format, and more. The proc should
17
+ # return a module or nil if there is none.
18
+ #
19
+ # @example Adding in extra mixins to include on a template
20
+ # Template.extra_includes << MyHelper
21
+ # @example Conditionally including a mixin if the format is html
22
+ # Template.extra_includes << proc {|opts| MyHelper if opts.format == :html }
23
+ # @return [Array<Module, Proc>] a list of modules to be automatically included
24
+ # into any new template module
25
+ attr_accessor :extra_includes
26
+
27
+ # @!parse extend ClassMethods
28
+ # @private
29
+ def included(klass)
30
+ klass.extend(ClassMethods)
31
+ end
32
+
33
+ # Includes the {extra_includes} modules into the template object.
34
+ #
35
+ # @param [Template] template the template object to mixin the extra includes.
36
+ # @param [SymbolHash] options the options hash containing all template information
37
+ # @return [void]
38
+ def include_extra(template, options)
39
+ extra_includes.each do |mod|
40
+ mod = mod.call(options) if mod.is_a?(Proc)
41
+ next unless mod.is_a?(Module)
42
+ template.extend(mod)
43
+ end
44
+ end
45
+ end
46
+
47
+ self.extra_includes = [
48
+ proc do |options|
49
+ {:html => Helpers::HtmlHelper,
50
+ :text => Helpers::TextHelper,
51
+ :dot => Helpers::UMLHelper}[options.format]
52
+ end
53
+ ]
54
+
55
+ include ErbCache
56
+ include Helpers::BaseHelper
57
+ include Helpers::MethodHelper
58
+
59
+ module ClassMethods
60
+ attr_accessor :path, :full_path
61
+
62
+ # @return [Array<String>] a list of full paths
63
+ # @note This method caches path results. Paths should not be modified
64
+ # after this method is called; call {#reset_full_paths} to reset cache.
65
+ def full_paths
66
+ reset_full_paths unless defined? @cached_included_modules
67
+ return @full_paths if included_modules == @cached_included_modules
68
+
69
+ @cached_included_modules = included_modules
70
+ @full_paths = included_modules.inject([full_path]) do |paths, mod|
71
+ paths |= mod.full_paths if mod.respond_to?(:full_paths)
72
+ paths
73
+ end
74
+ end
75
+
76
+ # Resets cache for {#full_paths}
77
+ def reset_full_paths
78
+ @cached_included_modules = nil
79
+ end
80
+
81
+ def initialize(path, full_paths)
82
+ full_path = full_paths.shift
83
+ self.path = path
84
+ self.full_path = full_path
85
+ include_inherited(full_paths)
86
+ include_parent
87
+ load_setup_rb
88
+ end
89
+
90
+ # Searches for a file identified by +basename+ in the template's
91
+ # path as well as any mixed in template paths. Equivalent to calling
92
+ # {ClassMethods#find_nth_file} with index of 1.
93
+ #
94
+ # @param [String] basename the filename to search for
95
+ # @return [String] the full path of a file on disk with filename
96
+ # +basename+ in one of the template's paths.
97
+ # @see find_nth_file
98
+ def find_file(basename)
99
+ find_nth_file(basename)
100
+ end
101
+
102
+ # Searches for the nth file (where n = +index+) identified
103
+ # by basename in the template's path and any mixed in template paths.
104
+ #
105
+ # @param [String] basename the filename to search for
106
+ # @param [Fixnum] index the nth existing file to return
107
+ # @return [String] the full path of the nth file on disk with
108
+ # filename +basename+ in one of the template paths
109
+ def find_nth_file(basename, index = 1)
110
+ n = 1
111
+ full_paths.each do |path|
112
+ file = File.join(path, basename)
113
+ if File.file?(file)
114
+ return file if index == n
115
+ n += 1
116
+ end
117
+ end
118
+
119
+ nil
120
+ end
121
+
122
+ def is_a?(klass)
123
+ return true if klass == Template
124
+ super(klass)
125
+ end
126
+
127
+ # Creates a new template object to be rendered with {Template#run}
128
+ def new(*args)
129
+ obj = Object.new.extend(self)
130
+ obj.class = self
131
+ obj.send(:initialize, *args)
132
+ obj
133
+ end
134
+
135
+ def run(*args)
136
+ new(*args).run
137
+ end
138
+
139
+ # rubocop:disable Style/MethodName
140
+
141
+ # Alias for creating {Engine.template}.
142
+ def T(*path)
143
+ Engine.template(*path)
144
+ end
145
+
146
+ # Alias for creating a {Section} with arguments
147
+ # @see Section#initialize
148
+ # @since 0.6.0
149
+ def S(*args)
150
+ Section.new(*args)
151
+ end
152
+
153
+ # rubocop:enable Style/MethodName
154
+
155
+ private
156
+
157
+ def include_parent
158
+ pc = path.to_s.split('/')
159
+ if pc.size > 1
160
+ pc.pop
161
+ pc = pc.join('/')
162
+ begin
163
+ include Engine.template(pc)
164
+ rescue ArgumentError
165
+ include Engine.template!(pc, full_path.gsub(%r{/[^/]+$}, ''))
166
+ end
167
+ end
168
+ end
169
+
170
+ def include_inherited(full_paths)
171
+ full_paths.reverse.each do |full_path|
172
+ include Engine.template!(path, full_path)
173
+ end
174
+ end
175
+
176
+ def load_setup_rb
177
+ setup_file = File.join(full_path, 'setup.rb')
178
+ if File.file? setup_file
179
+ module_eval(File.read(setup_file).taint, setup_file, 1)
180
+ end
181
+ end
182
+ end
183
+
184
+ def initialize(opts = TemplateOptions.new)
185
+ opts_class = opts.class
186
+ opts_class = TemplateOptions if opts_class == Hash
187
+ @cache = {}
188
+ @cache_filename = {}
189
+ @sections = []
190
+ @options = opts_class.new
191
+ add_options(opts)
192
+ Template.include_extra(self, options)
193
+ init
194
+ end
195
+
196
+ # Loads a template specified by path. If +:template+ or +:format+ is
197
+ # specified in the {#options} hash, they are prepended and appended
198
+ # to the path respectively.
199
+ #
200
+ # @param [Array<String, Symbol>] path the path of the template
201
+ # @return [Template] the loaded template module
202
+ def T(*path) # rubocop:disable Style/MethodName
203
+ path.unshift(options.template) if options.template
204
+ path.push(options.format) if options.format
205
+ self.class.T(*path)
206
+ end
207
+
208
+ # Sets the sections (and subsections) to be rendered for the template
209
+ #
210
+ # @example Sets a set of erb sections
211
+ # sections :a, :b, :c # searches for a.erb, b.erb, c.erb
212
+ # @example Sets a set of method and erb sections
213
+ # sections :a, :b, :c # a is a method, the rest are erb files
214
+ # @example Sections with subsections
215
+ # sections :header, [:name, :children]
216
+ # # the above will call header.erb and only renders the subsections
217
+ # # if they are yielded by the template (see #yieldall)
218
+ # @param [Array<Symbol, String, Template, Array>] args the sections
219
+ # to use to render the template. For symbols and strings, the
220
+ # section will be executed as a method (if one exists), or rendered
221
+ # from the file "name.erb" where name is the section name. For
222
+ # templates, they will have {Template::ClassMethods#run} called on them.
223
+ # Any subsections can be yielded to using yield or {#yieldall}
224
+ def sections(*args)
225
+ @sections = Section.new(nil, *args) unless args.empty?
226
+ @sections
227
+ end
228
+
229
+ # Initialization called on the template. Override this in a 'setup.rb'
230
+ # file in the template's path to implement a template
231
+ #
232
+ # @example A default set of sections
233
+ # def init
234
+ # sections :section1, :section2, [:subsection1, :etc]
235
+ # end
236
+ # @see #sections
237
+ def init
238
+ end
239
+
240
+ # Runs a template on +sects+ using extra options. This method should
241
+ # not be called directly. Instead, call the class method {ClassMethods#run}
242
+ #
243
+ # @param [Hash, nil] opts any extra options to apply to sections
244
+ # @param [Section, Array] sects a section list of sections to render
245
+ # @param [Fixnum] start_at the index in the section list to start from
246
+ # @param [Boolean] break_first if true, renders only the first section
247
+ # @yield [opts] calls for the subsections to be rendered
248
+ # @yieldparam [Hash] opts any extra options to yield
249
+ # @return [String] the rendered sections joined together
250
+ def run(opts = nil, sects = sections, start_at = 0, break_first = false, &block)
251
+ out = String.new("")
252
+ return out if sects.nil?
253
+ sects = sects[start_at..-1] if start_at > 0
254
+ sects = Section.new(nil, sects) unless sects.is_a?(Section)
255
+ add_options(opts) do
256
+ sects.each do |s|
257
+ self.section = s
258
+ subsection_index = 0
259
+ value = render_section(section) do |*args|
260
+ value = with_section do
261
+ run(args.first, section, subsection_index, true, &block)
262
+ end
263
+ subsection_index += 1
264
+ value
265
+ end
266
+ out << (value || "")
267
+ break if break_first
268
+ end
269
+ end
270
+ out
271
+ end
272
+
273
+ # Yields all subsections with any extra options
274
+ #
275
+ # @param [Hash] opts extra options to be applied to subsections
276
+ def yieldall(opts = nil, &block)
277
+ with_section { run(opts, section, &block) }
278
+ end
279
+
280
+ # @param [String, Symbol] section the section name
281
+ # @yield calls subsections to be rendered
282
+ # @return [String] the contents of the ERB rendered section
283
+ def erb(section, &block)
284
+ method_name = ErbCache.method_for(cache_filename(section)) do
285
+ erb_with(cache(section), cache_filename(section))
286
+ end
287
+ send(method_name, &block)
288
+ end
289
+
290
+ # Returns the contents of a file. If +allow_inherited+ is set to +true+,
291
+ # use +{{{__super__}}}+ inside the file contents to insert the contents
292
+ # of the file from an inherited template. For instance, if +templates/b+
293
+ # inherits from +templates/a+ and file "test.css" exists in both directories,
294
+ # both file contents can be retrieved by having +templates/b/test.css+ look
295
+ # like:
296
+ #
297
+ # {{{__super__}}}
298
+ # ...
299
+ # body { css styles here }
300
+ # p.class { other styles }
301
+ #
302
+ # @param [String] basename the name of the file
303
+ # @param [Boolean] allow_inherited whether inherited templates can
304
+ # be inserted with +{{{__super__}}}+
305
+ # @return [String] the contents of a file identified by +basename+. All
306
+ # template paths (including any mixed in templates) are searched for
307
+ # the file
308
+ # @see ClassMethods#find_file
309
+ # @see ClassMethods#find_nth_file
310
+ def file(basename, allow_inherited = false)
311
+ file = self.class.find_file(basename)
312
+ raise ArgumentError, "no file for '#{basename}' in #{self.class.path}" unless file
313
+
314
+ data = IO.read(file)
315
+ if allow_inherited
316
+ superfile = self.class.find_nth_file(basename, 2)
317
+ data.gsub!('{{{__super__}}}', superfile ? IO.read(superfile) : "")
318
+ end
319
+
320
+ data
321
+ end
322
+
323
+ # Calls the ERB file from the last inherited template with {#section}.erb
324
+ #
325
+ # @param [Symbol, String] sect if provided, uses a specific section name
326
+ # @return [String] the rendered ERB file in any of the inherited template
327
+ # paths.
328
+ def superb(sect = section, &block)
329
+ filename = self.class.find_nth_file(erb_file_for(sect), 2)
330
+ return "" unless filename
331
+ method_name = ErbCache.method_for(filename) { erb_with(IO.read(filename), filename) }
332
+ send(method_name, &block)
333
+ end
334
+
335
+ def options=(value)
336
+ @options = value
337
+ set_ivars
338
+ end
339
+
340
+ def inspect
341
+ "Template(#{self.class.path}) [section=#{section.name}]"
342
+ end
343
+
344
+ protected
345
+
346
+ def erb_file_for(section)
347
+ "#{section}.erb"
348
+ end
349
+
350
+ def erb_with(content, filename = nil)
351
+ erb = if ERB.instance_method(:initialize).parameters.assoc(:key) # Ruby 2.6+
352
+ ERB.new(content, :trim_mode => options.format == :text ? '<>' : nil)
353
+ else
354
+ ERB.new(content, nil, options.format == :text ? '<>' : nil)
355
+ end
356
+ erb.filename = filename if filename
357
+ erb
358
+ end
359
+
360
+ private
361
+
362
+ def render_section(section, &block)
363
+ section = section.name if section.is_a?(Section)
364
+ case section
365
+ when Section, String, Symbol
366
+ if respond_to?(section)
367
+ send(section, &block)
368
+ else
369
+ erb(section, &block)
370
+ end
371
+ when Module, Template
372
+ section.run(options, &block) if section.is_a?(Template)
373
+ end || ""
374
+ end
375
+
376
+ def cache(section)
377
+ content = @cache[section.to_sym]
378
+ return content if content
379
+
380
+ file = cache_filename(section)
381
+ @cache_filename[section.to_sym] = file
382
+ raise ArgumentError, "no template for section '#{section}' in #{self.class.path}" unless file
383
+ @cache[section.to_sym] = IO.read(file)
384
+ end
385
+
386
+ def cache_filename(section)
387
+ @cache_filename[section.to_sym] ||=
388
+ self.class.find_file(erb_file_for(section))
389
+ end
390
+
391
+ def set_ivars
392
+ options.each do |k, v|
393
+ instance_variable_set("@#{k}", v)
394
+ end
395
+ end
396
+
397
+ def add_options(opts = nil)
398
+ return(yield) if opts.nil? && block_given?
399
+ cur_opts = options if block_given?
400
+
401
+ self.options = options.merge(opts)
402
+
403
+ if block_given?
404
+ value = yield
405
+ self.options = cur_opts
406
+ value
407
+ end
408
+ end
409
+
410
+ def with_section
411
+ sect = section
412
+ value = yield
413
+ self.section = sect
414
+ value
415
+ end
416
+ end
417
+ end
418
+ end