yard 0.7.5 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of yard might be problematic. Click here for more details.

Files changed (339) hide show
  1. data/.yardopts +10 -2
  2. data/ChangeLog +1263 -38
  3. data/LEGAL +5 -5
  4. data/LICENSE +1 -1
  5. data/README.md +91 -82
  6. data/Rakefile +6 -6
  7. data/benchmarks/builtins_vs_eval.rb +1 -1
  8. data/benchmarks/erb_vs_erubis.rb +4 -4
  9. data/benchmarks/generation.rb +5 -5
  10. data/benchmarks/parsing.rb +2 -2
  11. data/benchmarks/registry_store_types.rb +48 -0
  12. data/bin/yard +9 -1
  13. data/bin/yardoc +9 -1
  14. data/bin/yri +10 -2
  15. data/docs/CodeObjects.md +10 -10
  16. data/docs/GettingStarted.md +85 -83
  17. data/docs/Handlers.md +21 -21
  18. data/docs/Overview.md +7 -7
  19. data/docs/Parser.md +30 -30
  20. data/docs/Tags.md +250 -554
  21. data/docs/TagsArch.md +123 -0
  22. data/docs/Templates.md +58 -80
  23. data/docs/WhatsNew.md +378 -133
  24. data/docs/templates/default/fulldoc/html/full_list_tag.erb +7 -0
  25. data/docs/templates/default/fulldoc/html/setup.rb +6 -0
  26. data/docs/templates/default/layout/html/setup.rb +8 -0
  27. data/docs/templates/default/layout/html/tag_list.erb +11 -0
  28. data/docs/templates/default/yard_tags/html/list.erb +18 -0
  29. data/docs/templates/default/yard_tags/html/setup.rb +27 -0
  30. data/docs/templates/plugin.rb +65 -0
  31. data/lib/yard.rb +1 -10
  32. data/lib/yard/autoload.rb +75 -27
  33. data/lib/yard/cli/command.rb +5 -2
  34. data/lib/yard/cli/command_parser.rb +3 -2
  35. data/lib/yard/cli/diff.rb +1 -1
  36. data/lib/yard/cli/i18n.rb +69 -0
  37. data/lib/yard/cli/list.rb +1 -1
  38. data/lib/yard/cli/server.rb +30 -7
  39. data/lib/yard/cli/stats.rb +5 -6
  40. data/lib/yard/cli/yardoc.rb +95 -45
  41. data/lib/yard/cli/yri.rb +24 -3
  42. data/lib/yard/code_objects/base.rb +35 -4
  43. data/lib/yard/code_objects/extra_file_object.rb +1 -1
  44. data/lib/yard/code_objects/macro_object.rb +56 -99
  45. data/lib/yard/code_objects/method_object.rb +44 -6
  46. data/lib/yard/config.rb +18 -8
  47. data/lib/yard/core_ext/symbol_hash.rb +1 -1
  48. data/lib/yard/docstring.rb +45 -85
  49. data/lib/yard/docstring_parser.rb +269 -0
  50. data/lib/yard/handlers/base.rb +129 -118
  51. data/lib/yard/handlers/c/alias_handler.rb +15 -0
  52. data/lib/yard/handlers/c/attribute_handler.rb +13 -0
  53. data/lib/yard/handlers/c/base.rb +110 -0
  54. data/lib/yard/handlers/c/class_handler.rb +26 -0
  55. data/lib/yard/handlers/c/constant_handler.rb +12 -0
  56. data/lib/yard/handlers/c/handler_methods.rb +165 -0
  57. data/lib/yard/handlers/c/init_handler.rb +16 -0
  58. data/lib/yard/handlers/c/method_handler.rb +35 -0
  59. data/lib/yard/handlers/c/mixin_handler.rb +13 -0
  60. data/lib/yard/handlers/c/module_handler.rb +16 -0
  61. data/lib/yard/handlers/c/override_comment_handler.rb +22 -0
  62. data/lib/yard/handlers/c/path_handler.rb +10 -0
  63. data/lib/yard/handlers/c/struct_handler.rb +12 -0
  64. data/lib/yard/handlers/c/symbol_handler.rb +7 -0
  65. data/lib/yard/handlers/processor.rb +41 -30
  66. data/lib/yard/handlers/ruby/alias_handler.rb +0 -2
  67. data/lib/yard/handlers/ruby/attribute_handler.rb +16 -17
  68. data/lib/yard/handlers/ruby/base.rb +10 -6
  69. data/lib/yard/handlers/ruby/comment_handler.rb +9 -0
  70. data/lib/yard/handlers/ruby/dsl_handler.rb +14 -0
  71. data/lib/yard/handlers/ruby/dsl_handler_methods.rb +71 -0
  72. data/lib/yard/handlers/ruby/legacy/alias_handler.rb +0 -3
  73. data/lib/yard/handlers/ruby/legacy/attribute_handler.rb +16 -17
  74. data/lib/yard/handlers/ruby/legacy/base.rb +28 -6
  75. data/lib/yard/handlers/ruby/legacy/comment_handler.rb +9 -0
  76. data/lib/yard/handlers/ruby/legacy/dsl_handler.rb +16 -0
  77. data/lib/yard/handlers/ruby/legacy/method_handler.rb +0 -2
  78. data/lib/yard/handlers/ruby/legacy/mixin_handler.rb +1 -1
  79. data/lib/yard/handlers/ruby/legacy/module_function_handler.rb +18 -0
  80. data/lib/yard/handlers/ruby/method_handler.rb +10 -15
  81. data/lib/yard/handlers/ruby/mixin_handler.rb +1 -1
  82. data/lib/yard/handlers/ruby/module_function_handler.rb +26 -0
  83. data/lib/yard/handlers/ruby/struct_handler_methods.rb +3 -2
  84. data/lib/yard/i18n/pot_generator.rb +281 -0
  85. data/lib/yard/i18n/text.rb +72 -0
  86. data/lib/yard/logging.rb +3 -7
  87. data/lib/yard/options.rb +216 -0
  88. data/lib/yard/parser/c/c_parser.rb +225 -0
  89. data/lib/yard/parser/c/comment_parser.rb +131 -0
  90. data/lib/yard/parser/c/statement.rb +63 -0
  91. data/lib/yard/parser/ruby/ast_node.rb +91 -1
  92. data/lib/yard/parser/ruby/legacy/ruby_parser.rb +1 -0
  93. data/lib/yard/parser/ruby/legacy/statement.rb +7 -2
  94. data/lib/yard/parser/ruby/legacy/statement_list.rb +13 -22
  95. data/lib/yard/parser/ruby/ruby_parser.rb +87 -26
  96. data/lib/yard/parser/source_parser.rb +89 -88
  97. data/lib/yard/rake/yardoc_task.rb +1 -1
  98. data/lib/yard/registry.rb +21 -10
  99. data/lib/yard/registry_store.rb +48 -0
  100. data/lib/yard/serializers/file_system_serializer.rb +18 -20
  101. data/lib/yard/serializers/yardoc_serializer.rb +1 -0
  102. data/lib/yard/server/adapter.rb +2 -2
  103. data/lib/yard/server/commands/base.rb +1 -1
  104. data/lib/yard/server/commands/display_object_command.rb +13 -6
  105. data/lib/yard/server/commands/frames_command.rb +4 -21
  106. data/lib/yard/server/commands/library_command.rb +57 -11
  107. data/lib/yard/server/commands/list_command.rb +10 -34
  108. data/lib/yard/server/commands/search_command.rb +8 -2
  109. data/lib/yard/server/doc_server_helper.rb +34 -0
  110. data/lib/yard/server/rack_adapter.rb +5 -1
  111. data/lib/yard/server/router.rb +4 -10
  112. data/lib/yard/server/static_caching.rb +2 -2
  113. data/lib/yard/server/templates/default/fulldoc/html/css/custom.css +2 -2
  114. data/lib/yard/server/templates/default/fulldoc/html/js/live.js +0 -15
  115. data/lib/yard/server/templates/default/layout/html/breadcrumb.erb +3 -3
  116. data/lib/yard/server/templates/default/layout/html/script_setup.erb +8 -0
  117. data/lib/yard/server/templates/doc_server/processing/html/processing.erb +1 -1
  118. data/lib/yard/server/templates/doc_server/search/html/setup.rb +1 -1
  119. data/lib/yard/tags/default_factory.rb +31 -4
  120. data/lib/yard/tags/directives.rb +593 -0
  121. data/lib/yard/tags/library.rb +437 -35
  122. data/lib/yard/templates/engine.rb +17 -12
  123. data/lib/yard/templates/helpers/base_helper.rb +8 -2
  124. data/lib/yard/templates/helpers/html_helper.rb +57 -14
  125. data/lib/yard/templates/helpers/markup/rdoc_markup.rb +1 -1
  126. data/lib/yard/templates/helpers/markup_helper.rb +9 -9
  127. data/lib/yard/templates/helpers/text_helper.rb +2 -2
  128. data/lib/yard/templates/template.rb +42 -13
  129. data/lib/yard/templates/template_options.rb +81 -0
  130. data/spec/cli/command_parser_spec.rb +4 -4
  131. data/spec/cli/command_spec.rb +3 -3
  132. data/spec/cli/config_spec.rb +13 -13
  133. data/spec/cli/diff_spec.rb +13 -10
  134. data/spec/cli/gems_spec.rb +12 -12
  135. data/spec/cli/help_spec.rb +2 -2
  136. data/spec/cli/i18n_spec.rb +111 -0
  137. data/spec/cli/server_spec.rb +66 -18
  138. data/spec/cli/stats_spec.rb +15 -15
  139. data/spec/cli/yardoc_spec.rb +124 -97
  140. data/spec/cli/yri_spec.rb +14 -12
  141. data/spec/code_objects/base_spec.rb +104 -46
  142. data/spec/code_objects/class_object_spec.rb +33 -33
  143. data/spec/code_objects/code_object_list_spec.rb +5 -5
  144. data/spec/code_objects/constants_spec.rb +4 -3
  145. data/spec/code_objects/extra_file_object_spec.rb +19 -19
  146. data/spec/code_objects/macro_object_spec.rb +31 -37
  147. data/spec/code_objects/method_object_spec.rb +46 -23
  148. data/spec/code_objects/module_object_spec.rb +16 -16
  149. data/spec/code_objects/namespace_object_spec.rb +6 -6
  150. data/spec/code_objects/proxy_spec.rb +19 -19
  151. data/spec/config_spec.rb +33 -24
  152. data/spec/core_ext/array_spec.rb +1 -1
  153. data/spec/core_ext/file_spec.rb +8 -8
  154. data/spec/core_ext/hash_spec.rb +1 -1
  155. data/spec/core_ext/insertion_spec.rb +3 -3
  156. data/spec/core_ext/module_spec.rb +1 -1
  157. data/spec/core_ext/string_spec.rb +6 -6
  158. data/spec/core_ext/symbol_hash_spec.rb +11 -11
  159. data/spec/docstring_parser_spec.rb +207 -0
  160. data/spec/docstring_spec.rb +33 -146
  161. data/spec/handlers/alias_handler_spec.rb +14 -14
  162. data/spec/handlers/attribute_handler_spec.rb +20 -20
  163. data/spec/handlers/base_spec.rb +16 -16
  164. data/spec/handlers/c/alias_handler_spec.rb +33 -0
  165. data/spec/handlers/c/attribute_handler_spec.rb +40 -0
  166. data/spec/handlers/c/class_handler_spec.rb +64 -0
  167. data/spec/handlers/c/constant_handler_spec.rb +68 -0
  168. data/spec/handlers/c/init_handler_spec.rb +36 -0
  169. data/spec/handlers/c/method_handler_spec.rb +228 -0
  170. data/spec/handlers/c/mixin_handler_spec.rb +27 -0
  171. data/spec/handlers/c/module_handler_spec.rb +38 -0
  172. data/spec/handlers/c/override_comment_handler_spec.rb +43 -0
  173. data/spec/handlers/c/path_handler_spec.rb +35 -0
  174. data/spec/handlers/c/spec_helper.rb +11 -0
  175. data/spec/handlers/c/struct_handler_spec.rb +15 -0
  176. data/spec/handlers/class_condition_handler_spec.rb +10 -10
  177. data/spec/handlers/class_handler_spec.rb +38 -38
  178. data/spec/handlers/class_variable_handler_spec.rb +1 -1
  179. data/spec/handlers/constant_handler_spec.rb +7 -7
  180. data/spec/handlers/{macro_handler_spec.rb → dsl_handler_spec.rb} +72 -53
  181. data/spec/handlers/examples/alias_handler_001.rb.txt +5 -5
  182. data/spec/handlers/examples/class_condition_handler_001.rb.txt +9 -9
  183. data/spec/handlers/examples/class_handler_001.rb.txt +1 -1
  184. data/spec/handlers/examples/dsl_handler_001.rb.txt +110 -0
  185. data/spec/handlers/examples/exception_handler_001.rb.txt +14 -14
  186. data/spec/handlers/examples/method_condition_handler_001.rb.txt +2 -2
  187. data/spec/handlers/examples/method_handler_001.rb.txt +16 -16
  188. data/spec/handlers/examples/mixin_handler_001.rb.txt +8 -4
  189. data/spec/handlers/examples/private_constant_handler_001.rb.txt +1 -1
  190. data/spec/handlers/examples/visibility_handler_001.rb.txt +3 -3
  191. data/spec/handlers/examples/yield_handler_001.rb.txt +13 -14
  192. data/spec/handlers/exception_handler_spec.rb +9 -9
  193. data/spec/handlers/extend_handler_spec.rb +2 -2
  194. data/spec/handlers/legacy_base_spec.rb +34 -34
  195. data/spec/handlers/method_condition_handler_spec.rb +2 -2
  196. data/spec/handlers/method_handler_spec.rb +33 -33
  197. data/spec/handlers/mixin_handler_spec.rb +13 -9
  198. data/spec/handlers/module_function_handler_spec.rb +82 -0
  199. data/spec/handlers/module_handler_spec.rb +6 -6
  200. data/spec/handlers/private_constant_handler_spec.rb +3 -3
  201. data/spec/handlers/processor_spec.rb +5 -5
  202. data/spec/handlers/ruby/base_spec.rb +10 -6
  203. data/spec/handlers/ruby/legacy/base_spec.rb +11 -7
  204. data/spec/handlers/spec_helper.rb +2 -3
  205. data/spec/handlers/visibility_handler_spec.rb +6 -6
  206. data/spec/handlers/yield_handler_spec.rb +8 -8
  207. data/spec/i18n/pot_generator_spec.rb +244 -0
  208. data/spec/i18n/text_spec.rb +69 -0
  209. data/spec/options_spec.rb +160 -0
  210. data/spec/parser/base_spec.rb +3 -3
  211. data/spec/parser/c_parser_spec.rb +31 -257
  212. data/spec/parser/examples/array.c.txt +187 -187
  213. data/spec/parser/examples/extrafile.c.txt +1 -1
  214. data/spec/parser/examples/override.c.txt +1 -1
  215. data/spec/parser/ruby/ast_node_spec.rb +1 -1
  216. data/spec/parser/ruby/legacy/statement_list_spec.rb +24 -24
  217. data/spec/parser/ruby/legacy/token_list_spec.rb +7 -7
  218. data/spec/parser/ruby/ruby_parser_spec.rb +56 -34
  219. data/spec/parser/source_parser_spec.rb +125 -65
  220. data/spec/parser/tag_parsing_spec.rb +4 -4
  221. data/spec/rake/yardoc_task_spec.rb +10 -8
  222. data/spec/registry_spec.rb +65 -36
  223. data/spec/registry_store_spec.rb +90 -40
  224. data/spec/serializers/file_system_serializer_spec.rb +12 -12
  225. data/spec/serializers/yardoc_serializer_spec.rb +2 -2
  226. data/spec/server/adapter_spec.rb +3 -3
  227. data/spec/server/commands/base_spec.rb +8 -8
  228. data/spec/server/commands/library_command_spec.rb +3 -3
  229. data/spec/server/commands/static_file_command_spec.rb +7 -7
  230. data/spec/server/doc_server_helper_spec.rb +1 -1
  231. data/spec/server/doc_server_serializer_spec.rb +6 -6
  232. data/spec/server/rack_adapter_spec.rb +3 -3
  233. data/spec/server/router_spec.rb +19 -19
  234. data/spec/server/static_caching_spec.rb +4 -4
  235. data/spec/spec_helper.rb +7 -7
  236. data/spec/tags/default_factory_spec.rb +24 -16
  237. data/spec/tags/directives_spec.rb +422 -0
  238. data/spec/tags/library_spec.rb +15 -4
  239. data/spec/tags/overload_tag_spec.rb +6 -6
  240. data/spec/tags/ref_tag_list_spec.rb +8 -8
  241. data/spec/templates/class_spec.rb +7 -7
  242. data/spec/templates/constant_spec.rb +7 -7
  243. data/spec/templates/engine_spec.rb +28 -36
  244. data/spec/templates/examples/class001.html +108 -108
  245. data/spec/templates/examples/class002.html +17 -17
  246. data/spec/templates/examples/constant001.txt +1 -1
  247. data/spec/templates/examples/method001.html +45 -45
  248. data/spec/templates/examples/method002.html +25 -25
  249. data/spec/templates/examples/method003.html +60 -60
  250. data/spec/templates/examples/method004.html +7 -7
  251. data/spec/templates/examples/method005.html +28 -28
  252. data/spec/templates/examples/module001.html +321 -321
  253. data/spec/templates/examples/module001.txt +1 -1
  254. data/spec/templates/examples/module002.html +130 -130
  255. data/spec/templates/examples/module003.html +74 -74
  256. data/spec/templates/examples/module004.html +388 -0
  257. data/spec/templates/helpers/base_helper_spec.rb +32 -32
  258. data/spec/templates/helpers/html_helper_spec.rb +87 -68
  259. data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +9 -9
  260. data/spec/templates/helpers/markup/rdoc_markup_spec.rb +16 -16
  261. data/spec/templates/helpers/markup_helper_spec.rb +31 -28
  262. data/spec/templates/helpers/method_helper_spec.rb +7 -7
  263. data/spec/templates/helpers/shared_signature_examples.rb +9 -7
  264. data/spec/templates/helpers/text_helper_spec.rb +3 -3
  265. data/spec/templates/method_spec.rb +13 -13
  266. data/spec/templates/module_spec.rb +70 -24
  267. data/spec/templates/onefile_spec.rb +32 -15
  268. data/spec/templates/section_spec.rb +23 -23
  269. data/spec/templates/spec_helper.rb +31 -1
  270. data/spec/templates/tag_spec.rb +5 -5
  271. data/spec/templates/template_spec.rb +54 -46
  272. data/spec/verifier_spec.rb +5 -5
  273. data/templates/default/class/setup.rb +2 -2
  274. data/templates/default/docstring/html/abstract.erb +1 -1
  275. data/templates/default/docstring/html/note.erb +1 -1
  276. data/templates/default/docstring/html/private.erb +1 -1
  277. data/templates/default/docstring/html/todo.erb +1 -1
  278. data/templates/default/docstring/setup.rb +2 -2
  279. data/templates/default/fulldoc/html/css/full_list.css +4 -2
  280. data/templates/default/fulldoc/html/css/style.css +50 -44
  281. data/templates/default/fulldoc/html/frames.erb +21 -6
  282. data/templates/default/fulldoc/html/full_list.erb +5 -3
  283. data/templates/default/fulldoc/html/{full_list_files.erb → full_list_file.erb} +0 -0
  284. data/templates/default/fulldoc/html/js/app.js +29 -26
  285. data/templates/default/fulldoc/html/js/full_list.js +9 -9
  286. data/templates/default/fulldoc/html/js/jquery.js +4 -16
  287. data/templates/default/fulldoc/html/setup.rb +42 -38
  288. data/templates/default/layout/dot/header.erb +1 -1
  289. data/templates/default/layout/html/breadcrumb.erb +6 -6
  290. data/templates/default/layout/html/files.erb +1 -1
  291. data/templates/default/layout/html/footer.erb +1 -1
  292. data/templates/default/layout/html/headers.erb +3 -6
  293. data/templates/default/layout/html/index.erb +1 -1
  294. data/templates/default/layout/html/layout.erb +3 -7
  295. data/templates/default/layout/html/objects.erb +1 -1
  296. data/templates/default/layout/html/script_setup.erb +5 -0
  297. data/templates/default/layout/html/search.erb +4 -1
  298. data/templates/default/layout/html/setup.rb +8 -8
  299. data/templates/default/method_details/html/method_signature.erb +10 -3
  300. data/templates/default/method_details/setup.rb +1 -0
  301. data/templates/default/module/dot/info.erb +1 -1
  302. data/templates/default/module/dot/setup.rb +2 -2
  303. data/templates/default/module/html/attribute_details.erb +1 -1
  304. data/templates/default/module/html/children.erb +1 -1
  305. data/templates/default/module/html/defines.erb +1 -1
  306. data/templates/default/module/html/inherited_methods.erb +5 -4
  307. data/templates/default/module/html/item_summary.erb +15 -5
  308. data/templates/default/module/html/method_details_list.erb +2 -2
  309. data/templates/default/module/setup.rb +25 -12
  310. data/templates/default/module/text/setup.rb +1 -1
  311. data/templates/default/onefile/html/layout.erb +1 -1
  312. data/templates/default/onefile/html/setup.rb +2 -2
  313. data/templates/default/tags/html/example.erb +4 -2
  314. data/templates/default/tags/html/option.erb +1 -1
  315. data/templates/default/tags/html/overload.erb +1 -1
  316. data/templates/default/tags/html/see.erb +1 -1
  317. data/templates/default/tags/html/tag.erb +1 -1
  318. data/templates/default/tags/setup.rb +4 -3
  319. data/templates/guide/fulldoc/html/css/style.css +8 -8
  320. data/templates/guide/fulldoc/html/js/app.js +6 -6
  321. data/templates/guide/fulldoc/html/setup.rb +12 -12
  322. data/templates/guide/layout/html/layout.erb +11 -11
  323. data/templates/guide/layout/html/setup.rb +9 -9
  324. data/templates/guide/method/html/header.erb +2 -2
  325. data/templates/guide/method/html/setup.rb +1 -1
  326. metadata +68 -18
  327. data/bin/yard-graph +0 -4
  328. data/bin/yard-server +0 -4
  329. data/docs/Glossary.md +0 -12
  330. data/lib/yard/handlers/ruby/legacy/macro_handler.rb +0 -39
  331. data/lib/yard/handlers/ruby/macro_handler.rb +0 -40
  332. data/lib/yard/handlers/ruby/macro_handler_methods.rb +0 -131
  333. data/lib/yard/parser/c_parser.rb +0 -497
  334. data/lib/yard/server/templates/default/layout/html/headers.erb +0 -16
  335. data/lib/yard/server/templates/doc_server/frames/html/frames.erb +0 -13
  336. data/lib/yard/server/templates/doc_server/frames/html/setup.rb +0 -3
  337. data/lib/yard/server/templates/doc_server/full_list/html/full_list.erb +0 -34
  338. data/lib/yard/server/templates/doc_server/full_list/html/setup.rb +0 -20
  339. data/spec/handlers/examples/macro_handler_001.rb.txt +0 -83
