yard 0.9.16 → 0.9.17

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 (566) hide show
  1. checksums.yaml +5 -5
  2. data/.yardopts +26 -26
  3. data/CHANGELOG.md +728 -728
  4. data/LEGAL +66 -66
  5. data/LICENSE +22 -22
  6. data/README.md +328 -328
  7. data/Rakefile +53 -47
  8. data/benchmarks/builtins_vs_eval.rb +24 -24
  9. data/benchmarks/concat_vs_join.rb +13 -13
  10. data/benchmarks/erb_vs_erubis.rb +54 -54
  11. data/benchmarks/format_args.rb +47 -47
  12. data/benchmarks/generation.rb +38 -38
  13. data/benchmarks/marshal_vs_dbm.rb +64 -64
  14. data/benchmarks/parsing.rb +46 -46
  15. data/benchmarks/pathname_vs_string.rb +50 -50
  16. data/benchmarks/rdoc_vs_yardoc.rb +11 -11
  17. data/benchmarks/registry_store_types.rb +49 -49
  18. data/benchmarks/ri_vs_yri.rb +19 -19
  19. data/benchmarks/ripper_parser.rb +13 -13
  20. data/benchmarks/splat_vs_flatten.rb +13 -13
  21. data/benchmarks/template_erb.rb +23 -23
  22. data/benchmarks/template_format.rb +7 -7
  23. data/benchmarks/template_profile.rb +18 -18
  24. data/benchmarks/yri_cache.rb +20 -20
  25. data/bin/yard +13 -13
  26. data/bin/yardoc +13 -13
  27. data/bin/yri +13 -13
  28. data/docs/CodeObjects.md +115 -115
  29. data/docs/GettingStarted.md +679 -679
  30. data/docs/Handlers.md +152 -152
  31. data/docs/Overview.md +61 -61
  32. data/docs/Parser.md +191 -191
  33. data/docs/Tags.md +283 -283
  34. data/docs/TagsArch.md +123 -123
  35. data/docs/Templates.md +496 -496
  36. data/docs/WhatsNew.md +1245 -1245
  37. data/docs/templates/default/fulldoc/html/full_list_tag.erb +8 -8
  38. data/docs/templates/default/fulldoc/html/setup.rb +6 -6
  39. data/docs/templates/default/layout/html/setup.rb +9 -9
  40. data/docs/templates/default/layout/html/tag_list.erb +11 -11
  41. data/docs/templates/default/yard_tags/html/list.erb +18 -18
  42. data/docs/templates/default/yard_tags/html/setup.rb +26 -26
  43. data/docs/templates/plugin.rb +70 -70
  44. data/lib/rubygems_plugin.rb +9 -9
  45. data/lib/yard.rb +69 -69
  46. data/lib/yard/autoload.rb +303 -303
  47. data/lib/yard/cli/command.rb +85 -85
  48. data/lib/yard/cli/command_parser.rb +93 -93
  49. data/lib/yard/cli/config.rb +198 -198
  50. data/lib/yard/cli/diff.rb +270 -270
  51. data/lib/yard/cli/display.rb +69 -69
  52. data/lib/yard/cli/gems.rb +84 -84
  53. data/lib/yard/cli/graph.rb +125 -125
  54. data/lib/yard/cli/help.rb +20 -20
  55. data/lib/yard/cli/i18n.rb +70 -70
  56. data/lib/yard/cli/list.rb +23 -23
  57. data/lib/yard/cli/markup_types.rb +32 -32
  58. data/lib/yard/cli/server.rb +257 -257
  59. data/lib/yard/cli/stats.rb +231 -231
  60. data/lib/yard/cli/yardoc.rb +788 -788
  61. data/lib/yard/cli/yardopts_command.rb +110 -110
  62. data/lib/yard/cli/yri.rb +215 -215
  63. data/lib/yard/code_objects/base.rb +615 -610
  64. data/lib/yard/code_objects/class_object.rb +146 -146
  65. data/lib/yard/code_objects/class_variable_object.rb +11 -11
  66. data/lib/yard/code_objects/constant_object.rb +16 -16
  67. data/lib/yard/code_objects/extended_method_object.rb +24 -24
  68. data/lib/yard/code_objects/extra_file_object.rb +131 -131
  69. data/lib/yard/code_objects/macro_object.rb +172 -172
  70. data/lib/yard/code_objects/method_object.rb +196 -196
  71. data/lib/yard/code_objects/module_object.rb +21 -21
  72. data/lib/yard/code_objects/namespace_mapper.rb +114 -114
  73. data/lib/yard/code_objects/namespace_object.rb +200 -200
  74. data/lib/yard/code_objects/proxy.rb +240 -240
  75. data/lib/yard/code_objects/root_object.rb +19 -19
  76. data/lib/yard/config.rb +270 -270
  77. data/lib/yard/core_ext/array.rb +16 -16
  78. data/lib/yard/core_ext/file.rb +69 -69
  79. data/lib/yard/core_ext/hash.rb +16 -16
  80. data/lib/yard/core_ext/insertion.rb +63 -63
  81. data/lib/yard/core_ext/module.rb +20 -20
  82. data/lib/yard/core_ext/string.rb +68 -68
  83. data/lib/yard/core_ext/symbol_hash.rb +75 -75
  84. data/lib/yard/docstring.rb +386 -378
  85. data/lib/yard/docstring_parser.rb +345 -345
  86. data/lib/yard/gem_index.rb +29 -29
  87. data/lib/yard/globals.rb +22 -22
  88. data/lib/yard/handlers/base.rb +595 -595
  89. data/lib/yard/handlers/c/alias_handler.rb +16 -16
  90. data/lib/yard/handlers/c/attribute_handler.rb +13 -13
  91. data/lib/yard/handlers/c/base.rb +129 -129
  92. data/lib/yard/handlers/c/class_handler.rb +27 -27
  93. data/lib/yard/handlers/c/constant_handler.rb +13 -13
  94. data/lib/yard/handlers/c/handler_methods.rb +211 -211
  95. data/lib/yard/handlers/c/init_handler.rb +20 -20
  96. data/lib/yard/handlers/c/method_handler.rb +45 -36
  97. data/lib/yard/handlers/c/mixin_handler.rb +21 -21
  98. data/lib/yard/handlers/c/module_handler.rb +17 -17
  99. data/lib/yard/handlers/c/override_comment_handler.rb +31 -31
  100. data/lib/yard/handlers/c/path_handler.rb +11 -11
  101. data/lib/yard/handlers/c/struct_handler.rb +13 -13
  102. data/lib/yard/handlers/c/symbol_handler.rb +8 -8
  103. data/lib/yard/handlers/processor.rb +200 -200
  104. data/lib/yard/handlers/ruby/alias_handler.rb +44 -44
  105. data/lib/yard/handlers/ruby/attribute_handler.rb +87 -87
  106. data/lib/yard/handlers/ruby/base.rb +165 -165
  107. data/lib/yard/handlers/ruby/class_condition_handler.rb +92 -92
  108. data/lib/yard/handlers/ruby/class_handler.rb +119 -119
  109. data/lib/yard/handlers/ruby/class_variable_handler.rb +17 -17
  110. data/lib/yard/handlers/ruby/comment_handler.rb +10 -10
  111. data/lib/yard/handlers/ruby/constant_handler.rb +59 -59
  112. data/lib/yard/handlers/ruby/decorator_handler_methods.rb +123 -123
  113. data/lib/yard/handlers/ruby/dsl_handler.rb +15 -15
  114. data/lib/yard/handlers/ruby/dsl_handler_methods.rb +96 -95
  115. data/lib/yard/handlers/ruby/exception_handler.rb +27 -27
  116. data/lib/yard/handlers/ruby/extend_handler.rb +22 -22
  117. data/lib/yard/handlers/ruby/legacy/alias_handler.rb +37 -37
  118. data/lib/yard/handlers/ruby/legacy/attribute_handler.rb +65 -65
  119. data/lib/yard/handlers/ruby/legacy/base.rb +245 -245
  120. data/lib/yard/handlers/ruby/legacy/class_condition_handler.rb +83 -83
  121. data/lib/yard/handlers/ruby/legacy/class_handler.rb +113 -113
  122. data/lib/yard/handlers/ruby/legacy/class_variable_handler.rb +15 -15
  123. data/lib/yard/handlers/ruby/legacy/comment_handler.rb +10 -10
  124. data/lib/yard/handlers/ruby/legacy/constant_handler.rb +29 -29
  125. data/lib/yard/handlers/ruby/legacy/dsl_handler.rb +17 -17
  126. data/lib/yard/handlers/ruby/legacy/exception_handler.rb +13 -13
  127. data/lib/yard/handlers/ruby/legacy/extend_handler.rb +21 -21
  128. data/lib/yard/handlers/ruby/legacy/method_handler.rb +90 -90
  129. data/lib/yard/handlers/ruby/legacy/mixin_handler.rb +39 -39
  130. data/lib/yard/handlers/ruby/legacy/module_function_handler.rb +19 -19
  131. data/lib/yard/handlers/ruby/legacy/module_handler.rb +12 -12
  132. data/lib/yard/handlers/ruby/legacy/private_class_method_handler.rb +22 -22
  133. data/lib/yard/handlers/ruby/legacy/private_constant_handler.rb +22 -22
  134. data/lib/yard/handlers/ruby/legacy/visibility_handler.rb +17 -17
  135. data/lib/yard/handlers/ruby/legacy/yield_handler.rb +29 -29
  136. data/lib/yard/handlers/ruby/method_condition_handler.rb +9 -9
  137. data/lib/yard/handlers/ruby/method_handler.rb +118 -118
  138. data/lib/yard/handlers/ruby/mixin_handler.rb +37 -37
  139. data/lib/yard/handlers/ruby/module_function_handler.rb +27 -27
  140. data/lib/yard/handlers/ruby/module_handler.rb +12 -12
  141. data/lib/yard/handlers/ruby/private_class_method_handler.rb +14 -14
  142. data/lib/yard/handlers/ruby/private_constant_handler.rb +43 -43
  143. data/lib/yard/handlers/ruby/public_class_method_handler.rb +14 -14
  144. data/lib/yard/handlers/ruby/struct_handler_methods.rb +143 -143
  145. data/lib/yard/handlers/ruby/visibility_handler.rb +22 -22
  146. data/lib/yard/handlers/ruby/yield_handler.rb +31 -31
  147. data/lib/yard/i18n/locale.rb +67 -67
  148. data/lib/yard/i18n/message.rb +57 -57
  149. data/lib/yard/i18n/messages.rb +56 -56
  150. data/lib/yard/i18n/po_parser.rb +61 -61
  151. data/lib/yard/i18n/pot_generator.rb +290 -290
  152. data/lib/yard/i18n/text.rb +173 -173
  153. data/lib/yard/logging.rb +205 -205
  154. data/lib/yard/options.rb +217 -217
  155. data/lib/yard/parser/base.rb +57 -57
  156. data/lib/yard/parser/c/c_parser.rb +235 -235
  157. data/lib/yard/parser/c/comment_parser.rb +134 -134
  158. data/lib/yard/parser/c/statement.rb +64 -64
  159. data/lib/yard/parser/ruby/ast_node.rb +540 -540
  160. data/lib/yard/parser/ruby/legacy/ruby_lex.rb +1354 -1354
  161. data/lib/yard/parser/ruby/legacy/ruby_parser.rb +32 -32
  162. data/lib/yard/parser/ruby/legacy/statement.rb +66 -66
  163. data/lib/yard/parser/ruby/legacy/statement_list.rb +394 -394
  164. data/lib/yard/parser/ruby/legacy/token_list.rb +74 -74
  165. data/lib/yard/parser/ruby/ruby_parser.rb +687 -687
  166. data/lib/yard/parser/ruby/token_resolver.rb +156 -156
  167. data/lib/yard/parser/source_parser.rb +526 -526
  168. data/lib/yard/rake/yardoc_task.rb +81 -81
  169. data/lib/yard/registry.rb +439 -439
  170. data/lib/yard/registry_resolver.rb +189 -189
  171. data/lib/yard/registry_store.rb +337 -337
  172. data/lib/yard/rubygems/backports.rb +10 -10
  173. data/lib/yard/rubygems/backports/LICENSE.txt +57 -57
  174. data/lib/yard/rubygems/backports/MIT.txt +20 -20
  175. data/lib/yard/rubygems/backports/gem.rb +10 -10
  176. data/lib/yard/rubygems/backports/source_index.rb +365 -365
  177. data/lib/yard/rubygems/doc_manager.rb +90 -90
  178. data/lib/yard/rubygems/hook.rb +197 -197
  179. data/lib/yard/rubygems/specification.rb +50 -50
  180. data/lib/yard/serializers/base.rb +83 -83
  181. data/lib/yard/serializers/file_system_serializer.rb +123 -123
  182. data/lib/yard/serializers/process_serializer.rb +24 -24
  183. data/lib/yard/serializers/stdout_serializer.rb +34 -34
  184. data/lib/yard/serializers/yardoc_serializer.rb +152 -152
  185. data/lib/yard/server.rb +13 -13
  186. data/lib/yard/server/adapter.rb +100 -100
  187. data/lib/yard/server/commands/base.rb +209 -209
  188. data/lib/yard/server/commands/display_file_command.rb +29 -29
  189. data/lib/yard/server/commands/display_object_command.rb +65 -65
  190. data/lib/yard/server/commands/frames_command.rb +16 -16
  191. data/lib/yard/server/commands/library_command.rb +187 -187
  192. data/lib/yard/server/commands/library_index_command.rb +28 -28
  193. data/lib/yard/server/commands/list_command.rb +25 -25
  194. data/lib/yard/server/commands/root_request_command.rb +15 -15
  195. data/lib/yard/server/commands/search_command.rb +79 -79
  196. data/lib/yard/server/commands/static_file_command.rb +23 -23
  197. data/lib/yard/server/commands/static_file_helpers.rb +62 -62
  198. data/lib/yard/server/doc_server_helper.rb +91 -91
  199. data/lib/yard/server/doc_server_serializer.rb +39 -39
  200. data/lib/yard/server/library_version.rb +277 -277
  201. data/lib/yard/server/rack_adapter.rb +89 -89
  202. data/lib/yard/server/router.rb +187 -187
  203. data/lib/yard/server/static_caching.rb +46 -46
  204. data/lib/yard/server/templates/default/fulldoc/html/css/custom.css +127 -127
  205. data/lib/yard/server/templates/default/fulldoc/html/js/autocomplete.js +11 -11
  206. data/lib/yard/server/templates/default/layout/html/breadcrumb.erb +37 -37
  207. data/lib/yard/server/templates/default/layout/html/script_setup.erb +7 -7
  208. data/lib/yard/server/templates/default/layout/html/setup.rb +8 -8
  209. data/lib/yard/server/templates/default/method_details/html/permalink.erb +4 -4
  210. data/lib/yard/server/templates/default/method_details/html/setup.rb +5 -5
  211. data/lib/yard/server/templates/doc_server/library_list/html/headers.erb +8 -8
  212. data/lib/yard/server/templates/doc_server/library_list/html/library_list.erb +14 -14
  213. data/lib/yard/server/templates/doc_server/library_list/html/listing.erb +13 -13
  214. data/lib/yard/server/templates/doc_server/library_list/html/setup.rb +6 -6
  215. data/lib/yard/server/templates/doc_server/library_list/html/title.erb +2 -2
  216. data/lib/yard/server/templates/doc_server/processing/html/processing.erb +52 -52
  217. data/lib/yard/server/templates/doc_server/processing/html/setup.rb +4 -4
  218. data/lib/yard/server/templates/doc_server/search/html/search.erb +18 -18
  219. data/lib/yard/server/templates/doc_server/search/html/setup.rb +9 -9
  220. data/lib/yard/server/webrick_adapter.rb +45 -45
  221. data/lib/yard/tags/default_factory.rb +191 -191
  222. data/lib/yard/tags/default_tag.rb +13 -13
  223. data/lib/yard/tags/directives.rb +616 -616
  224. data/lib/yard/tags/library.rb +633 -633
  225. data/lib/yard/tags/option_tag.rb +13 -13
  226. data/lib/yard/tags/overload_tag.rb +71 -71
  227. data/lib/yard/tags/ref_tag.rb +8 -8
  228. data/lib/yard/tags/ref_tag_list.rb +28 -28
  229. data/lib/yard/tags/tag.rb +71 -71
  230. data/lib/yard/tags/tag_format_error.rb +7 -7
  231. data/lib/yard/tags/types_explainer.rb +162 -162
  232. data/lib/yard/templates/engine.rb +186 -186
  233. data/lib/yard/templates/erb_cache.rb +23 -23
  234. data/lib/yard/templates/helpers/base_helper.rb +215 -215
  235. data/lib/yard/templates/helpers/filter_helper.rb +27 -27
  236. data/lib/yard/templates/helpers/html_helper.rb +646 -642
  237. data/lib/yard/templates/helpers/html_syntax_highlight_helper.rb +78 -78
  238. data/lib/yard/templates/helpers/markup/rdoc_markdown.rb +23 -23
  239. data/lib/yard/templates/helpers/markup/rdoc_markup.rb +109 -109
  240. data/lib/yard/templates/helpers/markup_helper.rb +172 -172
  241. data/lib/yard/templates/helpers/method_helper.rb +75 -75
  242. data/lib/yard/templates/helpers/module_helper.rb +21 -21
  243. data/lib/yard/templates/helpers/text_helper.rb +112 -112
  244. data/lib/yard/templates/helpers/uml_helper.rb +47 -47
  245. data/lib/yard/templates/section.rb +105 -105
  246. data/lib/yard/templates/template.rb +418 -418
  247. data/lib/yard/templates/template_options.rb +92 -92
  248. data/lib/yard/verifier.rb +151 -151
  249. data/lib/yard/version.rb +3 -1
  250. data/spec/cli/command_parser_spec.rb +43 -43
  251. data/spec/cli/command_spec.rb +36 -36
  252. data/spec/cli/config_spec.rb +148 -148
  253. data/spec/cli/diff_spec.rb +254 -254
  254. data/spec/cli/display_spec.rb +30 -30
  255. data/spec/cli/gems_spec.rb +81 -81
  256. data/spec/cli/graph_spec.rb +18 -18
  257. data/spec/cli/help_spec.rb +22 -22
  258. data/spec/cli/i18n_spec.rb +107 -107
  259. data/spec/cli/list_spec.rb +8 -8
  260. data/spec/cli/markup_types_spec.rb +22 -22
  261. data/spec/cli/server_spec.rb +324 -324
  262. data/spec/cli/stats_spec.rb +96 -96
  263. data/spec/cli/yard_on_yard_spec.rb +38 -38
  264. data/spec/cli/yardoc_spec.rb +862 -849
  265. data/spec/cli/yri_spec.rb +101 -101
  266. data/spec/code_objects/base_spec.rb +470 -460
  267. data/spec/code_objects/class_object_spec.rb +226 -226
  268. data/spec/code_objects/code_object_list_spec.rb +36 -36
  269. data/spec/code_objects/constants_spec.rb +116 -116
  270. data/spec/code_objects/extra_file_object_spec.rb +160 -160
  271. data/spec/code_objects/macro_object_spec.rb +150 -150
  272. data/spec/code_objects/method_object_spec.rb +184 -184
  273. data/spec/code_objects/module_object_spec.rb +142 -142
  274. data/spec/code_objects/namespace_object_spec.rb +171 -171
  275. data/spec/code_objects/proxy_spec.rb +141 -141
  276. data/spec/code_objects/spec_helper.rb +3 -3
  277. data/spec/config_spec.rb +171 -171
  278. data/spec/core_ext/array_spec.rb +13 -13
  279. data/spec/core_ext/file_spec.rb +72 -72
  280. data/spec/core_ext/hash_spec.rb +14 -14
  281. data/spec/core_ext/insertion_spec.rb +37 -37
  282. data/spec/core_ext/module_spec.rb +15 -15
  283. data/spec/core_ext/string_spec.rb +42 -42
  284. data/spec/core_ext/symbol_hash_spec.rb +89 -89
  285. data/spec/docstring_parser_spec.rb +280 -262
  286. data/spec/docstring_spec.rb +373 -364
  287. data/spec/examples.txt +1875 -1871
  288. data/spec/handlers/alias_handler_spec.rb +82 -82
  289. data/spec/handlers/attribute_handler_spec.rb +96 -96
  290. data/spec/handlers/base_spec.rb +216 -216
  291. data/spec/handlers/c/alias_handler_spec.rb +34 -34
  292. data/spec/handlers/c/attribute_handler_spec.rb +41 -41
  293. data/spec/handlers/c/class_handler_spec.rb +78 -78
  294. data/spec/handlers/c/constant_handler_spec.rb +71 -71
  295. data/spec/handlers/c/init_handler_spec.rb +48 -48
  296. data/spec/handlers/c/method_handler_spec.rb +325 -325
  297. data/spec/handlers/c/mixin_handler_spec.rb +44 -44
  298. data/spec/handlers/c/module_handler_spec.rb +71 -71
  299. data/spec/handlers/c/override_comment_handler_spec.rb +47 -47
  300. data/spec/handlers/c/path_handler_spec.rb +36 -36
  301. data/spec/handlers/c/spec_helper.rb +23 -23
  302. data/spec/handlers/c/struct_handler_spec.rb +16 -16
  303. data/spec/handlers/class_condition_handler_spec.rb +87 -87
  304. data/spec/handlers/class_handler_spec.rb +247 -247
  305. data/spec/handlers/class_method_handler_shared_examples.rb +133 -133
  306. data/spec/handlers/class_variable_handler_spec.rb +12 -12
  307. data/spec/handlers/constant_handler_spec.rb +112 -112
  308. data/spec/handlers/decorator_handler_methods_spec.rb +393 -393
  309. data/spec/handlers/dsl_handler_spec.rb +219 -219
  310. data/spec/handlers/examples/alias_handler_001.rb.txt +45 -45
  311. data/spec/handlers/examples/attribute_handler_001.rb.txt +31 -31
  312. data/spec/handlers/examples/class_condition_handler_001.rb.txt +68 -68
  313. data/spec/handlers/examples/class_handler_001.rb.txt +120 -120
  314. data/spec/handlers/examples/class_variable_handler_001.rb.txt +9 -9
  315. data/spec/handlers/examples/constant_handler_001.rb.txt +35 -35
  316. data/spec/handlers/examples/dsl_handler_001.rb.txt +154 -154
  317. data/spec/handlers/examples/exception_handler_001.rb.txt +58 -58
  318. data/spec/handlers/examples/extend_handler_001.rb.txt +15 -15
  319. data/spec/handlers/examples/method_condition_handler_001.rb.txt +9 -9
  320. data/spec/handlers/examples/method_handler_001.rb.txt +128 -128
  321. data/spec/handlers/examples/mixin_handler_001.rb.txt +37 -37
  322. data/spec/handlers/examples/module_handler_001.rb.txt +29 -29
  323. data/spec/handlers/examples/private_constant_handler_001.rb.txt +8 -8
  324. data/spec/handlers/examples/process_handler_001.rb.txt +11 -11
  325. data/spec/handlers/examples/visibility_handler_001.rb.txt +35 -35
  326. data/spec/handlers/examples/yield_handler_001.rb.txt +54 -54
  327. data/spec/handlers/exception_handler_spec.rb +49 -49
  328. data/spec/handlers/extend_handler_spec.rb +24 -24
  329. data/spec/handlers/legacy_base_spec.rb +128 -128
  330. data/spec/handlers/method_condition_handler_spec.rb +15 -15
  331. data/spec/handlers/method_handler_spec.rb +190 -190
  332. data/spec/handlers/mixin_handler_spec.rb +56 -56
  333. data/spec/handlers/module_function_handler_spec.rb +106 -106
  334. data/spec/handlers/module_handler_spec.rb +35 -35
  335. data/spec/handlers/private_class_method_handler_spec.rb +11 -11
  336. data/spec/handlers/private_constant_handler_spec.rb +25 -25
  337. data/spec/handlers/processor_spec.rb +35 -35
  338. data/spec/handlers/public_class_method_handler_spec.rb +11 -11
  339. data/spec/handlers/ruby/base_spec.rb +95 -95
  340. data/spec/handlers/ruby/legacy/base_spec.rb +84 -84
  341. data/spec/handlers/spec_helper.rb +33 -33
  342. data/spec/handlers/visibility_handler_spec.rb +44 -44
  343. data/spec/handlers/yield_handler_spec.rb +52 -52
  344. data/spec/i18n/locale_spec.rb +81 -81
  345. data/spec/i18n/message_spec.rb +52 -52
  346. data/spec/i18n/messages_spec.rb +67 -67
  347. data/spec/i18n/pot_generator_spec.rb +295 -295
  348. data/spec/i18n/text_spec.rb +184 -184
  349. data/spec/logging_spec.rb +44 -44
  350. data/spec/options_spec.rb +171 -171
  351. data/spec/parser/base_spec.rb +24 -24
  352. data/spec/parser/c_parser_spec.rb +236 -223
  353. data/spec/parser/examples/array.c.txt +6267 -6267
  354. data/spec/parser/examples/example1.rb.txt +7 -7
  355. data/spec/parser/examples/extrafile.c.txt +8 -8
  356. data/spec/parser/examples/file.c.txt +28 -0
  357. data/spec/parser/examples/multifile.c.txt +22 -22
  358. data/spec/parser/examples/namespace.cpp.txt +68 -68
  359. data/spec/parser/examples/override.c.txt +424 -424
  360. data/spec/parser/examples/parse_in_order_001.rb.txt +2 -2
  361. data/spec/parser/examples/parse_in_order_002.rb.txt +1 -1
  362. data/spec/parser/examples/tag_handler_001.rb.txt +7 -7
  363. data/spec/parser/ruby/ast_node_spec.rb +33 -33
  364. data/spec/parser/ruby/legacy/statement_list_spec.rb +299 -299
  365. data/spec/parser/ruby/legacy/token_list_spec.rb +79 -79
  366. data/spec/parser/ruby/ruby_parser_spec.rb +508 -508
  367. data/spec/parser/ruby/token_resolver_spec.rb +165 -165
  368. data/spec/parser/source_parser_spec.rb +727 -727
  369. data/spec/parser/tag_parsing_spec.rb +17 -17
  370. data/spec/rake/yardoc_task_spec.rb +118 -118
  371. data/spec/registry_spec.rb +463 -463
  372. data/spec/registry_store_spec.rb +316 -316
  373. data/spec/rubygems/doc_manager_spec.rb +112 -112
  374. data/spec/serializers/data/serialized_yardoc/checksums +1 -1
  375. data/spec/serializers/file_system_serializer_spec.rb +145 -145
  376. data/spec/serializers/spec_helper.rb +2 -2
  377. data/spec/serializers/yardoc_serializer_spec.rb +78 -78
  378. data/spec/server/adapter_spec.rb +39 -39
  379. data/spec/server/commands/base_spec.rb +91 -91
  380. data/spec/server/commands/library_command_spec.rb +39 -39
  381. data/spec/server/doc_server_helper_spec.rb +72 -72
  382. data/spec/server/doc_server_serializer_spec.rb +60 -60
  383. data/spec/server/rack_adapter_spec.rb +21 -21
  384. data/spec/server/router_spec.rb +123 -123
  385. data/spec/server/spec_helper.rb +22 -22
  386. data/spec/server/static_caching_spec.rb +47 -47
  387. data/spec/server/webrick_servlet_spec.rb +20 -20
  388. data/spec/server_spec.rb +19 -19
  389. data/spec/spec_helper.rb +212 -212
  390. data/spec/tags/default_factory_spec.rb +168 -168
  391. data/spec/tags/default_tag_spec.rb +11 -11
  392. data/spec/tags/directives_spec.rb +463 -463
  393. data/spec/tags/library_spec.rb +48 -48
  394. data/spec/tags/overload_tag_spec.rb +53 -53
  395. data/spec/tags/ref_tag_list_spec.rb +53 -53
  396. data/spec/tags/types_explainer_spec.rb +203 -203
  397. data/spec/templates/class_spec.rb +45 -45
  398. data/spec/templates/constant_spec.rb +41 -41
  399. data/spec/templates/engine_spec.rb +131 -131
  400. data/spec/templates/examples/class001.html +308 -308
  401. data/spec/templates/examples/class001.txt +36 -36
  402. data/spec/templates/examples/class002.html +39 -39
  403. data/spec/templates/examples/constant001.txt +24 -24
  404. data/spec/templates/examples/constant002.txt +6 -6
  405. data/spec/templates/examples/constant003.txt +10 -10
  406. data/spec/templates/examples/method001.html +137 -137
  407. data/spec/templates/examples/method001.txt +35 -35
  408. data/spec/templates/examples/method002.html +91 -91
  409. data/spec/templates/examples/method002.txt +20 -20
  410. data/spec/templates/examples/method003.html +165 -165
  411. data/spec/templates/examples/method003.txt +45 -45
  412. data/spec/templates/examples/method004.html +48 -48
  413. data/spec/templates/examples/method004.txt +10 -10
  414. data/spec/templates/examples/method005.html +105 -105
  415. data/spec/templates/examples/method005.txt +33 -33
  416. data/spec/templates/examples/method006.html +107 -107
  417. data/spec/templates/examples/method006.txt +20 -20
  418. data/spec/templates/examples/module001.dot +33 -33
  419. data/spec/templates/examples/module001.html +833 -833
  420. data/spec/templates/examples/module001.txt +33 -33
  421. data/spec/templates/examples/module002.html +341 -341
  422. data/spec/templates/examples/module003.html +202 -202
  423. data/spec/templates/examples/module004.html +394 -394
  424. data/spec/templates/examples/module005.html +81 -81
  425. data/spec/templates/examples/tag001.txt +82 -82
  426. data/spec/templates/helpers/base_helper_spec.rb +171 -171
  427. data/spec/templates/helpers/html_helper_spec.rb +668 -653
  428. data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +65 -65
  429. data/spec/templates/helpers/markup/rdoc_markup_spec.rb +84 -84
  430. data/spec/templates/helpers/markup_helper_spec.rb +136 -136
  431. data/spec/templates/helpers/method_helper_spec.rb +107 -107
  432. data/spec/templates/helpers/module_helper_spec.rb +35 -35
  433. data/spec/templates/helpers/shared_signature_examples.rb +126 -126
  434. data/spec/templates/helpers/text_helper_spec.rb +65 -65
  435. data/spec/templates/method_spec.rb +118 -118
  436. data/spec/templates/module_spec.rb +203 -203
  437. data/spec/templates/onefile_spec.rb +66 -66
  438. data/spec/templates/section_spec.rb +144 -144
  439. data/spec/templates/spec_helper.rb +76 -76
  440. data/spec/templates/tag_spec.rb +52 -52
  441. data/spec/templates/template_spec.rb +410 -410
  442. data/spec/verifier_spec.rb +106 -106
  443. data/templates/default/class/dot/setup.rb +7 -7
  444. data/templates/default/class/dot/superklass.erb +2 -2
  445. data/templates/default/class/html/constructor_details.erb +8 -8
  446. data/templates/default/class/html/setup.rb +2 -2
  447. data/templates/default/class/html/subclasses.erb +4 -4
  448. data/templates/default/class/setup.rb +36 -36
  449. data/templates/default/class/text/setup.rb +12 -12
  450. data/templates/default/class/text/subclasses.erb +5 -5
  451. data/templates/default/constant/text/header.erb +11 -11
  452. data/templates/default/constant/text/setup.rb +4 -4
  453. data/templates/default/docstring/html/abstract.erb +4 -4
  454. data/templates/default/docstring/html/deprecated.erb +1 -1
  455. data/templates/default/docstring/html/index.erb +5 -5
  456. data/templates/default/docstring/html/note.erb +6 -6
  457. data/templates/default/docstring/html/private.erb +4 -4
  458. data/templates/default/docstring/html/text.erb +1 -1
  459. data/templates/default/docstring/html/todo.erb +6 -6
  460. data/templates/default/docstring/setup.rb +52 -52
  461. data/templates/default/docstring/text/abstract.erb +2 -2
  462. data/templates/default/docstring/text/deprecated.erb +2 -2
  463. data/templates/default/docstring/text/index.erb +2 -2
  464. data/templates/default/docstring/text/note.erb +3 -3
  465. data/templates/default/docstring/text/private.erb +2 -2
  466. data/templates/default/docstring/text/text.erb +1 -1
  467. data/templates/default/docstring/text/todo.erb +3 -3
  468. data/templates/default/fulldoc/html/css/full_list.css +58 -58
  469. data/templates/default/fulldoc/html/css/style.css +496 -496
  470. data/templates/default/fulldoc/html/frames.erb +17 -17
  471. data/templates/default/fulldoc/html/full_list.erb +37 -37
  472. data/templates/default/fulldoc/html/full_list_class.erb +2 -2
  473. data/templates/default/fulldoc/html/full_list_file.erb +7 -7
  474. data/templates/default/fulldoc/html/full_list_method.erb +10 -10
  475. data/templates/default/fulldoc/html/js/app.js +292 -292
  476. data/templates/default/fulldoc/html/js/full_list.js +216 -216
  477. data/templates/default/fulldoc/html/js/jquery.js +3 -3
  478. data/templates/default/fulldoc/html/setup.rb +241 -241
  479. data/templates/default/layout/dot/header.erb +5 -5
  480. data/templates/default/layout/dot/setup.rb +15 -15
  481. data/templates/default/layout/html/breadcrumb.erb +11 -11
  482. data/templates/default/layout/html/files.erb +11 -11
  483. data/templates/default/layout/html/footer.erb +5 -5
  484. data/templates/default/layout/html/headers.erb +15 -15
  485. data/templates/default/layout/html/index.erb +2 -2
  486. data/templates/default/layout/html/layout.erb +23 -23
  487. data/templates/default/layout/html/listing.erb +4 -4
  488. data/templates/default/layout/html/objects.erb +32 -32
  489. data/templates/default/layout/html/script_setup.erb +4 -4
  490. data/templates/default/layout/html/search.erb +12 -12
  491. data/templates/default/layout/html/setup.rb +89 -89
  492. data/templates/default/method/html/header.erb +16 -16
  493. data/templates/default/method/setup.rb +4 -4
  494. data/templates/default/method_details/html/header.erb +2 -2
  495. data/templates/default/method_details/html/method_signature.erb +24 -24
  496. data/templates/default/method_details/html/source.erb +9 -9
  497. data/templates/default/method_details/setup.rb +11 -11
  498. data/templates/default/method_details/text/header.erb +10 -10
  499. data/templates/default/method_details/text/method_signature.erb +12 -12
  500. data/templates/default/method_details/text/setup.rb +11 -11
  501. data/templates/default/module/dot/child.erb +1 -1
  502. data/templates/default/module/dot/dependencies.erb +2 -2
  503. data/templates/default/module/dot/header.erb +6 -6
  504. data/templates/default/module/dot/info.erb +13 -13
  505. data/templates/default/module/dot/setup.rb +15 -15
  506. data/templates/default/module/html/attribute_details.erb +10 -10
  507. data/templates/default/module/html/attribute_summary.erb +8 -8
  508. data/templates/default/module/html/box_info.erb +43 -43
  509. data/templates/default/module/html/children.erb +8 -8
  510. data/templates/default/module/html/constant_summary.erb +17 -17
  511. data/templates/default/module/html/defines.erb +2 -2
  512. data/templates/default/module/html/header.erb +5 -5
  513. data/templates/default/module/html/inherited_attributes.erb +14 -14
  514. data/templates/default/module/html/inherited_constants.erb +8 -8
  515. data/templates/default/module/html/inherited_methods.erb +18 -18
  516. data/templates/default/module/html/item_summary.erb +40 -40
  517. data/templates/default/module/html/method_details_list.erb +9 -9
  518. data/templates/default/module/html/method_summary.erb +13 -13
  519. data/templates/default/module/html/methodmissing.erb +12 -12
  520. data/templates/default/module/setup.rb +167 -167
  521. data/templates/default/module/text/children.erb +9 -9
  522. data/templates/default/module/text/class_meths_list.erb +7 -7
  523. data/templates/default/module/text/extends.erb +7 -7
  524. data/templates/default/module/text/header.erb +7 -7
  525. data/templates/default/module/text/includes.erb +7 -7
  526. data/templates/default/module/text/instance_meths_list.erb +7 -7
  527. data/templates/default/module/text/setup.rb +13 -13
  528. data/templates/default/onefile/html/files.erb +4 -4
  529. data/templates/default/onefile/html/headers.erb +6 -6
  530. data/templates/default/onefile/html/layout.erb +17 -17
  531. data/templates/default/onefile/html/readme.erb +2 -2
  532. data/templates/default/onefile/html/setup.rb +62 -62
  533. data/templates/default/root/dot/child.erb +2 -2
  534. data/templates/default/root/dot/setup.rb +6 -6
  535. data/templates/default/root/html/setup.rb +2 -2
  536. data/templates/default/tags/html/example.erb +10 -10
  537. data/templates/default/tags/html/index.erb +2 -2
  538. data/templates/default/tags/html/option.erb +24 -24
  539. data/templates/default/tags/html/overload.erb +13 -13
  540. data/templates/default/tags/html/see.erb +7 -7
  541. data/templates/default/tags/html/tag.erb +20 -20
  542. data/templates/default/tags/setup.rb +57 -57
  543. data/templates/default/tags/text/example.erb +12 -12
  544. data/templates/default/tags/text/index.erb +1 -1
  545. data/templates/default/tags/text/option.erb +20 -20
  546. data/templates/default/tags/text/overload.erb +19 -19
  547. data/templates/default/tags/text/see.erb +11 -11
  548. data/templates/default/tags/text/tag.erb +13 -13
  549. data/templates/guide/class/html/setup.rb +2 -2
  550. data/templates/guide/docstring/html/setup.rb +2 -2
  551. data/templates/guide/fulldoc/html/css/style.css +108 -108
  552. data/templates/guide/fulldoc/html/js/app.js +33 -33
  553. data/templates/guide/fulldoc/html/setup.rb +74 -74
  554. data/templates/guide/layout/html/layout.erb +81 -81
  555. data/templates/guide/layout/html/setup.rb +25 -25
  556. data/templates/guide/method/html/header.erb +17 -17
  557. data/templates/guide/method/html/setup.rb +22 -22
  558. data/templates/guide/module/html/header.erb +6 -6
  559. data/templates/guide/module/html/method_list.erb +4 -4
  560. data/templates/guide/module/html/setup.rb +27 -27
  561. data/templates/guide/onefile/html/files.erb +4 -4
  562. data/templates/guide/onefile/html/setup.rb +6 -6
  563. data/templates/guide/onefile/html/toc.erb +3 -3
  564. data/templates/guide/tags/html/setup.rb +9 -9
  565. data/yard.gemspec +43 -43
  566. metadata +4 -4
