yard 0.9.24 → 0.9.25
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/.rubocop.yml +37 -24
- data/CHANGELOG.md +18 -3
- data/README.md +96 -101
- data/Rakefile +2 -0
- data/lib/yard/cli/diff.rb +4 -1
- data/lib/yard/cli/server.rb +22 -13
- data/lib/yard/code_objects/proxy.rb +2 -1
- data/lib/yard/globals.rb +1 -1
- data/lib/yard/handlers/c/base.rb +164 -129
- data/lib/yard/parser/ruby/ruby_parser.rb +6 -4
- data/lib/yard/registry_store.rb +1 -1
- data/lib/yard/templates/helpers/html_helper.rb +10 -3
- data/lib/yard/templates/helpers/markup/rdoc_markup.rb +5 -4
- data/lib/yard/version.rb +1 -1
- data/tasks/update_error_map.rake +53 -0
- data/yard.gemspec +1 -1
- metadata +3 -207
- data/spec/cli/command_parser_spec.rb +0 -43
- data/spec/cli/command_spec.rb +0 -36
- data/spec/cli/config_spec.rb +0 -148
- data/spec/cli/diff_spec.rb +0 -254
- data/spec/cli/display_spec.rb +0 -30
- data/spec/cli/gems_spec.rb +0 -81
- data/spec/cli/graph_spec.rb +0 -18
- data/spec/cli/help_spec.rb +0 -22
- data/spec/cli/i18n_spec.rb +0 -107
- data/spec/cli/list_spec.rb +0 -8
- data/spec/cli/markup_types_spec.rb +0 -22
- data/spec/cli/server_spec.rb +0 -324
- data/spec/cli/stats_spec.rb +0 -96
- data/spec/cli/yard_on_yard_spec.rb +0 -38
- data/spec/cli/yardoc_spec.rb +0 -896
- data/spec/cli/yri_spec.rb +0 -101
- data/spec/code_objects/base_spec.rb +0 -485
- data/spec/code_objects/class_object_spec.rb +0 -226
- data/spec/code_objects/code_object_list_spec.rb +0 -36
- data/spec/code_objects/constants_spec.rb +0 -116
- data/spec/code_objects/extra_file_object_spec.rb +0 -161
- data/spec/code_objects/macro_object_spec.rb +0 -150
- data/spec/code_objects/method_object_spec.rb +0 -184
- data/spec/code_objects/module_object_spec.rb +0 -142
- data/spec/code_objects/namespace_mapper_spec.rb +0 -32
- data/spec/code_objects/namespace_object_spec.rb +0 -171
- data/spec/code_objects/proxy_spec.rb +0 -147
- data/spec/code_objects/spec_helper.rb +0 -3
- data/spec/config_spec.rb +0 -171
- data/spec/core_ext/array_spec.rb +0 -13
- data/spec/core_ext/file_spec.rb +0 -72
- data/spec/core_ext/hash_spec.rb +0 -14
- data/spec/core_ext/insertion_spec.rb +0 -37
- data/spec/core_ext/module_spec.rb +0 -9
- data/spec/core_ext/string_spec.rb +0 -42
- data/spec/core_ext/symbol_hash_spec.rb +0 -89
- data/spec/docstring_parser_spec.rb +0 -280
- data/spec/docstring_spec.rb +0 -373
- data/spec/handlers/alias_handler_spec.rb +0 -82
- data/spec/handlers/attribute_handler_spec.rb +0 -96
- data/spec/handlers/base_spec.rb +0 -216
- data/spec/handlers/c/alias_handler_spec.rb +0 -34
- data/spec/handlers/c/attribute_handler_spec.rb +0 -41
- data/spec/handlers/c/class_handler_spec.rb +0 -78
- data/spec/handlers/c/constant_handler_spec.rb +0 -71
- data/spec/handlers/c/init_handler_spec.rb +0 -48
- data/spec/handlers/c/method_handler_spec.rb +0 -327
- data/spec/handlers/c/mixin_handler_spec.rb +0 -44
- data/spec/handlers/c/module_handler_spec.rb +0 -71
- data/spec/handlers/c/override_comment_handler_spec.rb +0 -47
- data/spec/handlers/c/path_handler_spec.rb +0 -36
- data/spec/handlers/c/spec_helper.rb +0 -23
- data/spec/handlers/c/struct_handler_spec.rb +0 -16
- data/spec/handlers/class_condition_handler_spec.rb +0 -87
- data/spec/handlers/class_handler_spec.rb +0 -247
- data/spec/handlers/class_method_handler_shared_examples.rb +0 -133
- data/spec/handlers/class_variable_handler_spec.rb +0 -12
- data/spec/handlers/constant_handler_spec.rb +0 -112
- data/spec/handlers/decorator_handler_methods_spec.rb +0 -393
- data/spec/handlers/dsl_handler_spec.rb +0 -226
- data/spec/handlers/examples/alias_handler_001.rb.txt +0 -46
- data/spec/handlers/examples/attribute_handler_001.rb.txt +0 -32
- data/spec/handlers/examples/class_condition_handler_001.rb.txt +0 -69
- data/spec/handlers/examples/class_handler_001.rb.txt +0 -120
- data/spec/handlers/examples/class_variable_handler_001.rb.txt +0 -10
- data/spec/handlers/examples/constant_handler_001.rb.txt +0 -35
- data/spec/handlers/examples/dsl_handler_001.rb.txt +0 -156
- data/spec/handlers/examples/exception_handler_001.rb.txt +0 -59
- data/spec/handlers/examples/extend_handler_001.rb.txt +0 -19
- data/spec/handlers/examples/method_condition_handler_001.rb.txt +0 -10
- data/spec/handlers/examples/method_handler_001.rb.txt +0 -128
- data/spec/handlers/examples/mixin_handler_001.rb.txt +0 -40
- data/spec/handlers/examples/module_handler_001.rb.txt +0 -29
- data/spec/handlers/examples/private_constant_handler_001.rb.txt +0 -8
- data/spec/handlers/examples/process_handler_001.rb.txt +0 -11
- data/spec/handlers/examples/visibility_handler_001.rb.txt +0 -36
- data/spec/handlers/examples/yield_handler_001.rb.txt +0 -54
- data/spec/handlers/exception_handler_spec.rb +0 -49
- data/spec/handlers/extend_handler_spec.rb +0 -28
- data/spec/handlers/legacy_base_spec.rb +0 -128
- data/spec/handlers/method_condition_handler_spec.rb +0 -15
- data/spec/handlers/method_handler_spec.rb +0 -214
- data/spec/handlers/mixin_handler_spec.rb +0 -60
- data/spec/handlers/module_function_handler_spec.rb +0 -106
- data/spec/handlers/module_handler_spec.rb +0 -35
- data/spec/handlers/private_class_method_handler_spec.rb +0 -11
- data/spec/handlers/private_constant_handler_spec.rb +0 -25
- data/spec/handlers/processor_spec.rb +0 -35
- data/spec/handlers/public_class_method_handler_spec.rb +0 -11
- data/spec/handlers/ruby/base_spec.rb +0 -95
- data/spec/handlers/ruby/legacy/base_spec.rb +0 -84
- data/spec/handlers/spec_helper.rb +0 -33
- data/spec/handlers/visibility_handler_spec.rb +0 -44
- data/spec/handlers/yield_handler_spec.rb +0 -52
- data/spec/i18n/locale_spec.rb +0 -81
- data/spec/i18n/message_spec.rb +0 -52
- data/spec/i18n/messages_spec.rb +0 -67
- data/spec/i18n/pot_generator_spec.rb +0 -295
- data/spec/i18n/text_spec.rb +0 -184
- data/spec/logging_spec.rb +0 -44
- data/spec/options_spec.rb +0 -171
- data/spec/parser/base_spec.rb +0 -24
- data/spec/parser/c_parser_spec.rb +0 -236
- data/spec/parser/examples/array.c.txt +0 -6267
- data/spec/parser/examples/example1.rb.txt +0 -8
- data/spec/parser/examples/extrafile.c.txt +0 -8
- data/spec/parser/examples/file.c.txt +0 -28
- data/spec/parser/examples/multifile.c.txt +0 -22
- data/spec/parser/examples/namespace.cpp.txt +0 -68
- data/spec/parser/examples/override.c.txt +0 -424
- data/spec/parser/examples/parse_in_order_001.rb.txt +0 -2
- data/spec/parser/examples/parse_in_order_002.rb.txt +0 -2
- data/spec/parser/examples/tag_handler_001.rb.txt +0 -8
- data/spec/parser/ruby/ast_node_spec.rb +0 -33
- data/spec/parser/ruby/legacy/statement_list_spec.rb +0 -299
- data/spec/parser/ruby/legacy/token_list_spec.rb +0 -79
- data/spec/parser/ruby/ruby_parser_spec.rb +0 -520
- data/spec/parser/ruby/token_resolver_spec.rb +0 -165
- data/spec/parser/source_parser_spec.rb +0 -727
- data/spec/parser/tag_parsing_spec.rb +0 -17
- data/spec/rake/yardoc_task_spec.rb +0 -118
- data/spec/registry_resolver_spec.rb +0 -15
- data/spec/registry_spec.rb +0 -463
- data/spec/registry_store_spec.rb +0 -327
- data/spec/rubygems/doc_manager_spec.rb +0 -112
- data/spec/serializers/data/serialized_yardoc/checksums +0 -1
- data/spec/serializers/data/serialized_yardoc/objects/Foo.dat +0 -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/root.dat +0 -0
- data/spec/serializers/data/serialized_yardoc/proxy_types +0 -2
- data/spec/serializers/file_system_serializer_spec.rb +0 -145
- data/spec/serializers/spec_helper.rb +0 -2
- data/spec/serializers/yardoc_serializer_spec.rb +0 -90
- data/spec/server/adapter_spec.rb +0 -39
- data/spec/server/commands/base_spec.rb +0 -91
- data/spec/server/commands/library_command_spec.rb +0 -39
- data/spec/server/doc_server_helper_spec.rb +0 -72
- data/spec/server/doc_server_serializer_spec.rb +0 -60
- data/spec/server/rack_adapter_spec.rb +0 -21
- data/spec/server/router_spec.rb +0 -123
- data/spec/server/spec_helper.rb +0 -22
- data/spec/server/static_caching_spec.rb +0 -47
- data/spec/server/webrick_servlet_spec.rb +0 -20
- data/spec/server_spec.rb +0 -19
- data/spec/spec_helper.rb +0 -212
- data/spec/tags/default_factory_spec.rb +0 -168
- data/spec/tags/default_tag_spec.rb +0 -11
- data/spec/tags/directives_spec.rb +0 -463
- data/spec/tags/library_spec.rb +0 -48
- data/spec/tags/overload_tag_spec.rb +0 -53
- data/spec/tags/ref_tag_list_spec.rb +0 -53
- data/spec/tags/types_explainer_spec.rb +0 -203
- data/spec/templates/class_spec.rb +0 -45
- data/spec/templates/constant_spec.rb +0 -41
- data/spec/templates/engine_spec.rb +0 -131
- data/spec/templates/examples/class001.html +0 -308
- data/spec/templates/examples/class001.txt +0 -36
- data/spec/templates/examples/class002.html +0 -39
- data/spec/templates/examples/constant001.txt +0 -25
- data/spec/templates/examples/constant002.txt +0 -7
- data/spec/templates/examples/constant003.txt +0 -11
- data/spec/templates/examples/method001.html +0 -137
- data/spec/templates/examples/method001.txt +0 -35
- data/spec/templates/examples/method002.html +0 -91
- data/spec/templates/examples/method002.txt +0 -20
- data/spec/templates/examples/method003.html +0 -165
- data/spec/templates/examples/method003.txt +0 -45
- data/spec/templates/examples/method004.html +0 -48
- data/spec/templates/examples/method004.txt +0 -10
- data/spec/templates/examples/method005.html +0 -105
- data/spec/templates/examples/method005.txt +0 -33
- data/spec/templates/examples/method006.html +0 -108
- data/spec/templates/examples/method006.txt +0 -20
- data/spec/templates/examples/module001.dot +0 -33
- data/spec/templates/examples/module001.html +0 -833
- data/spec/templates/examples/module001.txt +0 -33
- data/spec/templates/examples/module002.html +0 -341
- data/spec/templates/examples/module003.html +0 -202
- data/spec/templates/examples/module004.html +0 -394
- data/spec/templates/examples/module005.html +0 -82
- data/spec/templates/examples/tag001.txt +0 -82
- data/spec/templates/helpers/base_helper_spec.rb +0 -171
- data/spec/templates/helpers/html_helper_spec.rb +0 -666
- data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +0 -65
- data/spec/templates/helpers/markup/rdoc_markup_spec.rb +0 -84
- data/spec/templates/helpers/markup_helper_spec.rb +0 -136
- data/spec/templates/helpers/method_helper_spec.rb +0 -107
- data/spec/templates/helpers/module_helper_spec.rb +0 -35
- data/spec/templates/helpers/shared_signature_examples.rb +0 -126
- data/spec/templates/helpers/text_helper_spec.rb +0 -65
- data/spec/templates/markup_processor_integrations/asciidoctor_spec.rb +0 -60
- data/spec/templates/markup_processor_integrations/integration_spec_helper.rb +0 -50
- data/spec/templates/markup_processor_integrations/rdoc_markdown_spec.rb +0 -48
- data/spec/templates/markup_processor_integrations/rdoc_spec.rb +0 -39
- data/spec/templates/markup_processor_integrations/redcarpet_spec.rb +0 -64
- data/spec/templates/markup_processor_integrations/redcloth_spec.rb +0 -64
- data/spec/templates/method_spec.rb +0 -118
- data/spec/templates/module_spec.rb +0 -203
- data/spec/templates/onefile_spec.rb +0 -66
- data/spec/templates/section_spec.rb +0 -144
- data/spec/templates/spec_helper.rb +0 -76
- data/spec/templates/tag_spec.rb +0 -52
- data/spec/templates/template_spec.rb +0 -410
- data/spec/verifier_spec.rb +0 -106
@@ -1,82 +0,0 @@
|
|
1
|
-
------------------------------------------------------------- Method: #m
|
2
|
-
(Defined in: (stdin))
|
3
|
-
|
4
|
-
root.m(opts = {}) {|a| ... } -> String
|
5
|
-
------------------------------------------------------------------------
|
6
|
-
|
7
|
-
Deprecated. for great justice
|
8
|
-
|
9
|
-
Abstract. override me
|
10
|
-
|
11
|
-
Comments
|
12
|
-
|
13
|
-
Examples:
|
14
|
-
---------
|
15
|
-
|
16
|
-
# Wash your car
|
17
|
-
car.wash
|
18
|
-
|
19
|
-
# To kill a mockingbird
|
20
|
-
a = String.new
|
21
|
-
flip(a.reverse)
|
22
|
-
|
23
|
-
Parameters:
|
24
|
-
-----------
|
25
|
-
|
26
|
-
(Hash) opts - the options
|
27
|
-
|
28
|
-
Options Hash (opts):
|
29
|
-
--------------------
|
30
|
-
|
31
|
-
(Object) :key - default: '' - hello
|
32
|
-
|
33
|
-
(Object) :key2 - default: X - hello
|
34
|
-
|
35
|
-
Yields:
|
36
|
-
-------
|
37
|
-
|
38
|
-
- a block
|
39
|
-
|
40
|
-
Yield Parameters:
|
41
|
-
-----------------
|
42
|
-
|
43
|
-
(String) a - a value
|
44
|
-
|
45
|
-
Yield Returns:
|
46
|
-
--------------
|
47
|
-
|
48
|
-
(Hash) - a hash
|
49
|
-
|
50
|
-
Returns:
|
51
|
-
--------
|
52
|
-
|
53
|
-
(String) - the result
|
54
|
-
|
55
|
-
Raises:
|
56
|
-
-------
|
57
|
-
|
58
|
-
(Exception) - Exception class
|
59
|
-
|
60
|
-
See Also:
|
61
|
-
---------
|
62
|
-
|
63
|
-
- A
|
64
|
-
- http://url.com
|
65
|
-
- http://url.com - Example
|
66
|
-
|
67
|
-
Author:
|
68
|
-
-------
|
69
|
-
|
70
|
-
Name
|
71
|
-
|
72
|
-
Since:
|
73
|
-
------
|
74
|
-
|
75
|
-
1.0
|
76
|
-
|
77
|
-
Version:
|
78
|
-
--------
|
79
|
-
|
80
|
-
1.0
|
81
|
-
|
82
|
-
|
@@ -1,171 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.describe YARD::Templates::Helpers::BaseHelper do
|
4
|
-
include YARD::Templates::Helpers::BaseHelper
|
5
|
-
|
6
|
-
describe "#run_verifier" do
|
7
|
-
it "runs verifier proc against list if provided" do
|
8
|
-
mock = Verifier.new
|
9
|
-
expect(mock).to receive(:call).with(1)
|
10
|
-
expect(mock).to receive(:call).with(2)
|
11
|
-
expect(mock).to receive(:call).with(3)
|
12
|
-
expect(self).to receive(:options).at_least(1).times.and_return(Options.new.update(:verifier => mock))
|
13
|
-
run_verifier [1, 2, 3]
|
14
|
-
end
|
15
|
-
|
16
|
-
it "prunes list if lambda returns false and only false" do
|
17
|
-
mock = Verifier.new
|
18
|
-
expect(self).to receive(:options).at_least(1).times.and_return(Options.new.update(:verifier => mock))
|
19
|
-
expect(mock).to receive(:call).with(1).and_return(false)
|
20
|
-
expect(mock).to receive(:call).with(2).and_return(true)
|
21
|
-
expect(mock).to receive(:call).with(3).and_return(nil)
|
22
|
-
expect(mock).to receive(:call).with(4).and_return("value")
|
23
|
-
expect(run_verifier([1, 2, 3, 4])).to eq [2, 3, 4]
|
24
|
-
end
|
25
|
-
|
26
|
-
it "returns list if no verifier exists" do
|
27
|
-
expect(self).to receive(:options).at_least(1).times.and_return(Options.new)
|
28
|
-
expect(run_verifier([1, 2, 3])).to eq [1, 2, 3]
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
describe "#h" do
|
33
|
-
it "returns just the text" do
|
34
|
-
expect(h("hello world")).to eq "hello world"
|
35
|
-
expect(h(nil)).to eq nil
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
describe "#link_object" do
|
40
|
-
it "returns the title if provided" do
|
41
|
-
expect(link_object(1, "title")).to eq "title"
|
42
|
-
expect(link_object(Registry.root, "title")).to eq "title"
|
43
|
-
end
|
44
|
-
|
45
|
-
it "returns a path if argument is a Proxy or object" do
|
46
|
-
expect(link_object(Registry.root)).to eq "Top Level Namespace"
|
47
|
-
expect(link_object(P("Array"))).to eq "Array"
|
48
|
-
end
|
49
|
-
|
50
|
-
it "returns path of Proxified object if argument is a String or Symbol" do
|
51
|
-
expect(link_object("Array")).to eq "Array"
|
52
|
-
expect(link_object(:"A::B")).to eq "A::B"
|
53
|
-
end
|
54
|
-
|
55
|
-
it "returns the argument if not an object, proxy, String or Symbol" do
|
56
|
-
expect(link_object(1)).to eq 1
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
describe "#link_url" do
|
61
|
-
it "returns the URL" do
|
62
|
-
expect(link_url("http://url")).to eq "http://url"
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
describe "#linkify" do
|
67
|
-
let(:object) { Registry.root }
|
68
|
-
# before do
|
69
|
-
# stub!(:object).and_return(Registry.root)
|
70
|
-
# end
|
71
|
-
|
72
|
-
it "calls #link_url for mailto: links" do
|
73
|
-
expect(self).to receive(:link_url)
|
74
|
-
linkify("mailto:steve@example.com")
|
75
|
-
end
|
76
|
-
|
77
|
-
it "calls #link_url for URL schemes (http://)" do
|
78
|
-
expect(self).to receive(:link_url)
|
79
|
-
linkify("http://example.com")
|
80
|
-
end
|
81
|
-
|
82
|
-
it "calls #link_file for file: links" do
|
83
|
-
expect(self).to receive(:link_file).with('Filename', nil, 'anchor')
|
84
|
-
linkify("file:Filename#anchor")
|
85
|
-
end
|
86
|
-
|
87
|
-
it "passes off to #link_object if argument is an object" do
|
88
|
-
obj = CodeObjects::NamespaceObject.new(nil, :YARD)
|
89
|
-
expect(self).to receive(:link_object).with(obj)
|
90
|
-
linkify obj
|
91
|
-
end
|
92
|
-
|
93
|
-
it "returns empty string and warn if object does not exist" do
|
94
|
-
expect(log).to receive(:warn).with(/Cannot find object .* for inclusion/)
|
95
|
-
expect(linkify('include:NotExist')).to eq ''
|
96
|
-
end
|
97
|
-
|
98
|
-
it "passes off to #link_url if argument is recognized as a URL" do
|
99
|
-
url = "http://yardoc.org/"
|
100
|
-
expect(self).to receive(:link_url).with(url, nil, :target => '_parent')
|
101
|
-
linkify url
|
102
|
-
end
|
103
|
-
|
104
|
-
it "calls #link_include_object for include:ObjectName" do
|
105
|
-
obj = CodeObjects::NamespaceObject.new(:root, :Foo)
|
106
|
-
expect(self).to receive(:link_include_object).with(obj)
|
107
|
-
linkify 'include:Foo'
|
108
|
-
end
|
109
|
-
|
110
|
-
it "calls #link_include_file for include:file:path/to/file" do
|
111
|
-
expect(File).to receive(:file?).with('path/to/file').and_return(true)
|
112
|
-
expect(File).to receive(:read).with('path/to/file').and_return('FOO')
|
113
|
-
expect(linkify('include:file:path/to/file')).to eq 'FOO'
|
114
|
-
end
|
115
|
-
|
116
|
-
it "does not allow include:file for path above pwd" do
|
117
|
-
expect(log).to receive(:warn).with("Cannot include file from path `a/b/../../../../file'")
|
118
|
-
expect(linkify('include:file:a/b/../../../../file')).to eq ''
|
119
|
-
end
|
120
|
-
|
121
|
-
it "warns if include:file:path does not exist" do
|
122
|
-
expect(log).to receive(:warn).with(/Cannot find file .+ for inclusion/)
|
123
|
-
expect(linkify('include:file:notexist')).to eq ''
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
describe "#format_types" do
|
128
|
-
it "returns the list of types separated by commas surrounded by brackets" do
|
129
|
-
expect(format_types(['a', 'b', 'c'])).to eq '(a, b, c)'
|
130
|
-
end
|
131
|
-
|
132
|
-
it "returns the list of types without brackets if brackets=false" do
|
133
|
-
expect(format_types(['a', 'b', 'c'], false)).to eq 'a, b, c'
|
134
|
-
end
|
135
|
-
|
136
|
-
it "returns an empty string if list is empty or nil" do
|
137
|
-
expect(format_types(nil)).to eq ""
|
138
|
-
expect(format_types([])).to eq ""
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
describe "#format_object_type" do
|
143
|
-
it "returns Exception if type is Exception" do
|
144
|
-
obj = double(:object, :is_exception? => true)
|
145
|
-
allow(obj).to receive(:is_a?) {|arg| arg == YARD::CodeObjects::ClassObject }
|
146
|
-
expect(format_object_type(obj)).to eq "Exception"
|
147
|
-
end
|
148
|
-
|
149
|
-
it "returns Class if type is Class" do
|
150
|
-
obj = double(:object, :is_exception? => false)
|
151
|
-
allow(obj).to receive(:is_a?) {|arg| arg == YARD::CodeObjects::ClassObject }
|
152
|
-
expect(format_object_type(obj)).to eq "Class"
|
153
|
-
end
|
154
|
-
|
155
|
-
it "returns object type in other cases" do
|
156
|
-
obj = double(:object, :type => "value")
|
157
|
-
expect(format_object_type(obj)).to eq "Value"
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
describe "#format_object_title" do
|
162
|
-
it "returns Top Level Namespace for root object" do
|
163
|
-
expect(format_object_title(Registry.root)).to eq "Top Level Namespace"
|
164
|
-
end
|
165
|
-
|
166
|
-
it "returns 'type: title' in other cases" do
|
167
|
-
obj = double(:object, :type => :class, :title => "A::B::C")
|
168
|
-
expect(format_object_title(obj)).to eq "Class: A::B::C"
|
169
|
-
end
|
170
|
-
end
|
171
|
-
end
|
@@ -1,666 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require File.dirname(__FILE__) + "/shared_signature_examples"
|
3
|
-
require 'ostruct'
|
4
|
-
|
5
|
-
RSpec.describe YARD::Templates::Helpers::HtmlHelper do
|
6
|
-
include YARD::Templates::Helpers::BaseHelper
|
7
|
-
include YARD::Templates::Helpers::HtmlHelper
|
8
|
-
include YARD::Templates::Helpers::MethodHelper
|
9
|
-
|
10
|
-
def options
|
11
|
-
Templates::TemplateOptions.new.tap do |o|
|
12
|
-
o.reset_defaults
|
13
|
-
o.default_return = nil
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
describe "#h" do
|
18
|
-
it "uses #h to escape HTML" do
|
19
|
-
expect(h('Usage: foo "bar" <baz>')).to eq "Usage: foo "bar" <baz>"
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
describe "#charset" do
|
24
|
-
it "returns foo if LANG=foo" do
|
25
|
-
expect(ENV).to receive(:[]).with('LANG').and_return('shift_jis') if YARD.ruby18?
|
26
|
-
expect(Encoding.default_external).to receive(:name).and_return('shift_jis') if defined?(Encoding)
|
27
|
-
expect(charset).to eq 'shift_jis'
|
28
|
-
end
|
29
|
-
|
30
|
-
['US-ASCII', 'ASCII-7BIT', 'ASCII-8BIT'].each do |type|
|
31
|
-
it "converts #{type} to iso-8859-1" do
|
32
|
-
expect(ENV).to receive(:[]).with('LANG').and_return(type) if YARD.ruby18?
|
33
|
-
expect(Encoding.default_external).to receive(:name).and_return(type) if defined?(Encoding)
|
34
|
-
expect(charset).to eq 'iso-8859-1'
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
it "supports utf8 as an encoding value for utf-8" do
|
39
|
-
type = 'utf8'
|
40
|
-
expect(ENV).to receive(:[]).with('LANG').and_return(type) if YARD.ruby18?
|
41
|
-
expect(Encoding.default_external).to receive(:name).and_return(type) if defined?(Encoding)
|
42
|
-
expect(charset).to eq 'utf-8'
|
43
|
-
end
|
44
|
-
|
45
|
-
it "takes file encoding if there is a file" do
|
46
|
-
@file = OpenStruct.new(:contents => String.new('foo').force_encoding('sjis'))
|
47
|
-
# not the correct charset name, but good enough
|
48
|
-
expect(['Shift_JIS', 'Windows-31J']).to include(charset)
|
49
|
-
end if YARD.ruby19?
|
50
|
-
|
51
|
-
it "takes file encoding if there is a file" do
|
52
|
-
allow(ENV).to receive(:[]).with('LANG').and_return('utf-8') if YARD.ruby18?
|
53
|
-
@file = OpenStruct.new(:contents => 'foo')
|
54
|
-
expect(charset).to eq 'utf-8'
|
55
|
-
end if YARD.ruby18?
|
56
|
-
|
57
|
-
if YARD.ruby18?
|
58
|
-
it "returns utf-8 if no LANG env is set" do
|
59
|
-
expect(ENV).to receive(:[]).with('LANG').and_return(nil)
|
60
|
-
expect(charset).to eq 'utf-8'
|
61
|
-
end
|
62
|
-
|
63
|
-
it "only returns charset part of lang" do
|
64
|
-
expect(ENV).to receive(:[]).with('LANG').and_return('en_US.UTF-8')
|
65
|
-
expect(charset).to eq 'utf-8'
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
describe "#format_types" do
|
71
|
-
it "includes brackets by default" do
|
72
|
-
text = ["String"]
|
73
|
-
expect(self).to receive(:linkify).at_least(1).times.with("String", "String").and_return("String")
|
74
|
-
expect(format_types(text)).to eq format_types(text, true)
|
75
|
-
expect(format_types(text)).to eq "(<tt>String</tt>)"
|
76
|
-
end
|
77
|
-
|
78
|
-
it "avoids brackets if brackets=false" do
|
79
|
-
expect(self).to receive(:linkify).with("String", "String").and_return("String")
|
80
|
-
expect(self).to receive(:linkify).with("Symbol", "Symbol").and_return("Symbol")
|
81
|
-
expect(format_types(["String", "Symbol"], false)).to eq "<tt>String</tt>, <tt>Symbol</tt>"
|
82
|
-
end
|
83
|
-
|
84
|
-
{"String" => [["String"],
|
85
|
-
"<tt><a href=''>String</a></tt>"],
|
86
|
-
"A::B::C" => [["A::B::C"],
|
87
|
-
"<tt><a href=''>A::B::C</a></tt>"],
|
88
|
-
"Array<String>" => [["Array", "String"],
|
89
|
-
"<tt><a href=''>Array</a><<a href=''>String</a>></tt>"],
|
90
|
-
"Array<String, Symbol>" => [["Array", "String", "Symbol"],
|
91
|
-
"<tt><a href=''>Array</a><<a href=''>String</a>, <a href=''>Symbol</a>></tt>"],
|
92
|
-
"Array<{String => Array<Symbol>}>" => [["Array", "String", "Array", "Symbol"],
|
93
|
-
"<tt><a href=''>Array</a><{<a href=''>String</a> => " \
|
94
|
-
"<a href=''>Array</a><<a href=''>Symbol</a>>}></tt>"]}.each do |text, values|
|
95
|
-
it "links all classes in #{text}" do
|
96
|
-
if text.count('<') > 0
|
97
|
-
expect(self).to receive(:h).with('<').at_least(text.count('<')).times.and_return("<")
|
98
|
-
end
|
99
|
-
if text.count('>') > 0
|
100
|
-
expect(self).to receive(:h).with('>').at_least(text.count('>')).times.and_return(">")
|
101
|
-
end
|
102
|
-
values[0].each {|v| expect(self).to receive(:linkify).with(v, v).and_return("<a href=''>#{v}</a>") }
|
103
|
-
expect(format_types([text], false)).to eq values[1]
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
describe "#htmlify" do
|
109
|
-
it "handles various encodings" do
|
110
|
-
allow(self).to receive(:object).and_return(Registry.root)
|
111
|
-
text = String.new("\xB0\xB1")
|
112
|
-
if defined?(Encoding)
|
113
|
-
utf8 = Encoding.find('utf-8')
|
114
|
-
|
115
|
-
Encoding.default_internal = utf8 unless Encoding.default_internal == utf8
|
116
|
-
text = text.force_encoding('binary')
|
117
|
-
end
|
118
|
-
htmlify(text, :text)
|
119
|
-
# TODO: add more encoding tests
|
120
|
-
end
|
121
|
-
|
122
|
-
it "returns pre-formatted text with :pre markup" do
|
123
|
-
expect(htmlify("fo\no\n\nbar<>", :pre)).to eq "<pre>fo\no\n\nbar<></pre>"
|
124
|
-
end
|
125
|
-
|
126
|
-
it "returns regular text with :text markup" do
|
127
|
-
expect(htmlify("fo\no\n\nbar<>", :text)).to eq "fo<br/>o<br/><br/>bar<>"
|
128
|
-
end
|
129
|
-
|
130
|
-
it "returns unmodified text with :none markup" do
|
131
|
-
expect(htmlify("fo\no\n\nbar<>", :none)).to eq "fo\no\n\nbar<>"
|
132
|
-
end
|
133
|
-
|
134
|
-
it "highlights ruby if markup is :ruby" do
|
135
|
-
expect(htmlify("class Foo; end", :ruby)).to match(/\A<pre class="code ruby"><span/)
|
136
|
-
end
|
137
|
-
|
138
|
-
it "includes file and htmlifies it" do
|
139
|
-
load_markup_provider(:rdoc)
|
140
|
-
expect(File).to receive(:file?).with('foo.rdoc').and_return(true)
|
141
|
-
expect(File).to receive(:read).with('foo.rdoc').and_return('HI')
|
142
|
-
expect(htmlify("{include:file:foo.rdoc}", :rdoc).gsub(/\s+/, '')).to eq "<p>HI</p>"
|
143
|
-
end
|
144
|
-
|
145
|
-
it "allows inline includes for {include:} in the middle of a line" do
|
146
|
-
load_markup_provider(:rdoc)
|
147
|
-
expect(File).to receive(:file?).with('foo.rdoc').and_return(true)
|
148
|
-
expect(File).to receive(:read).with('foo.rdoc').and_return('HI')
|
149
|
-
expect(htmlify("test {include:file:foo.rdoc}", :rdoc).gsub(/[\r?\n]+/, '')).to eq '<p>test HI</p>'
|
150
|
-
end
|
151
|
-
|
152
|
-
it "does not autolink URLs inside of {} (markdown specific)" do
|
153
|
-
log.enter_level(Logger::FATAL) do
|
154
|
-
pending 'This test depends on markdown' unless markup_class(:markdown)
|
155
|
-
end
|
156
|
-
expect(htmlify('{http://example.com Title}', :markdown).chomp).to match(
|
157
|
-
%r{<p><a href="http://example.com".*>Title</a></p>}
|
158
|
-
)
|
159
|
-
expect(htmlify('{http://example.com}', :markdown).chomp).to match(
|
160
|
-
%r{<p><a href="http://example.com".*>http://example.com</a></p>}
|
161
|
-
)
|
162
|
-
end
|
163
|
-
|
164
|
-
it "creates tables (markdown specific)" do
|
165
|
-
log.enter_level(Logger::FATAL) do
|
166
|
-
supports_table = %w(RedcarpetCompat Kramdown::Document)
|
167
|
-
unless supports_table.include?(markup_class(:markdown).to_s)
|
168
|
-
pending "This test depends on a markdown engine that supports tables"
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
markdown = <<-EOF.strip
|
173
|
-
City | State | Country
|
174
|
-
--------|-------|--------
|
175
|
-
Raleigh | NC | US
|
176
|
-
Seattle | WA | US
|
177
|
-
EOF
|
178
|
-
|
179
|
-
html = htmlify(markdown, :markdown)
|
180
|
-
expect(html).to match(/<table>/)
|
181
|
-
expect(html).to match %r{<th>City</th>}
|
182
|
-
expect(html).to match %r{<td>NC</td>}
|
183
|
-
end
|
184
|
-
|
185
|
-
it "handles fenced code blocks (Redcarpet specific)" do
|
186
|
-
log.enter_level(Logger::FATAL) do
|
187
|
-
unless markup_class(:markdown).to_s == 'RedcarpetCompat'
|
188
|
-
pending 'This test is Redcarpet specific'
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
|
-
markdown = "Introduction:\n```ruby\nputs\n\nputs\n```"
|
193
|
-
html = htmlify(markdown, :markdown)
|
194
|
-
expect(html).to match %r{^<p>Introduction:</p>.*<code class="ruby">}m
|
195
|
-
end
|
196
|
-
|
197
|
-
it "sets env and env-yard attributes (AsciiDoc specific)" do
|
198
|
-
adoc = <<-EOF.strip.gsub(/^ +/, "") # strip and unindent
|
199
|
-
ifdef::env[]
|
200
|
-
Attribute "env" is set, and its value is "{env}".
|
201
|
-
endif::[]
|
202
|
-
|
203
|
-
ifdef::env-yard[]
|
204
|
-
Attribute "env-yard" is set, and its value is "{env-yard}".
|
205
|
-
endif::[]
|
206
|
-
EOF
|
207
|
-
html = htmlify(adoc, :asciidoc)
|
208
|
-
expect(html).to match(/"env" is set, and its value is "yard"./)
|
209
|
-
expect(html).to match(/"env-yard" is set, and its value is ""./)
|
210
|
-
end
|
211
|
-
|
212
|
-
it "should not include the document title from the AsciiDoc header" do
|
213
|
-
adoc = <<-EOF.strip.gsub(/^ +/, "") # strip and unindent
|
214
|
-
= Project Name
|
215
|
-
|
216
|
-
Introduction.
|
217
|
-
|
218
|
-
== Installation
|
219
|
-
|
220
|
-
Installation instructions.
|
221
|
-
|
222
|
-
== Usage
|
223
|
-
|
224
|
-
Usage instructions.
|
225
|
-
EOF
|
226
|
-
html = htmlify(adoc, :asciidoc)
|
227
|
-
expect(html).to_not match(/Project Name/)
|
228
|
-
expect(html).to include(%(<h2 id="_installation">Installation</h2>))
|
229
|
-
end
|
230
|
-
end
|
231
|
-
|
232
|
-
describe "#link_object" do
|
233
|
-
let(:object) { CodeObjects::NamespaceObject.new(nil, :YARD) }
|
234
|
-
|
235
|
-
it "returns the object path if there's no serializer and no title" do
|
236
|
-
allow(self).to receive(:serializer).and_return(nil)
|
237
|
-
expect(link_object(CodeObjects::NamespaceObject.new(nil, :YARD))).to eq "YARD"
|
238
|
-
end
|
239
|
-
|
240
|
-
it "returns the title if there's a title but no serializer" do
|
241
|
-
allow(self).to receive(:serializer).and_return(nil)
|
242
|
-
expect(link_object(CodeObjects::NamespaceObject.new(nil, :YARD), 'title')).to eq "title"
|
243
|
-
end
|
244
|
-
|
245
|
-
it "links objects from overload tag" do
|
246
|
-
YARD.parse_string <<-'eof'
|
247
|
-
module Foo
|
248
|
-
class Bar; def a; end end
|
249
|
-
class Baz
|
250
|
-
# @overload a
|
251
|
-
def a; end
|
252
|
-
end
|
253
|
-
end
|
254
|
-
eof
|
255
|
-
obj = Registry.at('Foo::Baz#a').tag(:overload)
|
256
|
-
allow(self).to receive(:serializer).and_return(Serializers::FileSystemSerializer.new)
|
257
|
-
allow(self).to receive(:object).and_return(obj)
|
258
|
-
expect(link_object("Bar#a")).to match(/href="Bar.html#a-instance_method"/)
|
259
|
-
end
|
260
|
-
|
261
|
-
it "uses relative path in title" do
|
262
|
-
CodeObjects::ModuleObject.new(:root, :YARD)
|
263
|
-
CodeObjects::ClassObject.new(P('YARD'), :Bar)
|
264
|
-
allow(self).to receive(:object).and_return(CodeObjects::ModuleObject.new(P('YARD'), :Foo))
|
265
|
-
allow(self).to receive(:serializer).and_return(Serializers::FileSystemSerializer.new)
|
266
|
-
expect(link_object("Bar")).to match %r{>Bar</a>}
|
267
|
-
end
|
268
|
-
|
269
|
-
it "uses #title if overridden" do
|
270
|
-
CodeObjects::ModuleObject.new(:root, :YARD)
|
271
|
-
CodeObjects::ClassObject.new(P('YARD'), :Bar)
|
272
|
-
allow(Registry.at('YARD::Bar')).to receive(:title).and_return('TITLE!')
|
273
|
-
allow(self).to receive(:object).and_return(Registry.at('YARD::Bar'))
|
274
|
-
allow(self).to receive(:serializer).and_return(Serializers::FileSystemSerializer.new)
|
275
|
-
expect(link_object("Bar")).to match %r{>TITLE!</a>}
|
276
|
-
end
|
277
|
-
|
278
|
-
it "uses relative path to parent class in title" do
|
279
|
-
root = CodeObjects::ModuleObject.new(:root, :YARD)
|
280
|
-
obj = CodeObjects::ModuleObject.new(root, :SubModule)
|
281
|
-
allow(self).to receive(:object).and_return(obj)
|
282
|
-
allow(self).to receive(:serializer).and_return(Serializers::FileSystemSerializer.new)
|
283
|
-
expect(link_object("YARD")).to match %r{>YARD</a>}
|
284
|
-
end
|
285
|
-
|
286
|
-
it "uses Klass.foo when linking to class method in current namespace" do
|
287
|
-
root = CodeObjects::ModuleObject.new(:root, :Klass)
|
288
|
-
CodeObjects::MethodObject.new(root, :foo, :class)
|
289
|
-
allow(self).to receive(:object).and_return(root)
|
290
|
-
allow(self).to receive(:serializer).and_return(Serializers::FileSystemSerializer.new)
|
291
|
-
expect(link_object("foo")).to match %r{>Klass.foo</a>}
|
292
|
-
end
|
293
|
-
|
294
|
-
it "escapes method name in title" do
|
295
|
-
YARD.parse_string <<-'eof'
|
296
|
-
class Array
|
297
|
-
def &(other)
|
298
|
-
end
|
299
|
-
end
|
300
|
-
eof
|
301
|
-
obj = Registry.at('Array#&')
|
302
|
-
allow(self).to receive(:serializer).and_return(Serializers::FileSystemSerializer.new)
|
303
|
-
allow(self).to receive(:object).and_return(obj)
|
304
|
-
expect(link_object("Array#&")).to match(/title="Array#& \(method\)"/)
|
305
|
-
end
|
306
|
-
end
|
307
|
-
|
308
|
-
describe "#url_for" do
|
309
|
-
before { Registry.clear }
|
310
|
-
|
311
|
-
it "returns nil if serializer is nil" do
|
312
|
-
allow(self).to receive(:serializer).and_return nil
|
313
|
-
allow(self).to receive(:object).and_return Registry.root
|
314
|
-
expect(url_for(P("Mod::Class#meth"))).to be nil
|
315
|
-
end
|
316
|
-
|
317
|
-
it "returns nil if object is hidden" do
|
318
|
-
yard = CodeObjects::ModuleObject.new(:root, :YARD)
|
319
|
-
|
320
|
-
allow(self).to receive(:serializer).and_return(Serializers::FileSystemSerializer.new)
|
321
|
-
allow(self).to receive(:object).and_return Registry.root
|
322
|
-
allow(self).to receive(:options).and_return OpenStruct.new(:verifier => Verifier.new('false'))
|
323
|
-
|
324
|
-
expect(url_for(yard)).to be nil
|
325
|
-
end
|
326
|
-
|
327
|
-
it "returns nil if serializer does not implement #serialized_path" do
|
328
|
-
allow(self).to receive(:serializer).and_return Serializers::Base.new
|
329
|
-
allow(self).to receive(:object).and_return Registry.root
|
330
|
-
expect(url_for(P("Mod::Class#meth"))).to be nil
|
331
|
-
end
|
332
|
-
|
333
|
-
it "links to a path/file for a namespace object" do
|
334
|
-
allow(self).to receive(:serializer).and_return Serializers::FileSystemSerializer.new
|
335
|
-
allow(self).to receive(:object).and_return Registry.root
|
336
|
-
|
337
|
-
yard = CodeObjects::ModuleObject.new(:root, :YARD)
|
338
|
-
expect(url_for(yard)).to eq 'YARD.html'
|
339
|
-
end
|
340
|
-
|
341
|
-
it "links to the object's namespace path/file and use the object as the anchor" do
|
342
|
-
allow(self).to receive(:serializer).and_return Serializers::FileSystemSerializer.new
|
343
|
-
allow(self).to receive(:object).and_return Registry.root
|
344
|
-
|
345
|
-
yard = CodeObjects::ModuleObject.new(:root, :YARD)
|
346
|
-
meth = CodeObjects::MethodObject.new(yard, :meth)
|
347
|
-
expect(url_for(meth)).to eq 'YARD.html#meth-instance_method'
|
348
|
-
end
|
349
|
-
|
350
|
-
it "properly urlencodes methods with punctuation in links" do
|
351
|
-
obj = CodeObjects::MethodObject.new(nil, :/)
|
352
|
-
serializer = double(:serializer, :serialized_path => "file.html")
|
353
|
-
allow(self).to receive(:serializer).and_return serializer
|
354
|
-
allow(self).to receive(:object).and_return obj
|
355
|
-
expect(url_for(obj)).to eq "#%2F-instance_method"
|
356
|
-
end
|
357
|
-
end
|
358
|
-
|
359
|
-
describe "#anchor_for" do
|
360
|
-
it "does not urlencode data when called directly" do
|
361
|
-
obj = CodeObjects::MethodObject.new(nil, :/)
|
362
|
-
expect(anchor_for(obj)).to eq "/-instance_method"
|
363
|
-
end
|
364
|
-
end
|
365
|
-
|
366
|
-
describe "#resolve_links" do
|
367
|
-
def parse_link(link)
|
368
|
-
results = {}
|
369
|
-
link =~ %r{<a (.+?)>(.+?)</a>}m
|
370
|
-
params = $1
|
371
|
-
results[:inner_text] = $2
|
372
|
-
params.scan(/\s*(\S+?)=['"](.+?)['"]\s*/).each do |key, value|
|
373
|
-
results[key.to_sym] = value.gsub(/^["'](.+)["']$/, '\1')
|
374
|
-
end
|
375
|
-
results
|
376
|
-
end
|
377
|
-
|
378
|
-
it "escapes {} syntax with backslash (\\{foo bar})" do
|
379
|
-
input = '\{foo bar} \{XYZ} \{file:FOO} $\{N-M}'
|
380
|
-
output = '{foo bar} {XYZ} {file:FOO} ${N-M}'
|
381
|
-
expect(resolve_links(input)).to eq output
|
382
|
-
end
|
383
|
-
|
384
|
-
it "escapes {} syntax with ! (!{foo bar})" do
|
385
|
-
input = '!{foo bar} !{XYZ} !{file:FOO} $!{N-M}'
|
386
|
-
output = '{foo bar} {XYZ} {file:FOO} ${N-M}'
|
387
|
-
expect(resolve_links(input)).to eq output
|
388
|
-
end
|
389
|
-
|
390
|
-
it "links static files with file: prefix" do
|
391
|
-
allow(self).to receive(:serializer).and_return Serializers::FileSystemSerializer.new
|
392
|
-
allow(self).to receive(:object).and_return Registry.root
|
393
|
-
|
394
|
-
expect(parse_link(resolve_links("{file:TEST.txt#abc}"))).to eq(
|
395
|
-
:inner_text => "TEST",
|
396
|
-
:title => "TEST",
|
397
|
-
:href => "file.TEST.html#abc"
|
398
|
-
)
|
399
|
-
expect(parse_link(resolve_links("{file:TEST.txt title}"))).to eq(
|
400
|
-
:inner_text => "title",
|
401
|
-
:title => "title",
|
402
|
-
:href => "file.TEST.html"
|
403
|
-
)
|
404
|
-
end
|
405
|
-
|
406
|
-
it "creates regular links with http:// or https:// prefixes" do
|
407
|
-
expect(parse_link(resolve_links("{http://example.com}"))).to eq(
|
408
|
-
:inner_text => "http://example.com",
|
409
|
-
:target => "_parent",
|
410
|
-
:href => "http://example.com",
|
411
|
-
:title => "http://example.com"
|
412
|
-
)
|
413
|
-
expect(parse_link(resolve_links("{http://example.com title}"))).to eq(
|
414
|
-
:inner_text => "title",
|
415
|
-
:target => "_parent",
|
416
|
-
:href => "http://example.com",
|
417
|
-
:title => "title"
|
418
|
-
)
|
419
|
-
end
|
420
|
-
|
421
|
-
it "creates mailto links with mailto: prefixes" do
|
422
|
-
expect(parse_link(resolve_links('{mailto:joanna@example.com}'))).to eq(
|
423
|
-
:inner_text => 'mailto:joanna@example.com',
|
424
|
-
:target => '_parent',
|
425
|
-
:href => 'mailto:joanna@example.com',
|
426
|
-
:title => 'mailto:joanna@example.com'
|
427
|
-
)
|
428
|
-
expect(parse_link(resolve_links('{mailto:steve@example.com Steve}'))).to eq(
|
429
|
-
:inner_text => 'Steve',
|
430
|
-
:target => '_parent',
|
431
|
-
:href => 'mailto:steve@example.com',
|
432
|
-
:title => 'Steve'
|
433
|
-
)
|
434
|
-
end
|
435
|
-
|
436
|
-
it "ignores {links} that begin with |...|" do
|
437
|
-
expect(resolve_links("{|x|x == 1}")).to eq "{|x|x == 1}"
|
438
|
-
end
|
439
|
-
|
440
|
-
it "gracefully ignores {} in links" do
|
441
|
-
allow(self).to receive(:linkify).with('Foo', 'Foo').and_return('FOO')
|
442
|
-
expect(resolve_links("{} {} {Foo Foo}")).to eq '{} {} FOO'
|
443
|
-
end
|
444
|
-
|
445
|
-
%w(tt code pre).each do |tag|
|
446
|
-
it "ignores links in <#{tag}>" do
|
447
|
-
text = "<#{tag}>{Foo}</#{tag}>"
|
448
|
-
expect(resolve_links(text)).to eq text
|
449
|
-
end
|
450
|
-
end
|
451
|
-
|
452
|
-
it "resolves {Name}" do
|
453
|
-
expect(self).to receive(:link_file).with('TEST', nil, nil).and_return('')
|
454
|
-
resolve_links("{file:TEST}")
|
455
|
-
end
|
456
|
-
|
457
|
-
it "resolves ({Name})" do
|
458
|
-
expect(self).to receive(:link_file).with('TEST', nil, nil).and_return('')
|
459
|
-
resolve_links("({file:TEST})")
|
460
|
-
end
|
461
|
-
|
462
|
-
it "resolves link with newline in title-part" do
|
463
|
-
expect(parse_link(resolve_links("{http://example.com foo\nbar}"))).to eq(
|
464
|
-
:inner_text => "foo bar",
|
465
|
-
:target => "_parent",
|
466
|
-
:href => "http://example.com",
|
467
|
-
:title => "foo bar"
|
468
|
-
)
|
469
|
-
end
|
470
|
-
|
471
|
-
it "resolves links to methods whose names have been escaped" do
|
472
|
-
expect(self).to receive(:linkify).with('Object#<<', nil).and_return('')
|
473
|
-
resolve_links("{Object#<<}")
|
474
|
-
end
|
475
|
-
|
476
|
-
it "warns about missing reference at right file location for object" do
|
477
|
-
YARD.parse_string <<-eof
|
478
|
-
# Comments here
|
479
|
-
# And a reference to {InvalidObject}
|
480
|
-
class MyObject; end
|
481
|
-
eof
|
482
|
-
logger = double(:log)
|
483
|
-
expect(logger).to receive(:warn).ordered.with(
|
484
|
-
"In file `(stdin)':2: Cannot resolve link to InvalidObject from text:\n\t...{InvalidObject}"
|
485
|
-
)
|
486
|
-
allow(self).to receive(:log).and_return(logger)
|
487
|
-
allow(self).to receive(:object).and_return(Registry.at('MyObject'))
|
488
|
-
resolve_links(object.docstring)
|
489
|
-
end
|
490
|
-
|
491
|
-
it "shows ellipsis on either side if there is more on the line in a reference warning" do
|
492
|
-
YARD.parse_string <<-eof
|
493
|
-
# {InvalidObject1} beginning of line
|
494
|
-
# end of line {InvalidObject2}
|
495
|
-
# Middle of {InvalidObject3} line
|
496
|
-
# {InvalidObject4}
|
497
|
-
class MyObject; end
|
498
|
-
eof
|
499
|
-
logger = double(:log)
|
500
|
-
expect(logger).to receive(:warn).ordered.with("In file `(stdin)':1: Cannot resolve link to InvalidObject1 from text:\n\t{InvalidObject1}...")
|
501
|
-
expect(logger).to receive(:warn).ordered.with("In file `(stdin)':2: Cannot resolve link to InvalidObject2 from text:\n\t...{InvalidObject2}")
|
502
|
-
expect(logger).to receive(:warn).ordered.with("In file `(stdin)':3: Cannot resolve link to InvalidObject3 from text:\n\t...{InvalidObject3}...")
|
503
|
-
expect(logger).to receive(:warn).ordered.with("In file `(stdin)':4: Cannot resolve link to InvalidObject4 from text:\n\t{InvalidObject4}")
|
504
|
-
allow(self).to receive(:log).and_return(logger)
|
505
|
-
allow(self).to receive(:object).and_return(Registry.at('MyObject'))
|
506
|
-
resolve_links(object.docstring)
|
507
|
-
end
|
508
|
-
|
509
|
-
it "warns about missing reference for file template (no object)" do
|
510
|
-
@file = CodeObjects::ExtraFileObject.new('myfile.txt', '')
|
511
|
-
logger = double(:log)
|
512
|
-
expect(logger).to receive(:warn).ordered.with("In file `myfile.txt':3: Cannot resolve link to InvalidObject from text:\n\t...{InvalidObject Some Title}")
|
513
|
-
allow(self).to receive(:log).and_return(logger)
|
514
|
-
allow(self).to receive(:object).and_return(Registry.root)
|
515
|
-
resolve_links(<<-eof)
|
516
|
-
Hello world
|
517
|
-
This is a line
|
518
|
-
And {InvalidObject Some Title}
|
519
|
-
And more.
|
520
|
-
eof
|
521
|
-
end
|
522
|
-
end
|
523
|
-
|
524
|
-
describe "#signature" do
|
525
|
-
before do
|
526
|
-
arrow = "⇒"
|
527
|
-
@results = {
|
528
|
-
:regular => "#<strong>foo</strong> #{arrow} Object",
|
529
|
-
:default_return => "#<strong>foo</strong> #{arrow} Hello",
|
530
|
-
:no_default_return => "#<strong>foo</strong>",
|
531
|
-
:private_class => ".<strong>foo</strong> #{arrow} Object <span class=\"extras\">(private)</span>",
|
532
|
-
:single => "#<strong>foo</strong> #{arrow} String",
|
533
|
-
:two_types => "#<strong>foo</strong> #{arrow} String, Symbol",
|
534
|
-
:two_types_multitag => "#<strong>foo</strong> #{arrow} String, Symbol",
|
535
|
-
:type_nil => "#<strong>foo</strong> #{arrow} Type<sup>?</sup>",
|
536
|
-
:type_array => "#<strong>foo</strong> #{arrow} Type<sup>+</sup>",
|
537
|
-
:multitype => "#<strong>foo</strong> #{arrow} Type, ...",
|
538
|
-
:void => "#<strong>foo</strong> #{arrow} void",
|
539
|
-
:hide_void => "#<strong>foo</strong>",
|
540
|
-
:block => "#<strong>foo</strong> {|a, b, c| ... } #{arrow} Object",
|
541
|
-
:empty_overload => "#<strong>foobar</strong> #{arrow} String"
|
542
|
-
}
|
543
|
-
end
|
544
|
-
|
545
|
-
def format_types(types, _brackets = false) types.join(", ") end
|
546
|
-
def signature(obj, link = false) super(obj, link).strip end
|
547
|
-
|
548
|
-
it_should_behave_like "signature"
|
549
|
-
|
550
|
-
it "links to regular method if overload name does not have the same method name" do
|
551
|
-
YARD.parse_string <<-eof
|
552
|
-
class Foo
|
553
|
-
# @overload bar(a, b, c)
|
554
|
-
def foo; end
|
555
|
-
end
|
556
|
-
eof
|
557
|
-
serializer = double(:serializer)
|
558
|
-
allow(serializer).to receive(:serialized_path).with(Registry.at('Foo')).and_return('')
|
559
|
-
allow(self).to receive(:serializer).and_return(serializer)
|
560
|
-
allow(self).to receive(:object).and_return(Registry.at('Foo'))
|
561
|
-
expect(signature(Registry.at('Foo#foo').tag(:overload), true)).to eq(
|
562
|
-
"<a href=\"#foo-instance_method\" title=\"#bar (instance method)\">#<strong>bar</strong>(a, b, c) </a>"
|
563
|
-
)
|
564
|
-
end
|
565
|
-
end
|
566
|
-
|
567
|
-
describe "#html_syntax_highlight" do
|
568
|
-
subject do
|
569
|
-
obj = OpenStruct.new
|
570
|
-
obj.options = options
|
571
|
-
obj.object = Registry.root
|
572
|
-
obj.extend(Templates::Helpers::HtmlHelper)
|
573
|
-
obj
|
574
|
-
end
|
575
|
-
|
576
|
-
it "returns empty string on nil input" do
|
577
|
-
expect(subject.html_syntax_highlight(nil)).to eq ''
|
578
|
-
end
|
579
|
-
|
580
|
-
it "calls #html_syntax_highlight_ruby by default" do
|
581
|
-
Registry.root.source_type = nil
|
582
|
-
expect(subject).to receive(:html_syntax_highlight_ruby).with('def x; end')
|
583
|
-
subject.html_syntax_highlight('def x; end')
|
584
|
-
end
|
585
|
-
|
586
|
-
it "calls #html_syntax_highlight_NAME if there's an object with a #source_type" do
|
587
|
-
subject.object = OpenStruct.new(:source_type => :NAME)
|
588
|
-
expect(subject).to receive(:html_markup_html) {|text| text }
|
589
|
-
expect(subject).to receive(:html_syntax_highlight_NAME).and_return("foobar")
|
590
|
-
expect(subject.htmlify('<pre><code>def x; end</code></pre>', :html)).to eq(
|
591
|
-
'<pre class="code NAME"><code class="NAME">foobar</code></pre>'
|
592
|
-
)
|
593
|
-
end
|
594
|
-
|
595
|
-
it "adds !!!LANG to className in outputted pre tag" do
|
596
|
-
subject.object = OpenStruct.new(:source_type => :LANG)
|
597
|
-
expect(subject).to receive(:html_markup_html) {|text| text }
|
598
|
-
expect(subject).to receive(:html_syntax_highlight_LANG).and_return("foobar")
|
599
|
-
expect(subject.htmlify("<pre><code>!!!LANG\ndef x; end</code></pre>", :html)).to eq(
|
600
|
-
'<pre class="code LANG"><code class="LANG">foobar</code></pre>'
|
601
|
-
)
|
602
|
-
end
|
603
|
-
|
604
|
-
it "calls html_syntax_highlight_NAME if source starts with !!!NAME" do
|
605
|
-
expect(subject).to receive(:html_syntax_highlight_NAME).and_return("foobar")
|
606
|
-
expect(subject.html_syntax_highlight(<<-eof
|
607
|
-
!!!NAME
|
608
|
-
def x; end
|
609
|
-
eof
|
610
|
-
)).to eq "foobar"
|
611
|
-
end
|
612
|
-
|
613
|
-
it "does not highlight if highlight option is false" do
|
614
|
-
subject.options.highlight = false
|
615
|
-
expect(subject).not_to receive(:html_syntax_highlight_ruby)
|
616
|
-
expect(subject.html_syntax_highlight('def x; end')).to eq 'def x; end'
|
617
|
-
end
|
618
|
-
|
619
|
-
it "does not highlight if there is no highlight method specified by !!!NAME" do
|
620
|
-
def subject.respond_to?(method, include_all = false)
|
621
|
-
return false if method == 'html_syntax_highlight_NAME'
|
622
|
-
super
|
623
|
-
end
|
624
|
-
expect(subject).not_to receive(:html_syntax_highlight_NAME)
|
625
|
-
expect(subject.html_syntax_highlight("!!!NAME\ndef x; end")).to eq "def x; end"
|
626
|
-
end
|
627
|
-
|
628
|
-
it "highlights as ruby if htmlify(text, :ruby) is called" do
|
629
|
-
expect(subject).to receive(:html_syntax_highlight_ruby).with('def x; end').and_return('x')
|
630
|
-
expect(subject.htmlify('def x; end', :ruby)).to eq '<pre class="code ruby">x</pre>'
|
631
|
-
end
|
632
|
-
|
633
|
-
it "does not prioritize object source type when called directly" do
|
634
|
-
expect(subject).to receive(:html_syntax_highlight_ruby).with('def x; end').and_return('x')
|
635
|
-
subject.object = OpenStruct.new(:source_type => :c)
|
636
|
-
expect(subject.html_syntax_highlight("def x; end")).to eq "x"
|
637
|
-
end
|
638
|
-
|
639
|
-
it "doesn't escape code snippets twice" do
|
640
|
-
expect(subject.htmlify('<pre lang="foo"><code>{"foo" => 1}</code></pre>', :html)).to eq(
|
641
|
-
'<pre class="code foo"><code class="foo">{"foo" => 1}</code></pre>'
|
642
|
-
)
|
643
|
-
end
|
644
|
-
|
645
|
-
it "highlights source when matching a pre lang= tag" do
|
646
|
-
expect(subject.htmlify('<pre lang="foo"><code>x = 1</code></pre>', :html)).to eq(
|
647
|
-
'<pre class="code foo"><code class="foo">x = 1</code></pre>'
|
648
|
-
)
|
649
|
-
end
|
650
|
-
|
651
|
-
it "highlights source when matching a code class= tag" do
|
652
|
-
expect(subject.htmlify('<pre><code class="foo">x = 1</code></pre>', :html)).to eq(
|
653
|
-
'<pre class="code foo"><code class="foo">x = 1</code></pre>'
|
654
|
-
)
|
655
|
-
end
|
656
|
-
end
|
657
|
-
|
658
|
-
describe "#link_url" do
|
659
|
-
it "adds target if scheme is provided" do
|
660
|
-
expect(link_url("http://url.com")).to include(" target=\"_parent\"")
|
661
|
-
expect(link_url("https://url.com")).to include(" target=\"_parent\"")
|
662
|
-
expect(link_url("irc://url.com")).to include(" target=\"_parent\"")
|
663
|
-
expect(link_url("../not/scheme")).not_to include("target")
|
664
|
-
end
|
665
|
-
end
|
666
|
-
end
|