@@ -79,11 +79,11 @@ module YARD
79
79
  # @option options [Symbol] :template (:default) the default template
80
80
  # @return [String] the rendered template
81
81
  def render(options = {})
82
- set_default_options(options)
83
- mod = template(options[:template], options[:type], options[:format])
82
+ options = set_default_options(options)
83
+ mod = template(options.template, options.type, options.format)
84
84
 
85
- if options[:serialize] != false
86
- with_serializer(options[:object], options[:serializer]) { mod.run(options) }
85
+ if options.serialize != false
86
+ with_serializer(options.object, options.serializer) { mod.run(options) }
87
87
  else
88
88
  mod.run(options)
89
89
  end
@@ -98,9 +98,10 @@ module YARD
98
98
  # @param [Hash] options (see {render})
99
99
  # @return [void]
100
100
  def generate(objects, options = {})
101
- set_default_options(options)
102
- options[:objects] = objects
103
- template(options[:template], :fulldoc, options[:format]).run(options)
101
+ options = set_default_options(options)
102
+ options.objects = objects
103
+ options.object = Registry.root
104
+ template(options.template, :fulldoc, options.format).run(options)
104
105
  end
105
106
 
106
107
  # Serializes the results of a block with a +serializer+ object.
@@ -130,10 +131,14 @@ module YARD
130
131
  # @option options [Symbol] :template (:default) the default template
