yard 0.9.18 → 0.9.19
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of yard might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.yardopts +26 -26
- data/CHANGELOG.md +742 -728
- data/LEGAL +66 -66
- data/LICENSE +22 -22
- data/README.md +328 -328
- data/Rakefile +42 -53
- data/benchmarks/builtins_vs_eval.rb +24 -24
- data/benchmarks/concat_vs_join.rb +13 -13
- data/benchmarks/erb_vs_erubis.rb +54 -54
- data/benchmarks/format_args.rb +47 -47
- data/benchmarks/generation.rb +38 -38
- data/benchmarks/marshal_vs_dbm.rb +64 -64
- data/benchmarks/parsing.rb +46 -46
- data/benchmarks/pathname_vs_string.rb +50 -50
- data/benchmarks/rdoc_vs_yardoc.rb +11 -11
- data/benchmarks/registry_store_types.rb +49 -49
- data/benchmarks/ri_vs_yri.rb +19 -19
- data/benchmarks/ripper_parser.rb +13 -13
- data/benchmarks/splat_vs_flatten.rb +13 -13
- data/benchmarks/template_erb.rb +23 -23
- data/benchmarks/template_format.rb +7 -7
- data/benchmarks/template_profile.rb +18 -18
- data/benchmarks/yri_cache.rb +20 -20
- data/bin/yard +13 -13
- data/bin/yardoc +13 -13
- data/bin/yri +13 -13
- data/docs/CodeObjects.md +115 -115
- data/docs/GettingStarted.md +679 -679
- data/docs/Handlers.md +152 -152
- data/docs/Overview.md +61 -61
- data/docs/Parser.md +191 -191
- data/docs/Tags.md +283 -283
- data/docs/TagsArch.md +123 -123
- data/docs/Templates.md +496 -496
- data/docs/WhatsNew.md +1245 -1245
- data/docs/templates/default/fulldoc/html/full_list_tag.erb +8 -8
- data/docs/templates/default/fulldoc/html/setup.rb +6 -6
- data/docs/templates/default/layout/html/setup.rb +9 -9
- data/docs/templates/default/layout/html/tag_list.erb +11 -11
- data/docs/templates/default/yard_tags/html/list.erb +18 -18
- data/docs/templates/default/yard_tags/html/setup.rb +26 -26
- data/docs/templates/plugin.rb +70 -70
- data/lib/rubygems_plugin.rb +9 -9
- data/lib/yard.rb +69 -69
- data/lib/yard/autoload.rb +308 -303
- data/lib/yard/cli/command.rb +85 -85
- data/lib/yard/cli/command_parser.rb +93 -93
- data/lib/yard/cli/config.rb +198 -198
- data/lib/yard/cli/diff.rb +270 -270
- data/lib/yard/cli/display.rb +69 -69
- data/lib/yard/cli/gems.rb +84 -84
- data/lib/yard/cli/graph.rb +125 -125
- data/lib/yard/cli/help.rb +20 -20
- data/lib/yard/cli/i18n.rb +70 -70
- data/lib/yard/cli/list.rb +23 -23
- data/lib/yard/cli/markup_types.rb +32 -32
- data/lib/yard/cli/server.rb +257 -257
- data/lib/yard/cli/stats.rb +231 -231
- data/lib/yard/cli/yardoc.rb +789 -788
- data/lib/yard/cli/yardopts_command.rb +110 -110
- data/lib/yard/cli/yri.rb +215 -215
- data/lib/yard/code_objects/base.rb +615 -615
- data/lib/yard/code_objects/class_object.rb +146 -146
- data/lib/yard/code_objects/class_variable_object.rb +11 -11
- data/lib/yard/code_objects/constant_object.rb +16 -16
- data/lib/yard/code_objects/extended_method_object.rb +24 -24
- data/lib/yard/code_objects/extra_file_object.rb +134 -131
- data/lib/yard/code_objects/macro_object.rb +172 -172
- data/lib/yard/code_objects/method_object.rb +196 -196
- data/lib/yard/code_objects/module_object.rb +21 -21
- data/lib/yard/code_objects/namespace_mapper.rb +114 -114
- data/lib/yard/code_objects/namespace_object.rb +200 -200
- data/lib/yard/code_objects/proxy.rb +240 -240
- data/lib/yard/code_objects/root_object.rb +19 -19
- data/lib/yard/config.rb +270 -270
- data/lib/yard/core_ext/array.rb +16 -16
- data/lib/yard/core_ext/file.rb +69 -69
- data/lib/yard/core_ext/hash.rb +16 -16
- data/lib/yard/core_ext/insertion.rb +63 -63
- data/lib/yard/core_ext/module.rb +11 -20
- data/lib/yard/core_ext/string.rb +68 -68
- data/lib/yard/core_ext/symbol_hash.rb +75 -75
- data/lib/yard/docstring.rb +386 -386
- data/lib/yard/docstring_parser.rb +345 -345
- data/lib/yard/gem_index.rb +29 -29
- data/lib/yard/globals.rb +22 -22
- data/lib/yard/handlers/base.rb +595 -595
- data/lib/yard/handlers/c/alias_handler.rb +16 -16
- data/lib/yard/handlers/c/attribute_handler.rb +13 -13
- data/lib/yard/handlers/c/base.rb +129 -129
- data/lib/yard/handlers/c/class_handler.rb +27 -27
- data/lib/yard/handlers/c/constant_handler.rb +13 -13
- data/lib/yard/handlers/c/handler_methods.rb +212 -211
- data/lib/yard/handlers/c/init_handler.rb +20 -20
- data/lib/yard/handlers/c/method_handler.rb +45 -45
- data/lib/yard/handlers/c/mixin_handler.rb +21 -21
- data/lib/yard/handlers/c/module_handler.rb +17 -17
- data/lib/yard/handlers/c/override_comment_handler.rb +31 -31
- data/lib/yard/handlers/c/path_handler.rb +11 -11
- data/lib/yard/handlers/c/struct_handler.rb +13 -13
- data/lib/yard/handlers/c/symbol_handler.rb +8 -8
- data/lib/yard/handlers/common/method_handler.rb +19 -0
- data/lib/yard/handlers/processor.rb +200 -200
- data/lib/yard/handlers/ruby/alias_handler.rb +44 -44
- data/lib/yard/handlers/ruby/attribute_handler.rb +87 -87
- data/lib/yard/handlers/ruby/base.rb +165 -165
- data/lib/yard/handlers/ruby/class_condition_handler.rb +92 -92
- data/lib/yard/handlers/ruby/class_handler.rb +119 -119
- data/lib/yard/handlers/ruby/class_variable_handler.rb +17 -17
- data/lib/yard/handlers/ruby/comment_handler.rb +10 -10
- data/lib/yard/handlers/ruby/constant_handler.rb +59 -59
- data/lib/yard/handlers/ruby/decorator_handler_methods.rb +123 -123
- data/lib/yard/handlers/ruby/dsl_handler.rb +15 -15
- data/lib/yard/handlers/ruby/dsl_handler_methods.rb +96 -96
- data/lib/yard/handlers/ruby/exception_handler.rb +27 -27
- data/lib/yard/handlers/ruby/extend_handler.rb +22 -22
- data/lib/yard/handlers/ruby/legacy/alias_handler.rb +37 -37
- data/lib/yard/handlers/ruby/legacy/attribute_handler.rb +65 -65
- data/lib/yard/handlers/ruby/legacy/base.rb +245 -245
- data/lib/yard/handlers/ruby/legacy/class_condition_handler.rb +83 -83
- data/lib/yard/handlers/ruby/legacy/class_handler.rb +113 -113
- data/lib/yard/handlers/ruby/legacy/class_variable_handler.rb +15 -15
- data/lib/yard/handlers/ruby/legacy/comment_handler.rb +10 -10
- data/lib/yard/handlers/ruby/legacy/constant_handler.rb +29 -29
- data/lib/yard/handlers/ruby/legacy/dsl_handler.rb +17 -17
- data/lib/yard/handlers/ruby/legacy/exception_handler.rb +13 -13
- data/lib/yard/handlers/ruby/legacy/extend_handler.rb +21 -21
- data/lib/yard/handlers/ruby/legacy/method_handler.rb +90 -90
- data/lib/yard/handlers/ruby/legacy/mixin_handler.rb +39 -39
- data/lib/yard/handlers/ruby/legacy/module_function_handler.rb +19 -19
- data/lib/yard/handlers/ruby/legacy/module_handler.rb +12 -12
- data/lib/yard/handlers/ruby/legacy/private_class_method_handler.rb +22 -22
- data/lib/yard/handlers/ruby/legacy/private_constant_handler.rb +22 -22
- data/lib/yard/handlers/ruby/legacy/visibility_handler.rb +17 -17
- data/lib/yard/handlers/ruby/legacy/yield_handler.rb +29 -29
- data/lib/yard/handlers/ruby/method_condition_handler.rb +9 -9
- data/lib/yard/handlers/ruby/method_handler.rb +114 -118
- data/lib/yard/handlers/ruby/mixin_handler.rb +37 -37
- data/lib/yard/handlers/ruby/module_function_handler.rb +27 -27
- data/lib/yard/handlers/ruby/module_handler.rb +12 -12
- data/lib/yard/handlers/ruby/private_class_method_handler.rb +14 -14
- data/lib/yard/handlers/ruby/private_constant_handler.rb +43 -43
- data/lib/yard/handlers/ruby/public_class_method_handler.rb +14 -14
- data/lib/yard/handlers/ruby/struct_handler_methods.rb +143 -143
- data/lib/yard/handlers/ruby/visibility_handler.rb +22 -22
- data/lib/yard/handlers/ruby/yield_handler.rb +31 -31
- data/lib/yard/i18n/locale.rb +67 -67
- data/lib/yard/i18n/message.rb +57 -57
- data/lib/yard/i18n/messages.rb +56 -56
- data/lib/yard/i18n/po_parser.rb +61 -61
- data/lib/yard/i18n/pot_generator.rb +290 -290
- data/lib/yard/i18n/text.rb +173 -173
- data/lib/yard/logging.rb +205 -205
- data/lib/yard/options.rb +217 -217
- data/lib/yard/parser/base.rb +57 -57
- data/lib/yard/parser/c/c_parser.rb +235 -235
- data/lib/yard/parser/c/comment_parser.rb +134 -134
- data/lib/yard/parser/c/statement.rb +64 -64
- data/lib/yard/parser/ruby/ast_node.rb +540 -540
- data/lib/yard/parser/ruby/legacy/ruby_lex.rb +1354 -1354
- data/lib/yard/parser/ruby/legacy/ruby_parser.rb +32 -32
- data/lib/yard/parser/ruby/legacy/statement.rb +66 -66
- data/lib/yard/parser/ruby/legacy/statement_list.rb +394 -394
- data/lib/yard/parser/ruby/legacy/token_list.rb +74 -74
- data/lib/yard/parser/ruby/ruby_parser.rb +687 -687
- data/lib/yard/parser/ruby/token_resolver.rb +156 -156
- data/lib/yard/parser/source_parser.rb +526 -526
- data/lib/yard/rake/yardoc_task.rb +81 -81
- data/lib/yard/registry.rb +439 -439
- data/lib/yard/registry_resolver.rb +189 -189
- data/lib/yard/registry_store.rb +337 -337
- data/lib/yard/rubygems/backports.rb +10 -10
- data/lib/yard/rubygems/backports/LICENSE.txt +57 -57
- data/lib/yard/rubygems/backports/MIT.txt +20 -20
- data/lib/yard/rubygems/backports/gem.rb +10 -10
- data/lib/yard/rubygems/backports/source_index.rb +365 -365
- data/lib/yard/rubygems/doc_manager.rb +90 -90
- data/lib/yard/rubygems/hook.rb +197 -197
- data/lib/yard/rubygems/specification.rb +50 -50
- data/lib/yard/serializers/base.rb +83 -83
- data/lib/yard/serializers/file_system_serializer.rb +123 -123
- data/lib/yard/serializers/process_serializer.rb +24 -24
- data/lib/yard/serializers/stdout_serializer.rb +34 -34
- data/lib/yard/serializers/yardoc_serializer.rb +152 -152
- data/lib/yard/server.rb +13 -13
- data/lib/yard/server/adapter.rb +100 -100
- data/lib/yard/server/commands/base.rb +209 -209
- data/lib/yard/server/commands/display_file_command.rb +29 -29
- data/lib/yard/server/commands/display_object_command.rb +65 -65
- data/lib/yard/server/commands/frames_command.rb +16 -16
- data/lib/yard/server/commands/library_command.rb +187 -187
- data/lib/yard/server/commands/library_index_command.rb +28 -28
- data/lib/yard/server/commands/list_command.rb +25 -25
- data/lib/yard/server/commands/root_request_command.rb +15 -15
- data/lib/yard/server/commands/search_command.rb +79 -79
- data/lib/yard/server/commands/static_file_command.rb +23 -23
- data/lib/yard/server/commands/static_file_helpers.rb +62 -62
- data/lib/yard/server/doc_server_helper.rb +91 -91
- data/lib/yard/server/doc_server_serializer.rb +39 -39
- data/lib/yard/server/library_version.rb +277 -277
- data/lib/yard/server/rack_adapter.rb +89 -89
- data/lib/yard/server/router.rb +187 -187
- data/lib/yard/server/static_caching.rb +46 -46
- data/lib/yard/server/templates/default/fulldoc/html/css/custom.css +127 -127
- data/lib/yard/server/templates/default/fulldoc/html/js/autocomplete.js +11 -11
- data/lib/yard/server/templates/default/layout/html/breadcrumb.erb +37 -37
- data/lib/yard/server/templates/default/layout/html/script_setup.erb +7 -7
- data/lib/yard/server/templates/default/layout/html/setup.rb +8 -8
- data/lib/yard/server/templates/default/method_details/html/permalink.erb +4 -4
- data/lib/yard/server/templates/default/method_details/html/setup.rb +5 -5
- data/lib/yard/server/templates/doc_server/library_list/html/headers.erb +8 -8
- data/lib/yard/server/templates/doc_server/library_list/html/library_list.erb +14 -14
- data/lib/yard/server/templates/doc_server/library_list/html/listing.erb +13 -13
- data/lib/yard/server/templates/doc_server/library_list/html/setup.rb +6 -6
- data/lib/yard/server/templates/doc_server/library_list/html/title.erb +2 -2
- data/lib/yard/server/templates/doc_server/processing/html/processing.erb +52 -52
- data/lib/yard/server/templates/doc_server/processing/html/setup.rb +4 -4
- data/lib/yard/server/templates/doc_server/search/html/search.erb +18 -18
- data/lib/yard/server/templates/doc_server/search/html/setup.rb +9 -9
- data/lib/yard/server/webrick_adapter.rb +45 -45
- data/lib/yard/tags/default_factory.rb +191 -191
- data/lib/yard/tags/default_tag.rb +13 -13
- data/lib/yard/tags/directives.rb +616 -616
- data/lib/yard/tags/library.rb +633 -633
- data/lib/yard/tags/option_tag.rb +13 -13
- data/lib/yard/tags/overload_tag.rb +71 -71
- data/lib/yard/tags/ref_tag.rb +8 -8
- data/lib/yard/tags/ref_tag_list.rb +28 -28
- data/lib/yard/tags/tag.rb +71 -71
- data/lib/yard/tags/tag_format_error.rb +7 -7
- data/lib/yard/tags/types_explainer.rb +162 -162
- data/lib/yard/templates/engine.rb +186 -186
- data/lib/yard/templates/erb_cache.rb +23 -23
- data/lib/yard/templates/helpers/base_helper.rb +215 -215
- data/lib/yard/templates/helpers/filter_helper.rb +27 -27
- data/lib/yard/templates/helpers/html_helper.rb +646 -646
- data/lib/yard/templates/helpers/html_syntax_highlight_helper.rb +78 -78
- data/lib/yard/templates/helpers/markup/rdoc_markdown.rb +23 -23
- data/lib/yard/templates/helpers/markup/rdoc_markup.rb +109 -109
- data/lib/yard/templates/helpers/markup_helper.rb +172 -172
- data/lib/yard/templates/helpers/method_helper.rb +75 -75
- data/lib/yard/templates/helpers/module_helper.rb +21 -21
- data/lib/yard/templates/helpers/text_helper.rb +112 -112
- data/lib/yard/templates/helpers/uml_helper.rb +47 -47
- data/lib/yard/templates/section.rb +105 -105
- data/lib/yard/templates/template.rb +418 -418
- data/lib/yard/templates/template_options.rb +92 -92
- data/lib/yard/verifier.rb +151 -151
- data/lib/yard/version.rb +6 -6
- data/spec/cli/command_parser_spec.rb +43 -43
- data/spec/cli/command_spec.rb +36 -36
- data/spec/cli/config_spec.rb +148 -148
- data/spec/cli/diff_spec.rb +254 -254
- data/spec/cli/display_spec.rb +30 -30
- data/spec/cli/gems_spec.rb +81 -81
- data/spec/cli/graph_spec.rb +18 -18
- data/spec/cli/help_spec.rb +22 -22
- data/spec/cli/i18n_spec.rb +107 -107
- data/spec/cli/list_spec.rb +8 -8
- data/spec/cli/markup_types_spec.rb +22 -22
- data/spec/cli/server_spec.rb +324 -324
- data/spec/cli/stats_spec.rb +96 -96
- data/spec/cli/yard_on_yard_spec.rb +38 -38
- data/spec/cli/yardoc_spec.rb +896 -862
- data/spec/cli/yri_spec.rb +101 -101
- data/spec/code_objects/base_spec.rb +470 -470
- data/spec/code_objects/class_object_spec.rb +226 -226
- data/spec/code_objects/code_object_list_spec.rb +36 -36
- data/spec/code_objects/constants_spec.rb +116 -116
- data/spec/code_objects/extra_file_object_spec.rb +160 -160
- data/spec/code_objects/macro_object_spec.rb +150 -150
- data/spec/code_objects/method_object_spec.rb +184 -184
- data/spec/code_objects/module_object_spec.rb +142 -142
- data/spec/code_objects/namespace_object_spec.rb +171 -171
- data/spec/code_objects/proxy_spec.rb +141 -141
- data/spec/code_objects/spec_helper.rb +3 -3
- data/spec/config_spec.rb +171 -171
- data/spec/core_ext/array_spec.rb +13 -13
- data/spec/core_ext/file_spec.rb +72 -72
- data/spec/core_ext/hash_spec.rb +14 -14
- data/spec/core_ext/insertion_spec.rb +37 -37
- data/spec/core_ext/module_spec.rb +9 -15
- data/spec/core_ext/string_spec.rb +42 -42
- data/spec/core_ext/symbol_hash_spec.rb +89 -89
- data/spec/docstring_parser_spec.rb +280 -280
- data/spec/docstring_spec.rb +373 -373
- data/spec/examples.txt +1883 -1875
- data/spec/handlers/alias_handler_spec.rb +82 -82
- data/spec/handlers/attribute_handler_spec.rb +96 -96
- data/spec/handlers/base_spec.rb +216 -216
- data/spec/handlers/c/alias_handler_spec.rb +34 -34
- data/spec/handlers/c/attribute_handler_spec.rb +41 -41
- data/spec/handlers/c/class_handler_spec.rb +78 -78
- data/spec/handlers/c/constant_handler_spec.rb +71 -71
- data/spec/handlers/c/init_handler_spec.rb +48 -48
- data/spec/handlers/c/method_handler_spec.rb +327 -325
- data/spec/handlers/c/mixin_handler_spec.rb +44 -44
- data/spec/handlers/c/module_handler_spec.rb +71 -71
- data/spec/handlers/c/override_comment_handler_spec.rb +47 -47
- data/spec/handlers/c/path_handler_spec.rb +36 -36
- data/spec/handlers/c/spec_helper.rb +23 -23
- data/spec/handlers/c/struct_handler_spec.rb +16 -16
- data/spec/handlers/class_condition_handler_spec.rb +87 -87
- data/spec/handlers/class_handler_spec.rb +247 -247
- data/spec/handlers/class_method_handler_shared_examples.rb +133 -133
- data/spec/handlers/class_variable_handler_spec.rb +12 -12
- data/spec/handlers/constant_handler_spec.rb +112 -112
- data/spec/handlers/decorator_handler_methods_spec.rb +393 -393
- data/spec/handlers/dsl_handler_spec.rb +219 -219
- data/spec/handlers/examples/alias_handler_001.rb.txt +45 -45
- data/spec/handlers/examples/attribute_handler_001.rb.txt +31 -31
- data/spec/handlers/examples/class_condition_handler_001.rb.txt +68 -68
- data/spec/handlers/examples/class_handler_001.rb.txt +120 -120
- data/spec/handlers/examples/class_variable_handler_001.rb.txt +9 -9
- data/spec/handlers/examples/constant_handler_001.rb.txt +35 -35
- data/spec/handlers/examples/dsl_handler_001.rb.txt +154 -154
- data/spec/handlers/examples/exception_handler_001.rb.txt +58 -58
- data/spec/handlers/examples/extend_handler_001.rb.txt +15 -15
- data/spec/handlers/examples/method_condition_handler_001.rb.txt +9 -9
- data/spec/handlers/examples/method_handler_001.rb.txt +128 -128
- data/spec/handlers/examples/mixin_handler_001.rb.txt +37 -37
- data/spec/handlers/examples/module_handler_001.rb.txt +29 -29
- data/spec/handlers/examples/private_constant_handler_001.rb.txt +8 -8
- data/spec/handlers/examples/process_handler_001.rb.txt +11 -11
- data/spec/handlers/examples/visibility_handler_001.rb.txt +35 -35
- data/spec/handlers/examples/yield_handler_001.rb.txt +54 -54
- data/spec/handlers/exception_handler_spec.rb +49 -49
- data/spec/handlers/extend_handler_spec.rb +24 -24
- data/spec/handlers/legacy_base_spec.rb +128 -128
- data/spec/handlers/method_condition_handler_spec.rb +15 -15
- data/spec/handlers/method_handler_spec.rb +190 -190
- data/spec/handlers/mixin_handler_spec.rb +56 -56
- data/spec/handlers/module_function_handler_spec.rb +106 -106
- data/spec/handlers/module_handler_spec.rb +35 -35
- data/spec/handlers/private_class_method_handler_spec.rb +11 -11
- data/spec/handlers/private_constant_handler_spec.rb +25 -25
- data/spec/handlers/processor_spec.rb +35 -35
- data/spec/handlers/public_class_method_handler_spec.rb +11 -11
- data/spec/handlers/ruby/base_spec.rb +95 -95
- data/spec/handlers/ruby/legacy/base_spec.rb +84 -84
- data/spec/handlers/spec_helper.rb +33 -33
- data/spec/handlers/visibility_handler_spec.rb +44 -44
- data/spec/handlers/yield_handler_spec.rb +52 -52
- data/spec/i18n/locale_spec.rb +81 -81
- data/spec/i18n/message_spec.rb +52 -52
- data/spec/i18n/messages_spec.rb +67 -67
- data/spec/i18n/pot_generator_spec.rb +295 -295
- data/spec/i18n/text_spec.rb +184 -184
- data/spec/logging_spec.rb +44 -44
- data/spec/options_spec.rb +171 -171
- data/spec/parser/base_spec.rb +24 -24
- data/spec/parser/c_parser_spec.rb +236 -236
- data/spec/parser/examples/array.c.txt +6267 -6267
- data/spec/parser/examples/example1.rb.txt +7 -7
- data/spec/parser/examples/extrafile.c.txt +8 -8
- data/spec/parser/examples/file.c.txt +28 -28
- data/spec/parser/examples/multifile.c.txt +22 -22
- data/spec/parser/examples/namespace.cpp.txt +68 -68
- data/spec/parser/examples/override.c.txt +424 -424
- data/spec/parser/examples/parse_in_order_001.rb.txt +2 -2
- data/spec/parser/examples/parse_in_order_002.rb.txt +1 -1
- data/spec/parser/examples/tag_handler_001.rb.txt +7 -7
- data/spec/parser/ruby/ast_node_spec.rb +33 -33
- data/spec/parser/ruby/legacy/statement_list_spec.rb +299 -299
- data/spec/parser/ruby/legacy/token_list_spec.rb +79 -79
- data/spec/parser/ruby/ruby_parser_spec.rb +508 -508
- data/spec/parser/ruby/token_resolver_spec.rb +165 -165
- data/spec/parser/source_parser_spec.rb +727 -727
- data/spec/parser/tag_parsing_spec.rb +17 -17
- data/spec/rake/yardoc_task_spec.rb +118 -118
- data/spec/registry_spec.rb +463 -463
- data/spec/registry_store_spec.rb +316 -316
- data/spec/rubygems/doc_manager_spec.rb +112 -112
- data/spec/serializers/data/serialized_yardoc/checksums +1 -1
- data/spec/serializers/file_system_serializer_spec.rb +145 -145
- data/spec/serializers/spec_helper.rb +2 -2
- data/spec/serializers/yardoc_serializer_spec.rb +78 -78
- data/spec/server/adapter_spec.rb +39 -39
- data/spec/server/commands/base_spec.rb +91 -91
- data/spec/server/commands/library_command_spec.rb +39 -39
- data/spec/server/doc_server_helper_spec.rb +72 -72
- data/spec/server/doc_server_serializer_spec.rb +60 -60
- data/spec/server/rack_adapter_spec.rb +21 -21
- data/spec/server/router_spec.rb +123 -123
- data/spec/server/spec_helper.rb +22 -22
- data/spec/server/static_caching_spec.rb +47 -47
- data/spec/server/webrick_servlet_spec.rb +20 -20
- data/spec/server_spec.rb +19 -19
- data/spec/spec_helper.rb +212 -212
- data/spec/tags/default_factory_spec.rb +168 -168
- data/spec/tags/default_tag_spec.rb +11 -11
- data/spec/tags/directives_spec.rb +463 -463
- data/spec/tags/library_spec.rb +48 -48
- data/spec/tags/overload_tag_spec.rb +53 -53
- data/spec/tags/ref_tag_list_spec.rb +53 -53
- data/spec/tags/types_explainer_spec.rb +203 -203
- data/spec/templates/class_spec.rb +45 -45
- data/spec/templates/constant_spec.rb +41 -41
- data/spec/templates/engine_spec.rb +131 -131
- data/spec/templates/examples/class001.html +308 -308
- data/spec/templates/examples/class001.txt +36 -36
- data/spec/templates/examples/class002.html +39 -39
- data/spec/templates/examples/constant001.txt +24 -24
- data/spec/templates/examples/constant002.txt +6 -6
- data/spec/templates/examples/constant003.txt +10 -10
- data/spec/templates/examples/method001.html +137 -137
- data/spec/templates/examples/method001.txt +35 -35
- data/spec/templates/examples/method002.html +91 -91
- data/spec/templates/examples/method002.txt +20 -20
- data/spec/templates/examples/method003.html +165 -165
- data/spec/templates/examples/method003.txt +45 -45
- data/spec/templates/examples/method004.html +48 -48
- data/spec/templates/examples/method004.txt +10 -10
- data/spec/templates/examples/method005.html +105 -105
- data/spec/templates/examples/method005.txt +33 -33
- data/spec/templates/examples/method006.html +107 -107
- data/spec/templates/examples/method006.txt +20 -20
- data/spec/templates/examples/module001.dot +33 -33
- data/spec/templates/examples/module001.html +833 -833
- data/spec/templates/examples/module001.txt +33 -33
- data/spec/templates/examples/module002.html +341 -341
- data/spec/templates/examples/module003.html +202 -202
- data/spec/templates/examples/module004.html +394 -394
- data/spec/templates/examples/module005.html +81 -81
- data/spec/templates/examples/tag001.txt +82 -82
- data/spec/templates/helpers/base_helper_spec.rb +171 -171
- data/spec/templates/helpers/html_helper_spec.rb +687 -668
- data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +65 -65
- data/spec/templates/helpers/markup/rdoc_markup_spec.rb +84 -84
- data/spec/templates/helpers/markup_helper_spec.rb +136 -136
- data/spec/templates/helpers/method_helper_spec.rb +107 -107
- data/spec/templates/helpers/module_helper_spec.rb +35 -35
- data/spec/templates/helpers/shared_signature_examples.rb +126 -126
- data/spec/templates/helpers/text_helper_spec.rb +65 -65
- data/spec/templates/method_spec.rb +118 -118
- data/spec/templates/module_spec.rb +203 -203
- data/spec/templates/onefile_spec.rb +66 -66
- data/spec/templates/section_spec.rb +144 -144
- data/spec/templates/spec_helper.rb +76 -76
- data/spec/templates/tag_spec.rb +52 -52
- data/spec/templates/template_spec.rb +410 -410
- data/spec/verifier_spec.rb +106 -106
- data/templates/default/class/dot/setup.rb +7 -7
- data/templates/default/class/dot/superklass.erb +2 -2
- data/templates/default/class/html/constructor_details.erb +8 -8
- data/templates/default/class/html/setup.rb +2 -2
- data/templates/default/class/html/subclasses.erb +4 -4
- data/templates/default/class/setup.rb +36 -36
- data/templates/default/class/text/setup.rb +12 -12
- data/templates/default/class/text/subclasses.erb +5 -5
- data/templates/default/constant/text/header.erb +11 -11
- data/templates/default/constant/text/setup.rb +4 -4
- data/templates/default/docstring/html/abstract.erb +4 -4
- data/templates/default/docstring/html/deprecated.erb +1 -1
- data/templates/default/docstring/html/index.erb +5 -5
- data/templates/default/docstring/html/note.erb +6 -6
- data/templates/default/docstring/html/private.erb +4 -4
- data/templates/default/docstring/html/text.erb +1 -1
- data/templates/default/docstring/html/todo.erb +6 -6
- data/templates/default/docstring/setup.rb +52 -52
- data/templates/default/docstring/text/abstract.erb +2 -2
- data/templates/default/docstring/text/deprecated.erb +2 -2
- data/templates/default/docstring/text/index.erb +2 -2
- data/templates/default/docstring/text/note.erb +3 -3
- data/templates/default/docstring/text/private.erb +2 -2
- data/templates/default/docstring/text/text.erb +1 -1
- data/templates/default/docstring/text/todo.erb +3 -3
- data/templates/default/fulldoc/html/css/full_list.css +58 -58
- data/templates/default/fulldoc/html/css/style.css +496 -496
- data/templates/default/fulldoc/html/frames.erb +17 -17
- data/templates/default/fulldoc/html/full_list.erb +37 -37
- data/templates/default/fulldoc/html/full_list_class.erb +2 -2
- data/templates/default/fulldoc/html/full_list_file.erb +7 -7
- data/templates/default/fulldoc/html/full_list_method.erb +10 -10
- data/templates/default/fulldoc/html/js/app.js +303 -292
- data/templates/default/fulldoc/html/js/full_list.js +216 -216
- data/templates/default/fulldoc/html/js/jquery.js +3 -3
- data/templates/default/fulldoc/html/setup.rb +241 -241
- data/templates/default/layout/dot/header.erb +5 -5
- data/templates/default/layout/dot/setup.rb +15 -15
- data/templates/default/layout/html/breadcrumb.erb +11 -11
- data/templates/default/layout/html/files.erb +11 -11
- data/templates/default/layout/html/footer.erb +5 -5
- data/templates/default/layout/html/headers.erb +15 -15
- data/templates/default/layout/html/index.erb +2 -2
- data/templates/default/layout/html/layout.erb +23 -23
- data/templates/default/layout/html/listing.erb +4 -4
- data/templates/default/layout/html/objects.erb +32 -32
- data/templates/default/layout/html/script_setup.erb +4 -4
- data/templates/default/layout/html/search.erb +12 -12
- data/templates/default/layout/html/setup.rb +89 -89
- data/templates/default/method/html/header.erb +16 -16
- data/templates/default/method/setup.rb +4 -4
- data/templates/default/method_details/html/header.erb +2 -2
- data/templates/default/method_details/html/method_signature.erb +24 -24
- data/templates/default/method_details/html/source.erb +9 -9
- data/templates/default/method_details/setup.rb +11 -11
- data/templates/default/method_details/text/header.erb +10 -10
- data/templates/default/method_details/text/method_signature.erb +12 -12
- data/templates/default/method_details/text/setup.rb +11 -11
- data/templates/default/module/dot/child.erb +1 -1
- data/templates/default/module/dot/dependencies.erb +2 -2
- data/templates/default/module/dot/header.erb +6 -6
- data/templates/default/module/dot/info.erb +13 -13
- data/templates/default/module/dot/setup.rb +15 -15
- data/templates/default/module/html/attribute_details.erb +10 -10
- data/templates/default/module/html/attribute_summary.erb +8 -8
- data/templates/default/module/html/box_info.erb +43 -43
- data/templates/default/module/html/children.erb +8 -8
- data/templates/default/module/html/constant_summary.erb +17 -17
- data/templates/default/module/html/defines.erb +2 -2
- data/templates/default/module/html/header.erb +5 -5
- data/templates/default/module/html/inherited_attributes.erb +14 -14
- data/templates/default/module/html/inherited_constants.erb +8 -8
- data/templates/default/module/html/inherited_methods.erb +18 -18
- data/templates/default/module/html/item_summary.erb +40 -40
- data/templates/default/module/html/method_details_list.erb +9 -9
- data/templates/default/module/html/method_summary.erb +13 -13
- data/templates/default/module/html/methodmissing.erb +12 -12
- data/templates/default/module/setup.rb +167 -167
- data/templates/default/module/text/children.erb +9 -9
- data/templates/default/module/text/class_meths_list.erb +7 -7
- data/templates/default/module/text/extends.erb +7 -7
- data/templates/default/module/text/header.erb +7 -7
- data/templates/default/module/text/includes.erb +7 -7
- data/templates/default/module/text/instance_meths_list.erb +7 -7
- data/templates/default/module/text/setup.rb +13 -13
- data/templates/default/onefile/html/files.erb +4 -4
- data/templates/default/onefile/html/headers.erb +6 -6
- data/templates/default/onefile/html/layout.erb +17 -17
- data/templates/default/onefile/html/readme.erb +2 -2
- data/templates/default/onefile/html/setup.rb +62 -62
- data/templates/default/root/dot/child.erb +2 -2
- data/templates/default/root/dot/setup.rb +6 -6
- data/templates/default/root/html/setup.rb +2 -2
- data/templates/default/tags/html/example.erb +10 -10
- data/templates/default/tags/html/index.erb +2 -2
- data/templates/default/tags/html/option.erb +24 -24
- data/templates/default/tags/html/overload.erb +13 -13
- data/templates/default/tags/html/see.erb +7 -7
- data/templates/default/tags/html/tag.erb +20 -20
- data/templates/default/tags/setup.rb +57 -57
- data/templates/default/tags/text/example.erb +12 -12
- data/templates/default/tags/text/index.erb +1 -1
- data/templates/default/tags/text/option.erb +20 -20
- data/templates/default/tags/text/overload.erb +19 -19
- data/templates/default/tags/text/see.erb +11 -11
- data/templates/default/tags/text/tag.erb +13 -13
- data/templates/guide/class/html/setup.rb +2 -2
- data/templates/guide/docstring/html/setup.rb +2 -2
- data/templates/guide/fulldoc/html/css/style.css +108 -108
- data/templates/guide/fulldoc/html/js/app.js +33 -33
- data/templates/guide/fulldoc/html/setup.rb +74 -74
- data/templates/guide/layout/html/layout.erb +81 -81
- data/templates/guide/layout/html/setup.rb +25 -25
- data/templates/guide/method/html/header.erb +17 -17
- data/templates/guide/method/html/setup.rb +22 -22
- data/templates/guide/module/html/header.erb +6 -6
- data/templates/guide/module/html/method_list.erb +4 -4
- data/templates/guide/module/html/setup.rb +27 -27
- data/templates/guide/onefile/html/files.erb +4 -4
- data/templates/guide/onefile/html/setup.rb +6 -6
- data/templates/guide/onefile/html/toc.erb +3 -3
- data/templates/guide/tags/html/setup.rb +9 -9
- data/yard.gemspec +43 -43
- metadata +4 -3
data/docs/TagsArch.md
CHANGED
@@ -1,123 +1,123 @@
|
|
1
|
-
# @title Tags Architecture
|
2
|
-
|
3
|
-
# Tags Architecture
|
4
|
-
|
5
|
-
## Programmatic API
|
6
|
-
|
7
|
-
### Accessing Tag Information
|
8
|
-
|
9
|
-
Tag metadata is added when a {YARD::Docstring} is added to a {file:docs/CodeObjects.md code object}
|
10
|
-
using the {YARD::CodeObjects::Base#docstring=} attribute. In addition to adding
|
11
|
-
conventional comments, tags are parsed and associated with the object. The easiest
|
12
|
-
way to access tags on an object is to use the {YARD::CodeObjects::Base#tag} and `#tags`
|
13
|
-
methods, for example:
|
14
|
-
|
15
|
-
# Using the Foo class object from above
|
16
|
-
obj.tags(:tagname).first.text #=> "some data"
|
17
|
-
|
18
|
-
Because multiple tags can be stored with the same name, they are stored as a list
|
19
|
-
of tags. The `#tag` method is an alias for the first item in the list of tags.
|
20
|
-
Also note that the `#tag`, `#tags` and `#has_tag?` methods are all convenience
|
21
|
-
methods that delegate to the {YARD::Docstring} object described above.
|
22
|
-
|
23
|
-
### Adding Custom Tags
|
24
|
-
|
25
|
-
The `@tagname` tag used in the above examples is clearly not part of the tags
|
26
|
-
that come with YARD. If such a tag would actually be part of documentation under
|
27
|
-
a default install, YARD would raise a warning that the tag does not exist. It is,
|
28
|
-
however, trivial to add this tag to be recognized by YARD.
|
29
|
-
|
30
|
-
All tags in YARD are added to the {YARD::Tags::Library tag library} which makes
|
31
|
-
use of a tag factory class to parse the data inside the tags. To simply add a
|
32
|
-
tag that stores simple text like our `@tagname` tag above, use:
|
33
|
-
|
34
|
-
YARD::Tags::Library.define_tag("A Sample Tag", :tagname)
|
35
|
-
|
36
|
-
This will now allow YARD to add the metadata from `@tagname` to the docstring.
|
37
|
-
|
38
|
-
## Tag Factory Architecture
|
39
|
-
|
40
|
-
Recognizing a tag is one part of the process. Parsing the tag contents is the
|
41
|
-
second step. YARD has a tag architecture that allows developers to add or completely
|
42
|
-
change the way tags contents can be parsed.
|
43
|
-
|
44
|
-
The separation of registration and tag creation can be seen in the following
|
45
|
-
class diagram:
|
46
|
-
|
47
|
-
![Tags Architecture Class Diagram](images/tags-class-diagram.png)
|
48
|
-
|
49
|
-
### DefaultFactory
|
50
|
-
|
51
|
-
By default, YARD has a few standard syntaxes that can be parsed for tags. These
|
52
|
-
are all implemented by the {YARD::Tags::DefaultFactory} class. These syntaxes
|
53
|
-
are:
|
54
|
-
|
55
|
-
* Standard text: no parsing is done, but text is stripped of newlines and
|
56
|
-
multiple spaces.
|
57
|
-
|
58
|
-
* Raw text: does no parsing at all, no stripping of newlines or spaces. This
|
59
|
-
is best used for code snippets.
|
60
|
-
|
61
|
-
* Raw text with title: does no parsing on the text but extracts the first line
|
62
|
-
of the metadata as the "title", useful for tags such as `@example`:
|
63
|
-
|
64
|
-
# @example Inspect an element
|
65
|
-
# myobj.inspect #=> #<Object:0x123525>
|
66
|
-
|
67
|
-
* Text with types: parses a list of types at the beginning of the text. Types
|
68
|
-
are optional. The standard syntax is in the form `[type1, type2, ...]`,
|
69
|
-
for example:
|
70
|
-
|
71
|
-
# @return [String, Symbol] a description here
|
72
|
-
# @return description here with no types
|
73
|
-
|
74
|
-
* Text with types and a name: parses a list of types at the beginning of text
|
75
|
-
followed by a name and extra descriptive text. For example:
|
76
|
-
|
77
|
-
# @param [String] str the string to reverse
|
78
|
-
def reverse(str) '...' end
|
79
|
-
|
80
|
-
As mentioned above, this syntax is implemented by the `DefaultFactory` which can
|
81
|
-
be swapped out for any factory. In some cases, a developer may want to change
|
82
|
-
the type declaration syntax to be in the form:
|
83
|
-
|
84
|
-
# @tagname name <Types, here> description
|
85
|
-
|
86
|
-
This can be done by simply implementing a new factory that parses the data in
|
87
|
-
this form.
|
88
|
-
|
89
|
-
### Implementing a Factory
|
90
|
-
|
91
|
-
Factories should implement the method `parse_tag` as well as any `parse_tag_SUFFIX`
|
92
|
-
method where SUFFIX refers to the suffix added when declaring the tag. For example,
|
93
|
-
a tag can also be declared as follows:
|
94
|
-
|
95
|
-
YARD::Tags::Library.define_tag "Parameter", :param, :with_types
|
96
|
-
|
97
|
-
In such a case, the factory will be called with method `parse_tag_with_types`. In
|
98
|
-
all cases, the method should return a new {YARD::Tags::Tag} object. Generally,
|
99
|
-
the `parse_tag` methods take 2 or 3 parameters. A simple tag can be implemented
|
100
|
-
as:
|
101
|
-
|
102
|
-
def parse_tag(tag_name, text)
|
103
|
-
Tag.new(tag_name, text)
|
104
|
-
end
|
105
|
-
|
106
|
-
The text parameter contains pre-parsed text with extra spaces and newlines removed.
|
107
|
-
If required, the method could also be declared with a third parameter containing
|
108
|
-
unmodified raw text:
|
109
|
-
|
110
|
-
def parse_tag_with_raw_text(tag_name, text, raw_text)
|
111
|
-
Tag.new(tag_name, raw_text)
|
112
|
-
end
|
113
|
-
|
114
|
-
Note that this method would be invoked for a tag declared with the `:with_raw_text`
|
115
|
-
suffix.
|
116
|
-
|
117
|
-
### Changing the Factory
|
118
|
-
|
119
|
-
To change the factory, set the {YARD::Tags::Library.default_factory} attribute:
|
120
|
-
|
121
|
-
YARD::Tags::Library.default_factory = MyFactory
|
122
|
-
|
123
|
-
This must be done before any parsing is done, or the factory will not be used.
|
1
|
+
# @title Tags Architecture
|
2
|
+
|
3
|
+
# Tags Architecture
|
4
|
+
|
5
|
+
## Programmatic API
|
6
|
+
|
7
|
+
### Accessing Tag Information
|
8
|
+
|
9
|
+
Tag metadata is added when a {YARD::Docstring} is added to a {file:docs/CodeObjects.md code object}
|
10
|
+
using the {YARD::CodeObjects::Base#docstring=} attribute. In addition to adding
|
11
|
+
conventional comments, tags are parsed and associated with the object. The easiest
|
12
|
+
way to access tags on an object is to use the {YARD::CodeObjects::Base#tag} and `#tags`
|
13
|
+
methods, for example:
|
14
|
+
|
15
|
+
# Using the Foo class object from above
|
16
|
+
obj.tags(:tagname).first.text #=> "some data"
|
17
|
+
|
18
|
+
Because multiple tags can be stored with the same name, they are stored as a list
|
19
|
+
of tags. The `#tag` method is an alias for the first item in the list of tags.
|
20
|
+
Also note that the `#tag`, `#tags` and `#has_tag?` methods are all convenience
|
21
|
+
methods that delegate to the {YARD::Docstring} object described above.
|
22
|
+
|
23
|
+
### Adding Custom Tags
|
24
|
+
|
25
|
+
The `@tagname` tag used in the above examples is clearly not part of the tags
|
26
|
+
that come with YARD. If such a tag would actually be part of documentation under
|
27
|
+
a default install, YARD would raise a warning that the tag does not exist. It is,
|
28
|
+
however, trivial to add this tag to be recognized by YARD.
|
29
|
+
|
30
|
+
All tags in YARD are added to the {YARD::Tags::Library tag library} which makes
|
31
|
+
use of a tag factory class to parse the data inside the tags. To simply add a
|
32
|
+
tag that stores simple text like our `@tagname` tag above, use:
|
33
|
+
|
34
|
+
YARD::Tags::Library.define_tag("A Sample Tag", :tagname)
|
35
|
+
|
36
|
+
This will now allow YARD to add the metadata from `@tagname` to the docstring.
|
37
|
+
|
38
|
+
## Tag Factory Architecture
|
39
|
+
|
40
|
+
Recognizing a tag is one part of the process. Parsing the tag contents is the
|
41
|
+
second step. YARD has a tag architecture that allows developers to add or completely
|
42
|
+
change the way tags contents can be parsed.
|
43
|
+
|
44
|
+
The separation of registration and tag creation can be seen in the following
|
45
|
+
class diagram:
|
46
|
+
|
47
|
+
![Tags Architecture Class Diagram](images/tags-class-diagram.png)
|
48
|
+
|
49
|
+
### DefaultFactory
|
50
|
+
|
51
|
+
By default, YARD has a few standard syntaxes that can be parsed for tags. These
|
52
|
+
are all implemented by the {YARD::Tags::DefaultFactory} class. These syntaxes
|
53
|
+
are:
|
54
|
+
|
55
|
+
* Standard text: no parsing is done, but text is stripped of newlines and
|
56
|
+
multiple spaces.
|
57
|
+
|
58
|
+
* Raw text: does no parsing at all, no stripping of newlines or spaces. This
|
59
|
+
is best used for code snippets.
|
60
|
+
|
61
|
+
* Raw text with title: does no parsing on the text but extracts the first line
|
62
|
+
of the metadata as the "title", useful for tags such as `@example`:
|
63
|
+
|
64
|
+
# @example Inspect an element
|
65
|
+
# myobj.inspect #=> #<Object:0x123525>
|
66
|
+
|
67
|
+
* Text with types: parses a list of types at the beginning of the text. Types
|
68
|
+
are optional. The standard syntax is in the form `[type1, type2, ...]`,
|
69
|
+
for example:
|
70
|
+
|
71
|
+
# @return [String, Symbol] a description here
|
72
|
+
# @return description here with no types
|
73
|
+
|
74
|
+
* Text with types and a name: parses a list of types at the beginning of text
|
75
|
+
followed by a name and extra descriptive text. For example:
|
76
|
+
|
77
|
+
# @param [String] str the string to reverse
|
78
|
+
def reverse(str) '...' end
|
79
|
+
|
80
|
+
As mentioned above, this syntax is implemented by the `DefaultFactory` which can
|
81
|
+
be swapped out for any factory. In some cases, a developer may want to change
|
82
|
+
the type declaration syntax to be in the form:
|
83
|
+
|
84
|
+
# @tagname name <Types, here> description
|
85
|
+
|
86
|
+
This can be done by simply implementing a new factory that parses the data in
|
87
|
+
this form.
|
88
|
+
|
89
|
+
### Implementing a Factory
|
90
|
+
|
91
|
+
Factories should implement the method `parse_tag` as well as any `parse_tag_SUFFIX`
|
92
|
+
method where SUFFIX refers to the suffix added when declaring the tag. For example,
|
93
|
+
a tag can also be declared as follows:
|
94
|
+
|
95
|
+
YARD::Tags::Library.define_tag "Parameter", :param, :with_types
|
96
|
+
|
97
|
+
In such a case, the factory will be called with method `parse_tag_with_types`. In
|
98
|
+
all cases, the method should return a new {YARD::Tags::Tag} object. Generally,
|
99
|
+
the `parse_tag` methods take 2 or 3 parameters. A simple tag can be implemented
|
100
|
+
as:
|
101
|
+
|
102
|
+
def parse_tag(tag_name, text)
|
103
|
+
Tag.new(tag_name, text)
|
104
|
+
end
|
105
|
+
|
106
|
+
The text parameter contains pre-parsed text with extra spaces and newlines removed.
|
107
|
+
If required, the method could also be declared with a third parameter containing
|
108
|
+
unmodified raw text:
|
109
|
+
|
110
|
+
def parse_tag_with_raw_text(tag_name, text, raw_text)
|
111
|
+
Tag.new(tag_name, raw_text)
|
112
|
+
end
|
113
|
+
|
114
|
+
Note that this method would be invoked for a tag declared with the `:with_raw_text`
|
115
|
+
suffix.
|
116
|
+
|
117
|
+
### Changing the Factory
|
118
|
+
|
119
|
+
To change the factory, set the {YARD::Tags::Library.default_factory} attribute:
|
120
|
+
|
121
|
+
YARD::Tags::Library.default_factory = MyFactory
|
122
|
+
|
123
|
+
This must be done before any parsing is done, or the factory will not be used.
|
data/docs/Templates.md
CHANGED
@@ -1,496 +1,496 @@
|
|
1
|
-
# @title Templates Architecture
|
2
|
-
|
3
|
-
# Templates Architecture
|
4
|
-
|
5
|
-
Templates are the main component in the output rendering process of YARD,
|
6
|
-
which is invoked when conventional HTML/text output needs to be rendered
|
7
|
-
for a set of code objects.
|
8
|
-
|
9
|
-
## Design Goals
|
10
|
-
|
11
|
-
The general design attempts to be as abstracted from actual content and templates
|
12
|
-
as possible. Unlike RDoc which uses one file to describe the entire template,
|
13
|
-
YARD splits up the rendering of code objects into small components, allowing
|
14
|
-
template modification for smaller subsets of a full template without having to
|
15
|
-
duplicate the entire template itself. This is necessary because of YARD's support
|
16
|
-
for plugins. YARD is designed for extensibility by external plugins, and because
|
17
|
-
of this, no one plugin can be responsible for the entire template because no
|
18
|
-
one plugin knows about the other plugins being used. For instance, if an RSpec
|
19
|
-
plugin was added to support and document specifications in class templates,
|
20
|
-
this information would need to be transparently added to the template to work
|
21
|
-
in conjunction with any other plugin that performed similar template modifications.
|
22
|
-
The design goals can be summarized as follows:
|
23
|
-
|
24
|
-
1. Output should be able to be rendered for any arbitrary format with little
|
25
|
-
modification to YARD's source code. The addition of extra templates should
|
26
|
-
be sufficient.
|
27
|
-
2. The output rendered for an object should independently rendered data
|
28
|
-
from arbitrary sources. These independent components are called "sections".
|
29
|
-
3. Sections should be able to be inserted into any object without affecting
|
30
|
-
any existing sections in the document. This allows for easy modification
|
31
|
-
of templates by plugins.
|
32
|
-
|
33
|
-
## Templates
|
34
|
-
|
35
|
-
Template modules are the objects used to orchestrate the design goals listed
|
36
|
-
above. Specifically, they organize the sections and render the template contents
|
37
|
-
depending on the format.
|
38
|
-
|
39
|
-
## Engine
|
40
|
-
|
41
|
-
The Engine class orchestrates the creation and rendering of Template modules and
|
42
|
-
handles serialization or specific rendering scenarios (like HTML). To create
|
43
|
-
a template, use the {YARD::Templates::Engine.template template} method. The two most
|
44
|
-
common methods used to initiate output are the {YARD::Templates::Engine.render render}
|
45
|
-
and {YARD::Templates::Engine.generate generate} methods which generate and
|
46
|
-
optionally serialize output to a file. The latter, `#generate`, is used
|
47
|
-
specially to generate HTML documentation and copy over assets that may be
|
48
|
-
needed. For instance, an object may be rendered with:
|
49
|
-
|
50
|
-
YARD::Templates::Engine.render(:object => myobject)
|
51
|
-
|
52
|
-
A set of objects may be rendered into HTML documentation by using:
|
53
|
-
|
54
|
-
# all_objects is an array of module and class objects
|
55
|
-
# options includes a :serializer key to copy output to the file system
|
56
|
-
YARD::Templates::Engine.generate(all_objects, options)
|
57
|
-
|
58
|
-
Note that these methods should not be called directly. The {YARD::CodeObjects::Base}
|
59
|
-
class has a {YARD::CodeObjects::Base#format #format} helper method to render an
|
60
|
-
object. For instance, the above render example is equivalent to the simple
|
61
|
-
call `myobject.format`. The `generate` method is a special kind of render
|
62
|
-
and is called from the {YARD::CLI::Yardoc} command line utility.
|
63
|
-
|
64
|
-
## Template Options
|
65
|
-
|
66
|
-
A template keeps state when it is rendering output. This state is kept in
|
67
|
-
an options hash which is initially passed to it during instantiation. Some
|
68
|
-
default options set the template style (`:template`), the output format (`:format`),
|
69
|
-
and the serializer to use (`:serializer`). This options hash is modifiable
|
70
|
-
from all methods seen above. For example, initializing a template to output as
|
71
|
-
HTML instead of text can be done as follows:
|
72
|
-
|
73
|
-
myobject.format(:format => :html)
|
74
|
-
|
75
|
-
## Serializer
|
76
|
-
|
77
|
-
This class abstracts the logic involved in deciding how to serialize data to
|
78
|
-
the expected endpoint. For instance, there is both a {YARD::Serializers::StdoutSerializer StdoutSerializer}
|
79
|
-
and {YARD::Serializers::FileSystemSerializer FileSystemSerializer} class for
|
80
|
-
outputting to console or to a file respectively. When endpoints with locations
|
81
|
-
are used (like files or URLs), the serializer implements the {YARD::Serializers::Base#serialized_path #serialized_path}
|
82
|
-
method. This allows the translation from a code object to its path at the endpoint,
|
83
|
-
which enables inter-document linking.
|
84
|
-
|
85
|
-
Rendered objects are automatically serialized using the object if present,
|
86
|
-
otherwise the rendered object is returned as a string to its parent. Nested
|
87
|
-
Templates automatically set the serializer to nil so that they return
|
88
|
-
as a String to their parent.
|
89
|
-
|
90
|
-
## Creating a Template
|
91
|
-
|
92
|
-
Templates are represented by a directory inside the {YARD::Templates::Engine.template_paths}
|
93
|
-
on disk. A standard template directory looks like the following tree:
|
94
|
-
|
95
|
-
(Assuming templates/ is a template path)
|
96
|
-
templates
|
97
|
-
`-- default
|
98
|
-
|-- class
|
99
|
-
| |-- dot
|
100
|
-
| | |-- setup.rb
|
101
|
-
| | `-- superklass.erb
|
102
|
-
| |-- html
|
103
|
-
| | |-- constructor_details.erb
|
104
|
-
| | |-- setup.rb
|
105
|
-
| | `-- subclasses.erb
|
106
|
-
| |-- setup.rb
|
107
|
-
| `-- text
|
108
|
-
| |-- setup.rb
|
109
|
-
| `-- subclasses.erb
|
110
|
-
|-- docstring
|
111
|
-
| |-- html
|
112
|
-
| | |-- abstract.erb
|
113
|
-
| | |-- deprecated.erb
|
114
|
-
| | |-- index.erb
|
115
|
-
| | `-- text.erb
|
116
|
-
| |-- setup.rb
|
117
|
-
| `-- text
|
118
|
-
| |-- abstract.erb
|
119
|
-
| |-- deprecated.erb
|
120
|
-
| |-- index.erb
|
121
|
-
| `-- text.erb
|
122
|
-
|
123
|
-
The path `default` refers to the template style (:template key in options hash)
|
124
|
-
and the directories at the next level (such as `class`) refer to template
|
125
|
-
`:type` (options hash key) for a template. The next directory refers to the
|
126
|
-
output format being used defined by the `:format` template option.
|
127
|
-
|
128
|
-
As we saw in the above example, the format option can be set to `:html`, which
|
129
|
-
would use the `html/` directory instead of `text/`. Finally, the individual .erb
|
130
|
-
files are the sections that make up the template.
|
131
|
-
|
132
|
-
Note that the subdirectory `html/` is also its own "template" that inherits
|
133
|
-
from the parent directory. We will see more on this later.
|
134
|
-
|
135
|
-
## setup.rb
|
136
|
-
|
137
|
-
Every template should have at least one `setup.rb` file that defines the
|
138
|
-
{YARD::Templates::Template#init #init} method to set the
|
139
|
-
{YARD::Templates::Template#sections #sections} used by the template. If
|
140
|
-
a setup.rb is not defined in the template itself, there should be a template
|
141
|
-
that is inherited (via parent directory or explicitly) that sets the sections
|
142
|
-
on a newly created template.
|
143
|
-
|
144
|
-
A standard setup.rb file looks like:
|
145
|
-
|
146
|
-
def init
|
147
|
-
sections :section1, :section2, :section3
|
148
|
-
end
|
149
|
-
|
150
|
-
## Sections
|
151
|
-
|
152
|
-
Sections are smaller components that correlate to template
|
153
|
-
fragments. Practically speaking, a section can either be a template fragment
|
154
|
-
(a conventional .erb file or other supported templating language), a method
|
155
|
-
(which returns a String) or another {YARD::Templates::Template} (which in turn has its own
|
156
|
-
list of sections).
|
157
|
-
|
158
|
-
## Nested Sections
|
159
|
-
|
160
|
-
Sections often require the ability to encapsulate a set of sub-sections in markup
|
161
|
-
(HTML, for instance). Rather than use heavier Template subclass objects, a more
|
162
|
-
lightweight solution is to nest a set of sub-sections as a list that follows
|
163
|
-
a section, for example:
|
164
|
-
|
165
|
-
def init
|
166
|
-
sections :header, [:section_a, :section_b]
|
167
|
-
end
|
168
|
-
|
169
|
-
The above example nests `section_a` and `section_b` within the `header` section.
|
170
|
-
Practically speaking, these sections can be placed in the result by `yield`ing
|
171
|
-
to them. A sample header.erb template might contain:
|
172
|
-
|
173
|
-
<h2>Header</h2>
|
174
|
-
<div id="contents">
|
175
|
-
<%= yieldall %>
|
176
|
-
</div>
|
177
|
-
|
178
|
-
This template code would place the output of `section_a` and `section_b` within
|
179
|
-
the above div element. Using `yieldall`, we can also change the object that is being
|
180
|
-
rendered. For example, we may want to yield the first method of the class.
|
181
|
-
We can do this like so:
|
182
|
-
|
183
|
-
<h2>First method</h2>
|
184
|
-
<%= yieldall :object => object.meths.first %>
|
185
|
-
|
186
|
-
This would run the nested sections for the method object instead of the class.
|
187
|
-
|
188
|
-
Note that `yieldall` yields to all subsections, whereas `yield` will yield
|
189
|
-
to each individually (in order) until there are no more left to yield to.
|
190
|
-
In the vast majority of cases, you'd want to use `yieldall`, since `yield`
|
191
|
-
makes it hard for users to override your template.
|
192
|
-
|
193
|
-
## Inheriting Templates
|
194
|
-
|
195
|
-
Parent directory templates are automatically inherited (or mixed in, to be
|
196
|
-
more accurate) by the current template. This means that the 'default/class/html'
|
197
|
-
template automatically inherits from 'default/class'. This also means that anything
|
198
|
-
defined in 'default/class/setup.rb' can be overridden by 'default/class/html/setup.rb'.
|
199
|
-
|
200
|
-
Since the Template module is a module, and not a class, they can be mixed in
|
201
|
-
explicitly (via include/extend) from other templates, which allows templates
|
202
|
-
to share erb files or helper logic. The 'default/class' template explicitly
|
203
|
-
mixes in the 'default/module' template, since it uses much of the same sections.
|
204
|
-
This is done with the helper {YARD::Templates::Template::ClassMethods#T T} method, which
|
205
|
-
is simply a shorthand for {YARD::Templates::Engine.template Engine.template}.
|
206
|
-
It can then override (using standard inheritance) the sections from the module
|
207
|
-
template and insert sections pertaining to classes. This is one of the design
|
208
|
-
goals described above.
|
209
|
-
|
210
|
-
For instance, the first line in `default/class/html/setup.rb` is:
|
211
|
-
|
212
|
-
include T('default/module/html')
|
213
|
-
|
214
|
-
This includes the 'default/module/html', which means it also includes 'default/module'
|
215
|
-
by extension. This allows class to make use of any of module's erb files.
|
216
|
-
|
217
|
-
## Inserting and Traversing Sections
|
218
|
-
|
219
|
-
The ability to insert sections was mentioned above. The class template, for
|
220
|
-
instance, will modify the #init method to insert class specific sections:
|
221
|
-
|
222
|
-
def init
|
223
|
-
super
|
224
|
-
sections.place(:subclasses).before(:children)
|
225
|
-
sections.delete(:children)
|
226
|
-
sections.place([:constructor_details, [T('method_details')]]).before(:methodmissing)
|
227
|
-
end
|
228
|
-
|
229
|
-
Observe how sections has been modified after the super method was called (the
|
230
|
-
super method would have been defined in `default/module/setup.rb`). The
|
231
|
-
`sections` object is of the {YARD::Templates::Section} class and allows sections to be inserted
|
232
|
-
before or after another section using {Array#place} by it's given name rather
|
233
|
-
than index. This allows the overriding of templates in a way that does not
|
234
|
-
depend on where the section is located (since it may have been overridden by
|
235
|
-
another module).
|
236
|
-
|
237
|
-
You can also use `sections[:name]` to find the first child section named `:name`.
|
238
|
-
For instance, with the following sections declaration:
|
239
|
-
|
240
|
-
sections :a, [:b, :c, [:d]]
|
241
|
-
|
242
|
-
You can get to the :d section with:
|
243
|
-
|
244
|
-
sections[:a][:c][:d]
|
245
|
-
|
246
|
-
You can use this to insert a section inside a nested set without using indexed
|
247
|
-
access. The following command would result in `[:a, [:b, :c, [:d, :e]]]`:
|
248
|
-
|
249
|
-
sections[:a][:c].place(:e).after(:d)
|
250
|
-
|
251
|
-
There are also two methods, {Insertion#before_any} and {Insertion#after_any},
|
252
|
-
which allow you to insert sections before or after the first matching section name
|
253
|
-
recursively. The above example could simply be rewritten as:
|
254
|
-
|
255
|
-
sections.place(:e).after_any(:d)
|
256
|
-
|
257
|
-
## Overriding Templates by Registering a Template Path
|
258
|
-
|
259
|
-
Inheriting templates explicitly is useful when creating a customized template
|
260
|
-
that wants to take advantage of code re-use. However, most users who want
|
261
|
-
to customize YARD templates will want to override existing behaviour without
|
262
|
-
creating a template from scratch.
|
263
|
-
|
264
|
-
YARD solves this problem by allowing other template paths to be registered.
|
265
|
-
Because template modules are represented by a relative path such as 'default/class',
|
266
|
-
they can be found within any of the registered template paths. A new template
|
267
|
-
path is registered as:
|
268
|
-
|
269
|
-
YARD::Templates::Engine.register_template_path '/path/to/mytemplates'
|
270
|
-
|
271
|
-
At this point, any time the 'default/class' template is loaded, the template
|
272
|
-
will first be looked for inside the newly registered template path. If found,
|
273
|
-
it will be used as the template module, with the modules from the other
|
274
|
-
template paths implicitly mixed in.
|
275
|
-
|
276
|
-
Therefore, by using the same directory structure as a builtin YARD template,
|
277
|
-
a user can customize or override individual templates as if the old ones were
|
278
|
-
inherited. A real world example would further modify the 'default/class' template
|
279
|
-
seen above by creating such a path in our '/path/to/mytemplates' custom template
|
280
|
-
path:
|
281
|
-
|
282
|
-
/path/to/mytemplates/:
|
283
|
-
|-- class
|
284
|
-
| |-- html
|
285
|
-
| | |-- customsection.erb
|
286
|
-
| |-- setup.rb
|
287
|
-
|
288
|
-
The `setup.rb` file would look like:
|
289
|
-
|
290
|
-
def init
|
291
|
-
super
|
292
|
-
sections.push :customsection
|
293
|
-
end
|
294
|
-
|
295
|
-
Now, when a class object is formatted as HTML, our customsection.erb will be
|
296
|
-
appended to the rendered data.
|
297
|
-
|
298
|
-
|
299
|
-
### Overriding Stylesheets and Javascripts
|
300
|
-
|
301
|
-
Template authors can override existing stylesheets and javascripts by creating
|
302
|
-
a file with the same name as existing files within the `fulldoc` template. The
|
303
|
-
documentation output will utilize the new replacement file.
|
304
|
-
|
305
|
-
YARD's `fulldoc` template defines three stylesheets:
|
306
|
-
|
307
|
-
/yard/templates/default/:
|
308
|
-
|-- fulldoc
|
309
|
-
| |-- html
|
310
|
-
| | |-- css
|
311
|
-
| | | |-- common.css
|
312
|
-
| | | |-- full_list.css
|
313
|
-
| | | |-- style.css
|
314
|
-
|
315
|
-
The `style.css` is the primary stylesheet for the HTML output.
|
316
|
-
|
317
|
-
The `full_list.css` is an additional stylesheet loaded specifically for the
|
318
|
-
search field menus (i.e. class list, method list, and file list).
|
319
|
-
|
320
|
-
The `common.css` is an empty css file that an template author can easily override
|
321
|
-
to provide custom styles for their plugin. However, if a user installs multiple
|
322
|
-
plugins that utilize this same file to deliver styles, it is possible that they
|
323
|
-
will be overridden.
|
324
|
-
|
325
|
-
YARD's `fulldoc` template defines three javascript files:
|
326
|
-
|
327
|
-
/yard/templates/default/:
|
328
|
-
|-- fulldoc
|
329
|
-
| |-- html
|
330
|
-
| | |-- js
|
331
|
-
| | | |-- app.js
|
332
|
-
| | | |-- full_list.js
|
333
|
-
| | | |-- jquery.js
|
334
|
-
|
335
|
-
The `app.js` is the primary javascript file for the HTML output.
|
336
|
-
|
337
|
-
The `full_list.js` defines additional javascript loaded specifically for the
|
338
|
-
search field menus (i.e. class list, method list, and file list).
|
339
|
-
|
340
|
-
The `jquery.js` is copy of the jquery javascript library.
|
341
|
-
|
342
|
-
### Adding a Custom Stylesheet or Javascript
|
343
|
-
|
344
|
-
To load additional stylesheets and javascripts with every page (except the search
|
345
|
-
field menus) generated from the base `layout` template:
|
346
|
-
|
347
|
-
1. Define your own custom stylesheet and/or javascript file
|
348
|
-
(default/ is the default template name inside of the /template root directory):
|
349
|
-
|
350
|
-
/template/default/:
|
351
|
-
|-- fulldoc
|
352
|
-
| |-- html
|
353
|
-
| | |-- css
|
354
|
-
| | | |-- custom.css
|
355
|
-
| | |-- js
|
356
|
-
| | | |-- custom.js
|
357
|
-
|
358
|
-
2. Create a `setup.rb` in the `layout` template directory and override the methods
|
359
|
-
`stylesheets` and `javascripts`. The path to the template would be:
|
360
|
-
|
361
|
-
/template/default/:
|
362
|
-
|-- layout
|
363
|
-
| |-- html
|
364
|
-
| | |-- setup.rb
|
365
|
-
|
366
|
-
And the code would look like:
|
367
|
-
|
368
|
-
def stylesheets
|
369
|
-
# Load the existing stylesheets while appending the custom one
|
370
|
-
super + %w(css/custom.css)
|
371
|
-
end
|
372
|
-
|
373
|
-
def javascripts
|
374
|
-
# Load the existing javascripts while appending the custom one
|
375
|
-
super + %w(js/custom.js)
|
376
|
-
end
|
377
|
-
|
378
|
-
|
379
|
-
To load additional stylesheets and javascripts for the search menus loaded from
|
380
|
-
the `fulldoc` template:
|
381
|
-
|
382
|
-
1. Define your own custom stylesheet and/or javascript file.
|
383
|
-
|
384
|
-
/path/to/mytemplates/:
|
385
|
-
|-- fulldoc
|
386
|
-
| |-- html
|
387
|
-
| | |-- css
|
388
|
-
| | | |-- custom_full_menu.css
|
389
|
-
| | |-- js
|
390
|
-
| | | |-- custom_full_menu.js
|
391
|
-
|
392
|
-
|
393
|
-
3. Override the methods `stylesheets_full_list` and `javascripts_full_list`
|
394
|
-
in the `setup.rb` file inside fulldoc/html.
|
395
|
-
|
396
|
-
def stylesheets_full_list
|
397
|
-
# Load the existing stylesheets while appending the custom one
|
398
|
-
super + %w(css/custom.css)
|
399
|
-
end
|
400
|
-
|
401
|
-
def javascripts_full_list
|
402
|
-
# Load the existing javascripts while appending the custom one
|
403
|
-
super + %w(js/custom.js)
|
404
|
-
end
|
405
|
-
|
406
|
-
### Overriding Search Menus
|
407
|
-
|
408
|
-
By default YARD's `fulldoc` template generates three search fields:
|
409
|
-
|
410
|
-
* Class List
|
411
|
-
* Method List
|
412
|
-
* File List
|
413
|
-
|
414
|
-
Their contents are rendered in methods within the `fulldoc` template:
|
415
|
-
|
416
|
-
* `generate_class_list`
|
417
|
-
* `generate_method_list`
|
418
|
-
* `generate_file_list`
|
419
|
-
|
420
|
-
To override these lists you will need to:
|
421
|
-
|
422
|
-
1. Create a `setup.rb` in the `fulldoc` template directory and override the
|
423
|
-
particular method.
|
424
|
-
|
425
|
-
/path/to/mytemplates/:
|
426
|
-
|-- fulldoc
|
427
|
-
| |-- html
|
428
|
-
| | |-- setup.rb
|
429
|
-
|
430
|
-
def generate_method_list
|
431
|
-
@items = prune_method_listing(Registry.all(:method), false)
|
432
|
-
@items = @items.reject {|m| m.name.to_s =~ /=$/ && m.is_attribute? }
|
433
|
-
|
434
|
-
# Here we changed the functionality to reverse the order of displayed methods
|
435
|
-
@items = @items.sort_by {|m| m.name.to_s }.reverse
|
436
|
-
@list_title = "Method List"
|
437
|
-
@list_type = "methods"
|
438
|
-
asset('method_list.html', erb(:full_list))
|
439
|
-
end
|
440
|
-
|
441
|
-
### Adding Additional Search Menus
|
442
|
-
|
443
|
-
By default YARD's `fulldoc` template generates three search fields:
|
444
|
-
|
445
|
-
* Class List
|
446
|
-
* Method List
|
447
|
-
* File List
|
448
|
-
|
449
|
-
These are defined in the `layout` template method `menu_lists` and pulled into
|
450
|
-
the `fulldoc` template through a similarly named method.
|
451
|
-
|
452
|
-
To load an additional menu item:
|
453
|
-
|
454
|
-
|
455
|
-
1. Create a `setup.rb` in the `layout` template directory and override the methods
|
456
|
-
`menu_lists`. The `type` informs the search field the name of the file.
|
457
|
-
The `title` is the name that appears above the section when viewed in frames.
|
458
|
-
The `search_title` is the name that appears in the search field tab on the page.
|
459
|
-
|
460
|
-
|
461
|
-
/path/to/mytemplates/:
|
462
|
-
|-- layout
|
463
|
-
| |-- html
|
464
|
-
| | |-- setup.rb
|
465
|
-
|
466
|
-
def menu_lists
|
467
|
-
# Load the existing menus
|
468
|
-
super + [ { :type => 'feature', :title => 'Features', :search_title => 'Feature List' } ]
|
469
|
-
end
|
470
|
-
|
471
|
-
2. Create a `setup.rb` in the `fulldoc` template directory and create a method
|
472
|
-
to generate a menu for the specified `type`.
|
473
|
-
The method `generate_assets` will look for a function with a signature prefixed
|
474
|
-
with `generate`, the type value specified, and the suffix `list`. Within that
|
475
|
-
method you can configure and load the specific objects you wish to display.
|
476
|
-
|
477
|
-
/path/to/mytemplates/:
|
478
|
-
|-- fulldoc
|
479
|
-
| |-- html
|
480
|
-
| | |-- setup.rb
|
481
|
-
|
482
|
-
def generate_feature_list
|
483
|
-
|
484
|
-
# load all the features from the Registry
|
485
|
-
@items = Registry.all(:feature)
|
486
|
-
@list_title = "Feature List"
|
487
|
-
@list_type = "feature"
|
488
|
-
|
489
|
-
# optional: the specified stylesheet class
|
490
|
-
# when not specified it will default to the value of @list_type
|
491
|
-
@list_class = "class"
|
492
|
-
|
493
|
-
# Generate the full list html file with named feature_list.html
|
494
|
-
# @note this file must be match the name of the type
|
495
|
-
asset('feature_list.html', erb(:full_list))
|
496
|
-
end
|
1
|
+
# @title Templates Architecture
|
2
|
+
|
3
|
+
# Templates Architecture
|
4
|
+
|
5
|
+
Templates are the main component in the output rendering process of YARD,
|
6
|
+
which is invoked when conventional HTML/text output needs to be rendered
|
7
|
+
for a set of code objects.
|
8
|
+
|
9
|
+
## Design Goals
|
10
|
+
|
11
|
+
The general design attempts to be as abstracted from actual content and templates
|
12
|
+
as possible. Unlike RDoc which uses one file to describe the entire template,
|
13
|
+
YARD splits up the rendering of code objects into small components, allowing
|
14
|
+
template modification for smaller subsets of a full template without having to
|
15
|
+
duplicate the entire template itself. This is necessary because of YARD's support
|
16
|
+
for plugins. YARD is designed for extensibility by external plugins, and because
|
17
|
+
of this, no one plugin can be responsible for the entire template because no
|
18
|
+
one plugin knows about the other plugins being used. For instance, if an RSpec
|
19
|
+
plugin was added to support and document specifications in class templates,
|
20
|
+
this information would need to be transparently added to the template to work
|
21
|
+
in conjunction with any other plugin that performed similar template modifications.
|
22
|
+
The design goals can be summarized as follows:
|
23
|
+
|
24
|
+
1. Output should be able to be rendered for any arbitrary format with little
|
25
|
+
modification to YARD's source code. The addition of extra templates should
|
26
|
+
be sufficient.
|
27
|
+
2. The output rendered for an object should independently rendered data
|
28
|
+
from arbitrary sources. These independent components are called "sections".
|
29
|
+
3. Sections should be able to be inserted into any object without affecting
|
30
|
+
any existing sections in the document. This allows for easy modification
|
31
|
+
of templates by plugins.
|
32
|
+
|
33
|
+
## Templates
|
34
|
+
|
35
|
+
Template modules are the objects used to orchestrate the design goals listed
|
36
|
+
above. Specifically, they organize the sections and render the template contents
|
37
|
+
depending on the format.
|
38
|
+
|
39
|
+
## Engine
|
40
|
+
|
41
|
+
The Engine class orchestrates the creation and rendering of Template modules and
|
42
|
+
handles serialization or specific rendering scenarios (like HTML). To create
|
43
|
+
a template, use the {YARD::Templates::Engine.template template} method. The two most
|
44
|
+
common methods used to initiate output are the {YARD::Templates::Engine.render render}
|
45
|
+
and {YARD::Templates::Engine.generate generate} methods which generate and
|
46
|
+
optionally serialize output to a file. The latter, `#generate`, is used
|
47
|
+
specially to generate HTML documentation and copy over assets that may be
|
48
|
+
needed. For instance, an object may be rendered with:
|
49
|
+
|
50
|
+
YARD::Templates::Engine.render(:object => myobject)
|
51
|
+
|
52
|
+
A set of objects may be rendered into HTML documentation by using:
|
53
|
+
|
54
|
+
# all_objects is an array of module and class objects
|
55
|
+
# options includes a :serializer key to copy output to the file system
|
56
|
+
YARD::Templates::Engine.generate(all_objects, options)
|
57
|
+
|
58
|
+
Note that these methods should not be called directly. The {YARD::CodeObjects::Base}
|
59
|
+
class has a {YARD::CodeObjects::Base#format #format} helper method to render an
|
60
|
+
object. For instance, the above render example is equivalent to the simple
|
61
|
+
call `myobject.format`. The `generate` method is a special kind of render
|
62
|
+
and is called from the {YARD::CLI::Yardoc} command line utility.
|
63
|
+
|
64
|
+
## Template Options
|
65
|
+
|
66
|
+
A template keeps state when it is rendering output. This state is kept in
|
67
|
+
an options hash which is initially passed to it during instantiation. Some
|
68
|
+
default options set the template style (`:template`), the output format (`:format`),
|
69
|
+
and the serializer to use (`:serializer`). This options hash is modifiable
|
70
|
+
from all methods seen above. For example, initializing a template to output as
|
71
|
+
HTML instead of text can be done as follows:
|
72
|
+
|
73
|
+
myobject.format(:format => :html)
|
74
|
+
|
75
|
+
## Serializer
|
76
|
+
|
77
|
+
This class abstracts the logic involved in deciding how to serialize data to
|
78
|
+
the expected endpoint. For instance, there is both a {YARD::Serializers::StdoutSerializer StdoutSerializer}
|
79
|
+
and {YARD::Serializers::FileSystemSerializer FileSystemSerializer} class for
|
80
|
+
outputting to console or to a file respectively. When endpoints with locations
|
81
|
+
are used (like files or URLs), the serializer implements the {YARD::Serializers::Base#serialized_path #serialized_path}
|
82
|
+
method. This allows the translation from a code object to its path at the endpoint,
|
83
|
+
which enables inter-document linking.
|
84
|
+
|
85
|
+
Rendered objects are automatically serialized using the object if present,
|
86
|
+
otherwise the rendered object is returned as a string to its parent. Nested
|
87
|
+
Templates automatically set the serializer to nil so that they return
|
88
|
+
as a String to their parent.
|
89
|
+
|
90
|
+
## Creating a Template
|
91
|
+
|
92
|
+
Templates are represented by a directory inside the {YARD::Templates::Engine.template_paths}
|
93
|
+
on disk. A standard template directory looks like the following tree:
|
94
|
+
|
95
|
+
(Assuming templates/ is a template path)
|
96
|
+
templates
|
97
|
+
`-- default
|
98
|
+
|-- class
|
99
|
+
| |-- dot
|
100
|
+
| | |-- setup.rb
|
101
|
+
| | `-- superklass.erb
|
102
|
+
| |-- html
|
103
|
+
| | |-- constructor_details.erb
|
104
|
+
| | |-- setup.rb
|
105
|
+
| | `-- subclasses.erb
|
106
|
+
| |-- setup.rb
|
107
|
+
| `-- text
|
108
|
+
| |-- setup.rb
|
109
|
+
| `-- subclasses.erb
|
110
|
+
|-- docstring
|
111
|
+
| |-- html
|
112
|
+
| | |-- abstract.erb
|
113
|
+
| | |-- deprecated.erb
|
114
|
+
| | |-- index.erb
|
115
|
+
| | `-- text.erb
|
116
|
+
| |-- setup.rb
|
117
|
+
| `-- text
|
118
|
+
| |-- abstract.erb
|
119
|
+
| |-- deprecated.erb
|
120
|
+
| |-- index.erb
|
121
|
+
| `-- text.erb
|
122
|
+
|
123
|
+
The path `default` refers to the template style (:template key in options hash)
|
124
|
+
and the directories at the next level (such as `class`) refer to template
|
125
|
+
`:type` (options hash key) for a template. The next directory refers to the
|
126
|
+
output format being used defined by the `:format` template option.
|
127
|
+
|
128
|
+
As we saw in the above example, the format option can be set to `:html`, which
|
129
|
+
would use the `html/` directory instead of `text/`. Finally, the individual .erb
|
130
|
+
files are the sections that make up the template.
|
131
|
+
|
132
|
+
Note that the subdirectory `html/` is also its own "template" that inherits
|
133
|
+
from the parent directory. We will see more on this later.
|
134
|
+
|
135
|
+
## setup.rb
|
136
|
+
|
137
|
+
Every template should have at least one `setup.rb` file that defines the
|
138
|
+
{YARD::Templates::Template#init #init} method to set the
|
139
|
+
{YARD::Templates::Template#sections #sections} used by the template. If
|
140
|
+
a setup.rb is not defined in the template itself, there should be a template
|
141
|
+
that is inherited (via parent directory or explicitly) that sets the sections
|
142
|
+
on a newly created template.
|
143
|
+
|
144
|
+
A standard setup.rb file looks like:
|
145
|
+
|
146
|
+
def init
|
147
|
+
sections :section1, :section2, :section3
|
148
|
+
end
|
149
|
+
|
150
|
+
## Sections
|
151
|
+
|
152
|
+
Sections are smaller components that correlate to template
|
153
|
+
fragments. Practically speaking, a section can either be a template fragment
|
154
|
+
(a conventional .erb file or other supported templating language), a method
|
155
|
+
(which returns a String) or another {YARD::Templates::Template} (which in turn has its own
|
156
|
+
list of sections).
|
157
|
+
|
158
|
+
## Nested Sections
|
159
|
+
|
160
|
+
Sections often require the ability to encapsulate a set of sub-sections in markup
|
161
|
+
(HTML, for instance). Rather than use heavier Template subclass objects, a more
|
162
|
+
lightweight solution is to nest a set of sub-sections as a list that follows
|
163
|
+
a section, for example:
|
164
|
+
|
165
|
+
def init
|
166
|
+
sections :header, [:section_a, :section_b]
|
167
|
+
end
|
168
|
+
|
169
|
+
The above example nests `section_a` and `section_b` within the `header` section.
|
170
|
+
Practically speaking, these sections can be placed in the result by `yield`ing
|
171
|
+
to them. A sample header.erb template might contain:
|
172
|
+
|
173
|
+
<h2>Header</h2>
|
174
|
+
<div id="contents">
|
175
|
+
<%= yieldall %>
|
176
|
+
</div>
|
177
|
+
|
178
|
+
This template code would place the output of `section_a` and `section_b` within
|
179
|
+
the above div element. Using `yieldall`, we can also change the object that is being
|
180
|
+
rendered. For example, we may want to yield the first method of the class.
|
181
|
+
We can do this like so:
|
182
|
+
|
183
|
+
<h2>First method</h2>
|
184
|
+
<%= yieldall :object => object.meths.first %>
|
185
|
+
|
186
|
+
This would run the nested sections for the method object instead of the class.
|
187
|
+
|
188
|
+
Note that `yieldall` yields to all subsections, whereas `yield` will yield
|
189
|
+
to each individually (in order) until there are no more left to yield to.
|
190
|
+
In the vast majority of cases, you'd want to use `yieldall`, since `yield`
|
191
|
+
makes it hard for users to override your template.
|
192
|
+
|
193
|
+
## Inheriting Templates
|
194
|
+
|
195
|
+
Parent directory templates are automatically inherited (or mixed in, to be
|
196
|
+
more accurate) by the current template. This means that the 'default/class/html'
|
197
|
+
template automatically inherits from 'default/class'. This also means that anything
|
198
|
+
defined in 'default/class/setup.rb' can be overridden by 'default/class/html/setup.rb'.
|
199
|
+
|
200
|
+
Since the Template module is a module, and not a class, they can be mixed in
|
201
|
+
explicitly (via include/extend) from other templates, which allows templates
|
202
|
+
to share erb files or helper logic. The 'default/class' template explicitly
|
203
|
+
mixes in the 'default/module' template, since it uses much of the same sections.
|
204
|
+
This is done with the helper {YARD::Templates::Template::ClassMethods#T T} method, which
|
205
|
+
is simply a shorthand for {YARD::Templates::Engine.template Engine.template}.
|
206
|
+
It can then override (using standard inheritance) the sections from the module
|
207
|
+
template and insert sections pertaining to classes. This is one of the design
|
208
|
+
goals described above.
|
209
|
+
|
210
|
+
For instance, the first line in `default/class/html/setup.rb` is:
|
211
|
+
|
212
|
+
include T('default/module/html')
|
213
|
+
|
214
|
+
This includes the 'default/module/html', which means it also includes 'default/module'
|
215
|
+
by extension. This allows class to make use of any of module's erb files.
|
216
|
+
|
217
|
+
## Inserting and Traversing Sections
|
218
|
+
|
219
|
+
The ability to insert sections was mentioned above. The class template, for
|
220
|
+
instance, will modify the #init method to insert class specific sections:
|
221
|
+
|
222
|
+
def init
|
223
|
+
super
|
224
|
+
sections.place(:subclasses).before(:children)
|
225
|
+
sections.delete(:children)
|
226
|
+
sections.place([:constructor_details, [T('method_details')]]).before(:methodmissing)
|
227
|
+
end
|
228
|
+
|
229
|
+
Observe how sections has been modified after the super method was called (the
|
230
|
+
super method would have been defined in `default/module/setup.rb`). The
|
231
|
+
`sections` object is of the {YARD::Templates::Section} class and allows sections to be inserted
|
232
|
+
before or after another section using {Array#place} by it's given name rather
|
233
|
+
than index. This allows the overriding of templates in a way that does not
|
234
|
+
depend on where the section is located (since it may have been overridden by
|
235
|
+
another module).
|
236
|
+
|
237
|
+
You can also use `sections[:name]` to find the first child section named `:name`.
|
238
|
+
For instance, with the following sections declaration:
|
239
|
+
|
240
|
+
sections :a, [:b, :c, [:d]]
|
241
|
+
|
242
|
+
You can get to the :d section with:
|
243
|
+
|
244
|
+
sections[:a][:c][:d]
|
245
|
+
|
246
|
+
You can use this to insert a section inside a nested set without using indexed
|
247
|
+
access. The following command would result in `[:a, [:b, :c, [:d, :e]]]`:
|
248
|
+
|
249
|
+
sections[:a][:c].place(:e).after(:d)
|
250
|
+
|
251
|
+
There are also two methods, {Insertion#before_any} and {Insertion#after_any},
|
252
|
+
which allow you to insert sections before or after the first matching section name
|
253
|
+
recursively. The above example could simply be rewritten as:
|
254
|
+
|
255
|
+
sections.place(:e).after_any(:d)
|
256
|
+
|
257
|
+
## Overriding Templates by Registering a Template Path
|
258
|
+
|
259
|
+
Inheriting templates explicitly is useful when creating a customized template
|
260
|
+
that wants to take advantage of code re-use. However, most users who want
|
261
|
+
to customize YARD templates will want to override existing behaviour without
|
262
|
+
creating a template from scratch.
|
263
|
+
|
264
|
+
YARD solves this problem by allowing other template paths to be registered.
|
265
|
+
Because template modules are represented by a relative path such as 'default/class',
|
266
|
+
they can be found within any of the registered template paths. A new template
|
267
|
+
path is registered as:
|
268
|
+
|
269
|
+
YARD::Templates::Engine.register_template_path '/path/to/mytemplates'
|
270
|
+
|
271
|
+
At this point, any time the 'default/class' template is loaded, the template
|
272
|
+
will first be looked for inside the newly registered template path. If found,
|
273
|
+
it will be used as the template module, with the modules from the other
|
274
|
+
template paths implicitly mixed in.
|
275
|
+
|
276
|
+
Therefore, by using the same directory structure as a builtin YARD template,
|
277
|
+
a user can customize or override individual templates as if the old ones were
|
278
|
+
inherited. A real world example would further modify the 'default/class' template
|
279
|
+
seen above by creating such a path in our '/path/to/mytemplates' custom template
|
280
|
+
path:
|
281
|
+
|
282
|
+
/path/to/mytemplates/:
|
283
|
+
|-- class
|
284
|
+
| |-- html
|
285
|
+
| | |-- customsection.erb
|
286
|
+
| |-- setup.rb
|
287
|
+
|
288
|
+
The `setup.rb` file would look like:
|
289
|
+
|
290
|
+
def init
|
291
|
+
super
|
292
|
+
sections.push :customsection
|
293
|
+
end
|
294
|
+
|
295
|
+
Now, when a class object is formatted as HTML, our customsection.erb will be
|
296
|
+
appended to the rendered data.
|
297
|
+
|
298
|
+
|
299
|
+
### Overriding Stylesheets and Javascripts
|
300
|
+
|
301
|
+
Template authors can override existing stylesheets and javascripts by creating
|
302
|
+
a file with the same name as existing files within the `fulldoc` template. The
|
303
|
+
documentation output will utilize the new replacement file.
|
304
|
+
|
305
|
+
YARD's `fulldoc` template defines three stylesheets:
|
306
|
+
|
307
|
+
/yard/templates/default/:
|
308
|
+
|-- fulldoc
|
309
|
+
| |-- html
|
310
|
+
| | |-- css
|
311
|
+
| | | |-- common.css
|
312
|
+
| | | |-- full_list.css
|
313
|
+
| | | |-- style.css
|
314
|
+
|
315
|
+
The `style.css` is the primary stylesheet for the HTML output.
|
316
|
+
|
317
|
+
The `full_list.css` is an additional stylesheet loaded specifically for the
|
318
|
+
search field menus (i.e. class list, method list, and file list).
|
319
|
+
|
320
|
+
The `common.css` is an empty css file that an template author can easily override
|
321
|
+
to provide custom styles for their plugin. However, if a user installs multiple
|
322
|
+
plugins that utilize this same file to deliver styles, it is possible that they
|
323
|
+
will be overridden.
|
324
|
+
|
325
|
+
YARD's `fulldoc` template defines three javascript files:
|
326
|
+
|
327
|
+
/yard/templates/default/:
|
328
|
+
|-- fulldoc
|
329
|
+
| |-- html
|
330
|
+
| | |-- js
|
331
|
+
| | | |-- app.js
|
332
|
+
| | | |-- full_list.js
|
333
|
+
| | | |-- jquery.js
|
334
|
+
|
335
|
+
The `app.js` is the primary javascript file for the HTML output.
|
336
|
+
|
337
|
+
The `full_list.js` defines additional javascript loaded specifically for the
|
338
|
+
search field menus (i.e. class list, method list, and file list).
|
339
|
+
|
340
|
+
The `jquery.js` is copy of the jquery javascript library.
|
341
|
+
|
342
|
+
### Adding a Custom Stylesheet or Javascript
|
343
|
+
|
344
|
+
To load additional stylesheets and javascripts with every page (except the search
|
345
|
+
field menus) generated from the base `layout` template:
|
346
|
+
|
347
|
+
1. Define your own custom stylesheet and/or javascript file
|
348
|
+
(default/ is the default template name inside of the /template root directory):
|
349
|
+
|
350
|
+
/template/default/:
|
351
|
+
|-- fulldoc
|
352
|
+
| |-- html
|
353
|
+
| | |-- css
|
354
|
+
| | | |-- custom.css
|
355
|
+
| | |-- js
|
356
|
+
| | | |-- custom.js
|
357
|
+
|
358
|
+
2. Create a `setup.rb` in the `layout` template directory and override the methods
|
359
|
+
`stylesheets` and `javascripts`. The path to the template would be:
|
360
|
+
|
361
|
+
/template/default/:
|
362
|
+
|-- layout
|
363
|
+
| |-- html
|
364
|
+
| | |-- setup.rb
|
365
|
+
|
366
|
+
And the code would look like:
|
367
|
+
|
368
|
+
def stylesheets
|
369
|
+
# Load the existing stylesheets while appending the custom one
|
370
|
+
super + %w(css/custom.css)
|
371
|
+
end
|
372
|
+
|
373
|
+
def javascripts
|
374
|
+
# Load the existing javascripts while appending the custom one
|
375
|
+
super + %w(js/custom.js)
|
376
|
+
end
|
377
|
+
|
378
|
+
|
379
|
+
To load additional stylesheets and javascripts for the search menus loaded from
|
380
|
+
the `fulldoc` template:
|
381
|
+
|
382
|
+
1. Define your own custom stylesheet and/or javascript file.
|
383
|
+
|
384
|
+
/path/to/mytemplates/:
|
385
|
+
|-- fulldoc
|
386
|
+
| |-- html
|
387
|
+
| | |-- css
|
388
|
+
| | | |-- custom_full_menu.css
|
389
|
+
| | |-- js
|
390
|
+
| | | |-- custom_full_menu.js
|
391
|
+
|
392
|
+
|
393
|
+
3. Override the methods `stylesheets_full_list` and `javascripts_full_list`
|
394
|
+
in the `setup.rb` file inside fulldoc/html.
|
395
|
+
|
396
|
+
def stylesheets_full_list
|
397
|
+
# Load the existing stylesheets while appending the custom one
|
398
|
+
super + %w(css/custom.css)
|
399
|
+
end
|
400
|
+
|
401
|
+
def javascripts_full_list
|
402
|
+
# Load the existing javascripts while appending the custom one
|
403
|
+
super + %w(js/custom.js)
|
404
|
+
end
|
405
|
+
|
406
|
+
### Overriding Search Menus
|
407
|
+
|
408
|
+
By default YARD's `fulldoc` template generates three search fields:
|
409
|
+
|
410
|
+
* Class List
|
411
|
+
* Method List
|
412
|
+
* File List
|
413
|
+
|
414
|
+
Their contents are rendered in methods within the `fulldoc` template:
|
415
|
+
|
416
|
+
* `generate_class_list`
|
417
|
+
* `generate_method_list`
|
418
|
+
* `generate_file_list`
|
419
|
+
|
420
|
+
To override these lists you will need to:
|
421
|
+
|
422
|
+
1. Create a `setup.rb` in the `fulldoc` template directory and override the
|
423
|
+
particular method.
|
424
|
+
|
425
|
+
/path/to/mytemplates/:
|
426
|
+
|-- fulldoc
|
427
|
+
| |-- html
|
428
|
+
| | |-- setup.rb
|
429
|
+
|
430
|
+
def generate_method_list
|
431
|
+
@items = prune_method_listing(Registry.all(:method), false)
|
432
|
+
@items = @items.reject {|m| m.name.to_s =~ /=$/ && m.is_attribute? }
|
433
|
+
|
434
|
+
# Here we changed the functionality to reverse the order of displayed methods
|
435
|
+
@items = @items.sort_by {|m| m.name.to_s }.reverse
|
436
|
+
@list_title = "Method List"
|
437
|
+
@list_type = "methods"
|
438
|
+
asset('method_list.html', erb(:full_list))
|
439
|
+
end
|
440
|
+
|
441
|
+
### Adding Additional Search Menus
|
442
|
+
|
443
|
+
By default YARD's `fulldoc` template generates three search fields:
|
444
|
+
|
445
|
+
* Class List
|
446
|
+
* Method List
|
447
|
+
* File List
|
448
|
+
|
449
|
+
These are defined in the `layout` template method `menu_lists` and pulled into
|
450
|
+
the `fulldoc` template through a similarly named method.
|
451
|
+
|
452
|
+
To load an additional menu item:
|
453
|
+
|
454
|
+
|
455
|
+
1. Create a `setup.rb` in the `layout` template directory and override the methods
|
456
|
+
`menu_lists`. The `type` informs the search field the name of the file.
|
457
|
+
The `title` is the name that appears above the section when viewed in frames.
|
458
|
+
The `search_title` is the name that appears in the search field tab on the page.
|
459
|
+
|
460
|
+
|
461
|
+
/path/to/mytemplates/:
|
462
|
+
|-- layout
|
463
|
+
| |-- html
|
464
|
+
| | |-- setup.rb
|
465
|
+
|
466
|
+
def menu_lists
|
467
|
+
# Load the existing menus
|
468
|
+
super + [ { :type => 'feature', :title => 'Features', :search_title => 'Feature List' } ]
|
469
|
+
end
|
470
|
+
|
471
|
+
2. Create a `setup.rb` in the `fulldoc` template directory and create a method
|
472
|
+
to generate a menu for the specified `type`.
|
473
|
+
The method `generate_assets` will look for a function with a signature prefixed
|
474
|
+
with `generate`, the type value specified, and the suffix `list`. Within that
|
475
|
+
method you can configure and load the specific objects you wish to display.
|
476
|
+
|
477
|
+
/path/to/mytemplates/:
|
478
|
+
|-- fulldoc
|
479
|
+
| |-- html
|
480
|
+
| | |-- setup.rb
|
481
|
+
|
482
|
+
def generate_feature_list
|
483
|
+
|
484
|
+
# load all the features from the Registry
|
485
|
+
@items = Registry.all(:feature)
|
486
|
+
@list_title = "Feature List"
|
487
|
+
@list_type = "feature"
|
488
|
+
|
489
|
+
# optional: the specified stylesheet class
|
490
|
+
# when not specified it will default to the value of @list_type
|
491
|
+
@list_class = "class"
|
492
|
+
|
493
|
+
# Generate the full list html file with named feature_list.html
|
494
|
+
# @note this file must be match the name of the type
|
495
|
+
asset('feature_list.html', erb(:full_list))
|
496
|
+
end
|