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,13 +1,13 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module YARD
|
3
|
-
module Tags
|
4
|
-
class DefaultTag < Tag
|
5
|
-
attr_reader :defaults
|
6
|
-
|
7
|
-
def initialize(tag_name, text, types = nil, name = nil, defaults = nil)
|
8
|
-
super(tag_name, text, types, name)
|
9
|
-
@defaults = defaults
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module YARD
|
3
|
+
module Tags
|
4
|
+
class DefaultTag < Tag
|
5
|
+
attr_reader :defaults
|
6
|
+
|
7
|
+
def initialize(tag_name, text, types = nil, name = nil, defaults = nil)
|
8
|
+
super(tag_name, text, types, name)
|
9
|
+
@defaults = defaults
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/yard/tags/directives.rb
CHANGED
@@ -1,616 +1,616 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require 'ostruct'
|
3
|
-
|
4
|
-
module YARD
|
5
|
-
module Tags
|
6
|
-
# The base directive class. Subclass this class to create a custom
|
7
|
-
# directive, registering it with {Library.define_directive}. Directive
|
8
|
-
# classes are executed via the {#call} method, which perform all directive
|
9
|
-
# processing on the object.
|
10
|
-
#
|
11
|
-
# If processing occurs within a handler, the {#handler} attribute is
|
12
|
-
# available to access more information about parsing context and state.
|
13
|
-
# Handlers are only available when parsing from {Parser::SourceParser},
|
14
|
-
# not when parsing directly from {DocstringParser}. If the docstring is
|
15
|
-
# attached to an object declaration, {#object} will be set and available
|
16
|
-
# to modify the generated code object directly. Note that both of these
|
17
|
-
# attributes may be nil, and directives should test their existence
|
18
|
-
# before attempting to use them.
|
19
|
-
#
|
20
|
-
# @abstract Subclasses should implement {#call}.
|
21
|
-
# @see Library.define_directive
|
22
|
-
# @since 0.8.0
|
23
|
-
class Directive
|
24
|
-
# @return [Tag] the meta-data tag containing data input to the directive
|
25
|
-
attr_accessor :tag
|
26
|
-
|
27
|
-
# Set this field to replace the directive definition inside of a docstring
|
28
|
-
# with arbitrary text. For instance, the {MacroDirective} uses this field
|
29
|
-
# to expand its macro data in place of the call to a +@!macro+.
|
30
|
-
#
|
31
|
-
# @return [String] the text to expand in the original docstring in place
|
32
|
-
# of this directive definition.
|
33
|
-
# @return [nil] if no expansion should take place for this directive
|
34
|
-
attr_accessor :expanded_text
|
35
|
-
|
36
|
-
# @return [DocstringParser] the parser that is parsing all tag
|
37
|
-
# information out of the docstring
|
38
|
-
attr_accessor :parser
|
39
|
-
|
40
|
-
# @!attribute [r] object
|
41
|
-
# @return [CodeObjects::Base, nil] the object the parent docstring is
|
42
|
-
# attached to. May be nil.
|
43
|
-
def object; parser.object end
|
44
|
-
|
45
|
-
# @!attribute [r] handler
|
46
|
-
# @return [Handlers::Base, nil] the handler object the docstring parser
|
47
|
-
# might be attached to. May be nil. Only available when parsing
|
48
|
-
# through {Parser::SourceParser}.
|
49
|
-
def handler; parser.handler end
|
50
|
-
|
51
|
-
# @!endgroup
|
52
|
-
|
53
|
-
# @param [Tag] tag the meta-data tag containing all input to the docstring
|
54
|
-
# @param [DocstringParser] parser the docstring parser object
|
55
|
-
def initialize(tag, parser)
|
56
|
-
self.tag = tag
|
57
|
-
self.parser = parser
|
58
|
-
self.expanded_text = nil
|
59
|
-
end
|
60
|
-
|
61
|
-
# @!group Parser callbacks
|
62
|
-
|
63
|
-
# Called when processing the directive. Subclasses should implement
|
64
|
-
# this method to perform all functionality of the directive.
|
65
|
-
#
|
66
|
-
# @abstract implement this method to perform all data processing for
|
67
|
-
# the directive.
|
68
|
-
# @return [void]
|
69
|
-
def call; raise NotImplementedError end
|
70
|
-
|
71
|
-
# Called after parsing all directives and tags in the docstring. Used
|
72
|
-
# to perform any cleanup after all directives perform their main task.
|
73
|
-
# @return [void]
|
74
|
-
def after_parse; end
|
75
|
-
|
76
|
-
protected :parser
|
77
|
-
end
|
78
|
-
|
79
|
-
# Ends a group listing definition. Group definition automatically end
|
80
|
-
# when class or module blocks are closed, and defining a new group overrides
|
81
|
-
# the last group definition, but occasionally you need to end the current
|
82
|
-
# group to return to the default listing. Use {tag:!group} to begin a
|
83
|
-
# group listing.
|
84
|
-
#
|
85
|
-
# @example
|
86
|
-
# class Controller
|
87
|
-
# # @!group Callbacks
|
88
|
-
#
|
89
|
-
# def before_filter; end
|
90
|
-
# def after_filter; end
|
91
|
-
#
|
92
|
-
# # @!endgroup
|
93
|
-
#
|
94
|
-
# def index; end
|
95
|
-
# end
|
96
|
-
# @see tag:!group
|
97
|
-
# @since 0.6.0
|
98
|
-
class EndGroupDirective < Directive
|
99
|
-
def call
|
100
|
-
return unless handler
|
101
|
-
handler.extra_state.group = nil
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
# Defines a group listing. All methods (and attributes) seen after this
|
106
|
-
# directive are placed into a group with the given description as the
|
107
|
-
# group name. The group listing is used by templates to organize methods
|
108
|
-
# and attributes into respective logical groups. To end a group listing
|
109
|
-
# use {tag:!endgroup}.
|
110
|
-
#
|
111
|
-
# @note A group definition only applies to the scope it is defined in.
|
112
|
-
# If a new class or module is opened after the directive, this directive
|
113
|
-
# will not apply to methods in that class or module.
|
114
|
-
# @example
|
115
|
-
# # @!group Callbacks
|
116
|
-
#
|
117
|
-
# def before_filter; end
|
118
|
-
# def after_filter; end
|
119
|
-
# @see tag:!endgroup
|
120
|
-
# @since 0.6.0
|
121
|
-
class GroupDirective < Directive
|
122
|
-
def call
|
123
|
-
return unless handler
|
124
|
-
handler.extra_state.group = tag.text
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
# Defines a block of text to be expanded whenever the macro is called by name
|
129
|
-
# in subsequent docstrings. The macro data can be any arbitrary text data, be
|
130
|
-
# it regular documentation, meta-data tags or directives.
|
131
|
-
#
|
132
|
-
# == Defining a Macro
|
133
|
-
#
|
134
|
-
# A macro must first be defined in order to be used. Note that a macro is also
|
135
|
-
# expanded upon definition if it defined on an object (the docstring of a
|
136
|
-
# method, class, module or constant object as opposed to a free standing
|
137
|
-
# comment). To define a macro, use the "new" or "attach" identifier in the
|
138
|
-
# types specifier list. A macro will also automatically be created if an
|
139
|
-
# indented macro data block is given, so the keywords are not strictly needed.
|
140
|
-
#
|
141
|
-
# === Anonymous Macros
|
142
|
-
#
|
143
|
-
# In addition to standard named macros, macros can be defined anonymously if
|
144
|
-
# no name is given. In this case, they can not be re-used in future docstrings,
|
145
|
-
# but they will expand in the first definition. This is useful when needing
|
146
|
-
# to take advantage of the macro expansion variables (described below).
|
147
|
-
#
|
148
|
-
# == Using a Macro
|
149
|
-
#
|
150
|
-
# To re-use a macro in another docstring after it is defined, simply use
|
151
|
-
# <tt>@!macro the_name</tt> with no indented block of macro data. The resulting
|
152
|
-
# data will be expanded in place.
|
153
|
-
#
|
154
|
-
# == Attaching a Macro to a DSL Method
|
155
|
-
#
|
156
|
-
# Macros can be defined to auto-expand on DSL-style class method calls. To
|
157
|
-
# define a macro to be auto expanded in this way, use the "attach" keyword
|
158
|
-
# in the type specifier list ("new" is implied).
|
159
|
-
#
|
160
|
-
# Attached macros can also be attached directly on the class method declaration
|
161
|
-
# that provides the DSL method to its subclasses. The syntax in either case
|
162
|
-
# is the same.
|
163
|
-
#
|
164
|
-
# == Macro Expansion Variables
|
165
|
-
#
|
166
|
-
# In the case of using macros on DSL-style method calls, a number of expansion
|
167
|
-
# variables can be used for interpolation inside of the macro data. The variables,
|
168
|
-
# similar in syntax to Ruby's global variables, are as follows:
|
169
|
-
#
|
170
|
-
# * $0 - the method name being called
|
171
|
-
# * $1, $2, $3, ... - the Nth argument in the method call
|
172
|
-
# * $& - the full source line
|
173
|
-
#
|
174
|
-
# The following example shows what the expansion variables might hold for a given
|
175
|
-
# DSL method call:
|
176
|
-
#
|
177
|
-
# property :foo, :a, :b, :c, String
|
178
|
-
# # $0 => "property"
|
179
|
-
# # $1 => "foo"
|
180
|
-
# # $2 => "a"
|
181
|
-
# # $& => "property :foo, :a, :b, :c, String"
|
182
|
-
#
|
183
|
-
# === Ranges
|
184
|
-
#
|
185
|
-
# Ranges are also acceptable with the syntax <tt>${N-M}</tt>. Negative values
|
186
|
-
# on either N or M are valid, and refer to indexes from the end of the list.
|
187
|
-
# Consider a DSL method that creates a method using the first argument with
|
188
|
-
# argument names following, ending with the return type of the method. This
|
189
|
-
# could be documented as:
|
190
|
-
#
|
191
|
-
# # @!macro dsl_method
|
192
|
-
# # @!method $1(${2--2})
|
193
|
-
# # @return [${-1}] the return value of $0
|
194
|
-
# create_method_with_args :foo, :a, :b, :c, String
|
195
|
-
#
|
196
|
-
# As described, the method is using the signature <tt>foo(a, b, c)</tt> and the return
|
197
|
-
# type from the last argument, +String+. When using ranges, tokens are joined
|
198
|
-
# with commas. Note that this includes using $0:
|
199
|
-
#
|
200
|
-
# !!!plain
|
201
|
-
# $0-1 # => Interpolates to "create_method_with_args, foo"
|
202
|
-
#
|
203
|
-
# If you want to separate them with spaces, use <tt>$1 $2 $3 $4 ...</tt>. Note that
|
204
|
-
# if the token cannot be expanded, it will return the empty string (not an error),
|
205
|
-
# so it would be safe to list <tt>$1 $2 ... $10</tt>, for example.
|
206
|
-
#
|
207
|
-
# === Escaping Interpolation
|
208
|
-
#
|
209
|
-
# Interpolation can be escaped by prefixing the +$+ with +\\\+, like so:
|
210
|
-
#
|
211
|
-
# # @!macro foo
|
212
|
-
# # I have \$2.00 USD.
|
213
|
-
#
|
214
|
-
# @example Defining a simple macro
|
215
|
-
# # @!macro [new] returnself
|
216
|
-
# # @return [self] returns itself
|
217
|
-
# @example Using a simple macro in multiple docstrings
|
218
|
-
# # Documentation for map
|
219
|
-
# # ...
|
220
|
-
# # @macro returnself
|
221
|
-
# def map; end
|
222
|
-
#
|
223
|
-
# # Documentation for filter
|
224
|
-
# # ...
|
225
|
-
# # @macro returnself
|
226
|
-
# def filter; end
|
227
|
-
# @example Attaching a macro to a class method (for DSL usage)
|
228
|
-
# class Resource
|
229
|
-
# # Defines a new property
|
230
|
-
# # @param [String] name the property name
|
231
|
-
# # @param [Class] type the property's type
|
232
|
-
# # @!macro [attach] property
|
233
|
-
# # @return [$2] the $1 property
|
234
|
-
# def self.property(name, type) end
|
235
|
-
# end
|
236
|
-
#
|
237
|
-
# class Post < Resource
|
238
|
-
# property :title, String
|
239
|
-
# property :view_count, Integer
|
240
|
-
# end
|
241
|
-
# @example Attaching a macro directly to a DSL method
|
242
|
-
# class Post < Resource
|
243
|
-
# # @!macro [attach] property
|
244
|
-
# # @return [$2] the $1 property
|
245
|
-
# property :title, String
|
246
|
-
#
|
247
|
-
# # Macro will expand on this definition too
|
248
|
-
# property :view_count, Integer
|
249
|
-
# end
|
250
|
-
# @since 0.7.0
|
251
|
-
class MacroDirective < Directive
|
252
|
-
def call
|
253
|
-
raise TagFormatError if tag.name.nil? && tag.text.to_s.empty?
|
254
|
-
macro_data = find_or_create
|
255
|
-
unless macro_data
|
256
|
-
warn
|
257
|
-
return
|
258
|
-
end
|
259
|
-
|
260
|
-
self.expanded_text = expand(macro_data)
|
261
|
-
end
|
262
|
-
|
263
|
-
private
|
264
|
-
|
265
|
-
def new?
|
266
|
-
(tag.types && tag.types.include?('new')) ||
|
267
|
-
(tag.text && !tag.text.strip.empty?)
|
268
|
-
end
|
269
|
-
|
270
|
-
def attach?
|
271
|
-
new? && # must have data or there is nothing to attach
|
272
|
-
class_method? || # always attach to class methods
|
273
|
-
(tag.types && tag.types.include?('attach'))
|
274
|
-
end
|
275
|
-
|
276
|
-
def class_method?
|
277
|
-
object && object.is_a?(CodeObjects::MethodObject) &&
|
278
|
-
object.scope == :class
|
279
|
-
end
|
280
|
-
|
281
|
-
def anonymous?
|
282
|
-
tag.name.nil? || tag.name.empty?
|
283
|
-
end
|
284
|
-
|
285
|
-
def expand(macro_data)
|
286
|
-
return if attach? && class_method?
|
287
|
-
return if !anonymous? && new? &&
|
288
|
-
(!handler || handler.statement.source.empty?)
|
289
|
-
call_params = []
|
290
|
-
caller_method = nil
|
291
|
-
full_source = ''
|
292
|
-
if handler
|
293
|
-
call_params = handler.call_params
|
294
|
-
caller_method = handler.caller_method
|
295
|
-
full_source = handler.statement.source
|
296
|
-
end
|
297
|
-
all_params = ([caller_method] + call_params).compact
|
298
|
-
CodeObjects::MacroObject.expand(macro_data, all_params, full_source)
|
299
|
-
end
|
300
|
-
|
301
|
-
def find_or_create
|
302
|
-
if new? || attach?
|
303
|
-
if handler && attach?
|
304
|
-
if object && object.is_a?(CodeObjects::NamespaceObject)
|
305
|
-
log.warn "Attaching macros to non-methods is unsupported, ignoring: " \
|
306
|
-
"#{object.path} (#{handler.parser.file}:#{handler.statement.line})"
|
307
|
-
obj = nil
|
308
|
-
else
|
309
|
-
obj = object ? object :
|
310
|
-
P("#{handler.namespace}.#{handler.caller_method}")
|
311
|
-
end
|
312
|
-
else
|
313
|
-
obj = nil
|
314
|
-
end
|
315
|
-
|
316
|
-
return tag.text || "" if anonymous? # anonymous macro
|
317
|
-
macro = CodeObjects::MacroObject.create(tag.name, tag.text, obj)
|
318
|
-
else
|
319
|
-
macro = CodeObjects::MacroObject.find(tag.name)
|
320
|
-
end
|
321
|
-
|
322
|
-
macro ? macro.macro_data : nil
|
323
|
-
end
|
324
|
-
|
325
|
-
def warn
|
326
|
-
if object && handler
|
327
|
-
log.warn "Invalid/missing macro name for " \
|
328
|
-
"#{object.path} (#{handler.parser.file}:#{handler.statement.line})"
|
329
|
-
end
|
330
|
-
end
|
331
|
-
end
|
332
|
-
|
333
|
-
# Defines a method object with a given method signature, using indented
|
334
|
-
# block data as the method's docstring. The signature is similar to the
|
335
|
-
# {tag:overload} tag. The comment containing this directive does not need
|
336
|
-
# to be attached to any source, but if it is, that source code will be
|
337
|
-
# used as the method's source.
|
338
|
-
#
|
339
|
-
# To define an attribute method, see {tag:!attribute}
|
340
|
-
#
|
341
|
-
# @note This directive should only be used if there is no explicit
|
342
|
-
# declaration for the method in any source files (i.e., the method
|
343
|
-
# is declared dynamically via meta-programming). In all other cases, add
|
344
|
-
# documentation to the method definition itself.
|
345
|
-
# @note For backwards compatibility support, you do not need to indent
|
346
|
-
# the method's docstring text. If a +@!method+ directive is seen with
|
347
|
-
# no indented block, the entire docstring is used as the new method's
|
348
|
-
# docstring text.
|
349
|
-
# @example Defining a simple method
|
350
|
-
# # @!method quit(username, message = "Quit")
|
351
|
-
# # Sends a quit message to the server for a +username+.
|
352
|
-
# # @param [String] username the username to quit
|
353
|
-
# # @param [String] message the quit message
|
354
|
-
# quit_message_method
|
355
|
-
# @example Attaching multiple methods to the same source
|
356
|
-
# # @!method method1
|
357
|
-
# # @!method method2
|
358
|
-
# create_methods :method1, :method2
|
359
|
-
# @see tag:!attribute
|
360
|
-
# @since 0.7.0
|
361
|
-
class MethodDirective < Directive
|
362
|
-
SCOPE_MATCH = /\A\s*self\s*\.\s*/
|
363
|
-
|
364
|
-
def call; end
|
365
|
-
|
366
|
-
def after_parse
|
367
|
-
return unless handler
|
368
|
-
use_indented_text
|
369
|
-
create_object
|
370
|
-
end
|
371
|
-
|
372
|
-
protected
|
373
|
-
|
374
|
-
def method_name
|
375
|
-
sig = sanitized_tag_signature
|
376
|
-
if sig && sig =~ /^#{CodeObjects::METHODNAMEMATCH}(\s|\(|$)/
|
377
|
-
sig[/\A\s*([^\(; \t]+)/, 1]
|
378
|
-
else
|
379
|
-
handler.call_params.first
|
380
|
-
end
|
381
|
-
end
|
382
|
-
|
383
|
-
def method_signature
|
384
|
-
"def #{sanitized_tag_signature || method_name}"
|
385
|
-
end
|
386
|
-
|
387
|
-
def sanitized_tag_signature
|
388
|
-
if tag.name && tag.name =~ SCOPE_MATCH
|
389
|
-
parser.state.scope = :class
|
390
|
-
$'
|
391
|
-
else
|
392
|
-
tag.name
|
393
|
-
end
|
394
|
-
end
|
395
|
-
|
396
|
-
def use_indented_text
|
397
|
-
return if tag.text.empty?
|
398
|
-
handler = parser.handler
|
399
|
-
object = parser.object
|
400
|
-
self.parser = parser.class.new(parser.library)
|
401
|
-
parser.state.inside_directive = true
|
402
|
-
parser.parse(tag.text, object, handler)
|
403
|
-
parser.state.inside_directive = false
|
404
|
-
end
|
405
|
-
|
406
|
-
def create_object
|
407
|
-
name = method_name
|
408
|
-
scope = parser.state.scope || handler.scope
|
409
|
-
visibility = parser.state.visibility || handler.visibility
|
410
|
-
ns = CodeObjects::NamespaceObject === object ? object : handler.namespace
|
411
|
-
obj = CodeObjects::MethodObject.new(ns, name, scope)
|
412
|
-
handler.register_file_info(obj)
|
413
|
-
handler.register_source(obj)
|
414
|
-
handler.register_visibility(obj, visibility)
|
415
|
-
handler.register_group(obj)
|
416
|
-
obj.signature = method_signature
|
417
|
-
obj.parameters = OverloadTag.new(:overload, method_signature).parameters
|
418
|
-
obj.docstring = Docstring.new!(parser.text, parser.tags, obj,
|
419
|
-
parser.raw_text, parser.reference)
|
420
|
-
handler.register_module_function(obj)
|
421
|
-
old_obj = parser.object
|
422
|
-
parser.object = obj
|
423
|
-
parser.post_process
|
424
|
-
parser.object = old_obj
|
425
|
-
obj
|
426
|
-
end
|
427
|
-
end
|
428
|
-
|
429
|
-
# Defines an attribute with a given name, using indented block data as the
|
430
|
-
# attribute's docstring. If the type specifier is supplied with "r", "w", or
|
431
|
-
# "rw", the attribute is made readonly, writeonly or readwrite respectively.
|
432
|
-
# A readwrite attribute is the default, if no type is specified. The comment
|
433
|
-
# containing this directive does not need to be attached to any source, but
|
434
|
-
# if it is, that source code will be used as the method's source.
|
435
|
-
#
|
436
|
-
# To define a regular method, see {tag:!method}
|
437
|
-
#
|
438
|
-
# @note This directive should only be used if there is no explicit +attr_*+
|
439
|
-
# declaration for the attribute in any source files (i.e., the attribute
|
440
|
-
# is declared dynamically via meta-programming). In all other cases, add
|
441
|
-
# documentation to the attribute declaration itself.
|
442
|
-
# @note For backwards compatibility support, you do not need to indent
|
443
|
-
# the attribute's docstring text. If an +@!attribute+ directive is seen with
|
444
|
-
# no indented block, the entire docstring is used as the new attribute's
|
445
|
-
# docstring text.
|
446
|
-
# @example Defining a simple readonly attribute
|
447
|
-
# # @!attribute [r] count
|
448
|
-
# # @return [Fixnum] the size of the list
|
449
|
-
# @example Defining a simple readwrite attribute
|
450
|
-
# # @!attribute name
|
451
|
-
# # @return [String] the name of the user
|
452
|
-
# @see tag:!method
|
453
|
-
# @since 0.7.0
|
454
|
-
class AttributeDirective < MethodDirective
|
455
|
-
def after_parse
|
456
|
-
return unless handler
|
457
|
-
use_indented_text
|
458
|
-
create_attribute_data(create_object)
|
459
|
-
end
|
460
|
-
|
461
|
-
protected
|
462
|
-
|
463
|
-
def method_name
|
464
|
-
name = sanitized_tag_signature || handler.call_params.first
|
465
|
-
name += '=' unless readable?
|
466
|
-
name
|
467
|
-
end
|
468
|
-
|
469
|
-
def method_signature
|
470
|
-
if readable?
|
471
|
-
"def #{method_name}"
|
472
|
-
else
|
473
|
-
"def #{method_name}(value)"
|
474
|
-
end
|
475
|
-
end
|
476
|
-
|
477
|
-
private
|
478
|
-
|
479
|
-
def create_attribute_data(object)
|
480
|
-
return unless object
|
481
|
-
clean_name = object.name.to_s.sub(/=$/, '')
|
482
|
-
attrs = object.namespace.attributes[object.scope]
|
483
|
-
attrs[clean_name] ||= SymbolHash[:read => nil, :write => nil]
|
484
|
-
attrs[clean_name][:read] = object if readable?
|
485
|
-
if writable?
|
486
|
-
if object.name.to_s[-1, 1] == '='
|
487
|
-
writer = object
|
488
|
-
writer.parameters = [['value', nil]]
|
489
|
-
else
|
490
|
-
writer = CodeObjects::MethodObject.new(object.namespace,
|
491
|
-
object.name.to_s + '=', object.scope)
|
492
|
-
writer.signature = "def #{object.name}=(value)"
|
493
|
-
writer.visibility = object.visibility
|
494
|
-
writer.dynamic = object.dynamic
|
495
|
-
writer.source = object.source
|
496
|
-
writer.group = object.group
|
497
|
-
writer.parameters = [['value', nil]]
|
498
|
-
writer.docstring = object.base_docstring
|
499
|
-
handler.register_file_info(writer)
|
500
|
-
end
|
501
|
-
attrs[clean_name][:write] = writer
|
502
|
-
end
|
503
|
-
end
|
504
|
-
|
505
|
-
def writable?
|
506
|
-
!tag.types || tag.types.join.include?('w')
|
507
|
-
end
|
508
|
-
|
509
|
-
def readable?
|
510
|
-
!tag.types || tag.types.join =~ /(?!w)r/
|
511
|
-
end
|
512
|
-
end
|
513
|
-
|
514
|
-
# Parses a block of code as if it were present in the source file at that
|
515
|
-
# location. This directive is useful if a class has dynamic meta-programmed
|
516
|
-
# behaviour that cannot be recognized by YARD.
|
517
|
-
#
|
518
|
-
# You can specify the language of the code block using the types
|
519
|
-
# specification list. By default, the code language is "ruby".
|
520
|
-
#
|
521
|
-
# @example Documenting dynamic module inclusion
|
522
|
-
# class User
|
523
|
-
# # includes "UserMixin" and extends "UserMixin::ClassMethods"
|
524
|
-
# # using the UserMixin.included callback.
|
525
|
-
# # @!parse include UserMixin
|
526
|
-
# # @!parse extend UserMixin::ClassMethods
|
527
|
-
# end
|
528
|
-
# @example Declaring a method as an attribute
|
529
|
-
# # This should really be an attribute
|
530
|
-
# # @!parse attr_reader :foo
|
531
|
-
# def object; @parent.object end
|
532
|
-
# @example Parsing C code
|
533
|
-
# # @!parse [c]
|
534
|
-
# # void Init_Foo() {
|
535
|
-
# # rb_define_method(rb_cFoo, "method", method, 0);
|
536
|
-
# # }
|
537
|
-
# @since 0.8.0
|
538
|
-
class ParseDirective < Directive
|
539
|
-
def call
|
540
|
-
lang = tag.types ? tag.types.first.to_sym :
|
541
|
-
(handler ? handler.parser.parser_type : :ruby)
|
542
|
-
if handler && lang == handler.parser.parser_type
|
543
|
-
pclass = Parser::SourceParser.parser_types[handler.parser.parser_type]
|
544
|
-
pobj = pclass.new(tag.text, handler.parser.file)
|
545
|
-
pobj.parse
|
546
|
-
handler.parser.process(pobj.enumerator)
|
547
|
-
else # initialize a new parse chain
|
548
|
-
src_parser = Parser::SourceParser.new(lang, handler ? handler.globals : nil)
|
549
|
-
src_parser.file = handler.parser.file if handler
|
550
|
-
src_parser.parse(StringIO.new(tag.text))
|
551
|
-
end
|
552
|
-
end
|
553
|
-
end
|
554
|
-
|
555
|
-
# Modifies the current parsing scope (class or instance). If this
|
556
|
-
# directive is defined on a docstring attached to an object definition,
|
557
|
-
# it is applied only to that object. Otherwise, it applies the scope
|
558
|
-
# to all future objects in the namespace.
|
559
|
-
#
|
560
|
-
# @example Modifying the scope of a DSL method
|
561
|
-
# # @!scope class
|
562
|
-
# cattr_accessor :subclasses
|
563
|
-
# @example Modifying the scope of a set of methods
|
564
|
-
# # @!scope class
|
565
|
-
#
|
566
|
-
# # Documentation for method1
|
567
|
-
# def method1; end
|
568
|
-
#
|
569
|
-
# # Documentation for method2
|
570
|
-
# def method2; end
|
571
|
-
# @since 0.7.0
|
572
|
-
class ScopeDirective < Directive
|
573
|
-
def call
|
574
|
-
if %w(class instance module).include?(tag.text)
|
575
|
-
if object.is_a?(CodeObjects::MethodObject)
|
576
|
-
object.scope = tag.text.to_sym
|
577
|
-
else
|
578
|
-
parser.state.scope = tag.text.to_sym
|
579
|
-
end
|
580
|
-
end
|
581
|
-
end
|
582
|
-
end
|
583
|
-
|
584
|
-
# Modifies the current parsing visibility (public, protected, or private).
|
585
|
-
# If this directive is defined on a docstring attached to an object
|
586
|
-
# definition, it is applied only to that object. Otherwise, it applies
|
587
|
-
# the visibility to all future objects in the namespace.
|
588
|
-
#
|
589
|
-
# @example Modifying the visibility of a DSL method
|
590
|
-
# # @!visibility private
|
591
|
-
# cattr_accessor :subclasses
|
592
|
-
# @example Modifying the visibility of a set of methods
|
593
|
-
# # Note that Ruby's "protected" is recommended over this directive
|
594
|
-
# # @!visibility protected
|
595
|
-
#
|
596
|
-
# # Documentation for method1
|
597
|
-
# def method1; end
|
598
|
-
#
|
599
|
-
# # Documentation for method2
|
600
|
-
# def method2; end
|
601
|
-
# @since 0.7.0
|
602
|
-
class VisibilityDirective < Directive
|
603
|
-
def call
|
604
|
-
if %w(public protected private).include?(tag.text)
|
605
|
-
if object.is_a?(CodeObjects::Base)
|
606
|
-
object.visibility = tag.text.to_sym
|
607
|
-
elsif handler && !parser.state.inside_directive
|
608
|
-
handler.visibility = tag.text.to_sym
|
609
|
-
else
|
610
|
-
parser.state.visibility = tag.text.to_sym
|
611
|
-
end
|
612
|
-
end
|
613
|
-
end
|
614
|
-
end
|
615
|
-
end
|
616
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
module YARD
|
5
|
+
module Tags
|
6
|
+
# The base directive class. Subclass this class to create a custom
|
7
|
+
# directive, registering it with {Library.define_directive}. Directive
|
8
|
+
# classes are executed via the {#call} method, which perform all directive
|
9
|
+
# processing on the object.
|
10
|
+
#
|
11
|
+
# If processing occurs within a handler, the {#handler} attribute is
|
12
|
+
# available to access more information about parsing context and state.
|
13
|
+
# Handlers are only available when parsing from {Parser::SourceParser},
|
14
|
+
# not when parsing directly from {DocstringParser}. If the docstring is
|
15
|
+
# attached to an object declaration, {#object} will be set and available
|
16
|
+
# to modify the generated code object directly. Note that both of these
|
17
|
+
# attributes may be nil, and directives should test their existence
|
18
|
+
# before attempting to use them.
|
19
|
+
#
|
20
|
+
# @abstract Subclasses should implement {#call}.
|
21
|
+
# @see Library.define_directive
|
22
|
+
# @since 0.8.0
|
23
|
+
class Directive
|
24
|
+
# @return [Tag] the meta-data tag containing data input to the directive
|
25
|
+
attr_accessor :tag
|
26
|
+
|
27
|
+
# Set this field to replace the directive definition inside of a docstring
|
28
|
+
# with arbitrary text. For instance, the {MacroDirective} uses this field
|
29
|
+
# to expand its macro data in place of the call to a +@!macro+.
|
30
|
+
#
|
31
|
+
# @return [String] the text to expand in the original docstring in place
|
32
|
+
# of this directive definition.
|
33
|
+
# @return [nil] if no expansion should take place for this directive
|
34
|
+
attr_accessor :expanded_text
|
35
|
+
|
36
|
+
# @return [DocstringParser] the parser that is parsing all tag
|
37
|
+
# information out of the docstring
|
38
|
+
attr_accessor :parser
|
39
|
+
|
40
|
+
# @!attribute [r] object
|
41
|
+
# @return [CodeObjects::Base, nil] the object the parent docstring is
|
42
|
+
# attached to. May be nil.
|
43
|
+
def object; parser.object end
|
44
|
+
|
45
|
+
# @!attribute [r] handler
|
46
|
+
# @return [Handlers::Base, nil] the handler object the docstring parser
|
47
|
+
# might be attached to. May be nil. Only available when parsing
|
48
|
+
# through {Parser::SourceParser}.
|
49
|
+
def handler; parser.handler end
|
50
|
+
|
51
|
+
# @!endgroup
|
52
|
+
|
53
|
+
# @param [Tag] tag the meta-data tag containing all input to the docstring
|
54
|
+
# @param [DocstringParser] parser the docstring parser object
|
55
|
+
def initialize(tag, parser)
|
56
|
+
self.tag = tag
|
57
|
+
self.parser = parser
|
58
|
+
self.expanded_text = nil
|
59
|
+
end
|
60
|
+
|
61
|
+
# @!group Parser callbacks
|
62
|
+
|
63
|
+
# Called when processing the directive. Subclasses should implement
|
64
|
+
# this method to perform all functionality of the directive.
|
65
|
+
#
|
66
|
+
# @abstract implement this method to perform all data processing for
|
67
|
+
# the directive.
|
68
|
+
# @return [void]
|
69
|
+
def call; raise NotImplementedError end
|
70
|
+
|
71
|
+
# Called after parsing all directives and tags in the docstring. Used
|
72
|
+
# to perform any cleanup after all directives perform their main task.
|
73
|
+
# @return [void]
|
74
|
+
def after_parse; end
|
75
|
+
|
76
|
+
protected :parser
|
77
|
+
end
|
78
|
+
|
79
|
+
# Ends a group listing definition. Group definition automatically end
|
80
|
+
# when class or module blocks are closed, and defining a new group overrides
|
81
|
+
# the last group definition, but occasionally you need to end the current
|
82
|
+
# group to return to the default listing. Use {tag:!group} to begin a
|
83
|
+
# group listing.
|
84
|
+
#
|
85
|
+
# @example
|
86
|
+
# class Controller
|
87
|
+
# # @!group Callbacks
|
88
|
+
#
|
89
|
+
# def before_filter; end
|
90
|
+
# def after_filter; end
|
91
|
+
#
|
92
|
+
# # @!endgroup
|
93
|
+
#
|
94
|
+
# def index; end
|
95
|
+
# end
|
96
|
+
# @see tag:!group
|
97
|
+
# @since 0.6.0
|
98
|
+
class EndGroupDirective < Directive
|
99
|
+
def call
|
100
|
+
return unless handler
|
101
|
+
handler.extra_state.group = nil
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
# Defines a group listing. All methods (and attributes) seen after this
|
106
|
+
# directive are placed into a group with the given description as the
|
107
|
+
# group name. The group listing is used by templates to organize methods
|
108
|
+
# and attributes into respective logical groups. To end a group listing
|
109
|
+
# use {tag:!endgroup}.
|
110
|
+
#
|
111
|
+
# @note A group definition only applies to the scope it is defined in.
|
112
|
+
# If a new class or module is opened after the directive, this directive
|
113
|
+
# will not apply to methods in that class or module.
|
114
|
+
# @example
|
115
|
+
# # @!group Callbacks
|
116
|
+
#
|
117
|
+
# def before_filter; end
|
118
|
+
# def after_filter; end
|
119
|
+
# @see tag:!endgroup
|
120
|
+
# @since 0.6.0
|
121
|
+
class GroupDirective < Directive
|
122
|
+
def call
|
123
|
+
return unless handler
|
124
|
+
handler.extra_state.group = tag.text
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
# Defines a block of text to be expanded whenever the macro is called by name
|
129
|
+
# in subsequent docstrings. The macro data can be any arbitrary text data, be
|
130
|
+
# it regular documentation, meta-data tags or directives.
|
131
|
+
#
|
132
|
+
# == Defining a Macro
|
133
|
+
#
|
134
|
+
# A macro must first be defined in order to be used. Note that a macro is also
|
135
|
+
# expanded upon definition if it defined on an object (the docstring of a
|
136
|
+
# method, class, module or constant object as opposed to a free standing
|
137
|
+
# comment). To define a macro, use the "new" or "attach" identifier in the
|
138
|
+
# types specifier list. A macro will also automatically be created if an
|
139
|
+
# indented macro data block is given, so the keywords are not strictly needed.
|
140
|
+
#
|
141
|
+
# === Anonymous Macros
|
142
|
+
#
|
143
|
+
# In addition to standard named macros, macros can be defined anonymously if
|
144
|
+
# no name is given. In this case, they can not be re-used in future docstrings,
|
145
|
+
# but they will expand in the first definition. This is useful when needing
|
146
|
+
# to take advantage of the macro expansion variables (described below).
|
147
|
+
#
|
148
|
+
# == Using a Macro
|
149
|
+
#
|
150
|
+
# To re-use a macro in another docstring after it is defined, simply use
|
151
|
+
# <tt>@!macro the_name</tt> with no indented block of macro data. The resulting
|
152
|
+
# data will be expanded in place.
|
153
|
+
#
|
154
|
+
# == Attaching a Macro to a DSL Method
|
155
|
+
#
|
156
|
+
# Macros can be defined to auto-expand on DSL-style class method calls. To
|
157
|
+
# define a macro to be auto expanded in this way, use the "attach" keyword
|
158
|
+
# in the type specifier list ("new" is implied).
|
159
|
+
#
|
160
|
+
# Attached macros can also be attached directly on the class method declaration
|
161
|
+
# that provides the DSL method to its subclasses. The syntax in either case
|
162
|
+
# is the same.
|
163
|
+
#
|
164
|
+
# == Macro Expansion Variables
|
165
|
+
#
|
166
|
+
# In the case of using macros on DSL-style method calls, a number of expansion
|
167
|
+
# variables can be used for interpolation inside of the macro data. The variables,
|
168
|
+
# similar in syntax to Ruby's global variables, are as follows:
|
169
|
+
#
|
170
|
+
# * $0 - the method name being called
|
171
|
+
# * $1, $2, $3, ... - the Nth argument in the method call
|
172
|
+
# * $& - the full source line
|
173
|
+
#
|
174
|
+
# The following example shows what the expansion variables might hold for a given
|
175
|
+
# DSL method call:
|
176
|
+
#
|
177
|
+
# property :foo, :a, :b, :c, String
|
178
|
+
# # $0 => "property"
|
179
|
+
# # $1 => "foo"
|
180
|
+
# # $2 => "a"
|
181
|
+
# # $& => "property :foo, :a, :b, :c, String"
|
182
|
+
#
|
183
|
+
# === Ranges
|
184
|
+
#
|
185
|
+
# Ranges are also acceptable with the syntax <tt>${N-M}</tt>. Negative values
|
186
|
+
# on either N or M are valid, and refer to indexes from the end of the list.
|
187
|
+
# Consider a DSL method that creates a method using the first argument with
|
188
|
+
# argument names following, ending with the return type of the method. This
|
189
|
+
# could be documented as:
|
190
|
+
#
|
191
|
+
# # @!macro dsl_method
|
192
|
+
# # @!method $1(${2--2})
|
193
|
+
# # @return [${-1}] the return value of $0
|
194
|
+
# create_method_with_args :foo, :a, :b, :c, String
|
195
|
+
#
|
196
|
+
# As described, the method is using the signature <tt>foo(a, b, c)</tt> and the return
|
197
|
+
# type from the last argument, +String+. When using ranges, tokens are joined
|
198
|
+
# with commas. Note that this includes using $0:
|
199
|
+
#
|
200
|
+
# !!!plain
|
201
|
+
# $0-1 # => Interpolates to "create_method_with_args, foo"
|
202
|
+
#
|
203
|
+
# If you want to separate them with spaces, use <tt>$1 $2 $3 $4 ...</tt>. Note that
|
204
|
+
# if the token cannot be expanded, it will return the empty string (not an error),
|
205
|
+
# so it would be safe to list <tt>$1 $2 ... $10</tt>, for example.
|
206
|
+
#
|
207
|
+
# === Escaping Interpolation
|
208
|
+
#
|
209
|
+
# Interpolation can be escaped by prefixing the +$+ with +\\\+, like so:
|
210
|
+
#
|
211
|
+
# # @!macro foo
|
212
|
+
# # I have \$2.00 USD.
|
213
|
+
#
|
214
|
+
# @example Defining a simple macro
|
215
|
+
# # @!macro [new] returnself
|
216
|
+
# # @return [self] returns itself
|
217
|
+
# @example Using a simple macro in multiple docstrings
|
218
|
+
# # Documentation for map
|
219
|
+
# # ...
|
220
|
+
# # @macro returnself
|
221
|
+
# def map; end
|
222
|
+
#
|
223
|
+
# # Documentation for filter
|
224
|
+
# # ...
|
225
|
+
# # @macro returnself
|
226
|
+
# def filter; end
|
227
|
+
# @example Attaching a macro to a class method (for DSL usage)
|
228
|
+
# class Resource
|
229
|
+
# # Defines a new property
|
230
|
+
# # @param [String] name the property name
|
231
|
+
# # @param [Class] type the property's type
|
232
|
+
# # @!macro [attach] property
|
233
|
+
# # @return [$2] the $1 property
|
234
|
+
# def self.property(name, type) end
|
235
|
+
# end
|
236
|
+
#
|
237
|
+
# class Post < Resource
|
238
|
+
# property :title, String
|
239
|
+
# property :view_count, Integer
|
240
|
+
# end
|
241
|
+
# @example Attaching a macro directly to a DSL method
|
242
|
+
# class Post < Resource
|
243
|
+
# # @!macro [attach] property
|
244
|
+
# # @return [$2] the $1 property
|
245
|
+
# property :title, String
|
246
|
+
#
|
247
|
+
# # Macro will expand on this definition too
|
248
|
+
# property :view_count, Integer
|
249
|
+
# end
|
250
|
+
# @since 0.7.0
|
251
|
+
class MacroDirective < Directive
|
252
|
+
def call
|
253
|
+
raise TagFormatError if tag.name.nil? && tag.text.to_s.empty?
|
254
|
+
macro_data = find_or_create
|
255
|
+
unless macro_data
|
256
|
+
warn
|
257
|
+
return
|
258
|
+
end
|
259
|
+
|
260
|
+
self.expanded_text = expand(macro_data)
|
261
|
+
end
|
262
|
+
|
263
|
+
private
|
264
|
+
|
265
|
+
def new?
|
266
|
+
(tag.types && tag.types.include?('new')) ||
|
267
|
+
(tag.text && !tag.text.strip.empty?)
|
268
|
+
end
|
269
|
+
|
270
|
+
def attach?
|
271
|
+
new? && # must have data or there is nothing to attach
|
272
|
+
class_method? || # always attach to class methods
|
273
|
+
(tag.types && tag.types.include?('attach'))
|
274
|
+
end
|
275
|
+
|
276
|
+
def class_method?
|
277
|
+
object && object.is_a?(CodeObjects::MethodObject) &&
|
278
|
+
object.scope == :class
|
279
|
+
end
|
280
|
+
|
281
|
+
def anonymous?
|
282
|
+
tag.name.nil? || tag.name.empty?
|
283
|
+
end
|
284
|
+
|
285
|
+
def expand(macro_data)
|
286
|
+
return if attach? && class_method?
|
287
|
+
return if !anonymous? && new? &&
|
288
|
+
(!handler || handler.statement.source.empty?)
|
289
|
+
call_params = []
|
290
|
+
caller_method = nil
|
291
|
+
full_source = ''
|
292
|
+
if handler
|
293
|
+
call_params = handler.call_params
|
294
|
+
caller_method = handler.caller_method
|
295
|
+
full_source = handler.statement.source
|
296
|
+
end
|
297
|
+
all_params = ([caller_method] + call_params).compact
|
298
|
+
CodeObjects::MacroObject.expand(macro_data, all_params, full_source)
|
299
|
+
end
|
300
|
+
|
301
|
+
def find_or_create
|
302
|
+
if new? || attach?
|
303
|
+
if handler && attach?
|
304
|
+
if object && object.is_a?(CodeObjects::NamespaceObject)
|
305
|
+
log.warn "Attaching macros to non-methods is unsupported, ignoring: " \
|
306
|
+
"#{object.path} (#{handler.parser.file}:#{handler.statement.line})"
|
307
|
+
obj = nil
|
308
|
+
else
|
309
|
+
obj = object ? object :
|
310
|
+
P("#{handler.namespace}.#{handler.caller_method}")
|
311
|
+
end
|
312
|
+
else
|
313
|
+
obj = nil
|
314
|
+
end
|
315
|
+
|
316
|
+
return tag.text || "" if anonymous? # anonymous macro
|
317
|
+
macro = CodeObjects::MacroObject.create(tag.name, tag.text, obj)
|
318
|
+
else
|
319
|
+
macro = CodeObjects::MacroObject.find(tag.name)
|
320
|
+
end
|
321
|
+
|
322
|
+
macro ? macro.macro_data : nil
|
323
|
+
end
|
324
|
+
|
325
|
+
def warn
|
326
|
+
if object && handler
|
327
|
+
log.warn "Invalid/missing macro name for " \
|
328
|
+
"#{object.path} (#{handler.parser.file}:#{handler.statement.line})"
|
329
|
+
end
|
330
|
+
end
|
331
|
+
end
|
332
|
+
|
333
|
+
# Defines a method object with a given method signature, using indented
|
334
|
+
# block data as the method's docstring. The signature is similar to the
|
335
|
+
# {tag:overload} tag. The comment containing this directive does not need
|
336
|
+
# to be attached to any source, but if it is, that source code will be
|
337
|
+
# used as the method's source.
|
338
|
+
#
|
339
|
+
# To define an attribute method, see {tag:!attribute}
|
340
|
+
#
|
341
|
+
# @note This directive should only be used if there is no explicit
|
342
|
+
# declaration for the method in any source files (i.e., the method
|
343
|
+
# is declared dynamically via meta-programming). In all other cases, add
|
344
|
+
# documentation to the method definition itself.
|
345
|
+
# @note For backwards compatibility support, you do not need to indent
|
346
|
+
# the method's docstring text. If a +@!method+ directive is seen with
|
347
|
+
# no indented block, the entire docstring is used as the new method's
|
348
|
+
# docstring text.
|
349
|
+
# @example Defining a simple method
|
350
|
+
# # @!method quit(username, message = "Quit")
|
351
|
+
# # Sends a quit message to the server for a +username+.
|
352
|
+
# # @param [String] username the username to quit
|
353
|
+
# # @param [String] message the quit message
|
354
|
+
# quit_message_method
|
355
|
+
# @example Attaching multiple methods to the same source
|
356
|
+
# # @!method method1
|
357
|
+
# # @!method method2
|
358
|
+
# create_methods :method1, :method2
|
359
|
+
# @see tag:!attribute
|
360
|
+
# @since 0.7.0
|
361
|
+
class MethodDirective < Directive
|
362
|
+
SCOPE_MATCH = /\A\s*self\s*\.\s*/
|
363
|
+
|
364
|
+
def call; end
|
365
|
+
|
366
|
+
def after_parse
|
367
|
+
return unless handler
|
368
|
+
use_indented_text
|
369
|
+
create_object
|
370
|
+
end
|
371
|
+
|
372
|
+
protected
|
373
|
+
|
374
|
+
def method_name
|
375
|
+
sig = sanitized_tag_signature
|
376
|
+
if sig && sig =~ /^#{CodeObjects::METHODNAMEMATCH}(\s|\(|$)/
|
377
|
+
sig[/\A\s*([^\(; \t]+)/, 1]
|
378
|
+
else
|
379
|
+
handler.call_params.first
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
383
|
+
def method_signature
|
384
|
+
"def #{sanitized_tag_signature || method_name}"
|
385
|
+
end
|
386
|
+
|
387
|
+
def sanitized_tag_signature
|
388
|
+
if tag.name && tag.name =~ SCOPE_MATCH
|
389
|
+
parser.state.scope = :class
|
390
|
+
$'
|
391
|
+
else
|
392
|
+
tag.name
|
393
|
+
end
|
394
|
+
end
|
395
|
+
|
396
|
+
def use_indented_text
|
397
|
+
return if tag.text.empty?
|
398
|
+
handler = parser.handler
|
399
|
+
object = parser.object
|
400
|
+
self.parser = parser.class.new(parser.library)
|
401
|
+
parser.state.inside_directive = true
|
402
|
+
parser.parse(tag.text, object, handler)
|
403
|
+
parser.state.inside_directive = false
|
404
|
+
end
|
405
|
+
|
406
|
+
def create_object
|
407
|
+
name = method_name
|
408
|
+
scope = parser.state.scope || handler.scope
|
409
|
+
visibility = parser.state.visibility || handler.visibility
|
410
|
+
ns = CodeObjects::NamespaceObject === object ? object : handler.namespace
|
411
|
+
obj = CodeObjects::MethodObject.new(ns, name, scope)
|
412
|
+
handler.register_file_info(obj)
|
413
|
+
handler.register_source(obj)
|
414
|
+
handler.register_visibility(obj, visibility)
|
415
|
+
handler.register_group(obj)
|
416
|
+
obj.signature = method_signature
|
417
|
+
obj.parameters = OverloadTag.new(:overload, method_signature).parameters
|
418
|
+
obj.docstring = Docstring.new!(parser.text, parser.tags, obj,
|
419
|
+
parser.raw_text, parser.reference)
|
420
|
+
handler.register_module_function(obj)
|
421
|
+
old_obj = parser.object
|
422
|
+
parser.object = obj
|
423
|
+
parser.post_process
|
424
|
+
parser.object = old_obj
|
425
|
+
obj
|
426
|
+
end
|
427
|
+
end
|
428
|
+
|
429
|
+
# Defines an attribute with a given name, using indented block data as the
|
430
|
+
# attribute's docstring. If the type specifier is supplied with "r", "w", or
|
431
|
+
# "rw", the attribute is made readonly, writeonly or readwrite respectively.
|
432
|
+
# A readwrite attribute is the default, if no type is specified. The comment
|
433
|
+
# containing this directive does not need to be attached to any source, but
|
434
|
+
# if it is, that source code will be used as the method's source.
|
435
|
+
#
|
436
|
+
# To define a regular method, see {tag:!method}
|
437
|
+
#
|
438
|
+
# @note This directive should only be used if there is no explicit +attr_*+
|
439
|
+
# declaration for the attribute in any source files (i.e., the attribute
|
440
|
+
# is declared dynamically via meta-programming). In all other cases, add
|
441
|
+
# documentation to the attribute declaration itself.
|
442
|
+
# @note For backwards compatibility support, you do not need to indent
|
443
|
+
# the attribute's docstring text. If an +@!attribute+ directive is seen with
|
444
|
+
# no indented block, the entire docstring is used as the new attribute's
|
445
|
+
# docstring text.
|
446
|
+
# @example Defining a simple readonly attribute
|
447
|
+
# # @!attribute [r] count
|
448
|
+
# # @return [Fixnum] the size of the list
|
449
|
+
# @example Defining a simple readwrite attribute
|
450
|
+
# # @!attribute name
|
451
|
+
# # @return [String] the name of the user
|
452
|
+
# @see tag:!method
|
453
|
+
# @since 0.7.0
|
454
|
+
class AttributeDirective < MethodDirective
|
455
|
+
def after_parse
|
456
|
+
return unless handler
|
457
|
+
use_indented_text
|
458
|
+
create_attribute_data(create_object)
|
459
|
+
end
|
460
|
+
|
461
|
+
protected
|
462
|
+
|
463
|
+
def method_name
|
464
|
+
name = sanitized_tag_signature || handler.call_params.first
|
465
|
+
name += '=' unless readable?
|
466
|
+
name
|
467
|
+
end
|
468
|
+
|
469
|
+
def method_signature
|
470
|
+
if readable?
|
471
|
+
"def #{method_name}"
|
472
|
+
else
|
473
|
+
"def #{method_name}(value)"
|
474
|
+
end
|
475
|
+
end
|
476
|
+
|
477
|
+
private
|
478
|
+
|
479
|
+
def create_attribute_data(object)
|
480
|
+
return unless object
|
481
|
+
clean_name = object.name.to_s.sub(/=$/, '')
|
482
|
+
attrs = object.namespace.attributes[object.scope]
|
483
|
+
attrs[clean_name] ||= SymbolHash[:read => nil, :write => nil]
|
484
|
+
attrs[clean_name][:read] = object if readable?
|
485
|
+
if writable?
|
486
|
+
if object.name.to_s[-1, 1] == '='
|
487
|
+
writer = object
|
488
|
+
writer.parameters = [['value', nil]]
|
489
|
+
else
|
490
|
+
writer = CodeObjects::MethodObject.new(object.namespace,
|
491
|
+
object.name.to_s + '=', object.scope)
|
492
|
+
writer.signature = "def #{object.name}=(value)"
|
493
|
+
writer.visibility = object.visibility
|
494
|
+
writer.dynamic = object.dynamic
|
495
|
+
writer.source = object.source
|
496
|
+
writer.group = object.group
|
497
|
+
writer.parameters = [['value', nil]]
|
498
|
+
writer.docstring = object.base_docstring
|
499
|
+
handler.register_file_info(writer)
|
500
|
+
end
|
501
|
+
attrs[clean_name][:write] = writer
|
502
|
+
end
|
503
|
+
end
|
504
|
+
|
505
|
+
def writable?
|
506
|
+
!tag.types || tag.types.join.include?('w')
|
507
|
+
end
|
508
|
+
|
509
|
+
def readable?
|
510
|
+
!tag.types || tag.types.join =~ /(?!w)r/
|
511
|
+
end
|
512
|
+
end
|
513
|
+
|
514
|
+
# Parses a block of code as if it were present in the source file at that
|
515
|
+
# location. This directive is useful if a class has dynamic meta-programmed
|
516
|
+
# behaviour that cannot be recognized by YARD.
|
517
|
+
#
|
518
|
+
# You can specify the language of the code block using the types
|
519
|
+
# specification list. By default, the code language is "ruby".
|
520
|
+
#
|
521
|
+
# @example Documenting dynamic module inclusion
|
522
|
+
# class User
|
523
|
+
# # includes "UserMixin" and extends "UserMixin::ClassMethods"
|
524
|
+
# # using the UserMixin.included callback.
|
525
|
+
# # @!parse include UserMixin
|
526
|
+
# # @!parse extend UserMixin::ClassMethods
|
527
|
+
# end
|
528
|
+
# @example Declaring a method as an attribute
|
529
|
+
# # This should really be an attribute
|
530
|
+
# # @!parse attr_reader :foo
|
531
|
+
# def object; @parent.object end
|
532
|
+
# @example Parsing C code
|
533
|
+
# # @!parse [c]
|
534
|
+
# # void Init_Foo() {
|
535
|
+
# # rb_define_method(rb_cFoo, "method", method, 0);
|
536
|
+
# # }
|
537
|
+
# @since 0.8.0
|
538
|
+
class ParseDirective < Directive
|
539
|
+
def call
|
540
|
+
lang = tag.types ? tag.types.first.to_sym :
|
541
|
+
(handler ? handler.parser.parser_type : :ruby)
|
542
|
+
if handler && lang == handler.parser.parser_type
|
543
|
+
pclass = Parser::SourceParser.parser_types[handler.parser.parser_type]
|
544
|
+
pobj = pclass.new(tag.text, handler.parser.file)
|
545
|
+
pobj.parse
|
546
|
+
handler.parser.process(pobj.enumerator)
|
547
|
+
else # initialize a new parse chain
|
548
|
+
src_parser = Parser::SourceParser.new(lang, handler ? handler.globals : nil)
|
549
|
+
src_parser.file = handler.parser.file if handler
|
550
|
+
src_parser.parse(StringIO.new(tag.text))
|
551
|
+
end
|
552
|
+
end
|
553
|
+
end
|
554
|
+
|
555
|
+
# Modifies the current parsing scope (class or instance). If this
|
556
|
+
# directive is defined on a docstring attached to an object definition,
|
557
|
+
# it is applied only to that object. Otherwise, it applies the scope
|
558
|
+
# to all future objects in the namespace.
|
559
|
+
#
|
560
|
+
# @example Modifying the scope of a DSL method
|
561
|
+
# # @!scope class
|
562
|
+
# cattr_accessor :subclasses
|
563
|
+
# @example Modifying the scope of a set of methods
|
564
|
+
# # @!scope class
|
565
|
+
#
|
566
|
+
# # Documentation for method1
|
567
|
+
# def method1; end
|
568
|
+
#
|
569
|
+
# # Documentation for method2
|
570
|
+
# def method2; end
|
571
|
+
# @since 0.7.0
|
572
|
+
class ScopeDirective < Directive
|
573
|
+
def call
|
574
|
+
if %w(class instance module).include?(tag.text)
|
575
|
+
if object.is_a?(CodeObjects::MethodObject)
|
576
|
+
object.scope = tag.text.to_sym
|
577
|
+
else
|
578
|
+
parser.state.scope = tag.text.to_sym
|
579
|
+
end
|
580
|
+
end
|
581
|
+
end
|
582
|
+
end
|
583
|
+
|
584
|
+
# Modifies the current parsing visibility (public, protected, or private).
|
585
|
+
# If this directive is defined on a docstring attached to an object
|
586
|
+
# definition, it is applied only to that object. Otherwise, it applies
|
587
|
+
# the visibility to all future objects in the namespace.
|
588
|
+
#
|
589
|
+
# @example Modifying the visibility of a DSL method
|
590
|
+
# # @!visibility private
|
591
|
+
# cattr_accessor :subclasses
|
592
|
+
# @example Modifying the visibility of a set of methods
|
593
|
+
# # Note that Ruby's "protected" is recommended over this directive
|
594
|
+
# # @!visibility protected
|
595
|
+
#
|
596
|
+
# # Documentation for method1
|
597
|
+
# def method1; end
|
598
|
+
#
|
599
|
+
# # Documentation for method2
|
600
|
+
# def method2; end
|
601
|
+
# @since 0.7.0
|
602
|
+
class VisibilityDirective < Directive
|
603
|
+
def call
|
604
|
+
if %w(public protected private).include?(tag.text)
|
605
|
+
if object.is_a?(CodeObjects::Base)
|
606
|
+
object.visibility = tag.text.to_sym
|
607
|
+
elsif handler && !parser.state.inside_directive
|
608
|
+
handler.visibility = tag.text.to_sym
|
609
|
+
else
|
610
|
+
parser.state.visibility = tag.text.to_sym
|
611
|
+
end
|
612
|
+
end
|
613
|
+
end
|
614
|
+
end
|
615
|
+
end
|
616
|
+
end
|