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
data/spec/spec_helper.rb CHANGED
@@ -11,7 +11,7 @@ unless defined?(HAVE_RIPPER)
11
11
  begin require 'ripper'; rescue LoadError; end
12
12
  HAVE_RIPPER = defined?(::Ripper) && !ENV['LEGACY'] ? true : false
13
13
  LEGACY_PARSER = !HAVE_RIPPER
14
-
14
+
15
15
  class YARD::Parser::SourceParser
16
16
  def self.parser_type; :ruby18 end
17
17
  end if ENV['LEGACY']
@@ -37,18 +37,18 @@ def described_in_docs(klass, meth, file = nil)
37
37
  YARD::Parser::SourceParser.new.parse(filename)
38
38
  end
39
39
  end
40
-
40
+
41
41
  # Get the object
42
42
  objname = klass.name + (meth[0,1] == '#' ? meth : '::' + meth)
43
43
  obj = Registry.at(objname)
44
44
  raise "Cannot find object #{objname} described by spec." unless obj
45
45
  raise "#{obj.path} has no @it tags to spec." unless obj.has_tag? :it
46
-
46
+
47
47
  # Run examples
48
48
  describe(klass, meth) do
49
49
  obj.tags(:it).each do |it|
50
50
  path = File.relative_path(YARD::ROOT, obj.file)
51
- it(it.name + " (from #{path}:#{obj.line})") do
51
+ it(it.name + " (from #{path}:#{obj.line})") do
52
52
  begin
53
53
  eval(it.text)
54
54
  rescue => e
@@ -68,13 +68,13 @@ def docspec(objname = self.class.description, klass = self.class.described_type)
68
68
  next unless File.exists? filename
69
69
  YARD::Parser::SourceParser.new.parse(filename)
70
70
  end
71
-
71
+
72
72
  # Get the object
73
73
  objname = klass.name + objname if objname =~ /^[^A-Z]/
74
74
  obj = Registry.at(objname)
75
75
  raise "Cannot find object #{objname} described by spec." unless obj
76
76
  raise "#{obj.path} has no @example tags to spec." unless obj.has_tag? :example
77
-
77
+
78
78
  # Run examples
79
79
  obj.tags(:example).each do |exs|
80
80
  exs.text.split(/\n/).each do |ex|
@@ -95,7 +95,7 @@ module Kernel
95
95
  puts args.map {|arg| CGI.escapeHTML(arg.inspect) }.join("<br/>\n")
96
96
  args.first
97
97
  end
98
-
98
+
99
99
  def puts(str)
100
100
  STDOUT.puts str + "<br/>\n"
101
101
  str
@@ -13,7 +13,7 @@ describe YARD::Tags::DefaultFactory do
13
13
  def parse_types(types)
14
14
  @f.send(:extract_types_and_name_from_text, types)
15
15
  end
16
-
16
+
17
17
  it "should handle one type" do
18
18
  parse_types('[A]').should == [nil, ['A'], ""]
19
19
  end
@@ -21,17 +21,25 @@ describe YARD::Tags::DefaultFactory do
21
21
  it "should handle a list of types" do
22
22
  parse_types('[A, B, C]').should == [nil, ['A', 'B', 'C'], ""]
23
23
  end
24
-
24
+
25
+ it "should handle ducktypes" do
26
+ parse_types('[#foo]').should == [nil, ['#foo'], '']
27
+ end
28
+
29
+ it "should handle ducktypes with special method names" do
30
+ parse_types('[#foo=]').should == [nil, ['#foo='], '']
31
+ end
32
+
25
33
  it "should return the text before and after the type list" do
26
34
  parse_types(' b <String> description').should == ['b', ['String'], 'description']
27
35
  parse_types('b c <String> description (test)').should == [nil, nil, 'b c <String> description (test)']
28
36
  end
29
-
37
+
30
38
  it "should handle a complex list of types" do
31
39
  v = parse_types(' [Test, Array<String, Hash, C>, String]')
32
40
  v.should include(["Test", "Array<String, Hash, C>", "String"])
33
41
  end
