yard 0.9.17 → 0.9.22

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 (590) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +2 -0
  3. data/.github/ISSUE_TEMPLATE.md +33 -0
  4. data/.github/PULL_REQUEST_TEMPLATE.md +12 -0
  5. data/.gitignore +14 -0
  6. data/.rspec +2 -0
  7. data/.rubocop.yml +99 -0
  8. data/.travis.yml +52 -0
  9. data/.yardopts +26 -26
  10. data/.yardopts_guide +19 -0
  11. data/.yardopts_i18n +23 -0
  12. data/CHANGELOG.md +774 -728
  13. data/CODE_OF_CONDUCT.md +15 -0
  14. data/CONTRIBUTING.md +140 -0
  15. data/Dockerfile.samus +28 -0
  16. data/Gemfile +32 -0
  17. data/LEGAL +66 -66
  18. data/LICENSE +22 -22
  19. data/README.md +330 -328
  20. data/Rakefile +37 -53
  21. data/SECURITY.md +26 -0
  22. data/benchmarks/builtins_vs_eval.rb +24 -24
  23. data/benchmarks/concat_vs_join.rb +13 -13
  24. data/benchmarks/erb_vs_erubis.rb +54 -54
  25. data/benchmarks/format_args.rb +47 -47
  26. data/benchmarks/generation.rb +38 -38
  27. data/benchmarks/marshal_vs_dbm.rb +64 -64
  28. data/benchmarks/parsing.rb +46 -46
  29. data/benchmarks/pathname_vs_string.rb +50 -50
  30. data/benchmarks/rdoc_vs_yardoc.rb +11 -11
  31. data/benchmarks/registry_store_types.rb +49 -49
  32. data/benchmarks/ri_vs_yri.rb +19 -19
  33. data/benchmarks/ripper_parser.rb +13 -13
  34. data/benchmarks/splat_vs_flatten.rb +13 -13
  35. data/benchmarks/template_erb.rb +23 -23
  36. data/benchmarks/template_format.rb +7 -7
  37. data/benchmarks/template_profile.rb +18 -18
  38. data/benchmarks/yri_cache.rb +20 -20
  39. data/bin/yard +13 -13
  40. data/bin/yardoc +13 -13
  41. data/bin/yri +13 -13
  42. data/docs/CodeObjects.md +115 -115
  43. data/docs/GettingStarted.md +679 -679
  44. data/docs/Handlers.md +152 -152
  45. data/docs/Overview.md +61 -61
  46. data/docs/Parser.md +191 -191
  47. data/docs/Tags.md +283 -283
  48. data/docs/TagsArch.md +123 -123
  49. data/docs/Templates.md +496 -496
  50. data/docs/WhatsNew.md +1245 -1245
  51. data/docs/templates/default/fulldoc/html/full_list_tag.erb +8 -8
  52. data/docs/templates/default/fulldoc/html/setup.rb +6 -6
  53. data/docs/templates/default/layout/html/setup.rb +9 -9
  54. data/docs/templates/default/layout/html/tag_list.erb +11 -11
  55. data/docs/templates/default/yard_tags/html/list.erb +18 -18
  56. data/docs/templates/default/yard_tags/html/setup.rb +26 -26
  57. data/docs/templates/plugin.rb +70 -70
  58. data/lib/rubygems_plugin.rb +9 -9
  59. data/lib/yard.rb +69 -69
  60. data/lib/yard/autoload.rb +308 -303
  61. data/lib/yard/cli/command.rb +85 -85
  62. data/lib/yard/cli/command_parser.rb +93 -93
  63. data/lib/yard/cli/config.rb +198 -198
  64. data/lib/yard/cli/diff.rb +270 -270
  65. data/lib/yard/cli/display.rb +69 -69
  66. data/lib/yard/cli/gems.rb +84 -84
  67. data/lib/yard/cli/graph.rb +125 -125
  68. data/lib/yard/cli/help.rb +20 -20
  69. data/lib/yard/cli/i18n.rb +70 -70
  70. data/lib/yard/cli/list.rb +23 -23
  71. data/lib/yard/cli/markup_types.rb +32 -32
  72. data/lib/yard/cli/server.rb +257 -257
  73. data/lib/yard/cli/stats.rb +231 -231
  74. data/lib/yard/cli/yardoc.rb +789 -788
  75. data/lib/yard/cli/yardopts_command.rb +110 -110
  76. data/lib/yard/cli/yri.rb +215 -215
  77. data/lib/yard/code_objects/base.rb +622 -615
  78. data/lib/yard/code_objects/class_object.rb +146 -146
  79. data/lib/yard/code_objects/class_variable_object.rb +11 -11
  80. data/lib/yard/code_objects/constant_object.rb +16 -16
  81. data/lib/yard/code_objects/extended_method_object.rb +24 -24
  82. data/lib/yard/code_objects/extra_file_object.rb +134 -131
  83. data/lib/yard/code_objects/macro_object.rb +172 -172
  84. data/lib/yard/code_objects/method_object.rb +196 -196
  85. data/lib/yard/code_objects/module_object.rb +21 -21
  86. data/lib/yard/code_objects/namespace_mapper.rb +114 -114
  87. data/lib/yard/code_objects/namespace_object.rb +200 -200
  88. data/lib/yard/code_objects/proxy.rb +244 -240
  89. data/lib/yard/code_objects/root_object.rb +19 -19
  90. data/lib/yard/config.rb +270 -270
  91. data/lib/yard/core_ext/array.rb +16 -16
  92. data/lib/yard/core_ext/file.rb +69 -69
  93. data/lib/yard/core_ext/hash.rb +16 -16
  94. data/lib/yard/core_ext/insertion.rb +63 -63
  95. data/lib/yard/core_ext/module.rb +11 -20
  96. data/lib/yard/core_ext/string.rb +68 -68
  97. data/lib/yard/core_ext/symbol_hash.rb +75 -75
  98. data/lib/yard/docstring.rb +386 -386
  99. data/lib/yard/docstring_parser.rb +345 -345
  100. data/lib/yard/gem_index.rb +29 -29
  101. data/lib/yard/globals.rb +22 -22
  102. data/lib/yard/handlers/base.rb +595 -595
  103. data/lib/yard/handlers/c/alias_handler.rb +16 -16
  104. data/lib/yard/handlers/c/attribute_handler.rb +13 -13
  105. data/lib/yard/handlers/c/base.rb +129 -129
  106. data/lib/yard/handlers/c/class_handler.rb +27 -27
  107. data/lib/yard/handlers/c/constant_handler.rb +13 -13
  108. data/lib/yard/handlers/c/handler_methods.rb +212 -211
  109. data/lib/yard/handlers/c/init_handler.rb +20 -20
  110. data/lib/yard/handlers/c/method_handler.rb +45 -45
  111. data/lib/yard/handlers/c/mixin_handler.rb +21 -21
  112. data/lib/yard/handlers/c/module_handler.rb +17 -17
  113. data/lib/yard/handlers/c/override_comment_handler.rb +31 -31
  114. data/lib/yard/handlers/c/path_handler.rb +11 -11
  115. data/lib/yard/handlers/c/struct_handler.rb +13 -13
  116. data/lib/yard/handlers/c/symbol_handler.rb +8 -8
  117. data/lib/yard/handlers/common/method_handler.rb +19 -0
  118. data/lib/yard/handlers/processor.rb +200 -200
  119. data/lib/yard/handlers/ruby/alias_handler.rb +45 -44
  120. data/lib/yard/handlers/ruby/attribute_handler.rb +87 -87
  121. data/lib/yard/handlers/ruby/base.rb +165 -165
  122. data/lib/yard/handlers/ruby/class_condition_handler.rb +92 -92
  123. data/lib/yard/handlers/ruby/class_handler.rb +119 -119
  124. data/lib/yard/handlers/ruby/class_variable_handler.rb +17 -17
  125. data/lib/yard/handlers/ruby/comment_handler.rb +10 -10
  126. data/lib/yard/handlers/ruby/constant_handler.rb +55 -59
  127. data/lib/yard/handlers/ruby/decorator_handler_methods.rb +123 -123
  128. data/lib/yard/handlers/ruby/dsl_handler.rb +15 -15
  129. data/lib/yard/handlers/ruby/dsl_handler_methods.rb +96 -96
  130. data/lib/yard/handlers/ruby/exception_handler.rb +27 -27
  131. data/lib/yard/handlers/ruby/extend_handler.rb +22 -22
  132. data/lib/yard/handlers/ruby/legacy/alias_handler.rb +37 -37
  133. data/lib/yard/handlers/ruby/legacy/attribute_handler.rb +65 -65
  134. data/lib/yard/handlers/ruby/legacy/base.rb +245 -245
  135. data/lib/yard/handlers/ruby/legacy/class_condition_handler.rb +83 -83
  136. data/lib/yard/handlers/ruby/legacy/class_handler.rb +113 -113
  137. data/lib/yard/handlers/ruby/legacy/class_variable_handler.rb +15 -15
  138. data/lib/yard/handlers/ruby/legacy/comment_handler.rb +10 -10
  139. data/lib/yard/handlers/ruby/legacy/constant_handler.rb +29 -29
  140. data/lib/yard/handlers/ruby/legacy/dsl_handler.rb +17 -17
  141. data/lib/yard/handlers/ruby/legacy/exception_handler.rb +13 -13
  142. data/lib/yard/handlers/ruby/legacy/extend_handler.rb +21 -21
  143. data/lib/yard/handlers/ruby/legacy/method_handler.rb +90 -90
  144. data/lib/yard/handlers/ruby/legacy/mixin_handler.rb +39 -39
  145. data/lib/yard/handlers/ruby/legacy/module_function_handler.rb +19 -19
  146. data/lib/yard/handlers/ruby/legacy/module_handler.rb +12 -12
  147. data/lib/yard/handlers/ruby/legacy/private_class_method_handler.rb +22 -22
  148. data/lib/yard/handlers/ruby/legacy/private_constant_handler.rb +22 -22
  149. data/lib/yard/handlers/ruby/legacy/visibility_handler.rb +17 -17
  150. data/lib/yard/handlers/ruby/legacy/yield_handler.rb +29 -29
  151. data/lib/yard/handlers/ruby/method_condition_handler.rb +9 -9
  152. data/lib/yard/handlers/ruby/method_handler.rb +104 -118
  153. data/lib/yard/handlers/ruby/mixin_handler.rb +49 -37
  154. data/lib/yard/handlers/ruby/module_function_handler.rb +27 -27
  155. data/lib/yard/handlers/ruby/module_handler.rb +12 -12
  156. data/lib/yard/handlers/ruby/private_class_method_handler.rb +14 -14
  157. data/lib/yard/handlers/ruby/private_constant_handler.rb +43 -43
  158. data/lib/yard/handlers/ruby/public_class_method_handler.rb +14 -14
  159. data/lib/yard/handlers/ruby/struct_handler_methods.rb +143 -143
  160. data/lib/yard/handlers/ruby/visibility_handler.rb +22 -22
  161. data/lib/yard/handlers/ruby/yield_handler.rb +31 -31
  162. data/lib/yard/i18n/locale.rb +67 -67
  163. data/lib/yard/i18n/message.rb +57 -57
  164. data/lib/yard/i18n/messages.rb +56 -56
  165. data/lib/yard/i18n/po_parser.rb +61 -61
  166. data/lib/yard/i18n/pot_generator.rb +290 -290
  167. data/lib/yard/i18n/text.rb +173 -173
  168. data/lib/yard/logging.rb +205 -205
  169. data/lib/yard/options.rb +217 -217
  170. data/lib/yard/parser/base.rb +57 -57
  171. data/lib/yard/parser/c/c_parser.rb +235 -235
  172. data/lib/yard/parser/c/comment_parser.rb +134 -134
  173. data/lib/yard/parser/c/statement.rb +66 -64
  174. data/lib/yard/parser/ruby/ast_node.rb +551 -540
  175. data/lib/yard/parser/ruby/legacy/irb/slex.rb +276 -0
  176. data/lib/yard/parser/ruby/legacy/ruby_lex.rb +1345 -1354
  177. data/lib/yard/parser/ruby/legacy/ruby_parser.rb +32 -32
  178. data/lib/yard/parser/ruby/legacy/statement.rb +68 -66
  179. data/lib/yard/parser/ruby/legacy/statement_list.rb +394 -394
  180. data/lib/yard/parser/ruby/legacy/token_list.rb +74 -74
  181. data/lib/yard/parser/ruby/ruby_parser.rb +699 -687
  182. data/lib/yard/parser/ruby/token_resolver.rb +156 -156
  183. data/lib/yard/parser/source_parser.rb +526 -526
  184. data/lib/yard/rake/yardoc_task.rb +81 -81
  185. data/lib/yard/registry.rb +439 -439
  186. data/lib/yard/registry_resolver.rb +231 -189
  187. data/lib/yard/registry_store.rb +342 -337
  188. data/lib/yard/rubygems/backports.rb +10 -10
  189. data/lib/yard/rubygems/backports/LICENSE.txt +57 -57
  190. data/lib/yard/rubygems/backports/MIT.txt +20 -20
  191. data/lib/yard/rubygems/backports/gem.rb +10 -10
  192. data/lib/yard/rubygems/backports/source_index.rb +365 -365
  193. data/lib/yard/rubygems/doc_manager.rb +90 -90
  194. data/lib/yard/rubygems/hook.rb +197 -197
  195. data/lib/yard/rubygems/specification.rb +50 -50
  196. data/lib/yard/serializers/base.rb +83 -83
  197. data/lib/yard/serializers/file_system_serializer.rb +123 -123
  198. data/lib/yard/serializers/process_serializer.rb +24 -24
  199. data/lib/yard/serializers/stdout_serializer.rb +34 -34
  200. data/lib/yard/serializers/yardoc_serializer.rb +152 -152
  201. data/lib/yard/server.rb +13 -13
  202. data/lib/yard/server/adapter.rb +100 -100
  203. data/lib/yard/server/commands/base.rb +209 -209
  204. data/lib/yard/server/commands/display_file_command.rb +29 -29
  205. data/lib/yard/server/commands/display_object_command.rb +65 -65
  206. data/lib/yard/server/commands/frames_command.rb +16 -16
  207. data/lib/yard/server/commands/library_command.rb +187 -187
  208. data/lib/yard/server/commands/library_index_command.rb +28 -28
  209. data/lib/yard/server/commands/list_command.rb +25 -25
  210. data/lib/yard/server/commands/root_request_command.rb +15 -15
  211. data/lib/yard/server/commands/search_command.rb +79 -79
  212. data/lib/yard/server/commands/static_file_command.rb +23 -23
  213. data/lib/yard/server/commands/static_file_helpers.rb +61 -62
  214. data/lib/yard/server/doc_server_helper.rb +91 -91
  215. data/lib/yard/server/doc_server_serializer.rb +39 -39
  216. data/lib/yard/server/library_version.rb +277 -277
  217. data/lib/yard/server/rack_adapter.rb +89 -89
  218. data/lib/yard/server/router.rb +187 -187
  219. data/lib/yard/server/static_caching.rb +46 -46
  220. data/lib/yard/server/templates/default/fulldoc/html/css/custom.css +127 -127
  221. data/lib/yard/server/templates/default/fulldoc/html/js/autocomplete.js +11 -11
  222. data/lib/yard/server/templates/default/layout/html/breadcrumb.erb +37 -37
  223. data/lib/yard/server/templates/default/layout/html/script_setup.erb +7 -7
  224. data/lib/yard/server/templates/default/layout/html/setup.rb +8 -8
  225. data/lib/yard/server/templates/default/method_details/html/permalink.erb +4 -4
  226. data/lib/yard/server/templates/default/method_details/html/setup.rb +5 -5
  227. data/lib/yard/server/templates/doc_server/library_list/html/headers.erb +8 -8
  228. data/lib/yard/server/templates/doc_server/library_list/html/library_list.erb +14 -14
  229. data/lib/yard/server/templates/doc_server/library_list/html/listing.erb +13 -13
  230. data/lib/yard/server/templates/doc_server/library_list/html/setup.rb +6 -6
  231. data/lib/yard/server/templates/doc_server/library_list/html/title.erb +2 -2
  232. data/lib/yard/server/templates/doc_server/processing/html/processing.erb +52 -52
  233. data/lib/yard/server/templates/doc_server/processing/html/setup.rb +4 -4
  234. data/lib/yard/server/templates/doc_server/search/html/search.erb +18 -18
  235. data/lib/yard/server/templates/doc_server/search/html/setup.rb +9 -9
  236. data/lib/yard/server/webrick_adapter.rb +45 -45
  237. data/lib/yard/tags/default_factory.rb +191 -191
  238. data/lib/yard/tags/default_tag.rb +13 -13
  239. data/lib/yard/tags/directives.rb +616 -616
  240. data/lib/yard/tags/library.rb +633 -633
  241. data/lib/yard/tags/option_tag.rb +13 -13
  242. data/lib/yard/tags/overload_tag.rb +71 -71
  243. data/lib/yard/tags/ref_tag.rb +8 -8
  244. data/lib/yard/tags/ref_tag_list.rb +28 -28
  245. data/lib/yard/tags/tag.rb +71 -71
  246. data/lib/yard/tags/tag_format_error.rb +7 -7
  247. data/lib/yard/tags/types_explainer.rb +162 -162
  248. data/lib/yard/templates/engine.rb +186 -186
  249. data/lib/yard/templates/erb_cache.rb +23 -23
  250. data/lib/yard/templates/helpers/base_helper.rb +215 -215
  251. data/lib/yard/templates/helpers/filter_helper.rb +27 -27
  252. data/lib/yard/templates/helpers/html_helper.rb +663 -646
  253. data/lib/yard/templates/helpers/html_syntax_highlight_helper.rb +78 -78
  254. data/lib/yard/templates/helpers/markup/rdoc_markdown.rb +23 -23
  255. data/lib/yard/templates/helpers/markup/rdoc_markup.rb +109 -109
  256. data/lib/yard/templates/helpers/markup_helper.rb +172 -172
  257. data/lib/yard/templates/helpers/method_helper.rb +75 -75
  258. data/lib/yard/templates/helpers/module_helper.rb +21 -21
  259. data/lib/yard/templates/helpers/text_helper.rb +112 -112
  260. data/lib/yard/templates/helpers/uml_helper.rb +47 -47
  261. data/lib/yard/templates/section.rb +105 -105
  262. data/lib/yard/templates/template.rb +418 -418
  263. data/lib/yard/templates/template_options.rb +92 -92
  264. data/lib/yard/verifier.rb +151 -151
  265. data/lib/yard/version.rb +6 -6
  266. data/po/ja.po +31108 -0
  267. data/samus.json +80 -0
  268. data/spec/cli/command_parser_spec.rb +43 -43
  269. data/spec/cli/command_spec.rb +36 -36
  270. data/spec/cli/config_spec.rb +148 -148
  271. data/spec/cli/diff_spec.rb +254 -254
  272. data/spec/cli/display_spec.rb +30 -30
  273. data/spec/cli/gems_spec.rb +81 -81
  274. data/spec/cli/graph_spec.rb +18 -18
  275. data/spec/cli/help_spec.rb +22 -22
  276. data/spec/cli/i18n_spec.rb +107 -107
  277. data/spec/cli/list_spec.rb +8 -8
  278. data/spec/cli/markup_types_spec.rb +22 -22
  279. data/spec/cli/server_spec.rb +324 -324
  280. data/spec/cli/stats_spec.rb +96 -96
  281. data/spec/cli/yard_on_yard_spec.rb +38 -38
  282. data/spec/cli/yardoc_spec.rb +896 -862
  283. data/spec/cli/yri_spec.rb +101 -101
  284. data/spec/code_objects/base_spec.rb +485 -470
  285. data/spec/code_objects/class_object_spec.rb +226 -226
  286. data/spec/code_objects/code_object_list_spec.rb +36 -36
  287. data/spec/code_objects/constants_spec.rb +116 -116
  288. data/spec/code_objects/extra_file_object_spec.rb +161 -160
  289. data/spec/code_objects/macro_object_spec.rb +150 -150
  290. data/spec/code_objects/method_object_spec.rb +184 -184
  291. data/spec/code_objects/module_object_spec.rb +142 -142
  292. data/spec/code_objects/namespace_object_spec.rb +171 -171
  293. data/spec/code_objects/proxy_spec.rb +147 -141
  294. data/spec/code_objects/spec_helper.rb +3 -3
  295. data/spec/config_spec.rb +171 -171
  296. data/spec/core_ext/array_spec.rb +13 -13
  297. data/spec/core_ext/file_spec.rb +72 -72
  298. data/spec/core_ext/hash_spec.rb +14 -14
  299. data/spec/core_ext/insertion_spec.rb +37 -37
  300. data/spec/core_ext/module_spec.rb +9 -15
  301. data/spec/core_ext/string_spec.rb +42 -42
  302. data/spec/core_ext/symbol_hash_spec.rb +89 -89
  303. data/spec/docstring_parser_spec.rb +280 -280
  304. data/spec/docstring_spec.rb +373 -373
  305. data/spec/handlers/alias_handler_spec.rb +82 -82
  306. data/spec/handlers/attribute_handler_spec.rb +96 -96
  307. data/spec/handlers/base_spec.rb +216 -216
  308. data/spec/handlers/c/alias_handler_spec.rb +34 -34
  309. data/spec/handlers/c/attribute_handler_spec.rb +41 -41
  310. data/spec/handlers/c/class_handler_spec.rb +78 -78
  311. data/spec/handlers/c/constant_handler_spec.rb +71 -71
  312. data/spec/handlers/c/init_handler_spec.rb +48 -48
  313. data/spec/handlers/c/method_handler_spec.rb +327 -325
  314. data/spec/handlers/c/mixin_handler_spec.rb +44 -44
  315. data/spec/handlers/c/module_handler_spec.rb +71 -71
  316. data/spec/handlers/c/override_comment_handler_spec.rb +47 -47
  317. data/spec/handlers/c/path_handler_spec.rb +36 -36
  318. data/spec/handlers/c/spec_helper.rb +23 -23
  319. data/spec/handlers/c/struct_handler_spec.rb +16 -16
  320. data/spec/handlers/class_condition_handler_spec.rb +87 -87
  321. data/spec/handlers/class_handler_spec.rb +247 -247
  322. data/spec/handlers/class_method_handler_shared_examples.rb +133 -133
  323. data/spec/handlers/class_variable_handler_spec.rb +12 -12
  324. data/spec/handlers/constant_handler_spec.rb +112 -112
  325. data/spec/handlers/decorator_handler_methods_spec.rb +393 -393
  326. data/spec/handlers/dsl_handler_spec.rb +226 -219
  327. data/spec/handlers/examples/alias_handler_001.rb.txt +45 -45
  328. data/spec/handlers/examples/attribute_handler_001.rb.txt +31 -31
  329. data/spec/handlers/examples/class_condition_handler_001.rb.txt +68 -68
  330. data/spec/handlers/examples/class_handler_001.rb.txt +120 -120
  331. data/spec/handlers/examples/class_variable_handler_001.rb.txt +9 -9
  332. data/spec/handlers/examples/constant_handler_001.rb.txt +35 -35
  333. data/spec/handlers/examples/dsl_handler_001.rb.txt +156 -154
  334. data/spec/handlers/examples/exception_handler_001.rb.txt +58 -58
  335. data/spec/handlers/examples/extend_handler_001.rb.txt +19 -16
  336. data/spec/handlers/examples/method_condition_handler_001.rb.txt +9 -9
  337. data/spec/handlers/examples/method_handler_001.rb.txt +128 -128
  338. data/spec/handlers/examples/mixin_handler_001.rb.txt +40 -37
  339. data/spec/handlers/examples/module_handler_001.rb.txt +29 -29
  340. data/spec/handlers/examples/private_constant_handler_001.rb.txt +8 -8
  341. data/spec/handlers/examples/process_handler_001.rb.txt +11 -11
  342. data/spec/handlers/examples/visibility_handler_001.rb.txt +35 -35
  343. data/spec/handlers/examples/yield_handler_001.rb.txt +54 -54
  344. data/spec/handlers/exception_handler_spec.rb +49 -49
  345. data/spec/handlers/extend_handler_spec.rb +28 -24
  346. data/spec/handlers/legacy_base_spec.rb +128 -128
  347. data/spec/handlers/method_condition_handler_spec.rb +15 -15
  348. data/spec/handlers/method_handler_spec.rb +214 -190
  349. data/spec/handlers/mixin_handler_spec.rb +60 -56
  350. data/spec/handlers/module_function_handler_spec.rb +106 -106
  351. data/spec/handlers/module_handler_spec.rb +35 -35
  352. data/spec/handlers/private_class_method_handler_spec.rb +11 -11
  353. data/spec/handlers/private_constant_handler_spec.rb +25 -25
  354. data/spec/handlers/processor_spec.rb +35 -35
  355. data/spec/handlers/public_class_method_handler_spec.rb +11 -11
  356. data/spec/handlers/ruby/base_spec.rb +95 -95
  357. data/spec/handlers/ruby/legacy/base_spec.rb +84 -84
  358. data/spec/handlers/spec_helper.rb +33 -33
  359. data/spec/handlers/visibility_handler_spec.rb +44 -44
  360. data/spec/handlers/yield_handler_spec.rb +52 -52
  361. data/spec/i18n/locale_spec.rb +81 -81
  362. data/spec/i18n/message_spec.rb +52 -52
  363. data/spec/i18n/messages_spec.rb +67 -67
  364. data/spec/i18n/pot_generator_spec.rb +295 -295
  365. data/spec/i18n/text_spec.rb +184 -184
  366. data/spec/logging_spec.rb +44 -44
  367. data/spec/options_spec.rb +171 -171
  368. data/spec/parser/base_spec.rb +24 -24
  369. data/spec/parser/c_parser_spec.rb +236 -236
  370. data/spec/parser/examples/array.c.txt +6267 -6267
  371. data/spec/parser/examples/example1.rb.txt +7 -7
  372. data/spec/parser/examples/extrafile.c.txt +8 -8
  373. data/spec/parser/examples/file.c.txt +28 -28
  374. data/spec/parser/examples/multifile.c.txt +22 -22
  375. data/spec/parser/examples/namespace.cpp.txt +68 -68
  376. data/spec/parser/examples/override.c.txt +424 -424
  377. data/spec/parser/examples/parse_in_order_001.rb.txt +2 -2
  378. data/spec/parser/examples/parse_in_order_002.rb.txt +1 -1
  379. data/spec/parser/examples/tag_handler_001.rb.txt +7 -7
  380. data/spec/parser/ruby/ast_node_spec.rb +33 -33
  381. data/spec/parser/ruby/legacy/statement_list_spec.rb +299 -299
  382. data/spec/parser/ruby/legacy/token_list_spec.rb +79 -79
  383. data/spec/parser/ruby/ruby_parser_spec.rb +508 -508
  384. data/spec/parser/ruby/token_resolver_spec.rb +165 -165
  385. data/spec/parser/source_parser_spec.rb +727 -727
  386. data/spec/parser/tag_parsing_spec.rb +17 -17
  387. data/spec/rake/yardoc_task_spec.rb +118 -118
  388. data/spec/registry_spec.rb +463 -463
  389. data/spec/registry_store_spec.rb +327 -316
  390. data/spec/rubygems/doc_manager_spec.rb +112 -112
  391. data/spec/serializers/data/serialized_yardoc/checksums +1 -1
  392. data/spec/serializers/file_system_serializer_spec.rb +145 -145
  393. data/spec/serializers/spec_helper.rb +2 -2
  394. data/spec/serializers/yardoc_serializer_spec.rb +78 -78
  395. data/spec/server/adapter_spec.rb +39 -39
  396. data/spec/server/commands/base_spec.rb +91 -91
  397. data/spec/server/commands/library_command_spec.rb +39 -39
  398. data/spec/server/doc_server_helper_spec.rb +72 -72
  399. data/spec/server/doc_server_serializer_spec.rb +60 -60
  400. data/spec/server/rack_adapter_spec.rb +21 -21
  401. data/spec/server/router_spec.rb +123 -123
  402. data/spec/server/spec_helper.rb +22 -22
  403. data/spec/server/static_caching_spec.rb +47 -47
  404. data/spec/server/webrick_servlet_spec.rb +20 -20
  405. data/spec/server_spec.rb +19 -19
  406. data/spec/spec_helper.rb +212 -212
  407. data/spec/tags/default_factory_spec.rb +168 -168
  408. data/spec/tags/default_tag_spec.rb +11 -11
  409. data/spec/tags/directives_spec.rb +463 -463
  410. data/spec/tags/library_spec.rb +48 -48
  411. data/spec/tags/overload_tag_spec.rb +53 -53
  412. data/spec/tags/ref_tag_list_spec.rb +53 -53
  413. data/spec/tags/types_explainer_spec.rb +203 -203
  414. data/spec/templates/class_spec.rb +45 -45
  415. data/spec/templates/constant_spec.rb +41 -41
  416. data/spec/templates/engine_spec.rb +131 -131
  417. data/spec/templates/examples/class001.html +308 -308
  418. data/spec/templates/examples/class001.txt +36 -36
  419. data/spec/templates/examples/class002.html +39 -39
  420. data/spec/templates/examples/constant001.txt +24 -24
  421. data/spec/templates/examples/constant002.txt +6 -6
  422. data/spec/templates/examples/constant003.txt +10 -10
  423. data/spec/templates/examples/method001.html +137 -137
  424. data/spec/templates/examples/method001.txt +35 -35
  425. data/spec/templates/examples/method002.html +91 -91
  426. data/spec/templates/examples/method002.txt +20 -20
  427. data/spec/templates/examples/method003.html +165 -165
  428. data/spec/templates/examples/method003.txt +45 -45
  429. data/spec/templates/examples/method004.html +48 -48
  430. data/spec/templates/examples/method004.txt +10 -10
  431. data/spec/templates/examples/method005.html +105 -105
  432. data/spec/templates/examples/method005.txt +33 -33
  433. data/spec/templates/examples/method006.html +107 -107
  434. data/spec/templates/examples/method006.txt +20 -20
  435. data/spec/templates/examples/module001.dot +33 -33
  436. data/spec/templates/examples/module001.html +833 -833
  437. data/spec/templates/examples/module001.txt +33 -33
  438. data/spec/templates/examples/module002.html +341 -341
  439. data/spec/templates/examples/module003.html +202 -202
  440. data/spec/templates/examples/module004.html +394 -394
  441. data/spec/templates/examples/module005.html +81 -81
  442. data/spec/templates/examples/tag001.txt +82 -82
  443. data/spec/templates/helpers/base_helper_spec.rb +171 -171
  444. data/spec/templates/helpers/html_helper_spec.rb +687 -668
  445. data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +65 -65
  446. data/spec/templates/helpers/markup/rdoc_markup_spec.rb +84 -84
  447. data/spec/templates/helpers/markup_helper_spec.rb +136 -136
  448. data/spec/templates/helpers/method_helper_spec.rb +107 -107
  449. data/spec/templates/helpers/module_helper_spec.rb +35 -35
  450. data/spec/templates/helpers/shared_signature_examples.rb +126 -126
  451. data/spec/templates/helpers/text_helper_spec.rb +65 -65
  452. data/spec/templates/markup_processor_integrations/asciidoctor_spec.rb +60 -0
  453. data/spec/templates/markup_processor_integrations/integration_spec_helper.rb +46 -0
  454. data/spec/templates/markup_processor_integrations/rdoc_markdown_spec.rb +59 -0
  455. data/spec/templates/markup_processor_integrations/rdoc_spec.rb +39 -0
  456. data/spec/templates/markup_processor_integrations/redcarpet_spec.rb +59 -0
  457. data/spec/templates/markup_processor_integrations/redcloth_spec.rb +48 -0
  458. data/spec/templates/method_spec.rb +118 -118
  459. data/spec/templates/module_spec.rb +203 -203
  460. data/spec/templates/onefile_spec.rb +66 -66
  461. data/spec/templates/section_spec.rb +144 -144
  462. data/spec/templates/spec_helper.rb +76 -76
  463. data/spec/templates/tag_spec.rb +52 -52
  464. data/spec/templates/template_spec.rb +410 -410
  465. data/spec/verifier_spec.rb +106 -106
  466. data/templates/default/class/dot/setup.rb +7 -7
  467. data/templates/default/class/dot/superklass.erb +2 -2
  468. data/templates/default/class/html/constructor_details.erb +8 -8
  469. data/templates/default/class/html/setup.rb +2 -2
  470. data/templates/default/class/html/subclasses.erb +4 -4
  471. data/templates/default/class/setup.rb +36 -36
  472. data/templates/default/class/text/setup.rb +12 -12
  473. data/templates/default/class/text/subclasses.erb +5 -5
  474. data/templates/default/constant/text/header.erb +11 -11
  475. data/templates/default/constant/text/setup.rb +4 -4
  476. data/templates/default/docstring/html/abstract.erb +4 -4
  477. data/templates/default/docstring/html/deprecated.erb +1 -1
  478. data/templates/default/docstring/html/index.erb +5 -5
  479. data/templates/default/docstring/html/note.erb +6 -6
  480. data/templates/default/docstring/html/private.erb +4 -4
  481. data/templates/default/docstring/html/text.erb +1 -1
  482. data/templates/default/docstring/html/todo.erb +6 -6
  483. data/templates/default/docstring/setup.rb +52 -52
  484. data/templates/default/docstring/text/abstract.erb +2 -2
  485. data/templates/default/docstring/text/deprecated.erb +2 -2
  486. data/templates/default/docstring/text/index.erb +2 -2
  487. data/templates/default/docstring/text/note.erb +3 -3
  488. data/templates/default/docstring/text/private.erb +2 -2
  489. data/templates/default/docstring/text/text.erb +1 -1
  490. data/templates/default/docstring/text/todo.erb +3 -3
  491. data/templates/default/fulldoc/html/css/full_list.css +58 -58
  492. data/templates/default/fulldoc/html/css/style.css +496 -496
  493. data/templates/default/fulldoc/html/frames.erb +17 -17
  494. data/templates/default/fulldoc/html/full_list.erb +37 -37
  495. data/templates/default/fulldoc/html/full_list_class.erb +2 -2
  496. data/templates/default/fulldoc/html/full_list_file.erb +7 -7
  497. data/templates/default/fulldoc/html/full_list_method.erb +10 -10
  498. data/templates/default/fulldoc/html/js/app.js +314 -292
  499. data/templates/default/fulldoc/html/js/full_list.js +216 -216
  500. data/templates/default/fulldoc/html/js/jquery.js +3 -3
  501. data/templates/default/fulldoc/html/setup.rb +241 -241
  502. data/templates/default/layout/dot/header.erb +5 -5
  503. data/templates/default/layout/dot/setup.rb +15 -15
  504. data/templates/default/layout/html/breadcrumb.erb +11 -11
  505. data/templates/default/layout/html/files.erb +11 -11
  506. data/templates/default/layout/html/footer.erb +5 -5
  507. data/templates/default/layout/html/headers.erb +15 -15
  508. data/templates/default/layout/html/index.erb +2 -2
  509. data/templates/default/layout/html/layout.erb +23 -23
  510. data/templates/default/layout/html/listing.erb +4 -4
  511. data/templates/default/layout/html/objects.erb +32 -32
  512. data/templates/default/layout/html/script_setup.erb +4 -4
  513. data/templates/default/layout/html/search.erb +12 -12
  514. data/templates/default/layout/html/setup.rb +89 -89
  515. data/templates/default/method/html/header.erb +16 -16
  516. data/templates/default/method/setup.rb +4 -4
  517. data/templates/default/method_details/html/header.erb +2 -2
  518. data/templates/default/method_details/html/method_signature.erb +24 -24
  519. data/templates/default/method_details/html/source.erb +9 -9
  520. data/templates/default/method_details/setup.rb +11 -11
  521. data/templates/default/method_details/text/header.erb +10 -10
  522. data/templates/default/method_details/text/method_signature.erb +12 -12
  523. data/templates/default/method_details/text/setup.rb +11 -11
  524. data/templates/default/module/dot/child.erb +1 -1
  525. data/templates/default/module/dot/dependencies.erb +2 -2
  526. data/templates/default/module/dot/header.erb +6 -6
  527. data/templates/default/module/dot/info.erb +13 -13
  528. data/templates/default/module/dot/setup.rb +15 -15
  529. data/templates/default/module/html/attribute_details.erb +10 -10
  530. data/templates/default/module/html/attribute_summary.erb +8 -8
  531. data/templates/default/module/html/box_info.erb +43 -43
  532. data/templates/default/module/html/children.erb +8 -8
  533. data/templates/default/module/html/constant_summary.erb +17 -17
  534. data/templates/default/module/html/defines.erb +2 -2
  535. data/templates/default/module/html/header.erb +5 -5
  536. data/templates/default/module/html/inherited_attributes.erb +14 -14
  537. data/templates/default/module/html/inherited_constants.erb +8 -8
  538. data/templates/default/module/html/inherited_methods.erb +18 -18
  539. data/templates/default/module/html/item_summary.erb +40 -40
  540. data/templates/default/module/html/method_details_list.erb +9 -9
  541. data/templates/default/module/html/method_summary.erb +13 -13
  542. data/templates/default/module/html/methodmissing.erb +12 -12
  543. data/templates/default/module/setup.rb +167 -167
  544. data/templates/default/module/text/children.erb +9 -9
  545. data/templates/default/module/text/class_meths_list.erb +7 -7
  546. data/templates/default/module/text/extends.erb +7 -7
  547. data/templates/default/module/text/header.erb +7 -7
  548. data/templates/default/module/text/includes.erb +7 -7
  549. data/templates/default/module/text/instance_meths_list.erb +7 -7
  550. data/templates/default/module/text/setup.rb +13 -13
  551. data/templates/default/onefile/html/files.erb +4 -4
  552. data/templates/default/onefile/html/headers.erb +6 -6
  553. data/templates/default/onefile/html/layout.erb +17 -17
  554. data/templates/default/onefile/html/readme.erb +2 -2
  555. data/templates/default/onefile/html/setup.rb +62 -62
  556. data/templates/default/root/dot/child.erb +2 -2
  557. data/templates/default/root/dot/setup.rb +6 -6
  558. data/templates/default/root/html/setup.rb +2 -2
  559. data/templates/default/tags/html/example.erb +10 -10
  560. data/templates/default/tags/html/index.erb +2 -2
  561. data/templates/default/tags/html/option.erb +24 -24
  562. data/templates/default/tags/html/overload.erb +13 -13
  563. data/templates/default/tags/html/see.erb +7 -7
  564. data/templates/default/tags/html/tag.erb +20 -20
  565. data/templates/default/tags/setup.rb +57 -57
  566. data/templates/default/tags/text/example.erb +12 -12
  567. data/templates/default/tags/text/index.erb +1 -1
  568. data/templates/default/tags/text/option.erb +20 -20
  569. data/templates/default/tags/text/overload.erb +19 -19
  570. data/templates/default/tags/text/see.erb +11 -11
  571. data/templates/default/tags/text/tag.erb +13 -13
  572. data/templates/guide/class/html/setup.rb +2 -2
  573. data/templates/guide/docstring/html/setup.rb +2 -2
  574. data/templates/guide/fulldoc/html/css/style.css +108 -108
  575. data/templates/guide/fulldoc/html/js/app.js +33 -33
  576. data/templates/guide/fulldoc/html/setup.rb +74 -74
  577. data/templates/guide/layout/html/layout.erb +81 -81
  578. data/templates/guide/layout/html/setup.rb +25 -25
  579. data/templates/guide/method/html/header.erb +17 -17
  580. data/templates/guide/method/html/setup.rb +22 -22
  581. data/templates/guide/module/html/header.erb +6 -6
  582. data/templates/guide/module/html/method_list.erb +4 -4
  583. data/templates/guide/module/html/setup.rb +27 -27
  584. data/templates/guide/onefile/html/files.erb +4 -4
  585. data/templates/guide/onefile/html/setup.rb +6 -6
  586. data/templates/guide/onefile/html/toc.erb +3 -3
  587. data/templates/guide/tags/html/setup.rb +9 -9
  588. data/yard.gemspec +24 -43
  589. metadata +28 -21
  590. data/spec/examples.txt +0 -1878
