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,81 +1,81 @@
1
- # frozen_string_literal: true
2
- require 'rake'
3
- require 'rake/tasklib'
4
-
5
- module YARD
6
- module Rake
7
- # The rake task to run {CLI::Yardoc} and generate documentation.
8
- class YardocTask < ::Rake::TaskLib
9
- # The name of the task
10
- # @return [String] the task name
11
- attr_accessor :name
12
-
13
- # Options to pass to {CLI::Yardoc}
14
- # @return [Array<String>] the options passed to the commandline utility
15
- attr_accessor :options
16
-
17
- # Options to pass to {CLI::Stats}
18
- # @return [Array<String>] the options passed to the stats utility
19
- attr_accessor :stats_options
20
-
21
- # The Ruby source files (and any extra documentation files separated by '-')
22
- # to process.
23
- # @example Task files assignment
24
- # YARD::Rake::YardocTask.new do |t|
25
- # t.files = ['app/**/*.rb', 'lib/**/*.rb', '-', 'doc/FAQ.md', 'doc/Changes.md']
26
- # end
27
- # @return [Array<String>] a list of files
28
- attr_accessor :files
29
-
30
- # Runs a +Proc+ before the task
31
- # @return [Proc] a proc to call before running the task
32
- attr_accessor :before
33
-
34
- # Runs a +Proc+ after the task
35
- # @return [Proc] a proc to call after running the task
36
- attr_accessor :after
37
-
38
- # @return [Verifier, Proc] an optional {Verifier} to run against all objects
39
- # being generated. Any object that the verifier returns false for will be
40
- # excluded from documentation. This attribute can also be a lambda.
41
- # @see Verifier
42
- attr_accessor :verifier
43
-
44
- # Creates a new task with name +name+.
45
- #
46
- # @param [String, Symbol] name the name of the rake task
47
- # @yield a block to allow any options to be modified on the task
48
- # @yieldparam [YardocTask] _self the task object to allow any parameters
49
- # to be changed.
50
- def initialize(name = :yard)
51
- @name = name
52
- @options = []
53
- @stats_options = []
54
- @files = []
55
-
56
- yield self if block_given?
57
- self.options += ENV['OPTS'].split(/[ ,]/) if ENV['OPTS']
58
- self.files += ENV['FILES'].split(/[ ,]/) if ENV['FILES']
59
- self.options << '--no-stats' unless stats_options.empty?
60
-
61
- define
62
- end
63
-
64
- protected
65
-
66
- # Defines the rake task
67
- # @return [void]
68
- def define
69
- desc "Generate YARD Documentation" unless ::Rake.application.last_description
70
- task(name) do
71
- before.call if before.is_a?(Proc)
72
- yardoc = YARD::CLI::Yardoc.new
73
- yardoc.options[:verifier] = verifier if verifier
74
- yardoc.run(*(options + files))
75
- YARD::CLI::Stats.run(*(stats_options + ['--use-cache'])) unless stats_options.empty?
76
- after.call if after.is_a?(Proc)
77
- end
78
- end
79
- end
80
- end
81
- end
1
+ # frozen_string_literal: true
2
+ require 'rake'
3
+ require 'rake/tasklib'
4
+
5
+ module YARD
6
+ module Rake
7
+ # The rake task to run {CLI::Yardoc} and generate documentation.
8
+ class YardocTask < ::Rake::TaskLib
9
+ # The name of the task
10
+ # @return [String] the task name
11
+ attr_accessor :name
12
+
13
+ # Options to pass to {CLI::Yardoc}
14
+ # @return [Array<String>] the options passed to the commandline utility
15
+ attr_accessor :options
16
+
17
+ # Options to pass to {CLI::Stats}
18
+ # @return [Array<String>] the options passed to the stats utility
19
+ attr_accessor :stats_options
20
+
21
+ # The Ruby source files (and any extra documentation files separated by '-')
22
+ # to process.
23
+ # @example Task files assignment
24
+ # YARD::Rake::YardocTask.new do |t|
25
+ # t.files = ['app/**/*.rb', 'lib/**/*.rb', '-', 'doc/FAQ.md', 'doc/Changes.md']
26
+ # end
27
+ # @return [Array<String>] a list of files
28
+ attr_accessor :files
29
+
30
+ # Runs a +Proc+ before the task
31
+ # @return [Proc] a proc to call before running the task
32
+ attr_accessor :before
33
+
34
+ # Runs a +Proc+ after the task
35
+ # @return [Proc] a proc to call after running the task
36
+ attr_accessor :after
37
+
38
+ # @return [Verifier, Proc] an optional {Verifier} to run against all objects
39
+ # being generated. Any object that the verifier returns false for will be
40
+ # excluded from documentation. This attribute can also be a lambda.
41
+ # @see Verifier
42
+ attr_accessor :verifier
43
+
44
+ # Creates a new task with name +name+.
45
+ #
46
+ # @param [String, Symbol] name the name of the rake task
47
+ # @yield a block to allow any options to be modified on the task
48
+ # @yieldparam [YardocTask] _self the task object to allow any parameters
49
+ # to be changed.
50
+ def initialize(name = :yard)
51
+ @name = name
52
+ @options = []
53
+ @stats_options = []
54
+ @files = []
55
+
56
+ yield self if block_given?
57
+ self.options += ENV['OPTS'].split(/[ ,]/) if ENV['OPTS']
58
+ self.files += ENV['FILES'].split(/[ ,]/) if ENV['FILES']
59
+ self.options << '--no-stats' unless stats_options.empty?
60
+
61
+ define
62
+ end
63
+
64
+ protected
65
+
66
+ # Defines the rake task
67
+ # @return [void]
68
+ def define
69
+ desc "Generate YARD Documentation" unless ::Rake.application.last_description
70
+ task(name) do
71
+ before.call if before.is_a?(Proc)
72
+ yardoc = YARD::CLI::Yardoc.new
73
+ yardoc.options[:verifier] = verifier if verifier
74
+ yardoc.run(*(options + files))
75
+ YARD::CLI::Stats.run(*(stats_options + ['--use-cache'])) unless stats_options.empty?
76
+ after.call if after.is_a?(Proc)
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -1,439 +1,439 @@
1
- # frozen_string_literal: true
2
- require 'fileutils'
3
- require 'digest/sha1'
4
-
5
- module YARD
6
- # The +Registry+ is the centralized data store for all {CodeObjects} created
7
- # during parsing. The storage is a key value store with the object's path
8
- # (see {CodeObjects::Base#path}) as the key and the object itself as the value.
9
- # Object paths must be unique to be stored in the Registry. All lookups for
10
- # objects are done on the singleton Registry instance using the {Registry.at}
11
- # or {Registry.resolve} methods.
12
- #
13
- # == Saving / Loading a Registry
14
- # The registry is saved to a "yardoc file" (actually a directory), which can
15
- # be loaded back to perform any lookups. See {Registry.load!} and
16
- # {Registry.save} for information on saving and loading of a yardoc file.
17
- #
18
- # == Threading Notes
19
- # The registry class is a singleton class that is accessed directly in many
20
- # places across YARD. To mitigate threading issues, YARD (0.6.5+) makes
21
- # the Registry thread local. This means all access to a registry for a specific
22
- # object set must occur in the originating thread.
23
- #
24
- # @example Loading the Registry
25
- # Registry.load!('/path/to/yardocfile') # loads all objects into memory
26
- # Registry.at('YARD::CodeObjects::Base').docstring
27
- # # => "+Base+ is the superclass of all code objects ..."
28
- # @example Getting an object by a specific path
29
- # Registry.at('YARD::CodeObjects::Base#docstring')
30
- # @example Performing a lookup on a method anywhere in the inheritance tree
31
- # Registry.resolve(P('YARD::CodeObjects::Base'), '#docstring', true)
32
- module Registry
33
- DEFAULT_YARDOC_FILE = ".yardoc"
34
- LOCAL_YARDOC_INDEX = File.expand_path(File.join(Config::CONFIG_DIR, 'gem_index'))
35
- DEFAULT_PO_DIR = "po"
36
-
37
- extend Enumerable
38
-
39
- class << self
40
- # @group Getting .yardoc File Locations
41
-
42
- # Returns the .yardoc file associated with a gem.
43
- #
44
- # @param [String] gem the name of the gem to search for
45
- # @param [String] ver_require an optional Gem version requirement
46
- # @param [Boolean] for_writing whether or not the method should search
47
- # for writable locations
48
- # @return [String] if +for_writing+ is set to +true+, returns the best
49
- # location suitable to write the .yardoc file. Otherwise, the first
50
- # existing location associated with the gem's .yardoc file.
51
- # @return [nil] if +for_writing+ is set to false and no yardoc file
52
- # is found, returns nil.
53
- def yardoc_file_for_gem(gem, ver_require = ">= 0", for_writing = false)
54
- specs = YARD::GemIndex.find_all_by_name(gem, ver_require)
55
- return if specs.empty?
56
-
57
- result = nil
58
- specs.reverse.each do |spec|
59
- if gem =~ /^yard-doc-/
60
- path = File.join(spec.full_gem_path, DEFAULT_YARDOC_FILE)
61
- result = File.exist?(path) && !for_writing ? path : nil
62
- result ? break : next
63
- end
64
-
65
- if for_writing
66
- result = global_yardoc_file(spec, for_writing) ||
67
- old_global_yardoc_file(spec, for_writing) ||
68
- local_yardoc_file(spec, for_writing)
69
- else
70
- result = local_yardoc_file(spec, for_writing) ||
71
- global_yardoc_file(spec, for_writing) ||
72
- old_global_yardoc_file(spec, for_writing)
73
- end
74
-
75
- break if result
76
- end
77
-
78
- result
79
- end
80
-
81
- # Gets/sets the yardoc filename
82
- # @return [String] the yardoc filename
83
- # @see DEFAULT_YARDOC_FILE
84
- attr_accessor :yardoc_file
85
- undef yardoc_file, yardoc_file=
86
- def yardoc_file=(v) Thread.current[:__yard_yardoc_file__] = v end
87
-
88
- def yardoc_file
89
- Thread.current[:__yard_yardoc_file__] ||= DEFAULT_YARDOC_FILE
90
- end
91
-
92
- # @group Loading Data from Disk
93
-
94
- # Loads the registry and/or parses a list of files
95
- #
96
- # @example Loads the yardoc file or parses files 'a', 'b' and 'c' (but not both)
97
- # Registry.load(['a', 'b', 'c'])
98
- # @example Reparses files 'a' and 'b' regardless of whether yardoc file exists
99
- # Registry.load(['a', 'b'], true)
100
- # @param [String, Array] files if +files+ is an Array, it should represent
101
- # a list of files that YARD should parse into the registry. If reload is
102
- # set to false and the yardoc file already exists, these files are skipped.
103
- # If files is a String, it should represent the yardoc file to load
104
- # into the registry.
105
- # @param [Boolean] reparse if reparse is false and a yardoc file already
106
- # exists, any files passed in will be ignored.
107
- # @return [Registry] the registry object (for chaining)
108
- # @raise [ArgumentError] if files is not a String or Array
109
- def load(files = [], reparse = false)
110
- if files.is_a?(Array)
111
- if File.exist?(yardoc_file) && !reparse
112
- load_yardoc
113
- else
114
- size = thread_local_store.keys.size
115
- YARD.parse(files)
116
- save if thread_local_store.keys.size > size
117
- end
118
- elsif files.is_a?(String)
119
- load_yardoc(files)
120
- else
121
- raise ArgumentError, "Must take a list of files to parse or the .yardoc file to load."
122
- end
123
- self
124
- end
125
-
126
- # Loads a yardoc file directly
127
- #
128
- # @param [String] file the yardoc file to load.
129
- # @return [Registry] the registry object (for chaining)
130
- def load_yardoc(file = yardoc_file)
131
- clear
132
- thread_local_store.load(file)
133
- self
134
- end
135
-
136
- # Loads a yardoc file and forces all objects cached on disk into
137
- # memory. Equivalent to calling {load_yardoc} followed by {load_all}
138
- #
139
- # @param [String] file the yardoc file to load
140
- # @return [Registry] the registry object (for chaining)
141
- # @see #load_yardoc
142
- # @see #load_all
143
- # @since 0.5.1
144
- def load!(file = yardoc_file)
145
- clear
146
- thread_local_store.load!(file)
147
- self
148
- end
149
-
150
- # Forces all objects cached on disk into memory
151
- #
152
- # @example Loads all objects from disk
153
- # Registry.load
154
- # Registry.all.count #=> 0
155
- # Registry.load_all
156
- # Registry.all.count #=> 17
157
- # @return [Registry] the registry object (for chaining)
158
- # @since 0.5.1
159
- def load_all
160
- thread_local_store.load_all
161
- self
162
- end
163
-
164
- # @group Saving and Deleting Data from Disk
165
-
166
- # Saves the registry to +file+
167
- #
168
- # @param [String] file the yardoc file to save to
169
- # @return [Boolean] true if the file was saved
170
- def save(merge = false, file = yardoc_file)
171
- thread_local_store.save(merge, file)
172
- end
173
-
174
- # Deletes the yardoc file from disk
175
- # @return [void]
176
- def delete_from_disk
177
- thread_local_store.destroy
178
- end
179
-
180
- # @group Adding and Deleting Objects from the Registry
181
-
182
- # Registers a new object with the registry
183
- #
184
- # @param [CodeObjects::Base] object the object to register
185
- # @return [CodeObjects::Base] the registered object
186
- def register(object)
187
- return if object.is_a?(CodeObjects::Proxy)
188
- thread_local_store[object.path] = object
189
- end
190
-
191
- # Deletes an object from the registry
192
- # @param [CodeObjects::Base] object the object to remove
193
- # @return [void]
194
- def delete(object)
195
- thread_local_store.delete(object.path)
196
- end
197
-
198
- # Clears the registry
199
- # @return [void]
200
- def clear
201
- self.thread_local_store = RegistryStore.new
202
- end
203
-
204
- # Creates a pessmistic transactional lock on the database for writing.
205
- # Use with {YARD.parse} to ensure the database is not written multiple
206
- # times.
207
- #
208
- # @see locked_for_writing?
209
- def lock_for_writing(file = yardoc_file, &block)
210
- thread_local_store.lock_for_writing(file, &block)
211
- end
212
-
213
- # (see Serializers::YardocSerializer#locked_for_writing?)
214
- def locked_for_writing?(file = yardoc_file)
215
- thread_local_store.locked_for_writing?(file)
216
- end
217
-
218
- # @group Accessing Objects in the Registry
219
-
220
- # Iterates over {all} with no arguments
221
- def each(&block)
222
- all.each(&block)
223
- end
224
-
225
- # Returns all objects in the registry that match one of the types provided
226
- # in the +types+ list (if +types+ is provided).
227
- #
228
- # @example Returns all objects
229
- # Registry.all
230
- # @example Returns all classes and modules
231
- # Registry.all(:class, :module)
232
- # @param [Array<Symbol>] types an optional list of types to narrow the
233
- # objects down by. Equivalent to performing a select:
234
- # +Registry.all.select {|o| types.include(o.type) }+
235
- # @return [Array<CodeObjects::Base>] the list of objects found
236
- # @see CodeObjects::Base#type
237
- def all(*types)
238
- if types.empty?
239
- thread_local_store.values.select {|obj| obj != root }
240
- else
241
- list = []
242
- types.each do |type|
243
- list += thread_local_store.values_for_type(type)
244
- end
245
- list
246
- end
247
- end
248
-
249
- # Returns the paths of all of the objects in the registry.
250
- # @param [Boolean] reload whether to load entire database
251
- # @return [Array<String>] all of the paths in the registry.
252
- def paths(reload = false)
253
- thread_local_store.keys(reload).map(&:to_s)
254
- end
255
-
256
- # Returns the object at a specific path.
257
- # @param [String, :root] path the pathname to look for. If +path+ is +root+,
258
- # returns the {root} object.
259
- # @return [CodeObjects::Base] the object at path
260
- # @return [nil] if no object is found
261
- def at(path) path ? thread_local_store[path] : nil end
262
- alias [] at
263
-
264
- # The root namespace object.
265
- # @return [CodeObjects::RootObject] the root object in the namespace
266
- def root; thread_local_store[:root] end
267
-
268
- # @param [String] name the locale name.
269
- # @return [I18n::Locale] the locale object for +name+.
270
- # @since 0.8.3
271
- def locale(name)
272
- thread_local_store.locale(name)
273
- end
274
-
275
- # Attempts to find an object by name starting at +namespace+, performing
276
- # a lookup similar to Ruby's method of resolving a constant in a namespace.
277
- #
278
- # @example Looks for instance method #reverse starting from A::B::C
279
- # Registry.resolve(P("A::B::C"), "#reverse")
280
- # @example Looks for a constant in the root namespace
281
- # Registry.resolve(nil, 'CONSTANT')
282
- # @example Looks for a class method respecting the inheritance tree
283
- # Registry.resolve(myclass, 'mymethod', true)
284
- # @example Looks for a constant but returns a proxy if not found
285
- # Registry.resolve(P('A::B::C'), 'D', false, true) # => #<yardoc proxy A::B::C::D>
286
- # @example Looks for a complex path from a namespace
287
- # Registry.resolve(P('A::B'), 'B::D') # => #<yardoc class A::B::D>
288
- # @param [CodeObjects::NamespaceObject, nil] namespace the starting namespace
289
- # (module or class). If +nil+ or +:root+, starts from the {root} object.
290
- # @param [String, Symbol] name the name (or complex path) to look for from
291
- # +namespace+.
292
- # @param [Boolean] inheritance Follows inheritance chain (mixins, superclass)
293
- # when performing name resolution if set to +true+.
294
- # @param [Boolean] proxy_fallback If +true+, returns a proxy representing
295
- # the unresolved path (namespace + name) if no object is found.
296
- # @param [Symbol, nil] type the {CodeObjects::Base#type} that the resolved
297
- # object must be equal to. No type checking if nil.
298
- # @return [CodeObjects::Base] the object if it is found
299
- # @return [CodeObjects::Proxy] a Proxy representing the object if
300
- # +proxy_fallback+ is +true+.
301
- # @return [nil] if +proxy_fallback+ is +false+ and no object was found.
302
- # @see P
303
- def resolve(namespace, name, inheritance = false, proxy_fallback = false, type = nil)
304
- thread_local_resolver.lookup_by_path name,
305
- :namespace => namespace, :inheritance => inheritance,
306
- :proxy_fallback => proxy_fallback, :type => type
307
- end
308
-
309
- # @group Managing Source File Checksums
310
-
311
- # @return [Hash{String => String}] a set of checksums for files
312
- def checksums
313
- thread_local_store.checksums
314
- end
315
-
316
- # @param [String] data data to checksum
317
- # @return [String] the SHA1 checksum for data
318
- def checksum_for(data)
319
- Digest::SHA1.hexdigest(data)
320
- end
321
-
322
- # @group Managing Internal State (Advanced / Testing Only)
323
-
324
- # Whether or not the Registry storage should load everything into a
325
- # single object database (for disk efficiency), or spread them out
326
- # (for load time efficiency).
327
- #
328
- # @note Setting this attribute to nil will offload the decision to
329
- # the {RegistryStore storage adapter}.
330
- # @return [Boolean, nil] if this value is set to nil, the storage
331
- # adapter will decide how to store the data.
332
- attr_accessor :single_object_db
333
- undef single_object_db, single_object_db=
334
- def single_object_db=(v) Thread.current[:__yard_single_db__] = v end
335
- def single_object_db; Thread.current[:__yard_single_db__] end
336
-
337
- # The assumed types of a list of paths. This method is used by CodeObjects::Base
338
- # @return [{String => Symbol}] a set of unresolved paths and their assumed type
339
- # @private
340
- # @deprecated The registry no longer globally tracks proxy types.
341
- def proxy_types
342
- thread_local_store.proxy_types
343
- end
344
-
345
- # @group I18n features
346
-
347
- # Gets/sets the directory that has LANG.po files
348
- # @return [String] the directory that has .po files
349
- attr_accessor :po_dir
350
- undef po_dir, po_dir=
351
- def po_dir=(dir) Thread.current[:__yard_po_dir__] = dir end
352
-
353
- def po_dir
354
- Thread.current[:__yard_po_dir__] ||= DEFAULT_PO_DIR
355
- end
356
-
357
- # @group Legacy Methods
358
-
359
- # The registry singleton instance.
360
- #
361
- # @deprecated use Registry.methodname directly.
362
- # @return [Registry] returns the registry instance
363
- def instance; self end
364
-
365
- private
366
-
367
- # @group Accessing Objects in the Registry
368
-
369
- # Attempts to resolve a name in a namespace
370
- #
371
- # @param [CodeObjects::NamespaceObject] namespace the starting namespace
372
- # @param [String] name the name to look for
373
- # @param [Symbol, nil] type the {CodeObjects::Base#type} that the resolved
374
- # object must be equal to
375
- def partial_resolve(namespace, name, type = nil)
376
- obj = at(name) || at('#' + name) if namespace.root?
377
- return obj if obj && (type.nil? || obj.type == type)
378
- [CodeObjects::NSEP, CodeObjects::CSEP, ''].each do |s|
379
- next if s.empty? && name =~ /^\w/
380
- path = name
381
- path = [namespace.path, name].join(s) if namespace != root
382
- found = at(path)
383
- return found if found && (type.nil? || found.type == type)
384
- end
385
- nil
386
- end
387
-
388
- # @group Retrieving yardoc File Locations
389
-
390
- def global_yardoc_file(spec, for_writing = false)
391
- path = spec.doc_dir
392
- yfile = spec.doc_dir(DEFAULT_YARDOC_FILE)
393
- if for_writing
394
- if File.writable?(path) ||
395
- (!File.directory?(path) && File.writable?(File.dirname(path)))
396
- return yfile
397
- end
398
- elsif !for_writing && File.exist?(yfile)
399
- return yfile
400
- end
401
- end
402
-
403
- def old_global_yardoc_file(spec, for_writing = false)
404
- path = spec.full_gem_path
405
- yfile = File.join(path, DEFAULT_YARDOC_FILE)
406
- return yfile if for_writing && File.writable?(path)
407
- return yfile if !for_writing && File.exist?(yfile)
408
- end
409
-
410
- def local_yardoc_file(spec, for_writing = false)
411
- path = Registry::LOCAL_YARDOC_INDEX
412
- FileUtils.mkdir_p(path) if for_writing
413
- path = File.join(path, "#{spec.full_name}.yardoc")
414
- if for_writing
415
- path
416
- else
417
- File.exist?(path) ? path : nil
418
- end
419
- end
420
-
421
- # @group Threading support
422
-
423
- # @since 0.6.5
424
- def thread_local_store
425
- Thread.current[:__yard_registry__] ||= clear
426
- end
427
-
428
- # @since 0.6.5
429
- def thread_local_store=(value)
430
- Thread.current[:__yard_registry__] = value
431
- end
432
-
433
- # @since 0.9.1
434
- def thread_local_resolver
435
- Thread.current[:__yard_resolver__] ||= RegistryResolver.new
436
- end
437
- end
438
- end
439
- end
1
+ # frozen_string_literal: true
2
+ require 'fileutils'
3
+ require 'digest/sha1'
4
+
5
+ module YARD
6
+ # The +Registry+ is the centralized data store for all {CodeObjects} created
7
+ # during parsing. The storage is a key value store with the object's path
8
+ # (see {CodeObjects::Base#path}) as the key and the object itself as the value.
9
+ # Object paths must be unique to be stored in the Registry. All lookups for
10
+ # objects are done on the singleton Registry instance using the {Registry.at}
11
+ # or {Registry.resolve} methods.
12
+ #
13
+ # == Saving / Loading a Registry
14
+ # The registry is saved to a "yardoc file" (actually a directory), which can
15
+ # be loaded back to perform any lookups. See {Registry.load!} and
16
+ # {Registry.save} for information on saving and loading of a yardoc file.
17
+ #
18
+ # == Threading Notes
19
+ # The registry class is a singleton class that is accessed directly in many
20
+ # places across YARD. To mitigate threading issues, YARD (0.6.5+) makes
21
+ # the Registry thread local. This means all access to a registry for a specific
22
+ # object set must occur in the originating thread.
23
+ #
24
+ # @example Loading the Registry
25
+ # Registry.load!('/path/to/yardocfile') # loads all objects into memory
26
+ # Registry.at('YARD::CodeObjects::Base').docstring
27
+ # # => "+Base+ is the superclass of all code objects ..."
28
+ # @example Getting an object by a specific path
29
+ # Registry.at('YARD::CodeObjects::Base#docstring')
30
+ # @example Performing a lookup on a method anywhere in the inheritance tree
31
+ # Registry.resolve(P('YARD::CodeObjects::Base'), '#docstring', true)
32
+ module Registry
33
+ DEFAULT_YARDOC_FILE = ".yardoc"
34
+ LOCAL_YARDOC_INDEX = File.expand_path(File.join(Config::CONFIG_DIR, 'gem_index'))
35
+ DEFAULT_PO_DIR = "po"
36
+
37
+ extend Enumerable
38
+
39
+ class << self
40
+ # @group Getting .yardoc File Locations
41
+
42
+ # Returns the .yardoc file associated with a gem.
43
+ #
44
+ # @param [String] gem the name of the gem to search for
45
+ # @param [String] ver_require an optional Gem version requirement
46
+ # @param [Boolean] for_writing whether or not the method should search
47
+ # for writable locations
48
+ # @return [String] if +for_writing+ is set to +true+, returns the best
49
+ # location suitable to write the .yardoc file. Otherwise, the first
50
+ # existing location associated with the gem's .yardoc file.
51
+ # @return [nil] if +for_writing+ is set to false and no yardoc file
52
+ # is found, returns nil.
53
+ def yardoc_file_for_gem(gem, ver_require = ">= 0", for_writing = false)
54
+ specs = YARD::GemIndex.find_all_by_name(gem, ver_require)
55
+ return if specs.empty?
56
+
57
+ result = nil
58
+ specs.reverse.each do |spec|
59
+ if gem =~ /^yard-doc-/
60
+ path = File.join(spec.full_gem_path, DEFAULT_YARDOC_FILE)
61
+ result = File.exist?(path) && !for_writing ? path : nil
62
+ result ? break : next
63
+ end
64
+
65
+ if for_writing
66
+ result = global_yardoc_file(spec, for_writing) ||
67
+ old_global_yardoc_file(spec, for_writing) ||
68
+ local_yardoc_file(spec, for_writing)
69
+ else
70
+ result = local_yardoc_file(spec, for_writing) ||
71
+ global_yardoc_file(spec, for_writing) ||
72
+ old_global_yardoc_file(spec, for_writing)
73
+ end
74
+
75
+ break if result
76
+ end
77
+
78
+ result
79
+ end
80
+
81
+ # Gets/sets the yardoc filename
82
+ # @return [String] the yardoc filename
83
+ # @see DEFAULT_YARDOC_FILE
84
+ attr_accessor :yardoc_file
85
+ undef yardoc_file, yardoc_file=
86
+ def yardoc_file=(v) Thread.current[:__yard_yardoc_file__] = v end
87
+
88
+ def yardoc_file
89
+ Thread.current[:__yard_yardoc_file__] ||= DEFAULT_YARDOC_FILE
90
+ end
91
+
92
+ # @group Loading Data from Disk
93
+
94
+ # Loads the registry and/or parses a list of files
95
+ #
96
+ # @example Loads the yardoc file or parses files 'a', 'b' and 'c' (but not both)
97
+ # Registry.load(['a', 'b', 'c'])
98
+ # @example Reparses files 'a' and 'b' regardless of whether yardoc file exists
99
+ # Registry.load(['a', 'b'], true)
100
+ # @param [String, Array] files if +files+ is an Array, it should represent
101
+ # a list of files that YARD should parse into the registry. If reload is
102
+ # set to false and the yardoc file already exists, these files are skipped.
103
+ # If files is a String, it should represent the yardoc file to load
104
+ # into the registry.
105
+ # @param [Boolean] reparse if reparse is false and a yardoc file already
106
+ # exists, any files passed in will be ignored.
107
+ # @return [Registry] the registry object (for chaining)
108
+ # @raise [ArgumentError] if files is not a String or Array
109
+ def load(files = [], reparse = false)
110
+ if files.is_a?(Array)
111
+ if File.exist?(yardoc_file) && !reparse
112
+ load_yardoc
113
+ else
114
+ size = thread_local_store.keys.size
115
+ YARD.parse(files)
116
+ save if thread_local_store.keys.size > size
117
+ end
118
+ elsif files.is_a?(String)
119
+ load_yardoc(files)
120
+ else
121
+ raise ArgumentError, "Must take a list of files to parse or the .yardoc file to load."
122
+ end
123
+ self
124
+ end
125
+
126
+ # Loads a yardoc file directly
127
+ #
128
+ # @param [String] file the yardoc file to load.
129
+ # @return [Registry] the registry object (for chaining)
130
+ def load_yardoc(file = yardoc_file)
131
+ clear
132
+ thread_local_store.load(file)
133
+ self
134
+ end
135
+
136
+ # Loads a yardoc file and forces all objects cached on disk into
137
+ # memory. Equivalent to calling {load_yardoc} followed by {load_all}
138
+ #
139
+ # @param [String] file the yardoc file to load
140
+ # @return [Registry] the registry object (for chaining)
141
+ # @see #load_yardoc
142
+ # @see #load_all
143
+ # @since 0.5.1
144
+ def load!(file = yardoc_file)
145
+ clear
146
+ thread_local_store.load!(file)
147
+ self
148
+ end
149
+
150
+ # Forces all objects cached on disk into memory
151
+ #
152
+ # @example Loads all objects from disk
153
+ # Registry.load
154
+ # Registry.all.count #=> 0
155
+ # Registry.load_all
156
+ # Registry.all.count #=> 17
157
+ # @return [Registry] the registry object (for chaining)
158
+ # @since 0.5.1
159
+ def load_all
160
+ thread_local_store.load_all
161
+ self
162
+ end
163
+
164
+ # @group Saving and Deleting Data from Disk
165
+
166
+ # Saves the registry to +file+
167
+ #
168
+ # @param [String] file the yardoc file to save to
169
+ # @return [Boolean] true if the file was saved
170
+ def save(merge = false, file = yardoc_file)
171
+ thread_local_store.save(merge, file)
172
+ end
173
+
174
+ # Deletes the yardoc file from disk
175
+ # @return [void]
176
+ def delete_from_disk
177
+ thread_local_store.destroy
178
+ end
179
+
180
+ # @group Adding and Deleting Objects from the Registry
181
+
182
+ # Registers a new object with the registry
183
+ #
184
+ # @param [CodeObjects::Base] object the object to register
185
+ # @return [CodeObjects::Base] the registered object
186
+ def register(object)
187
+ return if object.is_a?(CodeObjects::Proxy)
188
+ thread_local_store[object.path] = object
189
+ end
190
+
191
+ # Deletes an object from the registry
192
+ # @param [CodeObjects::Base] object the object to remove
193
+ # @return [void]
194
+ def delete(object)
195
+ thread_local_store.delete(object.path)
196
+ end
197
+
198
+ # Clears the registry
199
+ # @return [void]
200
+ def clear
201
+ self.thread_local_store = RegistryStore.new
202
+ end
203
+
204
+ # Creates a pessmistic transactional lock on the database for writing.
205
+ # Use with {YARD.parse} to ensure the database is not written multiple
206
+ # times.
207
+ #
208
+ # @see locked_for_writing?
209
+ def lock_for_writing(file = yardoc_file, &block)
210
+ thread_local_store.lock_for_writing(file, &block)
211
+ end
212
+
213
+ # (see Serializers::YardocSerializer#locked_for_writing?)
214
+ def locked_for_writing?(file = yardoc_file)
215
+ thread_local_store.locked_for_writing?(file)
216
+ end
217
+
218
+ # @group Accessing Objects in the Registry
219
+
220
+ # Iterates over {all} with no arguments
221
+ def each(&block)
222
+ all.each(&block)
223
+ end
224
+
225
+ # Returns all objects in the registry that match one of the types provided
226
+ # in the +types+ list (if +types+ is provided).
227
+ #
228
+ # @example Returns all objects
229
+ # Registry.all
230
+ # @example Returns all classes and modules
231
+ # Registry.all(:class, :module)
232
+ # @param [Array<Symbol>] types an optional list of types to narrow the
233
+ # objects down by. Equivalent to performing a select:
234
+ # +Registry.all.select {|o| types.include(o.type) }+
235
+ # @return [Array<CodeObjects::Base>] the list of objects found
236
+ # @see CodeObjects::Base#type
237
+ def all(*types)
238
+ if types.empty?
239
+ thread_local_store.values.select {|obj| obj != root }
240
+ else
241
+ list = []
242
+ types.each do |type|
243
+ list += thread_local_store.values_for_type(type)
244
+ end
245
+ list
246
+ end
247
+ end
248
+
249
+ # Returns the paths of all of the objects in the registry.
250
+ # @param [Boolean] reload whether to load entire database
251
+ # @return [Array<String>] all of the paths in the registry.
252
+ def paths(reload = false)
253
+ thread_local_store.keys(reload).map(&:to_s)
254
+ end
255
+
256
+ # Returns the object at a specific path.
257
+ # @param [String, :root] path the pathname to look for. If +path+ is +root+,
258
+ # returns the {root} object.
259
+ # @return [CodeObjects::Base] the object at path
260
+ # @return [nil] if no object is found
261
+ def at(path) path ? thread_local_store[path] : nil end
262
+ alias [] at
263
+
264
+ # The root namespace object.
265
+ # @return [CodeObjects::RootObject] the root object in the namespace
266
+ def root; thread_local_store[:root] end
267
+
268
+ # @param [String] name the locale name.
269
+ # @return [I18n::Locale] the locale object for +name+.
270
+ # @since 0.8.3
271
+ def locale(name)
272
+ thread_local_store.locale(name)
273
+ end
274
+
275
+ # Attempts to find an object by name starting at +namespace+, performing
276
+ # a lookup similar to Ruby's method of resolving a constant in a namespace.
277
+ #
278
+ # @example Looks for instance method #reverse starting from A::B::C
279
+ # Registry.resolve(P("A::B::C"), "#reverse")
280
+ # @example Looks for a constant in the root namespace
281
+ # Registry.resolve(nil, 'CONSTANT')
282
+ # @example Looks for a class method respecting the inheritance tree
283
+ # Registry.resolve(myclass, 'mymethod', true)
284
+ # @example Looks for a constant but returns a proxy if not found
285
+ # Registry.resolve(P('A::B::C'), 'D', false, true) # => #<yardoc proxy A::B::C::D>
286
+ # @example Looks for a complex path from a namespace
287
+ # Registry.resolve(P('A::B'), 'B::D') # => #<yardoc class A::B::D>
288
+ # @param [CodeObjects::NamespaceObject, nil] namespace the starting namespace
289
+ # (module or class). If +nil+ or +:root+, starts from the {root} object.
290
+ # @param [String, Symbol] name the name (or complex path) to look for from
291
+ # +namespace+.
292
+ # @param [Boolean] inheritance Follows inheritance chain (mixins, superclass)
293
+ # when performing name resolution if set to +true+.
294
+ # @param [Boolean] proxy_fallback If +true+, returns a proxy representing
295
+ # the unresolved path (namespace + name) if no object is found.
296
+ # @param [Symbol, nil] type the {CodeObjects::Base#type} that the resolved
297
+ # object must be equal to. No type checking if nil.
298
+ # @return [CodeObjects::Base] the object if it is found
299
+ # @return [CodeObjects::Proxy] a Proxy representing the object if
300
+ # +proxy_fallback+ is +true+.
301
+ # @return [nil] if +proxy_fallback+ is +false+ and no object was found.
302
+ # @see P
303
+ def resolve(namespace, name, inheritance = false, proxy_fallback = false, type = nil)
304
+ thread_local_resolver.lookup_by_path name,
305
+ :namespace => namespace, :inheritance => inheritance,
306
+ :proxy_fallback => proxy_fallback, :type => type
307
+ end
308
+
309
+ # @group Managing Source File Checksums
310
+
311
+ # @return [Hash{String => String}] a set of checksums for files
312
+ def checksums
313
+ thread_local_store.checksums
314
+ end
315
+
316
+ # @param [String] data data to checksum
317
+ # @return [String] the SHA1 checksum for data
318
+ def checksum_for(data)
319
+ Digest::SHA1.hexdigest(data)
320
+ end
321
+
322
+ # @group Managing Internal State (Advanced / Testing Only)
323
+
324
+ # Whether or not the Registry storage should load everything into a
325
+ # single object database (for disk efficiency), or spread them out
326
+ # (for load time efficiency).
327
+ #
328
+ # @note Setting this attribute to nil will offload the decision to
329
+ # the {RegistryStore storage adapter}.
330
+ # @return [Boolean, nil] if this value is set to nil, the storage
331
+ # adapter will decide how to store the data.
332
+ attr_accessor :single_object_db
333
+ undef single_object_db, single_object_db=
334
+ def single_object_db=(v) Thread.current[:__yard_single_db__] = v end
335
+ def single_object_db; Thread.current[:__yard_single_db__] end
336
+
337
+ # The assumed types of a list of paths. This method is used by CodeObjects::Base
338
+ # @return [{String => Symbol}] a set of unresolved paths and their assumed type
339
+ # @private
340
+ # @deprecated The registry no longer globally tracks proxy types.
341
+ def proxy_types
342
+ thread_local_store.proxy_types
343
+ end
344
+
345
+ # @group I18n features
346
+
347
+ # Gets/sets the directory that has LANG.po files
348
+ # @return [String] the directory that has .po files
349
+ attr_accessor :po_dir
350
+ undef po_dir, po_dir=
351
+ def po_dir=(dir) Thread.current[:__yard_po_dir__] = dir end
352
+
353
+ def po_dir
354
+ Thread.current[:__yard_po_dir__] ||= DEFAULT_PO_DIR
355
+ end
356
+
357
+ # @group Legacy Methods
358
+
359
+ # The registry singleton instance.
360
+ #
361
+ # @deprecated use Registry.methodname directly.
362
+ # @return [Registry] returns the registry instance
363
+ def instance; self end
364
+
365
+ private
366
+
367
+ # @group Accessing Objects in the Registry
368
+
369
+ # Attempts to resolve a name in a namespace
370
+ #
371
+ # @param [CodeObjects::NamespaceObject] namespace the starting namespace
372
+ # @param [String] name the name to look for
373
+ # @param [Symbol, nil] type the {CodeObjects::Base#type} that the resolved
374
+ # object must be equal to
375
+ def partial_resolve(namespace, name, type = nil)
376
+ obj = at(name) || at('#' + name) if namespace.root?
377
+ return obj if obj && (type.nil? || obj.type == type)
378
+ [CodeObjects::NSEP, CodeObjects::CSEP, ''].each do |s|
379
+ next if s.empty? && name =~ /^\w/
380
+ path = name
381
+ path = [namespace.path, name].join(s) if namespace != root
382
+ found = at(path)
383
+ return found if found && (type.nil? || found.type == type)
384
+ end
385
+ nil
386
+ end
387
+
388
+ # @group Retrieving yardoc File Locations
389
+
390
+ def global_yardoc_file(spec, for_writing = false)
391
+ path = spec.doc_dir
392
+ yfile = spec.doc_dir(DEFAULT_YARDOC_FILE)
393
+ if for_writing
394
+ if File.writable?(path) ||
395
+ (!File.directory?(path) && File.writable?(File.dirname(path)))
396
+ return yfile
397
+ end
398
+ elsif !for_writing && File.exist?(yfile)
399
+ return yfile
400
+ end
401
+ end
402
+
403
+ def old_global_yardoc_file(spec, for_writing = false)
404
+ path = spec.full_gem_path
405
+ yfile = File.join(path, DEFAULT_YARDOC_FILE)
406
+ return yfile if for_writing && File.writable?(path)
407
+ return yfile if !for_writing && File.exist?(yfile)
408
+ end
409
+
410
+ def local_yardoc_file(spec, for_writing = false)
411
+ path = Registry::LOCAL_YARDOC_INDEX
412
+ FileUtils.mkdir_p(path) if for_writing
413
+ path = File.join(path, "#{spec.full_name}.yardoc")
414
+ if for_writing
415
+ path
416
+ else
417
+ File.exist?(path) ? path : nil
418
+ end
419
+ end
420
+
421
+ # @group Threading support
422
+
423
+ # @since 0.6.5
424
+ def thread_local_store
425
+ Thread.current[:__yard_registry__] ||= clear
426
+ end
427
+
428
+ # @since 0.6.5
429
+ def thread_local_store=(value)
430
+ Thread.current[:__yard_registry__] = value
431
+ end
432
+
433
+ # @since 0.9.1
434
+ def thread_local_resolver
435
+ Thread.current[:__yard_resolver__] ||= RegistryResolver.new
436
+ end
437
+ end
438
+ end
439
+ end