34
-
42
+
35
43
  it "should handle any of the following start/end delimiting chars: (), <>, {}, []" do
36
44
  a = parse_types('[a,b,c]')
37
45
  b = parse_types('<a,b,c>')
@@ -42,17 +50,17 @@ describe YARD::Tags::DefaultFactory do
42
50
  c.should == d
43
51
  a.should include(['a','b','c'])
44
52
  end
45
-
53
+
46
54
  it "should return the text before the type list as the last element" do
47
55
  parse_types('b[x, y, z]').should == ['b', ['x', 'y', 'z'], '']
48
56
  parse_types(' ! <x>').should == ["!", ['x'], '']
49
57
  end
50
-
58
+
51
59
  it "should return text unparsed if there is no type list" do
52
60
  parse_types('').should == [nil, nil, '']
53
61
  parse_types('[]').should == [nil, nil, '[]']
54
62
  end
55
-
63
+
56
64
  it "should allow A => B syntax" do
57
65
  v = parse_types(' [Test, Array<String, Hash{A => {B => C}}, C>, String]')
58
66
  v.should include(["Test", "Array<String, Hash{A => {B => C}}, C>", "String"])
@@ -63,22 +71,22 @@ describe YARD::Tags::DefaultFactory do
63
71
  def parse_types(text)
64
72
  @f.send(:parse_tag_with_types, 'test', text)
65
73
  end
66
-
74
+
67
75
  it "should parse given types and description" do
68
76
  YARD::Tags::Tag.should_receive(:new).with("test", "description", ["x", "y", "z"])
69
77
  parse_types(' [x, y, z] description')
70
78
  end
71
-
79
+
72
80
  it "should parse given types only" do
73
81
  YARD::Tags::Tag.should_receive(:new).with("test", "", ["x", "y", "z"])
74
82
  parse_types(' [x, y, z] ')
75
83
  end
76
-
84
+
77
85
  it "should allow type list to be omitted" do
78
86
  YARD::Tags::Tag.should_receive(:new).with('test', 'description', nil)
79
87
  parse_types(' description ')
80
88
  end
81
-
89
+
82
90
  it "should raise an error if a name is specified before type list" do
83
91
  lambda { parse_types('b<String> desc') }.should raise_error(YARD::Tags::TagFormatError, 'cannot specify a name before type list for \'@test\'')
84
92
  end
@@ -88,7 +96,7 @@ describe YARD::Tags::DefaultFactory do
88
96
  def parse_types(text)
89
97
  @f.send(:parse_tag_with_types_name_and_default, 'test', text)
90
98
  end
91
-
99
+
92
100
  it "should parse a standard type list with name before types (no default)" do
93
101
  YARD::Tags::DefaultTag.should_receive(:new).with("test", "description", ["x", "y", "z"], 'NAME', nil)
94
102
  parse_types('NAME [x, y, z] description')
@@ -98,7 +106,7 @@ describe YARD::Tags::DefaultFactory do
98
106
  YARD::Tags::DefaultTag.should_receive(:new).with("test", "description", ["x", "y", "z"], 'NAME', nil)
99
107
  parse_types(' [x, y, z] NAME description')
100
108
  end
101
-
109
+
102
110
  it "should parse a tag definition with name, typelist and default" do
103
111
  YARD::Tags::DefaultTag.should_receive(:new).with("test", "description", ["x", "y", "z"], 'NAME', ['default', 'values'])
104
112
  parse_types(' [x, y, z] NAME (default, values) description')
@@ -108,7 +116,7 @@ describe YARD::Tags::DefaultFactory do
108
116
  YARD::Tags::DefaultTag.should_receive(:new).with("test", "description", ["x", "y", "z"], 'NAME', ['default', 'values'])
109
117
  parse_types(' NAME [x, y, z] (default, values) description')
110
118
  end
111
-
119
+
112
120
  it "should allow typelist to be omitted" do
113
121
  YARD::Tags::DefaultTag.should_receive(:new).with("test", "description", nil, 'NAME', ['default', 'values'])
114
122
  parse_types(' NAME (default, values) description')
@@ -119,13 +127,13 @@ describe YARD::Tags::DefaultFactory do
119
127
  def parse_options(text)