131
132
  # @return [void]
132
133
  def set_default_options(options = {})
133
- options[:__globals] ||= OpenStruct.new
134
- options[:format] ||= :text
135
- options[:type] ||= options[:object].type if options[:object]
136
- options[:template] ||= :default
134
+ if options.is_a?(Hash)
135
+ options = TemplateOptions.new.tap do |o|
136
+ o.reset_defaults
137
+ o.update(options)
138
+ end
139
+ end
140
+ options.type ||= options.object.type if options.object
141
+ options
137
142
  end
138
143
 
139
144
  # Searches through the registered {template_paths} and returns
@@ -158,7 +163,7 @@ module YARD
158
163
 
159
164
  # The name of the module that represents a +path+
160
165
  #
161
- # @param [String] the path toe generate a module name for
166
+ # @param [String] path the path to generate a module name for
162
167
  # @return [String] the module name
163
168
  def template_module_name(path)
164
169
  'Template_' + path.to_s.gsub(/[^a-z0-9]/i, '_')
@@ -3,6 +3,12 @@ module YARD::Templates::Helpers
3
3
  module BaseHelper
4
4
  attr_accessor :object, :serializer
5
5
 
6
+ # @return [CodeObjects::Base] the object representing the current generated
7
+ # page. Might not be the current {#object} when inside sub-templates.
8
+ attr_reader :owner
9
+ undef owner
10
+ def owner; @owner || object.namespace end
11
+
6
12
  # @group Managing Global Template State
