deg-yard 0.8.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.travis.yml +39 -0
- data/.yardopts +25 -0
- data/.yardopts_guide +19 -0
- data/.yardopts_i18n +22 -0
- data/Gemfile +35 -0
- data/LEGAL +66 -0
- data/LICENSE +22 -0
- data/README.md +609 -0
- data/Rakefile +66 -0
- data/benchmarks/builtins_vs_eval.rb +23 -0
- data/benchmarks/concat_vs_join.rb +12 -0
- data/benchmarks/erb_vs_erubis.rb +53 -0
- data/benchmarks/format_args.rb +46 -0
- data/benchmarks/generation.rb +37 -0
- data/benchmarks/marshal_vs_dbm.rb +63 -0
- data/benchmarks/parsing.rb +46 -0
- data/benchmarks/pathname_vs_string.rb +50 -0
- data/benchmarks/rdoc_vs_yardoc.rb +10 -0
- data/benchmarks/registry_store_types.rb +48 -0
- data/benchmarks/ri_vs_yri.rb +18 -0
- data/benchmarks/ripper_parser.rb +12 -0
- data/benchmarks/splat_vs_flatten.rb +12 -0
- data/benchmarks/template_erb.rb +22 -0
- data/benchmarks/template_format.rb +6 -0
- data/benchmarks/template_profile.rb +17 -0
- data/benchmarks/yri_cache.rb +19 -0
- data/bin/yard +12 -0
- data/bin/yardoc +12 -0
- data/bin/yri +12 -0
- data/docs/CodeObjects.md +115 -0
- data/docs/GettingStarted.md +592 -0
- data/docs/Handlers.md +152 -0
- data/docs/Overview.md +61 -0
- data/docs/Parser.md +191 -0
- data/docs/Tags.md +282 -0
- data/docs/TagsArch.md +123 -0
- data/docs/Templates.md +496 -0
- data/docs/WhatsNew.md +1244 -0
- data/docs/images/code-objects-class-diagram.png +0 -0
- data/docs/images/handlers-class-diagram.png +0 -0
- data/docs/images/overview-class-diagram.png +0 -0
- data/docs/images/parser-class-diagram.png +0 -0
- data/docs/images/tags-class-diagram.png +0 -0
- data/docs/templates/default/fulldoc/html/full_list_tag.erb +7 -0
- data/docs/templates/default/fulldoc/html/setup.rb +6 -0
- data/docs/templates/default/layout/html/setup.rb +8 -0
- data/docs/templates/default/layout/html/tag_list.erb +11 -0
- data/docs/templates/default/yard_tags/html/list.erb +18 -0
- data/docs/templates/default/yard_tags/html/setup.rb +27 -0
- data/docs/templates/plugin.rb +65 -0
- data/lib/rubygems_plugin.rb +4 -0
- data/lib/yard/autoload.rb +290 -0
- data/lib/yard/cli/command.rb +84 -0
- data/lib/yard/cli/command_parser.rb +92 -0
- data/lib/yard/cli/config.rb +136 -0
- data/lib/yard/cli/diff.rb +270 -0
- data/lib/yard/cli/display.rb +68 -0
- data/lib/yard/cli/gems.rb +83 -0
- data/lib/yard/cli/graph.rb +126 -0
- data/lib/yard/cli/help.rb +18 -0
- data/lib/yard/cli/i18n.rb +69 -0
- data/lib/yard/cli/list.rb +22 -0
- data/lib/yard/cli/markup_types.rb +33 -0
- data/lib/yard/cli/server.rb +253 -0
- data/lib/yard/cli/stats.rb +213 -0
- data/lib/yard/cli/yardoc.rb +752 -0
- data/lib/yard/cli/yardopts_command.rb +109 -0
- data/lib/yard/cli/yri.rb +214 -0
- data/lib/yard/code_objects/base.rb +585 -0
- data/lib/yard/code_objects/class_object.rb +143 -0
- data/lib/yard/code_objects/class_variable_object.rb +8 -0
- data/lib/yard/code_objects/constant_object.rb +13 -0
- data/lib/yard/code_objects/extended_method_object.rb +23 -0
- data/lib/yard/code_objects/extra_file_object.rb +128 -0
- data/lib/yard/code_objects/macro_object.rb +172 -0
- data/lib/yard/code_objects/method_object.rb +191 -0
- data/lib/yard/code_objects/module_object.rb +18 -0
- data/lib/yard/code_objects/namespace_object.rb +200 -0
- data/lib/yard/code_objects/proxy.rb +258 -0
- data/lib/yard/code_objects/root_object.rb +17 -0
- data/lib/yard/config.rb +269 -0
- data/lib/yard/core_ext/array.rb +15 -0
- data/lib/yard/core_ext/file.rb +65 -0
- data/lib/yard/core_ext/hash.rb +15 -0
- data/lib/yard/core_ext/insertion.rb +60 -0
- data/lib/yard/core_ext/module.rb +19 -0
- data/lib/yard/core_ext/string.rb +67 -0
- data/lib/yard/core_ext/symbol_hash.rb +73 -0
- data/lib/yard/docstring.rb +362 -0
- data/lib/yard/docstring_parser.rb +321 -0
- data/lib/yard/globals.rb +18 -0
- data/lib/yard/handlers/base.rb +597 -0
- data/lib/yard/handlers/c/alias_handler.rb +15 -0
- data/lib/yard/handlers/c/attribute_handler.rb +13 -0
- data/lib/yard/handlers/c/base.rb +110 -0
- data/lib/yard/handlers/c/class_handler.rb +26 -0
- data/lib/yard/handlers/c/constant_handler.rb +12 -0
- data/lib/yard/handlers/c/handler_methods.rb +166 -0
- data/lib/yard/handlers/c/init_handler.rb +18 -0
- data/lib/yard/handlers/c/method_handler.rb +35 -0
- data/lib/yard/handlers/c/mixin_handler.rb +13 -0
- data/lib/yard/handlers/c/module_handler.rb +16 -0
- data/lib/yard/handlers/c/override_comment_handler.rb +30 -0
- data/lib/yard/handlers/c/path_handler.rb +10 -0
- data/lib/yard/handlers/c/struct_handler.rb +12 -0
- data/lib/yard/handlers/c/symbol_handler.rb +7 -0
- data/lib/yard/handlers/processor.rb +201 -0
- data/lib/yard/handlers/ruby/alias_handler.rb +41 -0
- data/lib/yard/handlers/ruby/attribute_handler.rb +82 -0
- data/lib/yard/handlers/ruby/base.rb +164 -0
- data/lib/yard/handlers/ruby/class_condition_handler.rb +86 -0
- data/lib/yard/handlers/ruby/class_handler.rb +121 -0
- data/lib/yard/handlers/ruby/class_variable_handler.rb +16 -0
- data/lib/yard/handlers/ruby/comment_handler.rb +9 -0
- data/lib/yard/handlers/ruby/constant_handler.rb +45 -0
- data/lib/yard/handlers/ruby/dsl_handler.rb +14 -0
- data/lib/yard/handlers/ruby/dsl_handler_methods.rb +77 -0
- data/lib/yard/handlers/ruby/exception_handler.rb +26 -0
- data/lib/yard/handlers/ruby/extend_handler.rb +21 -0
- data/lib/yard/handlers/ruby/legacy/alias_handler.rb +34 -0
- data/lib/yard/handlers/ruby/legacy/attribute_handler.rb +60 -0
- data/lib/yard/handlers/ruby/legacy/base.rb +250 -0
- data/lib/yard/handlers/ruby/legacy/class_condition_handler.rb +83 -0
- data/lib/yard/handlers/ruby/legacy/class_handler.rb +111 -0
- data/lib/yard/handlers/ruby/legacy/class_variable_handler.rb +14 -0
- data/lib/yard/handlers/ruby/legacy/comment_handler.rb +9 -0
- data/lib/yard/handlers/ruby/legacy/constant_handler.rb +28 -0
- data/lib/yard/handlers/ruby/legacy/dsl_handler.rb +16 -0
- data/lib/yard/handlers/ruby/legacy/exception_handler.rb +12 -0
- data/lib/yard/handlers/ruby/legacy/extend_handler.rb +20 -0
- data/lib/yard/handlers/ruby/legacy/method_handler.rb +85 -0
- data/lib/yard/handlers/ruby/legacy/mixin_handler.rb +39 -0
- data/lib/yard/handlers/ruby/legacy/module_function_handler.rb +18 -0
- data/lib/yard/handlers/ruby/legacy/module_handler.rb +11 -0
- data/lib/yard/handlers/ruby/legacy/private_constant_handler.rb +21 -0
- data/lib/yard/handlers/ruby/legacy/visibility_handler.rb +16 -0
- data/lib/yard/handlers/ruby/legacy/yield_handler.rb +28 -0
- data/lib/yard/handlers/ruby/method_condition_handler.rb +8 -0
- data/lib/yard/handlers/ruby/method_handler.rb +92 -0
- data/lib/yard/handlers/ruby/mixin_handler.rb +36 -0
- data/lib/yard/handlers/ruby/module_function_handler.rb +26 -0
- data/lib/yard/handlers/ruby/module_handler.rb +11 -0
- data/lib/yard/handlers/ruby/private_constant_handler.rb +36 -0
- data/lib/yard/handlers/ruby/struct_handler_methods.rb +141 -0
- data/lib/yard/handlers/ruby/visibility_handler.rb +24 -0
- data/lib/yard/handlers/ruby/yield_handler.rb +30 -0
- data/lib/yard/i18n/locale.rb +74 -0
- data/lib/yard/i18n/message.rb +56 -0
- data/lib/yard/i18n/messages.rb +55 -0
- data/lib/yard/i18n/pot_generator.rb +280 -0
- data/lib/yard/i18n/text.rb +173 -0
- data/lib/yard/logging.rb +190 -0
- data/lib/yard/options.rb +216 -0
- data/lib/yard/parser/base.rb +56 -0
- data/lib/yard/parser/c/c_parser.rb +231 -0
- data/lib/yard/parser/c/comment_parser.rb +131 -0
- data/lib/yard/parser/c/statement.rb +63 -0
- data/lib/yard/parser/ruby/ast_node.rb +496 -0
- data/lib/yard/parser/ruby/legacy/ruby_lex.rb +1378 -0
- data/lib/yard/parser/ruby/legacy/ruby_parser.rb +31 -0
- data/lib/yard/parser/ruby/legacy/statement.rb +65 -0
- data/lib/yard/parser/ruby/legacy/statement_list.rb +384 -0
- data/lib/yard/parser/ruby/legacy/token_list.rb +71 -0
- data/lib/yard/parser/ruby/ruby_parser.rb +625 -0
- data/lib/yard/parser/source_parser.rb +517 -0
- data/lib/yard/rake/yardoc_task.rb +74 -0
- data/lib/yard/registry.rb +438 -0
- data/lib/yard/registry_store.rb +319 -0
- data/lib/yard/rubygems/backports/LICENSE.txt +57 -0
- data/lib/yard/rubygems/backports/MIT.txt +20 -0
- data/lib/yard/rubygems/backports/gem.rb +9 -0
- data/lib/yard/rubygems/backports/source_index.rb +370 -0
- data/lib/yard/rubygems/backports.rb +8 -0
- data/lib/yard/rubygems/doc_manager.rb +88 -0
- data/lib/yard/rubygems/specification.rb +41 -0
- data/lib/yard/serializers/base.rb +80 -0
- data/lib/yard/serializers/file_system_serializer.rb +90 -0
- data/lib/yard/serializers/process_serializer.rb +24 -0
- data/lib/yard/serializers/stdout_serializer.rb +32 -0
- data/lib/yard/serializers/yardoc_serializer.rb +124 -0
- data/lib/yard/server/adapter.rb +100 -0
- data/lib/yard/server/commands/base.rb +192 -0
- data/lib/yard/server/commands/display_file_command.rb +24 -0
- data/lib/yard/server/commands/display_object_command.rb +58 -0
- data/lib/yard/server/commands/frames_command.rb +15 -0
- data/lib/yard/server/commands/library_command.rb +148 -0
- data/lib/yard/server/commands/library_index_command.rb +24 -0
- data/lib/yard/server/commands/list_command.rb +24 -0
- data/lib/yard/server/commands/search_command.rb +78 -0
- data/lib/yard/server/commands/static_file_command.rb +57 -0
- data/lib/yard/server/doc_server_helper.rb +76 -0
- data/lib/yard/server/doc_server_serializer.rb +33 -0
- data/lib/yard/server/library_version.rb +227 -0
- data/lib/yard/server/rack_adapter.rb +88 -0
- data/lib/yard/server/router.rb +176 -0
- data/lib/yard/server/static_caching.rb +45 -0
- data/lib/yard/server/templates/default/fulldoc/html/css/custom.css +78 -0
- data/lib/yard/server/templates/default/fulldoc/html/images/processing.gif +0 -0
- data/lib/yard/server/templates/default/fulldoc/html/js/autocomplete.js +12 -0
- data/lib/yard/server/templates/default/layout/html/breadcrumb.erb +46 -0
- data/lib/yard/server/templates/default/layout/html/script_setup.erb +8 -0
- data/lib/yard/server/templates/default/layout/html/setup.rb +7 -0
- data/lib/yard/server/templates/default/method_details/html/permalink.erb +4 -0
- data/lib/yard/server/templates/default/method_details/html/setup.rb +4 -0
- data/lib/yard/server/templates/doc_server/library_list/html/contents.erb +13 -0
- data/lib/yard/server/templates/doc_server/library_list/html/headers.erb +26 -0
- data/lib/yard/server/templates/doc_server/library_list/html/library_list.erb +12 -0
- data/lib/yard/server/templates/doc_server/library_list/html/setup.rb +3 -0
- data/lib/yard/server/templates/doc_server/library_list/html/title.erb +2 -0
- data/lib/yard/server/templates/doc_server/processing/html/processing.erb +51 -0
- data/lib/yard/server/templates/doc_server/processing/html/setup.rb +3 -0
- data/lib/yard/server/templates/doc_server/search/html/search.erb +18 -0
- data/lib/yard/server/templates/doc_server/search/html/setup.rb +8 -0
- data/lib/yard/server/webrick_adapter.rb +43 -0
- data/lib/yard/server.rb +11 -0
- data/lib/yard/tags/default_factory.rb +176 -0
- data/lib/yard/tags/default_tag.rb +12 -0
- data/lib/yard/tags/directives.rb +599 -0
- data/lib/yard/tags/library.rb +630 -0
- data/lib/yard/tags/option_tag.rb +12 -0
- data/lib/yard/tags/overload_tag.rb +66 -0
- data/lib/yard/tags/ref_tag.rb +7 -0
- data/lib/yard/tags/ref_tag_list.rb +27 -0
- data/lib/yard/tags/tag.rb +57 -0
- data/lib/yard/tags/tag_format_error.rb +6 -0
- data/lib/yard/templates/engine.rb +185 -0
- data/lib/yard/templates/erb_cache.rb +22 -0
- data/lib/yard/templates/helpers/base_helper.rb +212 -0
- data/lib/yard/templates/helpers/filter_helper.rb +26 -0
- data/lib/yard/templates/helpers/html_helper.rb +599 -0
- data/lib/yard/templates/helpers/html_syntax_highlight_helper.rb +59 -0
- data/lib/yard/templates/helpers/markup/rdoc_markdown.rb +22 -0
- data/lib/yard/templates/helpers/markup/rdoc_markup.rb +106 -0
- data/lib/yard/templates/helpers/markup_helper.rb +169 -0
- data/lib/yard/templates/helpers/method_helper.rb +74 -0
- data/lib/yard/templates/helpers/module_helper.rb +19 -0
- data/lib/yard/templates/helpers/text_helper.rb +95 -0
- data/lib/yard/templates/helpers/uml_helper.rb +46 -0
- data/lib/yard/templates/section.rb +106 -0
- data/lib/yard/templates/template.rb +407 -0
- data/lib/yard/templates/template_options.rb +88 -0
- data/lib/yard/verifier.rb +148 -0
- data/lib/yard/version.rb +3 -0
- data/lib/yard.rb +71 -0
- data/po/ja.po +31118 -0
- data/spec/cli/command_parser_spec.rb +43 -0
- data/spec/cli/command_spec.rb +36 -0
- data/spec/cli/config_spec.rb +92 -0
- data/spec/cli/diff_spec.rb +260 -0
- data/spec/cli/display_spec.rb +30 -0
- data/spec/cli/gems_spec.rb +81 -0
- data/spec/cli/graph_spec.rb +17 -0
- data/spec/cli/help_spec.rb +22 -0
- data/spec/cli/i18n_spec.rb +111 -0
- data/spec/cli/list_spec.rb +8 -0
- data/spec/cli/markup_types_spec.rb +22 -0
- data/spec/cli/server_spec.rb +327 -0
- data/spec/cli/stats_spec.rb +90 -0
- data/spec/cli/yardoc_spec.rb +804 -0
- data/spec/cli/yri_spec.rb +99 -0
- data/spec/code_objects/base_spec.rb +438 -0
- data/spec/code_objects/class_object_spec.rb +225 -0
- data/spec/code_objects/code_object_list_spec.rb +33 -0
- data/spec/code_objects/constants_spec.rb +82 -0
- data/spec/code_objects/extra_file_object_spec.rb +147 -0
- data/spec/code_objects/macro_object_spec.rb +148 -0
- data/spec/code_objects/method_object_spec.rb +175 -0
- data/spec/code_objects/module_object_spec.rb +141 -0
- data/spec/code_objects/namespace_object_spec.rb +170 -0
- data/spec/code_objects/proxy_spec.rb +140 -0
- data/spec/code_objects/spec_helper.rb +3 -0
- data/spec/config_spec.rb +176 -0
- data/spec/core_ext/array_spec.rb +14 -0
- data/spec/core_ext/file_spec.rb +68 -0
- data/spec/core_ext/hash_spec.rb +14 -0
- data/spec/core_ext/insertion_spec.rb +37 -0
- data/spec/core_ext/module_spec.rb +15 -0
- data/spec/core_ext/string_spec.rb +42 -0
- data/spec/core_ext/symbol_hash_spec.rb +86 -0
- data/spec/docstring_parser_spec.rb +228 -0
- data/spec/docstring_spec.rb +335 -0
- data/spec/handlers/alias_handler_spec.rb +80 -0
- data/spec/handlers/attribute_handler_spec.rb +94 -0
- data/spec/handlers/base_spec.rb +206 -0
- data/spec/handlers/c/alias_handler_spec.rb +33 -0
- data/spec/handlers/c/attribute_handler_spec.rb +40 -0
- data/spec/handlers/c/class_handler_spec.rb +63 -0
- data/spec/handlers/c/constant_handler_spec.rb +68 -0
- data/spec/handlers/c/init_handler_spec.rb +47 -0
- data/spec/handlers/c/method_handler_spec.rb +229 -0
- data/spec/handlers/c/mixin_handler_spec.rb +27 -0
- data/spec/handlers/c/module_handler_spec.rb +38 -0
- data/spec/handlers/c/override_comment_handler_spec.rb +46 -0
- data/spec/handlers/c/path_handler_spec.rb +35 -0
- data/spec/handlers/c/spec_helper.rb +13 -0
- data/spec/handlers/c/struct_handler_spec.rb +15 -0
- data/spec/handlers/class_condition_handler_spec.rb +67 -0
- data/spec/handlers/class_handler_spec.rb +246 -0
- data/spec/handlers/class_variable_handler_spec.rb +11 -0
- data/spec/handlers/constant_handler_spec.rb +64 -0
- data/spec/handlers/dsl_handler_spec.rb +197 -0
- data/spec/handlers/examples/alias_handler_001.rb.txt +44 -0
- data/spec/handlers/examples/attribute_handler_001.rb.txt +32 -0
- data/spec/handlers/examples/class_condition_handler_001.rb.txt +69 -0
- data/spec/handlers/examples/class_handler_001.rb.txt +120 -0
- data/spec/handlers/examples/class_variable_handler_001.rb.txt +10 -0
- data/spec/handlers/examples/constant_handler_001.rb.txt +25 -0
- data/spec/handlers/examples/dsl_handler_001.rb.txt +125 -0
- data/spec/handlers/examples/exception_handler_001.rb.txt +59 -0
- data/spec/handlers/examples/extend_handler_001.rb.txt +16 -0
- data/spec/handlers/examples/method_condition_handler_001.rb.txt +10 -0
- data/spec/handlers/examples/method_handler_001.rb.txt +126 -0
- data/spec/handlers/examples/mixin_handler_001.rb.txt +37 -0
- data/spec/handlers/examples/module_handler_001.rb.txt +29 -0
- data/spec/handlers/examples/private_constant_handler_001.rb.txt +8 -0
- data/spec/handlers/examples/process_handler_001.rb.txt +11 -0
- data/spec/handlers/examples/visibility_handler_001.rb.txt +32 -0
- data/spec/handlers/examples/yield_handler_001.rb.txt +54 -0
- data/spec/handlers/exception_handler_spec.rb +48 -0
- data/spec/handlers/extend_handler_spec.rb +23 -0
- data/spec/handlers/legacy_base_spec.rb +128 -0
- data/spec/handlers/method_condition_handler_spec.rb +14 -0
- data/spec/handlers/method_handler_spec.rb +184 -0
- data/spec/handlers/mixin_handler_spec.rb +55 -0
- data/spec/handlers/module_function_handler_spec.rb +105 -0
- data/spec/handlers/module_handler_spec.rb +34 -0
- data/spec/handlers/private_constant_handler_spec.rb +24 -0
- data/spec/handlers/processor_spec.rb +34 -0
- data/spec/handlers/ruby/base_spec.rb +94 -0
- data/spec/handlers/ruby/legacy/base_spec.rb +82 -0
- data/spec/handlers/spec_helper.rb +33 -0
- data/spec/handlers/visibility_handler_spec.rb +39 -0
- data/spec/handlers/yield_handler_spec.rb +51 -0
- data/spec/i18n/locale_spec.rb +68 -0
- data/spec/i18n/message_spec.rb +52 -0
- data/spec/i18n/messages_spec.rb +67 -0
- data/spec/i18n/pot_generator_spec.rb +262 -0
- data/spec/i18n/text_spec.rb +180 -0
- data/spec/logging_spec.rb +35 -0
- data/spec/options_spec.rb +171 -0
- data/spec/parser/base_spec.rb +24 -0
- data/spec/parser/c_parser_spec.rb +171 -0
- data/spec/parser/examples/array.c.txt +3887 -0
- data/spec/parser/examples/example1.rb.txt +8 -0
- data/spec/parser/examples/extrafile.c.txt +8 -0
- data/spec/parser/examples/multifile.c.txt +22 -0
- data/spec/parser/examples/override.c.txt +424 -0
- data/spec/parser/examples/parse_in_order_001.rb.txt +2 -0
- data/spec/parser/examples/parse_in_order_002.rb.txt +2 -0
- data/spec/parser/examples/tag_handler_001.rb.txt +8 -0
- data/spec/parser/ruby/ast_node_spec.rb +33 -0
- data/spec/parser/ruby/legacy/statement_list_spec.rb +299 -0
- data/spec/parser/ruby/legacy/token_list_spec.rb +77 -0
- data/spec/parser/ruby/ruby_parser_spec.rb +334 -0
- data/spec/parser/source_parser_spec.rb +717 -0
- data/spec/parser/tag_parsing_spec.rb +18 -0
- data/spec/rake/yardoc_task_spec.rb +101 -0
- data/spec/registry_spec.rb +393 -0
- data/spec/registry_store_spec.rb +315 -0
- data/spec/rubygems/doc_manager_spec.rb +112 -0
- data/spec/serializers/data/serialized_yardoc/checksums +1 -0
- data/spec/serializers/data/serialized_yardoc/objects/Foo/bar_i.dat +0 -0
- data/spec/serializers/data/serialized_yardoc/objects/Foo/baz_i.dat +0 -0
- data/spec/serializers/data/serialized_yardoc/objects/Foo.dat +0 -0
- data/spec/serializers/data/serialized_yardoc/objects/root.dat +0 -0
- data/spec/serializers/data/serialized_yardoc/proxy_types +2 -0
- data/spec/serializers/file_system_serializer_spec.rb +124 -0
- data/spec/serializers/spec_helper.rb +2 -0
- data/spec/serializers/yardoc_serializer_spec.rb +46 -0
- data/spec/server/adapter_spec.rb +38 -0
- data/spec/server/commands/base_spec.rb +87 -0
- data/spec/server/commands/library_command_spec.rb +39 -0
- data/spec/server/commands/static_file_command_spec.rb +84 -0
- data/spec/server/doc_server_helper_spec.rb +53 -0
- data/spec/server/doc_server_serializer_spec.rb +45 -0
- data/spec/server/rack_adapter_spec.rb +20 -0
- data/spec/server/router_spec.rb +122 -0
- data/spec/server/spec_helper.rb +17 -0
- data/spec/server/static_caching_spec.rb +39 -0
- data/spec/server/webrick_servlet_spec.rb +20 -0
- data/spec/server_spec.rb +10 -0
- data/spec/spec_helper.rb +128 -0
- data/spec/tags/default_factory_spec.rb +152 -0
- data/spec/tags/default_tag_spec.rb +11 -0
- data/spec/tags/directives_spec.rb +453 -0
- data/spec/tags/library_spec.rb +34 -0
- data/spec/tags/overload_tag_spec.rb +53 -0
- data/spec/tags/ref_tag_list_spec.rb +53 -0
- data/spec/templates/class_spec.rb +44 -0
- data/spec/templates/constant_spec.rb +40 -0
- data/spec/templates/engine_spec.rb +121 -0
- data/spec/templates/examples/class001.html +280 -0
- data/spec/templates/examples/class001.txt +36 -0
- data/spec/templates/examples/class002.html +35 -0
- data/spec/templates/examples/constant001.txt +25 -0
- data/spec/templates/examples/constant002.txt +7 -0
- data/spec/templates/examples/constant003.txt +11 -0
- data/spec/templates/examples/method001.html +130 -0
- data/spec/templates/examples/method001.txt +35 -0
- data/spec/templates/examples/method002.html +86 -0
- data/spec/templates/examples/method002.txt +20 -0
- data/spec/templates/examples/method003.html +159 -0
- data/spec/templates/examples/method003.txt +45 -0
- data/spec/templates/examples/method004.html +44 -0
- data/spec/templates/examples/method004.txt +10 -0
- data/spec/templates/examples/method005.html +99 -0
- data/spec/templates/examples/method005.txt +33 -0
- data/spec/templates/examples/module001.dot +33 -0
- data/spec/templates/examples/module001.html +825 -0
- data/spec/templates/examples/module001.txt +33 -0
- data/spec/templates/examples/module002.html +318 -0
- data/spec/templates/examples/module003.html +185 -0
- data/spec/templates/examples/module004.html +387 -0
- data/spec/templates/examples/tag001.txt +82 -0
- data/spec/templates/helpers/base_helper_spec.rb +175 -0
- data/spec/templates/helpers/html_helper_spec.rb +612 -0
- data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +48 -0
- data/spec/templates/helpers/markup/rdoc_markup_spec.rb +93 -0
- data/spec/templates/helpers/markup_helper_spec.rb +135 -0
- data/spec/templates/helpers/method_helper_spec.rb +82 -0
- data/spec/templates/helpers/shared_signature_examples.rb +123 -0
- data/spec/templates/helpers/text_helper_spec.rb +44 -0
- data/spec/templates/method_spec.rb +102 -0
- data/spec/templates/module_spec.rb +181 -0
- data/spec/templates/onefile_spec.rb +64 -0
- data/spec/templates/section_spec.rb +146 -0
- data/spec/templates/spec_helper.rb +73 -0
- data/spec/templates/tag_spec.rb +51 -0
- data/spec/templates/template_spec.rb +409 -0
- data/spec/verifier_spec.rb +106 -0
- data/templates/default/class/dot/setup.rb +6 -0
- data/templates/default/class/dot/superklass.erb +3 -0
- data/templates/default/class/html/constructor_details.erb +8 -0
- data/templates/default/class/html/setup.rb +1 -0
- data/templates/default/class/html/subclasses.erb +4 -0
- data/templates/default/class/setup.rb +36 -0
- data/templates/default/class/text/setup.rb +11 -0
- data/templates/default/class/text/subclasses.erb +5 -0
- data/templates/default/constant/text/header.erb +11 -0
- data/templates/default/constant/text/setup.rb +3 -0
- data/templates/default/docstring/html/abstract.erb +4 -0
- data/templates/default/docstring/html/deprecated.erb +1 -0
- data/templates/default/docstring/html/index.erb +5 -0
- data/templates/default/docstring/html/note.erb +6 -0
- data/templates/default/docstring/html/private.erb +4 -0
- data/templates/default/docstring/html/returns_void.erb +1 -0
- data/templates/default/docstring/html/text.erb +1 -0
- data/templates/default/docstring/html/todo.erb +6 -0
- data/templates/default/docstring/setup.rb +51 -0
- data/templates/default/docstring/text/abstract.erb +2 -0
- data/templates/default/docstring/text/deprecated.erb +2 -0
- data/templates/default/docstring/text/index.erb +2 -0
- data/templates/default/docstring/text/note.erb +4 -0
- data/templates/default/docstring/text/private.erb +2 -0
- data/templates/default/docstring/text/returns_void.erb +1 -0
- data/templates/default/docstring/text/text.erb +1 -0
- data/templates/default/docstring/text/todo.erb +4 -0
- data/templates/default/fulldoc/html/css/common.css +1 -0
- data/templates/default/fulldoc/html/css/full_list.css +57 -0
- data/templates/default/fulldoc/html/css/style.css +338 -0
- data/templates/default/fulldoc/html/frames.erb +28 -0
- data/templates/default/fulldoc/html/full_list.erb +40 -0
- data/templates/default/fulldoc/html/full_list_class.erb +2 -0
- data/templates/default/fulldoc/html/full_list_file.erb +5 -0
- data/templates/default/fulldoc/html/full_list_method.erb +8 -0
- data/templates/default/fulldoc/html/js/app.js +214 -0
- data/templates/default/fulldoc/html/js/full_list.js +178 -0
- data/templates/default/fulldoc/html/js/jquery.js +4 -0
- data/templates/default/fulldoc/html/setup.rb +199 -0
- data/templates/default/layout/dot/header.erb +6 -0
- data/templates/default/layout/dot/setup.rb +14 -0
- data/templates/default/layout/html/breadcrumb.erb +13 -0
- data/templates/default/layout/html/files.erb +11 -0
- data/templates/default/layout/html/footer.erb +5 -0
- data/templates/default/layout/html/headers.erb +14 -0
- data/templates/default/layout/html/index.erb +2 -0
- data/templates/default/layout/html/layout.erb +20 -0
- data/templates/default/layout/html/listing.erb +4 -0
- data/templates/default/layout/html/objects.erb +32 -0
- data/templates/default/layout/html/script_setup.erb +5 -0
- data/templates/default/layout/html/search.erb +8 -0
- data/templates/default/layout/html/setup.rb +71 -0
- data/templates/default/method/html/header.erb +16 -0
- data/templates/default/method/setup.rb +3 -0
- data/templates/default/method/text/header.erb +1 -0
- data/templates/default/method_details/html/header.erb +3 -0
- data/templates/default/method_details/html/method_signature.erb +25 -0
- data/templates/default/method_details/html/source.erb +10 -0
- data/templates/default/method_details/setup.rb +10 -0
- data/templates/default/method_details/text/header.erb +10 -0
- data/templates/default/method_details/text/method_signature.erb +12 -0
- data/templates/default/method_details/text/setup.rb +10 -0
- data/templates/default/module/dot/child.erb +1 -0
- data/templates/default/module/dot/dependencies.erb +3 -0
- data/templates/default/module/dot/header.erb +6 -0
- data/templates/default/module/dot/info.erb +14 -0
- data/templates/default/module/dot/setup.rb +14 -0
- data/templates/default/module/html/attribute_details.erb +10 -0
- data/templates/default/module/html/attribute_summary.erb +8 -0
- data/templates/default/module/html/box_info.erb +37 -0
- data/templates/default/module/html/children.erb +8 -0
- data/templates/default/module/html/constant_summary.erb +13 -0
- data/templates/default/module/html/defines.erb +3 -0
- data/templates/default/module/html/header.erb +5 -0
- data/templates/default/module/html/inherited_attributes.erb +14 -0
- data/templates/default/module/html/inherited_constants.erb +8 -0
- data/templates/default/module/html/inherited_methods.erb +19 -0
- data/templates/default/module/html/item_summary.erb +40 -0
- data/templates/default/module/html/method_details_list.erb +9 -0
- data/templates/default/module/html/method_summary.erb +14 -0
- data/templates/default/module/html/methodmissing.erb +12 -0
- data/templates/default/module/html/pre_docstring.erb +1 -0
- data/templates/default/module/setup.rb +164 -0
- data/templates/default/module/text/children.erb +10 -0
- data/templates/default/module/text/class_meths_list.erb +8 -0
- data/templates/default/module/text/extends.erb +8 -0
- data/templates/default/module/text/header.erb +7 -0
- data/templates/default/module/text/includes.erb +8 -0
- data/templates/default/module/text/instance_meths_list.erb +8 -0
- data/templates/default/module/text/setup.rb +12 -0
- data/templates/default/onefile/html/files.erb +5 -0
- data/templates/default/onefile/html/headers.erb +6 -0
- data/templates/default/onefile/html/layout.erb +17 -0
- data/templates/default/onefile/html/readme.erb +3 -0
- data/templates/default/onefile/html/setup.rb +61 -0
- data/templates/default/root/dot/child.erb +3 -0
- data/templates/default/root/dot/setup.rb +5 -0
- data/templates/default/root/html/setup.rb +1 -0
- data/templates/default/tags/html/example.erb +11 -0
- data/templates/default/tags/html/index.erb +3 -0
- data/templates/default/tags/html/option.erb +24 -0
- data/templates/default/tags/html/overload.erb +14 -0
- data/templates/default/tags/html/see.erb +8 -0
- data/templates/default/tags/html/tag.erb +20 -0
- data/templates/default/tags/setup.rb +55 -0
- data/templates/default/tags/text/example.erb +12 -0
- data/templates/default/tags/text/index.erb +1 -0
- data/templates/default/tags/text/option.erb +20 -0
- data/templates/default/tags/text/overload.erb +19 -0
- data/templates/default/tags/text/see.erb +11 -0
- data/templates/default/tags/text/tag.erb +13 -0
- data/templates/guide/class/html/setup.rb +1 -0
- data/templates/guide/docstring/html/setup.rb +1 -0
- data/templates/guide/fulldoc/html/css/style.css +108 -0
- data/templates/guide/fulldoc/html/js/app.js +33 -0
- data/templates/guide/fulldoc/html/setup.rb +73 -0
- data/templates/guide/layout/html/layout.erb +81 -0
- data/templates/guide/layout/html/setup.rb +28 -0
- data/templates/guide/method/html/header.erb +18 -0
- data/templates/guide/method/html/setup.rb +21 -0
- data/templates/guide/module/html/header.erb +7 -0
- data/templates/guide/module/html/method_list.erb +5 -0
- data/templates/guide/module/html/setup.rb +26 -0
- data/templates/guide/onefile/html/files.erb +4 -0
- data/templates/guide/onefile/html/setup.rb +5 -0
- data/templates/guide/onefile/html/toc.erb +3 -0
- data/templates/guide/tags/html/setup.rb +8 -0
- metadata +689 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module YARD
|
|
2
|
+
module Serializers
|
|
3
|
+
# A serializer that writes data to standard output.
|
|
4
|
+
class StdoutSerializer < Base
|
|
5
|
+
# Creates a serializer to print text to stdout
|
|
6
|
+
#
|
|
7
|
+
# @param [Fixnum, nil] wrap if wrap is a number, wraps text to +wrap+
|
|
8
|
+
# columns, otherwise no wrapping is done.
|
|
9
|
+
def initialize(wrap = nil)
|
|
10
|
+
@wrap = wrap
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Overrides serialize behaviour to write data to standard output
|
|
14
|
+
def serialize(object, data)
|
|
15
|
+
print(@wrap ? word_wrap(data, @wrap) : data)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
# Wraps text to a specific column length
|
|
21
|
+
#
|
|
22
|
+
# @param [String] text the text to wrap
|
|
23
|
+
# @param [Fixnum] length the column length to wrap to
|
|
24
|
+
# @return [String] the wrapped text
|
|
25
|
+
def word_wrap(text, length = 80)
|
|
26
|
+
# See ruby-talk/10655 / Ernest Ellingson
|
|
27
|
+
text.gsub(/\t/," ").gsub(/.{1,50}(?:\s|\Z)/){($& +
|
|
28
|
+
5.chr).gsub(/\n\005/,"\n").gsub(/\005/,"\n")}
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
module YARD
|
|
2
|
+
# Stubs marshal dumps and acts a delegate class for an object by path
|
|
3
|
+
#
|
|
4
|
+
# @private
|
|
5
|
+
class StubProxy
|
|
6
|
+
instance_methods.each {|m| undef_method(m) unless m.to_s =~ /^__|^object_id$/ }
|
|
7
|
+
|
|
8
|
+
def _dump(depth) @path end
|
|
9
|
+
def self._load(str) new(str) end
|
|
10
|
+
def hash; @path.hash end
|
|
11
|
+
|
|
12
|
+
def initialize(path, transient = false)
|
|
13
|
+
@path = path
|
|
14
|
+
@transient = transient
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def method_missing(meth, *args, &block)
|
|
18
|
+
return true if meth == :respond_to? && args.first == :_dump
|
|
19
|
+
@object = nil if @transient
|
|
20
|
+
@object ||= Registry.at(@path)
|
|
21
|
+
@object.send(meth, *args, &block)
|
|
22
|
+
rescue NoMethodError => e
|
|
23
|
+
e.backtrace.delete_if {|l| l[0, __FILE__.size] == __FILE__ }
|
|
24
|
+
raise
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
module Serializers
|
|
29
|
+
class YardocSerializer < FileSystemSerializer
|
|
30
|
+
def initialize(yfile)
|
|
31
|
+
super(:basepath => yfile, :extension => 'dat')
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def objects_path; File.join(basepath, 'objects') end
|
|
35
|
+
# @deprecated The registry no longer tracks proxy types
|
|
36
|
+
def proxy_types_path; File.join(basepath, 'proxy_types') end
|
|
37
|
+
def checksums_path; File.join(basepath, 'checksums') end
|
|
38
|
+
def object_types_path; File.join(basepath, 'object_types') end
|
|
39
|
+
|
|
40
|
+
def serialized_path(object)
|
|
41
|
+
path = case object
|
|
42
|
+
when String, Symbol
|
|
43
|
+
object = object.to_s
|
|
44
|
+
if object =~ /#/
|
|
45
|
+
object += '_i'
|
|
46
|
+
elsif object =~ /\./
|
|
47
|
+
object += '_c'
|
|
48
|
+
end
|
|
49
|
+
object.split(/::|\.|#/).map do |p|
|
|
50
|
+
p.gsub(/[^\w\.-]/) do |x|
|
|
51
|
+
encoded = '_'
|
|
52
|
+
|
|
53
|
+
x.each_byte { |b| encoded << ("%X" % b) }
|
|
54
|
+
encoded
|
|
55
|
+
end
|
|
56
|
+
end.join('/') + '.' + extension
|
|
57
|
+
when YARD::CodeObjects::RootObject
|
|
58
|
+
'root.dat'
|
|
59
|
+
else
|
|
60
|
+
super(object)
|
|
61
|
+
end
|
|
62
|
+
File.join('objects', path)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def serialize(object)
|
|
66
|
+
if Hash === object
|
|
67
|
+
super(object[:root], dump(object)) if object[:root]
|
|
68
|
+
else
|
|
69
|
+
super(object, dump(object))
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def deserialize(path, is_path = false)
|
|
74
|
+
path = File.join(basepath, serialized_path(path)) unless is_path
|
|
75
|
+
if File.file?(path)
|
|
76
|
+
log.debug "Deserializing #{path}..."
|
|
77
|
+
Marshal.load(File.read_binary(path))
|
|
78
|
+
else
|
|
79
|
+
log.debug "Could not find #{path}"
|
|
80
|
+
nil
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
private
|
|
85
|
+
|
|
86
|
+
def dump(object)
|
|
87
|
+
object = internal_dump(object, true) unless object.is_a?(Hash)
|
|
88
|
+
Marshal.dump(object)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def internal_dump(object, first_object = false)
|
|
92
|
+
if !first_object && object.is_a?(CodeObjects::Base) &&
|
|
93
|
+
!(Tags::OverloadTag === object)
|
|
94
|
+
return StubProxy.new(object.path)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
if object.is_a?(Hash) || object.is_a?(Array) ||
|
|
98
|
+
object.is_a?(CodeObjects::Base) ||
|
|
99
|
+
object.instance_variables.size > 0
|
|
100
|
+
object = object.dup
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
object.instance_variables.each do |ivar|
|
|
104
|
+
ivar_obj = object.instance_variable_get(ivar)
|
|
105
|
+
ivar_obj_dump = internal_dump(ivar_obj)
|
|
106
|
+
object.instance_variable_set(ivar, ivar_obj_dump)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
case object
|
|
110
|
+
when Hash
|
|
111
|
+
list = object.map do |k, v|
|
|
112
|
+
[k, v].map {|item| internal_dump(item) }
|
|
113
|
+
end
|
|
114
|
+
object.replace(Hash[list])
|
|
115
|
+
when Array
|
|
116
|
+
list = object.map {|item| internal_dump(item) }
|
|
117
|
+
object.replace(list)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
object
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
module YARD
|
|
2
|
+
module Server
|
|
3
|
+
|
|
4
|
+
# Short circuits a request by raising an error. This exception is caught
|
|
5
|
+
# by {Commands::Base#call} to immediately end a request and return a response.
|
|
6
|
+
class FinishRequest < RuntimeError; end
|
|
7
|
+
|
|
8
|
+
# Raises an error if a resource is not found. This exception is caught by
|
|
9
|
+
# {Commands::Base#call} to immediately end a request and return a 404 response
|
|
10
|
+
# code. If a message is provided, the body is set to the exception message.
|
|
11
|
+
class NotFoundError < RuntimeError; end
|
|
12
|
+
|
|
13
|
+
# This class implements the bridge between the {Router} and the server
|
|
14
|
+
# backend for a specific server type. YARD implements concrete adapters
|
|
15
|
+
# for WEBrick and Rack respectively, though other adapters can be made
|
|
16
|
+
# for other server architectures.
|
|
17
|
+
#
|
|
18
|
+
# == Subclassing Notes
|
|
19
|
+
# To create a concrete adapter class, implement the {#start} method to
|
|
20
|
+
# initiate the server backend.
|
|
21
|
+
#
|
|
22
|
+
# @abstract
|
|
23
|
+
class Adapter
|
|
24
|
+
# @return [String] the location where static files are located, if any.
|
|
25
|
+
# To set this field on initialization, pass +:DocumentRoot+ to the
|
|
26
|
+
# +server_opts+ argument in {#initialize}
|
|
27
|
+
attr_accessor :document_root
|
|
28
|
+
|
|
29
|
+
# @return [Hash{String=>Array<LibraryVersion>}] a map of libraries.
|
|
30
|
+
# @see LibraryVersion LibraryVersion for information on building a list of libraries
|
|
31
|
+
# @see #add_library
|
|
32
|
+
attr_accessor :libraries
|
|
33
|
+
|
|
34
|
+
# @return [Hash] options passed and processed by adapters. The actual
|
|
35
|
+
# options mostly depend on the adapters themselves.
|
|
36
|
+
attr_accessor :options
|
|
37
|
+
|
|
38
|
+
# @return [Hash] a set of options to pass to the server backend. Note
|
|
39
|
+
# that +:DocumentRoot+ also sets the {#document_root}.
|
|
40
|
+
attr_accessor :server_options
|
|
41
|
+
|
|
42
|
+
# @return [Router] the router object used to route URLs to commands
|
|
43
|
+
attr_accessor :router
|
|
44
|
+
|
|
45
|
+
# Performs any global initialization for the adapter.
|
|
46
|
+
# @note If you subclass this method, make sure to call +super+.
|
|
47
|
+
# @return [void]
|
|
48
|
+
def self.setup
|
|
49
|
+
Templates::Template.extra_includes |= [YARD::Server::DocServerHelper]
|
|
50
|
+
Templates::Engine.template_paths |= [File.dirname(__FILE__) + '/templates']
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Performs any global shutdown procedures for the adapter.
|
|
54
|
+
# @note If you subclass this method, make sure to call +super+.
|
|
55
|
+
# @return [void]
|
|
56
|
+
def self.shutdown
|
|
57
|
+
Templates::Template.extra_includes -= [YARD::Server::DocServerHelper]
|
|
58
|
+
Templates::Engine.template_paths -= [File.dirname(__FILE__) + '/templates']
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Creates a new adapter object
|
|
62
|
+
#
|
|
63
|
+
# @param [Hash{String=>Array<LibraryVersion>}] libs a list of libraries,
|
|
64
|
+
# see {#libraries} for formulating this list.
|
|
65
|
+
# @param [Hash] opts extra options to pass to the adapter
|
|
66
|
+
# @option opts [Class] :router (Router) the router class to initialize as the
|
|
67
|
+
# adapter's router.
|
|
68
|
+
# @option opts [Boolean] :caching (false) whether or not caching is enabled
|
|
69
|
+
# @option opts [Boolean] :single_library (false) whether to server documentation
|
|
70
|
+
# for a single or multiple libraries (changes URL structure)
|
|
71
|
+
def initialize(libs, opts = {}, server_opts = {})
|
|
72
|
+
self.class.setup
|
|
73
|
+
self.libraries = libs
|
|
74
|
+
self.options = opts
|
|
75
|
+
self.server_options = server_opts
|
|
76
|
+
self.document_root = server_options[:DocumentRoot]
|
|
77
|
+
self.router = (options[:router] || Router).new(self)
|
|
78
|
+
options[:adapter] = self
|
|
79
|
+
log.debug "Serving libraries using #{self.class}: #{libraries.keys.join(', ')}"
|
|
80
|
+
log.debug "Caching on" if options[:caching]
|
|
81
|
+
log.debug "Document root: #{document_root}" if document_root
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Adds a library to the {#libraries} mapping for a given library object.
|
|
85
|
+
# @example Adding a new library to an adapter
|
|
86
|
+
# adapter.add_library LibraryVersion.new('mylib', '1.0', '/path/to/.yardoc')
|
|
87
|
+
# @param [LibraryVersion] library a library to add
|
|
88
|
+
def add_library(library)
|
|
89
|
+
libraries[library.name] ||= []
|
|
90
|
+
libraries[library.name] |= [library]
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# Implement this method to connect your adapter to your server.
|
|
94
|
+
# @abstract
|
|
95
|
+
def start
|
|
96
|
+
raise NotImplementedError
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
|
|
3
|
+
module YARD
|
|
4
|
+
module Server
|
|
5
|
+
module Commands
|
|
6
|
+
# This is the base command class used to implement custom commands for
|
|
7
|
+
# a server. A command will be routed to by the {Router} class and return
|
|
8
|
+
# a Rack-style response.
|
|
9
|
+
#
|
|
10
|
+
# == Attribute Initializers
|
|
11
|
+
# All attributes can be initialized via options passed into the {#initialize}
|
|
12
|
+
# method. When creating a custom command, the {Adapter#options} will
|
|
13
|
+
# automatically be mapped to attributes by the same name on your class.
|
|
14
|
+
#
|
|
15
|
+
# class MyCommand < Base
|
|
16
|
+
# attr_accessor :myattr
|
|
17
|
+
# end
|
|
18
|
+
#
|
|
19
|
+
# Adapter.new(libs, {:myattr => 'foo'}).start
|
|
20
|
+
#
|
|
21
|
+
# # when a request comes in, cmd.myattr == 'foo'
|
|
22
|
+
#
|
|
23
|
+
# == Subclassing Notes
|
|
24
|
+
# To implement a custom command, override the {#run} method, not {#call}.
|
|
25
|
+
# In your implementation, you should set the body and status for requests.
|
|
26
|
+
# See details in the +#run+ method documentation.
|
|
27
|
+
#
|
|
28
|
+
# Note that if your command deals directly with libraries, you should
|
|
29
|
+
# consider subclassing the more specific {LibraryCommand} class instead.
|
|
30
|
+
#
|
|
31
|
+
# @abstract
|
|
32
|
+
# @see #run
|
|
33
|
+
class Base
|
|
34
|
+
# @group Basic Command and Adapter Options
|
|
35
|
+
|
|
36
|
+
# @return [Hash] the options passed to the command's constructor
|
|
37
|
+
attr_accessor :command_options
|
|
38
|
+
|
|
39
|
+
# @return [Adapter] the server adapter
|
|
40
|
+
attr_accessor :adapter
|
|
41
|
+
|
|
42
|
+
# @return [Boolean] whether to cache
|
|
43
|
+
attr_accessor :caching
|
|
44
|
+
|
|
45
|
+
# @group Attributes Set Per Request
|
|
46
|
+
|
|
47
|
+
# @return [Request] request object
|
|
48
|
+
attr_accessor :request
|
|
49
|
+
|
|
50
|
+
# @return [String] the path after the command base URI
|
|
51
|
+
attr_accessor :path
|
|
52
|
+
|
|
53
|
+
# @return [Hash{String => String}] response headers
|
|
54
|
+
attr_accessor :headers
|
|
55
|
+
|
|
56
|
+
# @return [Numeric] status code. Defaults to 200 per request
|
|
57
|
+
attr_accessor :status
|
|
58
|
+
|
|
59
|
+
# @return [String] the response body. Defaults to empty string.
|
|
60
|
+
attr_accessor :body
|
|
61
|
+
|
|
62
|
+
# @group Instance Method Summary
|
|
63
|
+
|
|
64
|
+
# Creates a new command object, setting attributes named by keys
|
|
65
|
+
# in the options hash. After initialization, the options hash
|
|
66
|
+
# is saved in {#command_options} for further inspection.
|
|
67
|
+
#
|
|
68
|
+
# @example Creating a Command
|
|
69
|
+
# cmd = DisplayObjectCommand.new(:caching => true, :library => mylib)
|
|
70
|
+
# cmd.library # => mylib
|
|
71
|
+
# cmd.command_options # => {:caching => true, :library => mylib}
|
|
72
|
+
# @param [Hash] opts the options hash, saved to {#command_options}
|
|
73
|
+
# after initialization.
|
|
74
|
+
def initialize(opts = {})
|
|
75
|
+
opts.each do |key, value|
|
|
76
|
+
send("#{key}=", value) if respond_to?("#{key}=")
|
|
77
|
+
end
|
|
78
|
+
self.command_options = opts
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# The main method called by a router with a request object.
|
|
82
|
+
#
|
|
83
|
+
# @note This command should not be overridden by subclasses. Implement
|
|
84
|
+
# the callback method {#run} instead.
|
|
85
|
+
# @param [Adapter Dependent] request the request object
|
|
86
|
+
# @return [Array(Numeric,Hash,Array<String>)] a Rack-style response
|
|
87
|
+
# of status, headers, and body wrapped in an array.
|
|
88
|
+
def call(request)
|
|
89
|
+
self.request = request
|
|
90
|
+
self.path ||= request.path[1..-1]
|
|
91
|
+
self.headers = {'Content-Type' => 'text/html'}
|
|
92
|
+
self.body = ''
|
|
93
|
+
self.status = 200
|
|
94
|
+
begin
|
|
95
|
+
run
|
|
96
|
+
rescue FinishRequest
|
|
97
|
+
rescue NotFoundError => e
|
|
98
|
+
self.body = e.message if e.message != e.class.to_s
|
|
99
|
+
self.status = 404
|
|
100
|
+
end
|
|
101
|
+
not_found if status == 404
|
|
102
|
+
[status, headers, body.is_a?(Array) ? body : [body]]
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# @group Abstract Methods
|
|
106
|
+
|
|
107
|
+
# Subclass this method to implement a custom command. This method
|
|
108
|
+
# should set the {#status} and {#body}, and optionally modify the
|
|
109
|
+
# {#headers}. Note that +#status+ defaults to 200.
|
|
110
|
+
#
|
|
111
|
+
# @example A custom command
|
|
112
|
+
# class ErrorCommand < Base
|
|
113
|
+
# def run
|
|
114
|
+
# self.body = 'ERROR! The System is down!'
|
|
115
|
+
# self.status = 500
|
|
116
|
+
# self.headers['Conten-Type'] = 'text/plain'
|
|
117
|
+
# end
|
|
118
|
+
# end
|
|
119
|
+
#
|
|
120
|
+
# @abstract
|
|
121
|
+
# @return [void]
|
|
122
|
+
def run
|
|
123
|
+
raise NotImplementedError
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
protected
|
|
127
|
+
|
|
128
|
+
# @group Helper Methods
|
|
129
|
+
|
|
130
|
+
# Renders a specific object if provided, or a regular template rendering
|
|
131
|
+
# if object is not provided.
|
|
132
|
+
#
|
|
133
|
+
# @todo This method is dependent on +#options+, it should be in {LibraryCommand}.
|
|
134
|
+
# @param [CodeObjects::Base, nil] object calls {CodeObjects::Base#format} if
|
|
135
|
+
# an object is provided, or {Templates::Engine.render} if object is nil. Both
|
|
136
|
+
# receive +#options+ as an argument.
|
|
137
|
+
# @return [String] the resulting output to display
|
|
138
|
+
def render(object = nil)
|
|
139
|
+
case object
|
|
140
|
+
when CodeObjects::Base
|
|
141
|
+
cache object.format(options)
|
|
142
|
+
when nil
|
|
143
|
+
cache Templates::Engine.render(options)
|
|
144
|
+
else
|
|
145
|
+
cache object
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# Override this method to implement custom caching mechanisms for
|
|
150
|
+
#
|
|
151
|
+
# @example Caching to memory
|
|
152
|
+
# $memory_cache = {}
|
|
153
|
+
# def cache(data)
|
|
154
|
+
# $memory_cache[path] = data
|
|
155
|
+
# end
|
|
156
|
+
# @param [String] data the data to cache
|
|
157
|
+
# @return [String] the same cached data (for chaining)
|
|
158
|
+
# @see StaticCaching
|
|
159
|
+
def cache(data)
|
|
160
|
+
if caching && adapter.document_root
|
|
161
|
+
path = File.join(adapter.document_root, request.path.sub(/\.html$/, '') + '.html')
|
|
162
|
+
path = path.sub(%r{/\.html$}, '.html')
|
|
163
|
+
FileUtils.mkdir_p(File.dirname(path))
|
|
164
|
+
log.debug "Caching data to #{path}"
|
|
165
|
+
File.open(path, 'wb') {|f| f.write(data) }
|
|
166
|
+
end
|
|
167
|
+
self.body = data
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
# Sets the body and headers (but not status) for a 404 response. Does
|
|
171
|
+
# nothing if the body is already set.
|
|
172
|
+
#
|
|
173
|
+
# @return [void]
|
|
174
|
+
def not_found
|
|
175
|
+
return unless body.empty?
|
|
176
|
+
self.body = "Not found: #{request.path}"
|
|
177
|
+
self.headers['Content-Type'] = 'text/plain'
|
|
178
|
+
self.headers['X-Cascade'] = 'pass'
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
# Sets the headers and status code for a redirection to a given URL
|
|
182
|
+
# @param [String] url the URL to redirect to
|
|
183
|
+
# @raise [FinishRequest] causes the request to terminate.
|
|
184
|
+
def redirect(url)
|
|
185
|
+
headers['Location'] = url
|
|
186
|
+
self.status = 302
|
|
187
|
+
raise FinishRequest
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module YARD
|
|
2
|
+
module Server
|
|
3
|
+
module Commands
|
|
4
|
+
# Displays a README or extra file.
|
|
5
|
+
#
|
|
6
|
+
# @todo Implement better support for detecting binary (image) filetypes
|
|
7
|
+
class DisplayFileCommand < LibraryCommand
|
|
8
|
+
def run
|
|
9
|
+
ppath = library.source_path
|
|
10
|
+
filename = File.cleanpath(File.join(library.source_path, path))
|
|
11
|
+
raise NotFoundError if !File.file?(filename)
|
|
12
|
+
if filename =~ /\.(jpe?g|gif|png|bmp)$/i
|
|
13
|
+
headers['Content-Type'] = StaticFileCommand::DefaultMimeTypes[$1.downcase] || 'text/html'
|
|
14
|
+
render IO.read(filename)
|
|
15
|
+
else
|
|
16
|
+
file = CodeObjects::ExtraFileObject.new(filename)
|
|
17
|
+
options.update(:object => Registry.root, :type => :layout, :file => file)
|
|
18
|
+
render
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
module YARD
|
|
2
|
+
module Server
|
|
3
|
+
module Commands
|
|
4
|
+
# Displays documentation for a specific object identified by the path
|
|
5
|
+
class DisplayObjectCommand < LibraryCommand
|
|
6
|
+
include DocServerHelper
|
|
7
|
+
|
|
8
|
+
def run
|
|
9
|
+
if path.empty?
|
|
10
|
+
if options.readme
|
|
11
|
+
url = url_for_file(options.readme)
|
|
12
|
+
self.status, self.headers, self.body = *router.send(:route, url)
|
|
13
|
+
cache(body.first)
|
|
14
|
+
return
|
|
15
|
+
else
|
|
16
|
+
self.path = 'index'
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
return index if path == 'index'
|
|
20
|
+
|
|
21
|
+
if object = Registry.at(object_path)
|
|
22
|
+
options.update(:type => :layout)
|
|
23
|
+
render(object)
|
|
24
|
+
else
|
|
25
|
+
self.status = 404
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def index
|
|
30
|
+
Registry.load_all
|
|
31
|
+
|
|
32
|
+
options.update(
|
|
33
|
+
:object => '_index.html',
|
|
34
|
+
:objects => Registry.all(:module, :class),
|
|
35
|
+
:type => :layout
|
|
36
|
+
)
|
|
37
|
+
render
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def not_found
|
|
41
|
+
super
|
|
42
|
+
self.body = "Could not find object: #{object_path}"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
def object_path
|
|
48
|
+
return @object_path if @object_path
|
|
49
|
+
if path == "toplevel"
|
|
50
|
+
@object_path = :root
|
|
51
|
+
else
|
|
52
|
+
@object_path = path.sub(':', '#').gsub('/', '::').sub(/^toplevel\b/, '').sub(/\.html$/, '')
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module YARD
|
|
2
|
+
module Server
|
|
3
|
+
module Commands
|
|
4
|
+
# Displays an object wrapped in frames
|
|
5
|
+
class FramesCommand < DisplayObjectCommand
|
|
6
|
+
def run
|
|
7
|
+
options.update(:frames => true, :type => :fulldoc)
|
|
8
|
+
tpl = fulldoc_template
|
|
9
|
+
tpl.generate_frameset
|
|
10
|
+
cache(tpl.contents)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
require 'thread'
|
|
2
|
+
|
|
3
|
+
module YARD
|
|
4
|
+
module Server
|
|
5
|
+
module Commands
|
|
6
|
+
class LibraryOptions < CLI::YardocOptions
|
|
7
|
+
def adapter; @command.adapter end
|
|
8
|
+
def library; @command.library end
|
|
9
|
+
def single_library; @command.single_library end
|
|
10
|
+
def serializer; @command.serializer end
|
|
11
|
+
def serialize; false end
|
|
12
|
+
|
|
13
|
+
attr_accessor :command
|
|
14
|
+
attr_accessor :frames
|
|
15
|
+
|
|
16
|
+
def each(&block)
|
|
17
|
+
super(&block)
|
|
18
|
+
yield(:adapter, adapter)
|
|
19
|
+
yield(:library, library)
|
|
20
|
+
yield(:single_library, single_library)
|
|
21
|
+
yield(:serializer, serializer)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# This is the base command for all commands that deal directly with libraries.
|
|
26
|
+
# Some commands do not, but most (like {DisplayObjectCommand}) do. If your
|
|
27
|
+
# command deals with libraries directly, subclass this class instead.
|
|
28
|
+
# See {Base} for notes on how to subclass a command.
|
|
29
|
+
#
|
|
30
|
+
# @abstract
|
|
31
|
+
class LibraryCommand < Base
|
|
32
|
+
# @return [LibraryVersion] the object containing library information
|
|
33
|
+
attr_accessor :library
|
|
34
|
+
|
|
35
|
+
# @return [LibraryOptions] default options for the library
|
|
36
|
+
attr_accessor :options
|
|
37
|
+
|
|
38
|
+
# @return [Serializers::Base] the serializer used to perform file linking
|
|
39
|
+
attr_accessor :serializer
|
|
40
|
+
|
|
41
|
+
# @return [Boolean] whether router should route for multiple libraries
|
|
42
|
+
attr_accessor :single_library
|
|
43
|
+
|
|
44
|
+
# @return [Boolean] whether to reparse data
|
|
45
|
+
attr_accessor :incremental
|
|
46
|
+
|
|
47
|
+
# Needed to synchronize threads in {#setup_yardopts}
|
|
48
|
+
# @private
|
|
49
|
+
@@library_chdir_lock = Mutex.new
|
|
50
|
+
|
|
51
|
+
def initialize(opts = {})
|
|
52
|
+
super
|
|
53
|
+
self.serializer = DocServerSerializer.new
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def call(request)
|
|
57
|
+
save_default_template_info
|
|
58
|
+
self.request = request
|
|
59
|
+
self.options = LibraryOptions.new
|
|
60
|
+
self.options.reset_defaults
|
|
61
|
+
self.options.command = self
|
|
62
|
+
setup_library
|
|
63
|
+
self.options.title = "Documentation for #{library.name} " +
|
|
64
|
+
(library.version ? '(' + library.version + ')' : '')
|
|
65
|
+
super
|
|
66
|
+
rescue LibraryNotPreparedError
|
|
67
|
+
not_prepared
|
|
68
|
+
ensure
|
|
69
|
+
restore_template_info
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
private
|
|
73
|
+
|
|
74
|
+
def save_default_template_info
|
|
75
|
+
@old_template_paths = Templates::Engine.template_paths.dup
|
|
76
|
+
@old_extra_includes = Templates::Template.extra_includes.dup
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def restore_template_info
|
|
80
|
+
Templates::Engine.template_paths = @old_template_paths
|
|
81
|
+
Templates::Template.extra_includes = @old_extra_includes
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def setup_library
|
|
85
|
+
library.prepare! if request.xhr? && request.query['process']
|
|
86
|
+
load_yardoc
|
|
87
|
+
setup_yardopts
|
|
88
|
+
true
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def setup_yardopts
|
|
92
|
+
@@library_chdir_lock.synchronize do
|
|
93
|
+
Dir.chdir(library.source_path) do
|
|
94
|
+
yardoc = CLI::Yardoc.new
|
|
95
|
+
if incremental
|
|
96
|
+
yardoc.run('-c', '-n', '--no-stats')
|
|
97
|
+
else
|
|
98
|
+
yardoc.parse_arguments
|
|
99
|
+
end
|
|
100
|
+
yardoc.send(:verify_markup_options)
|
|
101
|
+
yardoc.options.delete(:serializer)
|
|
102
|
+
yardoc.options.delete(:serialize)
|
|
103
|
+
options.update(yardoc.options.to_hash)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def load_yardoc
|
|
109
|
+
raise LibraryNotPreparedError unless library.yardoc_file
|
|
110
|
+
if Thread.current[:__yard_last_yardoc__] == library.yardoc_file
|
|
111
|
+
log.debug "Reusing yardoc file: #{library.yardoc_file}"
|
|
112
|
+
return
|
|
113
|
+
end
|
|
114
|
+
Registry.clear
|
|
115
|
+
Templates::ErbCache.clear!
|
|
116
|
+
Registry.load_yardoc(library.yardoc_file)
|
|
117
|
+
Thread.current[:__yard_last_yardoc__] = library.yardoc_file
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def not_prepared
|
|
121
|
+
self.caching = false
|
|
122
|
+
options.update(:template => :doc_server, :type => :processing)
|
|
123
|
+
[202, {'Content-Type' => 'text/html'}, [render]]
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# Hack to load a custom fulldoc template object that does
|
|
127
|
+
# not do any rendering/generation. We need this to access the
|
|
128
|
+
# generate_*_list methods.
|
|
129
|
+
def fulldoc_template
|
|
130
|
+
tplopts = [options.template, :fulldoc, options.format]
|
|
131
|
+
tplclass = Templates::Engine.template(*tplopts)
|
|
132
|
+
obj = Object.new.extend(tplclass)
|
|
133
|
+
class << obj; def init; end end
|
|
134
|
+
obj.class = tplclass
|
|
135
|
+
obj.send(:initialize, options)
|
|
136
|
+
class << obj
|
|
137
|
+
attr_reader :contents
|
|
138
|
+
def asset(file, contents) @contents = contents end
|
|
139
|
+
end
|
|
140
|
+
obj
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# @private
|
|
144
|
+
@@last_yardoc = nil
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|