120
128
  @f.parse_tag_with_options('option', text)
121
129
  end
122
-
130
+
123
131
  it "should have a name before tag info" do
124
132
  t = parse_options("xyz key [Types] (default) description")
125
133
  t.tag_name.should == 'option'
126
134
  t.name.should == 'xyz'
127
135
  end
128
-
136
+
129
137
  it "should parse the rest of the tag like DefaultTag" do
130
138
  t = parse_options("xyz key [Types] (default) description")
131
139
  t.pair.should be_instance_of(Tags::DefaultTag)
@@ -0,0 +1,422 @@
1
+ require File.dirname(__FILE__) + "/../spec_helper"
2
+
3
+ def tag_parse(content, object = nil, handler = nil)
4
+ @parser = DocstringParser.new
5
+ @parser.parse(content, object, handler)
6
+ @parser
7
+ end
8
+
9
+ describe YARD::Tags::ParseDirective do
10
+ describe '#call' do
11
+ after { Registry.clear }
12
+
13
+ it "should parse if handler=nil but use file=(stdin)" do
14
+ tag_parse %{@!parse
15
+ # Docstring here
16
+ def foo; end
17
+ }
18
+ Registry.at('#foo').docstring.should == "Docstring here"
19
+ Registry.at('#foo').file.should == '(stdin)'
20
+ end
21
+
22
+ it "should allow parser type to be specified in type" do
23
+ tag_parse %{@!parse [c]
24
+ void Init_Foo() {
25
+ rb_define_method(rb_cMyClass, "foo", foo, 1);
26
+ }
27
+ }
28
+ Registry.at('MyClass#foo').should_not be_nil
29
+ end
30
+
31
+ it "should parse code in context of current handler" do
32
+ src = <<-eof
33
+ class A
34
+ # @!parse
35
+ # def foo; end
36
+ eval "def foo; end"
37
+ end
38
+ eof
39
+ parser = Parser::SourceParser.new
40
+ parser.file = "myfile.rb"
41
+ parser.parse(StringIO.new(src))
42
+ Registry.at('A#foo').file.should == 'myfile.rb'
43
+ end
44
+ end
45
+ end
46
+
47
+ describe YARD::Tags::GroupDirective do
48
+ describe '#call' do
49
+ it "should do nothing if handler=nil" do
50
+ tag_parse("@!group foo")
51
+ end
52
+
53
+ it "should set group value in parser state (with handler)" do
54
+ handler = OpenStruct.new(:extra_state => OpenStruct.new)
55
+ tag_parse("@!group foo", nil, handler)
56
+ handler.extra_state.group.should == 'foo'
57
+ end
58
+ end
59
+ end
60
+
61
+ describe YARD::Tags::EndGroupDirective do
62
+ describe '#call' do
63
+ it "should do nothing if handler=nil" do
64
+ tag_parse("@!endgroup foo")
65
+ end
66
+
67
+ it "should set group value in parser state (with handler)" do
68
+ handler = OpenStruct.new(:extra_state => OpenStruct.new(:group => "foo"))
69
+ tag_parse("@!endgroup", nil, handler)
70
+ handler.extra_state.group.should be_nil
71
+ end
72
+ end
73
+ end
74
+
75
+ describe YARD::Tags::MacroDirective do
76
+ def handler
77
+ OpenStruct.new(:call_params => %w(a b c),
78
+ :caller_method => 'foo',
79
+ :scope => :instance, :visibility => :public,
80
+ :namespace => P('Foo::Bar'),
81
+ :statement => OpenStruct.new(:source => 'foo :a, :b, :c'))
82
+ end
83
+
84
+ after(:all) { Registry.clear }
85
+
86
+ describe '#call' do
87
+ it "should define new macro when [new] is provided" do
88
+ tag_parse("@!macro [new] foo\n foo")
89
+ CodeObjects::MacroObject.find('foo').macro_data.should == 'foo'
90
+ end
91
+
92
+ it "should define new macro if text block is provided" do
93
+ tag_parse("@!macro bar\n bar")
94
+ CodeObjects::MacroObject.find('bar').macro_data.should == 'bar'
95
+ end
96
+
97
+ it "should expand macros and return #expanded_text to tag parser" do
98
+ tag_parse("@!macro [new] foo\n foo")
99
+ tag_parse("@!macro foo").text.should == 'foo'
100
+ end
101
+
102
+ it "should not expand new macro if docstring is unattached" do
103
+ tag_parse("@!macro [new] foo\n foo").text.should_not == 'foo'
104
+ end
105
+
106
+ it "should expand new anonymous macro even if docstring is unattached" do
107
+ tag_parse("@!macro\n foo").text.should == 'foo'
108
+ end
109
+
110
+ it "should allow multiple macros to be expanded" do
111
+ tag_parse("@!macro [new] foo\n foo")
112
+ tag_parse("@!macro bar\n bar")
113
+ tag_parse("@!macro foo\n@!macro bar").text.should == "foo\nbar"
114
+ end
115
+
116
+ it "should allow anonymous macros" do
117
+ tag_parse("@!macro\n a b c", nil, handler)
118
+ @parser.text.should == 'a b c'
119
+ end
120
+
121
+ it "should expand call_params and caller_method using $N when handler is provided" do
122
+ tag_parse("@!macro\n $1 $2 $3", nil, handler)
123
+ @parser.text.should == 'a b c'
124
+ end
125
+
126
+ it "should attach macro to method if one exists" do
127
+ tag_parse("@!macro [attach] attached\n $1 $2 $3", nil, handler)
128
+ macro = CodeObjects::MacroObject.find('attached')
129
+ macro.method_object.should == P('Foo::Bar.foo')
130
+ end
131
+
132
+ it "should not expand new attached macro if defined on class method" do
133
+ baz = CodeObjects::MethodObject.new(P('Foo::Bar'), :baz, :class)
134
+ baz.visibility.should == :public
135
+ tag_parse("@!macro [attach] attached2\n @!visibility private", baz, handler)
136
+ macro = CodeObjects::MacroObject.find('attached2')
137
+ macro.method_object.should == P('Foo::Bar.baz')
138
+ baz.visibility.should == :public
139
+ end
140
+
141
+ it "should not attempt to expand macro values if handler = nil" do
142
+ tag_parse("@!macro [attach] xyz\n $1 $2 $3")
143
+ end
144
+ end
145
+ end
146
+
147
+ describe YARD::Tags::MethodDirective do
148
+ describe '#call' do
149
+ after { Registry.clear }
150
+
151
+ it "should use entire docstring if no indented data is found" do
152
+ YARD.parse_string <<-eof
153
+ class Foo
154
+ # @!method foo
155
+ # @!method bar
156
+ # @!scope class
157
+ end
158
+ eof
159
+ Registry.at('Foo.foo').should be_a(CodeObjects::MethodObject)
160
+ Registry.at('Foo.bar').should be_a(CodeObjects::MethodObject)
161
+ end
162
+
163
+ it "should handle indented block text in @!method" do
164
+ YARD.parse_string <<-eof
165
+ # @!method foo(a)
166
+ # Docstring here
167
+ # @return [String] the foo
168
+ # Ignore this
169
+ # @param [String] a
170
+ eof
171
+ foo = Registry.at('#foo')
172
+ foo.docstring.should == "Docstring here"
173
+ foo.docstring.tag(:return).should_not be_nil
174
+ foo.tag(:param).should be_nil
175
+ end
176
+
177
+ it "should execute directives on object in indented block" do
178
+ YARD.parse_string <<-eof
179
+ class Foo
180
+ # @!method foo(a)
181
+ # @!scope class
182
+ # @!visibility private
183
+ # @!method bar
184
+ # Hello
185
+ # Ignore this
186
+ end
187
+ eof
188
+ foo = Registry.at('Foo.foo')
189
+ foo.visibility.should == :private
190
+ bar = Registry.at('Foo#bar')
191
+ bar.visibility.should == :public
192
+ end
193
+
194
+ it "should be able to define multiple @methods in docstring" do
195
+ YARD.parse_string <<-eof
196
+ class Foo
197
+ # @!method foo1
198
+ # Docstring1
199
+ # @!method foo2
200
+ # Docstring2
201
+ # @!method foo3
202
+ # @!scope class
203
+ # Docstring3
204
+ end
205
+ eof
206
+ foo1 = Registry.at('Foo#foo1')
207
+ foo2 = Registry.at('Foo#foo2')
208
+ foo3 = Registry.at('Foo.foo3')
209
+ foo1.docstring.should == 'Docstring1'
210
+ foo2.docstring.should == 'Docstring2'
211
+ foo3.docstring.should == 'Docstring3'
212
+ end
213
+
214
+ it "should define the method inside namespace if attached to namespace object" do
215
+ YARD.parse_string <<-eof
216
+ module Foo
217
+ # @!method foo
218
+ # Docstring1
219
+ # @!method bar
220
+ # Docstring2
221
+ class Bar
222
+ end
223
+ end
224
+ eof
225
+ Registry.at('Foo::Bar#foo').docstring.should == 'Docstring1'
226
+ Registry.at('Foo::Bar#bar').docstring.should == 'Docstring2'
227
+ end
228
+
229
+ it "should set scope to class if signature has 'self.' prefix" do
230
+ YARD.parse_string <<-eof
231
+ # @!method self.foo
232
+ # @!method self. bar
233
+ # @!method self.baz()
234
+ class Foo
235
+ end
236
+ eof
237
+ %w(foo bar baz).each do |name|
238
+ Registry.at("Foo.#{name}").should be_a(CodeObjects::MethodObject)
239
+ end
240
+ end
241
+
242
+ it "should be able to define method with module scope (module function)" do
243
+ YARD.parse_string <<-eof
244
+ # @!method foo
245
+ # @!scope module
246
+ # This is a docstring
247
+ # @return [Boolean] whether this is true
248
+ class Foo
249
+ end
250
+ eof
251
+ foo_c = Registry.at('Foo.foo')
252
+ foo_i = Registry.at('Foo#foo')
253
+ foo_c.should_not be_nil
254
+ foo_i.should_not be_nil
255
+ foo_c.should be_module_function
256
+ foo_c.docstring.should == foo_i.docstring
257
+ foo_c.tag(:return).text.should == foo_i.tag(:return).text
258
+ end
259
+ end
260
+ end
261
+
262
+ describe YARD::Tags::AttributeDirective do
263
+ describe '#call' do
264
+ after { Registry.clear }
265
+
266
+ it "should use entire docstring if no indented data is found" do
267
+ YARD.parse_string <<-eof
268
+ class Foo
269
+ # @!attribute foo
270
+ # @!attribute bar
271
+ # @!scope class
272
+ end
273
+ eof
274
+ Registry.at('Foo.foo').should be_reader
275
+ Registry.at('Foo.bar').should be_reader
276
+ end
277
+
278
+ it "should handle indented block in @!attribute" do
279
+ YARD.parse_string <<-eof
280
+ # @!attribute foo
281
+ # Docstring here
282
+ # @return [String] the foo
283
+ # Ignore this
284
+ # @param [String] a
285
+ eof
286
+ foo = Registry.at('#foo')
287
+ foo.is_attribute?.should == true
288
+ foo.docstring.should == "Docstring here"
289
+ foo.docstring.tag(:return).should_not be_nil
290
+ foo.tag(:param).should be_nil
291
+ end
292
+
293
+ it "should be able to define multiple @attributes in docstring" do
294
+ YARD.parse_string <<-eof
295
+ class Foo
296
+ # @!attribute [r] foo1
297
+ # Docstring1
298
+ # @!attribute [w] foo2
299
+ # Docstring2
300
+ # @!attribute foo3
301
+ # @!scope class
302
+ # Docstring3
303
+ end
304
+ eof
305
+ foo1 = Registry.at('Foo#foo1')
306
+ foo2 = Registry.at('Foo#foo2=')
307
+ foo3 = Registry.at('Foo.foo3')
308
+ foo4 = Registry.at('Foo.foo3=')
309
+ foo1.should be_reader
310
+ foo2.should be_writer
311
+ foo3.should be_reader
312
+ foo1.docstring.should == 'Docstring1'
313
+ foo2.docstring.should == 'Docstring2'
314
+ foo3.docstring.should == 'Docstring3'
315
+ foo4.should be_writer
316
+ foo1.attr_info[:write].should be_nil
317
+ foo2.attr_info[:read].should be_nil
318
+ end
319
+
320
+ it "should define the attr inside namespace if attached to namespace object" do
321
+ YARD.parse_string <<-eof
322
+ module Foo
323
+ # @!attribute [r] foo
324
+ # @!attribute [r] bar
325
+ class Bar
326
+ end
327
+ end
328
+ eof
329
+ Registry.at('Foo::Bar#foo').should be_reader
330
+ Registry.at('Foo::Bar#bar').should be_reader
331
+ end
332
+ end
333
+
334
+ it "should set scope to class if signature has 'self.' prefix" do
335
+ YARD.parse_string <<-eof
336
+ # @!attribute self.foo
337
+ # @!attribute self. bar
338
+ # @!attribute self.baz
339
+ class Foo
340
+ end
341
+ eof
342
+ %w(foo bar baz).each do |name|
343
+ Registry.at("Foo.#{name}").should be_reader
344
+ end
345
+ end
346
+ end
347
+
348
+ describe YARD::Tags::ScopeDirective do
349
+ describe '#call' do
350
+ after { Registry.clear }
351
+
352
+ it "should set state on tag parser if object = nil" do
353
+ tag_parse("@!scope class")
354
+ @parser.state.scope.should == :class
355
+ end
356
+
357
+ it "should set state on tag parser if object is namespace" do
358
+ object = CodeObjects::ClassObject.new(:root, 'Foo')
359
+ tag_parse("@!scope class", object)
360
+ object[:scope].should be_nil
361
+ @parser.state.scope.should == :class
362
+ end
363
+
364
+ it "should set scope on object if object is a method object" do
365
+ object = CodeObjects::MethodObject.new(:root, 'foo')
366
+ tag_parse("@!scope class", object)
367
+ object.scope.should == :class
368
+ end
369
+
370
+ %w(class instance module).each do |type|
371
+ it "should allow #{type} as value" do
372
+ tag_parse("@!scope #{type}")
373
+ @parser.state.scope.should == type.to_sym
374
+ end
375
+ end
376
+
377
+ %w(invalid foo FOO CLASS INSTANCE).each do |type|
378
+ it "should not allow #{type} as value" do
379
+ tag_parse("@!scope #{type}")
380
+ @parser.state.scope.should be_nil
381
+ end
382
+ end
383
+ end
384
+ end
385
+
386
+ describe YARD::Tags::VisibilityDirective do
387
+ describe '#call' do
388
+ after { Registry.clear }
389
+
390
+ it "should set visibility on tag parser if object = nil" do
391
+ tag_parse("@!visibility private")
392
+ @parser.state.visibility.should == :private
393
+ end
394
+
395
+ it "should set state on tag parser if object is namespace" do
396
+ object = CodeObjects::ClassObject.new(:root, 'Foo')
397
+ tag_parse("@!visibility protected", object)
398
+ object.visibility.should == :protected
399
+ @parser.state.visibility.should be_nil
400
+ end
401
+
402
+ it "should set visibility on object if object is a method object" do
403
+ object = CodeObjects::MethodObject.new(:root, 'foo')
404
+ tag_parse("@!visibility private", object)
405
+ object.visibility.should == :private
406
+ end
407
+
408
+ %w(public private protected).each do |type|
409
+ it "should allow #{type} as value" do
410
+ tag_parse("@!visibility #{type}")
411
+ @parser.state.visibility.should == type.to_sym
412
+ end
413
+ end
414
+
415
+ %w(invalid foo FOO PRIVATE INSTANCE).each do |type|
416
+ it "should not allow #{type} as value" do
417
+ tag_parse("@!visibility #{type}")
418
+ @parser.state.visibility.should be_nil
419
+ end
420
+ end
421
+ end
422
+ end