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
@@ -224,6 +224,21 @@ module YARD
224
224
  yield(self) if block_given?
225
225
  end
226
226
 
227
+ # Copies all data in this object to another code object, except for
228
+ # uniquely identifying information (path, namespace, name, scope).
229
+ #
230
+ # @param [Base] other the object to copy data to
231
+ # @return [Base] the other object
232
+ # @since 0.8.0
233
+ def copy_to(other)
234
+ copyable_attributes.each do |ivar|
235
+ ivar = "@#{ivar}"
236
+ other.instance_variable_set(ivar, instance_variable_get(ivar))
237
+ end
238
+ other.docstring = docstring.to_raw
239
+ other
240
+ end
241
+
227
242
  # The name of the object
228
243
  # @param [Boolean] prefix whether to show a prefix. Implement
229
244
  # this in a subclass to define how the prefix is showed.
@@ -286,7 +301,7 @@ module YARD
286
301
 
287
302
  # @return [Integer] the object's hash value (for equality checking)
288
303
  def hash; path.hash end
289
-
304
+
290
305
  # @return [nil] this object does not turn into an array
291
306
  def to_ary; nil end
292
307
 
@@ -348,6 +363,7 @@ module YARD
348
363
  end
349
364
  end
350
365
 
366
+ undef docstring
351
367
  def docstring
352
368
  return @docstring if !@docstring_extra
353
369
  case @docstring
@@ -445,7 +461,7 @@ module YARD
445
461
  # @return [String] the rendered template
446
462
  # @see Templates::Engine#render
447
463
  def format(options = {})
448
- options.merge!(:object => self)
464
+ options = options.merge(:object => self)
449
465
  Templates::Engine.render(options)
450
466
  end
451
467
 
@@ -494,8 +510,6 @@ module YARD
494
510
  # @return whether or not this object is a RootObject
495
511
  def root?; false end
496
512
 
497
- protected
498
-
499
513
  # Override this method with a custom component separator. For instance,
500
514
  # {MethodObject} implements sep as '#' or '.' (depending on if the
501
515
  # method is instance or class respectively). {#path} depends on this
@@ -505,6 +519,23 @@ module YARD
505
519
  # and the name (default is {NSEP})
506
520
  def sep; NSEP end
507
521
 
522
+ protected
523
+
524
+ # Override this method if your code object subclass does not allow
525
+ # copying of certain attributes.
526
+ #
527
+ # @return [Array<String>] the list of instance variable names (without
528
+ # "@" prefix) that should be copied when {#copy_to} is called
529
+ # @see #copy_to
530
+ # @since 0.8.0
531
+ def copyable_attributes
532
+ vars = instance_variables.map {|ivar| ivar.to_s[1..-1] }
533
+ vars -= %w(docstring namespace name path)
534
+ vars
535
+ end
536
+
537
+ private
538
+
508
539
  # Formats source code by removing leading indentation
509
540
  #
510
541
  # @param [String] source the source code to format
@@ -66,7 +66,7 @@ module YARD::CodeObjects
66
66
  end
67
67
  data = data[cut_index..-1] if cut_index > 0
68
68
  self.contents = data.join("\n")
69
-
69
+
70
70
  if contents.respond_to?(:force_encoding) && attributes[:encoding]
71
71
  begin
72
72
  contents.force_encoding(attributes[:encoding])
@@ -1,27 +1,29 @@
1
+ require 'ostruct'
2
+
1
3
  module YARD
2
4
  module CodeObjects
3
- # A MacroObject represents a docstring defined through +@macro NAME+ and can be
4
- # reused by specifying the tag +@macro NAME+. You can also provide the
5
+ # A MacroObject represents a docstring defined through +@!macro NAME+ and can be
6
+ # reused by specifying the tag +@!macro NAME+. You can also provide the
5
7
  # +attached+ type flag to the macro definition to have it attached to the
6
8
  # specific DSL method so it will be implicitly reused.
7
- #
8
- # Macros are fully described in the {file:docs/Tags.md#macros Tags Overview}
9
+ #
10
+ # Macros are fully described in the {file:docs/Tags.md#macro Tags Overview}
9
11
  # document.
10
- #
12
+ #
11
13
  # @example Creating a basic named macro
12
- # # @macro prop
13
- # # @method $1(${3-})
14
- # # @return [$2] the value of the $0
14
+ # # @!macro prop
15
+ # # @!method $1(${3-})
16
+ # # @return [$2] the value of the $0
15
17
  # property :foo, String, :a, :b
16
- #
17
- # # @macro prop
18
+ #
19
+ # # @!macro prop
18
20
  # property :bar, Numeric, :value
19
- #
21
+ #
20
22
  # @example Creating a macro that is attached to the method call
