yard 0.9.18 → 0.9.23

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of yard might be problematic. Click here for more details.

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