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