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,345 +1,345 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require 'ostruct'
|
3
|
-
|
4
|
-
module YARD
|
5
|
-
# Parses text and creates a {Docstring} object to represent documentation
|
6
|
-
# for a {CodeObjects::Base}. To create a new docstring, you should initialize
|
7
|
-
# the parser and call {#parse} followed by {#to_docstring}.
|
8
|
-
#
|
9
|
-
# == Subclassing Notes
|
10
|
-
#
|
11
|
-
# The DocstringParser can be subclassed and subtituted during parsing by
|
12
|
-
# setting the {Docstring.default_parser} attribute with the name of the
|
13
|
-
# subclass. This allows developers to change the way docstrings are
|
14
|
-
# parsed, allowing for completely different docstring syntaxes.
|
15
|
-
#
|
16
|
-
# @example Creating a Docstring with a DocstringParser
|
17
|
-
# DocstringParser.new.parse("text here").to_docstring
|
18
|
-
# @example Creating a Custom DocstringParser
|
19
|
-
# # Parses docstrings backwards!
|
20
|
-
# class ReverseDocstringParser
|
21
|
-
# def parse_content(content)
|
22
|
-
# super(content.reverse)
|
23
|
-
# end
|
24
|
-
# end
|
25
|
-
#
|
26
|
-
# # Set the parser as default when parsing
|
27
|
-
# YARD::Docstring.default_parser = ReverseDocstringParser
|
28
|
-
# @see #parse_content
|
29
|
-
# @since 0.8.0
|
30
|
-
class DocstringParser
|
31
|
-
# @return [String] the parsed text portion of the docstring,
|
32
|
-
# with tags removed.
|
33
|
-
attr_accessor :text
|
34
|
-
|
35
|
-
# @return [String] the complete input string to the parser.
|
36
|
-
attr_accessor :raw_text
|
37
|
-
|
38
|
-
# @return [Array<Tags::Tag>] the list of meta-data tags identified
|
39
|
-
# by the parser
|
40
|
-
attr_accessor :tags
|
41
|
-
|
42
|
-
# @return [Array<Tags::Directive>] a list of directives identified
|
43
|
-
# by the parser. This list will not be passed on to the
|
44
|
-
# Docstring object.
|
45
|
-
attr_accessor :directives
|
46
|
-
|
47
|
-
# @return [OpenStruct] any arbitrary state to be passed between
|
48
|
-
# tags during parsing. Mainly used by directives to coordinate
|
49
|
-
# behaviour (so that directives can be aware of other directives
|
50
|
-
# used in a docstring).
|
51
|
-
attr_accessor :state
|
52
|
-
|
53
|
-
# @return [CodeObjects::Base, nil] the object associated with
|
54
|
-
# the docstring being parsed. May be nil if the docstring is
|
55
|
-
# not attached to any object.
|
56
|
-
attr_accessor :object
|
57
|
-
|
58
|
-
# @return [CodeObjects::Base, nil] the object referenced by
|
59
|
-
# the docstring being parsed. May be nil if the docstring doesn't
|
60
|
-
# refer to any object.
|
61
|
-
attr_accessor :reference
|
62
|
-
|
63
|
-
# @return [Handlers::Base, nil] the handler parsing this
|
64
|
-
# docstring. May be nil if this docstring parser is not
|
65
|
-
# initialized through
|
66
|
-
attr_accessor :handler
|
67
|
-
|
68
|
-
# @return [Tags::Library] the tag library being used to
|
69
|
-
# identify registered tags in the docstring.
|
70
|
-
attr_accessor :library
|
71
|
-
|
72
|
-
# The regular expression to match the tag syntax
|
73
|
-
META_MATCH = /^@(!)?((?:\w\.?)+)(?:\s+(.*))?$/i
|
74
|
-
|
75
|
-
# @!group Creation and Conversion Methods
|
76
|
-
|
77
|
-
# Creates a new parser to parse docstring data
|
78
|
-
#
|
79
|
-
# @param [Tags::Library] library a tag library for recognizing
|
80
|
-
# tags.
|
81
|
-
def initialize(library = Tags::Library.instance)
|
82
|
-
@text = ""
|
83
|
-
@raw_text = ""
|
84
|
-
@tags = []
|
85
|
-
@directives = []
|
86
|
-
@library = library
|
87
|
-
@object = nil
|
88
|
-
@reference = nil
|
89
|
-
@handler = nil
|
90
|
-
@state = OpenStruct.new
|
91
|
-
end
|
92
|
-
|
93
|
-
# @return [Docstring] translates parsed text into
|
94
|
-
# a Docstring object.
|
95
|
-
def to_docstring
|
96
|
-
Docstring.new!(text, tags, object, raw_text, reference)
|
97
|
-
end
|
98
|
-
|
99
|
-
# @!group Parsing Methods
|
100
|
-
|
101
|
-
# Parses all content and returns itself.
|
102
|
-
#
|
103
|
-
# @param [String] content the docstring text to parse
|
104
|
-
# @param [CodeObjects::Base] object the object that the docstring
|
105
|
-
# is attached to. Will be passed to directives to act on
|
106
|
-
# this object.
|
107
|
-
# @param [Handlers::Base, nil] handler the handler object that is
|
108
|
-
# parsing this object. May be nil if this parser is not being
|
109
|
-
# called from a {Parser::SourceParser} context.
|
110
|
-
# @return [self] the parser object. To get the docstring,
|
111
|
-
# call {#to_docstring}.
|
112
|
-
# @see #to_docstring
|
113
|
-
def parse(content, object = nil, handler = nil)
|
114
|
-
@object = object
|
115
|
-
@handler = handler
|
116
|
-
@reference, @raw_text = detect_reference(content)
|
117
|
-
text = parse_content(@raw_text)
|
118
|
-
@text = text.strip
|
119
|
-
call_directives_after_parse
|
120
|
-
post_process
|
121
|
-
self
|
122
|
-
end
|
123
|
-
|
124
|
-
# Parses a given block of text.
|
125
|
-
#
|
126
|
-
# @param [String] content the content to parse
|
127
|
-
# @note Subclasses can override this method to perform custom
|
128
|
-
# parsing of content data.
|
129
|
-
def parse_content(content)
|
130
|
-
content = content.split(/\r?\n/) if content.is_a?(String)
|
131
|
-
return '' if !content || content.empty?
|
132
|
-
docstring = String.new("")
|
133
|
-
|
134
|
-
indent = content.first[/^\s*/].length
|
135
|
-
last_indent = 0
|
136
|
-
orig_indent = 0
|
137
|
-
directive = false
|
138
|
-
last_line = ""
|
139
|
-
tag_name = nil
|
140
|
-
tag_buf = []
|
141
|
-
|
142
|
-
(content + ['']).each_with_index do |line, index|
|
143
|
-
indent = line[/^\s*/].length
|
144
|
-
empty = (line =~ /^\s*$/ ? true : false)
|
145
|
-
done = content.size == index
|
146
|
-
|
147
|
-
if tag_name && (((indent < orig_indent && !empty) || done ||
|
148
|
-
(indent == 0 && !empty)) || (indent <= last_indent && line =~ META_MATCH))
|
149
|
-
buf = tag_buf.join("\n")
|
150
|
-
if directive || tag_is_directive?(tag_name)
|
151
|
-
directive = create_directive(tag_name, buf)
|
152
|
-
if directive
|
153
|
-
docstring << parse_content(directive.expanded_text).chomp
|
154
|
-
end
|
155
|
-
else
|
156
|
-
create_tag(tag_name, buf)
|
157
|
-
end
|
158
|
-
tag_name = nil
|
159
|
-
tag_buf = []
|
160
|
-
directive = false
|
161
|
-
orig_indent = 0
|
162
|
-
end
|
163
|
-
|
164
|
-
# Found a meta tag
|
165
|
-
if line =~ META_MATCH
|
166
|
-
directive = $1
|
167
|
-
tag_name = $2
|
168
|
-
tag_buf = [($3 || '')]
|
169
|
-
elsif tag_name && indent >= orig_indent && !empty
|
170
|
-
orig_indent = indent if orig_indent == 0
|
171
|
-
# Extra data added to the tag on the next line
|
172
|
-
last_empty = last_line =~ /^[ \t]*$/ ? true : false
|
173
|
-
|
174
|
-
tag_buf << '' if last_empty
|
175
|
-
tag_buf << line.gsub(/^[ \t]{#{orig_indent}}/, '')
|
176
|
-
elsif !tag_name
|
177
|
-
# Regular docstring text
|
178
|
-
docstring << line
|
179
|
-
docstring << "\n"
|
180
|
-
end
|
181
|
-
|
182
|
-
last_indent = indent
|
183
|
-
last_line = line
|
184
|
-
end
|
185
|
-
|
186
|
-
docstring
|
187
|
-
end
|
188
|
-
|
189
|
-
# @!group Parser Callback Methods
|
190
|
-
|
191
|
-
# Call post processing callbacks on parser.
|
192
|
-
# This is called implicitly by parser. Use this when
|
193
|
-
# manually configuring a {Docstring} object.
|
194
|
-
#
|
195
|
-
# @return [void]
|
196
|
-
def post_process
|
197
|
-
call_after_parse_callbacks
|
198
|
-
end
|
199
|
-
|
200
|
-
# @!group Tag Manipulation Methods
|
201
|
-
|
202
|
-
# Creates a tag from the {Tags::DefaultFactory tag factory}.
|
203
|
-
#
|
204
|
-
# To add an already created tag object, append it to {#tags}.
|
205
|
-
#
|
206
|
-
# @param [String] tag_name the tag name
|
207
|
-
# @param [String] tag_buf the text attached to the tag with newlines removed.
|
208
|
-
# @return [Tags::Tag, Tags::RefTag] a tag
|
209
|
-
def create_tag(tag_name, tag_buf = '')
|
210
|
-
if tag_buf =~ /\A\s*(?:(\S+)\s+)?\(\s*see\s+(\S+)\s*\)\s*\Z/
|
211
|
-
return create_ref_tag(tag_name, $1, $2)
|
212
|
-
end
|
213
|
-
|
214
|
-
if library.has_tag?(tag_name)
|
215
|
-
@tags += [library.tag_create(tag_name, tag_buf)].flatten
|
216
|
-
else
|
217
|
-
log.warn "Unknown tag @#{tag_name}" +
|
218
|
-
(object ? " in file `#{object.file}` near line #{object.line}" : "")
|
219
|
-
end
|
220
|
-
rescue Tags::TagFormatError
|
221
|
-
log.warn "Invalid tag format for @#{tag_name}" +
|
222
|
-
(object ? " in file `#{object.file}` near line #{object.line}" : "")
|
223
|
-
end
|
224
|
-
|
225
|
-
# Creates a {Tags::RefTag}
|
226
|
-
def create_ref_tag(tag_name, name, object_name)
|
227
|
-
@tags << Tags::RefTagList.new(tag_name, P(object, object_name), name)
|
228
|
-
end
|
229
|
-
|
230
|
-
# Creates a new directive using the registered {#library}
|
231
|
-
# @return [Tags::Directive] the directive object that is created
|
232
|
-
def create_directive(tag_name, tag_buf)
|
233
|
-
if library.has_directive?(tag_name)
|
234
|
-
dir = library.directive_create(tag_name, tag_buf, self)
|
235
|
-
if dir.is_a?(Tags::Directive)
|
236
|
-
@directives << dir
|
237
|
-
dir
|
238
|
-
end
|
239
|
-
else
|
240
|
-
log.warn "Unknown directive @!#{tag_name}" +
|
241
|
-
(object ? " in file `#{object.file}` near line #{object.line}" : "")
|
242
|
-
nil
|
243
|
-
end
|
244
|
-
rescue Tags::TagFormatError
|
245
|
-
log.warn "Invalid directive format for @!#{tag_name}" +
|
246
|
-
(object ? " in file `#{object.file}` near line #{object.line}" : "")
|
247
|
-
nil
|
248
|
-
end
|
249
|
-
|
250
|
-
# Backward compatibility to detect old tags that should be specified
|
251
|
-
# as directives in 0.8 and onward.
|
252
|
-
def tag_is_directive?(tag_name)
|
253
|
-
list = %w(attribute endgroup group macro method scope visibility)
|
254
|
-
list.include?(tag_name)
|
255
|
-
end
|
256
|
-
|
257
|
-
# Creates a callback that is called after a docstring is successfully
|
258
|
-
# parsed. Use this method to perform sanity checks on a docstring's
|
259
|
-
# tag data, or add any extra tags automatically to a docstring.
|
260
|
-
#
|
261
|
-
# @yield [parser] a block to be called after a docstring is parsed
|
262
|
-
# @yieldparam [DocstringParser] parser the docstring parser object
|
263
|
-
# with all directives and tags created.
|
264
|
-
# @yieldreturn [void]
|
265
|
-
# @return [void]
|
266
|
-
def self.after_parse(&block)
|
267
|
-
after_parse_callbacks << block
|
268
|
-
end
|
269
|
-
|
270
|
-
# @return [Array<Proc>] the {after_parse} callback proc objects
|
271
|
-
def self.after_parse_callbacks
|
272
|
-
@after_parse_callbacks ||= []
|
273
|
-
end
|
274
|
-
|
275
|
-
# Define a callback to check that @param tags are properly named
|
276
|
-
after_parse do |parser|
|
277
|
-
next unless parser.object
|
278
|
-
next unless parser.object.is_a?(CodeObjects::MethodObject)
|
279
|
-
next if parser.object.is_alias?
|
280
|
-
names = parser.object.parameters.map {|l| l.first.gsub(/\W/, '') }
|
281
|
-
seen_names = []
|
282
|
-
infile_info = "\n in file `#{parser.object.file}' " \
|
283
|
-
"near line #{parser.object.line}"
|
284
|
-
parser.tags.each do |tag|
|
285
|
-
next if tag.is_a?(Tags::RefTagList) # we don't handle this yet
|
286
|
-
next unless tag.tag_name == "param"
|
287
|
-
if seen_names.include?(tag.name)
|
288
|
-
log.warn "@param tag has duplicate parameter name: " \
|
289
|
-
"#{tag.name} #{infile_info}"
|
290
|
-
elsif names.include?(tag.name)
|
291
|
-
seen_names << tag.name
|
292
|
-
else
|
293
|
-
log.warn "@param tag has unknown parameter name: " \
|
294
|
-
"#{tag.name} #{infile_info}"
|
295
|
-
end
|
296
|
-
end
|
297
|
-
end
|
298
|
-
|
299
|
-
private
|
300
|
-
|
301
|
-
def namespace
|
302
|
-
object && object.namespace
|
303
|
-
end
|
304
|
-
|
305
|
-
def detect_reference(content)
|
306
|
-
if content =~ /\A\s*\(see (\S+)\s*\)(?:\s|$)/
|
307
|
-
path = $1
|
308
|
-
extra = $'
|
309
|
-
[CodeObjects::Proxy.new(namespace, path), extra]
|
310
|
-
else
|
311
|
-
[nil, content]
|
312
|
-
end
|
313
|
-
end
|
314
|
-
|
315
|
-
# @!group Parser Callback Methods
|
316
|
-
|
317
|
-
# Calls the {Tags::Directive#after_parse} callback on all the
|
318
|
-
# created directives.
|
319
|
-
def call_directives_after_parse
|
320
|
-
directives.each(&:after_parse)
|
321
|
-
end
|
322
|
-
|
323
|
-
# Calls all {after_parse} callbacks
|
324
|
-
def call_after_parse_callbacks
|
325
|
-
self.class.after_parse_callbacks.each do |cb|
|
326
|
-
cb.call(self)
|
327
|
-
end
|
328
|
-
end
|
329
|
-
|
330
|
-
# Define a callback to check that @see tags do not use {}.
|
331
|
-
after_parse do |parser|
|
332
|
-
next unless parser.object
|
333
|
-
|
334
|
-
parser.tags.each_with_index do |tag, i|
|
335
|
-
next if tag.is_a?(Tags::RefTagList) # we don't handle this yet
|
336
|
-
next unless tag.tag_name == "see"
|
337
|
-
next unless "#{tag.name}#{tag.text}" =~ /\A\{.*\}\Z/
|
338
|
-
infile_info = "\n in file `#{parser.object.file}' " \
|
339
|
-
"near line #{parser.object.line}"
|
340
|
-
log.warn "@see tag (##{i + 1}) should not be wrapped in {} " \
|
341
|
-
"(causes rendering issues): #{infile_info}"
|
342
|
-
end
|
343
|
-
end
|
344
|
-
end
|
345
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
module YARD
|
5
|
+
# Parses text and creates a {Docstring} object to represent documentation
|
6
|
+
# for a {CodeObjects::Base}. To create a new docstring, you should initialize
|
7
|
+
# the parser and call {#parse} followed by {#to_docstring}.
|
8
|
+
#
|
9
|
+
# == Subclassing Notes
|
10
|
+
#
|
11
|
+
# The DocstringParser can be subclassed and subtituted during parsing by
|
12
|
+
# setting the {Docstring.default_parser} attribute with the name of the
|
13
|
+
# subclass. This allows developers to change the way docstrings are
|
14
|
+
# parsed, allowing for completely different docstring syntaxes.
|
15
|
+
#
|
16
|
+
# @example Creating a Docstring with a DocstringParser
|
17
|
+
# DocstringParser.new.parse("text here").to_docstring
|
18
|
+
# @example Creating a Custom DocstringParser
|
19
|
+
# # Parses docstrings backwards!
|
20
|
+
# class ReverseDocstringParser
|
21
|
+
# def parse_content(content)
|
22
|
+
# super(content.reverse)
|
23
|
+
# end
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# # Set the parser as default when parsing
|
27
|
+
# YARD::Docstring.default_parser = ReverseDocstringParser
|
28
|
+
# @see #parse_content
|
29
|
+
# @since 0.8.0
|
30
|
+
class DocstringParser
|
31
|
+
# @return [String] the parsed text portion of the docstring,
|
32
|
+
# with tags removed.
|
33
|
+
attr_accessor :text
|
34
|
+
|
35
|
+
# @return [String] the complete input string to the parser.
|
36
|
+
attr_accessor :raw_text
|
37
|
+
|
38
|
+
# @return [Array<Tags::Tag>] the list of meta-data tags identified
|
39
|
+
# by the parser
|
40
|
+
attr_accessor :tags
|
41
|
+
|
42
|
+
# @return [Array<Tags::Directive>] a list of directives identified
|
43
|
+
# by the parser. This list will not be passed on to the
|
44
|
+
# Docstring object.
|
45
|
+
attr_accessor :directives
|
46
|
+
|
47
|
+
# @return [OpenStruct] any arbitrary state to be passed between
|
48
|
+
# tags during parsing. Mainly used by directives to coordinate
|
49
|
+
# behaviour (so that directives can be aware of other directives
|
50
|
+
# used in a docstring).
|
51
|
+
attr_accessor :state
|
52
|
+
|
53
|
+
# @return [CodeObjects::Base, nil] the object associated with
|
54
|
+
# the docstring being parsed. May be nil if the docstring is
|
55
|
+
# not attached to any object.
|
56
|
+
attr_accessor :object
|
57
|
+
|
58
|
+
# @return [CodeObjects::Base, nil] the object referenced by
|
59
|
+
# the docstring being parsed. May be nil if the docstring doesn't
|
60
|
+
# refer to any object.
|
61
|
+
attr_accessor :reference
|
62
|
+
|
63
|
+
# @return [Handlers::Base, nil] the handler parsing this
|
64
|
+
# docstring. May be nil if this docstring parser is not
|
65
|
+
# initialized through
|
66
|
+
attr_accessor :handler
|
67
|
+
|
68
|
+
# @return [Tags::Library] the tag library being used to
|
69
|
+
# identify registered tags in the docstring.
|
70
|
+
attr_accessor :library
|
71
|
+
|
72
|
+
# The regular expression to match the tag syntax
|
73
|
+
META_MATCH = /^@(!)?((?:\w\.?)+)(?:\s+(.*))?$/i
|
74
|
+
|
75
|
+
# @!group Creation and Conversion Methods
|
76
|
+
|
77
|
+
# Creates a new parser to parse docstring data
|
78
|
+
#
|
79
|
+
# @param [Tags::Library] library a tag library for recognizing
|
80
|
+
# tags.
|
81
|
+
def initialize(library = Tags::Library.instance)
|
82
|
+
@text = ""
|
83
|
+
@raw_text = ""
|
84
|
+
@tags = []
|
85
|
+
@directives = []
|
86
|
+
@library = library
|
87
|
+
@object = nil
|
88
|
+
@reference = nil
|
89
|
+
@handler = nil
|
90
|
+
@state = OpenStruct.new
|
91
|
+
end
|
92
|
+
|
93
|
+
# @return [Docstring] translates parsed text into
|
94
|
+
# a Docstring object.
|
95
|
+
def to_docstring
|
96
|
+
Docstring.new!(text, tags, object, raw_text, reference)
|
97
|
+
end
|
98
|
+
|
99
|
+
# @!group Parsing Methods
|
100
|
+
|
101
|
+
# Parses all content and returns itself.
|
102
|
+
#
|
103
|
+
# @param [String] content the docstring text to parse
|
104
|
+
# @param [CodeObjects::Base] object the object that the docstring
|
105
|
+
# is attached to. Will be passed to directives to act on
|
106
|
+
# this object.
|
107
|
+
# @param [Handlers::Base, nil] handler the handler object that is
|
108
|
+
# parsing this object. May be nil if this parser is not being
|
109
|
+
# called from a {Parser::SourceParser} context.
|
110
|
+
# @return [self] the parser object. To get the docstring,
|
111
|
+
# call {#to_docstring}.
|
112
|
+
# @see #to_docstring
|
113
|
+
def parse(content, object = nil, handler = nil)
|
114
|
+
@object = object
|
115
|
+
@handler = handler
|
116
|
+
@reference, @raw_text = detect_reference(content)
|
117
|
+
text = parse_content(@raw_text)
|
118
|
+
@text = text.strip
|
119
|
+
call_directives_after_parse
|
120
|
+
post_process
|
121
|
+
self
|
122
|
+
end
|
123
|
+
|
124
|
+
# Parses a given block of text.
|
125
|
+
#
|
126
|
+
# @param [String] content the content to parse
|
127
|
+
# @note Subclasses can override this method to perform custom
|
128
|
+
# parsing of content data.
|
129
|
+
def parse_content(content)
|
130
|
+
content = content.split(/\r?\n/) if content.is_a?(String)
|
131
|
+
return '' if !content || content.empty?
|
132
|
+
docstring = String.new("")
|
133
|
+
|
134
|
+
indent = content.first[/^\s*/].length
|
135
|
+
last_indent = 0
|
136
|
+
orig_indent = 0
|
137
|
+
directive = false
|
138
|
+
last_line = ""
|
139
|
+
tag_name = nil
|
140
|
+
tag_buf = []
|
141
|
+
|
142
|
+
(content + ['']).each_with_index do |line, index|
|
143
|
+
indent = line[/^\s*/].length
|
144
|
+
empty = (line =~ /^\s*$/ ? true : false)
|
145
|
+
done = content.size == index
|
146
|
+
|
147
|
+
if tag_name && (((indent < orig_indent && !empty) || done ||
|
148
|
+
(indent == 0 && !empty)) || (indent <= last_indent && line =~ META_MATCH))
|
149
|
+
buf = tag_buf.join("\n")
|
150
|
+
if directive || tag_is_directive?(tag_name)
|
151
|
+
directive = create_directive(tag_name, buf)
|
152
|
+
if directive
|
153
|
+
docstring << parse_content(directive.expanded_text).chomp
|
154
|
+
end
|
155
|
+
else
|
156
|
+
create_tag(tag_name, buf)
|
157
|
+
end
|
158
|
+
tag_name = nil
|
159
|
+
tag_buf = []
|
160
|
+
directive = false
|
161
|
+
orig_indent = 0
|
162
|
+
end
|
163
|
+
|
164
|
+
# Found a meta tag
|
165
|
+
if line =~ META_MATCH
|
166
|
+
directive = $1
|
167
|
+
tag_name = $2
|
168
|
+
tag_buf = [($3 || '')]
|
169
|
+
elsif tag_name && indent >= orig_indent && !empty
|
170
|
+
orig_indent = indent if orig_indent == 0
|
171
|
+
# Extra data added to the tag on the next line
|
172
|
+
last_empty = last_line =~ /^[ \t]*$/ ? true : false
|
173
|
+
|
174
|
+
tag_buf << '' if last_empty
|
175
|
+
tag_buf << line.gsub(/^[ \t]{#{orig_indent}}/, '')
|
176
|
+
elsif !tag_name
|
177
|
+
# Regular docstring text
|
178
|
+
docstring << line
|
179
|
+
docstring << "\n"
|
180
|
+
end
|
181
|
+
|
182
|
+
last_indent = indent
|
183
|
+
last_line = line
|
184
|
+
end
|
185
|
+
|
186
|
+
docstring
|
187
|
+
end
|
188
|
+
|
189
|
+
# @!group Parser Callback Methods
|
190
|
+
|
191
|
+
# Call post processing callbacks on parser.
|
192
|
+
# This is called implicitly by parser. Use this when
|
193
|
+
# manually configuring a {Docstring} object.
|
194
|
+
#
|
195
|
+
# @return [void]
|
196
|
+
def post_process
|
197
|
+
call_after_parse_callbacks
|
198
|
+
end
|
199
|
+
|
200
|
+
# @!group Tag Manipulation Methods
|
201
|
+
|
202
|
+
# Creates a tag from the {Tags::DefaultFactory tag factory}.
|
203
|
+
#
|
204
|
+
# To add an already created tag object, append it to {#tags}.
|
205
|
+
#
|
206
|
+
# @param [String] tag_name the tag name
|
207
|
+
# @param [String] tag_buf the text attached to the tag with newlines removed.
|
208
|
+
# @return [Tags::Tag, Tags::RefTag] a tag
|
209
|
+
def create_tag(tag_name, tag_buf = '')
|
210
|
+
if tag_buf =~ /\A\s*(?:(\S+)\s+)?\(\s*see\s+(\S+)\s*\)\s*\Z/
|
211
|
+
return create_ref_tag(tag_name, $1, $2)
|
212
|
+
end
|
213
|
+
|
214
|
+
if library.has_tag?(tag_name)
|
215
|
+
@tags += [library.tag_create(tag_name, tag_buf)].flatten
|
216
|
+
else
|
217
|
+
log.warn "Unknown tag @#{tag_name}" +
|
218
|
+
(object ? " in file `#{object.file}` near line #{object.line}" : "")
|
219
|
+
end
|
220
|
+
rescue Tags::TagFormatError
|
221
|
+
log.warn "Invalid tag format for @#{tag_name}" +
|
222
|
+
(object ? " in file `#{object.file}` near line #{object.line}" : "")
|
223
|
+
end
|
224
|
+
|
225
|
+
# Creates a {Tags::RefTag}
|
226
|
+
def create_ref_tag(tag_name, name, object_name)
|
227
|
+
@tags << Tags::RefTagList.new(tag_name, P(object, object_name), name)
|
228
|
+
end
|
229
|
+
|
230
|
+
# Creates a new directive using the registered {#library}
|
231
|
+
# @return [Tags::Directive] the directive object that is created
|
232
|
+
def create_directive(tag_name, tag_buf)
|
233
|
+
if library.has_directive?(tag_name)
|
234
|
+
dir = library.directive_create(tag_name, tag_buf, self)
|
235
|
+
if dir.is_a?(Tags::Directive)
|
236
|
+
@directives << dir
|
237
|
+
dir
|
238
|
+
end
|
239
|
+
else
|
240
|
+
log.warn "Unknown directive @!#{tag_name}" +
|
241
|
+
(object ? " in file `#{object.file}` near line #{object.line}" : "")
|
242
|
+
nil
|
243
|
+
end
|
244
|
+
rescue Tags::TagFormatError
|
245
|
+
log.warn "Invalid directive format for @!#{tag_name}" +
|
246
|
+
(object ? " in file `#{object.file}` near line #{object.line}" : "")
|
247
|
+
nil
|
248
|
+
end
|
249
|
+
|
250
|
+
# Backward compatibility to detect old tags that should be specified
|
251
|
+
# as directives in 0.8 and onward.
|
252
|
+
def tag_is_directive?(tag_name)
|
253
|
+
list = %w(attribute endgroup group macro method scope visibility)
|
254
|
+
list.include?(tag_name)
|
255
|
+
end
|
256
|
+
|
257
|
+
# Creates a callback that is called after a docstring is successfully
|
258
|
+
# parsed. Use this method to perform sanity checks on a docstring's
|
259
|
+
# tag data, or add any extra tags automatically to a docstring.
|
260
|
+
#
|
261
|
+
# @yield [parser] a block to be called after a docstring is parsed
|
262
|
+
# @yieldparam [DocstringParser] parser the docstring parser object
|
263
|
+
# with all directives and tags created.
|
264
|
+
# @yieldreturn [void]
|
265
|
+
# @return [void]
|
266
|
+
def self.after_parse(&block)
|
267
|
+
after_parse_callbacks << block
|
268
|
+
end
|
269
|
+
|
270
|
+
# @return [Array<Proc>] the {after_parse} callback proc objects
|
271
|
+
def self.after_parse_callbacks
|
272
|
+
@after_parse_callbacks ||= []
|
273
|
+
end
|
274
|
+
|
275
|
+
# Define a callback to check that @param tags are properly named
|
276
|
+
after_parse do |parser|
|
277
|
+
next unless parser.object
|
278
|
+
next unless parser.object.is_a?(CodeObjects::MethodObject)
|
279
|
+
next if parser.object.is_alias?
|
280
|
+
names = parser.object.parameters.map {|l| l.first.gsub(/\W/, '') }
|
281
|
+
seen_names = []
|
282
|
+
infile_info = "\n in file `#{parser.object.file}' " \
|
283
|
+
"near line #{parser.object.line}"
|
284
|
+
parser.tags.each do |tag|
|
285
|
+
next if tag.is_a?(Tags::RefTagList) # we don't handle this yet
|
286
|
+
next unless tag.tag_name == "param"
|
287
|
+
if seen_names.include?(tag.name)
|
288
|
+
log.warn "@param tag has duplicate parameter name: " \
|
289
|
+
"#{tag.name} #{infile_info}"
|
290
|
+
elsif names.include?(tag.name)
|
291
|
+
seen_names << tag.name
|
292
|
+
else
|
293
|
+
log.warn "@param tag has unknown parameter name: " \
|
294
|
+
"#{tag.name} #{infile_info}"
|
295
|
+
end
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
private
|
300
|
+
|
301
|
+
def namespace
|
302
|
+
object && object.namespace
|
303
|
+
end
|
304
|
+
|
305
|
+
def detect_reference(content)
|
306
|
+
if content =~ /\A\s*\(see (\S+)\s*\)(?:\s|$)/
|
307
|
+
path = $1
|
308
|
+
extra = $'
|
309
|
+
[CodeObjects::Proxy.new(namespace, path), extra]
|
310
|
+
else
|
311
|
+
[nil, content]
|
312
|
+
end
|
313
|
+
end
|
314
|
+
|
315
|
+
# @!group Parser Callback Methods
|
316
|
+
|
317
|
+
# Calls the {Tags::Directive#after_parse} callback on all the
|
318
|
+
# created directives.
|
319
|
+
def call_directives_after_parse
|
320
|
+
directives.each(&:after_parse)
|
321
|
+
end
|
322
|
+
|
323
|
+
# Calls all {after_parse} callbacks
|
324
|
+
def call_after_parse_callbacks
|
325
|
+
self.class.after_parse_callbacks.each do |cb|
|
326
|
+
cb.call(self)
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
# Define a callback to check that @see tags do not use {}.
|
331
|
+
after_parse do |parser|
|
332
|
+
next unless parser.object
|
333
|
+
|
334
|
+
parser.tags.each_with_index do |tag, i|
|
335
|
+
next if tag.is_a?(Tags::RefTagList) # we don't handle this yet
|
336
|
+
next unless tag.tag_name == "see"
|
337
|
+
next unless "#{tag.name}#{tag.text}" =~ /\A\{.*\}\Z/
|
338
|
+
infile_info = "\n in file `#{parser.object.file}' " \
|
339
|
+
"near line #{parser.object.line}"
|
340
|
+
log.warn "@see tag (##{i + 1}) should not be wrapped in {} " \
|
341
|
+
"(causes rendering issues): #{infile_info}"
|
342
|
+
end
|
343
|
+
end
|
344
|
+
end
|
345
|
+
end
|