21
- # # @macro [attach] prop2
22
- # # @method $1(value)
23
+ # # @!macro [attach] prop2
24
+ # # @!method $1(value)
23
25
  # property :foo
24
- #
26
+ #
25
27
  # # Extra data added to docstring
26
28
  # property :bar
27
29
  class MacroObject < Base
@@ -40,56 +42,54 @@ module YARD
40
42
  obj.method_object = method_object
41
43
  obj
42
44
  end
43
-
45
+
44
46
  # Finds a macro using +macro_name+
47
+ # @param [#to_s] macro_name the name of the macro
45
48
  # @return [MacroObject] if a macro is found
46
49
  # @return [nil] if there is no registered macro by that name
47
50
  def find(macro_name)
48
51
  Registry.at('.macro.' + macro_name.to_s)
49
52
  end
50
-
53
+
51
54
  # Parses a given docstring and determines if the macro is "new" or
52
- # not. If the macro has $variable names or if it has a @macro tag
53
- # with the [new] or [attached] flag, it is considered new.
54
- #
55
+ # not. If the macro has $variable names or if it has a @!macro tag
56
+ # with the [new] or [attached] flag, it is considered new.
57
+ #
55
58
  # If a new macro is found, the macro is created and registered. Otherwise
56
59
  # the macro name is searched and returned. If a macro is not found,
57
60
  # nil is returned.
58
- #
61
+ #
62
+ # @param [#to_s] macro_name the name of the macro
59
63
  # @param [CodeObjects::Base] method_object an optional method to attach
60
64
  # the macro to. Only used if the macro is being created, otherwise
61
65
  # this argument is ignored.
62
66
  # @return [MacroObject] the newly created or existing macro, depending
63
- # on whether the @macro tag was a new tag or not.
67
+ # on whether the @!macro tag was a new tag or not.
64
68
  # @return [nil] if the +data+ has no macro tag or if the macro is
65
69
  # not new and no macro by the macro name is found.
66
- def find_or_create(data, method_object = nil)
67
- docstring = Docstring === data ? data : Docstring.new(data)
68
- return unless docstring.tag(:macro)
69
- return unless name = macro_name(docstring)
70
- if new_macro?(docstring)
71
- method_object = nil unless attached_macro?(docstring, method_object)
72
- create(name, macro_data(docstring), method_object)
70
+ def find_or_create(macro_name, data, method_object = nil)
71
+ if macro = find(name)
72
+ macro
73
73
  else
74
- find(name)
74
+ create(macro_name, data, method_object)
75
75
  end
76
76
  end
77
77
  alias create_docstring find_or_create
78
-
78
+
79
79
  # Expands +macro_data+ using the interpolation parameters.
80
- #
80
+ #
81
81
  # Interpolation rules:
82
82
  # * $0, $1, $2, ... = the Nth parameter in +call_params+
83
83
  # * $* = the full statement source (excluding block)
84
84
  # * Also supports $!{N-M} ranges, as well as negative indexes on N or M
85
85
  # * Use \$ to escape the variable name in a macro.
86
- #
87
- # @macro [new] macro.expand
86
+ #
87
+ # @!macro [new] macro.expand
88
88
  # @param [Array<String>] call_params the method name and parameters
89
89
  # to the method call. These arguments will fill \$0-N
90
- # @param [String] full_source the full source line (excluding block)
90
+ # @param [String] full_source the full source line (excluding block)
91
91
  # interpolated as \$*
92
- # @param [String] block_source Currently unused. Will support
92
+ # @param [String] block_source Currently unused. Will support
93
93
  # interpolating the block data as a variable.
94
94
  # @return [String] the expanded macro data
95
95
  # @param [String] macro_data the macro data to expand (taken from {#macro_data})
@@ -113,91 +113,48 @@ module YARD
113
113
  # Applies a macro on a docstring by creating any macro data inside of
114
114
  # the docstring first. Equivalent to calling {find_or_create} and {apply_macro}
115
115
  # on the new macro object.
116
- #
116
+ #
117
117
  # @param [Docstring] docstring the docstring to create a macro out of
118
- # @macro macro.expand
118
+ # @!macro macro.expand
119
119
  # @see find_or_create
120
120
  def apply(docstring, call_params = [], full_source = '', block_source = '', method_object = nil)
121
- macro = find_or_create(docstring, method_object)
122
- apply_macro(macro, docstring, call_params, full_source, block_source)
121
+ docstring = docstring.all if Docstring === docstring
122
+ parser = DocstringParser.new
123
+ handler = OpenStruct.new
124
+ handler.call_params = call_params[1..-1]
125
+ handler.caller_method = call_params.first
126
+ handler.statement = OpenStruct.new(:source => full_source)
127
+ parser.parse(docstring, nil, handler).to_docstring.to_raw
123
128
  end