7
13
 
8
14
  # An object that keeps track of global state throughout the entire template
@@ -10,7 +16,7 @@ module YARD::Templates::Helpers
10
16
  #
11
17
  # @return [OpenStruct] a struct object that stores state
12
18
  # @since 0.6.0
13
- def globals; options[:__globals] end
19
+ def globals; options.globals end
14
20
 
15
21
  # @group Running the Verifier
16
22
 
@@ -21,7 +27,7 @@ module YARD::Templates::Helpers
21
27
  # @return [Array<CodeObjects::Base>] a list of code objects that match
22
28
  # the verifier. If no verifier is supplied, all objects are returned.
23
29
  def run_verifier(list)
24
- options[:verifier] ? options[:verifier].run(list) : list
30
+ options.verifier ? options.verifier.run(list) : list
25
31
  end
26
32
 
27
33
  # @group Escaping Text
@@ -33,7 +33,7 @@ module YARD
33
33
  # @param [Symbol] markup examples are +:markdown+, +:textile+, +:rdoc+.
34
34
  # To add a custom markup type, see {MarkupHelper}
35
35
  # @return [String] the HTML
36
- def htmlify(text, markup = options[:markup])
36
+ def htmlify(text, markup = options.markup)
37
37
  markup_meth = "html_markup_#{markup}"
