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,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