yard 0.9.16 → 0.9.17
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of yard might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/.yardopts +26 -26
- data/CHANGELOG.md +728 -728
- data/LEGAL +66 -66
- data/LICENSE +22 -22
- data/README.md +328 -328
- data/Rakefile +53 -47
- data/benchmarks/builtins_vs_eval.rb +24 -24
- data/benchmarks/concat_vs_join.rb +13 -13
- data/benchmarks/erb_vs_erubis.rb +54 -54
- data/benchmarks/format_args.rb +47 -47
- data/benchmarks/generation.rb +38 -38
- data/benchmarks/marshal_vs_dbm.rb +64 -64
- data/benchmarks/parsing.rb +46 -46
- data/benchmarks/pathname_vs_string.rb +50 -50
- data/benchmarks/rdoc_vs_yardoc.rb +11 -11
- data/benchmarks/registry_store_types.rb +49 -49
- data/benchmarks/ri_vs_yri.rb +19 -19
- data/benchmarks/ripper_parser.rb +13 -13
- data/benchmarks/splat_vs_flatten.rb +13 -13
- data/benchmarks/template_erb.rb +23 -23
- data/benchmarks/template_format.rb +7 -7
- data/benchmarks/template_profile.rb +18 -18
- data/benchmarks/yri_cache.rb +20 -20
- data/bin/yard +13 -13
- data/bin/yardoc +13 -13
- data/bin/yri +13 -13
- data/docs/CodeObjects.md +115 -115
- data/docs/GettingStarted.md +679 -679
- data/docs/Handlers.md +152 -152
- data/docs/Overview.md +61 -61
- data/docs/Parser.md +191 -191
- data/docs/Tags.md +283 -283
- data/docs/TagsArch.md +123 -123
- data/docs/Templates.md +496 -496
- data/docs/WhatsNew.md +1245 -1245
- data/docs/templates/default/fulldoc/html/full_list_tag.erb +8 -8
- data/docs/templates/default/fulldoc/html/setup.rb +6 -6
- data/docs/templates/default/layout/html/setup.rb +9 -9
- data/docs/templates/default/layout/html/tag_list.erb +11 -11
- data/docs/templates/default/yard_tags/html/list.erb +18 -18
- data/docs/templates/default/yard_tags/html/setup.rb +26 -26
- data/docs/templates/plugin.rb +70 -70
- data/lib/rubygems_plugin.rb +9 -9
- data/lib/yard.rb +69 -69
- data/lib/yard/autoload.rb +303 -303
- data/lib/yard/cli/command.rb +85 -85
- data/lib/yard/cli/command_parser.rb +93 -93
- data/lib/yard/cli/config.rb +198 -198
- data/lib/yard/cli/diff.rb +270 -270
- data/lib/yard/cli/display.rb +69 -69
- data/lib/yard/cli/gems.rb +84 -84
- data/lib/yard/cli/graph.rb +125 -125
- data/lib/yard/cli/help.rb +20 -20
- data/lib/yard/cli/i18n.rb +70 -70
- data/lib/yard/cli/list.rb +23 -23
- data/lib/yard/cli/markup_types.rb +32 -32
- data/lib/yard/cli/server.rb +257 -257
- data/lib/yard/cli/stats.rb +231 -231
- data/lib/yard/cli/yardoc.rb +788 -788
- data/lib/yard/cli/yardopts_command.rb +110 -110
- data/lib/yard/cli/yri.rb +215 -215
- data/lib/yard/code_objects/base.rb +615 -610
- data/lib/yard/code_objects/class_object.rb +146 -146
- data/lib/yard/code_objects/class_variable_object.rb +11 -11
- data/lib/yard/code_objects/constant_object.rb +16 -16
- data/lib/yard/code_objects/extended_method_object.rb +24 -24
- data/lib/yard/code_objects/extra_file_object.rb +131 -131
- data/lib/yard/code_objects/macro_object.rb +172 -172
- data/lib/yard/code_objects/method_object.rb +196 -196
- data/lib/yard/code_objects/module_object.rb +21 -21
- data/lib/yard/code_objects/namespace_mapper.rb +114 -114
- data/lib/yard/code_objects/namespace_object.rb +200 -200
- data/lib/yard/code_objects/proxy.rb +240 -240
- data/lib/yard/code_objects/root_object.rb +19 -19
- data/lib/yard/config.rb +270 -270
- data/lib/yard/core_ext/array.rb +16 -16
- data/lib/yard/core_ext/file.rb +69 -69
- data/lib/yard/core_ext/hash.rb +16 -16
- data/lib/yard/core_ext/insertion.rb +63 -63
- data/lib/yard/core_ext/module.rb +20 -20
- data/lib/yard/core_ext/string.rb +68 -68
- data/lib/yard/core_ext/symbol_hash.rb +75 -75
- data/lib/yard/docstring.rb +386 -378
- data/lib/yard/docstring_parser.rb +345 -345
- data/lib/yard/gem_index.rb +29 -29
- data/lib/yard/globals.rb +22 -22
- data/lib/yard/handlers/base.rb +595 -595
- data/lib/yard/handlers/c/alias_handler.rb +16 -16
- data/lib/yard/handlers/c/attribute_handler.rb +13 -13
- data/lib/yard/handlers/c/base.rb +129 -129
- data/lib/yard/handlers/c/class_handler.rb +27 -27
- data/lib/yard/handlers/c/constant_handler.rb +13 -13
- data/lib/yard/handlers/c/handler_methods.rb +211 -211
- data/lib/yard/handlers/c/init_handler.rb +20 -20
- data/lib/yard/handlers/c/method_handler.rb +45 -36
- data/lib/yard/handlers/c/mixin_handler.rb +21 -21
- data/lib/yard/handlers/c/module_handler.rb +17 -17
- data/lib/yard/handlers/c/override_comment_handler.rb +31 -31
- data/lib/yard/handlers/c/path_handler.rb +11 -11
- data/lib/yard/handlers/c/struct_handler.rb +13 -13
- data/lib/yard/handlers/c/symbol_handler.rb +8 -8
- data/lib/yard/handlers/processor.rb +200 -200
- data/lib/yard/handlers/ruby/alias_handler.rb +44 -44
- data/lib/yard/handlers/ruby/attribute_handler.rb +87 -87
- data/lib/yard/handlers/ruby/base.rb +165 -165
- data/lib/yard/handlers/ruby/class_condition_handler.rb +92 -92
- data/lib/yard/handlers/ruby/class_handler.rb +119 -119
- data/lib/yard/handlers/ruby/class_variable_handler.rb +17 -17
- data/lib/yard/handlers/ruby/comment_handler.rb +10 -10
- data/lib/yard/handlers/ruby/constant_handler.rb +59 -59
- data/lib/yard/handlers/ruby/decorator_handler_methods.rb +123 -123
- data/lib/yard/handlers/ruby/dsl_handler.rb +15 -15
- data/lib/yard/handlers/ruby/dsl_handler_methods.rb +96 -95
- data/lib/yard/handlers/ruby/exception_handler.rb +27 -27
- data/lib/yard/handlers/ruby/extend_handler.rb +22 -22
- data/lib/yard/handlers/ruby/legacy/alias_handler.rb +37 -37
- data/lib/yard/handlers/ruby/legacy/attribute_handler.rb +65 -65
- data/lib/yard/handlers/ruby/legacy/base.rb +245 -245
- data/lib/yard/handlers/ruby/legacy/class_condition_handler.rb +83 -83
- data/lib/yard/handlers/ruby/legacy/class_handler.rb +113 -113
- data/lib/yard/handlers/ruby/legacy/class_variable_handler.rb +15 -15
- data/lib/yard/handlers/ruby/legacy/comment_handler.rb +10 -10
- data/lib/yard/handlers/ruby/legacy/constant_handler.rb +29 -29
- data/lib/yard/handlers/ruby/legacy/dsl_handler.rb +17 -17
- data/lib/yard/handlers/ruby/legacy/exception_handler.rb +13 -13
- data/lib/yard/handlers/ruby/legacy/extend_handler.rb +21 -21
- data/lib/yard/handlers/ruby/legacy/method_handler.rb +90 -90
- data/lib/yard/handlers/ruby/legacy/mixin_handler.rb +39 -39
- data/lib/yard/handlers/ruby/legacy/module_function_handler.rb +19 -19
- data/lib/yard/handlers/ruby/legacy/module_handler.rb +12 -12
- data/lib/yard/handlers/ruby/legacy/private_class_method_handler.rb +22 -22
- data/lib/yard/handlers/ruby/legacy/private_constant_handler.rb +22 -22
- data/lib/yard/handlers/ruby/legacy/visibility_handler.rb +17 -17
- data/lib/yard/handlers/ruby/legacy/yield_handler.rb +29 -29
- data/lib/yard/handlers/ruby/method_condition_handler.rb +9 -9
- data/lib/yard/handlers/ruby/method_handler.rb +118 -118
- data/lib/yard/handlers/ruby/mixin_handler.rb +37 -37
- data/lib/yard/handlers/ruby/module_function_handler.rb +27 -27
- data/lib/yard/handlers/ruby/module_handler.rb +12 -12
- data/lib/yard/handlers/ruby/private_class_method_handler.rb +14 -14
- data/lib/yard/handlers/ruby/private_constant_handler.rb +43 -43
- data/lib/yard/handlers/ruby/public_class_method_handler.rb +14 -14
- data/lib/yard/handlers/ruby/struct_handler_methods.rb +143 -143
- data/lib/yard/handlers/ruby/visibility_handler.rb +22 -22
- data/lib/yard/handlers/ruby/yield_handler.rb +31 -31
- data/lib/yard/i18n/locale.rb +67 -67
- data/lib/yard/i18n/message.rb +57 -57
- data/lib/yard/i18n/messages.rb +56 -56
- data/lib/yard/i18n/po_parser.rb +61 -61
- data/lib/yard/i18n/pot_generator.rb +290 -290
- data/lib/yard/i18n/text.rb +173 -173
- data/lib/yard/logging.rb +205 -205
- data/lib/yard/options.rb +217 -217
- data/lib/yard/parser/base.rb +57 -57
- data/lib/yard/parser/c/c_parser.rb +235 -235
- data/lib/yard/parser/c/comment_parser.rb +134 -134
- data/lib/yard/parser/c/statement.rb +64 -64
- data/lib/yard/parser/ruby/ast_node.rb +540 -540
- data/lib/yard/parser/ruby/legacy/ruby_lex.rb +1354 -1354
- data/lib/yard/parser/ruby/legacy/ruby_parser.rb +32 -32
- data/lib/yard/parser/ruby/legacy/statement.rb +66 -66
- data/lib/yard/parser/ruby/legacy/statement_list.rb +394 -394
- data/lib/yard/parser/ruby/legacy/token_list.rb +74 -74
- data/lib/yard/parser/ruby/ruby_parser.rb +687 -687
- data/lib/yard/parser/ruby/token_resolver.rb +156 -156
- data/lib/yard/parser/source_parser.rb +526 -526
- data/lib/yard/rake/yardoc_task.rb +81 -81
- data/lib/yard/registry.rb +439 -439
- data/lib/yard/registry_resolver.rb +189 -189
- data/lib/yard/registry_store.rb +337 -337
- data/lib/yard/rubygems/backports.rb +10 -10
- data/lib/yard/rubygems/backports/LICENSE.txt +57 -57
- data/lib/yard/rubygems/backports/MIT.txt +20 -20
- data/lib/yard/rubygems/backports/gem.rb +10 -10
- data/lib/yard/rubygems/backports/source_index.rb +365 -365
- data/lib/yard/rubygems/doc_manager.rb +90 -90
- data/lib/yard/rubygems/hook.rb +197 -197
- data/lib/yard/rubygems/specification.rb +50 -50
- data/lib/yard/serializers/base.rb +83 -83
- data/lib/yard/serializers/file_system_serializer.rb +123 -123
- data/lib/yard/serializers/process_serializer.rb +24 -24
- data/lib/yard/serializers/stdout_serializer.rb +34 -34
- data/lib/yard/serializers/yardoc_serializer.rb +152 -152
- data/lib/yard/server.rb +13 -13
- data/lib/yard/server/adapter.rb +100 -100
- data/lib/yard/server/commands/base.rb +209 -209
- data/lib/yard/server/commands/display_file_command.rb +29 -29
- data/lib/yard/server/commands/display_object_command.rb +65 -65
- data/lib/yard/server/commands/frames_command.rb +16 -16
- data/lib/yard/server/commands/library_command.rb +187 -187
- data/lib/yard/server/commands/library_index_command.rb +28 -28
- data/lib/yard/server/commands/list_command.rb +25 -25
- data/lib/yard/server/commands/root_request_command.rb +15 -15
- data/lib/yard/server/commands/search_command.rb +79 -79
- data/lib/yard/server/commands/static_file_command.rb +23 -23
- data/lib/yard/server/commands/static_file_helpers.rb +62 -62
- data/lib/yard/server/doc_server_helper.rb +91 -91
- data/lib/yard/server/doc_server_serializer.rb +39 -39
- data/lib/yard/server/library_version.rb +277 -277
- data/lib/yard/server/rack_adapter.rb +89 -89
- data/lib/yard/server/router.rb +187 -187
- data/lib/yard/server/static_caching.rb +46 -46
- data/lib/yard/server/templates/default/fulldoc/html/css/custom.css +127 -127
- data/lib/yard/server/templates/default/fulldoc/html/js/autocomplete.js +11 -11
- data/lib/yard/server/templates/default/layout/html/breadcrumb.erb +37 -37
- data/lib/yard/server/templates/default/layout/html/script_setup.erb +7 -7
- data/lib/yard/server/templates/default/layout/html/setup.rb +8 -8
- data/lib/yard/server/templates/default/method_details/html/permalink.erb +4 -4
- data/lib/yard/server/templates/default/method_details/html/setup.rb +5 -5
- data/lib/yard/server/templates/doc_server/library_list/html/headers.erb +8 -8
- data/lib/yard/server/templates/doc_server/library_list/html/library_list.erb +14 -14
- data/lib/yard/server/templates/doc_server/library_list/html/listing.erb +13 -13
- data/lib/yard/server/templates/doc_server/library_list/html/setup.rb +6 -6
- data/lib/yard/server/templates/doc_server/library_list/html/title.erb +2 -2
- data/lib/yard/server/templates/doc_server/processing/html/processing.erb +52 -52
- data/lib/yard/server/templates/doc_server/processing/html/setup.rb +4 -4
- data/lib/yard/server/templates/doc_server/search/html/search.erb +18 -18
- data/lib/yard/server/templates/doc_server/search/html/setup.rb +9 -9
- data/lib/yard/server/webrick_adapter.rb +45 -45
- data/lib/yard/tags/default_factory.rb +191 -191
- data/lib/yard/tags/default_tag.rb +13 -13
- data/lib/yard/tags/directives.rb +616 -616
- data/lib/yard/tags/library.rb +633 -633
- data/lib/yard/tags/option_tag.rb +13 -13
- data/lib/yard/tags/overload_tag.rb +71 -71
- data/lib/yard/tags/ref_tag.rb +8 -8
- data/lib/yard/tags/ref_tag_list.rb +28 -28
- data/lib/yard/tags/tag.rb +71 -71
- data/lib/yard/tags/tag_format_error.rb +7 -7
- data/lib/yard/tags/types_explainer.rb +162 -162
- data/lib/yard/templates/engine.rb +186 -186
- data/lib/yard/templates/erb_cache.rb +23 -23
- data/lib/yard/templates/helpers/base_helper.rb +215 -215
- data/lib/yard/templates/helpers/filter_helper.rb +27 -27
- data/lib/yard/templates/helpers/html_helper.rb +646 -642
- data/lib/yard/templates/helpers/html_syntax_highlight_helper.rb +78 -78
- data/lib/yard/templates/helpers/markup/rdoc_markdown.rb +23 -23
- data/lib/yard/templates/helpers/markup/rdoc_markup.rb +109 -109
- data/lib/yard/templates/helpers/markup_helper.rb +172 -172
- data/lib/yard/templates/helpers/method_helper.rb +75 -75
- data/lib/yard/templates/helpers/module_helper.rb +21 -21
- data/lib/yard/templates/helpers/text_helper.rb +112 -112
- data/lib/yard/templates/helpers/uml_helper.rb +47 -47
- data/lib/yard/templates/section.rb +105 -105
- data/lib/yard/templates/template.rb +418 -418
- data/lib/yard/templates/template_options.rb +92 -92
- data/lib/yard/verifier.rb +151 -151
- data/lib/yard/version.rb +3 -1
- data/spec/cli/command_parser_spec.rb +43 -43
- data/spec/cli/command_spec.rb +36 -36
- data/spec/cli/config_spec.rb +148 -148
- data/spec/cli/diff_spec.rb +254 -254
- data/spec/cli/display_spec.rb +30 -30
- data/spec/cli/gems_spec.rb +81 -81
- data/spec/cli/graph_spec.rb +18 -18
- data/spec/cli/help_spec.rb +22 -22
- data/spec/cli/i18n_spec.rb +107 -107
- data/spec/cli/list_spec.rb +8 -8
- data/spec/cli/markup_types_spec.rb +22 -22
- data/spec/cli/server_spec.rb +324 -324
- data/spec/cli/stats_spec.rb +96 -96
- data/spec/cli/yard_on_yard_spec.rb +38 -38
- data/spec/cli/yardoc_spec.rb +862 -849
- data/spec/cli/yri_spec.rb +101 -101
- data/spec/code_objects/base_spec.rb +470 -460
- data/spec/code_objects/class_object_spec.rb +226 -226
- data/spec/code_objects/code_object_list_spec.rb +36 -36
- data/spec/code_objects/constants_spec.rb +116 -116
- data/spec/code_objects/extra_file_object_spec.rb +160 -160
- data/spec/code_objects/macro_object_spec.rb +150 -150
- data/spec/code_objects/method_object_spec.rb +184 -184
- data/spec/code_objects/module_object_spec.rb +142 -142
- data/spec/code_objects/namespace_object_spec.rb +171 -171
- data/spec/code_objects/proxy_spec.rb +141 -141
- data/spec/code_objects/spec_helper.rb +3 -3
- data/spec/config_spec.rb +171 -171
- data/spec/core_ext/array_spec.rb +13 -13
- data/spec/core_ext/file_spec.rb +72 -72
- data/spec/core_ext/hash_spec.rb +14 -14
- data/spec/core_ext/insertion_spec.rb +37 -37
- data/spec/core_ext/module_spec.rb +15 -15
- data/spec/core_ext/string_spec.rb +42 -42
- data/spec/core_ext/symbol_hash_spec.rb +89 -89
- data/spec/docstring_parser_spec.rb +280 -262
- data/spec/docstring_spec.rb +373 -364
- data/spec/examples.txt +1875 -1871
- data/spec/handlers/alias_handler_spec.rb +82 -82
- data/spec/handlers/attribute_handler_spec.rb +96 -96
- data/spec/handlers/base_spec.rb +216 -216
- data/spec/handlers/c/alias_handler_spec.rb +34 -34
- data/spec/handlers/c/attribute_handler_spec.rb +41 -41
- data/spec/handlers/c/class_handler_spec.rb +78 -78
- data/spec/handlers/c/constant_handler_spec.rb +71 -71
- data/spec/handlers/c/init_handler_spec.rb +48 -48
- data/spec/handlers/c/method_handler_spec.rb +325 -325
- data/spec/handlers/c/mixin_handler_spec.rb +44 -44
- data/spec/handlers/c/module_handler_spec.rb +71 -71
- data/spec/handlers/c/override_comment_handler_spec.rb +47 -47
- data/spec/handlers/c/path_handler_spec.rb +36 -36
- data/spec/handlers/c/spec_helper.rb +23 -23
- data/spec/handlers/c/struct_handler_spec.rb +16 -16
- data/spec/handlers/class_condition_handler_spec.rb +87 -87
- data/spec/handlers/class_handler_spec.rb +247 -247
- data/spec/handlers/class_method_handler_shared_examples.rb +133 -133
- data/spec/handlers/class_variable_handler_spec.rb +12 -12
- data/spec/handlers/constant_handler_spec.rb +112 -112
- data/spec/handlers/decorator_handler_methods_spec.rb +393 -393
- data/spec/handlers/dsl_handler_spec.rb +219 -219
- data/spec/handlers/examples/alias_handler_001.rb.txt +45 -45
- data/spec/handlers/examples/attribute_handler_001.rb.txt +31 -31
- data/spec/handlers/examples/class_condition_handler_001.rb.txt +68 -68
- data/spec/handlers/examples/class_handler_001.rb.txt +120 -120
- data/spec/handlers/examples/class_variable_handler_001.rb.txt +9 -9
- data/spec/handlers/examples/constant_handler_001.rb.txt +35 -35
- data/spec/handlers/examples/dsl_handler_001.rb.txt +154 -154
- data/spec/handlers/examples/exception_handler_001.rb.txt +58 -58
- data/spec/handlers/examples/extend_handler_001.rb.txt +15 -15
- data/spec/handlers/examples/method_condition_handler_001.rb.txt +9 -9
- data/spec/handlers/examples/method_handler_001.rb.txt +128 -128
- data/spec/handlers/examples/mixin_handler_001.rb.txt +37 -37
- data/spec/handlers/examples/module_handler_001.rb.txt +29 -29
- data/spec/handlers/examples/private_constant_handler_001.rb.txt +8 -8
- data/spec/handlers/examples/process_handler_001.rb.txt +11 -11
- data/spec/handlers/examples/visibility_handler_001.rb.txt +35 -35
- data/spec/handlers/examples/yield_handler_001.rb.txt +54 -54
- data/spec/handlers/exception_handler_spec.rb +49 -49
- data/spec/handlers/extend_handler_spec.rb +24 -24
- data/spec/handlers/legacy_base_spec.rb +128 -128
- data/spec/handlers/method_condition_handler_spec.rb +15 -15
- data/spec/handlers/method_handler_spec.rb +190 -190
- data/spec/handlers/mixin_handler_spec.rb +56 -56
- data/spec/handlers/module_function_handler_spec.rb +106 -106
- data/spec/handlers/module_handler_spec.rb +35 -35
- data/spec/handlers/private_class_method_handler_spec.rb +11 -11
- data/spec/handlers/private_constant_handler_spec.rb +25 -25
- data/spec/handlers/processor_spec.rb +35 -35
- data/spec/handlers/public_class_method_handler_spec.rb +11 -11
- data/spec/handlers/ruby/base_spec.rb +95 -95
- data/spec/handlers/ruby/legacy/base_spec.rb +84 -84
- data/spec/handlers/spec_helper.rb +33 -33
- data/spec/handlers/visibility_handler_spec.rb +44 -44
- data/spec/handlers/yield_handler_spec.rb +52 -52
- data/spec/i18n/locale_spec.rb +81 -81
- data/spec/i18n/message_spec.rb +52 -52
- data/spec/i18n/messages_spec.rb +67 -67
- data/spec/i18n/pot_generator_spec.rb +295 -295
- data/spec/i18n/text_spec.rb +184 -184
- data/spec/logging_spec.rb +44 -44
- data/spec/options_spec.rb +171 -171
- data/spec/parser/base_spec.rb +24 -24
- data/spec/parser/c_parser_spec.rb +236 -223
- data/spec/parser/examples/array.c.txt +6267 -6267
- data/spec/parser/examples/example1.rb.txt +7 -7
- data/spec/parser/examples/extrafile.c.txt +8 -8
- data/spec/parser/examples/file.c.txt +28 -0
- data/spec/parser/examples/multifile.c.txt +22 -22
- data/spec/parser/examples/namespace.cpp.txt +68 -68
- data/spec/parser/examples/override.c.txt +424 -424
- data/spec/parser/examples/parse_in_order_001.rb.txt +2 -2
- data/spec/parser/examples/parse_in_order_002.rb.txt +1 -1
- data/spec/parser/examples/tag_handler_001.rb.txt +7 -7
- data/spec/parser/ruby/ast_node_spec.rb +33 -33
- data/spec/parser/ruby/legacy/statement_list_spec.rb +299 -299
- data/spec/parser/ruby/legacy/token_list_spec.rb +79 -79
- data/spec/parser/ruby/ruby_parser_spec.rb +508 -508
- data/spec/parser/ruby/token_resolver_spec.rb +165 -165
- data/spec/parser/source_parser_spec.rb +727 -727
- data/spec/parser/tag_parsing_spec.rb +17 -17
- data/spec/rake/yardoc_task_spec.rb +118 -118
- data/spec/registry_spec.rb +463 -463
- data/spec/registry_store_spec.rb +316 -316
- data/spec/rubygems/doc_manager_spec.rb +112 -112
- data/spec/serializers/data/serialized_yardoc/checksums +1 -1
- data/spec/serializers/file_system_serializer_spec.rb +145 -145
- data/spec/serializers/spec_helper.rb +2 -2
- data/spec/serializers/yardoc_serializer_spec.rb +78 -78
- data/spec/server/adapter_spec.rb +39 -39
- data/spec/server/commands/base_spec.rb +91 -91
- data/spec/server/commands/library_command_spec.rb +39 -39
- data/spec/server/doc_server_helper_spec.rb +72 -72
- data/spec/server/doc_server_serializer_spec.rb +60 -60
- data/spec/server/rack_adapter_spec.rb +21 -21
- data/spec/server/router_spec.rb +123 -123
- data/spec/server/spec_helper.rb +22 -22
- data/spec/server/static_caching_spec.rb +47 -47
- data/spec/server/webrick_servlet_spec.rb +20 -20
- data/spec/server_spec.rb +19 -19
- data/spec/spec_helper.rb +212 -212
- data/spec/tags/default_factory_spec.rb +168 -168
- data/spec/tags/default_tag_spec.rb +11 -11
- data/spec/tags/directives_spec.rb +463 -463
- data/spec/tags/library_spec.rb +48 -48
- data/spec/tags/overload_tag_spec.rb +53 -53
- data/spec/tags/ref_tag_list_spec.rb +53 -53
- data/spec/tags/types_explainer_spec.rb +203 -203
- data/spec/templates/class_spec.rb +45 -45
- data/spec/templates/constant_spec.rb +41 -41
- data/spec/templates/engine_spec.rb +131 -131
- data/spec/templates/examples/class001.html +308 -308
- data/spec/templates/examples/class001.txt +36 -36
- data/spec/templates/examples/class002.html +39 -39
- data/spec/templates/examples/constant001.txt +24 -24
- data/spec/templates/examples/constant002.txt +6 -6
- data/spec/templates/examples/constant003.txt +10 -10
- data/spec/templates/examples/method001.html +137 -137
- data/spec/templates/examples/method001.txt +35 -35
- data/spec/templates/examples/method002.html +91 -91
- data/spec/templates/examples/method002.txt +20 -20
- data/spec/templates/examples/method003.html +165 -165
- data/spec/templates/examples/method003.txt +45 -45
- data/spec/templates/examples/method004.html +48 -48
- data/spec/templates/examples/method004.txt +10 -10
- data/spec/templates/examples/method005.html +105 -105
- data/spec/templates/examples/method005.txt +33 -33
- data/spec/templates/examples/method006.html +107 -107
- data/spec/templates/examples/method006.txt +20 -20
- data/spec/templates/examples/module001.dot +33 -33
- data/spec/templates/examples/module001.html +833 -833
- data/spec/templates/examples/module001.txt +33 -33
- data/spec/templates/examples/module002.html +341 -341
- data/spec/templates/examples/module003.html +202 -202
- data/spec/templates/examples/module004.html +394 -394
- data/spec/templates/examples/module005.html +81 -81
- data/spec/templates/examples/tag001.txt +82 -82
- data/spec/templates/helpers/base_helper_spec.rb +171 -171
- data/spec/templates/helpers/html_helper_spec.rb +668 -653
- data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +65 -65
- data/spec/templates/helpers/markup/rdoc_markup_spec.rb +84 -84
- data/spec/templates/helpers/markup_helper_spec.rb +136 -136
- data/spec/templates/helpers/method_helper_spec.rb +107 -107
- data/spec/templates/helpers/module_helper_spec.rb +35 -35
- data/spec/templates/helpers/shared_signature_examples.rb +126 -126
- data/spec/templates/helpers/text_helper_spec.rb +65 -65
- data/spec/templates/method_spec.rb +118 -118
- data/spec/templates/module_spec.rb +203 -203
- data/spec/templates/onefile_spec.rb +66 -66
- data/spec/templates/section_spec.rb +144 -144
- data/spec/templates/spec_helper.rb +76 -76
- data/spec/templates/tag_spec.rb +52 -52
- data/spec/templates/template_spec.rb +410 -410
- data/spec/verifier_spec.rb +106 -106
- data/templates/default/class/dot/setup.rb +7 -7
- data/templates/default/class/dot/superklass.erb +2 -2
- data/templates/default/class/html/constructor_details.erb +8 -8
- data/templates/default/class/html/setup.rb +2 -2
- data/templates/default/class/html/subclasses.erb +4 -4
- data/templates/default/class/setup.rb +36 -36
- data/templates/default/class/text/setup.rb +12 -12
- data/templates/default/class/text/subclasses.erb +5 -5
- data/templates/default/constant/text/header.erb +11 -11
- data/templates/default/constant/text/setup.rb +4 -4
- data/templates/default/docstring/html/abstract.erb +4 -4
- data/templates/default/docstring/html/deprecated.erb +1 -1
- data/templates/default/docstring/html/index.erb +5 -5
- data/templates/default/docstring/html/note.erb +6 -6
- data/templates/default/docstring/html/private.erb +4 -4
- data/templates/default/docstring/html/text.erb +1 -1
- data/templates/default/docstring/html/todo.erb +6 -6
- data/templates/default/docstring/setup.rb +52 -52
- data/templates/default/docstring/text/abstract.erb +2 -2
- data/templates/default/docstring/text/deprecated.erb +2 -2
- data/templates/default/docstring/text/index.erb +2 -2
- data/templates/default/docstring/text/note.erb +3 -3
- data/templates/default/docstring/text/private.erb +2 -2
- data/templates/default/docstring/text/text.erb +1 -1
- data/templates/default/docstring/text/todo.erb +3 -3
- data/templates/default/fulldoc/html/css/full_list.css +58 -58
- data/templates/default/fulldoc/html/css/style.css +496 -496
- data/templates/default/fulldoc/html/frames.erb +17 -17
- data/templates/default/fulldoc/html/full_list.erb +37 -37
- data/templates/default/fulldoc/html/full_list_class.erb +2 -2
- data/templates/default/fulldoc/html/full_list_file.erb +7 -7
- data/templates/default/fulldoc/html/full_list_method.erb +10 -10
- data/templates/default/fulldoc/html/js/app.js +292 -292
- data/templates/default/fulldoc/html/js/full_list.js +216 -216
- data/templates/default/fulldoc/html/js/jquery.js +3 -3
- data/templates/default/fulldoc/html/setup.rb +241 -241
- data/templates/default/layout/dot/header.erb +5 -5
- data/templates/default/layout/dot/setup.rb +15 -15
- data/templates/default/layout/html/breadcrumb.erb +11 -11
- data/templates/default/layout/html/files.erb +11 -11
- data/templates/default/layout/html/footer.erb +5 -5
- data/templates/default/layout/html/headers.erb +15 -15
- data/templates/default/layout/html/index.erb +2 -2
- data/templates/default/layout/html/layout.erb +23 -23
- data/templates/default/layout/html/listing.erb +4 -4
- data/templates/default/layout/html/objects.erb +32 -32
- data/templates/default/layout/html/script_setup.erb +4 -4
- data/templates/default/layout/html/search.erb +12 -12
- data/templates/default/layout/html/setup.rb +89 -89
- data/templates/default/method/html/header.erb +16 -16
- data/templates/default/method/setup.rb +4 -4
- data/templates/default/method_details/html/header.erb +2 -2
- data/templates/default/method_details/html/method_signature.erb +24 -24
- data/templates/default/method_details/html/source.erb +9 -9
- data/templates/default/method_details/setup.rb +11 -11
- data/templates/default/method_details/text/header.erb +10 -10
- data/templates/default/method_details/text/method_signature.erb +12 -12
- data/templates/default/method_details/text/setup.rb +11 -11
- data/templates/default/module/dot/child.erb +1 -1
- data/templates/default/module/dot/dependencies.erb +2 -2
- data/templates/default/module/dot/header.erb +6 -6
- data/templates/default/module/dot/info.erb +13 -13
- data/templates/default/module/dot/setup.rb +15 -15
- data/templates/default/module/html/attribute_details.erb +10 -10
- data/templates/default/module/html/attribute_summary.erb +8 -8
- data/templates/default/module/html/box_info.erb +43 -43
- data/templates/default/module/html/children.erb +8 -8
- data/templates/default/module/html/constant_summary.erb +17 -17
- data/templates/default/module/html/defines.erb +2 -2
- data/templates/default/module/html/header.erb +5 -5
- data/templates/default/module/html/inherited_attributes.erb +14 -14
- data/templates/default/module/html/inherited_constants.erb +8 -8
- data/templates/default/module/html/inherited_methods.erb +18 -18
- data/templates/default/module/html/item_summary.erb +40 -40
- data/templates/default/module/html/method_details_list.erb +9 -9
- data/templates/default/module/html/method_summary.erb +13 -13
- data/templates/default/module/html/methodmissing.erb +12 -12
- data/templates/default/module/setup.rb +167 -167
- data/templates/default/module/text/children.erb +9 -9
- data/templates/default/module/text/class_meths_list.erb +7 -7
- data/templates/default/module/text/extends.erb +7 -7
- data/templates/default/module/text/header.erb +7 -7
- data/templates/default/module/text/includes.erb +7 -7
- data/templates/default/module/text/instance_meths_list.erb +7 -7
- data/templates/default/module/text/setup.rb +13 -13
- data/templates/default/onefile/html/files.erb +4 -4
- data/templates/default/onefile/html/headers.erb +6 -6
- data/templates/default/onefile/html/layout.erb +17 -17
- data/templates/default/onefile/html/readme.erb +2 -2
- data/templates/default/onefile/html/setup.rb +62 -62
- data/templates/default/root/dot/child.erb +2 -2
- data/templates/default/root/dot/setup.rb +6 -6
- data/templates/default/root/html/setup.rb +2 -2
- data/templates/default/tags/html/example.erb +10 -10
- data/templates/default/tags/html/index.erb +2 -2
- data/templates/default/tags/html/option.erb +24 -24
- data/templates/default/tags/html/overload.erb +13 -13
- data/templates/default/tags/html/see.erb +7 -7
- data/templates/default/tags/html/tag.erb +20 -20
- data/templates/default/tags/setup.rb +57 -57
- data/templates/default/tags/text/example.erb +12 -12
- data/templates/default/tags/text/index.erb +1 -1
- data/templates/default/tags/text/option.erb +20 -20
- data/templates/default/tags/text/overload.erb +19 -19
- data/templates/default/tags/text/see.erb +11 -11
- data/templates/default/tags/text/tag.erb +13 -13
- data/templates/guide/class/html/setup.rb +2 -2
- data/templates/guide/docstring/html/setup.rb +2 -2
- data/templates/guide/fulldoc/html/css/style.css +108 -108
- data/templates/guide/fulldoc/html/js/app.js +33 -33
- data/templates/guide/fulldoc/html/setup.rb +74 -74
- data/templates/guide/layout/html/layout.erb +81 -81
- data/templates/guide/layout/html/setup.rb +25 -25
- data/templates/guide/method/html/header.erb +17 -17
- data/templates/guide/method/html/setup.rb +22 -22
- data/templates/guide/module/html/header.erb +6 -6
- data/templates/guide/module/html/method_list.erb +4 -4
- data/templates/guide/module/html/setup.rb +27 -27
- data/templates/guide/onefile/html/files.erb +4 -4
- data/templates/guide/onefile/html/setup.rb +6 -6
- data/templates/guide/onefile/html/toc.erb +3 -3
- data/templates/guide/tags/html/setup.rb +9 -9
- data/yard.gemspec +43 -43
- metadata +4 -4
@@ -1,189 +1,189 @@
|
|
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 =~ /\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
|
data/lib/yard/registry_store.rb
CHANGED
@@ -1,337 +1,337 @@
|
|
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) @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
|