38
38
  return text unless respond_to?(markup_meth)
39
39
  return "" unless text
@@ -153,7 +153,7 @@ module YARD
153
153
  # @return [String] the highlighted source
154
154
  def html_syntax_highlight(source, type = nil)
155
155
  return "" unless source
156
- return h(source) if options[:no_highlight]
156
+ return h(source) unless options.highlight
157
157
 
158
158
  new_type, source = parse_lang_for_codeblock(source)
159
159
  type ||= new_type || :ruby
@@ -196,6 +196,8 @@ module YARD
196
196
  title = nil if title.empty?
197
197
  end
198
198
 
199
+ name = CGI.unescapeHTML(name)
200
+
199
201
  if object.is_a?(String)
200
202
  object
201
203
  else
@@ -231,7 +233,7 @@ module YARD
231
233
  file = CodeObjects::ExtraFileObject.new(file)
232
234
  end
233
235
  file.attributes[:markup] ||= markup_for_file('', file.filename)
234
- htmlify(file.contents, file.attributes[:markup] || options[:markup])
236
+ htmlify(file.contents, file.attributes[:markup] || options.markup)
235
237
  end
236
238
 
237
239
  # (see BaseHelper#link_include_object)
@@ -248,7 +250,14 @@ module YARD
248
250
  elsif otitle
