deg-yard 0.8.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (558) hide show
  1. data/.travis.yml +39 -0
  2. data/.yardopts +25 -0
  3. data/.yardopts_guide +19 -0
  4. data/.yardopts_i18n +22 -0
  5. data/Gemfile +35 -0
  6. data/LEGAL +66 -0
  7. data/LICENSE +22 -0
  8. data/README.md +609 -0
  9. data/Rakefile +66 -0
  10. data/benchmarks/builtins_vs_eval.rb +23 -0
  11. data/benchmarks/concat_vs_join.rb +12 -0
  12. data/benchmarks/erb_vs_erubis.rb +53 -0
  13. data/benchmarks/format_args.rb +46 -0
  14. data/benchmarks/generation.rb +37 -0
  15. data/benchmarks/marshal_vs_dbm.rb +63 -0
  16. data/benchmarks/parsing.rb +46 -0
  17. data/benchmarks/pathname_vs_string.rb +50 -0
  18. data/benchmarks/rdoc_vs_yardoc.rb +10 -0
  19. data/benchmarks/registry_store_types.rb +48 -0
  20. data/benchmarks/ri_vs_yri.rb +18 -0
  21. data/benchmarks/ripper_parser.rb +12 -0
  22. data/benchmarks/splat_vs_flatten.rb +12 -0
  23. data/benchmarks/template_erb.rb +22 -0
  24. data/benchmarks/template_format.rb +6 -0
  25. data/benchmarks/template_profile.rb +17 -0
  26. data/benchmarks/yri_cache.rb +19 -0
  27. data/bin/yard +12 -0
  28. data/bin/yardoc +12 -0
  29. data/bin/yri +12 -0
  30. data/docs/CodeObjects.md +115 -0
  31. data/docs/GettingStarted.md +592 -0
  32. data/docs/Handlers.md +152 -0
  33. data/docs/Overview.md +61 -0
  34. data/docs/Parser.md +191 -0
  35. data/docs/Tags.md +282 -0
  36. data/docs/TagsArch.md +123 -0
  37. data/docs/Templates.md +496 -0
  38. data/docs/WhatsNew.md +1244 -0
  39. data/docs/images/code-objects-class-diagram.png +0 -0
  40. data/docs/images/handlers-class-diagram.png +0 -0
  41. data/docs/images/overview-class-diagram.png +0 -0
  42. data/docs/images/parser-class-diagram.png +0 -0
  43. data/docs/images/tags-class-diagram.png +0 -0
  44. data/docs/templates/default/fulldoc/html/full_list_tag.erb +7 -0
  45. data/docs/templates/default/fulldoc/html/setup.rb +6 -0
  46. data/docs/templates/default/layout/html/setup.rb +8 -0
  47. data/docs/templates/default/layout/html/tag_list.erb +11 -0
  48. data/docs/templates/default/yard_tags/html/list.erb +18 -0
  49. data/docs/templates/default/yard_tags/html/setup.rb +27 -0
  50. data/docs/templates/plugin.rb +65 -0
  51. data/lib/rubygems_plugin.rb +4 -0
  52. data/lib/yard/autoload.rb +290 -0
  53. data/lib/yard/cli/command.rb +84 -0
  54. data/lib/yard/cli/command_parser.rb +92 -0
  55. data/lib/yard/cli/config.rb +136 -0
  56. data/lib/yard/cli/diff.rb +270 -0
  57. data/lib/yard/cli/display.rb +68 -0
  58. data/lib/yard/cli/gems.rb +83 -0
  59. data/lib/yard/cli/graph.rb +126 -0
  60. data/lib/yard/cli/help.rb +18 -0
  61. data/lib/yard/cli/i18n.rb +69 -0
  62. data/lib/yard/cli/list.rb +22 -0
  63. data/lib/yard/cli/markup_types.rb +33 -0
  64. data/lib/yard/cli/server.rb +253 -0
  65. data/lib/yard/cli/stats.rb +213 -0
  66. data/lib/yard/cli/yardoc.rb +752 -0
  67. data/lib/yard/cli/yardopts_command.rb +109 -0
  68. data/lib/yard/cli/yri.rb +214 -0
  69. data/lib/yard/code_objects/base.rb +585 -0
  70. data/lib/yard/code_objects/class_object.rb +143 -0
  71. data/lib/yard/code_objects/class_variable_object.rb +8 -0
  72. data/lib/yard/code_objects/constant_object.rb +13 -0
  73. data/lib/yard/code_objects/extended_method_object.rb +23 -0
  74. data/lib/yard/code_objects/extra_file_object.rb +128 -0
  75. data/lib/yard/code_objects/macro_object.rb +172 -0
  76. data/lib/yard/code_objects/method_object.rb +191 -0
  77. data/lib/yard/code_objects/module_object.rb +18 -0
  78. data/lib/yard/code_objects/namespace_object.rb +200 -0
  79. data/lib/yard/code_objects/proxy.rb +258 -0
  80. data/lib/yard/code_objects/root_object.rb +17 -0
  81. data/lib/yard/config.rb +269 -0
  82. data/lib/yard/core_ext/array.rb +15 -0
  83. data/lib/yard/core_ext/file.rb +65 -0
  84. data/lib/yard/core_ext/hash.rb +15 -0
  85. data/lib/yard/core_ext/insertion.rb +60 -0
  86. data/lib/yard/core_ext/module.rb +19 -0
  87. data/lib/yard/core_ext/string.rb +67 -0
  88. data/lib/yard/core_ext/symbol_hash.rb +73 -0
  89. data/lib/yard/docstring.rb +362 -0
  90. data/lib/yard/docstring_parser.rb +321 -0
  91. data/lib/yard/globals.rb +18 -0
  92. data/lib/yard/handlers/base.rb +597 -0
  93. data/lib/yard/handlers/c/alias_handler.rb +15 -0
  94. data/lib/yard/handlers/c/attribute_handler.rb +13 -0
  95. data/lib/yard/handlers/c/base.rb +110 -0
  96. data/lib/yard/handlers/c/class_handler.rb +26 -0
  97. data/lib/yard/handlers/c/constant_handler.rb +12 -0
  98. data/lib/yard/handlers/c/handler_methods.rb +166 -0
  99. data/lib/yard/handlers/c/init_handler.rb +18 -0
  100. data/lib/yard/handlers/c/method_handler.rb +35 -0
  101. data/lib/yard/handlers/c/mixin_handler.rb +13 -0
  102. data/lib/yard/handlers/c/module_handler.rb +16 -0
  103. data/lib/yard/handlers/c/override_comment_handler.rb +30 -0
  104. data/lib/yard/handlers/c/path_handler.rb +10 -0
  105. data/lib/yard/handlers/c/struct_handler.rb +12 -0
  106. data/lib/yard/handlers/c/symbol_handler.rb +7 -0
  107. data/lib/yard/handlers/processor.rb +201 -0
  108. data/lib/yard/handlers/ruby/alias_handler.rb +41 -0
  109. data/lib/yard/handlers/ruby/attribute_handler.rb +82 -0
  110. data/lib/yard/handlers/ruby/base.rb +164 -0
  111. data/lib/yard/handlers/ruby/class_condition_handler.rb +86 -0
  112. data/lib/yard/handlers/ruby/class_handler.rb +121 -0
  113. data/lib/yard/handlers/ruby/class_variable_handler.rb +16 -0
  114. data/lib/yard/handlers/ruby/comment_handler.rb +9 -0
  115. data/lib/yard/handlers/ruby/constant_handler.rb +45 -0
  116. data/lib/yard/handlers/ruby/dsl_handler.rb +14 -0
  117. data/lib/yard/handlers/ruby/dsl_handler_methods.rb +77 -0
  118. data/lib/yard/handlers/ruby/exception_handler.rb +26 -0
  119. data/lib/yard/handlers/ruby/extend_handler.rb +21 -0
  120. data/lib/yard/handlers/ruby/legacy/alias_handler.rb +34 -0
  121. data/lib/yard/handlers/ruby/legacy/attribute_handler.rb +60 -0
  122. data/lib/yard/handlers/ruby/legacy/base.rb +250 -0
  123. data/lib/yard/handlers/ruby/legacy/class_condition_handler.rb +83 -0
  124. data/lib/yard/handlers/ruby/legacy/class_handler.rb +111 -0
  125. data/lib/yard/handlers/ruby/legacy/class_variable_handler.rb +14 -0
  126. data/lib/yard/handlers/ruby/legacy/comment_handler.rb +9 -0
  127. data/lib/yard/handlers/ruby/legacy/constant_handler.rb +28 -0
  128. data/lib/yard/handlers/ruby/legacy/dsl_handler.rb +16 -0
  129. data/lib/yard/handlers/ruby/legacy/exception_handler.rb +12 -0
  130. data/lib/yard/handlers/ruby/legacy/extend_handler.rb +20 -0
  131. data/lib/yard/handlers/ruby/legacy/method_handler.rb +85 -0
  132. data/lib/yard/handlers/ruby/legacy/mixin_handler.rb +39 -0
  133. data/lib/yard/handlers/ruby/legacy/module_function_handler.rb +18 -0
  134. data/lib/yard/handlers/ruby/legacy/module_handler.rb +11 -0
  135. data/lib/yard/handlers/ruby/legacy/private_constant_handler.rb +21 -0
  136. data/lib/yard/handlers/ruby/legacy/visibility_handler.rb +16 -0
  137. data/lib/yard/handlers/ruby/legacy/yield_handler.rb +28 -0
  138. data/lib/yard/handlers/ruby/method_condition_handler.rb +8 -0
  139. data/lib/yard/handlers/ruby/method_handler.rb +92 -0
  140. data/lib/yard/handlers/ruby/mixin_handler.rb +36 -0
  141. data/lib/yard/handlers/ruby/module_function_handler.rb +26 -0
  142. data/lib/yard/handlers/ruby/module_handler.rb +11 -0
  143. data/lib/yard/handlers/ruby/private_constant_handler.rb +36 -0
  144. data/lib/yard/handlers/ruby/struct_handler_methods.rb +141 -0
  145. data/lib/yard/handlers/ruby/visibility_handler.rb +24 -0
  146. data/lib/yard/handlers/ruby/yield_handler.rb +30 -0
  147. data/lib/yard/i18n/locale.rb +74 -0
  148. data/lib/yard/i18n/message.rb +56 -0
  149. data/lib/yard/i18n/messages.rb +55 -0
  150. data/lib/yard/i18n/pot_generator.rb +280 -0
  151. data/lib/yard/i18n/text.rb +173 -0
  152. data/lib/yard/logging.rb +190 -0
  153. data/lib/yard/options.rb +216 -0
  154. data/lib/yard/parser/base.rb +56 -0
  155. data/lib/yard/parser/c/c_parser.rb +231 -0
  156. data/lib/yard/parser/c/comment_parser.rb +131 -0
  157. data/lib/yard/parser/c/statement.rb +63 -0
  158. data/lib/yard/parser/ruby/ast_node.rb +496 -0
  159. data/lib/yard/parser/ruby/legacy/ruby_lex.rb +1378 -0
  160. data/lib/yard/parser/ruby/legacy/ruby_parser.rb +31 -0
  161. data/lib/yard/parser/ruby/legacy/statement.rb +65 -0
  162. data/lib/yard/parser/ruby/legacy/statement_list.rb +384 -0
  163. data/lib/yard/parser/ruby/legacy/token_list.rb +71 -0
  164. data/lib/yard/parser/ruby/ruby_parser.rb +625 -0
  165. data/lib/yard/parser/source_parser.rb +517 -0
  166. data/lib/yard/rake/yardoc_task.rb +74 -0
  167. data/lib/yard/registry.rb +438 -0
  168. data/lib/yard/registry_store.rb +319 -0
  169. data/lib/yard/rubygems/backports/LICENSE.txt +57 -0
  170. data/lib/yard/rubygems/backports/MIT.txt +20 -0
  171. data/lib/yard/rubygems/backports/gem.rb +9 -0
  172. data/lib/yard/rubygems/backports/source_index.rb +370 -0
  173. data/lib/yard/rubygems/backports.rb +8 -0
  174. data/lib/yard/rubygems/doc_manager.rb +88 -0
  175. data/lib/yard/rubygems/specification.rb +41 -0
  176. data/lib/yard/serializers/base.rb +80 -0
  177. data/lib/yard/serializers/file_system_serializer.rb +90 -0
  178. data/lib/yard/serializers/process_serializer.rb +24 -0
  179. data/lib/yard/serializers/stdout_serializer.rb +32 -0
  180. data/lib/yard/serializers/yardoc_serializer.rb +124 -0
  181. data/lib/yard/server/adapter.rb +100 -0
  182. data/lib/yard/server/commands/base.rb +192 -0
  183. data/lib/yard/server/commands/display_file_command.rb +24 -0
  184. data/lib/yard/server/commands/display_object_command.rb +58 -0
  185. data/lib/yard/server/commands/frames_command.rb +15 -0
  186. data/lib/yard/server/commands/library_command.rb +148 -0
  187. data/lib/yard/server/commands/library_index_command.rb +24 -0
  188. data/lib/yard/server/commands/list_command.rb +24 -0
  189. data/lib/yard/server/commands/search_command.rb +78 -0
  190. data/lib/yard/server/commands/static_file_command.rb +57 -0
  191. data/lib/yard/server/doc_server_helper.rb +76 -0
  192. data/lib/yard/server/doc_server_serializer.rb +33 -0
  193. data/lib/yard/server/library_version.rb +227 -0
  194. data/lib/yard/server/rack_adapter.rb +88 -0
  195. data/lib/yard/server/router.rb +176 -0
  196. data/lib/yard/server/static_caching.rb +45 -0
  197. data/lib/yard/server/templates/default/fulldoc/html/css/custom.css +78 -0
  198. data/lib/yard/server/templates/default/fulldoc/html/images/processing.gif +0 -0
  199. data/lib/yard/server/templates/default/fulldoc/html/js/autocomplete.js +12 -0
  200. data/lib/yard/server/templates/default/layout/html/breadcrumb.erb +46 -0
  201. data/lib/yard/server/templates/default/layout/html/script_setup.erb +8 -0
  202. data/lib/yard/server/templates/default/layout/html/setup.rb +7 -0
  203. data/lib/yard/server/templates/default/method_details/html/permalink.erb +4 -0
  204. data/lib/yard/server/templates/default/method_details/html/setup.rb +4 -0
  205. data/lib/yard/server/templates/doc_server/library_list/html/contents.erb +13 -0
  206. data/lib/yard/server/templates/doc_server/library_list/html/headers.erb +26 -0
  207. data/lib/yard/server/templates/doc_server/library_list/html/library_list.erb +12 -0
  208. data/lib/yard/server/templates/doc_server/library_list/html/setup.rb +3 -0
  209. data/lib/yard/server/templates/doc_server/library_list/html/title.erb +2 -0
  210. data/lib/yard/server/templates/doc_server/processing/html/processing.erb +51 -0
  211. data/lib/yard/server/templates/doc_server/processing/html/setup.rb +3 -0
  212. data/lib/yard/server/templates/doc_server/search/html/search.erb +18 -0
  213. data/lib/yard/server/templates/doc_server/search/html/setup.rb +8 -0
  214. data/lib/yard/server/webrick_adapter.rb +43 -0
  215. data/lib/yard/server.rb +11 -0
  216. data/lib/yard/tags/default_factory.rb +176 -0
  217. data/lib/yard/tags/default_tag.rb +12 -0
  218. data/lib/yard/tags/directives.rb +599 -0
  219. data/lib/yard/tags/library.rb +630 -0
  220. data/lib/yard/tags/option_tag.rb +12 -0
  221. data/lib/yard/tags/overload_tag.rb +66 -0
  222. data/lib/yard/tags/ref_tag.rb +7 -0
  223. data/lib/yard/tags/ref_tag_list.rb +27 -0
  224. data/lib/yard/tags/tag.rb +57 -0
  225. data/lib/yard/tags/tag_format_error.rb +6 -0
  226. data/lib/yard/templates/engine.rb +185 -0
  227. data/lib/yard/templates/erb_cache.rb +22 -0
  228. data/lib/yard/templates/helpers/base_helper.rb +212 -0
  229. data/lib/yard/templates/helpers/filter_helper.rb +26 -0
  230. data/lib/yard/templates/helpers/html_helper.rb +599 -0
  231. data/lib/yard/templates/helpers/html_syntax_highlight_helper.rb +59 -0
  232. data/lib/yard/templates/helpers/markup/rdoc_markdown.rb +22 -0
  233. data/lib/yard/templates/helpers/markup/rdoc_markup.rb +106 -0
  234. data/lib/yard/templates/helpers/markup_helper.rb +169 -0
  235. data/lib/yard/templates/helpers/method_helper.rb +74 -0
  236. data/lib/yard/templates/helpers/module_helper.rb +19 -0
  237. data/lib/yard/templates/helpers/text_helper.rb +95 -0
  238. data/lib/yard/templates/helpers/uml_helper.rb +46 -0
  239. data/lib/yard/templates/section.rb +106 -0
  240. data/lib/yard/templates/template.rb +407 -0
  241. data/lib/yard/templates/template_options.rb +88 -0
  242. data/lib/yard/verifier.rb +148 -0
  243. data/lib/yard/version.rb +3 -0
  244. data/lib/yard.rb +71 -0
  245. data/po/ja.po +31118 -0
  246. data/spec/cli/command_parser_spec.rb +43 -0
  247. data/spec/cli/command_spec.rb +36 -0
  248. data/spec/cli/config_spec.rb +92 -0
  249. data/spec/cli/diff_spec.rb +260 -0
  250. data/spec/cli/display_spec.rb +30 -0
  251. data/spec/cli/gems_spec.rb +81 -0
  252. data/spec/cli/graph_spec.rb +17 -0
  253. data/spec/cli/help_spec.rb +22 -0
  254. data/spec/cli/i18n_spec.rb +111 -0
  255. data/spec/cli/list_spec.rb +8 -0
  256. data/spec/cli/markup_types_spec.rb +22 -0
  257. data/spec/cli/server_spec.rb +327 -0
  258. data/spec/cli/stats_spec.rb +90 -0
  259. data/spec/cli/yardoc_spec.rb +804 -0
  260. data/spec/cli/yri_spec.rb +99 -0
  261. data/spec/code_objects/base_spec.rb +438 -0
  262. data/spec/code_objects/class_object_spec.rb +225 -0
  263. data/spec/code_objects/code_object_list_spec.rb +33 -0
  264. data/spec/code_objects/constants_spec.rb +82 -0
  265. data/spec/code_objects/extra_file_object_spec.rb +147 -0
  266. data/spec/code_objects/macro_object_spec.rb +148 -0
  267. data/spec/code_objects/method_object_spec.rb +175 -0
  268. data/spec/code_objects/module_object_spec.rb +141 -0
  269. data/spec/code_objects/namespace_object_spec.rb +170 -0
  270. data/spec/code_objects/proxy_spec.rb +140 -0
  271. data/spec/code_objects/spec_helper.rb +3 -0
  272. data/spec/config_spec.rb +176 -0
  273. data/spec/core_ext/array_spec.rb +14 -0
  274. data/spec/core_ext/file_spec.rb +68 -0
  275. data/spec/core_ext/hash_spec.rb +14 -0
  276. data/spec/core_ext/insertion_spec.rb +37 -0
  277. data/spec/core_ext/module_spec.rb +15 -0
  278. data/spec/core_ext/string_spec.rb +42 -0
  279. data/spec/core_ext/symbol_hash_spec.rb +86 -0
  280. data/spec/docstring_parser_spec.rb +228 -0
  281. data/spec/docstring_spec.rb +335 -0
  282. data/spec/handlers/alias_handler_spec.rb +80 -0
  283. data/spec/handlers/attribute_handler_spec.rb +94 -0
  284. data/spec/handlers/base_spec.rb +206 -0
  285. data/spec/handlers/c/alias_handler_spec.rb +33 -0
  286. data/spec/handlers/c/attribute_handler_spec.rb +40 -0
  287. data/spec/handlers/c/class_handler_spec.rb +63 -0
  288. data/spec/handlers/c/constant_handler_spec.rb +68 -0
  289. data/spec/handlers/c/init_handler_spec.rb +47 -0
  290. data/spec/handlers/c/method_handler_spec.rb +229 -0
  291. data/spec/handlers/c/mixin_handler_spec.rb +27 -0
  292. data/spec/handlers/c/module_handler_spec.rb +38 -0
  293. data/spec/handlers/c/override_comment_handler_spec.rb +46 -0
  294. data/spec/handlers/c/path_handler_spec.rb +35 -0
  295. data/spec/handlers/c/spec_helper.rb +13 -0
  296. data/spec/handlers/c/struct_handler_spec.rb +15 -0
  297. data/spec/handlers/class_condition_handler_spec.rb +67 -0
  298. data/spec/handlers/class_handler_spec.rb +246 -0
  299. data/spec/handlers/class_variable_handler_spec.rb +11 -0
  300. data/spec/handlers/constant_handler_spec.rb +64 -0
  301. data/spec/handlers/dsl_handler_spec.rb +197 -0
  302. data/spec/handlers/examples/alias_handler_001.rb.txt +44 -0
  303. data/spec/handlers/examples/attribute_handler_001.rb.txt +32 -0
  304. data/spec/handlers/examples/class_condition_handler_001.rb.txt +69 -0
  305. data/spec/handlers/examples/class_handler_001.rb.txt +120 -0
  306. data/spec/handlers/examples/class_variable_handler_001.rb.txt +10 -0
  307. data/spec/handlers/examples/constant_handler_001.rb.txt +25 -0
  308. data/spec/handlers/examples/dsl_handler_001.rb.txt +125 -0
  309. data/spec/handlers/examples/exception_handler_001.rb.txt +59 -0
  310. data/spec/handlers/examples/extend_handler_001.rb.txt +16 -0
  311. data/spec/handlers/examples/method_condition_handler_001.rb.txt +10 -0
  312. data/spec/handlers/examples/method_handler_001.rb.txt +126 -0
  313. data/spec/handlers/examples/mixin_handler_001.rb.txt +37 -0
  314. data/spec/handlers/examples/module_handler_001.rb.txt +29 -0
  315. data/spec/handlers/examples/private_constant_handler_001.rb.txt +8 -0
  316. data/spec/handlers/examples/process_handler_001.rb.txt +11 -0
  317. data/spec/handlers/examples/visibility_handler_001.rb.txt +32 -0
  318. data/spec/handlers/examples/yield_handler_001.rb.txt +54 -0
  319. data/spec/handlers/exception_handler_spec.rb +48 -0
  320. data/spec/handlers/extend_handler_spec.rb +23 -0
  321. data/spec/handlers/legacy_base_spec.rb +128 -0
  322. data/spec/handlers/method_condition_handler_spec.rb +14 -0
  323. data/spec/handlers/method_handler_spec.rb +184 -0
  324. data/spec/handlers/mixin_handler_spec.rb +55 -0
  325. data/spec/handlers/module_function_handler_spec.rb +105 -0
  326. data/spec/handlers/module_handler_spec.rb +34 -0
  327. data/spec/handlers/private_constant_handler_spec.rb +24 -0
  328. data/spec/handlers/processor_spec.rb +34 -0
  329. data/spec/handlers/ruby/base_spec.rb +94 -0
  330. data/spec/handlers/ruby/legacy/base_spec.rb +82 -0
  331. data/spec/handlers/spec_helper.rb +33 -0
  332. data/spec/handlers/visibility_handler_spec.rb +39 -0
  333. data/spec/handlers/yield_handler_spec.rb +51 -0
  334. data/spec/i18n/locale_spec.rb +68 -0
  335. data/spec/i18n/message_spec.rb +52 -0
  336. data/spec/i18n/messages_spec.rb +67 -0
  337. data/spec/i18n/pot_generator_spec.rb +262 -0
  338. data/spec/i18n/text_spec.rb +180 -0
  339. data/spec/logging_spec.rb +35 -0
  340. data/spec/options_spec.rb +171 -0
  341. data/spec/parser/base_spec.rb +24 -0
  342. data/spec/parser/c_parser_spec.rb +171 -0
  343. data/spec/parser/examples/array.c.txt +3887 -0
  344. data/spec/parser/examples/example1.rb.txt +8 -0
  345. data/spec/parser/examples/extrafile.c.txt +8 -0
  346. data/spec/parser/examples/multifile.c.txt +22 -0
  347. data/spec/parser/examples/override.c.txt +424 -0
  348. data/spec/parser/examples/parse_in_order_001.rb.txt +2 -0
  349. data/spec/parser/examples/parse_in_order_002.rb.txt +2 -0
  350. data/spec/parser/examples/tag_handler_001.rb.txt +8 -0
  351. data/spec/parser/ruby/ast_node_spec.rb +33 -0
  352. data/spec/parser/ruby/legacy/statement_list_spec.rb +299 -0
  353. data/spec/parser/ruby/legacy/token_list_spec.rb +77 -0
  354. data/spec/parser/ruby/ruby_parser_spec.rb +334 -0
  355. data/spec/parser/source_parser_spec.rb +717 -0
  356. data/spec/parser/tag_parsing_spec.rb +18 -0
  357. data/spec/rake/yardoc_task_spec.rb +101 -0
  358. data/spec/registry_spec.rb +393 -0
  359. data/spec/registry_store_spec.rb +315 -0
  360. data/spec/rubygems/doc_manager_spec.rb +112 -0
  361. data/spec/serializers/data/serialized_yardoc/checksums +1 -0
  362. data/spec/serializers/data/serialized_yardoc/objects/Foo/bar_i.dat +0 -0
  363. data/spec/serializers/data/serialized_yardoc/objects/Foo/baz_i.dat +0 -0
  364. data/spec/serializers/data/serialized_yardoc/objects/Foo.dat +0 -0
  365. data/spec/serializers/data/serialized_yardoc/objects/root.dat +0 -0
  366. data/spec/serializers/data/serialized_yardoc/proxy_types +2 -0
  367. data/spec/serializers/file_system_serializer_spec.rb +124 -0
  368. data/spec/serializers/spec_helper.rb +2 -0
  369. data/spec/serializers/yardoc_serializer_spec.rb +46 -0
  370. data/spec/server/adapter_spec.rb +38 -0
  371. data/spec/server/commands/base_spec.rb +87 -0
  372. data/spec/server/commands/library_command_spec.rb +39 -0
  373. data/spec/server/commands/static_file_command_spec.rb +84 -0
  374. data/spec/server/doc_server_helper_spec.rb +53 -0
  375. data/spec/server/doc_server_serializer_spec.rb +45 -0
  376. data/spec/server/rack_adapter_spec.rb +20 -0
  377. data/spec/server/router_spec.rb +122 -0
  378. data/spec/server/spec_helper.rb +17 -0
  379. data/spec/server/static_caching_spec.rb +39 -0
  380. data/spec/server/webrick_servlet_spec.rb +20 -0
  381. data/spec/server_spec.rb +10 -0
  382. data/spec/spec_helper.rb +128 -0
  383. data/spec/tags/default_factory_spec.rb +152 -0
  384. data/spec/tags/default_tag_spec.rb +11 -0
  385. data/spec/tags/directives_spec.rb +453 -0
  386. data/spec/tags/library_spec.rb +34 -0
  387. data/spec/tags/overload_tag_spec.rb +53 -0
  388. data/spec/tags/ref_tag_list_spec.rb +53 -0
  389. data/spec/templates/class_spec.rb +44 -0
  390. data/spec/templates/constant_spec.rb +40 -0
  391. data/spec/templates/engine_spec.rb +121 -0
  392. data/spec/templates/examples/class001.html +280 -0
  393. data/spec/templates/examples/class001.txt +36 -0
  394. data/spec/templates/examples/class002.html +35 -0
  395. data/spec/templates/examples/constant001.txt +25 -0
  396. data/spec/templates/examples/constant002.txt +7 -0
  397. data/spec/templates/examples/constant003.txt +11 -0
  398. data/spec/templates/examples/method001.html +130 -0
  399. data/spec/templates/examples/method001.txt +35 -0
  400. data/spec/templates/examples/method002.html +86 -0
  401. data/spec/templates/examples/method002.txt +20 -0
  402. data/spec/templates/examples/method003.html +159 -0
  403. data/spec/templates/examples/method003.txt +45 -0
  404. data/spec/templates/examples/method004.html +44 -0
  405. data/spec/templates/examples/method004.txt +10 -0
  406. data/spec/templates/examples/method005.html +99 -0
  407. data/spec/templates/examples/method005.txt +33 -0
  408. data/spec/templates/examples/module001.dot +33 -0
  409. data/spec/templates/examples/module001.html +825 -0
  410. data/spec/templates/examples/module001.txt +33 -0
  411. data/spec/templates/examples/module002.html +318 -0
  412. data/spec/templates/examples/module003.html +185 -0
  413. data/spec/templates/examples/module004.html +387 -0
  414. data/spec/templates/examples/tag001.txt +82 -0
  415. data/spec/templates/helpers/base_helper_spec.rb +175 -0
  416. data/spec/templates/helpers/html_helper_spec.rb +612 -0
  417. data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +48 -0
  418. data/spec/templates/helpers/markup/rdoc_markup_spec.rb +93 -0
  419. data/spec/templates/helpers/markup_helper_spec.rb +135 -0
  420. data/spec/templates/helpers/method_helper_spec.rb +82 -0
  421. data/spec/templates/helpers/shared_signature_examples.rb +123 -0
  422. data/spec/templates/helpers/text_helper_spec.rb +44 -0
  423. data/spec/templates/method_spec.rb +102 -0
  424. data/spec/templates/module_spec.rb +181 -0
  425. data/spec/templates/onefile_spec.rb +64 -0
  426. data/spec/templates/section_spec.rb +146 -0
  427. data/spec/templates/spec_helper.rb +73 -0
  428. data/spec/templates/tag_spec.rb +51 -0
  429. data/spec/templates/template_spec.rb +409 -0
  430. data/spec/verifier_spec.rb +106 -0
  431. data/templates/default/class/dot/setup.rb +6 -0
  432. data/templates/default/class/dot/superklass.erb +3 -0
  433. data/templates/default/class/html/constructor_details.erb +8 -0
  434. data/templates/default/class/html/setup.rb +1 -0
  435. data/templates/default/class/html/subclasses.erb +4 -0
  436. data/templates/default/class/setup.rb +36 -0
  437. data/templates/default/class/text/setup.rb +11 -0
  438. data/templates/default/class/text/subclasses.erb +5 -0
  439. data/templates/default/constant/text/header.erb +11 -0
  440. data/templates/default/constant/text/setup.rb +3 -0
  441. data/templates/default/docstring/html/abstract.erb +4 -0
  442. data/templates/default/docstring/html/deprecated.erb +1 -0
  443. data/templates/default/docstring/html/index.erb +5 -0
  444. data/templates/default/docstring/html/note.erb +6 -0
  445. data/templates/default/docstring/html/private.erb +4 -0
  446. data/templates/default/docstring/html/returns_void.erb +1 -0
  447. data/templates/default/docstring/html/text.erb +1 -0
  448. data/templates/default/docstring/html/todo.erb +6 -0
  449. data/templates/default/docstring/setup.rb +51 -0
  450. data/templates/default/docstring/text/abstract.erb +2 -0
  451. data/templates/default/docstring/text/deprecated.erb +2 -0
  452. data/templates/default/docstring/text/index.erb +2 -0
  453. data/templates/default/docstring/text/note.erb +4 -0
  454. data/templates/default/docstring/text/private.erb +2 -0
  455. data/templates/default/docstring/text/returns_void.erb +1 -0
  456. data/templates/default/docstring/text/text.erb +1 -0
  457. data/templates/default/docstring/text/todo.erb +4 -0
  458. data/templates/default/fulldoc/html/css/common.css +1 -0
  459. data/templates/default/fulldoc/html/css/full_list.css +57 -0
  460. data/templates/default/fulldoc/html/css/style.css +338 -0
  461. data/templates/default/fulldoc/html/frames.erb +28 -0
  462. data/templates/default/fulldoc/html/full_list.erb +40 -0
  463. data/templates/default/fulldoc/html/full_list_class.erb +2 -0
  464. data/templates/default/fulldoc/html/full_list_file.erb +5 -0
  465. data/templates/default/fulldoc/html/full_list_method.erb +8 -0
  466. data/templates/default/fulldoc/html/js/app.js +214 -0
  467. data/templates/default/fulldoc/html/js/full_list.js +178 -0
  468. data/templates/default/fulldoc/html/js/jquery.js +4 -0
  469. data/templates/default/fulldoc/html/setup.rb +199 -0
  470. data/templates/default/layout/dot/header.erb +6 -0
  471. data/templates/default/layout/dot/setup.rb +14 -0
  472. data/templates/default/layout/html/breadcrumb.erb +13 -0
  473. data/templates/default/layout/html/files.erb +11 -0
  474. data/templates/default/layout/html/footer.erb +5 -0
  475. data/templates/default/layout/html/headers.erb +14 -0
  476. data/templates/default/layout/html/index.erb +2 -0
  477. data/templates/default/layout/html/layout.erb +20 -0
  478. data/templates/default/layout/html/listing.erb +4 -0
  479. data/templates/default/layout/html/objects.erb +32 -0
  480. data/templates/default/layout/html/script_setup.erb +5 -0
  481. data/templates/default/layout/html/search.erb +8 -0
  482. data/templates/default/layout/html/setup.rb +71 -0
  483. data/templates/default/method/html/header.erb +16 -0
  484. data/templates/default/method/setup.rb +3 -0
  485. data/templates/default/method/text/header.erb +1 -0
  486. data/templates/default/method_details/html/header.erb +3 -0
  487. data/templates/default/method_details/html/method_signature.erb +25 -0
  488. data/templates/default/method_details/html/source.erb +10 -0
  489. data/templates/default/method_details/setup.rb +10 -0
  490. data/templates/default/method_details/text/header.erb +10 -0
  491. data/templates/default/method_details/text/method_signature.erb +12 -0
  492. data/templates/default/method_details/text/setup.rb +10 -0
  493. data/templates/default/module/dot/child.erb +1 -0
  494. data/templates/default/module/dot/dependencies.erb +3 -0
  495. data/templates/default/module/dot/header.erb +6 -0
  496. data/templates/default/module/dot/info.erb +14 -0
  497. data/templates/default/module/dot/setup.rb +14 -0
  498. data/templates/default/module/html/attribute_details.erb +10 -0
  499. data/templates/default/module/html/attribute_summary.erb +8 -0
  500. data/templates/default/module/html/box_info.erb +37 -0
  501. data/templates/default/module/html/children.erb +8 -0
  502. data/templates/default/module/html/constant_summary.erb +13 -0
  503. data/templates/default/module/html/defines.erb +3 -0
  504. data/templates/default/module/html/header.erb +5 -0
  505. data/templates/default/module/html/inherited_attributes.erb +14 -0
  506. data/templates/default/module/html/inherited_constants.erb +8 -0
  507. data/templates/default/module/html/inherited_methods.erb +19 -0
  508. data/templates/default/module/html/item_summary.erb +40 -0
  509. data/templates/default/module/html/method_details_list.erb +9 -0
  510. data/templates/default/module/html/method_summary.erb +14 -0
  511. data/templates/default/module/html/methodmissing.erb +12 -0
  512. data/templates/default/module/html/pre_docstring.erb +1 -0
  513. data/templates/default/module/setup.rb +164 -0
  514. data/templates/default/module/text/children.erb +10 -0
  515. data/templates/default/module/text/class_meths_list.erb +8 -0
  516. data/templates/default/module/text/extends.erb +8 -0
  517. data/templates/default/module/text/header.erb +7 -0
  518. data/templates/default/module/text/includes.erb +8 -0
  519. data/templates/default/module/text/instance_meths_list.erb +8 -0
  520. data/templates/default/module/text/setup.rb +12 -0
  521. data/templates/default/onefile/html/files.erb +5 -0
  522. data/templates/default/onefile/html/headers.erb +6 -0
  523. data/templates/default/onefile/html/layout.erb +17 -0
  524. data/templates/default/onefile/html/readme.erb +3 -0
  525. data/templates/default/onefile/html/setup.rb +61 -0
  526. data/templates/default/root/dot/child.erb +3 -0
  527. data/templates/default/root/dot/setup.rb +5 -0
  528. data/templates/default/root/html/setup.rb +1 -0
  529. data/templates/default/tags/html/example.erb +11 -0
  530. data/templates/default/tags/html/index.erb +3 -0
  531. data/templates/default/tags/html/option.erb +24 -0
  532. data/templates/default/tags/html/overload.erb +14 -0
  533. data/templates/default/tags/html/see.erb +8 -0
  534. data/templates/default/tags/html/tag.erb +20 -0
  535. data/templates/default/tags/setup.rb +55 -0
  536. data/templates/default/tags/text/example.erb +12 -0
  537. data/templates/default/tags/text/index.erb +1 -0
  538. data/templates/default/tags/text/option.erb +20 -0
  539. data/templates/default/tags/text/overload.erb +19 -0
  540. data/templates/default/tags/text/see.erb +11 -0
  541. data/templates/default/tags/text/tag.erb +13 -0
  542. data/templates/guide/class/html/setup.rb +1 -0
  543. data/templates/guide/docstring/html/setup.rb +1 -0
  544. data/templates/guide/fulldoc/html/css/style.css +108 -0
  545. data/templates/guide/fulldoc/html/js/app.js +33 -0
  546. data/templates/guide/fulldoc/html/setup.rb +73 -0
  547. data/templates/guide/layout/html/layout.erb +81 -0
  548. data/templates/guide/layout/html/setup.rb +28 -0
  549. data/templates/guide/method/html/header.erb +18 -0
  550. data/templates/guide/method/html/setup.rb +21 -0
  551. data/templates/guide/module/html/header.erb +7 -0
  552. data/templates/guide/module/html/method_list.erb +5 -0
  553. data/templates/guide/module/html/setup.rb +26 -0
  554. data/templates/guide/onefile/html/files.erb +4 -0
  555. data/templates/guide/onefile/html/setup.rb +5 -0
  556. data/templates/guide/onefile/html/toc.erb +3 -0
  557. data/templates/guide/tags/html/setup.rb +8 -0
  558. metadata +689 -0
