yard 0.9.23 → 0.9.27

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