249
251
  title = otitle.to_s
250
252
  elsif object.is_a?(CodeObjects::Base)
251
- title = h(object.relative_path(obj))
253
+ # Check if we're linking to a class method in the current
254
+ # object. If we are, create a title in the format of
255
+ # "CurrentClass.method_name"
256
+ if obj.is_a?(CodeObjects::MethodObject) && obj.scope == :class && obj.parent == object
257
+ title = h([object.name, obj.sep, obj.name].join)
258
+ else
259
+ title = h(object.relative_path(obj))
260
+ end
252
261
  else
253
262
  title = h(obj.to_s)
254
263
  end
@@ -313,7 +322,7 @@ module YARD
313
322
  fromobj = object
314
323
  if object.is_a?(CodeObjects::Base) &&
315
324
  !object.is_a?(CodeObjects::NamespaceObject)
316
- fromobj = fromobj.namespace
325
+ fromobj = owner
317
326
  end
318
327
 
319
328
  from = serializer.serialized_path(fromobj)
@@ -337,7 +346,7 @@ module YARD
337
346
  fromobj = fromobj.namespace
338
347
  end
339
348
  from = serializer.serialized_path(fromobj)
340
- if filename == options[:readme]
349
+ if filename == options.readme
341
350
  path = 'index.html'
342
351
  else
343
352
  path = serializer.serialized_path(filename)
@@ -347,6 +356,39 @@ module YARD
347
356
  link
348
357
  end
349
358
 
359
+ # Returns the URL for a list type
360
+ #
361
+ # @param [String, Symbol] type the list type to generate a URL for
362
+ # @return [String] the URL pointing to the list
363
+ # @since 0.8.0
364
+ def url_for_list(type)
365
+ url_for_file("#{type}_list.html")
366
+ end
367
+
368
+ # Returns the URL for the frameset page
369
+ #
370
+ # @return [String] the URL pointing to the frames page
371
+ # @since 0.8.0
372
+ def url_for_frameset
373
+ url_for_file("frames.html")
374
+ end
375
+
376
+ # Returns the URL for the main page (README or alphabetic index)
377
+ #
378
+ # @return [String] the URL pointing to the first main page the
379
+ # user should see.
380
+ def url_for_main
381
+ url_for_file("index.html")
382
+ end
383
+
384
+ # Returns the URL for the alphabetic index page
385
+ #
386
+ # @return [String] the URL pointing to the first main page the
387
+ # user should see.
388
+ def url_for_index
389
+ url_for_file("_index.html")
390
+ end
391
+
350
392
  # @group Formatting Objects and Attributes
351
393
 
352
394
  # Formats a list of objects and links them
@@ -391,7 +433,7 @@ module YARD
391
433
  meth = meth.object
392
434
  end
393
435
 
394
- type = options[:default_return] || ""
436
+ type = options.default_return || ""
395
437
  if meth.tag(:return) && meth.tag(:return).types
396
438
  types = meth.tags(:return).map {|t| t.types ? t.types : [] }.flatten.uniq
397
439
  first = link ? h(types.first) : format_types([types.first], false)
@@ -401,7 +443,7 @@ module YARD
401
443
  type = first + '<sup>+</sup>'
402
444
  elsif types.size > 2
403
445
  type = [first, '...'].join(', ')
404
- elsif types == ['void'] && options[:hide_void_return]
446
+ elsif types == ['void'] && options.hide_void_return
405
447
  type = ""
406
448
  else
407
449
  type = link ? h(types.join(", ")) : format_types(types, false)
@@ -449,7 +491,8 @@ module YARD
449
491
  link_title = "#{h name} (#{meth.type})"
450
492
  end
451
493
  obj = meth.respond_to?(:object) ? meth.object : meth
452
- link_url(url_for(obj), title, :title => link_title) + extras_text
494
+ url = url_for(object, obj)
495
+ link_url(url, title, :title => link_title) + extras_text
453
496
  else
454
497
  title + extras_text
455
498
  end
@@ -506,9 +549,9 @@ module YARD
506
549
 
507
550
  # Parses !!!lang out of codeblock, returning the codeblock language
508
551
  # followed by the source code.
509
- #
552
+ #
510
553
  # @param [String] source the source code whose language to determine
511
- # @return [Array(String, String)] the language, if any, and the
554
+ # @return [Array(String, String)] the language, if any, and the
512
555
  # remaining source
513
556
  # @since 0.7.5
514
557
  def parse_lang_for_codeblock(source)
@@ -519,10 +562,10 @@ module YARD
519
562
 
520
563
  [type, source]
521
564
  end
522
-
565
+
523
566
  # Parses code blocks out of html and performs syntax highlighting
524
567
  # on code inside of the blocks.
525
- #
568
+ #
526
569
  # @param [String] html the html to search for code in
527
570
  # @return [String] highlighted html
528
571
  # @see #html_syntax_highlight
@@ -533,7 +576,7 @@ module YARD
533
576
  language, _ = parse_lang_for_codeblock(string)
534
577
  language ||= $1 || $2 || object.source_type
535
578
 