@@ -0,0 +1,717 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ class MyParser < Parser::Base; end
4
+
5
+ shared_examples_for "parser type registration" do
6
+ after do
7
+ Parser::SourceParser.parser_types.delete(:my_parser)
8
+ Parser::SourceParser.parser_type_extensions.delete(:my_parser)
9
+ end
10
+ end
11
+
12
+ describe YARD::Parser::SourceParser do
13
+ before do
14
+ Registry.clear
15
+ end
16
+
17
+ def parse_list(*list)
18
+ files = list.map do |v|
19
+ filename, source = *v
20
+ File.stub!(:read_binary).with(filename).and_return(source)
21
+ filename
22
+ end
23
+ Parser::SourceParser.send(:parse_in_order, *files)
24
+ end
25
+
26
+ def before_list(&block)
27
+ Parser::SourceParser.before_parse_list(&block)
28
+ end
29
+
30
+ def after_list(&block)
31
+ Parser::SourceParser.after_parse_list(&block)
32
+ end
33
+
34
+ def before_file(&block)
35
+ Parser::SourceParser.before_parse_file(&block)
36
+ end
37
+
38
+ def after_file(&block)
39
+ Parser::SourceParser.after_parse_file(&block)
40
+ end
41
+
42
+ describe '.before_parse_list' do
43
+ before do
44
+ Parser::SourceParser.before_parse_list_callbacks.clear
45
+ Parser::SourceParser.after_parse_list_callbacks.clear
46
+ end
47
+
48
+ it "should handle basic callback support" do
49
+ before_list do |files, globals|
50
+ files.should == ['foo.rb', 'bar.rb']
51
+ globals.should == OpenStruct.new
52
+ end
53
+ parse_list ['foo.rb', 'foo!'], ['bar.rb', 'class Foo; end']
54
+ Registry.at('Foo').should_not be_nil
55
+ end
56
+
57
+ it "should support multiple callbacks" do
58
+ checks = []
59
+ before_list { checks << :one }
60
+ before_list { checks << :two }
61
+ parse_list ['file.rb', ''], ['file2.rb', ''], ['file3.rb', 'class Foo; end']
62
+ Registry.at('Foo').should_not be_nil
63
+ checks.should == [:one, :two]
64
+ end
65
+
66
+ it "should cancel parsing if it returns false" do
67
+ checks = []
68
+ before_list { checks << :one }
69
+ before_list { false }
70
+ before_list { checks << :three }
71
+ parse_list ['file.rb', ''], ['file2.rb', ''], ['file3.rb', 'class Foo; end']
72
+ Registry.at('Foo').should be_nil
73
+ checks.should == [:one]
74
+ end
75
+
76
+ it "should not cancel on nil" do
77
+ checks = []
78
+ before_list { checks << :one }
79
+ before_list { nil }
80
+ before_list { checks << :two }
81
+ parse_list ['file.rb', ''], ['file2.rb', ''], ['file3.rb', 'class Foo; end']
82
+ Registry.at('Foo').should_not be_nil
83
+ checks.should == [:one, :two]
84
+ end
85
+
86
+ it "should pass in globals" do
87
+ before_list {|f,g| g.x = 1 }
88
+ before_list {|f,g| g.x += 1 }
89
+ before_list {|f,g| g.x += 1 }
90
+ after_list {|f,g| g.x.should == 3 }
91
+ parse_list ['file.rb', ''], ['file2.rb', ''], ['file3.rb', 'class Foo; end']
92
+ Registry.at('Foo').should_not be_nil
93
+ end
94
+ end
95
+
96
+ describe '.after_parse_list' do
97
+ before do
98
+ Parser::SourceParser.before_parse_list_callbacks.clear
99
+ Parser::SourceParser.after_parse_list_callbacks.clear
100
+ end
101
+
102
+ it "should handle basic callback support and maintain files/globals" do
103
+ before_list do |f,g| g.foo = :bar end
104
+ after_list do |files, globals|
105
+ files.should == ['foo.rb', 'bar.rb']
106
+ globals.foo.should == :bar
107
+ end
108
+ parse_list ['foo.rb', 'foo!'], ['bar.rb', 'class Foo; end']
109
+ Registry.at('Foo').should_not be_nil
110
+ end
111
+
112
+ it "should support multiple callbacks" do
113
+ checks = []
114
+ after_list { checks << :one }
115
+ after_list { checks << :two }
116
+ parse_list ['file.rb', ''], ['file2.rb', ''], ['file3.rb', 'class Foo; end']
117
+ Registry.at('Foo').should_not be_nil
118
+ checks.should == [:one, :two]
119
+ end
120
+
121
+ it "should not cancel parsing if it returns false" do
122
+ checks = []
123
+ after_list { checks << :one }
124
+ after_list { false }
125
+ after_list { checks << :three }
126
+ parse_list ['file.rb', ''], ['file2.rb', ''], ['file3.rb', 'class Foo; end']
127
+ Registry.at('Foo').should_not be_nil
128
+ checks.should == [:one, :three]
129
+ end
130
+ end
131
+
132
+ describe '.before_parse_file' do
133
+ before do
134
+ Parser::SourceParser.before_parse_file_callbacks.clear
135
+ Parser::SourceParser.after_parse_file_callbacks.clear
136
+ end
137
+
138
+ it "should handle basic callback support" do
139
+ before_file do |parser|
140
+ parser.contents.should == 'class Foo; end'
141
+ parser.file.should =~ /(foo|bar)\.rb/
142
+ end
143
+ parse_list ['foo.rb', 'class Foo; end'], ['bar.rb', 'class Foo; end']
144
+ Registry.at('Foo').should_not be_nil
145
+ end
146
+
147
+ it "should support multiple callbacks" do
148
+ checks = []
149
+ before_file { checks << :one }
150
+ before_file { checks << :two }
151
+ parse_list ['file.rb', ''], ['file2.rb', ''], ['file3.rb', 'class Foo; end']
152
+ Registry.at('Foo').should_not be_nil
153
+ checks.should == [:one, :two, :one, :two, :one, :two]
154
+ end
155
+
156
+ it "should cancel parsing if it returns false" do
157
+ checks = []
158
+ before_file { checks << :one }
159
+ before_file { false }
160
+ before_file { checks << :three }
161
+ parse_list ['file.rb', ''], ['file2.rb', ''], ['file3.rb', 'class Foo; end']
162
+ Registry.at('Foo').should be_nil
163
+ checks.should == [:one, :one, :one]
164
+ end
165
+
166
+ it "should not cancel on nil" do
167
+ checks = []
168
+ before_file { checks << :one }
169
+ before_file { nil }
170
+ before_file { checks << :two }
171
+ parse_list ['file.rb', ''], ['file2.rb', ''], ['file3.rb', 'class Foo; end']
172
+ Registry.at('Foo').should_not be_nil
173
+ checks.should == [:one, :two, :one, :two, :one, :two]
174
+ end
175
+ end
176
+
177
+ describe '.after_parse_file' do
178
+ before do
179
+ Parser::SourceParser.before_parse_file_callbacks.clear
180
+ Parser::SourceParser.after_parse_file_callbacks.clear
181
+ end
182
+
183
+ it "should handle basic callback support" do
184
+ after_file do |parser|
185
+ parser.contents.should == 'class Foo; end'
186
+ parser.file.should =~ /(foo|bar)\.rb/
187
+ end
188
+ parse_list ['foo.rb', 'class Foo; end'], ['bar.rb', 'class Foo; end']
189
+ Registry.at('Foo').should_not be_nil
190
+ end
191
+
192
+ it "should support multiple callbacks" do
193
+ checks = []
194
+ after_file { checks << :one }
195
+ after_file { checks << :two }
196
+ parse_list ['file.rb', ''], ['file2.rb', ''], ['file3.rb', 'class Foo; end']
197
+ Registry.at('Foo').should_not be_nil
198
+ checks.should == [:one, :two, :one, :two, :one, :two]
199
+ end
200
+
201
+ it "should not cancel parsing if it returns false" do
202
+ checks = []
203
+ after_file { checks << :one }
204
+ after_file { false }
205
+ after_file { checks << :three }
206
+ parse_list ['file.rb', ''], ['file2.rb', ''], ['file3.rb', 'class Foo; end']
207
+ Registry.at('Foo').should_not be_nil
208
+ checks.should == [:one, :three, :one, :three, :one, :three]
209
+ end
210
+ end
211
+
212
+ describe '.register_parser_type' do
213
+ it_should_behave_like "parser type registration"
214
+
215
+ it "should register a subclass of Parser::Base" do
216
+ parser = mock(:parser)
217
+ parser.should_receive(:parse)
218
+ MyParser.should_receive(:new).with('content', '(stdin)').and_return(parser)
219
+ Parser::SourceParser.register_parser_type(:my_parser, MyParser, 'myparser')
220
+ Parser::SourceParser.parse_string('content', :my_parser)
221
+ end
222
+
223
+ it "should require class to be a subclass of Parser::Base" do
224
+ lambda { Parser::SourceParser.register_parser_type(:my_parser, String) }.should raise_error(ArgumentError)
225
+ lambda { Parser::SourceParser.register_parser_type(:my_parser, Parser::Base) }.should raise_error(ArgumentError)
226
+ end
227
+ end
228
+
229
+ describe '.parser_type_for_extension' do
230
+ it_should_behave_like "parser type registration"
231
+
232
+ it "should find an extension in a registered array of extensions" do
233
+ Parser::SourceParser.register_parser_type(:my_parser, MyParser, ['a', 'b', 'd'])
234
+ Parser::SourceParser.parser_type_for_extension('a').should == :my_parser
235
+ Parser::SourceParser.parser_type_for_extension('b').should == :my_parser
236
+ Parser::SourceParser.parser_type_for_extension('d').should == :my_parser
237
+ Parser::SourceParser.parser_type_for_extension('c').should_not == :my_parser
238
+ end
239
+
240
+ it "should find an extension in a Regexp" do
241
+ Parser::SourceParser.register_parser_type(:my_parser, MyParser, /abc$/)
242
+ Parser::SourceParser.parser_type_for_extension('dabc').should == :my_parser
243
+ Parser::SourceParser.parser_type_for_extension('dabcd').should_not == :my_parser
244
+ end
245
+
246
+ it "should find an extension in a list of Regexps" do
247
+ Parser::SourceParser.register_parser_type(:my_parser, MyParser, [/ab$/, /abc$/])
248
+ Parser::SourceParser.parser_type_for_extension('dabc').should == :my_parser
249
+ Parser::SourceParser.parser_type_for_extension('dabcd').should_not == :my_parser
250
+ end
251
+
252
+ it "should find an extension in a String" do
253
+ Parser::SourceParser.register_parser_type(:my_parser, MyParser, "abc")
254
+ Parser::SourceParser.parser_type_for_extension('abc').should == :my_parser
255
+ Parser::SourceParser.parser_type_for_extension('abcd').should_not == :my_parser
256
+ end
257
+ end
258
+
259
+ describe '#parse_string' do
260
+ it "should parse basic Ruby code" do
261
+ YARD.parse_string(<<-eof)
262
+ module Hello
263
+ class Hi
264
+ # Docstring
265
+ # Docstring2
266
+ def me; "VALUE" end
267
+ end
268
+ end
269
+ eof
270
+ Registry.at(:Hello).should_not == nil
271
+ Registry.at("Hello::Hi#me").should_not == nil
272
+ Registry.at("Hello::Hi#me").docstring.should == "Docstring\nDocstring2"
273
+ Registry.at("Hello::Hi#me").docstring.line_range.should == (3..4)
274
+ end
275
+
276
+ it "should parse Ruby code with metaclasses" do
277
+ YARD.parse_string(<<-eof)
278
+ module Hello
279
+ class Hi
280
+ class <<self
281
+ # Docstring
282
+ def me; "VALUE" end
283
+ end
284
+ end
285
+ end
286
+ eof
287
+ Registry.at(:Hello).should_not == nil
288
+ Registry.at("Hello::Hi.me").should_not == nil
289
+ Registry.at("Hello::Hi.me").docstring.should == "Docstring"
290
+ end
291
+
292
+ it "should only use prepended comments for an object" do
293
+ YARD.parse_string(<<-eof)
294
+ # Test
295
+
296
+ # PASS
297
+ module Hello
298
+ end # FAIL
299
+ eof
300
+ Registry.at(:Hello).docstring.should == "PASS"
301
+ end
302
+
303
+ it "should not add comments appended to last line of block" do
304
+ YARD.parse_string <<-eof
305
+ module Hello2
306
+ end # FAIL
307
+ eof
308
+ Registry.at(:Hello2).docstring.should be_blank
309
+ end
310
+
311
+ it "should add comments appended to an object's first line" do
312
+ YARD.parse_string <<-eof
313
+ module Hello # PASS
314
+ HELLO
315
+ end
316
+
317
+ module Hello2 # PASS
318
+ # ANOTHER PASS
319
+ def x; end
320
+ end
321
+ eof
322
+
323
+ Registry.at(:Hello).docstring.should == "PASS"
324
+ Registry.at(:Hello2).docstring.should == "PASS"
325
+ Registry.at('Hello2#x').docstring.should == "ANOTHER PASS"
326
+ end
327
+
328
+ it "should take preceeding comments only if they exist" do
329
+ YARD.parse_string <<-eof
330
+ # PASS
331
+ module Hello # FAIL
332
+ HELLO
333
+ end
334
+ eof
335
+
336
+ Registry.at(:Hello).docstring.should == "PASS"
337
+ end
338
+
339
+ it "should strip all hashes prefixed on comment line" do
340
+ YARD.parse_string(<<-eof)
341
+ ### PASS
342
+ #### PASS
343
+ ##### PASS
344
+ module Hello
345
+ end
346
+ eof
347
+ Registry.at(:Hello).docstring.should == "PASS\nPASS\nPASS"
348
+ end
349
+
350
+ it "should handle =begin/=end style comments" do
351
+ YARD.parse_string "=begin\nfoo\nbar\n=end\nclass Foo; end\n"
352
+ Registry.at(:Foo).docstring.should == "foo\nbar"
353
+
354
+ YARD.parse_string "=begin\n\nfoo\nbar\n=end\nclass Foo; end\n"
355
+ Registry.at(:Foo).docstring.should == "foo\nbar"
356
+
357
+ YARD.parse_string "=begin\nfoo\n\nbar\n=end\nclass Foo; end\n"
358
+ Registry.at(:Foo).docstring.should == "foo\n\nbar"
359
+ end
360
+
361
+ it "should know about docstrings starting with ##" do
362
+ {'#' => false, '##' => true}.each do |hash, expected|
363
+ YARD.parse_string "#{hash}\n# Foo bar\nclass Foo; end"
364
+ Registry.at(:Foo).docstring.hash_flag.should == expected
365
+ end
366
+ end
367
+
368
+ it "should remove shebang from initial file comments" do
369
+ YARD.parse_string "#!/bin/ruby\n# this is a comment\nclass Foo; end"
370
+ Registry.at(:Foo).docstring.should == "this is a comment"
371
+ end
372
+
373
+ it "should remove encoding line from initial file comments" do
374
+ YARD.parse_string "# encoding: utf-8\n# this is a comment\nclass Foo; end"
375
+ Registry.at(:Foo).docstring.should == "this is a comment"
376
+ end
377
+
378
+ it "should add macros on any object" do
379
+ YARD.parse_string <<-eof
380
+ # @!macro [new] foo
381
+ # This is a macro
382
+ # @return [String] the string
383
+ class Foo
384
+ # @!macro foo
385
+ def foo; end
386
+ end
387
+ eof
388
+
389
+ macro = CodeObjects::MacroObject.find('foo')
390
+ macro.macro_data.should == "This is a macro\n@return [String] the string"
391
+ Registry.at('Foo').docstring.to_raw.should == macro.macro_data
392
+ Registry.at('Foo#foo').docstring.to_raw.should == macro.macro_data
393
+ end
394
+
395
+ it "should allow directives parsed on lone comments" do
396
+ YARD.parse_string(<<-eof)
397
+ class Foo
398
+ # @!method foo(a = "hello")
399
+ # @!scope class
400
+ # @!visibility private
401
+ # @param [String] a the name of the foo
402
+ # @return [Symbol] the symbolized foo
403
+
404
+ # @!method bar(value)
405
+ end
406
+ eof
407
+ foo = Registry.at('Foo.foo')
408
+ bar = Registry.at('Foo#bar')
409
+ foo.should_not be_nil
410
+ foo.visibility.should == :private
411
+ foo.tag(:param).name.should == 'a'
412
+ foo.tag(:return).types.should == ['Symbol']
413
+ bar.should_not be_nil
414
+ bar.signature.should == 'def bar(value)'
415
+ end
416
+
417
+ it "should parse lone comments at end of blocks" do
418
+ YARD.parse_string(<<-eof)
419
+ class Foo
420
+ none
421
+
422
+ # @!method foo(a = "hello")
423
+ end
424
+ eof
425
+ foo = Registry.at('Foo#foo')
426
+ foo.should_not be_nil
427
+ foo.signature.should == 'def foo(a = "hello")'
428
+ end
429
+
430
+ it "should handle lone comment with no code" do
431
+ YARD.parse_string '# @!method foo(a = "hello")'
432
+ foo = Registry.at('#foo')
433
+ foo.should_not be_nil
434
+ foo.signature.should == 'def foo(a = "hello")'
435
+ end
436
+
437
+ it "should handle non-ASCII encoding in heredoc" do
438
+ YARD.parse_string <<-eof
439
+ # encoding: utf-8
440
+
441
+ heredoc <<-ending
442
+ foo\u{ffe2} bar.
443
+ ending
444
+
445
+ # Hello \u{ffe2} world
446
+ class Foo < Bar
447
+ attr_accessor :foo
448
+ end
449
+ eof
450
+ Registry.at('Foo').superclass.should == P('Bar')
451
+ end
452
+ end
453
+
454
+ describe '#parse' do
455
+ it "should parse a basic Ruby file" do
456
+ parse_file :example1, __FILE__
457
+ Registry.at(:Hello).should_not == nil
458
+ Registry.at("Hello::Hi#me").should_not == nil
459
+ Registry.at("Hello::Hi#me").docstring.should == "Docstring"
460
+ end
461
+
462
+ it "should parse a set of file globs" do
463
+ Dir.should_receive(:[]).with('lib/**/*.rb').and_return([])
464
+ YARD.parse('lib/**/*.rb')
465
+ end
466
+
467
+ it "should parse a set of absolute paths" do
468
+ Dir.should_not_receive(:[])
469
+ File.should_receive(:file?).with('/path/to/file').and_return(true)
470
+ File.should_receive(:read_binary).with('/path/to/file').and_return("")
471
+ YARD.parse('/path/to/file')
472
+ end
473
+
474
+ it "should clean paths before parsing" do
475
+ File.should_receive(:open).and_return("")
476
+ parser = Parser::SourceParser.new(:ruby, true)
477
+ parser.parse('a//b//c')
478
+ parser.file.should == 'a/b/c'
479
+ end
480
+
481
+ it "should parse files with '*' in them as globs and others as absolute paths" do
482
+ Dir.should_receive(:[]).with('*.rb').and_return(['a.rb', 'b.rb'])
483
+ File.should_receive(:file?).with('/path/to/file').and_return(true)
484
+ File.should_receive(:file?).with('a.rb').and_return(true)
485
+ File.should_receive(:file?).with('b.rb').and_return(true)
486
+ File.should_receive(:read_binary).with('/path/to/file').and_return("")
487
+ File.should_receive(:read_binary).with('a.rb').and_return("")
488
+ File.should_receive(:read_binary).with('b.rb').and_return("")
489
+ YARD.parse ['/path/to/file', '*.rb']
490
+ end
491
+
492
+ it "should convert directories into globs" do
493
+ Dir.should_receive(:[]).with('foo/**/*.{rb,c}').and_return(['foo/a.rb', 'foo/bar/b.rb'])
494
+ File.should_receive(:directory?).with('foo').and_return(true)
495
+ File.should_receive(:file?).with('foo/a.rb').and_return(true)
496
+ File.should_receive(:file?).with('foo/bar/b.rb').and_return(true)
497
+ File.should_receive(:read_binary).with('foo/a.rb').and_return("")
498
+ File.should_receive(:read_binary).with('foo/bar/b.rb').and_return("")
499
+ YARD.parse ['foo']
500
+ end
501
+
502
+ it "should use Registry.checksums cache if file is cached" do
503
+ data = 'DATA'
504
+ hash = Registry.checksum_for(data)
505
+ cmock = mock(:cmock)
506
+ cmock.should_receive(:[]).with('foo/bar').and_return(hash)
507
+ Registry.should_receive(:checksums).and_return(cmock)
508
+ File.should_receive(:file?).with('foo/bar').and_return(true)
509
+ File.should_receive(:read_binary).with('foo/bar').and_return(data)
510
+ YARD.parse('foo/bar')
511
+ end
512
+
513
+ it "should support excluded paths" do
514
+ File.should_receive(:file?).with('foo/bar').and_return(true)
515
+ File.should_receive(:file?).with('foo/baz').and_return(true)
516
+ File.should_not_receive(:read_binary)
517
+ YARD.parse(["foo/bar", "foo/baz"], ["foo", /baz$/])
518
+ end
519
+
520
+ it "should convert file contents to proper encoding if coding line is present" do
521
+ valid = []
522
+ valid << "# encoding: sjis"
523
+ valid << "# encoding: utf-8"
524
+ valid << "# xxxxxencoding: sjis"
525
+ valid << "# xxxxxencoding: sjis xxxxxx"
526
+ valid << "# ENCODING: sjis"
527
+ valid << "#coDiNG: sjis"
528
+ valid << "# -*- coding: sjis -*-"
529
+ valid << "# -*- coding: utf-8; indent-tabs-mode: nil"
530
+ valid << "### coding: sjis"
531
+ valid << "# encoding=sjis"
532
+ valid << "# encoding:sjis"
533
+ valid << "# encoding = sjis"
534
+ valid << "# encoding == sjis"
535
+ valid << "# encoding : sjis"
536
+ valid << "# encoding :: sjis"
537
+ valid << "#!/bin/shebang\n# encoding: sjis"
538
+ valid << "#!/bin/shebang\r\n# coding: sjis"
539
+ invalid = []
540
+ invalid << "#\n# encoding: sjis"
541
+ invalid << "#!/bin/shebang\n#\n# encoding: sjis"
542
+ invalid << "# !/bin/shebang\n# encoding: sjis"
543
+ {:should => valid, :should_not => invalid}.each do |msg, list|
544
+ list.each do |src|
545
+ Registry.clear
546
+ parser = Parser::SourceParser.new
547
+ File.should_receive(:read_binary).with('tmpfile').and_return(src)
548
+ result = parser.parse("tmpfile")
549
+ if HAVE_RIPPER && YARD.ruby19?
550
+ if msg == :should_not
551
+ default_encoding = 'UTF-8'
552
+ result.enumerator[0].source.encoding.to_s.should eq(default_encoding)
553
+ else
554
+ ['Shift_JIS', 'Windows-31J', 'UTF-8'].send(msg, include(
555
+ result.enumerator[0].source.encoding.to_s))
556
+ end
557
+ end
558
+ result.encoding_line.send(msg) == src.split("\n").last
559
+ end
560
+ end
561
+ end
562
+
563
+ it "should convert C file contents to proper encoding if coding line is present" do
564
+ valid = []
565
+ valid << "/* coding: utf-8 */"
566
+ valid << "/* -*- coding: utf-8; c-file-style: \"ruby\" -*- */"
567
+ valid << "// coding: utf-8"
568
+ valid << "// -*- coding: utf-8; c-file-style: \"ruby\" -*-"
569
+ invalid = []
570
+ {:should => valid, :should_not => invalid}.each do |msg, list|
571
+ list.each do |src|
572
+ Registry.clear
573
+ parser = Parser::SourceParser.new
574
+ File.should_receive(:read_binary).with('tmpfile.c').and_return(src)
575
+ result = parser.parse("tmpfile.c")
576
+ content = result.instance_variable_get("@content")
577
+ ['UTF-8'].send(msg, include(content.encoding.to_s))
578
+ end
579
+ end
580
+ end if YARD.ruby19?
581
+
582
+ Parser::SourceParser::ENCODING_BYTE_ORDER_MARKS.each do |encoding, bom|
583
+ it "should understand #{encoding.upcase} BOM" do
584
+ parser = Parser::SourceParser.new
585
+ src = bom + "class FooBar; end".force_encoding('binary')
586
+ src.force_encoding('binary')
587
+ File.should_receive(:read_binary).with('tmpfile').and_return(src)
588
+ result = parser.parse('tmpfile')
589
+ Registry.all(:class).first.path.should == "FooBar"
590
+ result.enumerator[0].source.encoding.to_s.downcase.should == encoding
591
+ end
592
+ end if HAVE_RIPPER && YARD.ruby19?
593
+ end
594
+
595
+ describe '#parse_in_order' do
596
+ def in_order_parse(*files)
597
+ paths = files.map {|f| File.join(File.dirname(__FILE__), 'examples', f.to_s + '.rb.txt') }
598
+ YARD::Parser::SourceParser.parse(paths, [], Logger::DEBUG)
599
+ end
600
+
601
+ it "should attempt to parse files in order" do
602
+ log.enter_level(Logger::DEBUG) do
603
+ msgs = []
604
+ log.should_receive(:debug) {|m| msgs << m }.at_least(:once)
605
+ log.stub(:<<)
606
+ in_order_parse 'parse_in_order_001', 'parse_in_order_002'
607
+ msgs[1].should =~ /Parsing .+parse_in_order_001.+/
608
+ msgs[2].should =~ /Missing object MyModule/
609
+ msgs[3].should =~ /Parsing .+parse_in_order_002.+/
610
+ msgs[4].should =~ /Re-processing .+parse_in_order_001.+/
611
+ end
612
+ end
613
+
614
+ it "should attempt to order files by length for globs (process toplevel files first)" do
615
+ files = %w(a a/b a/b/c)
616
+ files.each do |file|
617
+ File.should_receive(:file?).with(file).and_return(true)
618
+ File.should_receive(:read_binary).with(file).ordered.and_return('')
619
+ end
620
+ Dir.should_receive(:[]).with('a/**/*').and_return(files.reverse)
621
+ YARD.parse 'a/**/*'
622
+ end
623
+
624
+ it "should allow overriding of length sorting when single file is presented" do
625
+ files = %w(a/b/c a a/b)
626
+ files.each do |file|
627
+ File.should_receive(:file?).with(file).at_least(1).times.and_return(true)
628
+ File.should_receive(:read_binary).with(file).ordered.and_return('')
629
+ end
630
+ Dir.should_receive(:[]).with('a/**/*').and_return(files.reverse)
631
+ YARD.parse ['a/b/c', 'a/**/*']
632
+ end
633
+ end
634
+
635
+ describe '#parse_statements' do
636
+ before do
637
+ Registry.clear
638
+ end
639
+
640
+ it "should display a warning for invalid parser type" do
641
+ log.should_receive(:warn).with(/unrecognized file/)
642
+ log.should_receive(:backtrace)
643
+ YARD::Parser::SourceParser.parse_string("int main() { }", :d)
644
+ end
645
+
646
+ if HAVE_RIPPER
647
+ it "should display a warning for a syntax error (with new parser)" do
648
+ log.should_receive(:warn).with(/Syntax error in/)
649
+ log.should_receive(:backtrace)
650
+ YARD::Parser::SourceParser.parse_string("%!!!", :ruby)
651
+ end
652
+ end
653
+
654
+ it "should handle groups" do
655
+ YARD.parse_string <<-eof
656
+ class A
657
+ # @group Group Name
658
+ def foo; end
659
+ def foo2; end
660
+
661
+ # @endgroup
662
+
663
+ def bar; end
664
+
665
+ # @group Group 2
666
+ def baz; end
667
+ end
668
+ eof
669
+
670
+ Registry.at('A').groups.should == ['Group Name', 'Group 2']
671
+ Registry.at('A#bar').group.should be_nil
672
+ Registry.at('A#foo').group.should == "Group Name"
673
+ Registry.at('A#foo2').group.should == "Group Name"
674
+ Registry.at('A#baz').group.should == "Group 2"
675
+ end
676
+
677
+ it 'handles multi-line class/module references' do
678
+ YARD.parse_string <<-eof
679
+ class A::
680
+ B::C; end
681
+ eof
682
+ Registry.all.should == [P('A::B::C')]
683
+ end
684
+
685
+ it 'handles sclass definitions of multi-line class/module references' do
686
+ YARD.parse_string <<-eof
687
+ class << A::
688
+ B::C
689
+ def foo; end
690
+ end
691
+ eof
692
+ Registry.all.size.should == 2
693
+ Registry.at('A::B::C').should_not be_nil
694
+ Registry.at('A::B::C.foo').should_not be_nil
695
+ end
696
+
697
+ it 'handles lone comment blocks at the end of a namespace' do
698
+ YARD.parse_string <<-eof
699
+ module A
700
+ class B
701
+ def c; end
702
+
703
+ # @!method d
704
+ end
705
+ end
706
+ eof
707
+ Registry.at('A#d').should be_nil
708
+ Registry.at('A::B#d').should_not be_nil
709
+ end
710
+
711
+ it 'supports keyword arguments' do
712
+ YARD.parse_string 'def foo(a: 1, b: 2, **kwargs) end'
713
+ args = [['a:', '1'], ['b:', '2'], ['**kwargs', nil]]
714
+ Registry.at('#foo').parameters.should eq(args)
715
+ end if YARD.ruby2?
716
+ end
717
+ end