@@ -1,17 +1,17 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe YARD::Parser, "tag handling" do
4
- before { parse_file :tag_handler_001, __FILE__ }
5
-
6
- it "knows the list of all available tags" do
7
- expect(P("Foo#foo").tags).to include(P("Foo#foo").tag(:api))
8
- end
9
-
10
- it "knows the text of tags on a method" do
11
- expect(P("Foo#foo").tag(:api).text).to eq "public"
12
- end
13
-
14
- it "returns true when asked whether a tag exists" do
15
- expect(P("Foo#foo").has_tag?(:api)).to be true
16
- end
17
- end
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe YARD::Parser, "tag handling" do
4
+ before { parse_file :tag_handler_001, __FILE__ }
5
+
6
+ it "knows the list of all available tags" do
7
+ expect(P("Foo#foo").tags).to include(P("Foo#foo").tag(:api))
8
+ end
9
+
10
+ it "knows the text of tags on a method" do
11
+ expect(P("Foo#foo").tag(:api).text).to eq "public"
12
+ end
13
+
14
+ it "returns true when asked whether a tag exists" do
15
+ expect(P("Foo#foo").has_tag?(:api)).to be true
16
+ end
17
+ end
@@ -1,118 +1,118 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe YARD::Rake::YardocTask do
4
- before do
5
- @yardoc = YARD::CLI::Yardoc.new
6
- @yardoc.statistics = false
7
- @yardoc.use_document_file = false
8
- @yardoc.use_yardopts_file = false
9
- @yardoc.generate = false
10
- allow(Templates::Engine).to receive(:render)
11
- allow(Templates::Engine).to receive(:generate)
12
- allow(YARD).to receive(:parse)
13
- allow(Registry).to receive(:load)
14
- allow(Registry).to receive(:save)
15
- allow(YARD::CLI::Yardoc).to receive(:new).and_return(@yardoc)
16
- ::Rake.application.clear
17
- end
18
-
19
- def run
20
- ::Rake.application.tasks[0].invoke
21
- end
22
-
23
- describe "#initialize" do
24
- it "allows separate rake task name to be set" do
25
- YARD::Rake::YardocTask.new(:notyardoc)
26
- expect(::Rake.application.tasks[0].name).to eq "notyardoc"
27
- end
28
- end
29
-
30
- describe "#files" do
31
- it "allows files to be set" do
32
- YARD::Rake::YardocTask.new do |t|
33
- t.files = ['a', 'b', 'c']
34
- end
35
- run
36
- expect(@yardoc.files).to eq %w(a b c)
37
- end
38
- end
39
-
40
- describe "#options" do
41
- it "allows extra options to be set" do
42
- YARD::Rake::YardocTask.new do |t|
43
- t.options = ['--private', '--protected']
44
- end
45
- run
46
- expect(@yardoc.visibilities).to eq [:public, :private, :protected]
47
- end
48
-
49
- it "allows --api and --no-api" do
50
- YARD::Rake::YardocTask.new do |t|
51
- t.options = %w(--api public --no-api)
52
- end
53
- run
54
- expect(@yardoc.options.verifier.expressions).to include('["public"].include?(@api.text) || !@api')
55
- end
56
- end
57
-
58
- describe "#stats_options" do
59
- before do
60
- @yard_stats = Object.new
61
- allow(@yard_stats).to receive(:run)
62
- allow(YARD::CLI::Stats).to receive(:new).and_return(@yard_stats)
63
- end
64
-
65
- it "invokes stats" do
66
- expect(@yard_stats).to receive(:run).with('--list-undoc', '--use-cache')
67
- @yardoc.statistics = true
68
- YARD::Rake::YardocTask.new do |t|
69
- t.stats_options = %w(--list-undoc)
70
- end
71
- run
72
- expect(@yardoc.statistics).to be false
73
- end
74
- end
75
-
76
- describe "#before" do
77
- it "allows before callback" do
78
- proc = lambda {}
79
- expect(proc).to receive(:call)
80
- expect(@yardoc).to receive(:run)
81
- YARD::Rake::YardocTask.new {|t| t.before = proc }
82
- run
83
- end
84
- end
85
-
86
- describe "#after" do
87
- it "allows after callback" do
88
- proc = lambda {}
89
- expect(proc).to receive(:call)
90
- expect(@yardoc).to receive(:run)
91
- YARD::Rake::YardocTask.new {|t| t.after = proc }
92
- run
93
- end
94
- end
95
-
96
- describe "#verifier" do
97
- it "allows a verifier proc to be set" do
98
- verifier = Verifier.new
99
- expect(@yardoc).to receive(:run) do
100
- expect(@yardoc.options[:verifier]).to eq verifier
101
- end
102
- YARD::Rake::YardocTask.new {|t| t.verifier = verifier }
103
- run
104
- end
105
-
106
- it "overrides --query options" do
107
- verifier = Verifier.new
108
- expect(@yardoc).to receive(:run) do
109
- expect(@yardoc.options[:verifier]).to eq verifier
110
- end
111
- YARD::Rake::YardocTask.new do |t|
112
- t.options += ['--query', '@return']
113
- t.verifier = verifier
114
- end
115
- run
116
- end
117
- end
118
- end
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe YARD::Rake::YardocTask do
4
+ before do
5
+ @yardoc = YARD::CLI::Yardoc.new
6
+ @yardoc.statistics = false
7
+ @yardoc.use_document_file = false
8
+ @yardoc.use_yardopts_file = false
9
+ @yardoc.generate = false
10
+ allow(Templates::Engine).to receive(:render)
11
+ allow(Templates::Engine).to receive(:generate)
12
+ allow(YARD).to receive(:parse)
13
+ allow(Registry).to receive(:load)
14
+ allow(Registry).to receive(:save)
15
+ allow(YARD::CLI::Yardoc).to receive(:new).and_return(@yardoc)
16
+ ::Rake.application.clear
17
+ end
18
+
19
+ def run
20
+ ::Rake.application.tasks[0].invoke
21
+ end
22
+
23
+ describe "#initialize" do
24
+ it "allows separate rake task name to be set" do
25
+ YARD::Rake::YardocTask.new(:notyardoc)
26
+ expect(::Rake.application.tasks[0].name).to eq "notyardoc"
27
+ end
28
+ end
29
+
30
+ describe "#files" do
31
+ it "allows files to be set" do
32
+ YARD::Rake::YardocTask.new do |t|
33
+ t.files = ['a', 'b', 'c']
34
+ end
35
+ run
36
+ expect(@yardoc.files).to eq %w(a b c)
37
+ end
38
+ end
39
+
40
+ describe "#options" do
41
+ it "allows extra options to be set" do
42
+ YARD::Rake::YardocTask.new do |t|
43
+ t.options = ['--private', '--protected']
44
+ end
45
+ run
46
+ expect(@yardoc.visibilities).to eq [:public, :private, :protected]
47
+ end
48
+
49
+ it "allows --api and --no-api" do
50
+ YARD::Rake::YardocTask.new do |t|
51
+ t.options = %w(--api public --no-api)
52
+ end
53
+ run
54
+ expect(@yardoc.options.verifier.expressions).to include('["public"].include?(@api.text) || !@api')
55
+ end
56
+ end
57
+
58
+ describe "#stats_options" do
59
+ before do
60
+ @yard_stats = Object.new
61
+ allow(@yard_stats).to receive(:run)
62
+ allow(YARD::CLI::Stats).to receive(:new).and_return(@yard_stats)
63
+ end
64
+
65
+ it "invokes stats" do
66
+ expect(@yard_stats).to receive(:run).with('--list-undoc', '--use-cache')
67
+ @yardoc.statistics = true
68
+ YARD::Rake::YardocTask.new do |t|
69
+ t.stats_options = %w(--list-undoc)
70
+ end
71
+ run
72
+ expect(@yardoc.statistics).to be false
73
+ end
74
+ end
75
+
76
+ describe "#before" do
77
+ it "allows before callback" do
78
+ proc = lambda {}
79
+ expect(proc).to receive(:call)
80
+ expect(@yardoc).to receive(:run)
81
+ YARD::Rake::YardocTask.new {|t| t.before = proc }
82
+ run
83
+ end
84
+ end
85
+
86
+ describe "#after" do
87
+ it "allows after callback" do
88
+ proc = lambda {}
89
+ expect(proc).to receive(:call)
90
+ expect(@yardoc).to receive(:run)
91
+ YARD::Rake::YardocTask.new {|t| t.after = proc }
92
+ run
93
+ end
94
+ end
95
+
96
+ describe "#verifier" do
97
+ it "allows a verifier proc to be set" do
98
+ verifier = Verifier.new
99
+ expect(@yardoc).to receive(:run) do
100
+ expect(@yardoc.options[:verifier]).to eq verifier
101
+ end
102
+ YARD::Rake::YardocTask.new {|t| t.verifier = verifier }
103
+ run
104
+ end
105
+
106
+ it "overrides --query options" do
107
+ verifier = Verifier.new
108
+ expect(@yardoc).to receive(:run) do
109
+ expect(@yardoc.options[:verifier]).to eq verifier
110
+ end
111
+ YARD::Rake::YardocTask.new do |t|
112
+ t.options += ['--query', '@return']
113
+ t.verifier = verifier
114
+ end
115
+ run
116
+ end
117
+ end
118
+ end
@@ -1,463 +1,463 @@
1
- # frozen_string_literal: true
2
- include CodeObjects
3
-
4
- require "thread"
5
-
6
- RSpec.describe YARD::Registry do
7
- before { Registry.clear }
8
-
9
- describe ".yardoc_file_for_gem" do
10
- before do
11
- @gem = double('gem')
12
- allow(@gem).to receive(:name).and_return('foo')
13
- allow(@gem).to receive(:full_name).and_return('foo-1.0')
14
- allow(@gem).to receive(:full_gem_path).and_return('/path/to/foo')
15
- allow(@gem).to receive(:doc_dir).and_return('/path/to/foo/doc')
16
- allow(@gem).to receive(:doc_dir).with('.yardoc').and_return('/path/to/foo/doc/.yardoc')
17
- end
18
-
19
- it "returns nil if gem isn't found" do
20
- allow(YARD::GemIndex).to receive(:find_all_by_name).with('foo', '>= 0').and_return([])
21
- expect(Registry.yardoc_file_for_gem('foo')).to eq nil
22
- end
23
-
24
- it "allows version to be specified" do
25
- allow(YARD::GemIndex).to receive(:find_all_by_name).with('foo', '= 2').and_return([])
26
- expect(Registry.yardoc_file_for_gem('foo', '= 2')).to eq nil
27
- end
28
-
29
- it "returns existing .yardoc path for gem when for_writing=false" do
30
- allow(File).to receive(:exist?).twice.and_return(false)
31
- allow(File).to receive(:exist?).with('/path/to/foo/.yardoc').and_return(true)
32
- allow(YARD::GemIndex).to receive(:find_all_by_name).with('foo', '>= 0').and_return([@gem])
33
- expect(Registry.yardoc_file_for_gem('foo')).to eq '/path/to/foo/.yardoc'
34
- end
35
-
36
- it "returns new existing .yardoc path for gem when for_writing=false" do
37
- allow(File).to receive(:exist?).and_return(false)
38
- allow(File).to receive(:exist?).with('/path/to/foo/doc/.yardoc').and_return(true)
39
- allow(YARD::GemIndex).to receive(:find_all_by_name).with('foo', '>= 0').and_return([@gem])
40
- expect(Registry.yardoc_file_for_gem('foo')).to eq '/path/to/foo/doc/.yardoc'
41
- end
42
-
43
- it "returns nil if no .yardoc path exists in gem when for_writing=false" do
44
- allow(File).to receive(:exist?).twice.and_return(false)
45
- allow(File).to receive(:exist?).with('/path/to/foo/.yardoc').and_return(false)
46
- allow(YARD::GemIndex).to receive(:find_all_by_name).with('foo', '>= 0').and_return([@gem])
47
- expect(Registry.yardoc_file_for_gem('foo')).to eq nil
48
- end
49
-
50
- it "searches local gem path first if for_writing=false" do
51
- allow(File).to receive(:exist?).and_return(true)
52
- allow(YARD::GemIndex).to receive(:find_all_by_name).with('foo', '>= 0').and_return([@gem])
53
- expect(Registry.yardoc_file_for_gem('foo')).to match %r{/.yard/gem_index/foo-1.0.yardoc$}
54
- end
55
-
56
- it "returns global .yardoc path for gem if for_writing=true and dir is writable" do
57
- allow(File).to receive(:exist?).and_return(false)
58
- allow(File).to receive(:directory?).with(@gem.doc_dir).and_return(true)
59
- allow(File).to receive(:writable?).with(@gem.doc_dir).and_return(false)
60
- allow(File).to receive(:writable?).with(@gem.full_gem_path).and_return(true)
61
- allow(YARD::GemIndex).to receive(:find_all_by_name).with('foo', '>= 0').and_return([@gem])
62
- expect(Registry.yardoc_file_for_gem('foo', '>= 0', true)).to eq '/path/to/foo/.yardoc'
63
- end
64
-
65
- it "returns new global .yardoc path for gem if for_writing=true and dir is writable" do
66
- allow(File).to receive(:writable?).with(@gem.doc_dir).and_return(true)
67
- allow(YARD::GemIndex).to receive(:find_all_by_name).with('foo', '>= 0').and_return([@gem])
68
- expect(Registry.yardoc_file_for_gem('foo', '>= 0', true)).to eq '/path/to/foo/doc/.yardoc'
69
- end
70
-
71
- it "returns new global .yardoc path for gem if for_writing=true and parent dir is writable (but dir does not exist)" do
72
- allow(File).to receive(:writable?).with(@gem.doc_dir).and_return(false)
73
- allow(File).to receive(:directory?).with(@gem.doc_dir).and_return(false)
74
- allow(File).to receive(:writable?).with(File.dirname(@gem.doc_dir)).and_return(true)
75
- allow(YARD::GemIndex).to receive(:find_all_by_name).with('foo', '>= 0').and_return([@gem])
76
- expect(Registry.yardoc_file_for_gem('foo', '>= 0', true)).to eq '/path/to/foo/doc/.yardoc'
77
- end
78
-
79
- it "returns local .yardoc path for gem if for_writing=true and dir is not writable" do
80
- allow(File).to receive(:writable?).with(@gem.doc_dir).and_return(false)
81
- allow(File).to receive(:writable?).with(@gem.full_gem_path).and_return(false)
82
- allow(YARD::GemIndex).to receive(:find_all_by_name).with('foo', '>= 0').and_return([@gem])
83
- expect(Registry.yardoc_file_for_gem('foo', '>= 0', true)).to match %r{/.yard/gem_index/foo-1.0.yardoc$}
84
- end
85
-
86
- it "returns gem path if gem starts with yard-doc- and for_writing=false" do
87
- allow(@gem).to receive(:name).and_return('yard-doc-core')
88
- allow(@gem).to receive(:full_name).and_return('yard-doc-core-1.0')
89
- allow(@gem).to receive(:full_gem_path).and_return('/path/to/yard-doc-core')
90
- allow(YARD::GemIndex).to receive(:find_all_by_name).with('yard-doc-core', '>= 0').and_return([@gem])
91
- allow(File).to receive(:exist?).with('/path/to/yard-doc-core/.yardoc').and_return(true)
92
- expect(Registry.yardoc_file_for_gem('yard-doc-core')).to eq '/path/to/yard-doc-core/.yardoc'
93
- end
94
-
95
- it "returns nil if gem starts with yard-doc- and for_writing=true" do
96
- allow(@gem).to receive(:name).and_return('yard-doc-core')
97
- allow(@gem).to receive(:full_name).and_return('yard-doc-core-1.0')
98
- allow(@gem).to receive(:full_gem_path).and_return('/path/to/yard-doc-core')
99
- allow(YARD::GemIndex).to receive(:find_all_by_name).with('yard-doc-core', '>= 0').and_return([@gem])
100
- allow(File).to receive(:exist?).with('/path/to/yard-doc-core/.yardoc').and_return(true)
101
- expect(Registry.yardoc_file_for_gem('yard-doc-core', '>= 0', true)).to eq nil
102
- end
103
- end
104
-
105
- describe ".root" do
106
- it "has an empty path for root" do
107
- expect(Registry.root.path).to eq ""
108
- end
109
- end
110
-
111
- describe ".locale" do
112
- it "loads locale object" do
113
- fr_locale = I18n::Locale.new("fr")
114
- store = Registry.send(:thread_local_store)
115
- expect(store).to receive(:locale).with("fr").and_return(fr_locale)
116
- expect(Registry.locale("fr")).to eq fr_locale
117
- end
118
- end
119
-
120
- describe ".resolve" do
121
- it "resolves any existing namespace" do
122
- o1 = ModuleObject.new(:root, :A)
123
- o2 = ModuleObject.new(o1, :B)
124
- o3 = ModuleObject.new(o2, :C)
125
- expect(Registry.resolve(o1, "B::C")).to eq o3
126
- Registry.resolve(:root, "A::B::C")
127
- end
128
-
129
- it "resolves an object in the root namespace when prefixed with ::" do
130
- o1 = ModuleObject.new(:root, :A)
131
- o2 = ModuleObject.new(o1, :B)
132
- o3 = ModuleObject.new(o2, :C)
133
- expect(Registry.resolve(o3, "::A")).to eq o1
134
-
135
- expect(Registry.resolve(o3, "::String", false, true)).to eq P(:String)
136
- end
137
-
138
- it "resolves instance methods with # prefix" do
139
- o1 = ModuleObject.new(:root, :A)
140
- o2 = ModuleObject.new(o1, :B)
141
- o3 = ModuleObject.new(o2, :C)
142
- o4 = MethodObject.new(o3, :methname)
143
- expect(Registry.resolve(o1, "B::C#methname")).to eq o4
144
- expect(Registry.resolve(o2, "C#methname")).to eq o4
145
- expect(Registry.resolve(o3, "#methname")).to eq o4
146
- end
147
-
148
- it "resolves instance methods in the root without # prefix" do
149
- o = MethodObject.new(:root, :methname)
150
- expect(Registry.resolve(:root, 'methname')).to eq o
151
- end
152
-
153
- it "does lexical lookup on the initial namespace" do
154
- YARD.parse_string <<-eof
155
- module A
156
- module B; module C; end end
157
- module D; module E; end end
158
- end
159
- eof
160
-
161
- d = Registry.at('A::B::C')
162
- expect(Registry.resolve(d, 'D::E')).to eq Registry.at('A::D::E')
163
- end
164
-
165
- it "resolves superclass methods when inheritance = true" do
166
- superyard = ClassObject.new(:root, :SuperYard)
167
- yard = ClassObject.new(:root, :YARD)
168
- yard.superclass = superyard
169
- imeth = MethodObject.new(superyard, :hello)
170
- cmeth = MethodObject.new(superyard, :class_hello, :class)
171
-
172
- expect(Registry.resolve(yard, "#hello", false)).to be nil
173
- expect(Registry.resolve(yard, "#hello", true)).to eq imeth
174
- expect(Registry.resolve(yard, "class_hello", false)).to be nil
175
- expect(Registry.resolve(yard, "class_hello", true)).to eq cmeth
176
- end
177
-
178
- it "does not look at superclass proxies when inheritance = true" do
179
- YARD.parse_string "class A::B; end"
180
- expect(Registry.resolve(Registry.at('A::B'), "#bar", true)).to eq nil
181
- end
182
-
183
- it "resolves mixin methods when inheritance = true" do
184
- yard = ClassObject.new(:root, :YARD)
185
- mixin = ModuleObject.new(:root, :Mixin)
186
- yard.mixins(:instance) << mixin
187
- imeth = MethodObject.new(mixin, :hello)
188
- cmeth = MethodObject.new(mixin, :class_hello, :class)
189
-
190
- expect(Registry.resolve(yard, "#hello", false)).to be nil
191
- expect(Registry.resolve(yard, "#hello", true)).to eq imeth
192
- expect(Registry.resolve(yard, "class_hello", false)).to be nil
193
- expect(Registry.resolve(yard, "class_hello", true)).to eq cmeth
194
- end
195
-
196
- it "resolves methods in Object when inheritance = true" do
197
- YARD.parse_string <<-eof
198
- class Object; def foo; end end
199
- class A; end
200
- class MyObject < A; end
201
- eof
202
-
203
- expect(Registry.resolve(P('MyObject'), '#foo', true)).to eq P('Object#foo')
204
- end
205
-
206
- it "resolves methods in BasicObject when inheritance = true" do
207
- YARD.parse_string <<-eof
208
- class BasicObject; def foo; end end
209
- class A; end
210
- class MyObject < A; end
211
- eof
212
-
213
- expect(Registry.resolve(P('MyObject'), '#foo', true)).to eq P('BasicObject#foo')
214
- end
215
-
216
- it "does not perform lexical lookup to resolve a method object by more than one namespace" do
217
- YARD.parse_string <<-eof
218
- module A
219
- def foo; end
220
- def self.bar; end
221
- module B; module C; end end
222
- end
223
- eof
224
-
225
- expect(Registry.resolve(P('A::B::C'), '#foo', true)).to be nil
226
- expect(Registry.resolve(P('A::B::C'), '.bar', true)).to be nil
227
- expect(Registry.resolve(P('A::B'), '#foo', true)).not_to be nil
228
- expect(Registry.resolve(P('A::B'), '.bar', true)).not_to be nil
229
- end
230
-
231
- it "does not resolve methods in Object if inheriting BasicObject when inheritance = true" do
232
- YARD.parse_string <<-eof
233
- class Object; def foo; end end
234
- class MyObject < BasicObject; end
235
- eof
236
-
237
- expect(Registry.resolve(P('MyObject'), '#foo', true)).to be nil
238
- end
239
-
240
- it "performs lookups on each individual namespace when inheritance = true" do
241
- YARD.parse_string <<-eof
242
- module A
243
- module B; include A::D end
244
- module C; extend A::D end
245
- module D; def bar; end end
246
- end
247
- eof
248
-
249
- r = Registry.root
250
- expect(Registry.resolve(r, 'A::B#bar', true)).to eq Registry.at('A::D#bar')
251
- expect(Registry.resolve(r, 'A::C.bar', true)).to eq Registry.at('A::D#bar')
252
- end
253
-
254
- it "allows type=:typename to ensure resolved object is of a certain type" do
255
- YARD.parse_string "class Foo; end"
256
- expect(Registry.resolve(Registry.root, 'Foo')).to eq Registry.at('Foo')
257
- expect(Registry.resolve(Registry.root, 'Foo', false, false, :method)).to be nil
258
- end
259
-
260
- it "allows keep trying to find obj where type equals object type" do
261
- YARD.parse_string <<-eof
262
- module Foo
263
- class Bar; end
264
- def self.Bar; end
265
- end
266
- eof
267
- expect(Registry.resolve(P('Foo'), 'Bar', false, false, :class)).to eq Registry.at('Foo::Bar')
268
- expect(Registry.resolve(P('Foo'), 'Bar', false, false, :method)).to eq(
269
- Registry.at('Foo.Bar')
270
- )
271
- end
272
-
273
- it "returns proxy fallback with given type if supplied" do
274
- YARD.parse_string "module Foo; end"
275
- proxy = Registry.resolve(P('Foo'), 'Bar', false, true, :method)
276
- expect(proxy.type).to eq :method
277
- proxy = Registry.resolve(P('Qux'), 'Bar', false, true, :method)
278
- expect(proxy.type).to eq :method
279
- end
280
-
281
- it "does not return proxy on original namespace if path is anchored to root" do
282
- YARD.parse_string "module Foo; class Bar; def baz; end end end"
283
- proxy = Registry.resolve(P('Foo::Bar#baz'), '::Bar', true, true)
284
- expect(proxy.path).to eq('Bar')
285
- expect(proxy.namespace).to equal(Registry.root)
286
- expect(proxy.type).to eq(:proxy)
287
- end
288
-
289
- it "only checks 'Path' in lookup on root namespace" do
290
- expect(Registry).to receive(:at).once.with('Test').and_return(true)
291
- Registry.resolve(Registry.root, "Test")
292
- end
293
-
294
- it "does not perform lookup by joining namespace and name without separator" do
295
- yard = ClassObject.new(:root, :YARD)
296
- expect(Registry).not_to receive(:at).with('YARDB')
297
- Registry.resolve(yard, 'B')
298
- end
299
- end
300
-
301
- describe ".all" do
302
- it "returns objects of types specified by arguments" do
303
- ModuleObject.new(:root, :A)
304
- o1 = ClassObject.new(:root, :B)
305
- o2 = MethodObject.new(:root, :testing)
306
- r = Registry.all(:method, :class)
307
- expect(r).to include(o1, o2)
308
- end
309
-
310
- it "returns code objects" do
311
- o1 = ModuleObject.new(:root, :A)
312
- o2 = ClassObject.new(:root, :B)
313
- MethodObject.new(:root, :testing)
314
- r = Registry.all.select {|t| NamespaceObject === t }
315
- expect(r).to include(o1, o2)
316
- end
317
-
318
- it "allows .all to omit list" do
319
- o1 = ModuleObject.new(:root, :A)
320
- o2 = ClassObject.new(:root, :B)
321
- r = Registry.all
322
- expect(r).to include(o1, o2)
323
- end
324
- end
325
-
326
- describe ".paths" do
327
- it "returns all object paths" do
328
- ModuleObject.new(:root, :A)
329
- ClassObject.new(:root, :B)
330
- expect(Registry.paths).to include('A', 'B')
331
- end
332
- end
333
-
334
- describe ".load_yardoc" do
335
- it "delegates load to RegistryStore" do
336
- store = RegistryStore.new
337
- expect(store).to receive(:load).with('foo')
338
- expect(RegistryStore).to receive(:new).and_return(store)
339
- Registry.yardoc_file = 'foo'
340
- Registry.load_yardoc
341
- end
342
-
343
- it "returns itself" do
344
- expect(Registry.load_yardoc).to eq Registry
345
- end
346
-
347
- it "maintains hash key equality on loaded objects" do
348
- Registry.clear
349
- Registry.load!(File.dirname(__FILE__) + '/serializers/data/serialized_yardoc')
350
- baz = Registry.at('Foo#baz')
351
- expect(Registry.at('Foo').aliases.keys).to include(baz)
352
- expect(Registry.at('Foo').aliases.key?(baz)).to be true
353
- end
354
- end
355
-
356
- ['load', 'load_all', 'load!'].each do |meth|
357
- describe('.' + meth) do
358
- it "returns itself" do
359
- expect(Registry.send(meth)).to eq Registry
360
- end
361
- end
362
- end
363
-
364
- describe ".each" do
365
- before do
366
- YARD.parse_string "def a; end; def b; end; def c; end"
367
- end
368
-
369
- after { Registry.clear }
370
-
371
- it "iterates over .all" do
372
- items = []
373
- Registry.each {|x| items << x.path }
374
- expect(items.sort).to eq ['#a', '#b', '#c']
375
- end
376
-
377
- it "includes Enumerable and allow for find, select" do
378
- expect(Registry.find {|x| x.path == "#a" }).to be_a(CodeObjects::MethodObject)
379
- end
380
- end
381
-
382
- describe ".instance" do
383
- it "returns itself" do
384
- expect(Registry.instance).to eq Registry
385
- end
386
- end
387
-
388
- describe ".single_object_db" do
389
- it "defaults to nil" do
390
- expect(Registry.single_object_db).to eq nil
391
- Thread.new { expect(Registry.single_object_db).to eq nil }.join
392
- end
393
- end
394
-
395
- describe "Thread local" do
396
- it "maintains two Registries in separate threads" do
397
- barrier = 0
398
- mutex = Mutex.new
399
- threads = []
400
- threads << Thread.new do
401
- Registry.clear
402
- YARD.parse_string "# docstring 1\nclass Foo; end"
403
- mutex.synchronize { barrier += 1 }
404
- "barrier < 2, spinning" while barrier < 2
405
- expect(Registry.at('Foo').docstring).to eq "docstring 1"
406
- end
407
- threads << Thread.new do
408
- Registry.clear
409
- YARD.parse_string "# docstring 2\nclass Foo; end"
410
- mutex.synchronize { barrier += 1 }
411
- "barrier < 2, spinning" while barrier < 2
412
- expect(Registry.at('Foo').docstring).to eq "docstring 2"
413
- end
414
- threads.each(&:join)
415
- end
416
-
417
- it "allows setting of yardoc_file in separate threads" do
418
- barrier = 0
419
- mutex = Mutex.new
420
- threads = []
421
- threads << Thread.new do
422
- expect(Registry.yardoc_file).to eq '.yardoc'
423
- Registry.yardoc_file = 'foo'
424
- mutex.synchronize { barrier += 1 }
425
- "barrier = 1, spinning" while barrier == 1
426
- expect(Registry.yardoc_file).to eq 'foo'
427
- end
428
- threads << Thread.new do
429
- "barrier = 0, spinning" while barrier == 0
430
- expect(Registry.yardoc_file).to eq '.yardoc'
431
- mutex.synchronize { barrier += 1 }
432
- Registry.yardoc_file = 'foo2'
433
- end
434
- threads.each(&:join)
435
- Registry.yardoc_file = Registry::DEFAULT_YARDOC_FILE
436
- end
437
-
438
- it "automatically clears in new threads" do
439
- Thread.new { expect(Registry.all).to be_empty }.join
440
- end
441
-
442
- it "allows setting of po_dir in separate threads" do
443
- barrier = 0
444
- mutex = Mutex.new
445
- threads = []
446
- threads << Thread.new do
447
- expect(Registry.po_dir).to eq 'po'
448
- Registry.po_dir = 'locale'
449
- mutex.synchronize { barrier += 1 }
450
- "barrier = 1, spinning" while barrier == 1
451
- expect(Registry.po_dir).to eq 'locale'
452
- end
453
- threads << Thread.new do
454
- "barrier = 0, spinning" while barrier == 0
455
- expect(Registry.po_dir).to eq 'po'
456
- mutex.synchronize { barrier += 1 }
457
- Registry.po_dir = '.'
458
- end
459
- threads.each(&:join)
460
- Registry.po_dir = Registry::DEFAULT_PO_DIR
461
- end
462
- end
463
- end
1
+ # frozen_string_literal: true
2
+ include CodeObjects
3
+
4
+ require "thread"
5
+
6
+ RSpec.describe YARD::Registry do
7
+ before { Registry.clear }
8
+
9
+ describe ".yardoc_file_for_gem" do
10
+ before do
11
+ @gem = double('gem')
12
+ allow(@gem).to receive(:name).and_return('foo')
13
+ allow(@gem).to receive(:full_name).and_return('foo-1.0')
14
+ allow(@gem).to receive(:full_gem_path).and_return('/path/to/foo')
15
+ allow(@gem).to receive(:doc_dir).and_return('/path/to/foo/doc')
16
+ allow(@gem).to receive(:doc_dir).with('.yardoc').and_return('/path/to/foo/doc/.yardoc')
17
+ end
18
+
19
+ it "returns nil if gem isn't found" do
20
+ allow(YARD::GemIndex).to receive(:find_all_by_name).with('foo', '>= 0').and_return([])
21
+ expect(Registry.yardoc_file_for_gem('foo')).to eq nil
22
+ end
23
+
24
+ it "allows version to be specified" do
25
+ allow(YARD::GemIndex).to receive(:find_all_by_name).with('foo', '= 2').and_return([])
26
+ expect(Registry.yardoc_file_for_gem('foo', '= 2')).to eq nil
27
+ end
28
+
29
+ it "returns existing .yardoc path for gem when for_writing=false" do
30
+ allow(File).to receive(:exist?).twice.and_return(false)
31
+ allow(File).to receive(:exist?).with('/path/to/foo/.yardoc').and_return(true)
32
+ allow(YARD::GemIndex).to receive(:find_all_by_name).with('foo', '>= 0').and_return([@gem])
33
+ expect(Registry.yardoc_file_for_gem('foo')).to eq '/path/to/foo/.yardoc'
34
+ end
35
+
36
+ it "returns new existing .yardoc path for gem when for_writing=false" do
37
+ allow(File).to receive(:exist?).and_return(false)
38
+ allow(File).to receive(:exist?).with('/path/to/foo/doc/.yardoc').and_return(true)
39
+ allow(YARD::GemIndex).to receive(:find_all_by_name).with('foo', '>= 0').and_return([@gem])
40
+ expect(Registry.yardoc_file_for_gem('foo')).to eq '/path/to/foo/doc/.yardoc'
41
+ end
42
+
43
+ it "returns nil if no .yardoc path exists in gem when for_writing=false" do
44
+ allow(File).to receive(:exist?).twice.and_return(false)
45
+ allow(File).to receive(:exist?).with('/path/to/foo/.yardoc').and_return(false)
46
+ allow(YARD::GemIndex).to receive(:find_all_by_name).with('foo', '>= 0').and_return([@gem])
47
+ expect(Registry.yardoc_file_for_gem('foo')).to eq nil
48
+ end
49
+
50
+ it "searches local gem path first if for_writing=false" do
51
+ allow(File).to receive(:exist?).and_return(true)
52
+ allow(YARD::GemIndex).to receive(:find_all_by_name).with('foo', '>= 0').and_return([@gem])
53
+ expect(Registry.yardoc_file_for_gem('foo')).to match %r{/.yard/gem_index/foo-1.0.yardoc$}
54
+ end
55
+
56
+ it "returns global .yardoc path for gem if for_writing=true and dir is writable" do
57
+ allow(File).to receive(:exist?).and_return(false)
58
+ allow(File).to receive(:directory?).with(@gem.doc_dir).and_return(true)
59
+ allow(File).to receive(:writable?).with(@gem.doc_dir).and_return(false)
60
+ allow(File).to receive(:writable?).with(@gem.full_gem_path).and_return(true)
61
+ allow(YARD::GemIndex).to receive(:find_all_by_name).with('foo', '>= 0').and_return([@gem])
62
+ expect(Registry.yardoc_file_for_gem('foo', '>= 0', true)).to eq '/path/to/foo/.yardoc'
63
+ end
64
+
65
+ it "returns new global .yardoc path for gem if for_writing=true and dir is writable" do
66
+ allow(File).to receive(:writable?).with(@gem.doc_dir).and_return(true)
67
+ allow(YARD::GemIndex).to receive(:find_all_by_name).with('foo', '>= 0').and_return([@gem])
68
+ expect(Registry.yardoc_file_for_gem('foo', '>= 0', true)).to eq '/path/to/foo/doc/.yardoc'
69
+ end
70
+
71
+ it "returns new global .yardoc path for gem if for_writing=true and parent dir is writable (but dir does not exist)" do
72
+ allow(File).to receive(:writable?).with(@gem.doc_dir).and_return(false)
73
+ allow(File).to receive(:directory?).with(@gem.doc_dir).and_return(false)
74
+ allow(File).to receive(:writable?).with(File.dirname(@gem.doc_dir)).and_return(true)
75
+ allow(YARD::GemIndex).to receive(:find_all_by_name).with('foo', '>= 0').and_return([@gem])
76
+ expect(Registry.yardoc_file_for_gem('foo', '>= 0', true)).to eq '/path/to/foo/doc/.yardoc'
77
+ end
78
+
79
+ it "returns local .yardoc path for gem if for_writing=true and dir is not writable" do
80
+ allow(File).to receive(:writable?).with(@gem.doc_dir).and_return(false)
81
+ allow(File).to receive(:writable?).with(@gem.full_gem_path).and_return(false)
82
+ allow(YARD::GemIndex).to receive(:find_all_by_name).with('foo', '>= 0').and_return([@gem])
83
+ expect(Registry.yardoc_file_for_gem('foo', '>= 0', true)).to match %r{/.yard/gem_index/foo-1.0.yardoc$}
84
+ end
85
+
86
+ it "returns gem path if gem starts with yard-doc- and for_writing=false" do
87
+ allow(@gem).to receive(:name).and_return('yard-doc-core')
88
+ allow(@gem).to receive(:full_name).and_return('yard-doc-core-1.0')
89
+ allow(@gem).to receive(:full_gem_path).and_return('/path/to/yard-doc-core')
90
+ allow(YARD::GemIndex).to receive(:find_all_by_name).with('yard-doc-core', '>= 0').and_return([@gem])
91
+ allow(File).to receive(:exist?).with('/path/to/yard-doc-core/.yardoc').and_return(true)
92
+ expect(Registry.yardoc_file_for_gem('yard-doc-core')).to eq '/path/to/yard-doc-core/.yardoc'
93
+ end
94
+
95
+ it "returns nil if gem starts with yard-doc- and for_writing=true" do
96
+ allow(@gem).to receive(:name).and_return('yard-doc-core')
97
+ allow(@gem).to receive(:full_name).and_return('yard-doc-core-1.0')
98
+ allow(@gem).to receive(:full_gem_path).and_return('/path/to/yard-doc-core')
99
+ allow(YARD::GemIndex).to receive(:find_all_by_name).with('yard-doc-core', '>= 0').and_return([@gem])
100
+ allow(File).to receive(:exist?).with('/path/to/yard-doc-core/.yardoc').and_return(true)
101
+ expect(Registry.yardoc_file_for_gem('yard-doc-core', '>= 0', true)).to eq nil
102
+ end
103
+ end
104
+
105
+ describe ".root" do
106
+ it "has an empty path for root" do
107
+ expect(Registry.root.path).to eq ""
108
+ end
109
+ end
110
+
111
+ describe ".locale" do
112
+ it "loads locale object" do
113
+ fr_locale = I18n::Locale.new("fr")
114
+ store = Registry.send(:thread_local_store)
115
+ expect(store).to receive(:locale).with("fr").and_return(fr_locale)
116
+ expect(Registry.locale("fr")).to eq fr_locale
117
+ end
118
+ end
119
+
120
+ describe ".resolve" do
121
+ it "resolves any existing namespace" do
122
+ o1 = ModuleObject.new(:root, :A)
123
+ o2 = ModuleObject.new(o1, :B)
124
+ o3 = ModuleObject.new(o2, :C)
125
+ expect(Registry.resolve(o1, "B::C")).to eq o3
126
+ Registry.resolve(:root, "A::B::C")
127
+ end
128
+
129
+ it "resolves an object in the root namespace when prefixed with ::" do
130
+ o1 = ModuleObject.new(:root, :A)
131
+ o2 = ModuleObject.new(o1, :B)
132
+ o3 = ModuleObject.new(o2, :C)
133
+ expect(Registry.resolve(o3, "::A")).to eq o1
134
+
135
+ expect(Registry.resolve(o3, "::String", false, true)).to eq P(:String)
136
+ end
137
+
138
+ it "resolves instance methods with # prefix" do
139
+ o1 = ModuleObject.new(:root, :A)
140
+ o2 = ModuleObject.new(o1, :B)
141
+ o3 = ModuleObject.new(o2, :C)
142
+ o4 = MethodObject.new(o3, :methname)
143
+ expect(Registry.resolve(o1, "B::C#methname")).to eq o4
144
+ expect(Registry.resolve(o2, "C#methname")).to eq o4
145
+ expect(Registry.resolve(o3, "#methname")).to eq o4
146
+ end
147
+
148
+ it "resolves instance methods in the root without # prefix" do
149
+ o = MethodObject.new(:root, :methname)
150
+ expect(Registry.resolve(:root, 'methname')).to eq o
151
+ end
152
+
153
+ it "does lexical lookup on the initial namespace" do
154
+ YARD.parse_string <<-eof
155
+ module A
156
+ module B; module C; end end
157
+ module D; module E; end end
158
+ end
159
+ eof
160
+
161
+ d = Registry.at('A::B::C')
162
+ expect(Registry.resolve(d, 'D::E')).to eq Registry.at('A::D::E')
163
+ end
164
+
165
+ it "resolves superclass methods when inheritance = true" do
166
+ superyard = ClassObject.new(:root, :SuperYard)
167
+ yard = ClassObject.new(:root, :YARD)
168
+ yard.superclass = superyard
169
+ imeth = MethodObject.new(superyard, :hello)
170
+ cmeth = MethodObject.new(superyard, :class_hello, :class)
171
+
172
+ expect(Registry.resolve(yard, "#hello", false)).to be nil
173
+ expect(Registry.resolve(yard, "#hello", true)).to eq imeth
174
+ expect(Registry.resolve(yard, "class_hello", false)).to be nil
175
+ expect(Registry.resolve(yard, "class_hello", true)).to eq cmeth
176
+ end
177
+
178
+ it "does not look at superclass proxies when inheritance = true" do
179
+ YARD.parse_string "class A::B; end"
180
+ expect(Registry.resolve(Registry.at('A::B'), "#bar", true)).to eq nil
181
+ end
182
+
183
+ it "resolves mixin methods when inheritance = true" do
184
+ yard = ClassObject.new(:root, :YARD)
185
+ mixin = ModuleObject.new(:root, :Mixin)
186
+ yard.mixins(:instance) << mixin
187
+ imeth = MethodObject.new(mixin, :hello)
188
+ cmeth = MethodObject.new(mixin, :class_hello, :class)
189
+
190
+ expect(Registry.resolve(yard, "#hello", false)).to be nil
191
+ expect(Registry.resolve(yard, "#hello", true)).to eq imeth
192
+ expect(Registry.resolve(yard, "class_hello", false)).to be nil
193
+ expect(Registry.resolve(yard, "class_hello", true)).to eq cmeth
194
+ end
195
+
196
+ it "resolves methods in Object when inheritance = true" do
197
+ YARD.parse_string <<-eof
198
+ class Object; def foo; end end
199
+ class A; end
200
+ class MyObject < A; end
201
+ eof
202
+
203
+ expect(Registry.resolve(P('MyObject'), '#foo', true)).to eq P('Object#foo')
204
+ end
205
+
206
+ it "resolves methods in BasicObject when inheritance = true" do
207
+ YARD.parse_string <<-eof
208
+ class BasicObject; def foo; end end
209
+ class A; end
210
+ class MyObject < A; end
211
+ eof
212
+
213
+ expect(Registry.resolve(P('MyObject'), '#foo', true)).to eq P('BasicObject#foo')
214
+ end
215
+
216
+ it "does not perform lexical lookup to resolve a method object by more than one namespace" do
217
+ YARD.parse_string <<-eof
218
+ module A
219
+ def foo; end
220
+ def self.bar; end
221
+ module B; module C; end end
222
+ end
223
+ eof
224
+
225
+ expect(Registry.resolve(P('A::B::C'), '#foo', true)).to be nil
226
+ expect(Registry.resolve(P('A::B::C'), '.bar', true)).to be nil
227
+ expect(Registry.resolve(P('A::B'), '#foo', true)).not_to be nil
228
+ expect(Registry.resolve(P('A::B'), '.bar', true)).not_to be nil
229
+ end
230
+
231
+ it "does not resolve methods in Object if inheriting BasicObject when inheritance = true" do
232
+ YARD.parse_string <<-eof
233
+ class Object; def foo; end end
234
+ class MyObject < BasicObject; end
235
+ eof
236
+
237
+ expect(Registry.resolve(P('MyObject'), '#foo', true)).to be nil
238
+ end
239
+
240
+ it "performs lookups on each individual namespace when inheritance = true" do
241
+ YARD.parse_string <<-eof
242
+ module A
243
+ module B; include A::D end
244
+ module C; extend A::D end
245
+ module D; def bar; end end
246
+ end
247
+ eof
248
+
249
+ r = Registry.root
250
+ expect(Registry.resolve(r, 'A::B#bar', true)).to eq Registry.at('A::D#bar')
251
+ expect(Registry.resolve(r, 'A::C.bar', true)).to eq Registry.at('A::D#bar')
252
+ end
253
+
254
+ it "allows type=:typename to ensure resolved object is of a certain type" do
255
+ YARD.parse_string "class Foo; end"
256
+ expect(Registry.resolve(Registry.root, 'Foo')).to eq Registry.at('Foo')
257
+ expect(Registry.resolve(Registry.root, 'Foo', false, false, :method)).to be nil
258
+ end
259
+
260
+ it "allows keep trying to find obj where type equals object type" do
261
+ YARD.parse_string <<-eof
262
+ module Foo
263
+ class Bar; end
264
+ def self.Bar; end
265
+ end
266
+ eof
267
+ expect(Registry.resolve(P('Foo'), 'Bar', false, false, :class)).to eq Registry.at('Foo::Bar')
268
+ expect(Registry.resolve(P('Foo'), 'Bar', false, false, :method)).to eq(
269
+ Registry.at('Foo.Bar')
270
+ )
271
+ end
272
+
273
+ it "returns proxy fallback with given type if supplied" do
274
+ YARD.parse_string "module Foo; end"
275
+ proxy = Registry.resolve(P('Foo'), 'Bar', false, true, :method)
276
+ expect(proxy.type).to eq :method
277
+ proxy = Registry.resolve(P('Qux'), 'Bar', false, true, :method)
278
+ expect(proxy.type).to eq :method
279
+ end
280
+
281
+ it "does not return proxy on original namespace if path is anchored to root" do
282
+ YARD.parse_string "module Foo; class Bar; def baz; end end end"
283
+ proxy = Registry.resolve(P('Foo::Bar#baz'), '::Bar', true, true)
284
+ expect(proxy.path).to eq('Bar')
285
+ expect(proxy.namespace).to equal(Registry.root)
286
+ expect(proxy.type).to eq(:proxy)
287
+ end
288
+
289
+ it "only checks 'Path' in lookup on root namespace" do
290
+ expect(Registry).to receive(:at).once.with('Test').and_return(true)
291
+ Registry.resolve(Registry.root, "Test")
292
+ end
293
+
294
+ it "does not perform lookup by joining namespace and name without separator" do
295
+ yard = ClassObject.new(:root, :YARD)
296
+ expect(Registry).not_to receive(:at).with('YARDB')
297
+ Registry.resolve(yard, 'B')
298
+ end
299
+ end
300
+
301
+ describe ".all" do
302
+ it "returns objects of types specified by arguments" do
303
+ ModuleObject.new(:root, :A)
304
+ o1 = ClassObject.new(:root, :B)
305
+ o2 = MethodObject.new(:root, :testing)
306
+ r = Registry.all(:method, :class)
307
+ expect(r).to include(o1, o2)
308
+ end
309
+
310
+ it "returns code objects" do
311
+ o1 = ModuleObject.new(:root, :A)
312
+ o2 = ClassObject.new(:root, :B)
313
+ MethodObject.new(:root, :testing)
314
+ r = Registry.all.select {|t| NamespaceObject === t }
315
+ expect(r).to include(o1, o2)
316
+ end
317
+
318
+ it "allows .all to omit list" do
319
+ o1 = ModuleObject.new(:root, :A)
320
+ o2 = ClassObject.new(:root, :B)
321
+ r = Registry.all
322
+ expect(r).to include(o1, o2)
323
+ end
324
+ end
325
+
326
+ describe ".paths" do
327
+ it "returns all object paths" do
328
+ ModuleObject.new(:root, :A)
329
+ ClassObject.new(:root, :B)
330
+ expect(Registry.paths).to include('A', 'B')
331
+ end
332
+ end
333
+
334
+ describe ".load_yardoc" do
335
+ it "delegates load to RegistryStore" do
336
+ store = RegistryStore.new
337
+ expect(store).to receive(:load).with('foo')
338
+ expect(RegistryStore).to receive(:new).and_return(store)
339
+ Registry.yardoc_file = 'foo'
340
+ Registry.load_yardoc
341
+ end
342
+
343
+ it "returns itself" do
344
+ expect(Registry.load_yardoc).to eq Registry
345
+ end
346
+
347
+ it "maintains hash key equality on loaded objects" do
348
+ Registry.clear
349
+ Registry.load!(File.dirname(__FILE__) + '/serializers/data/serialized_yardoc')
350
+ baz = Registry.at('Foo#baz')
351
+ expect(Registry.at('Foo').aliases.keys).to include(baz)
352
+ expect(Registry.at('Foo').aliases.key?(baz)).to be true
353
+ end
354
+ end
355
+
356
+ ['load', 'load_all', 'load!'].each do |meth|
357
+ describe('.' + meth) do
358
+ it "returns itself" do
359
+ expect(Registry.send(meth)).to eq Registry
360
+ end
361
+ end
362
+ end
363
+
364
+ describe ".each" do
365
+ before do
366
+ YARD.parse_string "def a; end; def b; end; def c; end"
367
+ end
368
+
369
+ after { Registry.clear }
370
+
371
+ it "iterates over .all" do
372
+ items = []
373
+ Registry.each {|x| items << x.path }
374
+ expect(items.sort).to eq ['#a', '#b', '#c']
375
+ end
376
+
377
+ it "includes Enumerable and allow for find, select" do
378
+ expect(Registry.find {|x| x.path == "#a" }).to be_a(CodeObjects::MethodObject)
379
+ end
380
+ end
381
+
382
+ describe ".instance" do
383
+ it "returns itself" do
384
+ expect(Registry.instance).to eq Registry
385
+ end
386
+ end
387
+
388
+ describe ".single_object_db" do
389
+ it "defaults to nil" do
390
+ expect(Registry.single_object_db).to eq nil
391
+ Thread.new { expect(Registry.single_object_db).to eq nil }.join
392
+ end
393
+ end
394
+
395
+ describe "Thread local" do
396
+ it "maintains two Registries in separate threads" do
397
+ barrier = 0
398
+ mutex = Mutex.new
399
+ threads = []
400
+ threads << Thread.new do
401
+ Registry.clear
402
+ YARD.parse_string "# docstring 1\nclass Foo; end"
403
+ mutex.synchronize { barrier += 1 }
404
+ "barrier < 2, spinning" while barrier < 2
405
+ expect(Registry.at('Foo').docstring).to eq "docstring 1"
406
+ end
407
+ threads << Thread.new do
408
+ Registry.clear
409
+ YARD.parse_string "# docstring 2\nclass Foo; end"
410
+ mutex.synchronize { barrier += 1 }
411
+ "barrier < 2, spinning" while barrier < 2
412
+ expect(Registry.at('Foo').docstring).to eq "docstring 2"
413
+ end
414
+ threads.each(&:join)
415
+ end
416
+
417
+ it "allows setting of yardoc_file in separate threads" do
418
+ barrier = 0
419
+ mutex = Mutex.new
420
+ threads = []
421
+ threads << Thread.new do
422
+ expect(Registry.yardoc_file).to eq '.yardoc'
423
+ Registry.yardoc_file = 'foo'
424
+ mutex.synchronize { barrier += 1 }
425
+ "barrier = 1, spinning" while barrier == 1
426
+ expect(Registry.yardoc_file).to eq 'foo'
427
+ end
428
+ threads << Thread.new do
429
+ "barrier = 0, spinning" while barrier == 0
430
+ expect(Registry.yardoc_file).to eq '.yardoc'
431
+ mutex.synchronize { barrier += 1 }
432
+ Registry.yardoc_file = 'foo2'
433
+ end
434
+ threads.each(&:join)
435
+ Registry.yardoc_file = Registry::DEFAULT_YARDOC_FILE
436
+ end
437
+
438
+ it "automatically clears in new threads" do
439
+ Thread.new { expect(Registry.all).to be_empty }.join
440
+ end
441
+
442
+ it "allows setting of po_dir in separate threads" do
443
+ barrier = 0
444
+ mutex = Mutex.new
445
+ threads = []
446
+ threads << Thread.new do
447
+ expect(Registry.po_dir).to eq 'po'
448
+ Registry.po_dir = 'locale'
449
+ mutex.synchronize { barrier += 1 }
450
+ "barrier = 1, spinning" while barrier == 1
451
+ expect(Registry.po_dir).to eq 'locale'
452
+ end
453
+ threads << Thread.new do
454
+ "barrier = 0, spinning" while barrier == 0
455
+ expect(Registry.po_dir).to eq 'po'
456
+ mutex.synchronize { barrier += 1 }
457
+ Registry.po_dir = '.'
458
+ end
459
+ threads.each(&:join)
460
+ Registry.po_dir = Registry::DEFAULT_PO_DIR
461
+ end
462
+ end
463
+ end