data/spec/cli/yri_spec.rb CHANGED
@@ -1,101 +1,101 @@
1
- # frozen_string_literal: true
2
-
3
- class TestYRI < YARD::CLI::YRI
4
- public :optparse, :find_object, :cache_object
5
- def test_stub; end
6
- def print_object(*args) test_stub; super end
7
- end
8
-
9
- RSpec.describe YARD::CLI::YRI do
10
- before do
11
- @yri = TestYRI.new
12
- allow(Registry).to receive(:load)
13
- end
14
-
15
- describe "#find_object" do
16
- it "uses cache if available" do
17
- allow(@yri).to receive(:cache_object)
18
- expect(File).to receive(:exist?).with('.yardoc').and_return(false)
19
- expect(File).to receive(:exist?).with('bar.yardoc').and_return(true)
20
- expect(Registry).to receive(:load).with('bar.yardoc')
21
- expect(Registry).to receive(:at).ordered.with('Foo').and_return(nil)
22
- expect(Registry).to receive(:at).ordered.with('Foo').and_return('OBJ')
23
- @yri.instance_variable_set("@cache", 'Foo' => 'bar.yardoc')
24
- expect(@yri.find_object('Foo')).to eq 'OBJ'
25
- end
26
-
27
- it "never uses cache ahead of current directory's .yardoc" do
28
- allow(@yri).to receive(:cache_object)
29
- expect(File).to receive(:exist?).with('.yardoc').and_return(true)
30
- expect(Registry).to receive(:load).with('.yardoc')
31
- expect(Registry).to receive(:at).ordered.with('Foo').and_return(nil)
32
- expect(Registry).to receive(:at).ordered.with('Foo').and_return('OBJ')
33
- @yri.instance_variable_set("@cache", 'Foo' => 'bar.yardoc')
34
- expect(@yri.find_object('Foo')).to eq 'OBJ'
35
- expect(@yri.instance_variable_get("@search_paths")[0]).to eq '.yardoc'
36
- end
37
- end
38
-
39
- describe "#cache_object" do
40
- it "skips caching for Registry.yardoc_file" do
41
- expect(File).not_to receive(:open).with(CLI::YRI::CACHE_FILE, 'w')
42
- @yri.cache_object('Foo', Registry.yardoc_file)
43
- end
44
- end
45
-
46
- describe "#initialize" do
47
- it "loads search paths" do
48
- path = %r{/\.yard/yri_search_paths$}
49
- allow(File).to receive(:file?).and_call_original
50
- allow(File).to receive(:file?).with(%r{/\.yard/yri_cache$}).and_return(false)
51
- allow(File).to receive(:file?).with(path).and_return(true)
52
- allow(File).to receive(:readlines).with(path).and_return(%w(line1 line2))
53
- @yri = YARD::CLI::YRI.new
54
- spaths = @yri.instance_variable_get("@search_paths")
55
- expect(spaths).to include('line1')
56
- expect(spaths).to include('line2')
57
- end
58
-
59
- it "uses DEFAULT_SEARCH_PATHS prior to other paths" do
60
- YARD::CLI::YRI::DEFAULT_SEARCH_PATHS.push('foo', 'bar')
61
- path = %r{/\.yard/yri_search_paths$}
62
- allow(File).to receive(:file?).and_call_original
63
- allow(File).to receive(:file?).with(%r{/\.yard/yri_cache$}).and_return(false)
64
- allow(File).to receive(:file?).with(path).and_return(true)
65
- allow(File).to receive(:readlines).with(path).and_return(%w(line1 line2))
66
- @yri = YARD::CLI::YRI.new
67
- spaths = @yri.instance_variable_get("@search_paths")
68
- expect(spaths[0, 4]).to eq %w(foo bar line1 line2)
69
- YARD::CLI::YRI::DEFAULT_SEARCH_PATHS.replace([])
70
- end
71
- end
72
-
73
- describe "#run" do
74
- it "searches for objects and print their documentation" do
75
- obj = YARD::CodeObjects::ClassObject.new(:root, 'Foo')
76
- expect(@yri).to receive(:print_object).with(obj)
77
- @yri.run('Foo')
78
- Registry.clear
79
- end
80
-
81
- it "prints usage if no object is provided" do
82
- expect(@yri).to receive(:print_usage)
83
- expect(@yri).to receive(:exit).with(1)
84
- @yri.run('')
85
- end
86
-
87
- it "prints 'no documentation exists for object' if object is not found" do
88
- expect(STDERR).to receive(:puts).with("No documentation for `Foo'")
89
- expect(@yri).to receive(:exit).with(1)
90
- @yri.run('Foo')
91
- end
92
-
93
- it "ensures output is serialized" do
94
- YARD::CodeObjects::ClassObject.new(:root, 'Foo')
95
- allow(@yri).to receive(:test_stub) do
96
- expect(@yri.instance_variable_get(:@serializer)).to receive(:serialize).once
97
- end
98
- @yri.run('Foo')
99
- end
100
- end
101
- end
1
+ # frozen_string_literal: true
2
+
3
+ class TestYRI < YARD::CLI::YRI
4
+ public :optparse, :find_object, :cache_object
5
+ def test_stub; end
6
+ def print_object(*args) test_stub; super end
7
+ end
8
+
9
+ RSpec.describe YARD::CLI::YRI do
10
+ before do
11
+ @yri = TestYRI.new
12
+ allow(Registry).to receive(:load)
13
+ end
14
+
15
+ describe "#find_object" do
16
+ it "uses cache if available" do
17
+ allow(@yri).to receive(:cache_object)
18
+ expect(File).to receive(:exist?).with('.yardoc').and_return(false)
19
+ expect(File).to receive(:exist?).with('bar.yardoc').and_return(true)
20
+ expect(Registry).to receive(:load).with('bar.yardoc')
21
+ expect(Registry).to receive(:at).ordered.with('Foo').and_return(nil)
22
+ expect(Registry).to receive(:at).ordered.with('Foo').and_return('OBJ')
23
+ @yri.instance_variable_set("@cache", 'Foo' => 'bar.yardoc')
24
+ expect(@yri.find_object('Foo')).to eq 'OBJ'
25
+ end
26
+
27
+ it "never uses cache ahead of current directory's .yardoc" do
28
+ allow(@yri).to receive(:cache_object)
29
+ expect(File).to receive(:exist?).with('.yardoc').and_return(true)
30
+ expect(Registry).to receive(:load).with('.yardoc')
31
+ expect(Registry).to receive(:at).ordered.with('Foo').and_return(nil)
32
+ expect(Registry).to receive(:at).ordered.with('Foo').and_return('OBJ')
33
+ @yri.instance_variable_set("@cache", 'Foo' => 'bar.yardoc')
34
+ expect(@yri.find_object('Foo')).to eq 'OBJ'
35
+ expect(@yri.instance_variable_get("@search_paths")[0]).to eq '.yardoc'
36
+ end
37
+ end
38
+
39
+ describe "#cache_object" do
40
+ it "skips caching for Registry.yardoc_file" do
41
+ expect(File).not_to receive(:open).with(CLI::YRI::CACHE_FILE, 'w')
42
+ @yri.cache_object('Foo', Registry.yardoc_file)
43
+ end
44
+ end
45
+
46
+ describe "#initialize" do
47
+ it "loads search paths" do
48
+ path = %r{/\.yard/yri_search_paths$}
49
+ allow(File).to receive(:file?).and_call_original
50
+ allow(File).to receive(:file?).with(%r{/\.yard/yri_cache$}).and_return(false)
51
+ allow(File).to receive(:file?).with(path).and_return(true)
52
+ allow(File).to receive(:readlines).with(path).and_return(%w(line1 line2))
53
+ @yri = YARD::CLI::YRI.new
54
+ spaths = @yri.instance_variable_get("@search_paths")
55
+ expect(spaths).to include('line1')
56
+ expect(spaths).to include('line2')
57
+ end
58
+
59
+ it "uses DEFAULT_SEARCH_PATHS prior to other paths" do
60
+ YARD::CLI::YRI::DEFAULT_SEARCH_PATHS.push('foo', 'bar')
61
+ path = %r{/\.yard/yri_search_paths$}
62
+ allow(File).to receive(:file?).and_call_original
63
+ allow(File).to receive(:file?).with(%r{/\.yard/yri_cache$}).and_return(false)
64
+ allow(File).to receive(:file?).with(path).and_return(true)
65
+ allow(File).to receive(:readlines).with(path).and_return(%w(line1 line2))
66
+ @yri = YARD::CLI::YRI.new
67
+ spaths = @yri.instance_variable_get("@search_paths")
68
+ expect(spaths[0, 4]).to eq %w(foo bar line1 line2)
69
+ YARD::CLI::YRI::DEFAULT_SEARCH_PATHS.replace([])
70
+ end
71
+ end
72
+
73
+ describe "#run" do
74
+ it "searches for objects and print their documentation" do
75
+ obj = YARD::CodeObjects::ClassObject.new(:root, 'Foo')
76
+ expect(@yri).to receive(:print_object).with(obj)
77
+ @yri.run('Foo')
78
+ Registry.clear
79
+ end
80
+
81
+ it "prints usage if no object is provided" do
82
+ expect(@yri).to receive(:print_usage)
83
+ expect(@yri).to receive(:exit).with(1)
84
+ @yri.run('')
85
+ end
86
+
87
+ it "prints 'no documentation exists for object' if object is not found" do
88
+ expect(STDERR).to receive(:puts).with("No documentation for `Foo'")
89
+ expect(@yri).to receive(:exit).with(1)
90
+ @yri.run('Foo')
91
+ end
92
+
93
+ it "ensures output is serialized" do
94
+ YARD::CodeObjects::ClassObject.new(:root, 'Foo')
95
+ allow(@yri).to receive(:test_stub) do
96
+ expect(@yri.instance_variable_get(:@serializer)).to receive(:serialize).once
97
+ end
98
+ @yri.run('Foo')
99
+ end
100
+ end
101
+ end
@@ -1,470 +1,485 @@
1
- # frozen_string_literal: true
2
- require File.dirname(__FILE__) + '/spec_helper'
3
-
4
- RSpec.describe YARD::CodeObjects::Base do
5
- before { Registry.clear }
6
-
7
- it "does not allow empty object name" do
8
- expect { Base.new(:root, '') }.to raise_error(ArgumentError)
9
- end
10
-
11
- it "returns a unique instance of any registered object" do
12
- obj = ClassObject.new(:root, :Me)
13
- obj2 = ClassObject.new(:root, :Me)
14
- expect(obj.object_id).to eq obj2.object_id
15
-
16
- obj3 = ModuleObject.new(obj, :Too)
17
- obj4 = CodeObjects::Base.new(obj3, :Hello)
18
- obj4.parent = obj
19
-
20
- obj5 = CodeObjects::Base.new(obj3, :hello)
21
- expect(obj4.object_id).not_to eq obj5.object_id
22
- end
23
-
24
- it "creates a new object if cached object is not of the same class" do
25
- expect(ConstantObject.new(:root, "MYMODULE")).to be_instance_of(ConstantObject)
26
- expect(ModuleObject.new(:root, "MYMODULE")).to be_instance_of(ModuleObject)
27
- expect(ClassObject.new(:root, "MYMODULE")).to be_instance_of(ClassObject)
28
- expect(YARD::Registry.at("MYMODULE")).to be_instance_of(ClassObject)
29
- end
30
-
31
- it "simplifies complex namespace paths" do
32
- obj = ClassObject.new(:root, "A::B::C::D")
33
- expect(obj.name).to eq :D
34
- expect(obj.path).to eq "A::B::C::D"
35
- expect(obj.namespace).to eq P("A::B::C")
36
- end
37
-
38
- # @bug gh-552
39
- it "simplifies complex namespace paths when path starts with ::" do
40
- obj = ClassObject.new(:root, "::A::B::C::D")
41
- expect(obj.name).to eq :D
42
- expect(obj.path).to eq "A::B::C::D"
43
- expect(obj.namespace).to eq P("A::B::C")
44
- end
45
-
46
- it "calls the block again if #new is called on an existing object" do
47
- o1 = ClassObject.new(:root, :Me) do |o|
48
- o.docstring = "DOCSTRING"
49
- end
50
-
51
- o2 = ClassObject.new(:root, :Me) do |o|
52
- o.docstring = "NOT_DOCSTRING"
53
- end
54
-
55
- expect(o1.object_id).to eq o2.object_id
56
- expect(o1.docstring).to eq "NOT_DOCSTRING"
57
- expect(o2.docstring).to eq "NOT_DOCSTRING"
58
- end
59
-
60
- it "allows complex name and converts it to namespace" do
61
- obj = CodeObjects::Base.new(nil, "A::B")
62
- expect(obj.namespace.path).to eq "A"
63
- expect(obj.name).to eq :B
64
- end
65
-
66
- it "allows namespace to be nil and not register in the Registry" do
67
- obj = CodeObjects::Base.new(nil, :Me)
68
- expect(obj.namespace).to eq nil
69
- expect(Registry.at(:Me)).to eq nil
70
- end
71
-
72
- it "allows namespace to be a NamespaceObject" do
73
- ns = ModuleObject.new(:root, :Name)
74
- obj = CodeObjects::Base.new(ns, :Me)
75
- expect(obj.namespace).to eq ns
76
- end
77
-
78
- it "allows :root to be the shorthand namespace of `Registry.root`" do
79
- obj = CodeObjects::Base.new(:root, :Me)
80
- expect(obj.namespace).to eq Registry.root
81
- end
82
-
83
- it "does not allow any other types as namespace" do
84
- expect { CodeObjects::Base.new("ROOT!", :Me) }.to raise_error(ArgumentError)
85
- end
86
-
87
- it "registers itself in the registry if namespace is supplied" do
88
- obj = ModuleObject.new(:root, :Me)
89
- expect(Registry.at(:Me)).to eq obj
90
-
91
- obj2 = ModuleObject.new(obj, :Too)
92
- expect(Registry.at(:"Me::Too")).to eq obj2
93
- end
94
-
95
- describe "#[]=" do
96
- it "sets any attribute" do
97
- obj = ModuleObject.new(:root, :YARD)
98
- obj[:some_attr] = "hello"
99
- expect(obj[:some_attr]).to eq "hello"
100
- end
101
-
102
- it "uses the accessor method if available" do
103
- obj = CodeObjects::Base.new(:root, :YARD)
104
- obj[:source] = "hello"
105
- expect(obj.source).to eq "hello"
106
- obj.source = "unhello"
107
- expect(obj[:source]).to eq "unhello"
108
- end
109
- end
110
-
111
- it "sets attributes via attr= through method_missing" do
112
- obj = CodeObjects::Base.new(:root, :YARD)
113
- obj.something = 2
114
- expect(obj.something).to eq 2
115
- expect(obj[:something]).to eq 2
116
- end
117
-
118
- it "exists in the parent's #children after creation" do
119
- obj = ModuleObject.new(:root, :YARD)
120
- obj2 = MethodObject.new(obj, :testing)
121
- expect(obj.children).to include(obj2)
122
- end
123
-
124
- # @bug gh-1209
125
- it "removes prior defined objects at the same path from namespace's children" do
126
- Registry.clear
127
- obj = ModuleObject.new(:root, :YARD)
128
- ConstantObject.new(obj, :Testing)
129
- ClassObject.new(obj, :Testing)
130
- expect(obj.children.map {|o| o.type.to_sym }).to eq [:class]
131
- expect(Registry.at('YARD::Testing').type).to eq :class
132
- end
133
-
134
- it "properly re-indents source starting from 0 indentation" do
135
- obj = CodeObjects::Base.new(nil, :test)
136
- obj.source = <<-eof
137
- def mymethod
138
- if x == 2 &&
139
- 5 == 5
140
- 3
141
- else
142
- 1
143
- end
144
- end
145
- eof
146
- expect(obj.source).to eq "def mymethod\n if x == 2 &&\n 5 == 5\n 3\n else\n 1\n end\nend"
147
-
148
- Registry.clear
149
- Parser::SourceParser.parse_string <<-eof
150
- def key?(key)
151
- super(key)
152
- end
153
- eof
154
- expect(Registry.at('#key?').source).to eq "def key?(key)\n super(key)\nend"
155
-
156
- Registry.clear
157
- Parser::SourceParser.parse_string <<-eof
158
- def key?(key)
159
- if x == 2
160
- puts key
161
- else
162
- exit
163
- end
164
- end
165
- eof
166
- expect(Registry.at('#key?').source).to eq "def key?(key)\n if x == 2\n puts key\n else\n exit\n end\nend"
167
- end
168
-
169
- it "does not add newlines to source when parsing sub blocks" do
170
- Parser::SourceParser.parse_string <<-eof
171
- module XYZ
172
- module ZYX
173
- class ABC
174
- def msg
175
- hello_world
176
- end
177
- end
178
- end
179
- end
180
- eof
181
- expect(Registry.at('XYZ::ZYX::ABC#msg').source).to eq "def msg\n hello_world\nend"
182
- end
183
-
184
- it "handles source for 'def x; end'" do
185
- Registry.clear
186
- Parser::SourceParser.parse_string "def x; 2 end"
187
- expect(Registry.at('#x').source).to eq "def x; 2 end"
188
- end
189
-
190
- it "sets file and line information" do
191
- Parser::SourceParser.parse_string <<-eof
192
- class X; end
193
- eof
194
- expect(Registry.at(:X).file).to eq '(stdin)'
195
- expect(Registry.at(:X).line).to eq 1
196
- end
197
-
198
- it "maintains all file associations when objects are defined multiple times in one file" do
199
- Parser::SourceParser.parse_string <<-eof
200
- class X; end
201
- class X; end
202
- class X; end
203
- eof
204
-
205
- expect(Registry.at(:X).file).to eq '(stdin)'
206
- expect(Registry.at(:X).line).to eq 1
207
- expect(Registry.at(:X).files).to eq [['(stdin)', 1], ['(stdin)', 2], ['(stdin)', 3]]
208
- end
209
-
210
- it "maintains all file associations when objects are defined multiple times in multiple files" do
211
- 3.times do |i|
212
- allow(File).to receive(:read_binary).and_return("class X; end")
213
- Parser::SourceParser.new.parse("file#{i + 1}.rb")
214
- end
215
-
216
- expect(Registry.at(:X).file).to eq 'file1.rb'
217
- expect(Registry.at(:X).line).to eq 1
218
- expect(Registry.at(:X).files).to eq [['file1.rb', 1], ['file2.rb', 1], ['file3.rb', 1]]
219
- end
220
-
221
- it "prioritizes the definition with a docstring when returning #file" do
222
- Parser::SourceParser.parse_string <<-eof
223
- class X; end
224
- class X; end
225
- # docstring
226
- class X; end
227
- eof
228
-
229
- expect(Registry.at(:X).file).to eq '(stdin)'
230
- expect(Registry.at(:X).line).to eq 4
231
- expect(Registry.at(:X).files).to eq [['(stdin)', 4], ['(stdin)', 1], ['(stdin)', 2]]
232
- end
233
-
234
- describe "#format" do
235
- it "sends object to Templates.render" do
236
- object = MethodObject.new(:root, :method)
237
- expect(Templates::Engine).to receive(:render).with(:x => 1, :object => object, :type => object.type)
238
- object.format :x => 1
239
- end
240
-
241
- it "does not change options object class" do
242
- opts = YARD::Templates::TemplateOptions.new
243
- opts.type = "test"
244
- object = MethodObject.new(:root, :method)
245
- expect(Templates::Engine).to receive(:render).with kind_of(YARD::Templates::TemplateOptions)
246
- object.format(opts)
247
- end
248
- end
249
-
250
- describe "#source_type" do
251
- it "defaults to :ruby" do
252
- object = MethodObject.new(:root, :method)
253
- expect(object.source_type).to eq :ruby
254
- end
255
- end
256
-
257
- describe "#relative_path" do
258
- it "accepts a string" do
259
- YARD.parse_string "module A; class B; end; class C; end; end"
260
- expect(Registry.at('A::B').relative_path(Registry.at('A::C'))).to eq(
261
- Registry.at('A::B').relative_path('A::C')
262
- )
263
- end
264
-
265
- it "returns full class name when objects share a common class prefix" do
266
- YARD.parse_string "module User; end; module UserManager; end"
267
- expect(Registry.at('User').relative_path('UserManager')).to eq 'UserManager'
268
- expect(Registry.at('User').relative_path(Registry.at('UserManager'))).to eq 'UserManager'
269
- end
270
-
271
- it "returns the relative path when they share a common namespace" do
272
- YARD.parse_string "module A; class B; end; class C; end; end"
273
- expect(Registry.at('A::B').relative_path(Registry.at('A::C'))).to eq 'C'
274
- YARD.parse_string "module Foo; module A; end; module B; def foo; end end end"
275
- expect(Registry.at('Foo::A').relative_path(Registry.at('Foo::B#foo'))).to eq 'B#foo'
276
- end
277
-
278
- it "returns the full path if they don't have a common namespace" do
279
- YARD.parse_string "module A; class B; end; end; module D; class C; end; end"
280
- expect(Registry.at('A::B').relative_path('D::C')).to eq 'D::C'
281
- YARD.parse_string 'module C::B::C; module Apple; end; module Ant; end end'
282
- expect(Registry.at('C::B::C::Apple').relative_path('C::B::C::Ant')).to eq 'Ant'
283
- YARD.parse_string 'module OMG::ABC; end; class Object; end'
284
- expect(Registry.at('OMG::ABC').relative_path('Object')).to eq "Object"
285
- YARD.parse_string("class YARD::Config; MYCONST = 1; end")
286
- expect(Registry.at('YARD::Config').relative_path('YARD::Config::MYCONST')).to eq "MYCONST"
287
- end
288
-
289
- it "returns a relative path for class methods" do
290
- YARD.parse_string "module A; def self.b; end; def self.c; end; end"
291
- expect(Registry.at('A.b').relative_path('A.c')).to eq 'c'
292
- expect(Registry.at('A').relative_path('A.c')).to eq 'c'
293
- end
294
-
295
- it "returns a relative path for instance methods" do
296
- YARD.parse_string "module A; def b; end; def c; end; end"
297
- expect(Registry.at('A#b').relative_path('A#c')).to eq '#c'
298
- expect(Registry.at('A').relative_path('A#c')).to eq '#c'
299
- end
300
-
301
- it "returns full path if relative path is to parent namespace" do
302
- YARD.parse_string "module A; module B; end end"
303
- expect(Registry.at('A::B').relative_path('A')).to eq 'A'
304
- end
305
-
306
- it "only returns name for relative path to self" do
307
- YARD.parse_string("class A::B::C; def foo; end end")
308
- expect(Registry.at('A::B::C').relative_path('A::B::C')).to eq 'C'
309
- expect(Registry.at('A::B::C#foo').relative_path('A::B::C#foo')).to eq '#foo'
310
- end
311
- end
312
-
313
- describe "#docstring=" do
314
- it "converts string into Docstring when #docstring= is set" do
315
- o = ClassObject.new(:root, :Me)
316
- o.docstring = "DOCSTRING"
317
- expect(o.docstring).to be_instance_of(Docstring)
318
- end
319
-
320
- it "sets docstring to docstring of other object if docstring is '(see Path)'" do
321
- ClassObject.new(:root, :AnotherObject) {|x| x.docstring = "FOO" }
322
- o = ClassObject.new(:root, :Me)
323
- o.docstring = '(see AnotherObject)'
324
- expect(o.docstring).to eq "FOO"
325
- end
326
-
327
- it "does not copy docstring mid-docstring" do
328
- doc = "Hello.\n(see file.rb)\nmore documentation"
329
- o = ClassObject.new(:root, :Me)
330
- o.docstring = doc
331
- expect(o.docstring).to eq doc
332
- end
333
-
334
- it "allows extra docstring after (see Path)" do
335
- ClassObject.new(:root, :AnotherObject) {|x| x.docstring = "FOO" }
336
- o = ClassObject.new(:root, :Me)
337
- o.docstring = Docstring.new("(see AnotherObject)\n\nEXTRA\n@api private", o)
338
- expect(o.docstring).to eq "FOO\n\nEXTRA"
339
- expect(o.docstring).to have_tag(:api)
340
- end
341
- end
342
-
343
- describe "#docstring" do
344
- it "returns an empty string if docstring was '(see Path)' and Path is not resolved" do
345
- o = ClassObject.new(:root, :Me)
346
- o.docstring = '(see AnotherObject)'
347
- expect(o.docstring).to eq ""
348
- end
349
-
350
- it "returns docstring when object is resolved" do
351
- o = ClassObject.new(:root, :Me)
352
- o.docstring = '(see AnotherObject)'
353
- expect(o.docstring).to eq ""
354
- ClassObject.new(:root, :AnotherObject) {|x| x.docstring = "FOO" }
355
- expect(o.docstring).to eq "FOO"
356
- end
357
-
358
- describe "localization" do
359
- it "returns localized docstring" do
360
- fr_locale = YARD::I18n::Locale.new('fr')
361
- allow(fr_locale).to receive(:translate).with('Hello').and_return('Bonjour')
362
-
363
- o = ClassObject.new(:root, :Me)
364
- o.docstring = 'Hello'
365
- expect(o.docstring).to eq 'Hello'
366
-
367
- allow(Registry).to receive(:locale).with('fr').and_return(fr_locale)
368
- expect(o.docstring('fr')).to eq "Bonjour"
369
- end
370
-
371
- it "returns localized docstring tag" do
372
- o = CodeObjects::MethodObject.new(:root, 'Hello#message')
373
- o.docstring.add_tag(Tags::Tag.new('return', 'Hello'))
374
-
375
- fr_locale = YARD::I18n::Locale.new('fr')
376
- allow(fr_locale).to receive(:translate).with('Hello').and_return('Bonjour')
377
- allow(Registry).to receive(:locale).with('fr').and_return(fr_locale)
378
-
379
- expect(o.docstring('fr').tags.map(&:text)).to eq ['Bonjour']
380
- end
381
-
382
- it "returns updated localized docstring" do
383
- fr_locale = YARD::I18n::Locale.new('fr')
384
- allow(Registry).to receive(:locale).with('fr').and_return(fr_locale)
385
-
386
- o = ClassObject.new(:root, :Me)
387
- o.docstring = 'Hello'
388
- expect(o.docstring).to eq 'Hello'
389
-
390
- allow(fr_locale).to receive(:translate).with('Hello').and_return('Bonjour')
391
- expect(o.docstring('fr')).to eq "Bonjour"
392
-
393
- o.docstring = 'World'
394
- allow(fr_locale).to receive(:translate).with('World').and_return('Monde')
395
- expect(o.docstring('fr')).to eq "Monde"
396
- expect(o.docstring).to eq 'World'
397
- end
398
- end
399
- end
400
-
401
- describe "#add_file" do
402
- it "only adds a file/line combination once" do
403
- o = ClassObject.new(:root, :Me)
404
- o.add_file('filename', 12)
405
- expect(o.files).to eq [['filename', 12]]
406
- o.add_file('filename', 12)
407
- expect(o.files).to eq [['filename', 12]]
408
- o.add_file('filename', 40) # different line
409
- expect(o.files).to eq [['filename', 12], ['filename', 40]]
410
- end
411
- end
412
-
413
- describe "#copy_to" do
414
- it "copies all data to new object" do
415
- YARD.parse_string <<-eof
416
- private
417
- # A docstring
418
- # @return [String] a tag
419
- def foo(a, b, c)
420
- source_code_here
421
- end
422
- eof
423
- foo_c = MethodObject.new(:root, :foo, :class)
424
- Registry.at('#foo').copy_to(foo_c)
425
- expect(foo_c.scope).to eq :class
426
- expect(foo_c.visibility).to eq :private
427
- expect(foo_c.type).to eq :method
428
- expect(foo_c.class).to eq MethodObject
429
- expect(foo_c.path).to eq '::foo'
430
- expect(foo_c.docstring).to eq "A docstring"
431
- expect(foo_c.tag(:return).types).to eq ['String']
432
- expect(foo_c.file).to eq '(stdin)'
433
- expect(foo_c.line).to eq 4
434
- expect(foo_c.source).to match(/source_code_here/)
435
- expect(foo_c.signature).to eq 'def foo(a, b, c)'
436
- expect(foo_c.parameters).to eq [['a', nil], ['b', nil], ['c', nil]]
437
- end
438
-
439
- it "returns the copied object" do
440
- YARD.parse_string 'def foo; end'
441
- foo_c = MethodObject.new(:root, :foo, :class)
442
- expect(Registry.at('#foo').copy_to(foo_c)).to eq foo_c
443
- end
444
-
445
- it "copies docstring and rewrite tags to new object" do
446
- YARD.parse_string <<-eof
447
- # @return [String] a tag
448
- def foo; end
449
- eof
450
- foo_c = MethodObject.new(:root, :foo, :class)
451
- foo_i = Registry.at('#foo')
452
- foo_i.copy_to(foo_c)
453
- expect(foo_i.tags).not_to eq foo_c.tags
454
- expect(foo_c.tags.first.object).to eq foo_c
455
- end
456
-
457
- it "only copies #copyable_attributes" do
458
- foo = MethodObject.new(:root, :foo)
459
- expect(foo).to receive(:copyable_attributes).and_return %w(a b c)
460
- expect(foo).to receive(:instance_variable_get).with('@a').and_return(1)
461
- expect(foo).to receive(:instance_variable_get).with('@b').and_return(2)
462
- expect(foo).to receive(:instance_variable_get).with('@c').and_return(3)
463
- bar = MethodObject.new(:root, :bar)
464
- expect(bar).to receive(:instance_variable_set).with('@a', 1)
465
- expect(bar).to receive(:instance_variable_set).with('@b', 2)
466
- expect(bar).to receive(:instance_variable_set).with('@c', 3)
467
- foo.copy_to(bar)
468
- end
469
- end
470
- end
1
+ # frozen_string_literal: true
2
+ require File.dirname(__FILE__) + '/spec_helper'
3
+
4
+ RSpec.describe YARD::CodeObjects::Base do
5
+ before { Registry.clear }
6
+
7
+ it "does not allow empty object name" do
8
+ expect { Base.new(:root, '') }.to raise_error(ArgumentError)
9
+ end
10
+
11
+ it "returns a unique instance of any registered object" do
12
+ obj = ClassObject.new(:root, :Me)
13
+ obj2 = ClassObject.new(:root, :Me)
14
+ expect(obj.object_id).to eq obj2.object_id
15
+
16
+ obj3 = ModuleObject.new(obj, :Too)
17
+ obj4 = CodeObjects::Base.new(obj3, :Hello)
18
+ obj4.parent = obj
19
+
20
+ obj5 = CodeObjects::Base.new(obj3, :hello)
21
+ expect(obj4.object_id).not_to eq obj5.object_id
22
+ end
23
+
24
+ it "creates a new object if cached object is not of the same class" do
25
+ expect(ConstantObject.new(:root, "MYMODULE")).to be_instance_of(ConstantObject)
26
+ expect(ModuleObject.new(:root, "MYMODULE")).to be_instance_of(ModuleObject)
27
+ expect(ClassObject.new(:root, "MYMODULE")).to be_instance_of(ClassObject)
28
+ expect(YARD::Registry.at("MYMODULE")).to be_instance_of(ClassObject)
29
+ end
30
+
31
+ it "simplifies complex namespace paths" do
32
+ obj = ClassObject.new(:root, "A::B::C::D")
33
+ expect(obj.name).to eq :D
34
+ expect(obj.path).to eq "A::B::C::D"
35
+ expect(obj.namespace).to eq P("A::B::C")
36
+ end
37
+
38
+ # @bug gh-552
39
+ it "simplifies complex namespace paths when path starts with ::" do
40
+ obj = ClassObject.new(:root, "::A::B::C::D")
41
+ expect(obj.name).to eq :D
42
+ expect(obj.path).to eq "A::B::C::D"
43
+ expect(obj.namespace).to eq P("A::B::C")
44
+ end
45
+
46
+ it "calls the block again if #new is called on an existing object" do
47
+ o1 = ClassObject.new(:root, :Me) do |o|
48
+ o.docstring = "DOCSTRING"
49
+ end
50
+
51
+ o2 = ClassObject.new(:root, :Me) do |o|
52
+ o.docstring = "NOT_DOCSTRING"
53
+ end
54
+
55
+ expect(o1.object_id).to eq o2.object_id
56
+ expect(o1.docstring).to eq "NOT_DOCSTRING"
57
+ expect(o2.docstring).to eq "NOT_DOCSTRING"
58
+ end
59
+
60
+ it "allows complex name and converts it to namespace" do
61
+ obj = CodeObjects::Base.new(nil, "A::B")
62
+ expect(obj.namespace.path).to eq "A"
63
+ expect(obj.name).to eq :B
64
+ end
65
+
66
+ it "allows namespace to be nil and not register in the Registry" do
67
+ obj = CodeObjects::Base.new(nil, :Me)
68
+ expect(obj.namespace).to eq nil
69
+ expect(Registry.at(:Me)).to eq nil
70
+ end
71
+
72
+ it "allows namespace to be a NamespaceObject" do
73
+ ns = ModuleObject.new(:root, :Name)
74
+ obj = CodeObjects::Base.new(ns, :Me)
75
+ expect(obj.namespace).to eq ns
76
+ end
77
+
78
+ it "allows :root to be the shorthand namespace of `Registry.root`" do
79
+ obj = CodeObjects::Base.new(:root, :Me)
80
+ expect(obj.namespace).to eq Registry.root
81
+ end
82
+
83
+ it "does not allow any other types as namespace" do
84
+ expect { CodeObjects::Base.new("ROOT!", :Me) }.to raise_error(ArgumentError)
85
+ end
86
+
87
+ it "allows constants to be used as a namespace" do
88
+ a = ConstantObject.new(:root, :A)
89
+ a.value = "B::C"
90
+ b = ClassObject.new(:root, :B)
91
+ c = ClassObject.new(b, :C)
92
+ klass = ClassObject.new(a, "MyClass")
93
+ expect(klass.path).to eq "B::C::MyClass"
94
+ end
95
+
96
+ it "does not allow constants to be used as a namespace if they do not resolve to a valid namespace" do
97
+ a = ConstantObject.new(:root, :A)
98
+ a.value = "$$INVALID$$"
99
+ expect { ClassObject.new(a, "MyClass") }.to raise_error(Parser::UndocumentableError)
100
+ end
101
+
102
+ it "registers itself in the registry if namespace is supplied" do
103
+ obj = ModuleObject.new(:root, :Me)
104
+ expect(Registry.at(:Me)).to eq obj
105
+
106
+ obj2 = ModuleObject.new(obj, :Too)
107
+ expect(Registry.at(:"Me::Too")).to eq obj2
108
+ end
109
+
110
+ describe "#[]=" do
111
+ it "sets any attribute" do
112
+ obj = ModuleObject.new(:root, :YARD)
113
+ obj[:some_attr] = "hello"
114
+ expect(obj[:some_attr]).to eq "hello"
115
+ end
116
+
117
+ it "uses the accessor method if available" do
118
+ obj = CodeObjects::Base.new(:root, :YARD)
119
+ obj[:source] = "hello"
120
+ expect(obj.source).to eq "hello"
121
+ obj.source = "unhello"
122
+ expect(obj[:source]).to eq "unhello"
123
+ end
124
+ end
125
+
126
+ it "sets attributes via attr= through method_missing" do
127
+ obj = CodeObjects::Base.new(:root, :YARD)
128
+ obj.something = 2
129
+ expect(obj.something).to eq 2
130
+ expect(obj[:something]).to eq 2
131
+ end
132
+
133
+ it "exists in the parent's #children after creation" do
134
+ obj = ModuleObject.new(:root, :YARD)
135
+ obj2 = MethodObject.new(obj, :testing)
136
+ expect(obj.children).to include(obj2)
137
+ end
138
+
139
+ # @bug gh-1209
140
+ it "removes prior defined objects at the same path from namespace's children" do
141
+ Registry.clear
142
+ obj = ModuleObject.new(:root, :YARD)
143
+ ConstantObject.new(obj, :Testing)
144
+ ClassObject.new(obj, :Testing)
145
+ expect(obj.children.map {|o| o.type.to_sym }).to eq [:class]
146
+ expect(Registry.at('YARD::Testing').type).to eq :class
147
+ end
148
+
149
+ it "properly re-indents source starting from 0 indentation" do
150
+ obj = CodeObjects::Base.new(nil, :test)
151
+ obj.source = <<-eof
152
+ def mymethod
153
+ if x == 2 &&
154
+ 5 == 5
155
+ 3
156
+ else
157
+ 1
158
+ end
159
+ end
160
+ eof
161
+ expect(obj.source).to eq "def mymethod\n if x == 2 &&\n 5 == 5\n 3\n else\n 1\n end\nend"
162
+
163
+ Registry.clear
164
+ Parser::SourceParser.parse_string <<-eof
165
+ def key?(key)
166
+ super(key)
167
+ end
168
+ eof
169
+ expect(Registry.at('#key?').source).to eq "def key?(key)\n super(key)\nend"
170
+
171
+ Registry.clear
172
+ Parser::SourceParser.parse_string <<-eof
173
+ def key?(key)
174
+ if x == 2
175
+ puts key
176
+ else
177
+ exit
178
+ end
179
+ end
180
+ eof
181
+ expect(Registry.at('#key?').source).to eq "def key?(key)\n if x == 2\n puts key\n else\n exit\n end\nend"
182
+ end
183
+
184
+ it "does not add newlines to source when parsing sub blocks" do
185
+ Parser::SourceParser.parse_string <<-eof
186
+ module XYZ
187
+ module ZYX
188
+ class ABC
189
+ def msg
190
+ hello_world
191
+ end
192
+ end
193
+ end
194
+ end
195
+ eof
196
+ expect(Registry.at('XYZ::ZYX::ABC#msg').source).to eq "def msg\n hello_world\nend"
197
+ end
198
+
199
+ it "handles source for 'def x; end'" do
200
+ Registry.clear
201
+ Parser::SourceParser.parse_string "def x; 2 end"
202
+ expect(Registry.at('#x').source).to eq "def x; 2 end"
203
+ end
204
+
205
+ it "sets file and line information" do
206
+ Parser::SourceParser.parse_string <<-eof
207
+ class X; end
208
+ eof
209
+ expect(Registry.at(:X).file).to eq '(stdin)'
210
+ expect(Registry.at(:X).line).to eq 1
211
+ end
212
+
213
+ it "maintains all file associations when objects are defined multiple times in one file" do
214
+ Parser::SourceParser.parse_string <<-eof
215
+ class X; end
216
+ class X; end
217
+ class X; end
218
+ eof
219
+
220
+ expect(Registry.at(:X).file).to eq '(stdin)'
221
+ expect(Registry.at(:X).line).to eq 1
222
+ expect(Registry.at(:X).files).to eq [['(stdin)', 1], ['(stdin)', 2], ['(stdin)', 3]]
223
+ end
224
+
225
+ it "maintains all file associations when objects are defined multiple times in multiple files" do
226
+ 3.times do |i|
227
+ allow(File).to receive(:read_binary).and_return("class X; end")
228
+ Parser::SourceParser.new.parse("file#{i + 1}.rb")
229
+ end
230
+
231
+ expect(Registry.at(:X).file).to eq 'file1.rb'
232
+ expect(Registry.at(:X).line).to eq 1
233
+ expect(Registry.at(:X).files).to eq [['file1.rb', 1], ['file2.rb', 1], ['file3.rb', 1]]
234
+ end
235
+
236
+ it "prioritizes the definition with a docstring when returning #file" do
237
+ Parser::SourceParser.parse_string <<-eof
238
+ class X; end
239
+ class X; end
240
+ # docstring
241
+ class X; end
242
+ eof
243
+
244
+ expect(Registry.at(:X).file).to eq '(stdin)'
245
+ expect(Registry.at(:X).line).to eq 4
246
+ expect(Registry.at(:X).files).to eq [['(stdin)', 4], ['(stdin)', 1], ['(stdin)', 2]]
247
+ end
248
+
249
+ describe "#format" do
250
+ it "sends object to Templates.render" do
251
+ object = MethodObject.new(:root, :method)
252
+ expect(Templates::Engine).to receive(:render).with(:x => 1, :object => object, :type => object.type)
253
+ object.format :x => 1
254
+ end
255
+
256
+ it "does not change options object class" do
257
+ opts = YARD::Templates::TemplateOptions.new
258
+ opts.type = "test"
259
+ object = MethodObject.new(:root, :method)
260
+ expect(Templates::Engine).to receive(:render).with kind_of(YARD::Templates::TemplateOptions)
261
+ object.format(opts)
262
+ end
263
+ end
264
+
265
+ describe "#source_type" do
266
+ it "defaults to :ruby" do
267
+ object = MethodObject.new(:root, :method)
268
+ expect(object.source_type).to eq :ruby
269
+ end
270
+ end
271
+
272
+ describe "#relative_path" do
273
+ it "accepts a string" do
274
+ YARD.parse_string "module A; class B; end; class C; end; end"
275
+ expect(Registry.at('A::B').relative_path(Registry.at('A::C'))).to eq(
276
+ Registry.at('A::B').relative_path('A::C')
277
+ )
278
+ end
279
+
280
+ it "returns full class name when objects share a common class prefix" do
281
+ YARD.parse_string "module User; end; module UserManager; end"
282
+ expect(Registry.at('User').relative_path('UserManager')).to eq 'UserManager'
283
+ expect(Registry.at('User').relative_path(Registry.at('UserManager'))).to eq 'UserManager'
284
+ end
285
+
286
+ it "returns the relative path when they share a common namespace" do
287
+ YARD.parse_string "module A; class B; end; class C; end; end"
288
+ expect(Registry.at('A::B').relative_path(Registry.at('A::C'))).to eq 'C'
289
+ YARD.parse_string "module Foo; module A; end; module B; def foo; end end end"
290
+ expect(Registry.at('Foo::A').relative_path(Registry.at('Foo::B#foo'))).to eq 'B#foo'
291
+ end
292
+
293
+ it "returns the full path if they don't have a common namespace" do
294
+ YARD.parse_string "module A; class B; end; end; module D; class C; end; end"
295
+ expect(Registry.at('A::B').relative_path('D::C')).to eq 'D::C'
296
+ YARD.parse_string 'module C::B::C; module Apple; end; module Ant; end end'
297
+ expect(Registry.at('C::B::C::Apple').relative_path('C::B::C::Ant')).to eq 'Ant'
298
+ YARD.parse_string 'module OMG::ABC; end; class Object; end'
299
+ expect(Registry.at('OMG::ABC').relative_path('Object')).to eq "Object"
300
+ YARD.parse_string("class YARD::Config; MYCONST = 1; end")
301
+ expect(Registry.at('YARD::Config').relative_path('YARD::Config::MYCONST')).to eq "MYCONST"
302
+ end
303
+
304
+ it "returns a relative path for class methods" do
305
+ YARD.parse_string "module A; def self.b; end; def self.c; end; end"
306
+ expect(Registry.at('A.b').relative_path('A.c')).to eq 'c'
307
+ expect(Registry.at('A').relative_path('A.c')).to eq 'c'
308
+ end
309
+
310
+ it "returns a relative path for instance methods" do
311
+ YARD.parse_string "module A; def b; end; def c; end; end"
312
+ expect(Registry.at('A#b').relative_path('A#c')).to eq '#c'
313
+ expect(Registry.at('A').relative_path('A#c')).to eq '#c'
314
+ end
315
+
316
+ it "returns full path if relative path is to parent namespace" do
317
+ YARD.parse_string "module A; module B; end end"
318
+ expect(Registry.at('A::B').relative_path('A')).to eq 'A'
319
+ end
320
+
321
+ it "only returns name for relative path to self" do
322
+ YARD.parse_string("class A::B::C; def foo; end end")
323
+ expect(Registry.at('A::B::C').relative_path('A::B::C')).to eq 'C'
324
+ expect(Registry.at('A::B::C#foo').relative_path('A::B::C#foo')).to eq '#foo'
325
+ end
326
+ end
327
+
328
+ describe "#docstring=" do
329
+ it "converts string into Docstring when #docstring= is set" do
330
+ o = ClassObject.new(:root, :Me)
331
+ o.docstring = "DOCSTRING"
332
+ expect(o.docstring).to be_instance_of(Docstring)
333
+ end
334
+
335
+ it "sets docstring to docstring of other object if docstring is '(see Path)'" do
336
+ ClassObject.new(:root, :AnotherObject) {|x| x.docstring = "FOO" }
337
+ o = ClassObject.new(:root, :Me)
338
+ o.docstring = '(see AnotherObject)'
339
+ expect(o.docstring).to eq "FOO"
340
+ end
341
+
342
+ it "does not copy docstring mid-docstring" do
343
+ doc = "Hello.\n(see file.rb)\nmore documentation"
344
+ o = ClassObject.new(:root, :Me)
345
+ o.docstring = doc
346
+ expect(o.docstring).to eq doc
347
+ end
348
+
349
+ it "allows extra docstring after (see Path)" do
350
+ ClassObject.new(:root, :AnotherObject) {|x| x.docstring = "FOO" }
351
+ o = ClassObject.new(:root, :Me)
352
+ o.docstring = Docstring.new("(see AnotherObject)\n\nEXTRA\n@api private", o)
353
+ expect(o.docstring).to eq "FOO\n\nEXTRA"
354
+ expect(o.docstring).to have_tag(:api)
355
+ end
356
+ end
357
+
358
+ describe "#docstring" do
359
+ it "returns an empty string if docstring was '(see Path)' and Path is not resolved" do
360
+ o = ClassObject.new(:root, :Me)
361
+ o.docstring = '(see AnotherObject)'
362
+ expect(o.docstring).to eq ""
363
+ end
364
+
365
+ it "returns docstring when object is resolved" do
366
+ o = ClassObject.new(:root, :Me)
367
+ o.docstring = '(see AnotherObject)'
368
+ expect(o.docstring).to eq ""
369
+ ClassObject.new(:root, :AnotherObject) {|x| x.docstring = "FOO" }
370
+ expect(o.docstring).to eq "FOO"
371
+ end
372
+
373
+ describe "localization" do
374
+ it "returns localized docstring" do
375
+ fr_locale = YARD::I18n::Locale.new('fr')
376
+ allow(fr_locale).to receive(:translate).with('Hello').and_return('Bonjour')
377
+
378
+ o = ClassObject.new(:root, :Me)
379
+ o.docstring = 'Hello'
380
+ expect(o.docstring).to eq 'Hello'
381
+
382
+ allow(Registry).to receive(:locale).with('fr').and_return(fr_locale)
383
+ expect(o.docstring('fr')).to eq "Bonjour"
384
+ end
385
+
386
+ it "returns localized docstring tag" do
387
+ o = CodeObjects::MethodObject.new(:root, 'Hello#message')
388
+ o.docstring.add_tag(Tags::Tag.new('return', 'Hello'))
389
+
390
+ fr_locale = YARD::I18n::Locale.new('fr')
391
+ allow(fr_locale).to receive(:translate).with('Hello').and_return('Bonjour')
392
+ allow(Registry).to receive(:locale).with('fr').and_return(fr_locale)
393
+
394
+ expect(o.docstring('fr').tags.map(&:text)).to eq ['Bonjour']
395
+ end
396
+
397
+ it "returns updated localized docstring" do
398
+ fr_locale = YARD::I18n::Locale.new('fr')
399
+ allow(Registry).to receive(:locale).with('fr').and_return(fr_locale)
400
+
401
+ o = ClassObject.new(:root, :Me)
402
+ o.docstring = 'Hello'
403
+ expect(o.docstring).to eq 'Hello'
404
+
405
+ allow(fr_locale).to receive(:translate).with('Hello').and_return('Bonjour')
406
+ expect(o.docstring('fr')).to eq "Bonjour"
407
+
408
+ o.docstring = 'World'
409
+ allow(fr_locale).to receive(:translate).with('World').and_return('Monde')
410
+ expect(o.docstring('fr')).to eq "Monde"
411
+ expect(o.docstring).to eq 'World'
412
+ end
413
+ end
414
+ end
415
+
416
+ describe "#add_file" do
417
+ it "only adds a file/line combination once" do
418
+ o = ClassObject.new(:root, :Me)
419
+ o.add_file('filename', 12)
420
+ expect(o.files).to eq [['filename', 12]]
421
+ o.add_file('filename', 12)
422
+ expect(o.files).to eq [['filename', 12]]
423
+ o.add_file('filename', 40) # different line
424
+ expect(o.files).to eq [['filename', 12], ['filename', 40]]
425
+ end
426
+ end
427
+
428
+ describe "#copy_to" do
429
+ it "copies all data to new object" do
430
+ YARD.parse_string <<-eof
431
+ private
432
+ # A docstring
433
+ # @return [String] a tag
434
+ def foo(a, b, c)
435
+ source_code_here
436
+ end
437
+ eof
438
+ foo_c = MethodObject.new(:root, :foo, :class)
439
+ Registry.at('#foo').copy_to(foo_c)
440
+ expect(foo_c.scope).to eq :class
441
+ expect(foo_c.visibility).to eq :private
442
+ expect(foo_c.type).to eq :method
443
+ expect(foo_c.class).to eq MethodObject
444
+ expect(foo_c.path).to eq '::foo'
445
+ expect(foo_c.docstring).to eq "A docstring"
446
+ expect(foo_c.tag(:return).types).to eq ['String']
447
+ expect(foo_c.file).to eq '(stdin)'
448
+ expect(foo_c.line).to eq 4
449
+ expect(foo_c.source).to match(/source_code_here/)
450
+ expect(foo_c.signature).to eq 'def foo(a, b, c)'
451
+ expect(foo_c.parameters).to eq [['a', nil], ['b', nil], ['c', nil]]
452
+ end
453
+
454
+ it "returns the copied object" do
455
+ YARD.parse_string 'def foo; end'
456
+ foo_c = MethodObject.new(:root, :foo, :class)
457
+ expect(Registry.at('#foo').copy_to(foo_c)).to eq foo_c
458
+ end
459
+
460
+ it "copies docstring and rewrite tags to new object" do
461
+ YARD.parse_string <<-eof
462
+ # @return [String] a tag
463
+ def foo; end
464
+ eof
465
+ foo_c = MethodObject.new(:root, :foo, :class)
466
+ foo_i = Registry.at('#foo')
467
+ foo_i.copy_to(foo_c)
468
+ expect(foo_i.tags).not_to eq foo_c.tags
469
+ expect(foo_c.tags.first.object).to eq foo_c
470
+ end
471
+
472
+ it "only copies #copyable_attributes" do
473
+ foo = MethodObject.new(:root, :foo)
474
+ expect(foo).to receive(:copyable_attributes).and_return %w(a b c)
475
+ expect(foo).to receive(:instance_variable_get).with('@a').and_return(1)
476
+ expect(foo).to receive(:instance_variable_get).with('@b').and_return(2)
477
+ expect(foo).to receive(:instance_variable_get).with('@c').and_return(3)
478
+ bar = MethodObject.new(:root, :bar)
479
+ expect(bar).to receive(:instance_variable_set).with('@a', 1)
480
+ expect(bar).to receive(:instance_variable_set).with('@b', 2)
481
+ expect(bar).to receive(:instance_variable_set).with('@c', 3)
482
+ foo.copy_to(bar)
483
+ end
484
+ end
485
+ end