124
129
 
125
130
  # Applies a macro to a docstring, interpolating the macro's data on the
126
131
  # docstring and appending any extra local docstring data that was in
127
132
  # the original +docstring+ object.
128
- #
133
+ #
129
134
  # @param [MacroObject] macro the macro object
130
- # @macro macro.expand
135
+ # @!macro macro.expand
131
136
  def apply_macro(macro, docstring, call_params = [], full_source = '', block_source = '')
132
- docstring = Docstring.new(docstring) unless Docstring === docstring
133
- data = []
134
- data << macro.expand(call_params, full_source, block_source) if macro
135
- if !macro && new_macro?(docstring)
136
- data << expand(macro_data(docstring), call_params, full_source, block_source)
137
- end
138
- data << nonmacro_data(docstring)
139
- data.join("\n").strip
140
- end
141
-
142
- private
143
-
144
- def new_macro?(docstring)
145
- if docstring.tag(:macro)
146
- if types = docstring.tag(:macro).types
147
- return true if types.include?('new') || types.include?('attach')
148
- end
149
- if docstring.all =~ MACRO_MATCH
150
- return true
151
- end
152
- end
153
- false
154
- end
155
-
156
- def attached_macro?(docstring, method_object)
157
- return false if method_object.nil?
158
- return false if docstring.tag(:macro).types.nil?
159
- docstring.tag(:macro).types.include?('attach')
160
- end
161
-
162
- def macro_name(docstring)
163
- docstring.tag(:macro).name
164
- end
165
-
166
- def macro_data(docstring)
167
- new_docstring = docstring.dup
168
- new_docstring.delete_tags(:macro)
169
- tag_text = docstring.tag(:macro).text
170
- if !tag_text || tag_text.strip.empty?
171
- new_docstring.to_raw.strip
172
- else
173
- tag_text
174
- end
175
- end
176
-
177
- def nonmacro_data(docstring)
178
- if new_macro?(docstring)
179
- text = docstring.tag(:macro).text
180
- return '' if !text || text.strip.empty?
181
- end
182
- new_docstring = docstring.dup
183
- new_docstring.delete_tags(:macro)
184
- new_docstring.to_raw
137
+ apply(docstring, call_params, full_source, block_source)
185
138
  end
186
139
  end
187
-
140
+
188
141
  # @return [String] the macro data stored on the object
189
142
  attr_accessor :macro_data
190
-
143
+
191
144
  # @return [CodeObjects::Base] the method object that this macro is
192
145
  # attached to.
193
146
  attr_accessor :method_object
194
-
147
+
195
148
  # @return [Boolean] whether this macro is attached to a method
196
149
  def attached?; method_object ? true : false end
150
+
151
+ # Overrides {Base#path} so the macro path is ".macro.MACRONAME"
197
152
  def path; '.macro.' + name.to_s end
153
+
154
+ # Overrides the separator to be '.'
198
155
  def sep; '.' end
199
-
200
- # Expands the macro using
156
+
157
+ # Expands the macro using
201
158
  # @param [Array<String>] call_params a list of tokens that are passed
202
159
  # to the method call
203
160
  # @param [String] full_source the full method call (not including the block)
@@ -23,12 +23,26 @@ module YARD::CodeObjects
23
23
  # Creates a new method object in +namespace+ with +name+ and an instance
24
24
  # or class +scope+
25
25
  #
26
+ # If scope is +:module+, this object is instantiated as a public
27
+ # method in +:class+ scope, but also creates a new (empty) method
28
+ # as a private +:instance+ method on the same class or module.
29
+ #
26
30
  # @param [NamespaceObject] namespace the namespace
27
31
  # @param [String, Symbol] name the method name
28
- # @param [Symbol] scope +:instance+ or +:class+
29
- def initialize(namespace, name, scope = :instance)
32
+ # @param [Symbol] scope +:instance+, +:class+, or +:module+
33
+ def initialize(namespace, name, scope = :instance, &block)
34
+ @module_function = false
30
35
  @scope = nil
31
- self.visibility = :public
36
+
37
+ # handle module function
38
+ if scope == :module
39
+ other = self.class.new(namespace, name, &block)
40
+ other.visibility = :private
41
+ scope = :class
42
+ @module_function = true
43
+ end
44
+
45
+ @visibility = :public
32
46
  self.scope = scope
33
47
  self.parameters = []
34
48
 
@@ -39,9 +53,22 @@ module YARD::CodeObjects
39
53
  # @param [Symbol] v the new scope
40
54
  def scope=(v)
