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.

Files changed (223) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +37 -24
  3. data/CHANGELOG.md +18 -3
  4. data/README.md +96 -101
  5. data/Rakefile +2 -0
  6. data/lib/yard/cli/diff.rb +4 -1
  7. data/lib/yard/cli/server.rb +22 -13
  8. data/lib/yard/code_objects/proxy.rb +2 -1
  9. data/lib/yard/globals.rb +1 -1
  10. data/lib/yard/handlers/c/base.rb +164 -129
  11. data/lib/yard/parser/ruby/ruby_parser.rb +6 -4
  12. data/lib/yard/registry_store.rb +1 -1
  13. data/lib/yard/templates/helpers/html_helper.rb +10 -3
  14. data/lib/yard/templates/helpers/markup/rdoc_markup.rb +5 -4
  15. data/lib/yard/version.rb +1 -1
  16. data/tasks/update_error_map.rake +53 -0
  17. data/yard.gemspec +1 -1
  18. metadata +3 -207
  19. data/spec/cli/command_parser_spec.rb +0 -43
  20. data/spec/cli/command_spec.rb +0 -36
  21. data/spec/cli/config_spec.rb +0 -148
  22. data/spec/cli/diff_spec.rb +0 -254
  23. data/spec/cli/display_spec.rb +0 -30
  24. data/spec/cli/gems_spec.rb +0 -81
  25. data/spec/cli/graph_spec.rb +0 -18
  26. data/spec/cli/help_spec.rb +0 -22
  27. data/spec/cli/i18n_spec.rb +0 -107
  28. data/spec/cli/list_spec.rb +0 -8
  29. data/spec/cli/markup_types_spec.rb +0 -22
  30. data/spec/cli/server_spec.rb +0 -324
  31. data/spec/cli/stats_spec.rb +0 -96
  32. data/spec/cli/yard_on_yard_spec.rb +0 -38
  33. data/spec/cli/yardoc_spec.rb +0 -896
  34. data/spec/cli/yri_spec.rb +0 -101
  35. data/spec/code_objects/base_spec.rb +0 -485
  36. data/spec/code_objects/class_object_spec.rb +0 -226
  37. data/spec/code_objects/code_object_list_spec.rb +0 -36
  38. data/spec/code_objects/constants_spec.rb +0 -116
  39. data/spec/code_objects/extra_file_object_spec.rb +0 -161
  40. data/spec/code_objects/macro_object_spec.rb +0 -150
  41. data/spec/code_objects/method_object_spec.rb +0 -184
  42. data/spec/code_objects/module_object_spec.rb +0 -142
  43. data/spec/code_objects/namespace_mapper_spec.rb +0 -32
  44. data/spec/code_objects/namespace_object_spec.rb +0 -171
  45. data/spec/code_objects/proxy_spec.rb +0 -147
  46. data/spec/code_objects/spec_helper.rb +0 -3
  47. data/spec/config_spec.rb +0 -171
  48. data/spec/core_ext/array_spec.rb +0 -13
  49. data/spec/core_ext/file_spec.rb +0 -72
  50. data/spec/core_ext/hash_spec.rb +0 -14
  51. data/spec/core_ext/insertion_spec.rb +0 -37
  52. data/spec/core_ext/module_spec.rb +0 -9
  53. data/spec/core_ext/string_spec.rb +0 -42
  54. data/spec/core_ext/symbol_hash_spec.rb +0 -89
  55. data/spec/docstring_parser_spec.rb +0 -280
  56. data/spec/docstring_spec.rb +0 -373
  57. data/spec/handlers/alias_handler_spec.rb +0 -82
  58. data/spec/handlers/attribute_handler_spec.rb +0 -96
  59. data/spec/handlers/base_spec.rb +0 -216
  60. data/spec/handlers/c/alias_handler_spec.rb +0 -34
  61. data/spec/handlers/c/attribute_handler_spec.rb +0 -41
  62. data/spec/handlers/c/class_handler_spec.rb +0 -78
  63. data/spec/handlers/c/constant_handler_spec.rb +0 -71
  64. data/spec/handlers/c/init_handler_spec.rb +0 -48
  65. data/spec/handlers/c/method_handler_spec.rb +0 -327
  66. data/spec/handlers/c/mixin_handler_spec.rb +0 -44
  67. data/spec/handlers/c/module_handler_spec.rb +0 -71
  68. data/spec/handlers/c/override_comment_handler_spec.rb +0 -47
  69. data/spec/handlers/c/path_handler_spec.rb +0 -36
  70. data/spec/handlers/c/spec_helper.rb +0 -23
  71. data/spec/handlers/c/struct_handler_spec.rb +0 -16
  72. data/spec/handlers/class_condition_handler_spec.rb +0 -87
  73. data/spec/handlers/class_handler_spec.rb +0 -247
  74. data/spec/handlers/class_method_handler_shared_examples.rb +0 -133
  75. data/spec/handlers/class_variable_handler_spec.rb +0 -12
  76. data/spec/handlers/constant_handler_spec.rb +0 -112
  77. data/spec/handlers/decorator_handler_methods_spec.rb +0 -393
  78. data/spec/handlers/dsl_handler_spec.rb +0 -226
  79. data/spec/handlers/examples/alias_handler_001.rb.txt +0 -46
  80. data/spec/handlers/examples/attribute_handler_001.rb.txt +0 -32
  81. data/spec/handlers/examples/class_condition_handler_001.rb.txt +0 -69
  82. data/spec/handlers/examples/class_handler_001.rb.txt +0 -120
  83. data/spec/handlers/examples/class_variable_handler_001.rb.txt +0 -10
  84. data/spec/handlers/examples/constant_handler_001.rb.txt +0 -35
  85. data/spec/handlers/examples/dsl_handler_001.rb.txt +0 -156
  86. data/spec/handlers/examples/exception_handler_001.rb.txt +0 -59
  87. data/spec/handlers/examples/extend_handler_001.rb.txt +0 -19
  88. data/spec/handlers/examples/method_condition_handler_001.rb.txt +0 -10
  89. data/spec/handlers/examples/method_handler_001.rb.txt +0 -128
  90. data/spec/handlers/examples/mixin_handler_001.rb.txt +0 -40
  91. data/spec/handlers/examples/module_handler_001.rb.txt +0 -29
  92. data/spec/handlers/examples/private_constant_handler_001.rb.txt +0 -8
  93. data/spec/handlers/examples/process_handler_001.rb.txt +0 -11
  94. data/spec/handlers/examples/visibility_handler_001.rb.txt +0 -36
  95. data/spec/handlers/examples/yield_handler_001.rb.txt +0 -54
  96. data/spec/handlers/exception_handler_spec.rb +0 -49
  97. data/spec/handlers/extend_handler_spec.rb +0 -28
  98. data/spec/handlers/legacy_base_spec.rb +0 -128
  99. data/spec/handlers/method_condition_handler_spec.rb +0 -15
  100. data/spec/handlers/method_handler_spec.rb +0 -214
  101. data/spec/handlers/mixin_handler_spec.rb +0 -60
  102. data/spec/handlers/module_function_handler_spec.rb +0 -106
  103. data/spec/handlers/module_handler_spec.rb +0 -35
  104. data/spec/handlers/private_class_method_handler_spec.rb +0 -11
  105. data/spec/handlers/private_constant_handler_spec.rb +0 -25
  106. data/spec/handlers/processor_spec.rb +0 -35
  107. data/spec/handlers/public_class_method_handler_spec.rb +0 -11
  108. data/spec/handlers/ruby/base_spec.rb +0 -95
  109. data/spec/handlers/ruby/legacy/base_spec.rb +0 -84
  110. data/spec/handlers/spec_helper.rb +0 -33
  111. data/spec/handlers/visibility_handler_spec.rb +0 -44
  112. data/spec/handlers/yield_handler_spec.rb +0 -52
  113. data/spec/i18n/locale_spec.rb +0 -81
  114. data/spec/i18n/message_spec.rb +0 -52
  115. data/spec/i18n/messages_spec.rb +0 -67
  116. data/spec/i18n/pot_generator_spec.rb +0 -295
  117. data/spec/i18n/text_spec.rb +0 -184
  118. data/spec/logging_spec.rb +0 -44
  119. data/spec/options_spec.rb +0 -171
  120. data/spec/parser/base_spec.rb +0 -24
  121. data/spec/parser/c_parser_spec.rb +0 -236
  122. data/spec/parser/examples/array.c.txt +0 -6267
  123. data/spec/parser/examples/example1.rb.txt +0 -8
  124. data/spec/parser/examples/extrafile.c.txt +0 -8
  125. data/spec/parser/examples/file.c.txt +0 -28
  126. data/spec/parser/examples/multifile.c.txt +0 -22
  127. data/spec/parser/examples/namespace.cpp.txt +0 -68
  128. data/spec/parser/examples/override.c.txt +0 -424
  129. data/spec/parser/examples/parse_in_order_001.rb.txt +0 -2
  130. data/spec/parser/examples/parse_in_order_002.rb.txt +0 -2
  131. data/spec/parser/examples/tag_handler_001.rb.txt +0 -8
  132. data/spec/parser/ruby/ast_node_spec.rb +0 -33
  133. data/spec/parser/ruby/legacy/statement_list_spec.rb +0 -299
  134. data/spec/parser/ruby/legacy/token_list_spec.rb +0 -79
  135. data/spec/parser/ruby/ruby_parser_spec.rb +0 -520
  136. data/spec/parser/ruby/token_resolver_spec.rb +0 -165
  137. data/spec/parser/source_parser_spec.rb +0 -727
  138. data/spec/parser/tag_parsing_spec.rb +0 -17
  139. data/spec/rake/yardoc_task_spec.rb +0 -118
  140. data/spec/registry_resolver_spec.rb +0 -15
  141. data/spec/registry_spec.rb +0 -463
  142. data/spec/registry_store_spec.rb +0 -327
  143. data/spec/rubygems/doc_manager_spec.rb +0 -112
  144. data/spec/serializers/data/serialized_yardoc/checksums +0 -1
  145. data/spec/serializers/data/serialized_yardoc/objects/Foo.dat +0 -0
  146. data/spec/serializers/data/serialized_yardoc/objects/Foo/bar_i.dat +0 -0
  147. data/spec/serializers/data/serialized_yardoc/objects/Foo/baz_i.dat +0 -0
  148. data/spec/serializers/data/serialized_yardoc/objects/root.dat +0 -0
  149. data/spec/serializers/data/serialized_yardoc/proxy_types +0 -2
  150. data/spec/serializers/file_system_serializer_spec.rb +0 -145
  151. data/spec/serializers/spec_helper.rb +0 -2
  152. data/spec/serializers/yardoc_serializer_spec.rb +0 -90
  153. data/spec/server/adapter_spec.rb +0 -39
  154. data/spec/server/commands/base_spec.rb +0 -91
  155. data/spec/server/commands/library_command_spec.rb +0 -39
  156. data/spec/server/doc_server_helper_spec.rb +0 -72
  157. data/spec/server/doc_server_serializer_spec.rb +0 -60
  158. data/spec/server/rack_adapter_spec.rb +0 -21
  159. data/spec/server/router_spec.rb +0 -123
  160. data/spec/server/spec_helper.rb +0 -22
  161. data/spec/server/static_caching_spec.rb +0 -47
  162. data/spec/server/webrick_servlet_spec.rb +0 -20
  163. data/spec/server_spec.rb +0 -19
  164. data/spec/spec_helper.rb +0 -212
  165. data/spec/tags/default_factory_spec.rb +0 -168
  166. data/spec/tags/default_tag_spec.rb +0 -11
  167. data/spec/tags/directives_spec.rb +0 -463
  168. data/spec/tags/library_spec.rb +0 -48
  169. data/spec/tags/overload_tag_spec.rb +0 -53
  170. data/spec/tags/ref_tag_list_spec.rb +0 -53
  171. data/spec/tags/types_explainer_spec.rb +0 -203
  172. data/spec/templates/class_spec.rb +0 -45
  173. data/spec/templates/constant_spec.rb +0 -41
  174. data/spec/templates/engine_spec.rb +0 -131
  175. data/spec/templates/examples/class001.html +0 -308
  176. data/spec/templates/examples/class001.txt +0 -36
  177. data/spec/templates/examples/class002.html +0 -39
  178. data/spec/templates/examples/constant001.txt +0 -25
  179. data/spec/templates/examples/constant002.txt +0 -7
  180. data/spec/templates/examples/constant003.txt +0 -11
  181. data/spec/templates/examples/method001.html +0 -137
  182. data/spec/templates/examples/method001.txt +0 -35
  183. data/spec/templates/examples/method002.html +0 -91
  184. data/spec/templates/examples/method002.txt +0 -20
  185. data/spec/templates/examples/method003.html +0 -165
  186. data/spec/templates/examples/method003.txt +0 -45
  187. data/spec/templates/examples/method004.html +0 -48
  188. data/spec/templates/examples/method004.txt +0 -10
  189. data/spec/templates/examples/method005.html +0 -105
  190. data/spec/templates/examples/method005.txt +0 -33
  191. data/spec/templates/examples/method006.html +0 -108
  192. data/spec/templates/examples/method006.txt +0 -20
  193. data/spec/templates/examples/module001.dot +0 -33
  194. data/spec/templates/examples/module001.html +0 -833
  195. data/spec/templates/examples/module001.txt +0 -33
  196. data/spec/templates/examples/module002.html +0 -341
  197. data/spec/templates/examples/module003.html +0 -202
  198. data/spec/templates/examples/module004.html +0 -394
  199. data/spec/templates/examples/module005.html +0 -82
  200. data/spec/templates/examples/tag001.txt +0 -82
  201. data/spec/templates/helpers/base_helper_spec.rb +0 -171
  202. data/spec/templates/helpers/html_helper_spec.rb +0 -666
  203. data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +0 -65
  204. data/spec/templates/helpers/markup/rdoc_markup_spec.rb +0 -84
  205. data/spec/templates/helpers/markup_helper_spec.rb +0 -136
  206. data/spec/templates/helpers/method_helper_spec.rb +0 -107
  207. data/spec/templates/helpers/module_helper_spec.rb +0 -35
  208. data/spec/templates/helpers/shared_signature_examples.rb +0 -126
  209. data/spec/templates/helpers/text_helper_spec.rb +0 -65
  210. data/spec/templates/markup_processor_integrations/asciidoctor_spec.rb +0 -60
  211. data/spec/templates/markup_processor_integrations/integration_spec_helper.rb +0 -50
  212. data/spec/templates/markup_processor_integrations/rdoc_markdown_spec.rb +0 -48
  213. data/spec/templates/markup_processor_integrations/rdoc_spec.rb +0 -39
  214. data/spec/templates/markup_processor_integrations/redcarpet_spec.rb +0 -64
  215. data/spec/templates/markup_processor_integrations/redcloth_spec.rb +0 -64
  216. data/spec/templates/method_spec.rb +0 -118
  217. data/spec/templates/module_spec.rb +0 -203
  218. data/spec/templates/onefile_spec.rb +0 -66
  219. data/spec/templates/section_spec.rb +0 -144
  220. data/spec/templates/spec_helper.rb +0 -76
  221. data/spec/templates/tag_spec.rb +0 -52
  222. data/spec/templates/template_spec.rb +0 -410
  223. 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 &quot;bar&quot; &lt;baz&gt;"
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>&lt;<a href=''>String</a>&gt;</tt>"],
90
- "Array<String, Symbol>" => [["Array", "String", "Symbol"],
91
- "<tt><a href=''>Array</a>&lt;<a href=''>String</a>, <a href=''>Symbol</a>&gt;</tt>"],
92
- "Array<{String => Array<Symbol>}>" => [["Array", "String", "Array", "Symbol"],
93
- "<tt><a href=''>Array</a>&lt;{<a href=''>String</a> =&gt; " \
94
- "<a href=''>Array</a>&lt;<a href=''>Symbol</a>&gt;}&gt;</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("&lt;")
98
- end
99
- if text.count('>') > 0
100
- expect(self).to receive(:h).with('>').at_least(text.count('>')).times.and_return("&gt;")
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&lt;&gt;</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&lt;&gt;"
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&lt;&gt;"
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#&amp; \(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#&lt;&lt;}")
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 = "&#x21d2;"
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">{&quot;foo&quot; =&gt; 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