536
- unless options[:no_highlight]
579
+ if options.highlight
537
580
  string = html_syntax_highlight(CGI.unescapeHTML(string), language)
538
581
  end
539
582
  classes = ['code', language].compact.join(' ')
@@ -45,7 +45,7 @@ module YARD
45
45
  code_tags = 0
46
46
  text.gsub(/<(\/)?(pre|code|tt)|(\s|^|>)\+(?! )([^\n\+]{1,900})(?! )\+/) do |str|
47
47
  closed, tag, first_text, type_text, pre_text, no_match = $1, $2, $3, $4, $`, $&
48
-
48
+
49
49
  if tag
50
50
  code_tags += (closed ? -1 : 1)
51
51
  next str
@@ -73,19 +73,19 @@ module YARD
73
73
  # found and exit the program.
74
74
  #
75
75
  # @return [Boolean] whether the markup provider was successfully loaded.
76
- def load_markup_provider(type = options[:markup])
76
+ def load_markup_provider(type = options.markup)
77
77
  return true if MarkupHelper.markup_cache[type]
78
78
  MarkupHelper.markup_cache[type] ||= {}
79
79
 
80
80
  providers = MARKUP_PROVIDERS[type.to_sym]
81
81
  return true if providers && providers.empty?
82
- if providers && options[:markup_provider]
83
- providers = providers.select {|p| p[:lib] == options[:markup_provider] }
82
+ if providers && options.markup_provider
83
+ providers = providers.select {|p| p[:lib] == options.markup_provider }
84
84
  end
85
85
 
86
86
  if providers == nil || providers.empty?
87
87
  log.error "Invalid markup type '#{type}' or markup provider " +
88
- "(#{options[:markup_provider]}) is not registered."
88
+ "(#{options.markup_provider}) is not registered."
89
89
  return false
90
90
  end
91
91
 
@@ -128,7 +128,7 @@ module YARD
128
128
  MARKUP_EXTENSIONS.each do |type, exts|
129
129
  return type if exts.include?(ext)
130
130
  end
131
- options[:markup]
131
+ options.markup
132
132
  end
133
133
 
134
134
  # Strips any shebang lines on the file contents that pertain to
@@ -144,9 +144,9 @@ module YARD
144
144
  # Gets the markup provider class/module constant for a markup type
145
145
  # Call {#load_markup_provider} before using this method.
146
146
  #
147
- # @param [Symbol] the markup type (:rdoc, :markdown, etc.)
147
+ # @param [Symbol] type the markup type (:rdoc, :markdown, etc.)
148
148
  # @return [Class] the markup class
149
- def markup_class(type = options[:markup])
149
+ def markup_class(type = options.markup)
150
150
  load_markup_provider(type)
151
151
  MarkupHelper.markup_cache[type][:class]
152
152
  end
@@ -154,9 +154,9 @@ module YARD
154
154
  # Gets the markup provider name for a markup type
155
155
  # Call {#load_markup_provider} before using this method.
156
156
  #
157
- # @param [Symbol] the markup type (:rdoc, :markdown, etc.)
157
+ # @param [Symbol] type the markup type (:rdoc, :markdown, etc.)
158
158
  # @return [Symbol] the markup provider name (usually the gem name of the library)
159
- def markup_provider(type = options[:markup])
159
+ def markup_provider(type = options.markup)
160
160
  MarkupHelper.markup_cache[type][:provider]
161
161
  end
162
162
  end
@@ -51,7 +51,7 @@ module YARD
51
51
  meth = meth.tag(:overload)
52
52
  end
53
53
 
54
- type = options[:default_return] || ""
54
+ type = options.default_return || ""
55
55
  rmeth = meth
56
56
  if !rmeth.has_tag?(:return) && rmeth.respond_to?(:object)
57
57
  rmeth = meth.object
@@ -65,7 +65,7 @@ module YARD
65
65
  type = first + '+'
66
66
  elsif types.size > 2
67
67
  type = [first, '...'].join(', ')
68
- elsif types == ['void'] && options[:hide_void_return]
68
+ elsif types == ['void'] && options.hide_void_return
69
69
  type = ""
70
70
  else
71
71
  type = types.join(", ")
@@ -7,17 +7,49 @@ module YARD
7
7
  attr_reader :options
8
8
 
9
9
  class << self
10
- # @return [Array<Module>] a list of modules to be automatically included
10
+ # Extra includes are mixins that are included after a template is created. These
11
+ # mixins can be registered by plugins to operate on templates and override behaviour.
12
+ #
13
+ # Note that this array can be filled with modules or proc objects. If a proc object
14
+ # is given, the proc will be called with the {Template#options} hash containing
15
+ # relevant template information like the object, format, and more. The proc should
16
+ # return a module or nil if there is none.
17
+ #
18
+ # @example Adding in extra mixins to include on a template
19
+ # Template.extra_includes << MyHelper
20
+ # @example Conditionally including a mixin if the format is html
21
+ # Template.extra_includes << proc {|opts| MyHelper if opts.format == :html }
22
+ # @return [Array<Module, Proc>] a list of modules to be automatically included
11
23
  # into any new template module
12
24
  attr_accessor :extra_includes
13
25
 
26
+ # @!parse extend ClassMethods
14
27
  # @private
15
28
  def included(klass)
16
29
  klass.extend(ClassMethods)
17
30
  end
31
+
32
+ # Includes the {extra_includes} modules into the template object.
33
+ #
34
+ # @param [Template] template the template object to mixin the extra includes.
35
+ # @param [SymbolHash] options the options hash containing all template information
36
+ # @return [void]
37
+ def include_extra(template, options)
38
+ extra_includes.each do |mod|
39
+ mod = mod.call(options) if mod.is_a?(Proc)
40
+ next unless mod.is_a?(Module)
41
+ template.extend(mod)
42
+ end
43
+ end
18
44
  end
19
45
 
20
- self.extra_includes = []
46
+ self.extra_includes = [
47
+ proc {|options|
48
+ { :html => Helpers::HtmlHelper,
49
+ :text => Helpers::TextHelper,
50
+ :dot => Helpers::UMLHelper }[options.format]
51
+ }
52
+ ]
21
53
 
22
54
  include ErbCache
23
55
  include Helpers::BaseHelper
@@ -131,16 +163,13 @@ module YARD
131
163
  end
132
164
  end
133
165
 
134
- def initialize(opts = {})
166
+ def initialize(opts = TemplateOptions.new)
167
+ opts_class = opts.class
168
+ opts_class = TemplateOptions if opts_class == Hash
135
169
  @cache, @cache_filename = {}, {}
136
- @sections, @options = [], {}
170
+ @sections, @options = [], opts_class.new
137
171
  add_options(opts)
138
-
139
- extend(Helpers::HtmlHelper) if options[:format] == :html
140
- extend(Helpers::TextHelper) if options[:format] == :text
141
- extend(Helpers::UMLHelper) if options[:format] == :dot
142
- extend(*Template.extra_includes) unless Template.extra_includes.empty?
143
-
172
+ Template.include_extra(self, options)
144
173
  init
145
174
  end
146
175
 
@@ -151,8 +180,8 @@ module YARD
151
180
  # @param [Array<String, Symbol>] path the path of the template
152
181
  # @return [Template] the loaded template module
153
182
  def T(*path)
154
- path.unshift(options[:template]) if options[:template]
155
- path.push(options[:format]) if options[:format]
183
+ path.unshift(options.template) if options.template
184
+ path.push(options.format) if options.format
156
185
  self.class.T(*path)
157
186
  end
158
187
 
@@ -299,7 +328,7 @@ module YARD
299
328
  end
300
329
 
301
330
  def erb_with(content, filename = nil)
302
- erb = ERB.new(content, nil, options[:format] == :text ? '<>' : nil)
331
+ erb = ERB.new(content, nil, options.format == :text ? '<>' : nil)
303
332
  erb.filename = filename if filename
304
333
  erb
305
334
  end
@@ -0,0 +1,81 @@
1
+ require 'ostruct'
2
+
3
+ module YARD
4
+ module Templates
5
+ # An Options class containing default options for base template rendering. For
6
+ # options specific to generation of HTML output, see {CLI::YardocOptions}.
7
+ #
8
+ # @see CLI::YardocOptions
9
+ class TemplateOptions < YARD::Options
10
+ # @return [Symbol] the template output format
11
+ default_attr :format, :text
12
+
13
+ # @return [Symbol] the template name used to render output
14
+ default_attr :template, :default
15
+
16
+ # @return [Symbol] the markup format to use when parsing docstrings
17
+ default_attr :markup, :rdoc # default is :rdoc but falls back on :none
18
+
19
+ # @return [String] the default return type for a method with no return tags
20
+ default_attr :default_return, "Object"
21
+
22
+ # @return [Boolean] whether void methods should show "void" in their signature
23
+ default_attr :hide_void_return, false
24
+
25
+ # @return [Boolean] whether code blocks should be syntax highlighted
26
+ default_attr :highlight, true
27
+
28
+ # @return [Class] the markup provider class for the markup format
29
+ attr_accessor :markup_provider
30
+
31
+ # @return [OpenStruct] an open struct containing any global state across all
32
+ # generated objects in a template.
33
+ default_attr :globals, lambda { OpenStruct.new }
34
+ alias __globals globals
35
+
36
+ # @return [CodeObjects::Base] the main object being generated in the template
37
+ attr_accessor :object
38
+
39
+ # @return [Symbol] the template type used to generate output
40
+ attr_accessor :type
41
+
42
+ # @return [Boolean] whether serialization should be performed
43
+ default_attr :serialize, false
44
+
45
+ # @return [Serializers::Base] the serializer used to generate links and serialize
46
+ # output. Serialization output only occurs if {#serialize} is +true+.
47
+ attr_accessor :serializer
48
+
49
+ # @deprecated use {#highlight} instead.
50
+ # @return [Boolean] whether highlighting should be ignored
51
+ attr_reader :no_highlight
52
+ undef no_highlight
53
+ def no_highlight; !highlight end
54
+ def no_highlight=(value) self.highlight = !value end
55
+
56
+ # @return [String] the title of a given page
57
+ attr_accessor :page_title
58
+
59
+ # @example A list of mixin path names (including wildcards)
60
+ # opts.embed_mixins #=> ['ClassMethods', '*Helper', 'YARD::*']
61
+ # @return [Array<String>] an array of module name wildcards to embed into
62
+ # class documentation as if their methods were defined directly in the class.
63
+ # Useful for modules like ClassMethods. If the name contains '::', the module
64
+ # is matched against the full mixin path, otherwise only the module name is used.
65
+ default_attr :embed_mixins, lambda { [] }
66
+
67
+ # @param [CodeObjects::Base] mixin accepts any code object, but returns
68
+ # nil unless the object is a module.
69
+ # @return [Boolean] whether a mixin matches the embed_mixins list
70
+ # @return [nil] if the mixin is not a module object
71
+ def embed_mixins_match?(mixin)
72
+ return nil unless mixin.is_a?(CodeObjects::ModuleObject)
73
+ embed_mixins.any? do |embed_mixin|
74
+ re = /\A#{Regexp.quote(embed_mixin).gsub('\*', '.*')}\Z/
75
+ matchstr = embed_mixin.include?("::") ? mixin.path : mixin.name
76
+ re.match(matchstr.to_s)
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end