41
55
  reregister = @scope ? true : false
42
- YARD::Registry.delete(self) if reregister
56
+
57
+ # handle module function
58
+ if v == :module
59
+ other = self.class.new(namespace, name)
60
+ other.visibility = :private
61
+ @visibility = :public
62
+ @module_function = true
63
+ @path = nil
64
+ end
65
+
66
+ YARD::Registry.delete(self)
43
67
  @path = nil
44
68
  @scope = v.to_sym
69
+ if @scope == :module
70
+ @scope = :class
71
+ end
45
72
  YARD::Registry.register(self) if reregister
46
73
  end
47
74
 
@@ -50,6 +77,13 @@ module YARD::CodeObjects
50
77
  name == :initialize && scope == :instance && namespace.is_a?(ClassObject)
51
78
  end
52
79
 
80
+ # @return [Boolean] whether or not this method was created as a module
81
+ # function
82
+ # @since 0.8.0
83
+ def module_function?
84
+ @module_function
85
+ end
86
+
53
87
  # Returns the read/writer info for the attribute if it is one
54
88
  # @return [SymbolHash] if there is information about the attribute
55
89
  # @return [nil] if the method is not an attribute
@@ -137,8 +171,6 @@ module YARD::CodeObjects
137
171
  prefix ? (sep == ISEP ? "#{sep}#{super}" : super.to_s) : super
138
172
  end
139
173
 
140
- protected
141
-
142
174
  # Override separator to differentiate between class and instance
143
175
  # methods.
144
176
  # @return [String] "#" for an instance method, "." for class
@@ -149,5 +181,11 @@ module YARD::CodeObjects
149
181
  ISEP
150
182
  end
151
183
  end
184
+
185
+ protected
186
+
187
+ def copyable_attributes
188
+ super - %w(scope module_function)
189
+ end
152
190
  end
153
191
  end
data/lib/yard/config.rb CHANGED
@@ -45,14 +45,14 @@ module YARD
45
45
  # loaded with safe mode on, because plugins are properly namespaced with
46
46
  # a 'yard-' prefix, must be installed as a gem, and therefore cannot be
47
47
  # touched by the user. To specify safe mode, use the +safe_mode+ key.
48
- #
48
+ #
49
49
  # == Plugin Specific Configuration
50
- #
50
+ #
51
51
  # Additional settings can be defined within the configuration file
52
52
  # specifically to provide configuration for a plugin. A plugin that utilizes
53
53
  # the YARD configuration is strongly encouraged to utilize namespacing of
54
54
  # their configuration content.
55
- #
55
+ #
56
56
  # !!!yaml
57
57
  # load_plugins: true # Auto-load plugins when YARD starts
58
58
  # ignored_plugins:
@@ -63,23 +63,23 @@ module YARD
63
63
  # # Plugin Specific Configuration
64
64
  # yard-sample-plugin:
65
65
  # show-results-inline: true
66
- #
66
+ #
67
67
  # As the configuration is available system wide, it can be
68
68
  # accessed within the plugin code.
69
- #
70
- #
69
+ #
70
+ #
71
71
  # if YARD::Config.options['yard-sample-plugin'] and
72
72
  # YARD::Config.options['yard-sample-plugin']['show-results-inline']
73
73
  # # ... perform the action that places the results inline ...
74
74
  # else
75
75
  # # ... do the default behavior of not showing the results inline ...
76
76
  # end
77
- #
77
+ #
78
78
  # When accessing the configuration, be aware that this file is user managed
79
79
  # so configuration keys and values may not be present. Make no assumptions and
80
80
  # instead ensure that you check for the existence of keys before proceeding to
81
81
  # retrieve values.
82
- #
82
+ #
83
83
  # @since 0.6.2
84
84
  # @see options
85
85
  class Config
@@ -119,6 +119,7 @@ module YARD
119
119
  self.options = SymbolHash.new(false)
120
120
  options.update(DEFAULT_CONFIG_OPTIONS)
121
121
  options.update(read_config_file)
122
+ load_commandline_safemode
122
123
  add_ignored_plugins_file
123
124
  translate_plugin_names
124
125
  load_plugins
@@ -198,6 +199,15 @@ module YARD
198
199
  end
199
200
  end
200
201
 
202
+ # Check for command-line safe_mode switch in {#arguments}
203
+ def self.load_commandline_safemode
204
+ with_yardopts do
205
+ arguments.each_with_index do |arg, i|
206
+ options[:safe_mode] = true if arg == '--safe'
207
+ end
208
+ end
209
+ end
210
+
201
211
  # Print a warning if the plugin failed to load
202
212
  # @return [false]
203
213
  def self.load_plugin_failed(name, exception)