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,75 +1,75 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
# A subclass of Hash where all keys are converted into Symbols, and
|
3
|
-
# optionally, all String values are converted into Symbols.
|
4
|
-
class SymbolHash < Hash
|
5
|
-
# Creates a new SymbolHash object
|
6
|
-
#
|
7
|
-
# @param [Boolean] symbolize_value converts any String values into Symbols
|
8
|
-
# if this is set to +true+.
|
9
|
-
def initialize(symbolize_value = true)
|
10
|
-
@symbolize_value = symbolize_value
|
11
|
-
end
|
12
|
-
|
13
|
-
# @overload [](hash)
|
14
|
-
# Creates a SymbolHash object from an existing Hash
|
15
|
-
#
|
16
|
-
# @example
|
17
|
-
# SymbolHash['x' => 1, :y => 2] # => #<SymbolHash:0x...>
|
18
|
-
# @param [Hash] hash the hash object
|
19
|
-
# @return [SymbolHash] a new SymbolHash from a hash object
|
20
|
-
#
|
21
|
-
# @overload [](*list)
|
22
|
-
# Creates a SymbolHash from an even list of keys and values
|
23
|
-
#
|
24
|
-
# @example
|
25
|
-
# SymbolHash[key1, value1, key2, value2, ...]
|
26
|
-
# @param [Array] list an even list of key followed by value
|
27
|
-
# @return [SymbolHash] a new SymbolHash object
|
28
|
-
def self.[](*hsh)
|
29
|
-
obj = new
|
30
|
-
if hsh.size == 1 && hsh.first.is_a?(Hash)
|
31
|
-
hsh.first.each {|k, v| obj[k] = v }
|
32
|
-
else
|
33
|
-
0.step(hsh.size, 2) {|n| obj[hsh[n]] = hsh[n + 1] }
|
34
|
-
end
|
35
|
-
obj
|
36
|
-
end
|
37
|
-
|
38
|
-
# Assigns a value to a symbolized key
|
39
|
-
# @param [#to_sym] key the key
|
40
|
-
# @param [Object] value the value to be assigned. If this is a String and
|
41
|
-
# values are set to be symbolized, it will be converted into a Symbol.
|
42
|
-
def []=(key, value)
|
43
|
-
super(key.to_sym, value.instance_of?(String) && @symbolize_value ? value.to_sym : value)
|
44
|
-
end
|
45
|
-
|
46
|
-
# Accessed a symbolized key
|
47
|
-
# @param [#to_sym] key the key to access
|
48
|
-
# @return [Object] the value associated with the key
|
49
|
-
def [](key) super(key.to_sym) end
|
50
|
-
|
51
|
-
# Deleted a key and value associated with it
|
52
|
-
# @param [#to_sym] key the key to delete
|
53
|
-
# @return [void]
|
54
|
-
def delete(key) super(key.to_sym) end
|
55
|
-
|
56
|
-
# Tests if a symbolized key exists
|
57
|
-
# @param [#to_sym] key the key to test
|
58
|
-
# @return [Boolean] whether the key exists
|
59
|
-
def key?(key) super(key.to_sym) end
|
60
|
-
alias has_key? key?
|
61
|
-
|
62
|
-
# Updates the object with the contents of another Hash object.
|
63
|
-
# This method modifies the original SymbolHash object
|
64
|
-
#
|
65
|
-
# @param [Hash] hash the hash object to copy the values from
|
66
|
-
# @return [SymbolHash] self
|
67
|
-
def update(hash) hash.each {|k, v| self[k] = v }; self end
|
68
|
-
alias merge! update
|
69
|
-
|
70
|
-
# Merges the contents of another hash into a new SymbolHash object
|
71
|
-
#
|
72
|
-
# @param [Hash] hash the hash of objects to copy
|
73
|
-
# @return [SymbolHash] a new SymbolHash containing the merged data
|
74
|
-
def merge(hash) dup.merge!(hash) end
|
75
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# A subclass of Hash where all keys are converted into Symbols, and
|
3
|
+
# optionally, all String values are converted into Symbols.
|
4
|
+
class SymbolHash < Hash
|
5
|
+
# Creates a new SymbolHash object
|
6
|
+
#
|
7
|
+
# @param [Boolean] symbolize_value converts any String values into Symbols
|
8
|
+
# if this is set to +true+.
|
9
|
+
def initialize(symbolize_value = true)
|
10
|
+
@symbolize_value = symbolize_value
|
11
|
+
end
|
12
|
+
|
13
|
+
# @overload [](hash)
|
14
|
+
# Creates a SymbolHash object from an existing Hash
|
15
|
+
#
|
16
|
+
# @example
|
17
|
+
# SymbolHash['x' => 1, :y => 2] # => #<SymbolHash:0x...>
|
18
|
+
# @param [Hash] hash the hash object
|
19
|
+
# @return [SymbolHash] a new SymbolHash from a hash object
|
20
|
+
#
|
21
|
+
# @overload [](*list)
|
22
|
+
# Creates a SymbolHash from an even list of keys and values
|
23
|
+
#
|
24
|
+
# @example
|
25
|
+
# SymbolHash[key1, value1, key2, value2, ...]
|
26
|
+
# @param [Array] list an even list of key followed by value
|
27
|
+
# @return [SymbolHash] a new SymbolHash object
|
28
|
+
def self.[](*hsh)
|
29
|
+
obj = new
|
30
|
+
if hsh.size == 1 && hsh.first.is_a?(Hash)
|
31
|
+
hsh.first.each {|k, v| obj[k] = v }
|
32
|
+
else
|
33
|
+
0.step(hsh.size, 2) {|n| obj[hsh[n]] = hsh[n + 1] }
|
34
|
+
end
|
35
|
+
obj
|
36
|
+
end
|
37
|
+
|
38
|
+
# Assigns a value to a symbolized key
|
39
|
+
# @param [#to_sym] key the key
|
40
|
+
# @param [Object] value the value to be assigned. If this is a String and
|
41
|
+
# values are set to be symbolized, it will be converted into a Symbol.
|
42
|
+
def []=(key, value)
|
43
|
+
super(key.to_sym, value.instance_of?(String) && @symbolize_value ? value.to_sym : value)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Accessed a symbolized key
|
47
|
+
# @param [#to_sym] key the key to access
|
48
|
+
# @return [Object] the value associated with the key
|
49
|
+
def [](key) super(key.to_sym) end
|
50
|
+
|
51
|
+
# Deleted a key and value associated with it
|
52
|
+
# @param [#to_sym] key the key to delete
|
53
|
+
# @return [void]
|
54
|
+
def delete(key) super(key.to_sym) end
|
55
|
+
|
56
|
+
# Tests if a symbolized key exists
|
57
|
+
# @param [#to_sym] key the key to test
|
58
|
+
# @return [Boolean] whether the key exists
|
59
|
+
def key?(key) super(key.to_sym) end
|
60
|
+
alias has_key? key?
|
61
|
+
|
62
|
+
# Updates the object with the contents of another Hash object.
|
63
|
+
# This method modifies the original SymbolHash object
|
64
|
+
#
|
65
|
+
# @param [Hash] hash the hash object to copy the values from
|
66
|
+
# @return [SymbolHash] self
|
67
|
+
def update(hash) hash.each {|k, v| self[k] = v }; self end
|
68
|
+
alias merge! update
|
69
|
+
|
70
|
+
# Merges the contents of another hash into a new SymbolHash object
|
71
|
+
#
|
72
|
+
# @param [Hash] hash the hash of objects to copy
|
73
|
+
# @return [SymbolHash] a new SymbolHash containing the merged data
|
74
|
+
def merge(hash) dup.merge!(hash) end
|
75
|
+
end
|
data/lib/yard/docstring.rb
CHANGED
@@ -1,378 +1,386 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module YARD
|
3
|
-
# A documentation string, or "docstring" for short, encapsulates the
|
4
|
-
# comments and metadata, or "tags", of an object. Meta-data is expressed
|
5
|
-
# in the form +@tag VALUE+, where VALUE can span over multiple lines as
|
6
|
-
# long as they are indented. The following +@example+ tag shows how tags
|
7
|
-
# can be indented:
|
8
|
-
#
|
9
|
-
# # @example My example
|
10
|
-
# # a = "hello world"
|
11
|
-
# # a.reverse
|
12
|
-
# # @version 1.0
|
13
|
-
#
|
14
|
-
# Tags can be nested in a documentation string, though the {Tags::Tag}
|
15
|
-
# itself is responsible for parsing the inner tags.
|
16
|
-
class Docstring < String
|
17
|
-
class << self
|
18
|
-
# @note Plugin developers should make sure to reset this value
|
19
|
-
# after parsing finishes. This can be done via the
|
20
|
-
# {Parser::SourceParser.after_parse_list} callback. This will
|
21
|
-
# ensure that YARD can properly parse multiple projects in
|
22
|
-
# the same process.
|
23
|
-
# @return [Class<DocstringParser>] the parser class used to parse
|
24
|
-
# text and optional meta-data from docstrings. Defaults to
|
25
|
-
# {DocstringParser}.
|
26
|
-
# @see DocstringParser
|
27
|
-
# @see Parser::SourceParser.after_parse_list
|
28
|
-
attr_accessor :default_parser
|
29
|
-
|
30
|
-
# Creates a parser object using the current {default_parser}.
|
31
|
-
# Equivalent to:
|
32
|
-
# Docstring.default_parser.new(*args)
|
33
|
-
# @param args arguments are passed to the {DocstringParser}
|
34
|
-
# class. See {DocstringParser#initialize} for details on
|
35
|
-
# arguments.
|
36
|
-
# @return [DocstringParser] the parser object used to parse a
|
37
|
-
# docstring.
|
38
|
-
def parser(*args) default_parser.new(*args) end
|
39
|
-
end
|
40
|
-
|
41
|
-
self.default_parser = DocstringParser
|
42
|
-
|
43
|
-
# @return [Array<Tags::RefTag>] the list of reference tags
|
44
|
-
attr_reader :ref_tags
|
45
|
-
|
46
|
-
# @return [CodeObjects::Base] the object that owns the docstring.
|
47
|
-
attr_accessor :object
|
48
|
-
|
49
|
-
# @return [Range] line range in the {#object}'s file where the docstring was parsed from
|
50
|
-
attr_accessor :line_range
|
51
|
-
|
52
|
-
# @return [String] the raw documentation (including raw tag text)
|
53
|
-
attr_reader :all
|
54
|
-
|
55
|
-
# @return [Boolean] whether the docstring was started with "##"
|
56
|
-
attr_reader :hash_flag
|
57
|
-
def hash_flag=(v) @hash_flag = v.nil? ? false : v end
|
58
|
-
|
59
|
-
# Matches a tag at the start of a comment line
|
60
|
-
# @deprecated Use {DocstringParser::META_MATCH}
|
61
|
-
META_MATCH = DocstringParser::META_MATCH
|
62
|
-
|
63
|
-
# @group Creating a Docstring Object
|
64
|
-
|
65
|
-
# Creates a new docstring without performing any parsing through
|
66
|
-
# a {DocstringParser}. This method is called by +DocstringParser+
|
67
|
-
# when creating the new docstring object.
|
68
|
-
#
|
69
|
-
# @param [String] text the textual portion of the docstring
|
70
|
-
# @param [Array<Tags::Tag>] tags the list of tag objects in the docstring
|
71
|
-
# @param [CodeObjects::Base, nil] object the object associated with the
|
72
|
-
# docstring. May be nil.
|
73
|
-
# @param [String] raw_data the complete docstring, including all
|
74
|
-
# original formatting and any unparsed tags/directives.
|
75
|
-
# @param [CodeObjects::Base, nil] ref_object a reference object used for
|
76
|
-
# the base set of documentation / tag information.
|
77
|
-
def self.new!(text, tags = [], object = nil, raw_data = nil, ref_object = nil)
|
78
|
-
docstring = allocate
|
79
|
-
docstring.replace(text, false)
|
80
|
-
docstring.object = object
|
81
|
-
docstring.add_tag(*tags)
|
82
|
-
docstring.instance_variable_set("@unresolved_reference", ref_object)
|
83
|
-
docstring.instance_variable_set("@all", raw_data) if raw_data
|
84
|
-
docstring
|
85
|
-
end
|
86
|
-
|
87
|
-
# Creates a new docstring with the raw contents attached to an optional
|
88
|
-
# object. Parsing will be done by the {DocstringParser} class.
|
89
|
-
#
|
90
|
-
# @note To properly parse directives with proper parser context within
|
91
|
-
# handlers, you should not use this method to create a Docstring.
|
92
|
-
# Instead, use the {parser}, which takes a handler object that
|
93
|
-
# can pass parser state onto directives. If a Docstring is created
|
94
|
-
# with this method, directives do not have access to any parser
|
95
|
-
# state, and may not function as expected.
|
96
|
-
# @example
|
97
|
-
# Docstring.new("hello world\n@return Object return", someobj)
|
98
|
-
#
|
99
|
-
# @param [String] content the raw comments to be parsed into a docstring
|
100
|
-
# and associated meta-data.
|
101
|
-
# @param [CodeObjects::Base] object an object to associate the docstring
|
102
|
-
# with.
|
103
|
-
def initialize(content = '', object = nil)
|
104
|
-
@object = object
|
105
|
-
@summary = nil
|
106
|
-
@hash_flag = false
|
107
|
-
|
108
|
-
self.all = content
|
109
|
-
end
|
110
|
-
|
111
|
-
# Adds another {Docstring}, copying over tags.
|
112
|
-
#
|
113
|
-
# @param [Docstring, String] other the other docstring (or string) to
|
114
|
-
# add.
|
115
|
-
# @return [Docstring] a new docstring with both docstrings combines
|
116
|
-
def +(other)
|
117
|
-
case other
|
118
|
-
when Docstring
|
119
|
-
Docstring.new([all, other.all].join("\n"), object)
|
120
|
-
else
|
121
|
-
super
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
def to_s
|
126
|
-
resolve_reference
|
127
|
-
super
|
128
|
-
end
|
129
|
-
|
130
|
-
# Replaces the docstring with new raw content. Called by {#all=}.
|
131
|
-
# @param [String] content the raw comments to be parsed
|
132
|
-
def replace(content, parse = true)
|
133
|
-
content = content.join("\n") if content.is_a?(Array)
|
134
|
-
@tags = []
|
135
|
-
@ref_tags = []
|
136
|
-
if parse
|
137
|
-
super(parse_comments(content))
|
138
|
-
else
|
139
|
-
@all = content
|
140
|
-
@unresolved_reference = nil
|
141
|
-
super(content)
|
142
|
-
end
|
143
|
-
end
|
144
|
-
alias all= replace
|
145
|
-
|
146
|
-
# Deep-copies a docstring
|
147
|
-
#
|
148
|
-
# @note This method creates a new docstring with new tag lists, but does
|
149
|
-
# not create new individual tags. Modifying the tag objects will still
|
150
|
-
# affect the original tags.
|
151
|
-
# @return [Docstring] a new copied docstring
|
152
|
-
# @since 0.7.0
|
153
|
-
def dup
|
154
|
-
resolve_reference
|
155
|
-
obj = super
|
156
|
-
%w(all summary tags ref_tags).each do |name|
|
157
|
-
val = instance_variable_defined?("@#{name}") && instance_variable_get("@#{name}")
|
158
|
-
obj.instance_variable_set("@#{name}", val ? val.dup : nil)
|
159
|
-
end
|
160
|
-
obj
|
161
|
-
end
|
162
|
-
|
163
|
-
# @endgroup
|
164
|
-
|
165
|
-
# @return [Fixnum] the first line of the {#line_range}
|
166
|
-
# @return [nil] if there is no associated {#line_range}
|
167
|
-
def line
|
168
|
-
line_range ? line_range.first : nil
|
169
|
-
end
|
170
|
-
|
171
|
-
# Gets the first line of a docstring to the period or the first paragraph.
|
172
|
-
# @return [String] The first line or paragraph of the docstring; always ends with a period.
|
173
|
-
def summary
|
174
|
-
resolve_reference
|
175
|
-
return @summary if defined?(@summary) && @summary
|
176
|
-
stripped = gsub(/[\r\n](?![\r\n])/, ' ').strip
|
177
|
-
num_parens = 0
|
178
|
-
idx = length.times do |index|
|
179
|
-
case stripped[index, 1]
|
180
|
-
when "."
|
181
|
-
next_char = stripped[index + 1, 1].to_s
|
182
|
-
break index - 1 if num_parens <= 0 && next_char =~ /^\s*$/
|
183
|
-
when "\r", "\n"
|
184
|
-
next_char = stripped[index + 1, 1].to_s
|
185
|
-
if next_char =~ /^\s*$/
|
186
|
-
break stripped[index - 1, 1] == '.' ? index - 2 : index - 1
|
187
|
-
end
|
188
|
-
when "{", "(", "["
|
189
|
-
num_parens += 1
|
190
|
-
when "}", ")", "]"
|
191
|
-
num_parens -= 1
|
192
|
-
end
|
193
|
-
end
|
194
|
-
@summary = stripped[0..idx]
|
195
|
-
if !@summary.empty? && @summary !~ /\A\s*\{include:.+\}\s*\Z/
|
196
|
-
@summary += '.'
|
197
|
-
end
|
198
|
-
@summary
|
199
|
-
end
|
200
|
-
|
201
|
-
# Reformats and returns a raw representation of the tag data using the
|
202
|
-
# current tag and docstring data, not the original text.
|
203
|
-
#
|
204
|
-
# @return [String] the updated raw formatted docstring data
|
205
|
-
# @since 0.7.0
|
206
|
-
# @todo Add Tags::Tag#to_raw and refactor
|
207
|
-
def to_raw
|
208
|
-
tag_data = tags.
|
209
|
-
case tag
|
210
|
-
when Tags::OverloadTag
|
211
|
-
tag_text = "@#{tag.tag_name} #{tag.signature}\n"
|
212
|
-
unless tag.docstring.blank?
|
213
|
-
tag_text += "\n " + tag.docstring.all.gsub(/\r?\n/, "\n ")
|
214
|
-
end
|
215
|
-
when Tags::OptionTag
|
216
|
-
tag_text = "@#{tag.tag_name} #{tag.name}"
|
217
|
-
tag_text += ' [' + tag.pair.types.join(', ') + ']' if tag.pair.types
|
218
|
-
tag_text += ' ' + tag.pair.name.to_s if tag.pair.name
|
219
|
-
tag_text += "\n " if tag.name && tag.text
|
220
|
-
tag_text += ' (' + tag.pair.defaults.join(', ') + ')' if tag.pair.defaults
|
221
|
-
tag_text += " " + tag.pair.text.strip.gsub(/\n/, "\n ") if tag.pair.text
|
222
|
-
else
|
223
|
-
tag_text = '@' + tag.tag_name
|
224
|
-
tag_text += ' [' + tag.types.join(', ') + ']' if tag.types
|
225
|
-
tag_text += ' ' + tag.name.to_s if tag.name
|
226
|
-
tag_text += "\n " if tag.name && tag.text
|
227
|
-
tag_text += ' ' + tag.text.strip.gsub(/\n/, "\n ") if tag.text
|
228
|
-
end
|
229
|
-
tag_text
|
230
|
-
end
|
231
|
-
[strip, tag_data.join("\n")].reject(&:empty?).compact.join("\n")
|
232
|
-
end
|
233
|
-
|
234
|
-
# @group Creating and Accessing Meta-data
|
235
|
-
|
236
|
-
# Adds a tag or reftag object to the tag list. If you want to parse
|
237
|
-
# tag data based on the {Tags::DefaultFactory} tag factory, use
|
238
|
-
# {DocstringParser} instead.
|
239
|
-
#
|
240
|
-
# @param [Tags::Tag, Tags::RefTag] tags list of tag objects to add
|
241
|
-
# @return [void]
|
242
|
-
def add_tag(*tags)
|
243
|
-
tags.each_with_index do |tag, i|
|
244
|
-
case tag
|
245
|
-
when Tags::Tag
|
246
|
-
tag.object = object
|
247
|
-
@tags << tag
|
248
|
-
when Tags::RefTag, Tags::RefTagList
|
249
|
-
@ref_tags << tag
|
250
|
-
else
|
251
|
-
raise ArgumentError, "expected Tag or RefTag, got #{tag.class} (at index #{i})"
|
252
|
-
end
|
253
|
-
end
|
254
|
-
end
|
255
|
-
|
256
|
-
# Convenience method to return the first tag
|
257
|
-
# object in the list of tag objects of that name
|
258
|
-
#
|
259
|
-
# @example
|
260
|
-
# doc = Docstring.new("@return zero when nil")
|
261
|
-
# doc.tag(:return).text # => "zero when nil"
|
262
|
-
#
|
263
|
-
# @param [#to_s] name the tag name to return data for
|
264
|
-
# @return [Tags::Tag] the first tag in the list of {#tags}
|
265
|
-
def tag(name)
|
266
|
-
tags.find {|tag| tag.tag_name.to_s == name.to_s }
|
267
|
-
end
|
268
|
-
|
269
|
-
# Returns a list of tags specified by +name+ or all tags if +name+ is not specified.
|
270
|
-
#
|
271
|
-
# @param [#to_s] name the tag name to return data for, or nil for all tags
|
272
|
-
# @return [Array<Tags::Tag>] the list of tags by the specified tag name
|
273
|
-
def tags(name = nil)
|
274
|
-
list = @tags + convert_ref_tags
|
275
|
-
return list unless name
|
276
|
-
list.select {|tag| tag.tag_name.to_s == name.to_s }
|
277
|
-
end
|
278
|
-
|
279
|
-
# Returns true if at least one tag by the name +name+ was declared
|
280
|
-
#
|
281
|
-
# @param [String] name the tag name to search for
|
282
|
-
# @return [Boolean] whether or not the tag +name+ was declared
|
283
|
-
def has_tag?(name)
|
284
|
-
tags.any? {|tag| tag.tag_name.to_s == name.to_s }
|
285
|
-
end
|
286
|
-
|
287
|
-
# Delete all tags with +name+
|
288
|
-
# @param [String] name the tag name
|
289
|
-
# @return [void]
|
290
|
-
# @since 0.7.0
|
291
|
-
def delete_tags(name)
|
292
|
-
delete_tag_if {|tag| tag.tag_name.to_s == name.to_s }
|
293
|
-
end
|
294
|
-
|
295
|
-
# Deletes all tags where the block returns true
|
296
|
-
# @yieldparam [Tags::Tag] tag the tag that is being tested
|
297
|
-
# @yieldreturn [Boolean] true if the tag should be deleted
|
298
|
-
# @return [void]
|
299
|
-
# @since 0.7.0
|
300
|
-
def delete_tag_if(&block)
|
301
|
-
@tags.delete_if(&block)
|
302
|
-
@ref_tags.delete_if(&block)
|
303
|
-
end
|
304
|
-
|
305
|
-
# Returns true if the docstring has no content that is visible to a template.
|
306
|
-
#
|
307
|
-
# @param [Boolean] only_visible_tags whether only {Tags::Library.visible_tags}
|
308
|
-
# should be checked, or if all tags should be considered.
|
309
|
-
# @return [Boolean] whether or not the docstring has content
|
310
|
-
def blank?(only_visible_tags = true)
|
311
|
-
if only_visible_tags
|
312
|
-
empty? && !tags.any? {|tag| Tags::Library.visible_tags.include?(tag.tag_name.to_sym) }
|
313
|
-
else
|
314
|
-
empty? && @tags.empty? && @ref_tags.empty?
|
315
|
-
end
|
316
|
-
end
|
317
|
-
|
318
|
-
# @endgroup
|
319
|
-
|
320
|
-
# Resolves unresolved other docstring reference if there is
|
321
|
-
# unresolved reference. Does nothing if there is no unresolved
|
322
|
-
# reference.
|
323
|
-
#
|
324
|
-
# Normally, you don't need to call this method
|
325
|
-
# explicitly. Resolving unresolved reference is done implicitly.
|
326
|
-
#
|
327
|
-
# @return [void]
|
328
|
-
def resolve_reference
|
329
|
-
loop do
|
330
|
-
return if defined?(@unresolved_reference).nil? || @unresolved_reference.nil?
|
331
|
-
return if CodeObjects::Proxy === @unresolved_reference
|
332
|
-
|
333
|
-
reference = @unresolved_reference
|
334
|
-
@unresolved_reference = nil
|
335
|
-
self.all = [reference.docstring.all, @all].join("\n")
|
336
|
-
end
|
337
|
-
end
|
338
|
-
|
339
|
-
private
|
340
|
-
|
341
|
-
# Maps valid reference tags
|
342
|
-
#
|
343
|
-
# @return [Array<Tags::RefTag>] the list of valid reference tags
|
344
|
-
def convert_ref_tags
|
345
|
-
list = @ref_tags.reject {|t| CodeObjects::Proxy === t.owner }
|
346
|
-
|
347
|
-
@ref_tag_recurse_count ||= 0
|
348
|
-
@ref_tag_recurse_count += 1
|
349
|
-
if @ref_tag_recurse_count > 2
|
350
|
-
log.error "#{@object.file}:#{@object.line}: Detected circular reference tag in " \
|
351
|
-
"`#{@object}', ignoring all reference tags for this object " \
|
352
|
-
"(#{@ref_tags.map {|t| "@#{t.tag_name}" }.join(", ")})."
|
353
|
-
@ref_tags = []
|
354
|
-
return @ref_tags
|
355
|
-
end
|
356
|
-
list = list.map(&:tags).flatten
|
357
|
-
@ref_tag_recurse_count -= 1
|
358
|
-
list
|
359
|
-
end
|
360
|
-
|
361
|
-
# Parses out comments split by newlines into a new code object
|
362
|
-
#
|
363
|
-
# @param [String] comments
|
364
|
-
# the newline delimited array of comments. If the comments
|
365
|
-
# are passed as a String, they will be split by newlines.
|
366
|
-
#
|
367
|
-
# @return [String] the non-metadata portion of the comments to
|
368
|
-
# be used as a docstring
|
369
|
-
def parse_comments(comments)
|
370
|
-
parser = self.class.parser
|
371
|
-
parser.parse(comments, object)
|
372
|
-
@all = parser.raw_text
|
373
|
-
@unresolved_reference = parser.reference
|
374
|
-
add_tag(*parser.tags)
|
375
|
-
parser.text
|
376
|
-
end
|
377
|
-
|
378
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module YARD
|
3
|
+
# A documentation string, or "docstring" for short, encapsulates the
|
4
|
+
# comments and metadata, or "tags", of an object. Meta-data is expressed
|
5
|
+
# in the form +@tag VALUE+, where VALUE can span over multiple lines as
|
6
|
+
# long as they are indented. The following +@example+ tag shows how tags
|
7
|
+
# can be indented:
|
8
|
+
#
|
9
|
+
# # @example My example
|
10
|
+
# # a = "hello world"
|
11
|
+
# # a.reverse
|
12
|
+
# # @version 1.0
|
13
|
+
#
|
14
|
+
# Tags can be nested in a documentation string, though the {Tags::Tag}
|
15
|
+
# itself is responsible for parsing the inner tags.
|
16
|
+
class Docstring < String
|
17
|
+
class << self
|
18
|
+
# @note Plugin developers should make sure to reset this value
|
19
|
+
# after parsing finishes. This can be done via the
|
20
|
+
# {Parser::SourceParser.after_parse_list} callback. This will
|
21
|
+
# ensure that YARD can properly parse multiple projects in
|
22
|
+
# the same process.
|
23
|
+
# @return [Class<DocstringParser>] the parser class used to parse
|
24
|
+
# text and optional meta-data from docstrings. Defaults to
|
25
|
+
# {DocstringParser}.
|
26
|
+
# @see DocstringParser
|
27
|
+
# @see Parser::SourceParser.after_parse_list
|
28
|
+
attr_accessor :default_parser
|
29
|
+
|
30
|
+
# Creates a parser object using the current {default_parser}.
|
31
|
+
# Equivalent to:
|
32
|
+
# Docstring.default_parser.new(*args)
|
33
|
+
# @param args arguments are passed to the {DocstringParser}
|
34
|
+
# class. See {DocstringParser#initialize} for details on
|
35
|
+
# arguments.
|
36
|
+
# @return [DocstringParser] the parser object used to parse a
|
37
|
+
# docstring.
|
38
|
+
def parser(*args) default_parser.new(*args) end
|
39
|
+
end
|
40
|
+
|
41
|
+
self.default_parser = DocstringParser
|
42
|
+
|
43
|
+
# @return [Array<Tags::RefTag>] the list of reference tags
|
44
|
+
attr_reader :ref_tags
|
45
|
+
|
46
|
+
# @return [CodeObjects::Base] the object that owns the docstring.
|
47
|
+
attr_accessor :object
|
48
|
+
|
49
|
+
# @return [Range] line range in the {#object}'s file where the docstring was parsed from
|
50
|
+
attr_accessor :line_range
|
51
|
+
|
52
|
+
# @return [String] the raw documentation (including raw tag text)
|
53
|
+
attr_reader :all
|
54
|
+
|
55
|
+
# @return [Boolean] whether the docstring was started with "##"
|
56
|
+
attr_reader :hash_flag
|
57
|
+
def hash_flag=(v) @hash_flag = v.nil? ? false : v end
|
58
|
+
|
59
|
+
# Matches a tag at the start of a comment line
|
60
|
+
# @deprecated Use {DocstringParser::META_MATCH}
|
61
|
+
META_MATCH = DocstringParser::META_MATCH
|
62
|
+
|
63
|
+
# @group Creating a Docstring Object
|
64
|
+
|
65
|
+
# Creates a new docstring without performing any parsing through
|
66
|
+
# a {DocstringParser}. This method is called by +DocstringParser+
|
67
|
+
# when creating the new docstring object.
|
68
|
+
#
|
69
|
+
# @param [String] text the textual portion of the docstring
|
70
|
+
# @param [Array<Tags::Tag>] tags the list of tag objects in the docstring
|
71
|
+
# @param [CodeObjects::Base, nil] object the object associated with the
|
72
|
+
# docstring. May be nil.
|
73
|
+
# @param [String] raw_data the complete docstring, including all
|
74
|
+
# original formatting and any unparsed tags/directives.
|
75
|
+
# @param [CodeObjects::Base, nil] ref_object a reference object used for
|
76
|
+
# the base set of documentation / tag information.
|
77
|
+
def self.new!(text, tags = [], object = nil, raw_data = nil, ref_object = nil)
|
78
|
+
docstring = allocate
|
79
|
+
docstring.replace(text, false)
|
80
|
+
docstring.object = object
|
81
|
+
docstring.add_tag(*tags)
|
82
|
+
docstring.instance_variable_set("@unresolved_reference", ref_object)
|
83
|
+
docstring.instance_variable_set("@all", raw_data) if raw_data
|
84
|
+
docstring
|
85
|
+
end
|
86
|
+
|
87
|
+
# Creates a new docstring with the raw contents attached to an optional
|
88
|
+
# object. Parsing will be done by the {DocstringParser} class.
|
89
|
+
#
|
90
|
+
# @note To properly parse directives with proper parser context within
|
91
|
+
# handlers, you should not use this method to create a Docstring.
|
92
|
+
# Instead, use the {parser}, which takes a handler object that
|
93
|
+
# can pass parser state onto directives. If a Docstring is created
|
94
|
+
# with this method, directives do not have access to any parser
|
95
|
+
# state, and may not function as expected.
|
96
|
+
# @example
|
97
|
+
# Docstring.new("hello world\n@return Object return", someobj)
|
98
|
+
#
|
99
|
+
# @param [String] content the raw comments to be parsed into a docstring
|
100
|
+
# and associated meta-data.
|
101
|
+
# @param [CodeObjects::Base] object an object to associate the docstring
|
102
|
+
# with.
|
103
|
+
def initialize(content = '', object = nil)
|
104
|
+
@object = object
|
105
|
+
@summary = nil
|
106
|
+
@hash_flag = false
|
107
|
+
|
108
|
+
self.all = content
|
109
|
+
end
|
110
|
+
|
111
|
+
# Adds another {Docstring}, copying over tags.
|
112
|
+
#
|
113
|
+
# @param [Docstring, String] other the other docstring (or string) to
|
114
|
+
# add.
|
115
|
+
# @return [Docstring] a new docstring with both docstrings combines
|
116
|
+
def +(other)
|
117
|
+
case other
|
118
|
+
when Docstring
|
119
|
+
Docstring.new([all, other.all].join("\n"), object)
|
120
|
+
else
|
121
|
+
super
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def to_s
|
126
|
+
resolve_reference
|
127
|
+
super
|
128
|
+
end
|
129
|
+
|
130
|
+
# Replaces the docstring with new raw content. Called by {#all=}.
|
131
|
+
# @param [String] content the raw comments to be parsed
|
132
|
+
def replace(content, parse = true)
|
133
|
+
content = content.join("\n") if content.is_a?(Array)
|
134
|
+
@tags = []
|
135
|
+
@ref_tags = []
|
136
|
+
if parse
|
137
|
+
super(parse_comments(content))
|
138
|
+
else
|
139
|
+
@all = content
|
140
|
+
@unresolved_reference = nil
|
141
|
+
super(content)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
alias all= replace
|
145
|
+
|
146
|
+
# Deep-copies a docstring
|
147
|
+
#
|
148
|
+
# @note This method creates a new docstring with new tag lists, but does
|
149
|
+
# not create new individual tags. Modifying the tag objects will still
|
150
|
+
# affect the original tags.
|
151
|
+
# @return [Docstring] a new copied docstring
|
152
|
+
# @since 0.7.0
|
153
|
+
def dup
|
154
|
+
resolve_reference
|
155
|
+
obj = super
|
156
|
+
%w(all summary tags ref_tags).each do |name|
|
157
|
+
val = instance_variable_defined?("@#{name}") && instance_variable_get("@#{name}")
|
158
|
+
obj.instance_variable_set("@#{name}", val ? val.dup : nil)
|
159
|
+
end
|
160
|
+
obj
|
161
|
+
end
|
162
|
+
|
163
|
+
# @endgroup
|
164
|
+
|
165
|
+
# @return [Fixnum] the first line of the {#line_range}
|
166
|
+
# @return [nil] if there is no associated {#line_range}
|
167
|
+
def line
|
168
|
+
line_range ? line_range.first : nil
|
169
|
+
end
|
170
|
+
|
171
|
+
# Gets the first line of a docstring to the period or the first paragraph.
|
172
|
+
# @return [String] The first line or paragraph of the docstring; always ends with a period.
|
173
|
+
def summary
|
174
|
+
resolve_reference
|
175
|
+
return @summary if defined?(@summary) && @summary
|
176
|
+
stripped = gsub(/[\r\n](?![\r\n])/, ' ').strip
|
177
|
+
num_parens = 0
|
178
|
+
idx = length.times do |index|
|
179
|
+
case stripped[index, 1]
|
180
|
+
when "."
|
181
|
+
next_char = stripped[index + 1, 1].to_s
|
182
|
+
break index - 1 if num_parens <= 0 && next_char =~ /^\s*$/
|
183
|
+
when "\r", "\n"
|
184
|
+
next_char = stripped[index + 1, 1].to_s
|
185
|
+
if next_char =~ /^\s*$/
|
186
|
+
break stripped[index - 1, 1] == '.' ? index - 2 : index - 1
|
187
|
+
end
|
188
|
+
when "{", "(", "["
|
189
|
+
num_parens += 1
|
190
|
+
when "}", ")", "]"
|
191
|
+
num_parens -= 1
|
192
|
+
end
|
193
|
+
end
|
194
|
+
@summary = stripped[0..idx]
|
195
|
+
if !@summary.empty? && @summary !~ /\A\s*\{include:.+\}\s*\Z/
|
196
|
+
@summary += '.'
|
197
|
+
end
|
198
|
+
@summary
|
199
|
+
end
|
200
|
+
|
201
|
+
# Reformats and returns a raw representation of the tag data using the
|
202
|
+
# current tag and docstring data, not the original text.
|
203
|
+
#
|
204
|
+
# @return [String] the updated raw formatted docstring data
|
205
|
+
# @since 0.7.0
|
206
|
+
# @todo Add Tags::Tag#to_raw and refactor
|
207
|
+
def to_raw
|
208
|
+
tag_data = tags.map do |tag|
|
209
|
+
case tag
|
210
|
+
when Tags::OverloadTag
|
211
|
+
tag_text = "@#{tag.tag_name} #{tag.signature}\n"
|
212
|
+
unless tag.docstring.blank?
|
213
|
+
tag_text += "\n " + tag.docstring.all.gsub(/\r?\n/, "\n ")
|
214
|
+
end
|
215
|
+
when Tags::OptionTag
|
216
|
+
tag_text = "@#{tag.tag_name} #{tag.name}"
|
217
|
+
tag_text += ' [' + tag.pair.types.join(', ') + ']' if tag.pair.types
|
218
|
+
tag_text += ' ' + tag.pair.name.to_s if tag.pair.name
|
219
|
+
tag_text += "\n " if tag.name && tag.text
|
220
|
+
tag_text += ' (' + tag.pair.defaults.join(', ') + ')' if tag.pair.defaults
|
221
|
+
tag_text += " " + tag.pair.text.strip.gsub(/\n/, "\n ") if tag.pair.text
|
222
|
+
else
|
223
|
+
tag_text = '@' + tag.tag_name
|
224
|
+
tag_text += ' [' + tag.types.join(', ') + ']' if tag.types
|
225
|
+
tag_text += ' ' + tag.name.to_s if tag.name
|
226
|
+
tag_text += "\n " if tag.name && tag.text
|
227
|
+
tag_text += ' ' + tag.text.strip.gsub(/\n/, "\n ") if tag.text
|
228
|
+
end
|
229
|
+
tag_text
|
230
|
+
end
|
231
|
+
[strip, tag_data.join("\n")].reject(&:empty?).compact.join("\n")
|
232
|
+
end
|
233
|
+
|
234
|
+
# @group Creating and Accessing Meta-data
|
235
|
+
|
236
|
+
# Adds a tag or reftag object to the tag list. If you want to parse
|
237
|
+
# tag data based on the {Tags::DefaultFactory} tag factory, use
|
238
|
+
# {DocstringParser} instead.
|
239
|
+
#
|
240
|
+
# @param [Tags::Tag, Tags::RefTag] tags list of tag objects to add
|
241
|
+
# @return [void]
|
242
|
+
def add_tag(*tags)
|
243
|
+
tags.each_with_index do |tag, i|
|
244
|
+
case tag
|
245
|
+
when Tags::Tag
|
246
|
+
tag.object = object
|
247
|
+
@tags << tag
|
248
|
+
when Tags::RefTag, Tags::RefTagList
|
249
|
+
@ref_tags << tag
|
250
|
+
else
|
251
|
+
raise ArgumentError, "expected Tag or RefTag, got #{tag.class} (at index #{i})"
|
252
|
+
end
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
# Convenience method to return the first tag
|
257
|
+
# object in the list of tag objects of that name
|
258
|
+
#
|
259
|
+
# @example
|
260
|
+
# doc = Docstring.new("@return zero when nil")
|
261
|
+
# doc.tag(:return).text # => "zero when nil"
|
262
|
+
#
|
263
|
+
# @param [#to_s] name the tag name to return data for
|
264
|
+
# @return [Tags::Tag] the first tag in the list of {#tags}
|
265
|
+
def tag(name)
|
266
|
+
tags.find {|tag| tag.tag_name.to_s == name.to_s }
|
267
|
+
end
|
268
|
+
|
269
|
+
# Returns a list of tags specified by +name+ or all tags if +name+ is not specified.
|
270
|
+
#
|
271
|
+
# @param [#to_s] name the tag name to return data for, or nil for all tags
|
272
|
+
# @return [Array<Tags::Tag>] the list of tags by the specified tag name
|
273
|
+
def tags(name = nil)
|
274
|
+
list = stable_sort_by(@tags + convert_ref_tags, &:tag_name)
|
275
|
+
return list unless name
|
276
|
+
list.select {|tag| tag.tag_name.to_s == name.to_s }
|
277
|
+
end
|
278
|
+
|
279
|
+
# Returns true if at least one tag by the name +name+ was declared
|
280
|
+
#
|
281
|
+
# @param [String] name the tag name to search for
|
282
|
+
# @return [Boolean] whether or not the tag +name+ was declared
|
283
|
+
def has_tag?(name)
|
284
|
+
tags.any? {|tag| tag.tag_name.to_s == name.to_s }
|
285
|
+
end
|
286
|
+
|
287
|
+
# Delete all tags with +name+
|
288
|
+
# @param [String] name the tag name
|
289
|
+
# @return [void]
|
290
|
+
# @since 0.7.0
|
291
|
+
def delete_tags(name)
|
292
|
+
delete_tag_if {|tag| tag.tag_name.to_s == name.to_s }
|
293
|
+
end
|
294
|
+
|
295
|
+
# Deletes all tags where the block returns true
|
296
|
+
# @yieldparam [Tags::Tag] tag the tag that is being tested
|
297
|
+
# @yieldreturn [Boolean] true if the tag should be deleted
|
298
|
+
# @return [void]
|
299
|
+
# @since 0.7.0
|
300
|
+
def delete_tag_if(&block)
|
301
|
+
@tags.delete_if(&block)
|
302
|
+
@ref_tags.delete_if(&block)
|
303
|
+
end
|
304
|
+
|
305
|
+
# Returns true if the docstring has no content that is visible to a template.
|
306
|
+
#
|
307
|
+
# @param [Boolean] only_visible_tags whether only {Tags::Library.visible_tags}
|
308
|
+
# should be checked, or if all tags should be considered.
|
309
|
+
# @return [Boolean] whether or not the docstring has content
|
310
|
+
def blank?(only_visible_tags = true)
|
311
|
+
if only_visible_tags
|
312
|
+
empty? && !tags.any? {|tag| Tags::Library.visible_tags.include?(tag.tag_name.to_sym) }
|
313
|
+
else
|
314
|
+
empty? && @tags.empty? && @ref_tags.empty?
|
315
|
+
end
|
316
|
+
end
|
317
|
+
|
318
|
+
# @endgroup
|
319
|
+
|
320
|
+
# Resolves unresolved other docstring reference if there is
|
321
|
+
# unresolved reference. Does nothing if there is no unresolved
|
322
|
+
# reference.
|
323
|
+
#
|
324
|
+
# Normally, you don't need to call this method
|
325
|
+
# explicitly. Resolving unresolved reference is done implicitly.
|
326
|
+
#
|
327
|
+
# @return [void]
|
328
|
+
def resolve_reference
|
329
|
+
loop do
|
330
|
+
return if defined?(@unresolved_reference).nil? || @unresolved_reference.nil?
|
331
|
+
return if CodeObjects::Proxy === @unresolved_reference
|
332
|
+
|
333
|
+
reference = @unresolved_reference
|
334
|
+
@unresolved_reference = nil
|
335
|
+
self.all = [reference.docstring.all, @all].join("\n")
|
336
|
+
end
|
337
|
+
end
|
338
|
+
|
339
|
+
private
|
340
|
+
|
341
|
+
# Maps valid reference tags
|
342
|
+
#
|
343
|
+
# @return [Array<Tags::RefTag>] the list of valid reference tags
|
344
|
+
def convert_ref_tags
|
345
|
+
list = @ref_tags.reject {|t| CodeObjects::Proxy === t.owner }
|
346
|
+
|
347
|
+
@ref_tag_recurse_count ||= 0
|
348
|
+
@ref_tag_recurse_count += 1
|
349
|
+
if @ref_tag_recurse_count > 2
|
350
|
+
log.error "#{@object.file}:#{@object.line}: Detected circular reference tag in " \
|
351
|
+
"`#{@object}', ignoring all reference tags for this object " \
|
352
|
+
"(#{@ref_tags.map {|t| "@#{t.tag_name}" }.join(", ")})."
|
353
|
+
@ref_tags = []
|
354
|
+
return @ref_tags
|
355
|
+
end
|
356
|
+
list = list.map(&:tags).flatten
|
357
|
+
@ref_tag_recurse_count -= 1
|
358
|
+
list
|
359
|
+
end
|
360
|
+
|
361
|
+
# Parses out comments split by newlines into a new code object
|
362
|
+
#
|
363
|
+
# @param [String] comments
|
364
|
+
# the newline delimited array of comments. If the comments
|
365
|
+
# are passed as a String, they will be split by newlines.
|
366
|
+
#
|
367
|
+
# @return [String] the non-metadata portion of the comments to
|
368
|
+
# be used as a docstring
|
369
|
+
def parse_comments(comments)
|
370
|
+
parser = self.class.parser
|
371
|
+
parser.parse(comments, object)
|
372
|
+
@all = parser.raw_text
|
373
|
+
@unresolved_reference = parser.reference
|
374
|
+
add_tag(*parser.tags)
|
375
|
+
parser.text
|
376
|
+
end
|
377
|
+
|
378
|
+
# A stable sort_by method.
|
379
|
+
#
|
380
|
+
# @param list [Enumerable] the list to sort.
|
381
|
+
# @return [Array] a stable sorted list.
|
382
|
+
def stable_sort_by(list)
|
383
|
+
list.each_with_index.sort_by {|tag, i| [yield(tag), i] }.map(&:first)
|
384
|
+
end
|
385
|
+
end
|
386
|
+
end
|