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,189 +1,231 @@
1
- # frozen_string_literal: true
2
- module YARD
3
- # Handles all logic for complex lexical and inherited object resolution.
4
- # Used by {Registry.resolve}, so there is no need to use this class
5
- # directly.
6
- #
7
- # @see Registry.resolve
8
- # @since 0.9.1
9
- class RegistryResolver
10
- include CodeObjects::NamespaceMapper
11
-
12
- # Creates a new resolver object for a registry.
13
- #
14
- # @param registry [Registry] only set this if customizing the registry
15
- # object
16
- def initialize(registry = Registry)
17
- @registry = registry
18
- @default_sep = nil
19
- end
20
-
21
- # Performs a lookup on a given path in the registry. Resolution will occur
22
- # in a similar way to standard Ruby identifier resolution, doing lexical
23
- # lookup, as well as (optionally) through the inheritance chain. A proxy
24
- # object can be returned if the lookup fails for future resolution. The
25
- # proxy will be type hinted with the +type+ used in the original lookup.
26
- #
27
- # @option opts namespace [CodeObjects::Base, :root, nil] (nil) the namespace
28
- # object to start searching from. If root or nil is provided, {Registry.root}
29
- # is assumed.
30
- # @option opts inheritance [Boolean] (false) whether to perform lookups through
31
- # the inheritance chain (includes mixins)
32
- # @option opts proxy_fallback [Boolean] (false) when true, a proxy is returned
33
- # if no match is found
34
- # @option opts type [Symbol] (nil) an optional type hint for the resolver
35
- # to consider when performing a lookup. If a type is provided and the
36
- # resolved object's type does not match the hint, the object is discarded.
37
- # @return [CodeObjects::Base, CodeObjects::Proxy, nil] the first object
38
- # that matches the path lookup. If proxy_fallback is provided, a proxy
39
- # object will be returned in the event of no match, otherwise nil will
40
- # be returned.
41
- # @example A lookup from root
42
- # resolver.lookup_by_path("A::B::C")
43
- # @example A lookup from the A::B namespace
44
- # resolver.lookup_by_path("C", namespace: P("A::B"))
45
- # @example A lookup on a method through the inheritance tree
46
- # resolver.lookup_by_math("A::B#foo", inheritance: true)
47
- def lookup_by_path(path, opts = {})
48
- path = path.to_s
49
- namespace = opts[:namespace]
50
- inheritance = opts[:inheritance] || false
51
- proxy_fallback = opts[:proxy_fallback] || false
52
- type = opts[:type]
53
-
54
- if namespace.is_a?(CodeObjects::Proxy)
55
- return proxy_fallback ? CodeObjects::Proxy.new(namespace, path, type) : nil
56
- end
57
-
58
- if namespace == :root || !namespace
59
- namespace = @registry.root
60
- else
61
- namespace = namespace.parent until namespace.is_a?(CodeObjects::NamespaceObject)
62
- end
63
- orignamespace = namespace
64
-
65
- if path =~ /\A#{default_separator}/
66
- path = $'
67
- namespace = @registry.root
68
- orignamespace = @registry.root
69
- end
70
-
71
- resolved = nil
72
- lexical_lookup = 0
73
- while namespace && !resolved
74
- resolved = lookup_path_direct(namespace, path, type)
75
- resolved ||= lookup_path_inherited(namespace, path, type) if inheritance
76
- break if resolved
77
- namespace = namespace.parent
78
- lexical_lookup += 1
79
- end
80
-
81
- # method objects cannot be resolved through lexical lookup by more than 1 ns
82
- if lexical_lookup > 1 && resolved.is_a?(CodeObjects::MethodObject)
83
- resolved = nil
84
- end
85
-
86
- if proxy_fallback
87
- resolved ||= CodeObjects::Proxy.new(orignamespace, path, type)
88
- end
89
-
90
- resolved
91
- end
92
-
93
- private
94
-
95
- # return [Boolean] if the obj's type matches the provided type.
96
- def validate(obj, type)
97
- !type || (obj && obj.type == type) ? obj : nil
98
- end
99
-
100
- # Performs a lexical lookup from a namespace for a path and a type hint.
101
- def lookup_path_direct(namespace, path, type)
102
- result = namespace.root? && validate(@registry.at(path), type)
103
- return result if result
104
-
105
- if path =~ /\A(#{separators_match})/
106
- return validate(@registry.at(namespace.path + path), type)
107
- end
108
-
109
- separators.each do |sep|
110
- result = validate(@registry.at(namespace.path + sep + path), type)
111
- return result if result
112
- end
113
-
114
- nil
115
- end
116
-
117
- # Performs a lookup through the inheritance chain on a path with a type hint.
118
- def lookup_path_inherited(namespace, path, type)
119
- resolved = nil
120
- last_obj = namespace
121
- scopes = []
122
- last_sep = nil
123
- pos = 0
124
-
125
- if path =~ /\A(#{separators_match})/
126
- last_sep = $1
127
- path = $'
128
- end
129
-
130
- path.scan(/(.+?)(#{separators_match}|$)/).each do |part, sep|
131
- cur_obj = nil
132
- pos += "#{part}#{sep}".length
133
- parsed_end = pos == path.length
134
-
135
- if !last_obj || (!parsed_end && !last_obj.is_a?(CodeObjects::NamespaceObject))
136
- break # can't continue
137
- end
138
-
139
- collect_namespaces(last_obj).each do |ns|
140
- next if ns.is_a?(CodeObjects::Proxy)
141
-
142
- found = nil
143
- search_seps = []
144
- scopes.each do |scope|
145
- search_seps += separators_for_type(scope)
146
- end
147
-
148
- if search_seps.empty?
149
- search_seps =
150
- if ns.type == :root
151
- [""]
152
- elsif last_sep.nil?
153
- separators
154
- else
155
- [@default_sep]
156
- end
157
- end
158
-
159
- ([last_sep] | search_seps).compact.each do |search_sep|
160
- found = @registry.at(ns.path + search_sep.to_s + part)
161
- break if found
162
- end
163
-
164
- break cur_obj = found if found
165
- end
166
-
167
- last_sep = sep
168
- scopes = types_for_separator(sep) || []
169
- last_obj = cur_obj
170
- resolved = cur_obj if parsed_end && cur_obj && (type.nil? || type == cur_obj.type)
171
- end
172
-
173
- resolved
174
- end
175
-
176
- # Collects and returns all inherited namespaces for a given object
177
- def collect_namespaces(object)
178
- return [] unless object.respond_to?(:inheritance_tree)
179
-
180
- nss = object.inheritance_tree(true)
181
- if object.respond_to?(:superclass)
182
- nss |= [P('Object')] if object.superclass != P('BasicObject')
183
- nss |= [P('BasicObject')]
184
- end
185
-
186
- nss
187
- end
188
- end
189
- end
1
+ # frozen_string_literal: true
2
+ module YARD
3
+ # Handles all logic for complex lexical and inherited object resolution.
4
+ # Used by {Registry.resolve}, so there is no need to use this class
5
+ # directly.
6
+ #
7
+ # @see Registry.resolve
8
+ # @since 0.9.1
9
+ class RegistryResolver
10
+ include CodeObjects::NamespaceMapper
11
+
12
+ # Creates a new resolver object for a registry.
13
+ #
14
+ # @param registry [Registry] only set this if customizing the registry
15
+ # object
16
+ def initialize(registry = Registry)
17
+ @registry = registry
18
+ @default_sep = nil
19
+ end
20
+
21
+ # Performs a lookup on a given path in the registry. Resolution will occur
22
+ # in a similar way to standard Ruby identifier resolution, doing lexical
23
+ # lookup, as well as (optionally) through the inheritance chain. A proxy
24
+ # object can be returned if the lookup fails for future resolution. The
25
+ # proxy will be type hinted with the +type+ used in the original lookup.
26
+ #
27
+ # @option opts namespace [CodeObjects::Base, :root, nil] (nil) the namespace
28
+ # object to start searching from. If root or nil is provided, {Registry.root}
29
+ # is assumed.
30
+ # @option opts inheritance [Boolean] (false) whether to perform lookups through
31
+ # the inheritance chain (includes mixins)
32
+ # @option opts proxy_fallback [Boolean] (false) when true, a proxy is returned
33
+ # if no match is found
34
+ # @option opts type [Symbol] (nil) an optional type hint for the resolver
35
+ # to consider when performing a lookup. If a type is provided and the
36
+ # resolved object's type does not match the hint, the object is discarded.
37
+ # @return [CodeObjects::Base, CodeObjects::Proxy, nil] the first object
38
+ # that matches the path lookup. If proxy_fallback is provided, a proxy
39
+ # object will be returned in the event of no match, otherwise nil will
40
+ # be returned.
41
+ # @example A lookup from root
42
+ # resolver.lookup_by_path("A::B::C")
43
+ # @example A lookup from the A::B namespace
44
+ # resolver.lookup_by_path("C", namespace: P("A::B"))
45
+ # @example A lookup on a method through the inheritance tree
46
+ # resolver.lookup_by_math("A::B#foo", inheritance: true)
47
+ def lookup_by_path(path, opts = {})
48
+ path = path.to_s
49
+ namespace = opts[:namespace]
50
+ inheritance = opts[:inheritance] || false
51
+ proxy_fallback = opts[:proxy_fallback] || false
52
+ type = opts[:type]
53
+
54
+ if namespace.is_a?(CodeObjects::Proxy)
55
+ return proxy_fallback ? CodeObjects::Proxy.new(namespace, path, type) : nil
56
+ end
57
+
58
+ if namespace == :root || !namespace
59
+ namespace = @registry.root
60
+ else
61
+ namespace = namespace.parent until namespace.is_a?(CodeObjects::NamespaceObject)
62
+ end
63
+ orignamespace = namespace
64
+
65
+ if path =~ starts_with_default_separator_match
66
+ path = $'
67
+ namespace = @registry.root
68
+ orignamespace = @registry.root
69
+ end
70
+
71
+ resolved = nil
72
+ lexical_lookup = 0
73
+ while namespace && !resolved
74
+ resolved = lookup_path_direct(namespace, path, type)
75
+ resolved ||= lookup_path_inherited(namespace, path, type) if inheritance
76
+ break if resolved
77
+ namespace = namespace.parent
78
+ lexical_lookup += 1
79
+ end
80
+
81
+ # method objects cannot be resolved through lexical lookup by more than 1 ns
82
+ if lexical_lookup > 1 && resolved.is_a?(CodeObjects::MethodObject)
83
+ resolved = nil
84
+ end
85
+
86
+ if proxy_fallback
87
+ resolved ||= CodeObjects::Proxy.new(orignamespace, path, type)
88
+ end
89
+
90
+ resolved
91
+ end
92
+
93
+ private
94
+
95
+ # return [Boolean] if the obj's type matches the provided type.
96
+ def validate(obj, type)
97
+ !type || (obj && obj.type == type) ? obj : nil
98
+ end
99
+
100
+ # Performs a lexical lookup from a namespace for a path and a type hint.
101
+ def lookup_path_direct(namespace, path, type)
102
+ result = namespace.root? && validate(@registry.at(path), type)
103
+ return result if result
104
+
105
+ if path =~ starts_with_separator_match
106
+ return validate(@registry.at(namespace.path + path), type)
107
+ end
108
+
109
+ separators.each do |sep|
110
+ result = validate(@registry.at("#{namespace.path}#{sep}#{path}"), type)
111
+ return result if result
112
+ end
113
+
114
+ nil
115
+ end
116
+
117
+ # Performs a lookup through the inheritance chain on a path with a type hint.
118
+ def lookup_path_inherited(namespace, path, type)
119
+ resolved = nil
120
+ last_obj = namespace
121
+ scopes = []
122
+ last_sep = nil
123
+ pos = 0
124
+
125
+ if path =~ starts_with_separator_match
126
+ last_sep = $1
127
+ path = $'
128
+ end
129
+
130
+ path.scan(split_on_separators_match).each do |part, sep|
131
+ cur_obj = nil
132
+ pos += "#{part}#{sep}".length
133
+ parsed_end = pos == path.length
134
+
135
+ if !last_obj || (!parsed_end && !last_obj.is_a?(CodeObjects::NamespaceObject))
136
+ break # can't continue
137
+ end
138
+
139
+ collect_namespaces(last_obj).each do |ns|
140
+ next if ns.is_a?(CodeObjects::Proxy)
141
+
142
+ found = nil
143
+ search_seps = []
144
+ scopes.each do |scope|
145
+ search_seps += separators_for_type(scope)
146
+ end
147
+
148
+ if search_seps.empty?
149
+ search_seps =
150
+ if ns.type == :root
151
+ [""]
152
+ elsif last_sep.nil?
153
+ separators
154
+ else
155
+ [@default_sep]
156
+ end
157
+ end
158
+
159
+ ([last_sep] | search_seps).compact.each do |search_sep|
160
+ found = @registry.at(ns.path + search_sep.to_s + part)
161
+ break if found
162
+ end
163
+
164
+ break cur_obj = found if found
165
+ end
166
+
167
+ last_sep = sep
168
+ scopes = types_for_separator(sep) || []
169
+ last_obj = cur_obj
170
+ resolved = cur_obj if parsed_end && cur_obj && (type.nil? || type == cur_obj.type)
171
+ end
172
+
173
+ resolved
174
+ end
175
+
176
+ # Collects and returns all inherited namespaces for a given object
177
+ def collect_namespaces(object)
178
+ return [] unless object.respond_to?(:inheritance_tree)
179
+
180
+ nss = object.inheritance_tree(true)
181
+ if object.respond_to?(:superclass)
182
+ nss |= [P('Object')] if object.superclass != P('BasicObject')
183
+ nss |= [P('BasicObject')]
184
+ end
185
+
186
+ nss
187
+ end
188
+
189
+ # @see NamespaceMapper#register_separator
190
+ def register_separator(*)
191
+ super
192
+ invalidate_memoized_matchers
193
+ end
194
+
195
+ # @see NamespaceMapper#clear_separators
196
+ def clear_separators
197
+ super
198
+ invalidate_memoized_matchers
199
+ end
200
+
201
+ # @see NamespaceMapper#default_separator
202
+ def default_separator(value = nil)
203
+ @starts_with_default_separator_match = nil if value
204
+ super
205
+ end
206
+
207
+ # @return [Regexp] the regexp match of the default separator
208
+ def starts_with_default_separator_match
209
+ @starts_with_default_separator_match ||= /\A#{default_separator}/
210
+ end
211
+
212
+ # @return [Regexp] the regexp that matches strings starting with
213
+ # a separator
214
+ def starts_with_separator_match
215
+ @starts_with_separator_match ||= /\A(#{separators_match})/
216
+ end
217
+
218
+ # @return [Regexp] the regexp that can be used to split a string on all
219
+ # occurrences of separator tokens
220
+ def split_on_separators_match
221
+ @split_on_separators_match ||= /(.+?)(#{separators_match}|$)/
222
+ end
223
+
224
+ # Additional invalidations to done when NamespaceMapper API methods are
225
+ # called on this class
226
+ def invalidate_memoized_matchers
227
+ @starts_with_separator_match = nil
228
+ @split_on_separators_match = nil
229
+ end
230
+ end
231
+ end
@@ -1,337 +1,342 @@
1
- # frozen_string_literal: true
2
- require 'fileutils'
3
-
4
- module YARD
5
- # The data store for the {Registry}.
6
- #
7
- # @see Registry
8
- # @see Serializers::YardocSerializer
9
- class RegistryStore
10
- # @deprecated The registry no longer tracks proxy types
11
- attr_reader :proxy_types
12
- attr_reader :file, :checksums
13
-
14
- def initialize
15
- @file = nil
16
- @checksums = {}
17
- @store = {}
18
- @proxy_types = {}
19
- @object_types = {:root => [:root]}
20
- @notfound = {}
21
- @loaded_objects = 0
22
- @available_objects = 0
23
- @locales = {}
24
- @store[:root] = CodeObjects::RootObject.allocate
25
- @store[:root].send(:initialize, nil, :root)
26
- end
27
-
28
- # Gets a {CodeObjects::Base} from the store
29
- #
30
- # @param [String, Symbol] key the path name of the object to look for.
31
- # If it is empty or :root, returns the {#root} object.
32
- # @return [CodeObjects::Base, nil] a code object or nil if none is found
33
- def get(key)
34
- key = :root if key == ''
35
- key = key.to_sym
36
- return @store[key] if @store[key]
37
- return if @loaded_objects >= @available_objects
38
-
39
- # check disk
40
- return if @notfound[key]
41
- obj = @serializer.deserialize(key)
42
- if obj
43
- @loaded_objects += 1
44
- put(key, obj)
45
- else
46
- @notfound[key] = true
47
- nil
48
- end
49
- end
50
-
51
- # Associates an object with a path
52
- # @param [String, Symbol] key the path name (:root or '' for root object)
53
- # @param [CodeObjects::Base] value the object to store
54
- # @return [CodeObjects::Base] returns +value+
55
- def put(key, value)
56
- if key == ''
57
- @object_types[:root] = [:root]
58
- @store[:root] = value
59
- else
60
- @notfound.delete(key.to_sym)
61
- (@object_types[value.type] ||= []) << key.to_s
62
- if @store[key.to_sym]
63
- @object_types[@store[key.to_sym].type].delete(key.to_s)
64
- end
65
- @store[key.to_sym] = value
66
- end
67
- end
68
-
69
- alias [] get
70
- alias []= put
71
-
72
- # Deletes an object at a given path
73
- # @param [#to_sym] key the key to delete
74
- # @return [void]
75
- def delete(key) @store.delete(key.to_sym) end
76
-
77
- # Gets all path names from the store. Loads the entire database
78
- # if +reload+ is +true+
79
- #
80
- # @param [Boolean] reload if false, does not load the entire database
81
- # before a lookup.
82
- # @return [Array<Symbol>] the path names of all the code objects
83
- def keys(reload = false) load_all if reload; @store.keys end
84
-
85
- # Gets all code objects from the store. Loads the entire database
86
- # if +reload+ is +true+
87
- #
88
- # @param [Boolean] reload if false, does not load the entire database
89
- # before a lookup.
90
- # @return [Array<CodeObjects::Base>] all the code objects
91
- def values(reload = false) load_all if reload; @store.values end
92
-
93
- # @param [Symbol] type the type to look for
94
- # @return [Array<String>] a list of object paths with a given
95
- # {CodeObjects::Base#type}
96
- # @since 0.8.0
97
- def paths_for_type(type, reload = false)
98
- load_all if reload
99
- @object_types[type] || []
100
- end
101
-
102
- # @param [Symbol] type the type to look for
103
- # @return [Array<CodeObjects::Base>] a list of objects with a given
104
- # {CodeObjects::Base#type}
105
- # @since 0.8.0
106
- def values_for_type(type, reload = false)
107
- load_all if reload
108
- paths_for_type(type).map {|t| @store[t.to_sym] }
109
- end
110
-
111
- # @return [CodeObjects::RootObject] the root object
112
- def root; @store[:root] end
113
-
114
- # @param [String] name the locale name.
115
- # @return [I18n::Locale] the locale object for +name+.
116
- # @since 0.8.3
117
- def locale(name)
118
- @locales[name] ||= load_locale(name)
119
- end
120
-
121
- # @param [String, nil] file the name of the yardoc db to load
122
- # @return [Boolean] whether the database was loaded
123
- def load(file = nil)
124
- initialize
125
- @file = file
126
- @serializer = Serializers::YardocSerializer.new(@file)
127
- load_yardoc
128
- end
129
-
130
- # Loads the .yardoc file and loads all cached objects into memory
131
- # automatically.
132
- #
133
- # @param [String, nil] file the name of the yardoc db to load
134
- # @return [Boolean] whether the database was loaded
135
- # @see #load_all
136
- # @since 0.5.1
137
- def load!(file = nil)
138
- if load(file)
139
- load_all
140
- true
141
- else
142
- false
143
- end
144
- end
145
-
146
- # Loads all cached objects into memory
147
- # @return [void]
148
- def load_all
149
- return unless @file
150
- return if @loaded_objects >= @available_objects
151
- log.debug "Loading entire database: #{@file} ..."
152
- objects = []
153
-
154
- all_disk_objects.sort_by(&:size).each do |path|
155
- obj = @serializer.deserialize(path, true)
156
- objects << obj if obj
157
- end
158
-
159
- objects.each do |obj|
160
- put(obj.path, obj)
161
- end
162
-
163
- @loaded_objects += objects.size
164
- log.debug "Loaded database (file='#{@file}' count=#{objects.size} total=#{@available_objects})"
165
- end
166
-
167
- # Saves the database to disk
168
- # @param [Boolean] merge if true, merges the data in memory with the
169
- # data on disk, otherwise the data on disk is deleted.
170
- # @param [String, nil] file if supplied, the name of the file to save to
171
- # @return [Boolean] whether the database was saved
172
- def save(merge = true, file = nil)
173
- if file && file != @file
174
- @file = file
175
- @serializer = Serializers::YardocSerializer.new(@file)
176
- end
177
- destroy unless merge
178
-
179
- sdb = Registry.single_object_db
180
- if sdb == true || sdb.nil?
181
- @serializer.serialize(@store)
182
- else
183
- values(false).each do |object|
184
- @serializer.serialize(object)
185
- end
186
- end
187
- write_proxy_types
188
- write_object_types
189
- write_checksums
190
- write_complete_lock
191
- true
192
- end
193
-
194
- # (see Serializers::YardocSerializer#lock_for_writing)
195
- # @param file [String] if supplied, the path to the database
196
- def lock_for_writing(file = nil, &block)
197
- Serializers::YardocSerializer.new(file || @file).lock_for_writing(&block)
198
- end
199
-
200
- # (see Serializers::YardocSerializer#locked_for_writing?)
201
- # @param file [String] if supplied, the path to the database
202
- def locked_for_writing?(file = nil)
203
- Serializers::YardocSerializer.new(file || @file).locked_for_writing?
204
- end
205
-
206
- # Deletes the .yardoc database on disk
207
- #
208
- # @param [Boolean] force if force is not set to true, the file/directory
209
- # will only be removed if it ends with .yardoc. This helps with
210
- # cases where the directory might have been named incorrectly.
211
- # @return [Boolean] true if the .yardoc database was deleted, false
212
- # otherwise.
213
- def destroy(force = false)
214
- if (!force && file =~ /\.yardoc$/) || force
215
- if File.file?(@file)
216
- # Handle silent upgrade of old .yardoc format
217
- File.unlink(@file)
218
- elsif File.directory?(@file)
219
- FileUtils.rm_rf(@file)
220
- end
221
- true
222
- else
223
- false
224
- end
225
- end
226
-
227
- protected
228
-
229
- def objects_path
230
- @serializer.objects_path
231
- end
232
-
233
- # @deprecated The registry no longer tracks proxy types
234
- def proxy_types_path
235
- @serializer.proxy_types_path
236
- end
237
-
238
- def checksums_path
239
- @serializer.checksums_path
240
- end
241
-
242
- def object_types_path
243
- @serializer.object_types_path
244
- end
245
-
246
- def load_yardoc
247
- return false unless @file
248
- if File.directory?(@file) # new format
249
- @loaded_objects = 0
250
- @available_objects = all_disk_objects.size
251
- load_proxy_types
252
- load_checksums
253
- load_root
254
- load_object_types
255
- true
256
- elsif File.file?(@file) # old format
257
- load_yardoc_old
258
- true
259
- else
260
- false
261
- end
262
- end
263
-
264
- private
265
-
266
- def load_yardoc_old
267
- @store, @proxy_types = *Marshal.load(File.read_binary(@file))
268
- end
269
-
270
- # @deprecated The registry no longer tracks proxy types
271
- def load_proxy_types
272
- return unless File.file?(proxy_types_path)
273
- @proxy_types = Marshal.load(File.read_binary(proxy_types_path))
274
- end
275
-
276
- def load_object_types
277
- if File.file?(object_types_path)
278
- @object_types = Marshal.load(File.read_binary(object_types_path))
279
- else # migrate db without object_types
280
- values.each do |object|
281
- (@object_types[object.type] ||= []) << object.path
282
- end
283
- end
284
- end
285
-
286
- def load_checksums
287
- return unless File.file?(checksums_path)
288
- lines = File.readlines(checksums_path).map do |line|
289
- line.strip.split(/\s+/)
290
- end
291
- @checksums = Hash[lines]
292
- end
293
-
294
- def load_root
295
- root = @serializer.deserialize('root')
296
- return if root.nil?
297
-
298
- @loaded_objects += 1
299
- if root.is_a?(Hash) # single object db
300
- log.debug "Loading single object DB from .yardoc"
301
- @loaded_objects += (root.keys.size - 1)
302
- @store = root
303
- else # just the root object
304
- @store[:root] = root
305
- end
306
- end
307
-
308
- def load_locale(name)
309
- locale = I18n::Locale.new(name)
310
- locale.load(Registry.po_dir)
311
- locale
312
- end
313
-
314
- def all_disk_objects
315
- Dir.glob(File.join(objects_path, '**/*')).select {|f| File.file?(f) }
316
- end
317
-
318
- # @deprecated The registry no longer tracks proxy types
319
- def write_proxy_types
320
- File.open!(proxy_types_path, 'wb') {|f| f.write(Marshal.dump(@proxy_types)) }
321
- end
322
-
323
- def write_object_types
324
- File.open!(object_types_path, 'wb') {|f| f.write(Marshal.dump(@object_types)) }
325
- end
326
-
327
- def write_checksums
328
- File.open!(checksums_path, 'w') do |f|
329
- @checksums.each {|k, v| f.puts("#{k} #{v}") }
330
- end
331
- end
332
-
333
- def write_complete_lock
334
- File.open!(@serializer.complete_lock_path, 'w') {}
335
- end
336
- end
337
- end
1
+ # frozen_string_literal: true
2
+ require 'fileutils'
3
+
4
+ module YARD
5
+ # The data store for the {Registry}.
6
+ #
7
+ # @see Registry
8
+ # @see Serializers::YardocSerializer
9
+ class RegistryStore
10
+ # @deprecated The registry no longer tracks proxy types
11
+ attr_reader :proxy_types
12
+ attr_reader :file, :checksums
13
+
14
+ def initialize
15
+ @file = nil
16
+ @checksums = {}
17
+ @store = {}
18
+ @proxy_types = {}
19
+ @object_types = {:root => [:root]}
20
+ @notfound = {}
21
+ @loaded_objects = 0
22
+ @available_objects = 0
23
+ @locales = {}
24
+ @store[:root] = CodeObjects::RootObject.allocate
25
+ @store[:root].send(:initialize, nil, :root)
26
+ end
27
+
28
+ # Gets a {CodeObjects::Base} from the store
29
+ #
30
+ # @param [String, Symbol] key the path name of the object to look for.
31
+ # If it is empty or :root, returns the {#root} object.
32
+ # @return [CodeObjects::Base, nil] a code object or nil if none is found
33
+ def get(key)
34
+ key = :root if key == ''
35
+ key = key.to_sym
36
+ return @store[key] if @store[key]
37
+ return if @loaded_objects >= @available_objects
38
+
39
+ # check disk
40
+ return if @notfound[key]
41
+ obj = @serializer.deserialize(key)
42
+ if obj
43
+ @loaded_objects += 1
44
+ put(key, obj)
45
+ else
46
+ @notfound[key] = true
47
+ nil
48
+ end
49
+ end
50
+
51
+ # Associates an object with a path
52
+ # @param [String, Symbol] key the path name (:root or '' for root object)
53
+ # @param [CodeObjects::Base] value the object to store
54
+ # @return [CodeObjects::Base] returns +value+
55
+ def put(key, value)
56
+ if key == ''
57
+ @object_types[:root] = [:root]
58
+ @store[:root] = value
59
+ else
60
+ @notfound.delete(key.to_sym)
61
+ (@object_types[value.type] ||= []) << key.to_s
62
+ if @store[key.to_sym]
63
+ @object_types[@store[key.to_sym].type].delete(key.to_s)
64
+ end
65
+ @store[key.to_sym] = value
66
+ end
67
+ end
68
+
69
+ alias [] get
70
+ alias []= put
71
+
72
+ # Deletes an object at a given path
73
+ # @param [#to_sym] key the key to delete
74
+ # @return [void]
75
+ def delete(key)
76
+ if @store[key.to_sym]
77
+ @object_types[@store[key.to_sym].type].delete(key.to_s)
78
+ @store.delete(key.to_sym)
79
+ end
80
+ end
81
+
82
+ # Gets all path names from the store. Loads the entire database
83
+ # if +reload+ is +true+
84
+ #
85
+ # @param [Boolean] reload if false, does not load the entire database
86
+ # before a lookup.
87
+ # @return [Array<Symbol>] the path names of all the code objects
88
+ def keys(reload = false) load_all if reload; @store.keys end
89
+
90
+ # Gets all code objects from the store. Loads the entire database
91
+ # if +reload+ is +true+
92
+ #
93
+ # @param [Boolean] reload if false, does not load the entire database
94
+ # before a lookup.
95
+ # @return [Array<CodeObjects::Base>] all the code objects
96
+ def values(reload = false) load_all if reload; @store.values end
97
+
98
+ # @param [Symbol] type the type to look for
99
+ # @return [Array<String>] a list of object paths with a given
100
+ # {CodeObjects::Base#type}
101
+ # @since 0.8.0
102
+ def paths_for_type(type, reload = false)
103
+ load_all if reload
104
+ @object_types[type] || []
105
+ end
106
+
107
+ # @param [Symbol] type the type to look for
108
+ # @return [Array<CodeObjects::Base>] a list of objects with a given
109
+ # {CodeObjects::Base#type}
110
+ # @since 0.8.0
111
+ def values_for_type(type, reload = false)
112
+ load_all if reload
113
+ paths_for_type(type).map {|t| @store[t.to_sym] }
114
+ end
115
+
116
+ # @return [CodeObjects::RootObject] the root object
117
+ def root; @store[:root] end
118
+
119
+ # @param [String] name the locale name.
120
+ # @return [I18n::Locale] the locale object for +name+.
121
+ # @since 0.8.3
122
+ def locale(name)
123
+ @locales[name] ||= load_locale(name)
124
+ end
125
+
126
+ # @param [String, nil] file the name of the yardoc db to load
127
+ # @return [Boolean] whether the database was loaded
128
+ def load(file = nil)
129
+ initialize
130
+ @file = file
131
+ @serializer = Serializers::YardocSerializer.new(@file)
132
+ load_yardoc
133
+ end
134
+
135
+ # Loads the .yardoc file and loads all cached objects into memory
136
+ # automatically.
137
+ #
138
+ # @param [String, nil] file the name of the yardoc db to load
139
+ # @return [Boolean] whether the database was loaded
140
+ # @see #load_all
141
+ # @since 0.5.1
142
+ def load!(file = nil)
143
+ if load(file)
144
+ load_all
145
+ true
146
+ else
147
+ false
148
+ end
149
+ end
150
+
151
+ # Loads all cached objects into memory
152
+ # @return [void]
153
+ def load_all
154
+ return unless @file
155
+ return if @loaded_objects >= @available_objects
156
+ log.debug "Loading entire database: #{@file} ..."
157
+ objects = []
158
+
159
+ all_disk_objects.sort_by(&:size).each do |path|
160
+ obj = @serializer.deserialize(path, true)
161
+ objects << obj if obj
162
+ end
163
+
164
+ objects.each do |obj|
165
+ put(obj.path, obj)
166
+ end
167
+
168
+ @loaded_objects += objects.size
169
+ log.debug "Loaded database (file='#{@file}' count=#{objects.size} total=#{@available_objects})"
170
+ end
171
+
172
+ # Saves the database to disk
173
+ # @param [Boolean] merge if true, merges the data in memory with the
174
+ # data on disk, otherwise the data on disk is deleted.
175
+ # @param [String, nil] file if supplied, the name of the file to save to
176
+ # @return [Boolean] whether the database was saved
177
+ def save(merge = true, file = nil)
178
+ if file && file != @file
179
+ @file = file
180
+ @serializer = Serializers::YardocSerializer.new(@file)
181
+ end
182
+ destroy unless merge
183
+
184
+ sdb = Registry.single_object_db
185
+ if sdb == true || sdb.nil?
186
+ @serializer.serialize(@store)
187
+ else
188
+ values(false).each do |object|
189
+ @serializer.serialize(object)
190
+ end
191
+ end
192
+ write_proxy_types
193
+ write_object_types
194
+ write_checksums
195
+ write_complete_lock
196
+ true
197
+ end
198
+
199
+ # (see Serializers::YardocSerializer#lock_for_writing)
200
+ # @param file [String] if supplied, the path to the database
201
+ def lock_for_writing(file = nil, &block)
202
+ Serializers::YardocSerializer.new(file || @file).lock_for_writing(&block)
203
+ end
204
+
205
+ # (see Serializers::YardocSerializer#locked_for_writing?)
206
+ # @param file [String] if supplied, the path to the database
207
+ def locked_for_writing?(file = nil)
208
+ Serializers::YardocSerializer.new(file || @file).locked_for_writing?
209
+ end
210
+
211
+ # Deletes the .yardoc database on disk
212
+ #
213
+ # @param [Boolean] force if force is not set to true, the file/directory
214
+ # will only be removed if it ends with .yardoc. This helps with
215
+ # cases where the directory might have been named incorrectly.
216
+ # @return [Boolean] true if the .yardoc database was deleted, false
217
+ # otherwise.
218
+ def destroy(force = false)
219
+ if (!force && file =~ /\.yardoc$/) || force
220
+ if File.file?(@file)
221
+ # Handle silent upgrade of old .yardoc format
222
+ File.unlink(@file)
223
+ elsif File.directory?(@file)
224
+ FileUtils.rm_rf(@file)
225
+ end
226
+ true
227
+ else
228
+ false
229
+ end
230
+ end
231
+
232
+ protected
233
+
234
+ def objects_path
235
+ @serializer.objects_path
236
+ end
237
+
238
+ # @deprecated The registry no longer tracks proxy types
239
+ def proxy_types_path
240
+ @serializer.proxy_types_path
241
+ end
242
+
243
+ def checksums_path
244
+ @serializer.checksums_path
245
+ end
246
+
247
+ def object_types_path
248
+ @serializer.object_types_path
249
+ end
250
+
251
+ def load_yardoc
252
+ return false unless @file
253
+ if File.directory?(@file) # new format
254
+ @loaded_objects = 0
255
+ @available_objects = all_disk_objects.size
256
+ load_proxy_types
257
+ load_checksums
258
+ load_root
259
+ load_object_types
260
+ true
261
+ elsif File.file?(@file) # old format
262
+ load_yardoc_old
263
+ true
264
+ else
265
+ false
266
+ end
267
+ end
268
+
269
+ private
270
+
271
+ def load_yardoc_old
272
+ @store, @proxy_types = *Marshal.load(File.read_binary(@file))
273
+ end
274
+
275
+ # @deprecated The registry no longer tracks proxy types
276
+ def load_proxy_types
277
+ return unless File.file?(proxy_types_path)
278
+ @proxy_types = Marshal.load(File.read_binary(proxy_types_path))
279
+ end
280
+
281
+ def load_object_types
282
+ if File.file?(object_types_path)
283
+ @object_types = Marshal.load(File.read_binary(object_types_path))
284
+ else # migrate db without object_types
285
+ values.each do |object|
286
+ (@object_types[object.type] ||= []) << object.path
287
+ end
288
+ end
289
+ end
290
+
291
+ def load_checksums
292
+ return unless File.file?(checksums_path)
293
+ lines = File.readlines(checksums_path).map do |line|
294
+ line.strip.split(/\s+/)
295
+ end
296
+ @checksums = Hash[lines]
297
+ end
298
+
299
+ def load_root
300
+ root = @serializer.deserialize('root')
301
+ return if root.nil?
302
+
303
+ @loaded_objects += 1
304
+ if root.is_a?(Hash) # single object db
305
+ log.debug "Loading single object DB from .yardoc"
306
+ @loaded_objects += (root.keys.size - 1)
307
+ @store = root
308
+ else # just the root object
309
+ @store[:root] = root
310
+ end
311
+ end
312
+
313
+ def load_locale(name)
314
+ locale = I18n::Locale.new(name)
315
+ locale.load(Registry.po_dir)
316
+ locale
317
+ end
318
+
319
+ def all_disk_objects
320
+ Dir.glob(File.join(objects_path, '**/*')).select {|f| File.file?(f) }
321
+ end
322
+
323
+ # @deprecated The registry no longer tracks proxy types
324
+ def write_proxy_types
325
+ File.open!(proxy_types_path, 'wb') {|f| f.write(Marshal.dump(@proxy_types)) }
326
+ end
327
+
328
+ def write_object_types
329
+ File.open!(object_types_path, 'wb') {|f| f.write(Marshal.dump(@object_types)) }
330
+ end
331
+
332
+ def write_checksums
333
+ File.open!(checksums_path, 'w') do |f|
334
+ @checksums.each {|k, v| f.puts("#{k} #{v}") }
335
+ end
336
+ end
337
+
338
+ def write_complete_lock
339
+ File.open!(@serializer.complete_lock_path, 'w') {}
340
+ end
341
+ end
342
+ end