yard 0.9.18 → 0.9.19
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 +4 -4
- data/.yardopts +26 -26
- data/CHANGELOG.md +742 -728
- data/LEGAL +66 -66
- data/LICENSE +22 -22
- data/README.md +328 -328
- data/Rakefile +42 -53
- 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 +308 -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 +789 -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 -615
- 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 +134 -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 +11 -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 -386
- 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 +212 -211
- data/lib/yard/handlers/c/init_handler.rb +20 -20
- data/lib/yard/handlers/c/method_handler.rb +45 -45
- 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/common/method_handler.rb +19 -0
- 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 -96
- 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 +114 -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 -646
- 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 +6 -6
- 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 +896 -862
- data/spec/cli/yri_spec.rb +101 -101
- data/spec/code_objects/base_spec.rb +470 -470
- 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 +9 -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 -280
- data/spec/docstring_spec.rb +373 -373
- data/spec/examples.txt +1883 -1875
- 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 +327 -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 -236
- 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 -28
- 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 +687 -668
- 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 +303 -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 -3
data/lib/yard/tags/library.rb
CHANGED
@@ -1,633 +1,633 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module YARD
|
3
|
-
module Tags
|
4
|
-
# Keeps track of all the registered meta-data tags and directives.
|
5
|
-
# Also allows for defining of custom tags and customizing the tag parsing
|
6
|
-
# syntax.
|
7
|
-
#
|
8
|
-
# == Defining Custom Meta-Data Tags
|
9
|
-
#
|
10
|
-
# To define a custom tag, use {define_tag}. You should pass the tag
|
11
|
-
# name and the factory method to use when creating the tag. If you do not
|
12
|
-
# provide a factory method to use, it will default to {DefaultFactory#parse_tag}
|
13
|
-
#
|
14
|
-
# You can also define tag objects manually by simply implementing a "tagname_tag"
|
15
|
-
# method that returns a {Tag} object, but they will not take advantage of tag factory
|
16
|
-
# parsing:
|
17
|
-
#
|
18
|
-
# def mytag_tag(text)
|
19
|
-
# Tag.new(:mytag, text)
|
20
|
-
# end
|
21
|
-
#
|
22
|
-
# == Defining Custom Directives
|
23
|
-
#
|
24
|
-
# Directives can be defined by calling the {define_directive} method, taking
|
25
|
-
# the directive name, an optional tag factory parser method (to parse the
|
26
|
-
# data in the directive into a temporary {Tag} object) and a {Directive} subclass
|
27
|
-
# that performs the directive processing. For more information on creating a
|
28
|
-
# Directive subclass, see the {Directive} class documentation.
|
29
|
-
#
|
30
|
-
# Similar to tags, Directives can also be defined manually, in this case using
|
31
|
-
# the method name "mydirective_directive" and returning a new {Directive} object:
|
32
|
-
#
|
33
|
-
# def mydirective_directive(tag, parser)
|
34
|
-
# MyDirective.new(tag, parser)
|
35
|
-
# end
|
36
|
-
#
|
37
|
-
# == Namespaced Tags
|
38
|
-
#
|
39
|
-
# In YARD 0.8.0+, tags can be namespaced using the '.' character. It is recommended
|
40
|
-
# to namespace project specific tags, like +@yard.tag_name+, so that tags do not
|
41
|
-
# collide with other plugins or new built-in tags.
|
42
|
-
#
|
43
|
-
# == Adding/Changing the Tag Syntax
|
44
|
-
#
|
45
|
-
# If you have specialized tag parsing needs you can substitute the {#factory}
|
46
|
-
# object with your own by setting {Library.default_factory= Library.default_factory}
|
47
|
-
# to a new class with its own parsing methods before running YARD. This is useful
|
48
|
-
# if you want to change the syntax of existing tags (@see, @since, etc.)
|
49
|
-
#
|
50
|
-
# @example Defining a custom tag
|
51
|
-
# define_tag "Parameter", :param, :with_types_and_name
|
52
|
-
# define_tag "Author", :author
|
53
|
-
# @example Defining a custom directive
|
54
|
-
# define_directive :method, :with_title_and_text, MethodDirective
|
55
|
-
# @see DefaultFactory
|
56
|
-
# @see define_tag
|
57
|
-
# @see define_directive
|
58
|
-
# @see Directive
|
59
|
-
class Library
|
60
|
-
class << self
|
61
|
-
# @return [SymbolHash{Symbol=>String}] the map of tag names and their
|
62
|
-
# respective display labels.
|
63
|
-
attr_reader :labels
|
64
|
-
|
65
|
-
# @!attribute instance
|
66
|
-
# @return [Library] the main Library instance object.
|
67
|
-
def instance
|
68
|
-
@instance ||= new
|
69
|
-
end
|
70
|
-
|
71
|
-
# @!attribute default_factory
|
72
|
-
# Replace the factory object responsible for parsing tags by setting
|
73
|
-
# this to an object (or class) that responds to +parse_TAGNAME+ methods
|
74
|
-
# where +TAGNAME+ is the name of the tag.
|
75
|
-
#
|
76
|
-
# You should set this value before performing any source parsing with
|
77
|
-
# YARD, otherwise your factory class will not be used.
|
78
|
-
#
|
79
|
-
# @example
|
80
|
-
# YARD::Tags::Library.default_factory = MyFactory
|
81
|
-
#
|
82
|
-
# @see DefaultFactory
|
83
|
-
def default_factory
|
84
|
-
@default_factory ||= DefaultFactory.new
|
85
|
-
end
|
86
|
-
|
87
|
-
def default_factory=(factory)
|
88
|
-
@default_factory = factory.is_a?(Class) ? factory.new : factory
|
89
|
-
end
|
90
|
-
|
91
|
-
# Returns the factory method used to parse the tag text for a specific tag
|
92
|
-
#
|
93
|
-
# @param [Symbol] tag the tag name
|
94
|
-
# @return [Symbol] the factory method name for the tag
|
95
|
-
# @return [Class<Tag>,Symbol] the Tag class to use to parse the tag
|
96
|
-
# or the method to call on the factory class
|
97
|
-
# @return [nil] if the tag is freeform text
|
98
|
-
# @since 0.6.0
|
99
|
-
def factory_method_for(tag)
|
100
|
-
@factory_methods[tag]
|
101
|
-
end
|
102
|
-
|
103
|
-
# Returns the factory method used to parse the tag text for a specific
|
104
|
-
# directive
|
105
|
-
#
|
106
|
-
# @param [Symbol] directive the directive name
|
107
|
-
# @return [Symbol] the factory method name for the tag
|
108
|
-
# @return [Class<Tag>,Symbol] the Tag class to use to parse the tag or
|
109
|
-
# the methods to call on the factory class
|
110
|
-
# @return [nil] if the tag is freeform text
|
111
|
-
# @since 0.8.0
|
112
|
-
def factory_method_for_directive(directive)
|
113
|
-
@directive_factory_classes[directive]
|
114
|
-
end
|
115
|
-
|
116
|
-
# Sets the list of tags to display when rendering templates. The order of
|
117
|
-
# tags in the list is also significant, as it represents the order that
|
118
|
-
# tags are displayed in templates.
|
119
|
-
#
|
120
|
-
# You can use the {Array#place} to insert new tags to be displayed in
|
121
|
-
# the templates at specific positions:
|
122
|
-
#
|
123
|
-
# Library.visible_tags.place(:mytag).before(:return)
|
124
|
-
#
|
125
|
-
# @return [Array<Symbol>] a list of ordered tags
|
126
|
-
# @since 0.6.0
|
127
|
-
attr_accessor :visible_tags
|
128
|
-
|
129
|
-
# Sets the list of tags that should apply to any children inside the
|
130
|
-
# namespace they are defined in. For instance, a "@since" tag should
|
131
|
-
# apply to all methods inside a module it is defined in. Transitive
|
132
|
-
# tags can be overridden by directly defining a tag on the child object.
|
133
|
-
#
|
134
|
-
# @return [Array<Symbol>] a list of transitive tags
|
135
|
-
# @since 0.6.0
|
136
|
-
attr_accessor :transitive_tags
|
137
|
-
|
138
|
-
# Sorts the labels lexically by their label name, often used when displaying
|
139
|
-
# the tags.
|
140
|
-
#
|
141
|
-
# @return [Array<Symbol>, String] the sorted labels as an array of the tag name and label
|
142
|
-
def sorted_labels
|
143
|
-
labels.sort_by {|a| a.last.downcase }
|
144
|
-
end
|
145
|
-
|
146
|
-
# Convenience method to define a new tag using one of {Tag}'s factory methods, or the
|
147
|
-
# regular {DefaultFactory#parse_tag} factory method if none is supplied.
|
148
|
-
#
|
149
|
-
# @!macro [attach] yard.tag
|
150
|
-
# @!method $2_tag
|
151
|
-
# @!visibility private
|
152
|
-
# @yard.tag $2 [$3] $1
|
153
|
-
# @param [#to_s] label the label used when displaying the tag in templates
|
154
|
-
# @param [#to_s] tag the tag name to create
|
155
|
-
# @param [#to_s, Class<Tag>] meth the {Tag} factory method to call when
|
156
|
-
# creating the tag or the name of the class to directly create a tag for
|
157
|
-
def define_tag(label, tag, meth = nil)
|
158
|
-
tag_meth = tag_method_name(tag)
|
159
|
-
if meth.is_a?(Class) && Tag > meth
|
160
|
-
class_eval(<<-eof, __FILE__, __LINE__ + 1)
|
161
|
-
def #{tag_meth}(text)
|
162
|
-
#{meth}.new(#{tag.inspect}, text)
|
163
|
-
end
|
164
|
-
eof
|
165
|
-
else
|
166
|
-
class_eval(<<-eof, __FILE__, __LINE__ + 1)
|
167
|
-
begin; undef #{tag_meth}; rescue NameError; end
|
168
|
-
def #{tag_meth}(text)
|
169
|
-
send_to_factory(#{tag.inspect}, #{meth.inspect}, text)
|
170
|
-
end
|
171
|
-
eof
|
172
|
-
end
|
173
|
-
|
174
|
-
@labels ||= SymbolHash.new(false)
|
175
|
-
@labels.update(tag => label)
|
176
|
-
@factory_methods ||= SymbolHash.new(false)
|
177
|
-
@factory_methods.update(tag => meth)
|
178
|
-
tag
|
179
|
-
end
|
180
|
-
|
181
|
-
# @macro [attach] yard.directive
|
182
|
-
# @!method $1_directive
|
183
|
-
# @!visibility private
|
184
|
-
# @yard.directive $1 [$2] $-1
|
185
|
-
# @overload define_directive(tag, tag_meth = nil, directive_class)
|
186
|
-
# Convenience method to define a new directive using a {Tag} factory
|
187
|
-
# method and {Directive} subclass that implements the directive
|
188
|
-
# callbacks.
|
189
|
-
#
|
190
|
-
# @param [#to_s] tag the tag name of the directive
|
191
|
-
# @param [#to_s] tag_meth the tag factory method to use when
|
192
|
-
# parsing tag information
|
193
|
-
# @param [Class<Directive>] the directive class that implements the
|
194
|
-
# directive behaviour
|
195
|
-
# @see define_tag
|
196
|
-
def define_directive(tag, tag_meth = nil, directive_class = nil)
|
197
|
-
directive_meth = directive_method_name(tag)
|
198
|
-
if directive_class.nil?
|
199
|
-
directive_class = tag_meth
|
200
|
-
tag_meth = nil
|
201
|
-
end
|
202
|
-
class_eval <<-eof, __FILE__, __LINE__
|
203
|
-
def #{directive_meth}(tag, parser)
|
204
|
-
directive_call(tag, parser)
|
205
|
-
end
|
206
|
-
eof
|
207
|
-
|
208
|
-
@factory_methods ||= SymbolHash.new(false)
|
209
|
-
@factory_methods.update(tag => tag_meth)
|
210
|
-
@directive_factory_classes ||= SymbolHash.new(false)
|
211
|
-
@directive_factory_classes.update(tag => directive_class)
|
212
|
-
|
213
|
-
tag
|
214
|
-
end
|
215
|
-
|
216
|
-
def tag_method_name(tag_name)
|
217
|
-
tag_or_directive_method_name(tag_name)
|
218
|
-
end
|
219
|
-
|
220
|
-
def directive_method_name(tag_name)
|
221
|
-
tag_or_directive_method_name(tag_name, 'directive')
|
222
|
-
end
|
223
|
-
|
224
|
-
private
|
225
|
-
|
226
|
-
def tag_or_directive_method_name(tag_name, type = 'tag')
|
227
|
-
"#{tag_name.to_s.tr('.', '_')}_#{type}"
|
228
|
-
end
|
229
|
-
end
|
230
|
-
|
231
|
-
private
|
232
|
-
|
233
|
-
def send_to_factory(tag_name, meth, text)
|
234
|
-
meth = meth.to_s
|
235
|
-
send_name = "parse_tag" + (meth.empty? ? "" : "_" + meth)
|
236
|
-
if @factory.respond_to?(send_name)
|
237
|
-
@factory.send(send_name, tag_name, text)
|
238
|
-
else
|
239
|
-
raise NoMethodError, "Factory #{@factory.class_name} does not implement factory method :#{meth}."
|
240
|
-
end
|
241
|
-
end
|
242
|
-
|
243
|
-
# @return [Directive]
|
244
|
-
def directive_call(tag, parser)
|
245
|
-
meth = self.class.factory_method_for_directive(tag.tag_name)
|
246
|
-
if meth <= Directive
|
247
|
-
meth = meth.new(tag, parser)
|
248
|
-
meth.call
|
249
|
-
meth
|
250
|
-
else
|
251
|
-
meth.call(tag, parser)
|
252
|
-
end
|
253
|
-
end
|
254
|
-
|
255
|
-
public
|
256
|
-
|
257
|
-
# A factory class to handle parsing of tags, defaults to {default_factory}
|
258
|
-
attr_accessor :factory
|
259
|
-
|
260
|
-
def initialize(factory = Library.default_factory)
|
261
|
-
self.factory = factory
|
262
|
-
end
|
263
|
-
|
264
|
-
# @param [#to_s] tag_name the name of the tag to look for
|
265
|
-
# @return [Boolean] whether a tag by the given name is registered in
|
266
|
-
# the library.
|
267
|
-
def has_tag?(tag_name)
|
268
|
-
tag_name && respond_to?(self.class.tag_method_name(tag_name))
|
269
|
-
end
|
270
|
-
|
271
|
-
# Creates a new {Tag} object with a given tag name and data
|
272
|
-
# @return [Tag] the newly created tag object
|
273
|
-
def tag_create(tag_name, tag_buf)
|
274
|
-
send(self.class.tag_method_name(tag_name), tag_buf)
|
275
|
-
end
|
276
|
-
|
277
|
-
# @param [#to_s] tag_name the name of the tag to look for
|
278
|
-
# @return [Boolean] whether a directive by the given name is registered in
|
279
|
-
# the library.
|
280
|
-
def has_directive?(tag_name)
|
281
|
-
tag_name && respond_to?(self.class.directive_method_name(tag_name))
|
282
|
-
end
|
283
|
-
|
284
|
-
# Creates a new directive with tag information and a docstring parser
|
285
|
-
# object.
|
286
|
-
# @param [String] tag_name the name of the tag
|
287
|
-
# @param [String] tag_buf the tag data
|
288
|
-
# @param [DocstringParser] parser the parser object parsing the docstring
|
289
|
-
# @return [Directive] the newly created directive
|
290
|
-
def directive_create(tag_name, tag_buf, parser)
|
291
|
-
meth = self.class.factory_method_for(tag_name)
|
292
|
-
tag = send_to_factory(tag_name, meth, tag_buf)
|
293
|
-
meth = self.class.directive_method_name(tag_name)
|
294
|
-
send(meth, tag, parser)
|
295
|
-
end
|
296
|
-
|
297
|
-
# @!macro yard.tag.transitive
|
298
|
-
# @note This tag is *transitive*. If it is applied on a
|
299
|
-
# namespace (module or class), it will immediately be
|
300
|
-
# applied to all children objects of that namespace unless
|
301
|
-
# it is redefined on the child object.
|
302
|
-
|
303
|
-
# Marks a class/module/method as abstract with optional
|
304
|
-
# implementor information.
|
305
|
-
#
|
306
|
-
# @example
|
307
|
-
# # @abstract Subclass and override {#run} to implement
|
308
|
-
# # a custom Threadable class.
|
309
|
-
# class Runnable
|
310
|
-
# def run; raise NotImplementedError end
|
311
|
-
# end
|
312
|
-
define_tag "Abstract", :abstract
|
313
|
-
|
314
|
-
# Declares the API that the object belongs to. Does not display in
|
315
|
-
# output, but useful for performing queries (+yardoc --query+). Any text is
|
316
|
-
# allowable in this tag, and there are no predefined values.
|
317
|
-
#
|
318
|
-
# @!macro yard.tag.transitive
|
319
|
-
# @note The special name +@api private+ does display a notice in
|
320
|
-
# documentation if it is listed, letting users know that the
|
321
|
-
# method is not to be used by external components.
|
322
|
-
# @example
|
323
|
-
# class Post
|
324
|
-
# # @api private
|
325
|
-
# def reset_table!; table.flush end
|
326
|
-
# end
|
327
|
-
define_tag "API Visibility", :api
|
328
|
-
|
329
|
-
# Declares a readwrite attribute on a Struct or class.
|
330
|
-
#
|
331
|
-
# @note This attribute is only applicable on class docstrings
|
332
|
-
# @deprecated Use the more powerful {tag:!attribute} directive instead.
|
333
|
-
# @example
|
334
|
-
# # @attr [String] name the name of the structure
|
335
|
-
# # @attr [Fixnum] size the size of the structure
|
336
|
-
# class MyStruct < Struct; end
|
337
|
-
define_tag "Attribute", :attr, :with_types_and_name
|
338
|
-
|
339
|
-
# Declares a readonly attribute on a Struct or class.
|
340
|
-
#
|
341
|
-
# @note This attribute is only applicable on class docstrings
|
342
|
-
# @deprecated Use the more powerful {tag:!attribute} directive instead.
|
343
|
-
# @example
|
344
|
-
# # @attr_reader [String] name the name of the structure
|
345
|
-
# # @attr_reader [Fixnum] size the size of the structure
|
346
|
-
# class MyStruct < Struct; end
|
347
|
-
define_tag "Attribute Getter", :attr_reader, :with_types_and_name
|
348
|
-
|
349
|
-
# Declares a writeonly attribute on a Struct or class.
|
350
|
-
#
|
351
|
-
# @note This attribute is only applicable on class docstrings
|
352
|
-
# @deprecated Use the more powerful {tag:!attribute} directive instead.
|
353
|
-
# @example
|
354
|
-
# # @attr_reader [String] name the name of the structure
|
355
|
-
# # @attr_reader [Fixnum] size the size of the structure
|
356
|
-
# class MyStruct < Struct; end
|
357
|
-
define_tag "Attribute Setter", :attr_writer, :with_types_and_name
|
358
|
-
|
359
|
-
# List the author or authors of a class, module, or method.
|
360
|
-
#
|
361
|
-
# @example
|
362
|
-
# # @author Foo Bar <foo@bar.com>
|
363
|
-
# class MyClass; end
|
364
|
-
define_tag "Author", :author
|
365
|
-
|
366
|
-
# Marks a method/class as deprecated with an optional description.
|
367
|
-
# The description should be used to inform users of the recommended
|
368
|
-
# migration path, and/or any useful information about why the object
|
369
|
-
# was marked as deprecated.
|
370
|
-
#
|
371
|
-
# @example Deprecate a method with a replacement API
|
372
|
-
# # @deprecated Use {#bar} instead.
|
373
|
-
# def foo; end
|
374
|
-
# @example Deprecate a method with no replacement
|
375
|
-
# class Thread
|
376
|
-
# # @deprecated Exiting a thread in this way is not reliable and
|
377
|
-
# # can cause a program crash.
|
378
|
-
# def kill; end
|
379
|
-
# end
|
380
|
-
define_tag "Deprecated", :deprecated
|
381
|
-
|
382
|
-
# Show an example snippet of code for an object. The first line
|
383
|
-
# is an optional title.
|
384
|
-
#
|
385
|
-
# @example
|
386
|
-
# # @example Reverse a String
|
387
|
-
# # "mystring".reverse #=> "gnirtsym"
|
388
|
-
# def reverse; end
|
389
|
-
# @yard.signature Optional title
|
390
|
-
# Code block
|
391
|
-
define_tag "Example", :example, :with_title_and_text
|
392
|
-
|
393
|
-
# Adds an emphasized note at the top of the docstring for the object
|
394
|
-
#
|
395
|
-
# @example
|
396
|
-
# # @note This method should only be used in outer space.
|
397
|
-
# def eject; end
|
398
|
-
# @see tag:todo
|
399
|
-
define_tag "Note", :note
|
400
|
-
|
401
|
-
# Describe an options hash in a method. The tag takes the
|
402
|
-
# name of the options parameter first, followed by optional types,
|
403
|
-
# the option key name, a default value for the key and a
|
404
|
-
# description of the option. The default value should be placed within
|
405
|
-
# parentheses and is optional (can be omitted).
|
406
|
-
#
|
407
|
-
# Note that a +@param+ tag need not be defined for the options
|
408
|
-
# hash itself, though it is useful to do so for completeness.
|
409
|
-
#
|
410
|
-
# @note For keyword parameters, use +@param+, not +@option+.
|
411
|
-
#
|
412
|
-
# @example
|
413
|
-
# # @param [Hash] opts the options to create a message with.
|
414
|
-
# # @option opts [String] :subject The subject
|
415
|
-
# # @option opts [String] :from ('nobody') From address
|
416
|
-
# # @option opts [String] :to Recipient email
|
417
|
-
# # @option opts [String] :body ('') The email's body
|
418
|
-
# def send_email(opts = {}) end
|
419
|
-
# @yard.signature name [Types] option_key (default_value) description
|
420
|
-
define_tag "Options Hash", :option, :with_options
|
421
|
-
|
422
|
-
# Describe that your method can be used in various
|
423
|
-
# contexts with various parameters or return types. The first
|
424
|
-
# line should declare the new method signature, and the following
|
425
|
-
# indented tag data will be a new documentation string with its
|
426
|
-
# own tags adding metadata for such an overload.
|
427
|
-
#
|
428
|
-
# @example
|
429
|
-
# # @overload set(key, value)
|
430
|
-
# # Sets a value on key
|
431
|
-
# # @param key [Symbol] describe key param
|
432
|
-
# # @param value [Object] describe value param
|
433
|
-
# # @overload set(value)
|
434
|
-
# # Sets a value on the default key +:foo+
|
435
|
-
# # @param value [Object] describe value param
|
436
|
-
# def set(*args) end
|
437
|
-
# @yard.signature method_signature(parameters)
|
438
|
-
# Indented docstring for overload method
|
439
|
-
define_tag "Overloads", :overload, OverloadTag
|
440
|
-
|
441
|
-
# Documents a single method parameter (either regular or keyword) with a given name, type
|
442
|
-
# and optional description.
|
443
|
-
#
|
444
|
-
# @example
|
445
|
-
# # @param url [String] the URL of the page to download
|
446
|
-
# # @param directory [String] the name of the directory to save to
|
447
|
-
# def load_page(url, directory: 'pages') end
|
448
|
-
define_tag "Parameters", :param, :with_types_and_name
|
449
|
-
|
450
|
-
# Declares that the _logical_ visibility of an object is private.
|
451
|
-
# In other words, it specifies that this method should be marked
|
452
|
-
# private but cannot due to Ruby's visibility restrictions. This
|
453
|
-
# exists for classes, modules and constants that do not obey Ruby's
|
454
|
-
# visibility rules. For instance, an inner class might be considered
|
455
|
-
# "private", though Ruby would make no such distinction.
|
456
|
-
#
|
457
|
-
# This tag is meant to be used in conjunction with the +--no-private+
|
458
|
-
# command-line option, and is required to actually remove these objects
|
459
|
-
# from documentation output. See {file:README.md} for more information on
|
460
|
-
# switches.
|
461
|
-
#
|
462
|
-
# If you simply want to set the API visibility of a method, you should
|
463
|
-
# look at the {tag:api} tag instead.
|
464
|
-
#
|
465
|
-
# @note This method is not recommended for hiding undocumented or
|
466
|
-
# "unimportant" methods. This tag should only be used to mark objects
|
467
|
-
# private when Ruby visibility rules cannot do so. In Ruby 1.9.3, you
|
468
|
-
# can use +private_constant+ to declare constants (like classes or
|
469
|
-
# modules) as private, and should be used instead of +@private+.
|
470
|
-
# @macro yard.tag.transitive
|
471
|
-
# @example
|
472
|
-
# # @private
|
473
|
-
# class InteralImplementation; end
|
474
|
-
# @see tag:api
|
475
|
-
# @yard.signature
|
476
|
-
define_tag "Private", :private
|
477
|
-
|
478
|
-
# Describes that a method may raise a given exception, with
|
479
|
-
# an optional description of what it may mean.
|
480
|
-
#
|
481
|
-
# @example
|
482
|
-
# # @raise [AccountBalanceError] if the account does not have
|
483
|
-
# # sufficient funds to perform the transaction
|
484
|
-
# def withdraw(amount) end
|
485
|
-
define_tag "Raises", :raise, :with_types
|
486
|
-
|
487
|
-
# Describes the return value (and type or types) of a method.
|
488
|
-
# You can list multiple return tags for a method in the case
|
489
|
-
# where a method has distinct return cases. In this case, each
|
490
|
-
# case should begin with "if ...".
|
491
|
-
#
|
492
|
-
# @example A regular return value
|
493
|
-
# # @return [Fixnum] the size of the file
|
494
|
-
# def size; @file.size end
|
495
|
-
# @example A method returns an Array or a single object
|
496
|
-
# # @return [String] if a single object was returned
|
497
|
-
# # from the database.
|
498
|
-
# # @return [Array<String>] if multiple objects were
|
499
|
-
# # returned.
|
500
|
-
# def find(query) end
|
501
|
-
define_tag "Returns", :return, :with_types
|
502
|
-
|
503
|
-
# "See Also" references for an object. Accepts URLs or
|
504
|
-
# other code objects with an optional description at the end.
|
505
|
-
# Note that the URL or object will be automatically linked by
|
506
|
-
# YARD and does not need to be formatted with markup.
|
507
|
-
#
|
508
|
-
# @example
|
509
|
-
# # Synchronizes system time using NTP.
|
510
|
-
# # @see http://ntp.org/documentation.html NTP Documentation
|
511
|
-
# # @see NTPHelperMethods
|
512
|
-
# class NTPUpdater; end
|
513
|
-
define_tag "See Also", :see, :with_name
|
514
|
-
|
515
|
-
# Lists the version that the object was first added.
|
516
|
-
#
|
517
|
-
# @!macro yard.tag.transitive
|
518
|
-
# @example
|
519
|
-
# # @since 1.2.4
|
520
|
-
# def clear_routes; end
|
521
|
-
define_tag "Since", :since
|
522
|
-
|
523
|
-
# Marks a TODO note in the object being documented.
|
524
|
-
# For reference, objects with TODO items can be enumerated
|
525
|
-
# from the command line with a simple command:
|
526
|
-
#
|
527
|
-
# !!!sh
|
528
|
-
# mocker$ yard list --query '@todo'
|
529
|
-
# lib/mocker/mocker.rb:15: Mocker
|
530
|
-
# lib/mocker/report/html.rb:5: Mocker::Report::Html
|
531
|
-
#
|
532
|
-
# YARD can also be used to enumerate the TODO items from
|
533
|
-
# a short script:
|
534
|
-
#
|
535
|
-
# !!!ruby
|
536
|
-
# require 'yard'
|
537
|
-
# YARD::Registry.load!.all.each do |o|
|
538
|
-
# puts o.tag(:todo).text if o.tag(:todo)
|
539
|
-
# end
|
540
|
-
#
|
541
|
-
# @example
|
542
|
-
# # @todo Add support for Jabberwocky service.
|
543
|
-
# # There is an open source Jabberwocky library available
|
544
|
-
# # at http://jbrwcky.org that can be easily integrated.
|
545
|
-
# class Wonderlander; end
|
546
|
-
# @see tag:note
|
547
|
-
define_tag "Todo Item", :todo
|
548
|
-
|
549
|
-
# Lists the version of a class, module or method. This is
|
550
|
-
# similar to a library version, but at finer granularity.
|
551
|
-
# In some cases, version of specific modules, classes, methods
|
552
|
-
# or generalized components might change independently between
|
553
|
-
# releases. A version tag is used to infer the API compatibility
|
554
|
-
# of a specific object.
|
555
|
-
#
|
556
|
-
# @example
|
557
|
-
# # The public REST API for http://jbrwcky.org
|
558
|
-
# # @version 2.0
|
559
|
-
# class JabberwockyAPI; end
|
560
|
-
define_tag "Version", :version
|
561
|
-
|
562
|
-
# Describes what a method might yield to a given block.
|
563
|
-
# The types specifier list should not list types, but names
|
564
|
-
# of the parameters yielded to the block. If you define
|
565
|
-
# parameters with +@yieldparam+, you do not need to define
|
566
|
-
# the parameters in the type specification of +@yield+ as
|
567
|
-
# well.
|
568
|
-
#
|
569
|
-
# @example
|
570
|
-
# # For a block {|a,b,c| ... }
|
571
|
-
# # @yield [a, b, c] Gives 3 random numbers to the block
|
572
|
-
# def provide3values(&block) yield(42, 42, 42) end
|
573
|
-
# @see tag:yieldparam
|
574
|
-
# @see tag:yieldreturn
|
575
|
-
# @yard.signature [parameters] description
|
576
|
-
define_tag "Yields", :yield, :with_types
|
577
|
-
|
578
|
-
# Defines a parameter yielded by a block. If you define the
|
579
|
-
# parameters with +@yieldparam+, you do not need to define
|
580
|
-
# them via +@yield+ as well.
|
581
|
-
#
|
582
|
-
# @example
|
583
|
-
# # @yieldparam [String] name the name that is yielded
|
584
|
-
# def with_name(name) yield(name) end
|
585
|
-
define_tag "Yield Parameters", :yieldparam, :with_types_and_name
|
586
|
-
|
587
|
-
# Documents the value and type that the block is expected
|
588
|
-
# to return to the method.
|
589
|
-
#
|
590
|
-
# @example
|
591
|
-
# # @yieldreturn [Fixnum] the number to add 5 to.
|
592
|
-
# def add5_block(&block) 5 + yield end
|
593
|
-
# @see tag:return
|
594
|
-
define_tag "Yield Returns", :yieldreturn, :with_types
|
595
|
-
|
596
|
-
# @yard.signature [r | w | rw] attribute_name
|
597
|
-
# Indented attribute docstring
|
598
|
-
define_directive :attribute, :with_types_and_title, AttributeDirective
|
599
|
-
|
600
|
-
# @yard.signature
|
601
|
-
define_directive :endgroup, EndGroupDirective
|
602
|
-
|
603
|
-
define_directive :group, GroupDirective
|
604
|
-
|
605
|
-
# @yard.signature [attach | new] optional_name
|
606
|
-
# Optional macro expansion data
|
607
|
-
define_directive :macro, :with_types_and_title, MacroDirective
|
608
|
-
|
609
|
-
# @yard.signature method_signature(parameters)
|
610
|
-
# Indented method docstring
|
611
|
-
define_directive :method, :with_title_and_text, MethodDirective
|
612
|
-
|
613
|
-
# @yard.signature [language] code
|
614
|
-
define_directive :parse, :with_types, ParseDirective
|
615
|
-
|
616
|
-
# Sets the scope of a DSL method. Only applicable to DSL method
|
617
|
-
# calls. Acceptable values are 'class' or 'instance'
|
618
|
-
# @yard.signature class | instance
|
619
|
-
define_directive :scope, ScopeDirective
|
620
|
-
|
621
|
-
# Sets the visibility of a DSL method. Only applicable to
|
622
|
-
# DSL method calls. Acceptable values are public, protected, or private.
|
623
|
-
# @yard.signature public | protected | private
|
624
|
-
define_directive :visibility, VisibilityDirective
|
625
|
-
|
626
|
-
self.visible_tags = [:abstract, :deprecated, :note, :todo, :example, :overload,
|
627
|
-
:param, :option, :yield, :yieldparam, :yieldreturn, :return, :raise,
|
628
|
-
:see, :author, :since, :version]
|
629
|
-
|
630
|
-
self.transitive_tags = [:since, :api]
|
631
|
-
end
|
632
|
-
end
|
633
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module YARD
|
3
|
+
module Tags
|
4
|
+
# Keeps track of all the registered meta-data tags and directives.
|
5
|
+
# Also allows for defining of custom tags and customizing the tag parsing
|
6
|
+
# syntax.
|
7
|
+
#
|
8
|
+
# == Defining Custom Meta-Data Tags
|
9
|
+
#
|
10
|
+
# To define a custom tag, use {define_tag}. You should pass the tag
|
11
|
+
# name and the factory method to use when creating the tag. If you do not
|
12
|
+
# provide a factory method to use, it will default to {DefaultFactory#parse_tag}
|
13
|
+
#
|
14
|
+
# You can also define tag objects manually by simply implementing a "tagname_tag"
|
15
|
+
# method that returns a {Tag} object, but they will not take advantage of tag factory
|
16
|
+
# parsing:
|
17
|
+
#
|
18
|
+
# def mytag_tag(text)
|
19
|
+
# Tag.new(:mytag, text)
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# == Defining Custom Directives
|
23
|
+
#
|
24
|
+
# Directives can be defined by calling the {define_directive} method, taking
|
25
|
+
# the directive name, an optional tag factory parser method (to parse the
|
26
|
+
# data in the directive into a temporary {Tag} object) and a {Directive} subclass
|
27
|
+
# that performs the directive processing. For more information on creating a
|
28
|
+
# Directive subclass, see the {Directive} class documentation.
|
29
|
+
#
|
30
|
+
# Similar to tags, Directives can also be defined manually, in this case using
|
31
|
+
# the method name "mydirective_directive" and returning a new {Directive} object:
|
32
|
+
#
|
33
|
+
# def mydirective_directive(tag, parser)
|
34
|
+
# MyDirective.new(tag, parser)
|
35
|
+
# end
|
36
|
+
#
|
37
|
+
# == Namespaced Tags
|
38
|
+
#
|
39
|
+
# In YARD 0.8.0+, tags can be namespaced using the '.' character. It is recommended
|
40
|
+
# to namespace project specific tags, like +@yard.tag_name+, so that tags do not
|
41
|
+
# collide with other plugins or new built-in tags.
|
42
|
+
#
|
43
|
+
# == Adding/Changing the Tag Syntax
|
44
|
+
#
|
45
|
+
# If you have specialized tag parsing needs you can substitute the {#factory}
|
46
|
+
# object with your own by setting {Library.default_factory= Library.default_factory}
|
47
|
+
# to a new class with its own parsing methods before running YARD. This is useful
|
48
|
+
# if you want to change the syntax of existing tags (@see, @since, etc.)
|
49
|
+
#
|
50
|
+
# @example Defining a custom tag
|
51
|
+
# define_tag "Parameter", :param, :with_types_and_name
|
52
|
+
# define_tag "Author", :author
|
53
|
+
# @example Defining a custom directive
|
54
|
+
# define_directive :method, :with_title_and_text, MethodDirective
|
55
|
+
# @see DefaultFactory
|
56
|
+
# @see define_tag
|
57
|
+
# @see define_directive
|
58
|
+
# @see Directive
|
59
|
+
class Library
|
60
|
+
class << self
|
61
|
+
# @return [SymbolHash{Symbol=>String}] the map of tag names and their
|
62
|
+
# respective display labels.
|
63
|
+
attr_reader :labels
|
64
|
+
|
65
|
+
# @!attribute instance
|
66
|
+
# @return [Library] the main Library instance object.
|
67
|
+
def instance
|
68
|
+
@instance ||= new
|
69
|
+
end
|
70
|
+
|
71
|
+
# @!attribute default_factory
|
72
|
+
# Replace the factory object responsible for parsing tags by setting
|
73
|
+
# this to an object (or class) that responds to +parse_TAGNAME+ methods
|
74
|
+
# where +TAGNAME+ is the name of the tag.
|
75
|
+
#
|
76
|
+
# You should set this value before performing any source parsing with
|
77
|
+
# YARD, otherwise your factory class will not be used.
|
78
|
+
#
|
79
|
+
# @example
|
80
|
+
# YARD::Tags::Library.default_factory = MyFactory
|
81
|
+
#
|
82
|
+
# @see DefaultFactory
|
83
|
+
def default_factory
|
84
|
+
@default_factory ||= DefaultFactory.new
|
85
|
+
end
|
86
|
+
|
87
|
+
def default_factory=(factory)
|
88
|
+
@default_factory = factory.is_a?(Class) ? factory.new : factory
|
89
|
+
end
|
90
|
+
|
91
|
+
# Returns the factory method used to parse the tag text for a specific tag
|
92
|
+
#
|
93
|
+
# @param [Symbol] tag the tag name
|
94
|
+
# @return [Symbol] the factory method name for the tag
|
95
|
+
# @return [Class<Tag>,Symbol] the Tag class to use to parse the tag
|
96
|
+
# or the method to call on the factory class
|
97
|
+
# @return [nil] if the tag is freeform text
|
98
|
+
# @since 0.6.0
|
99
|
+
def factory_method_for(tag)
|
100
|
+
@factory_methods[tag]
|
101
|
+
end
|
102
|
+
|
103
|
+
# Returns the factory method used to parse the tag text for a specific
|
104
|
+
# directive
|
105
|
+
#
|
106
|
+
# @param [Symbol] directive the directive name
|
107
|
+
# @return [Symbol] the factory method name for the tag
|
108
|
+
# @return [Class<Tag>,Symbol] the Tag class to use to parse the tag or
|
109
|
+
# the methods to call on the factory class
|
110
|
+
# @return [nil] if the tag is freeform text
|
111
|
+
# @since 0.8.0
|
112
|
+
def factory_method_for_directive(directive)
|
113
|
+
@directive_factory_classes[directive]
|
114
|
+
end
|
115
|
+
|
116
|
+
# Sets the list of tags to display when rendering templates. The order of
|
117
|
+
# tags in the list is also significant, as it represents the order that
|
118
|
+
# tags are displayed in templates.
|
119
|
+
#
|
120
|
+
# You can use the {Array#place} to insert new tags to be displayed in
|
121
|
+
# the templates at specific positions:
|
122
|
+
#
|
123
|
+
# Library.visible_tags.place(:mytag).before(:return)
|
124
|
+
#
|
125
|
+
# @return [Array<Symbol>] a list of ordered tags
|
126
|
+
# @since 0.6.0
|
127
|
+
attr_accessor :visible_tags
|
128
|
+
|
129
|
+
# Sets the list of tags that should apply to any children inside the
|
130
|
+
# namespace they are defined in. For instance, a "@since" tag should
|
131
|
+
# apply to all methods inside a module it is defined in. Transitive
|
132
|
+
# tags can be overridden by directly defining a tag on the child object.
|
133
|
+
#
|
134
|
+
# @return [Array<Symbol>] a list of transitive tags
|
135
|
+
# @since 0.6.0
|
136
|
+
attr_accessor :transitive_tags
|
137
|
+
|
138
|
+
# Sorts the labels lexically by their label name, often used when displaying
|
139
|
+
# the tags.
|
140
|
+
#
|
141
|
+
# @return [Array<Symbol>, String] the sorted labels as an array of the tag name and label
|
142
|
+
def sorted_labels
|
143
|
+
labels.sort_by {|a| a.last.downcase }
|
144
|
+
end
|
145
|
+
|
146
|
+
# Convenience method to define a new tag using one of {Tag}'s factory methods, or the
|
147
|
+
# regular {DefaultFactory#parse_tag} factory method if none is supplied.
|
148
|
+
#
|
149
|
+
# @!macro [attach] yard.tag
|
150
|
+
# @!method $2_tag
|
151
|
+
# @!visibility private
|
152
|
+
# @yard.tag $2 [$3] $1
|
153
|
+
# @param [#to_s] label the label used when displaying the tag in templates
|
154
|
+
# @param [#to_s] tag the tag name to create
|
155
|
+
# @param [#to_s, Class<Tag>] meth the {Tag} factory method to call when
|
156
|
+
# creating the tag or the name of the class to directly create a tag for
|
157
|
+
def define_tag(label, tag, meth = nil)
|
158
|
+
tag_meth = tag_method_name(tag)
|
159
|
+
if meth.is_a?(Class) && Tag > meth
|
160
|
+
class_eval(<<-eof, __FILE__, __LINE__ + 1)
|
161
|
+
def #{tag_meth}(text)
|
162
|
+
#{meth}.new(#{tag.inspect}, text)
|
163
|
+
end
|
164
|
+
eof
|
165
|
+
else
|
166
|
+
class_eval(<<-eof, __FILE__, __LINE__ + 1)
|
167
|
+
begin; undef #{tag_meth}; rescue NameError; end
|
168
|
+
def #{tag_meth}(text)
|
169
|
+
send_to_factory(#{tag.inspect}, #{meth.inspect}, text)
|
170
|
+
end
|
171
|
+
eof
|
172
|
+
end
|
173
|
+
|
174
|
+
@labels ||= SymbolHash.new(false)
|
175
|
+
@labels.update(tag => label)
|
176
|
+
@factory_methods ||= SymbolHash.new(false)
|
177
|
+
@factory_methods.update(tag => meth)
|
178
|
+
tag
|
179
|
+
end
|
180
|
+
|
181
|
+
# @macro [attach] yard.directive
|
182
|
+
# @!method $1_directive
|
183
|
+
# @!visibility private
|
184
|
+
# @yard.directive $1 [$2] $-1
|
185
|
+
# @overload define_directive(tag, tag_meth = nil, directive_class)
|
186
|
+
# Convenience method to define a new directive using a {Tag} factory
|
187
|
+
# method and {Directive} subclass that implements the directive
|
188
|
+
# callbacks.
|
189
|
+
#
|
190
|
+
# @param [#to_s] tag the tag name of the directive
|
191
|
+
# @param [#to_s] tag_meth the tag factory method to use when
|
192
|
+
# parsing tag information
|
193
|
+
# @param [Class<Directive>] the directive class that implements the
|
194
|
+
# directive behaviour
|
195
|
+
# @see define_tag
|
196
|
+
def define_directive(tag, tag_meth = nil, directive_class = nil)
|
197
|
+
directive_meth = directive_method_name(tag)
|
198
|
+
if directive_class.nil?
|
199
|
+
directive_class = tag_meth
|
200
|
+
tag_meth = nil
|
201
|
+
end
|
202
|
+
class_eval <<-eof, __FILE__, __LINE__
|
203
|
+
def #{directive_meth}(tag, parser)
|
204
|
+
directive_call(tag, parser)
|
205
|
+
end
|
206
|
+
eof
|
207
|
+
|
208
|
+
@factory_methods ||= SymbolHash.new(false)
|
209
|
+
@factory_methods.update(tag => tag_meth)
|
210
|
+
@directive_factory_classes ||= SymbolHash.new(false)
|
211
|
+
@directive_factory_classes.update(tag => directive_class)
|
212
|
+
|
213
|
+
tag
|
214
|
+
end
|
215
|
+
|
216
|
+
def tag_method_name(tag_name)
|
217
|
+
tag_or_directive_method_name(tag_name)
|
218
|
+
end
|
219
|
+
|
220
|
+
def directive_method_name(tag_name)
|
221
|
+
tag_or_directive_method_name(tag_name, 'directive')
|
222
|
+
end
|
223
|
+
|
224
|
+
private
|
225
|
+
|
226
|
+
def tag_or_directive_method_name(tag_name, type = 'tag')
|
227
|
+
"#{tag_name.to_s.tr('.', '_')}_#{type}"
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
private
|
232
|
+
|
233
|
+
def send_to_factory(tag_name, meth, text)
|
234
|
+
meth = meth.to_s
|
235
|
+
send_name = "parse_tag" + (meth.empty? ? "" : "_" + meth)
|
236
|
+
if @factory.respond_to?(send_name)
|
237
|
+
@factory.send(send_name, tag_name, text)
|
238
|
+
else
|
239
|
+
raise NoMethodError, "Factory #{@factory.class_name} does not implement factory method :#{meth}."
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
# @return [Directive]
|
244
|
+
def directive_call(tag, parser)
|
245
|
+
meth = self.class.factory_method_for_directive(tag.tag_name)
|
246
|
+
if meth <= Directive
|
247
|
+
meth = meth.new(tag, parser)
|
248
|
+
meth.call
|
249
|
+
meth
|
250
|
+
else
|
251
|
+
meth.call(tag, parser)
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
public
|
256
|
+
|
257
|
+
# A factory class to handle parsing of tags, defaults to {default_factory}
|
258
|
+
attr_accessor :factory
|
259
|
+
|
260
|
+
def initialize(factory = Library.default_factory)
|
261
|
+
self.factory = factory
|
262
|
+
end
|
263
|
+
|
264
|
+
# @param [#to_s] tag_name the name of the tag to look for
|
265
|
+
# @return [Boolean] whether a tag by the given name is registered in
|
266
|
+
# the library.
|
267
|
+
def has_tag?(tag_name)
|
268
|
+
tag_name && respond_to?(self.class.tag_method_name(tag_name))
|
269
|
+
end
|
270
|
+
|
271
|
+
# Creates a new {Tag} object with a given tag name and data
|
272
|
+
# @return [Tag] the newly created tag object
|
273
|
+
def tag_create(tag_name, tag_buf)
|
274
|
+
send(self.class.tag_method_name(tag_name), tag_buf)
|
275
|
+
end
|
276
|
+
|
277
|
+
# @param [#to_s] tag_name the name of the tag to look for
|
278
|
+
# @return [Boolean] whether a directive by the given name is registered in
|
279
|
+
# the library.
|
280
|
+
def has_directive?(tag_name)
|
281
|
+
tag_name && respond_to?(self.class.directive_method_name(tag_name))
|
282
|
+
end
|
283
|
+
|
284
|
+
# Creates a new directive with tag information and a docstring parser
|
285
|
+
# object.
|
286
|
+
# @param [String] tag_name the name of the tag
|
287
|
+
# @param [String] tag_buf the tag data
|
288
|
+
# @param [DocstringParser] parser the parser object parsing the docstring
|
289
|
+
# @return [Directive] the newly created directive
|
290
|
+
def directive_create(tag_name, tag_buf, parser)
|
291
|
+
meth = self.class.factory_method_for(tag_name)
|
292
|
+
tag = send_to_factory(tag_name, meth, tag_buf)
|
293
|
+
meth = self.class.directive_method_name(tag_name)
|
294
|
+
send(meth, tag, parser)
|
295
|
+
end
|
296
|
+
|
297
|
+
# @!macro yard.tag.transitive
|
298
|
+
# @note This tag is *transitive*. If it is applied on a
|
299
|
+
# namespace (module or class), it will immediately be
|
300
|
+
# applied to all children objects of that namespace unless
|
301
|
+
# it is redefined on the child object.
|
302
|
+
|
303
|
+
# Marks a class/module/method as abstract with optional
|
304
|
+
# implementor information.
|
305
|
+
#
|
306
|
+
# @example
|
307
|
+
# # @abstract Subclass and override {#run} to implement
|
308
|
+
# # a custom Threadable class.
|
309
|
+
# class Runnable
|
310
|
+
# def run; raise NotImplementedError end
|
311
|
+
# end
|
312
|
+
define_tag "Abstract", :abstract
|
313
|
+
|
314
|
+
# Declares the API that the object belongs to. Does not display in
|
315
|
+
# output, but useful for performing queries (+yardoc --query+). Any text is
|
316
|
+
# allowable in this tag, and there are no predefined values.
|
317
|
+
#
|
318
|
+
# @!macro yard.tag.transitive
|
319
|
+
# @note The special name +@api private+ does display a notice in
|
320
|
+
# documentation if it is listed, letting users know that the
|
321
|
+
# method is not to be used by external components.
|
322
|
+
# @example
|
323
|
+
# class Post
|
324
|
+
# # @api private
|
325
|
+
# def reset_table!; table.flush end
|
326
|
+
# end
|
327
|
+
define_tag "API Visibility", :api
|
328
|
+
|
329
|
+
# Declares a readwrite attribute on a Struct or class.
|
330
|
+
#
|
331
|
+
# @note This attribute is only applicable on class docstrings
|
332
|
+
# @deprecated Use the more powerful {tag:!attribute} directive instead.
|
333
|
+
# @example
|
334
|
+
# # @attr [String] name the name of the structure
|
335
|
+
# # @attr [Fixnum] size the size of the structure
|
336
|
+
# class MyStruct < Struct; end
|
337
|
+
define_tag "Attribute", :attr, :with_types_and_name
|
338
|
+
|
339
|
+
# Declares a readonly attribute on a Struct or class.
|
340
|
+
#
|
341
|
+
# @note This attribute is only applicable on class docstrings
|
342
|
+
# @deprecated Use the more powerful {tag:!attribute} directive instead.
|
343
|
+
# @example
|
344
|
+
# # @attr_reader [String] name the name of the structure
|
345
|
+
# # @attr_reader [Fixnum] size the size of the structure
|
346
|
+
# class MyStruct < Struct; end
|
347
|
+
define_tag "Attribute Getter", :attr_reader, :with_types_and_name
|
348
|
+
|
349
|
+
# Declares a writeonly attribute on a Struct or class.
|
350
|
+
#
|
351
|
+
# @note This attribute is only applicable on class docstrings
|
352
|
+
# @deprecated Use the more powerful {tag:!attribute} directive instead.
|
353
|
+
# @example
|
354
|
+
# # @attr_reader [String] name the name of the structure
|
355
|
+
# # @attr_reader [Fixnum] size the size of the structure
|
356
|
+
# class MyStruct < Struct; end
|
357
|
+
define_tag "Attribute Setter", :attr_writer, :with_types_and_name
|
358
|
+
|
359
|
+
# List the author or authors of a class, module, or method.
|
360
|
+
#
|
361
|
+
# @example
|
362
|
+
# # @author Foo Bar <foo@bar.com>
|
363
|
+
# class MyClass; end
|
364
|
+
define_tag "Author", :author
|
365
|
+
|
366
|
+
# Marks a method/class as deprecated with an optional description.
|
367
|
+
# The description should be used to inform users of the recommended
|
368
|
+
# migration path, and/or any useful information about why the object
|
369
|
+
# was marked as deprecated.
|
370
|
+
#
|
371
|
+
# @example Deprecate a method with a replacement API
|
372
|
+
# # @deprecated Use {#bar} instead.
|
373
|
+
# def foo; end
|
374
|
+
# @example Deprecate a method with no replacement
|
375
|
+
# class Thread
|
376
|
+
# # @deprecated Exiting a thread in this way is not reliable and
|
377
|
+
# # can cause a program crash.
|
378
|
+
# def kill; end
|
379
|
+
# end
|
380
|
+
define_tag "Deprecated", :deprecated
|
381
|
+
|
382
|
+
# Show an example snippet of code for an object. The first line
|
383
|
+
# is an optional title.
|
384
|
+
#
|
385
|
+
# @example
|
386
|
+
# # @example Reverse a String
|
387
|
+
# # "mystring".reverse #=> "gnirtsym"
|
388
|
+
# def reverse; end
|
389
|
+
# @yard.signature Optional title
|
390
|
+
# Code block
|
391
|
+
define_tag "Example", :example, :with_title_and_text
|
392
|
+
|
393
|
+
# Adds an emphasized note at the top of the docstring for the object
|
394
|
+
#
|
395
|
+
# @example
|
396
|
+
# # @note This method should only be used in outer space.
|
397
|
+
# def eject; end
|
398
|
+
# @see tag:todo
|
399
|
+
define_tag "Note", :note
|
400
|
+
|
401
|
+
# Describe an options hash in a method. The tag takes the
|
402
|
+
# name of the options parameter first, followed by optional types,
|
403
|
+
# the option key name, a default value for the key and a
|
404
|
+
# description of the option. The default value should be placed within
|
405
|
+
# parentheses and is optional (can be omitted).
|
406
|
+
#
|
407
|
+
# Note that a +@param+ tag need not be defined for the options
|
408
|
+
# hash itself, though it is useful to do so for completeness.
|
409
|
+
#
|
410
|
+
# @note For keyword parameters, use +@param+, not +@option+.
|
411
|
+
#
|
412
|
+
# @example
|
413
|
+
# # @param [Hash] opts the options to create a message with.
|
414
|
+
# # @option opts [String] :subject The subject
|
415
|
+
# # @option opts [String] :from ('nobody') From address
|
416
|
+
# # @option opts [String] :to Recipient email
|
417
|
+
# # @option opts [String] :body ('') The email's body
|
418
|
+
# def send_email(opts = {}) end
|
419
|
+
# @yard.signature name [Types] option_key (default_value) description
|
420
|
+
define_tag "Options Hash", :option, :with_options
|
421
|
+
|
422
|
+
# Describe that your method can be used in various
|
423
|
+
# contexts with various parameters or return types. The first
|
424
|
+
# line should declare the new method signature, and the following
|
425
|
+
# indented tag data will be a new documentation string with its
|
426
|
+
# own tags adding metadata for such an overload.
|
427
|
+
#
|
428
|
+
# @example
|
429
|
+
# # @overload set(key, value)
|
430
|
+
# # Sets a value on key
|
431
|
+
# # @param key [Symbol] describe key param
|
432
|
+
# # @param value [Object] describe value param
|
433
|
+
# # @overload set(value)
|
434
|
+
# # Sets a value on the default key +:foo+
|
435
|
+
# # @param value [Object] describe value param
|
436
|
+
# def set(*args) end
|
437
|
+
# @yard.signature method_signature(parameters)
|
438
|
+
# Indented docstring for overload method
|
439
|
+
define_tag "Overloads", :overload, OverloadTag
|
440
|
+
|
441
|
+
# Documents a single method parameter (either regular or keyword) with a given name, type
|
442
|
+
# and optional description.
|
443
|
+
#
|
444
|
+
# @example
|
445
|
+
# # @param url [String] the URL of the page to download
|
446
|
+
# # @param directory [String] the name of the directory to save to
|
447
|
+
# def load_page(url, directory: 'pages') end
|
448
|
+
define_tag "Parameters", :param, :with_types_and_name
|
449
|
+
|
450
|
+
# Declares that the _logical_ visibility of an object is private.
|
451
|
+
# In other words, it specifies that this method should be marked
|
452
|
+
# private but cannot due to Ruby's visibility restrictions. This
|
453
|
+
# exists for classes, modules and constants that do not obey Ruby's
|
454
|
+
# visibility rules. For instance, an inner class might be considered
|
455
|
+
# "private", though Ruby would make no such distinction.
|
456
|
+
#
|
457
|
+
# This tag is meant to be used in conjunction with the +--no-private+
|
458
|
+
# command-line option, and is required to actually remove these objects
|
459
|
+
# from documentation output. See {file:README.md} for more information on
|
460
|
+
# switches.
|
461
|
+
#
|
462
|
+
# If you simply want to set the API visibility of a method, you should
|
463
|
+
# look at the {tag:api} tag instead.
|
464
|
+
#
|
465
|
+
# @note This method is not recommended for hiding undocumented or
|
466
|
+
# "unimportant" methods. This tag should only be used to mark objects
|
467
|
+
# private when Ruby visibility rules cannot do so. In Ruby 1.9.3, you
|
468
|
+
# can use +private_constant+ to declare constants (like classes or
|
469
|
+
# modules) as private, and should be used instead of +@private+.
|
470
|
+
# @macro yard.tag.transitive
|
471
|
+
# @example
|
472
|
+
# # @private
|
473
|
+
# class InteralImplementation; end
|
474
|
+
# @see tag:api
|
475
|
+
# @yard.signature
|
476
|
+
define_tag "Private", :private
|
477
|
+
|
478
|
+
# Describes that a method may raise a given exception, with
|
479
|
+
# an optional description of what it may mean.
|
480
|
+
#
|
481
|
+
# @example
|
482
|
+
# # @raise [AccountBalanceError] if the account does not have
|
483
|
+
# # sufficient funds to perform the transaction
|
484
|
+
# def withdraw(amount) end
|
485
|
+
define_tag "Raises", :raise, :with_types
|
486
|
+
|
487
|
+
# Describes the return value (and type or types) of a method.
|
488
|
+
# You can list multiple return tags for a method in the case
|
489
|
+
# where a method has distinct return cases. In this case, each
|
490
|
+
# case should begin with "if ...".
|
491
|
+
#
|
492
|
+
# @example A regular return value
|
493
|
+
# # @return [Fixnum] the size of the file
|
494
|
+
# def size; @file.size end
|
495
|
+
# @example A method returns an Array or a single object
|
496
|
+
# # @return [String] if a single object was returned
|
497
|
+
# # from the database.
|
498
|
+
# # @return [Array<String>] if multiple objects were
|
499
|
+
# # returned.
|
500
|
+
# def find(query) end
|
501
|
+
define_tag "Returns", :return, :with_types
|
502
|
+
|
503
|
+
# "See Also" references for an object. Accepts URLs or
|
504
|
+
# other code objects with an optional description at the end.
|
505
|
+
# Note that the URL or object will be automatically linked by
|
506
|
+
# YARD and does not need to be formatted with markup.
|
507
|
+
#
|
508
|
+
# @example
|
509
|
+
# # Synchronizes system time using NTP.
|
510
|
+
# # @see http://ntp.org/documentation.html NTP Documentation
|
511
|
+
# # @see NTPHelperMethods
|
512
|
+
# class NTPUpdater; end
|
513
|
+
define_tag "See Also", :see, :with_name
|
514
|
+
|
515
|
+
# Lists the version that the object was first added.
|
516
|
+
#
|
517
|
+
# @!macro yard.tag.transitive
|
518
|
+
# @example
|
519
|
+
# # @since 1.2.4
|
520
|
+
# def clear_routes; end
|
521
|
+
define_tag "Since", :since
|
522
|
+
|
523
|
+
# Marks a TODO note in the object being documented.
|
524
|
+
# For reference, objects with TODO items can be enumerated
|
525
|
+
# from the command line with a simple command:
|
526
|
+
#
|
527
|
+
# !!!sh
|
528
|
+
# mocker$ yard list --query '@todo'
|
529
|
+
# lib/mocker/mocker.rb:15: Mocker
|
530
|
+
# lib/mocker/report/html.rb:5: Mocker::Report::Html
|
531
|
+
#
|
532
|
+
# YARD can also be used to enumerate the TODO items from
|
533
|
+
# a short script:
|
534
|
+
#
|
535
|
+
# !!!ruby
|
536
|
+
# require 'yard'
|
537
|
+
# YARD::Registry.load!.all.each do |o|
|
538
|
+
# puts o.tag(:todo).text if o.tag(:todo)
|
539
|
+
# end
|
540
|
+
#
|
541
|
+
# @example
|
542
|
+
# # @todo Add support for Jabberwocky service.
|
543
|
+
# # There is an open source Jabberwocky library available
|
544
|
+
# # at http://jbrwcky.org that can be easily integrated.
|
545
|
+
# class Wonderlander; end
|
546
|
+
# @see tag:note
|
547
|
+
define_tag "Todo Item", :todo
|
548
|
+
|
549
|
+
# Lists the version of a class, module or method. This is
|
550
|
+
# similar to a library version, but at finer granularity.
|
551
|
+
# In some cases, version of specific modules, classes, methods
|
552
|
+
# or generalized components might change independently between
|
553
|
+
# releases. A version tag is used to infer the API compatibility
|
554
|
+
# of a specific object.
|
555
|
+
#
|
556
|
+
# @example
|
557
|
+
# # The public REST API for http://jbrwcky.org
|
558
|
+
# # @version 2.0
|
559
|
+
# class JabberwockyAPI; end
|
560
|
+
define_tag "Version", :version
|
561
|
+
|
562
|
+
# Describes what a method might yield to a given block.
|
563
|
+
# The types specifier list should not list types, but names
|
564
|
+
# of the parameters yielded to the block. If you define
|
565
|
+
# parameters with +@yieldparam+, you do not need to define
|
566
|
+
# the parameters in the type specification of +@yield+ as
|
567
|
+
# well.
|
568
|
+
#
|
569
|
+
# @example
|
570
|
+
# # For a block {|a,b,c| ... }
|
571
|
+
# # @yield [a, b, c] Gives 3 random numbers to the block
|
572
|
+
# def provide3values(&block) yield(42, 42, 42) end
|
573
|
+
# @see tag:yieldparam
|
574
|
+
# @see tag:yieldreturn
|
575
|
+
# @yard.signature [parameters] description
|
576
|
+
define_tag "Yields", :yield, :with_types
|
577
|
+
|
578
|
+
# Defines a parameter yielded by a block. If you define the
|
579
|
+
# parameters with +@yieldparam+, you do not need to define
|
580
|
+
# them via +@yield+ as well.
|
581
|
+
#
|
582
|
+
# @example
|
583
|
+
# # @yieldparam [String] name the name that is yielded
|
584
|
+
# def with_name(name) yield(name) end
|
585
|
+
define_tag "Yield Parameters", :yieldparam, :with_types_and_name
|
586
|
+
|
587
|
+
# Documents the value and type that the block is expected
|
588
|
+
# to return to the method.
|
589
|
+
#
|
590
|
+
# @example
|
591
|
+
# # @yieldreturn [Fixnum] the number to add 5 to.
|
592
|
+
# def add5_block(&block) 5 + yield end
|
593
|
+
# @see tag:return
|
594
|
+
define_tag "Yield Returns", :yieldreturn, :with_types
|
595
|
+
|
596
|
+
# @yard.signature [r | w | rw] attribute_name
|
597
|
+
# Indented attribute docstring
|
598
|
+
define_directive :attribute, :with_types_and_title, AttributeDirective
|
599
|
+
|
600
|
+
# @yard.signature
|
601
|
+
define_directive :endgroup, EndGroupDirective
|
602
|
+
|
603
|
+
define_directive :group, GroupDirective
|
604
|
+
|
605
|
+
# @yard.signature [attach | new] optional_name
|
606
|
+
# Optional macro expansion data
|
607
|
+
define_directive :macro, :with_types_and_title, MacroDirective
|
608
|
+
|
609
|
+
# @yard.signature method_signature(parameters)
|
610
|
+
# Indented method docstring
|
611
|
+
define_directive :method, :with_title_and_text, MethodDirective
|
612
|
+
|
613
|
+
# @yard.signature [language] code
|
614
|
+
define_directive :parse, :with_types, ParseDirective
|
615
|
+
|
616
|
+
# Sets the scope of a DSL method. Only applicable to DSL method
|
617
|
+
# calls. Acceptable values are 'class' or 'instance'
|
618
|
+
# @yard.signature class | instance
|
619
|
+
define_directive :scope, ScopeDirective
|
620
|
+
|
621
|
+
# Sets the visibility of a DSL method. Only applicable to
|
622
|
+
# DSL method calls. Acceptable values are public, protected, or private.
|
623
|
+
# @yard.signature public | protected | private
|
624
|
+
define_directive :visibility, VisibilityDirective
|
625
|
+
|
626
|
+
self.visible_tags = [:abstract, :deprecated, :note, :todo, :example, :overload,
|
627
|
+
:param, :option, :yield, :yieldparam, :yieldreturn, :return, :raise,
|
628
|
+
:see, :author, :since, :version]
|
629
|
+
|
630
|
+
self.transitive_tags = [:since, :api]
|
631
|
+
end
|
632
|
+
end
|
633
|
+
end
|