yard 0.9.18 → 0.9.19

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 (567) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +26 -26
  3. data/CHANGELOG.md +742 -728
  4. data/LEGAL +66 -66
  5. data/LICENSE +22 -22
  6. data/README.md +328 -328
  7. data/Rakefile +42 -53
  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 +308 -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 +789 -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 -615
  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 +134 -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 +11 -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 -386
  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 +212 -211
  95. data/lib/yard/handlers/c/init_handler.rb +20 -20
  96. data/lib/yard/handlers/c/method_handler.rb +45 -45
  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/common/method_handler.rb +19 -0
  104. data/lib/yard/handlers/processor.rb +200 -200
  105. data/lib/yard/handlers/ruby/alias_handler.rb +44 -44
  106. data/lib/yard/handlers/ruby/attribute_handler.rb +87 -87
  107. data/lib/yard/handlers/ruby/base.rb +165 -165
  108. data/lib/yard/handlers/ruby/class_condition_handler.rb +92 -92
  109. data/lib/yard/handlers/ruby/class_handler.rb +119 -119
  110. data/lib/yard/handlers/ruby/class_variable_handler.rb +17 -17
  111. data/lib/yard/handlers/ruby/comment_handler.rb +10 -10
  112. data/lib/yard/handlers/ruby/constant_handler.rb +59 -59
  113. data/lib/yard/handlers/ruby/decorator_handler_methods.rb +123 -123
  114. data/lib/yard/handlers/ruby/dsl_handler.rb +15 -15
  115. data/lib/yard/handlers/ruby/dsl_handler_methods.rb +96 -96
  116. data/lib/yard/handlers/ruby/exception_handler.rb +27 -27
  117. data/lib/yard/handlers/ruby/extend_handler.rb +22 -22
  118. data/lib/yard/handlers/ruby/legacy/alias_handler.rb +37 -37
  119. data/lib/yard/handlers/ruby/legacy/attribute_handler.rb +65 -65
  120. data/lib/yard/handlers/ruby/legacy/base.rb +245 -245
  121. data/lib/yard/handlers/ruby/legacy/class_condition_handler.rb +83 -83
  122. data/lib/yard/handlers/ruby/legacy/class_handler.rb +113 -113
  123. data/lib/yard/handlers/ruby/legacy/class_variable_handler.rb +15 -15
  124. data/lib/yard/handlers/ruby/legacy/comment_handler.rb +10 -10
  125. data/lib/yard/handlers/ruby/legacy/constant_handler.rb +29 -29
  126. data/lib/yard/handlers/ruby/legacy/dsl_handler.rb +17 -17
  127. data/lib/yard/handlers/ruby/legacy/exception_handler.rb +13 -13
  128. data/lib/yard/handlers/ruby/legacy/extend_handler.rb +21 -21
  129. data/lib/yard/handlers/ruby/legacy/method_handler.rb +90 -90
  130. data/lib/yard/handlers/ruby/legacy/mixin_handler.rb +39 -39
  131. data/lib/yard/handlers/ruby/legacy/module_function_handler.rb +19 -19
  132. data/lib/yard/handlers/ruby/legacy/module_handler.rb +12 -12
  133. data/lib/yard/handlers/ruby/legacy/private_class_method_handler.rb +22 -22
  134. data/lib/yard/handlers/ruby/legacy/private_constant_handler.rb +22 -22
  135. data/lib/yard/handlers/ruby/legacy/visibility_handler.rb +17 -17
  136. data/lib/yard/handlers/ruby/legacy/yield_handler.rb +29 -29
  137. data/lib/yard/handlers/ruby/method_condition_handler.rb +9 -9
  138. data/lib/yard/handlers/ruby/method_handler.rb +114 -118
  139. data/lib/yard/handlers/ruby/mixin_handler.rb +37 -37
  140. data/lib/yard/handlers/ruby/module_function_handler.rb +27 -27
  141. data/lib/yard/handlers/ruby/module_handler.rb +12 -12
  142. data/lib/yard/handlers/ruby/private_class_method_handler.rb +14 -14
  143. data/lib/yard/handlers/ruby/private_constant_handler.rb +43 -43
  144. data/lib/yard/handlers/ruby/public_class_method_handler.rb +14 -14
  145. data/lib/yard/handlers/ruby/struct_handler_methods.rb +143 -143
  146. data/lib/yard/handlers/ruby/visibility_handler.rb +22 -22
  147. data/lib/yard/handlers/ruby/yield_handler.rb +31 -31
  148. data/lib/yard/i18n/locale.rb +67 -67
  149. data/lib/yard/i18n/message.rb +57 -57
  150. data/lib/yard/i18n/messages.rb +56 -56
  151. data/lib/yard/i18n/po_parser.rb +61 -61
  152. data/lib/yard/i18n/pot_generator.rb +290 -290
  153. data/lib/yard/i18n/text.rb +173 -173
  154. data/lib/yard/logging.rb +205 -205
  155. data/lib/yard/options.rb +217 -217
  156. data/lib/yard/parser/base.rb +57 -57
  157. data/lib/yard/parser/c/c_parser.rb +235 -235
  158. data/lib/yard/parser/c/comment_parser.rb +134 -134
  159. data/lib/yard/parser/c/statement.rb +64 -64
  160. data/lib/yard/parser/ruby/ast_node.rb +540 -540
  161. data/lib/yard/parser/ruby/legacy/ruby_lex.rb +1354 -1354
  162. data/lib/yard/parser/ruby/legacy/ruby_parser.rb +32 -32
  163. data/lib/yard/parser/ruby/legacy/statement.rb +66 -66
  164. data/lib/yard/parser/ruby/legacy/statement_list.rb +394 -394
  165. data/lib/yard/parser/ruby/legacy/token_list.rb +74 -74
  166. data/lib/yard/parser/ruby/ruby_parser.rb +687 -687
  167. data/lib/yard/parser/ruby/token_resolver.rb +156 -156
  168. data/lib/yard/parser/source_parser.rb +526 -526
  169. data/lib/yard/rake/yardoc_task.rb +81 -81
  170. data/lib/yard/registry.rb +439 -439
  171. data/lib/yard/registry_resolver.rb +189 -189
  172. data/lib/yard/registry_store.rb +337 -337
  173. data/lib/yard/rubygems/backports.rb +10 -10
  174. data/lib/yard/rubygems/backports/LICENSE.txt +57 -57
  175. data/lib/yard/rubygems/backports/MIT.txt +20 -20
  176. data/lib/yard/rubygems/backports/gem.rb +10 -10
  177. data/lib/yard/rubygems/backports/source_index.rb +365 -365
  178. data/lib/yard/rubygems/doc_manager.rb +90 -90
  179. data/lib/yard/rubygems/hook.rb +197 -197
  180. data/lib/yard/rubygems/specification.rb +50 -50
  181. data/lib/yard/serializers/base.rb +83 -83
  182. data/lib/yard/serializers/file_system_serializer.rb +123 -123
  183. data/lib/yard/serializers/process_serializer.rb +24 -24
  184. data/lib/yard/serializers/stdout_serializer.rb +34 -34
  185. data/lib/yard/serializers/yardoc_serializer.rb +152 -152
  186. data/lib/yard/server.rb +13 -13
  187. data/lib/yard/server/adapter.rb +100 -100
  188. data/lib/yard/server/commands/base.rb +209 -209
  189. data/lib/yard/server/commands/display_file_command.rb +29 -29
  190. data/lib/yard/server/commands/display_object_command.rb +65 -65
  191. data/lib/yard/server/commands/frames_command.rb +16 -16
  192. data/lib/yard/server/commands/library_command.rb +187 -187
  193. data/lib/yard/server/commands/library_index_command.rb +28 -28
  194. data/lib/yard/server/commands/list_command.rb +25 -25
  195. data/lib/yard/server/commands/root_request_command.rb +15 -15
  196. data/lib/yard/server/commands/search_command.rb +79 -79
  197. data/lib/yard/server/commands/static_file_command.rb +23 -23
  198. data/lib/yard/server/commands/static_file_helpers.rb +62 -62
  199. data/lib/yard/server/doc_server_helper.rb +91 -91
  200. data/lib/yard/server/doc_server_serializer.rb +39 -39
  201. data/lib/yard/server/library_version.rb +277 -277
  202. data/lib/yard/server/rack_adapter.rb +89 -89
  203. data/lib/yard/server/router.rb +187 -187
  204. data/lib/yard/server/static_caching.rb +46 -46
  205. data/lib/yard/server/templates/default/fulldoc/html/css/custom.css +127 -127
  206. data/lib/yard/server/templates/default/fulldoc/html/js/autocomplete.js +11 -11
  207. data/lib/yard/server/templates/default/layout/html/breadcrumb.erb +37 -37
  208. data/lib/yard/server/templates/default/layout/html/script_setup.erb +7 -7
  209. data/lib/yard/server/templates/default/layout/html/setup.rb +8 -8
  210. data/lib/yard/server/templates/default/method_details/html/permalink.erb +4 -4
  211. data/lib/yard/server/templates/default/method_details/html/setup.rb +5 -5
  212. data/lib/yard/server/templates/doc_server/library_list/html/headers.erb +8 -8
  213. data/lib/yard/server/templates/doc_server/library_list/html/library_list.erb +14 -14
  214. data/lib/yard/server/templates/doc_server/library_list/html/listing.erb +13 -13
  215. data/lib/yard/server/templates/doc_server/library_list/html/setup.rb +6 -6
  216. data/lib/yard/server/templates/doc_server/library_list/html/title.erb +2 -2
  217. data/lib/yard/server/templates/doc_server/processing/html/processing.erb +52 -52
  218. data/lib/yard/server/templates/doc_server/processing/html/setup.rb +4 -4
  219. data/lib/yard/server/templates/doc_server/search/html/search.erb +18 -18
  220. data/lib/yard/server/templates/doc_server/search/html/setup.rb +9 -9
  221. data/lib/yard/server/webrick_adapter.rb +45 -45
  222. data/lib/yard/tags/default_factory.rb +191 -191
  223. data/lib/yard/tags/default_tag.rb +13 -13
  224. data/lib/yard/tags/directives.rb +616 -616
  225. data/lib/yard/tags/library.rb +633 -633
  226. data/lib/yard/tags/option_tag.rb +13 -13
  227. data/lib/yard/tags/overload_tag.rb +71 -71
  228. data/lib/yard/tags/ref_tag.rb +8 -8
  229. data/lib/yard/tags/ref_tag_list.rb +28 -28
  230. data/lib/yard/tags/tag.rb +71 -71
  231. data/lib/yard/tags/tag_format_error.rb +7 -7
  232. data/lib/yard/tags/types_explainer.rb +162 -162
  233. data/lib/yard/templates/engine.rb +186 -186
  234. data/lib/yard/templates/erb_cache.rb +23 -23
  235. data/lib/yard/templates/helpers/base_helper.rb +215 -215
  236. data/lib/yard/templates/helpers/filter_helper.rb +27 -27
  237. data/lib/yard/templates/helpers/html_helper.rb +646 -646
  238. data/lib/yard/templates/helpers/html_syntax_highlight_helper.rb +78 -78
  239. data/lib/yard/templates/helpers/markup/rdoc_markdown.rb +23 -23
  240. data/lib/yard/templates/helpers/markup/rdoc_markup.rb +109 -109
  241. data/lib/yard/templates/helpers/markup_helper.rb +172 -172
  242. data/lib/yard/templates/helpers/method_helper.rb +75 -75
  243. data/lib/yard/templates/helpers/module_helper.rb +21 -21
  244. data/lib/yard/templates/helpers/text_helper.rb +112 -112
  245. data/lib/yard/templates/helpers/uml_helper.rb +47 -47
  246. data/lib/yard/templates/section.rb +105 -105
  247. data/lib/yard/templates/template.rb +418 -418
  248. data/lib/yard/templates/template_options.rb +92 -92
  249. data/lib/yard/verifier.rb +151 -151
  250. data/lib/yard/version.rb +6 -6
  251. data/spec/cli/command_parser_spec.rb +43 -43
  252. data/spec/cli/command_spec.rb +36 -36
  253. data/spec/cli/config_spec.rb +148 -148
  254. data/spec/cli/diff_spec.rb +254 -254
  255. data/spec/cli/display_spec.rb +30 -30
  256. data/spec/cli/gems_spec.rb +81 -81
  257. data/spec/cli/graph_spec.rb +18 -18
  258. data/spec/cli/help_spec.rb +22 -22
  259. data/spec/cli/i18n_spec.rb +107 -107
  260. data/spec/cli/list_spec.rb +8 -8
  261. data/spec/cli/markup_types_spec.rb +22 -22
  262. data/spec/cli/server_spec.rb +324 -324
  263. data/spec/cli/stats_spec.rb +96 -96
  264. data/spec/cli/yard_on_yard_spec.rb +38 -38
  265. data/spec/cli/yardoc_spec.rb +896 -862
  266. data/spec/cli/yri_spec.rb +101 -101
  267. data/spec/code_objects/base_spec.rb +470 -470
  268. data/spec/code_objects/class_object_spec.rb +226 -226
  269. data/spec/code_objects/code_object_list_spec.rb +36 -36
  270. data/spec/code_objects/constants_spec.rb +116 -116
  271. data/spec/code_objects/extra_file_object_spec.rb +160 -160
  272. data/spec/code_objects/macro_object_spec.rb +150 -150
  273. data/spec/code_objects/method_object_spec.rb +184 -184
  274. data/spec/code_objects/module_object_spec.rb +142 -142
  275. data/spec/code_objects/namespace_object_spec.rb +171 -171
  276. data/spec/code_objects/proxy_spec.rb +141 -141
  277. data/spec/code_objects/spec_helper.rb +3 -3
  278. data/spec/config_spec.rb +171 -171
  279. data/spec/core_ext/array_spec.rb +13 -13
  280. data/spec/core_ext/file_spec.rb +72 -72
  281. data/spec/core_ext/hash_spec.rb +14 -14
  282. data/spec/core_ext/insertion_spec.rb +37 -37
  283. data/spec/core_ext/module_spec.rb +9 -15
  284. data/spec/core_ext/string_spec.rb +42 -42
  285. data/spec/core_ext/symbol_hash_spec.rb +89 -89
  286. data/spec/docstring_parser_spec.rb +280 -280
  287. data/spec/docstring_spec.rb +373 -373
  288. data/spec/examples.txt +1883 -1875
  289. data/spec/handlers/alias_handler_spec.rb +82 -82
  290. data/spec/handlers/attribute_handler_spec.rb +96 -96
  291. data/spec/handlers/base_spec.rb +216 -216
  292. data/spec/handlers/c/alias_handler_spec.rb +34 -34
  293. data/spec/handlers/c/attribute_handler_spec.rb +41 -41
  294. data/spec/handlers/c/class_handler_spec.rb +78 -78
  295. data/spec/handlers/c/constant_handler_spec.rb +71 -71
  296. data/spec/handlers/c/init_handler_spec.rb +48 -48
  297. data/spec/handlers/c/method_handler_spec.rb +327 -325
  298. data/spec/handlers/c/mixin_handler_spec.rb +44 -44
  299. data/spec/handlers/c/module_handler_spec.rb +71 -71
  300. data/spec/handlers/c/override_comment_handler_spec.rb +47 -47
  301. data/spec/handlers/c/path_handler_spec.rb +36 -36
  302. data/spec/handlers/c/spec_helper.rb +23 -23
  303. data/spec/handlers/c/struct_handler_spec.rb +16 -16
  304. data/spec/handlers/class_condition_handler_spec.rb +87 -87
  305. data/spec/handlers/class_handler_spec.rb +247 -247
  306. data/spec/handlers/class_method_handler_shared_examples.rb +133 -133
  307. data/spec/handlers/class_variable_handler_spec.rb +12 -12
  308. data/spec/handlers/constant_handler_spec.rb +112 -112
  309. data/spec/handlers/decorator_handler_methods_spec.rb +393 -393
  310. data/spec/handlers/dsl_handler_spec.rb +219 -219
  311. data/spec/handlers/examples/alias_handler_001.rb.txt +45 -45
  312. data/spec/handlers/examples/attribute_handler_001.rb.txt +31 -31
  313. data/spec/handlers/examples/class_condition_handler_001.rb.txt +68 -68
  314. data/spec/handlers/examples/class_handler_001.rb.txt +120 -120
  315. data/spec/handlers/examples/class_variable_handler_001.rb.txt +9 -9
  316. data/spec/handlers/examples/constant_handler_001.rb.txt +35 -35
  317. data/spec/handlers/examples/dsl_handler_001.rb.txt +154 -154
  318. data/spec/handlers/examples/exception_handler_001.rb.txt +58 -58
  319. data/spec/handlers/examples/extend_handler_001.rb.txt +15 -15
  320. data/spec/handlers/examples/method_condition_handler_001.rb.txt +9 -9
  321. data/spec/handlers/examples/method_handler_001.rb.txt +128 -128
  322. data/spec/handlers/examples/mixin_handler_001.rb.txt +37 -37
  323. data/spec/handlers/examples/module_handler_001.rb.txt +29 -29
  324. data/spec/handlers/examples/private_constant_handler_001.rb.txt +8 -8
  325. data/spec/handlers/examples/process_handler_001.rb.txt +11 -11
  326. data/spec/handlers/examples/visibility_handler_001.rb.txt +35 -35
  327. data/spec/handlers/examples/yield_handler_001.rb.txt +54 -54
  328. data/spec/handlers/exception_handler_spec.rb +49 -49
  329. data/spec/handlers/extend_handler_spec.rb +24 -24
  330. data/spec/handlers/legacy_base_spec.rb +128 -128
  331. data/spec/handlers/method_condition_handler_spec.rb +15 -15
  332. data/spec/handlers/method_handler_spec.rb +190 -190
  333. data/spec/handlers/mixin_handler_spec.rb +56 -56
  334. data/spec/handlers/module_function_handler_spec.rb +106 -106
  335. data/spec/handlers/module_handler_spec.rb +35 -35
  336. data/spec/handlers/private_class_method_handler_spec.rb +11 -11
  337. data/spec/handlers/private_constant_handler_spec.rb +25 -25
  338. data/spec/handlers/processor_spec.rb +35 -35
  339. data/spec/handlers/public_class_method_handler_spec.rb +11 -11
  340. data/spec/handlers/ruby/base_spec.rb +95 -95
  341. data/spec/handlers/ruby/legacy/base_spec.rb +84 -84
  342. data/spec/handlers/spec_helper.rb +33 -33
  343. data/spec/handlers/visibility_handler_spec.rb +44 -44
  344. data/spec/handlers/yield_handler_spec.rb +52 -52
  345. data/spec/i18n/locale_spec.rb +81 -81
  346. data/spec/i18n/message_spec.rb +52 -52
  347. data/spec/i18n/messages_spec.rb +67 -67
  348. data/spec/i18n/pot_generator_spec.rb +295 -295
  349. data/spec/i18n/text_spec.rb +184 -184
  350. data/spec/logging_spec.rb +44 -44
  351. data/spec/options_spec.rb +171 -171
  352. data/spec/parser/base_spec.rb +24 -24
  353. data/spec/parser/c_parser_spec.rb +236 -236
  354. data/spec/parser/examples/array.c.txt +6267 -6267
  355. data/spec/parser/examples/example1.rb.txt +7 -7
  356. data/spec/parser/examples/extrafile.c.txt +8 -8
  357. data/spec/parser/examples/file.c.txt +28 -28
  358. data/spec/parser/examples/multifile.c.txt +22 -22
  359. data/spec/parser/examples/namespace.cpp.txt +68 -68
  360. data/spec/parser/examples/override.c.txt +424 -424
  361. data/spec/parser/examples/parse_in_order_001.rb.txt +2 -2
  362. data/spec/parser/examples/parse_in_order_002.rb.txt +1 -1
  363. data/spec/parser/examples/tag_handler_001.rb.txt +7 -7
  364. data/spec/parser/ruby/ast_node_spec.rb +33 -33
  365. data/spec/parser/ruby/legacy/statement_list_spec.rb +299 -299
  366. data/spec/parser/ruby/legacy/token_list_spec.rb +79 -79
  367. data/spec/parser/ruby/ruby_parser_spec.rb +508 -508
  368. data/spec/parser/ruby/token_resolver_spec.rb +165 -165
  369. data/spec/parser/source_parser_spec.rb +727 -727
  370. data/spec/parser/tag_parsing_spec.rb +17 -17
  371. data/spec/rake/yardoc_task_spec.rb +118 -118
  372. data/spec/registry_spec.rb +463 -463
  373. data/spec/registry_store_spec.rb +316 -316
  374. data/spec/rubygems/doc_manager_spec.rb +112 -112
  375. data/spec/serializers/data/serialized_yardoc/checksums +1 -1
  376. data/spec/serializers/file_system_serializer_spec.rb +145 -145
  377. data/spec/serializers/spec_helper.rb +2 -2
  378. data/spec/serializers/yardoc_serializer_spec.rb +78 -78
  379. data/spec/server/adapter_spec.rb +39 -39
  380. data/spec/server/commands/base_spec.rb +91 -91
  381. data/spec/server/commands/library_command_spec.rb +39 -39
  382. data/spec/server/doc_server_helper_spec.rb +72 -72
  383. data/spec/server/doc_server_serializer_spec.rb +60 -60
  384. data/spec/server/rack_adapter_spec.rb +21 -21
  385. data/spec/server/router_spec.rb +123 -123
  386. data/spec/server/spec_helper.rb +22 -22
  387. data/spec/server/static_caching_spec.rb +47 -47
  388. data/spec/server/webrick_servlet_spec.rb +20 -20
  389. data/spec/server_spec.rb +19 -19
  390. data/spec/spec_helper.rb +212 -212
  391. data/spec/tags/default_factory_spec.rb +168 -168
  392. data/spec/tags/default_tag_spec.rb +11 -11
  393. data/spec/tags/directives_spec.rb +463 -463
  394. data/spec/tags/library_spec.rb +48 -48
  395. data/spec/tags/overload_tag_spec.rb +53 -53
  396. data/spec/tags/ref_tag_list_spec.rb +53 -53
  397. data/spec/tags/types_explainer_spec.rb +203 -203
  398. data/spec/templates/class_spec.rb +45 -45
  399. data/spec/templates/constant_spec.rb +41 -41
  400. data/spec/templates/engine_spec.rb +131 -131
  401. data/spec/templates/examples/class001.html +308 -308
  402. data/spec/templates/examples/class001.txt +36 -36
  403. data/spec/templates/examples/class002.html +39 -39
  404. data/spec/templates/examples/constant001.txt +24 -24
  405. data/spec/templates/examples/constant002.txt +6 -6
  406. data/spec/templates/examples/constant003.txt +10 -10
  407. data/spec/templates/examples/method001.html +137 -137
  408. data/spec/templates/examples/method001.txt +35 -35
  409. data/spec/templates/examples/method002.html +91 -91
  410. data/spec/templates/examples/method002.txt +20 -20
  411. data/spec/templates/examples/method003.html +165 -165
  412. data/spec/templates/examples/method003.txt +45 -45
  413. data/spec/templates/examples/method004.html +48 -48
  414. data/spec/templates/examples/method004.txt +10 -10
  415. data/spec/templates/examples/method005.html +105 -105
  416. data/spec/templates/examples/method005.txt +33 -33
  417. data/spec/templates/examples/method006.html +107 -107
  418. data/spec/templates/examples/method006.txt +20 -20
  419. data/spec/templates/examples/module001.dot +33 -33
  420. data/spec/templates/examples/module001.html +833 -833
  421. data/spec/templates/examples/module001.txt +33 -33
  422. data/spec/templates/examples/module002.html +341 -341
  423. data/spec/templates/examples/module003.html +202 -202
  424. data/spec/templates/examples/module004.html +394 -394
  425. data/spec/templates/examples/module005.html +81 -81
  426. data/spec/templates/examples/tag001.txt +82 -82
  427. data/spec/templates/helpers/base_helper_spec.rb +171 -171
  428. data/spec/templates/helpers/html_helper_spec.rb +687 -668
  429. data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +65 -65
  430. data/spec/templates/helpers/markup/rdoc_markup_spec.rb +84 -84
  431. data/spec/templates/helpers/markup_helper_spec.rb +136 -136
  432. data/spec/templates/helpers/method_helper_spec.rb +107 -107
  433. data/spec/templates/helpers/module_helper_spec.rb +35 -35
  434. data/spec/templates/helpers/shared_signature_examples.rb +126 -126
  435. data/spec/templates/helpers/text_helper_spec.rb +65 -65
  436. data/spec/templates/method_spec.rb +118 -118
  437. data/spec/templates/module_spec.rb +203 -203
  438. data/spec/templates/onefile_spec.rb +66 -66
  439. data/spec/templates/section_spec.rb +144 -144
  440. data/spec/templates/spec_helper.rb +76 -76
  441. data/spec/templates/tag_spec.rb +52 -52
  442. data/spec/templates/template_spec.rb +410 -410
  443. data/spec/verifier_spec.rb +106 -106
  444. data/templates/default/class/dot/setup.rb +7 -7
  445. data/templates/default/class/dot/superklass.erb +2 -2
  446. data/templates/default/class/html/constructor_details.erb +8 -8
  447. data/templates/default/class/html/setup.rb +2 -2
  448. data/templates/default/class/html/subclasses.erb +4 -4
  449. data/templates/default/class/setup.rb +36 -36
  450. data/templates/default/class/text/setup.rb +12 -12
  451. data/templates/default/class/text/subclasses.erb +5 -5
  452. data/templates/default/constant/text/header.erb +11 -11
  453. data/templates/default/constant/text/setup.rb +4 -4
  454. data/templates/default/docstring/html/abstract.erb +4 -4
  455. data/templates/default/docstring/html/deprecated.erb +1 -1
  456. data/templates/default/docstring/html/index.erb +5 -5
  457. data/templates/default/docstring/html/note.erb +6 -6
  458. data/templates/default/docstring/html/private.erb +4 -4
  459. data/templates/default/docstring/html/text.erb +1 -1
  460. data/templates/default/docstring/html/todo.erb +6 -6
  461. data/templates/default/docstring/setup.rb +52 -52
  462. data/templates/default/docstring/text/abstract.erb +2 -2
  463. data/templates/default/docstring/text/deprecated.erb +2 -2
  464. data/templates/default/docstring/text/index.erb +2 -2
  465. data/templates/default/docstring/text/note.erb +3 -3
  466. data/templates/default/docstring/text/private.erb +2 -2
  467. data/templates/default/docstring/text/text.erb +1 -1
  468. data/templates/default/docstring/text/todo.erb +3 -3
  469. data/templates/default/fulldoc/html/css/full_list.css +58 -58
  470. data/templates/default/fulldoc/html/css/style.css +496 -496
  471. data/templates/default/fulldoc/html/frames.erb +17 -17
  472. data/templates/default/fulldoc/html/full_list.erb +37 -37
  473. data/templates/default/fulldoc/html/full_list_class.erb +2 -2
  474. data/templates/default/fulldoc/html/full_list_file.erb +7 -7
  475. data/templates/default/fulldoc/html/full_list_method.erb +10 -10
  476. data/templates/default/fulldoc/html/js/app.js +303 -292
  477. data/templates/default/fulldoc/html/js/full_list.js +216 -216
  478. data/templates/default/fulldoc/html/js/jquery.js +3 -3
  479. data/templates/default/fulldoc/html/setup.rb +241 -241
  480. data/templates/default/layout/dot/header.erb +5 -5
  481. data/templates/default/layout/dot/setup.rb +15 -15
  482. data/templates/default/layout/html/breadcrumb.erb +11 -11
  483. data/templates/default/layout/html/files.erb +11 -11
  484. data/templates/default/layout/html/footer.erb +5 -5
  485. data/templates/default/layout/html/headers.erb +15 -15
  486. data/templates/default/layout/html/index.erb +2 -2
  487. data/templates/default/layout/html/layout.erb +23 -23
  488. data/templates/default/layout/html/listing.erb +4 -4
  489. data/templates/default/layout/html/objects.erb +32 -32
  490. data/templates/default/layout/html/script_setup.erb +4 -4
  491. data/templates/default/layout/html/search.erb +12 -12
  492. data/templates/default/layout/html/setup.rb +89 -89
  493. data/templates/default/method/html/header.erb +16 -16
  494. data/templates/default/method/setup.rb +4 -4
  495. data/templates/default/method_details/html/header.erb +2 -2
  496. data/templates/default/method_details/html/method_signature.erb +24 -24
  497. data/templates/default/method_details/html/source.erb +9 -9
  498. data/templates/default/method_details/setup.rb +11 -11
  499. data/templates/default/method_details/text/header.erb +10 -10
  500. data/templates/default/method_details/text/method_signature.erb +12 -12
  501. data/templates/default/method_details/text/setup.rb +11 -11
  502. data/templates/default/module/dot/child.erb +1 -1
  503. data/templates/default/module/dot/dependencies.erb +2 -2
  504. data/templates/default/module/dot/header.erb +6 -6
  505. data/templates/default/module/dot/info.erb +13 -13
  506. data/templates/default/module/dot/setup.rb +15 -15
  507. data/templates/default/module/html/attribute_details.erb +10 -10
  508. data/templates/default/module/html/attribute_summary.erb +8 -8
  509. data/templates/default/module/html/box_info.erb +43 -43
  510. data/templates/default/module/html/children.erb +8 -8
  511. data/templates/default/module/html/constant_summary.erb +17 -17
  512. data/templates/default/module/html/defines.erb +2 -2
  513. data/templates/default/module/html/header.erb +5 -5
  514. data/templates/default/module/html/inherited_attributes.erb +14 -14
  515. data/templates/default/module/html/inherited_constants.erb +8 -8
  516. data/templates/default/module/html/inherited_methods.erb +18 -18
  517. data/templates/default/module/html/item_summary.erb +40 -40
  518. data/templates/default/module/html/method_details_list.erb +9 -9
  519. data/templates/default/module/html/method_summary.erb +13 -13
  520. data/templates/default/module/html/methodmissing.erb +12 -12
  521. data/templates/default/module/setup.rb +167 -167
  522. data/templates/default/module/text/children.erb +9 -9
  523. data/templates/default/module/text/class_meths_list.erb +7 -7
  524. data/templates/default/module/text/extends.erb +7 -7
  525. data/templates/default/module/text/header.erb +7 -7
  526. data/templates/default/module/text/includes.erb +7 -7
  527. data/templates/default/module/text/instance_meths_list.erb +7 -7
  528. data/templates/default/module/text/setup.rb +13 -13
  529. data/templates/default/onefile/html/files.erb +4 -4
  530. data/templates/default/onefile/html/headers.erb +6 -6
  531. data/templates/default/onefile/html/layout.erb +17 -17
  532. data/templates/default/onefile/html/readme.erb +2 -2
  533. data/templates/default/onefile/html/setup.rb +62 -62
  534. data/templates/default/root/dot/child.erb +2 -2
  535. data/templates/default/root/dot/setup.rb +6 -6
  536. data/templates/default/root/html/setup.rb +2 -2
  537. data/templates/default/tags/html/example.erb +10 -10
  538. data/templates/default/tags/html/index.erb +2 -2
  539. data/templates/default/tags/html/option.erb +24 -24
  540. data/templates/default/tags/html/overload.erb +13 -13
  541. data/templates/default/tags/html/see.erb +7 -7
  542. data/templates/default/tags/html/tag.erb +20 -20
  543. data/templates/default/tags/setup.rb +57 -57
  544. data/templates/default/tags/text/example.erb +12 -12
  545. data/templates/default/tags/text/index.erb +1 -1
  546. data/templates/default/tags/text/option.erb +20 -20
  547. data/templates/default/tags/text/overload.erb +19 -19
  548. data/templates/default/tags/text/see.erb +11 -11
  549. data/templates/default/tags/text/tag.erb +13 -13
  550. data/templates/guide/class/html/setup.rb +2 -2
  551. data/templates/guide/docstring/html/setup.rb +2 -2
  552. data/templates/guide/fulldoc/html/css/style.css +108 -108
  553. data/templates/guide/fulldoc/html/js/app.js +33 -33
  554. data/templates/guide/fulldoc/html/setup.rb +74 -74
  555. data/templates/guide/layout/html/layout.erb +81 -81
  556. data/templates/guide/layout/html/setup.rb +25 -25
  557. data/templates/guide/method/html/header.erb +17 -17
  558. data/templates/guide/method/html/setup.rb +22 -22
  559. data/templates/guide/module/html/header.erb +6 -6
  560. data/templates/guide/module/html/method_list.erb +4 -4
  561. data/templates/guide/module/html/setup.rb +27 -27
  562. data/templates/guide/onefile/html/files.erb +4 -4
  563. data/templates/guide/onefile/html/setup.rb +6 -6
  564. data/templates/guide/onefile/html/toc.erb +3 -3
  565. data/templates/guide/tags/html/setup.rb +9 -9
  566. data/yard.gemspec +43 -43
  567. metadata +4 -3
@@ -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