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,393 +0,0 @@
1
- # frozen_string_literal: true
2
- require File.dirname(__FILE__) + '/spec_helper'
3
-
4
- RSpec.describe "YARD::Handlers::Ruby::DecoratorHandlerMethods" do
5
- describe "#process_decorator" do
6
- # Create a YARD decorator handler.
7
- # @param name [Symbol] name of the mock decorator
8
- def create_test_handler(name)
9
- data[name] = {}
10
-
11
- local_mock_handler_opts = mock_handler_opts
12
- local_nodes = nodes
13
- local_data = data[name]
14
-
15
- Class.new YARD::Handlers::Ruby::Base do
16
- include YARD::Handlers::Ruby::DecoratorHandlerMethods
17
-
18
- handles method_call(:"#{name}_decorator")
19
- namespace_only
20
-
21
- process do
22
- # process_decorator params written like this due to Ruby 1.8.
23
- # A modern handler should splat local_nodes.
24
- local_data[:return] =
25
- process_decorator(*(local_nodes + [local_mock_handler_opts])) do |method, node, mname|
26
- local_data[:method] = method
27
- local_data[:node] = node
28
- local_data[:name] = mname
29
- end
30
- end
31
- end
32
- end
33
-
34
- # Generate method definition.
35
- # @param symbols [Symbol] method names
36
- # @return [String] method definition code
37
- def make_defs(*symbols)
38
- symbols.map do |s|
39
- s = "self.#{s}" if mock_handler_opts[:scope] == :class
40
- "def #{s}; end"
41
- end.join("\n")
42
- end
43
-
44
- # Generate an AST for the given source code string.
45
- def make_ast(code)
46
- YARD::Parser::Ruby::RubyParser.new(code, nil).parse.ast
47
- end
48
-
49
- subject { data[:mock] }
50
-
51
- let(:data) { Hash.new }
52
- let(:nodes) { [] }
53
- let(:mock_handler_opts) { {:scope => :instance} }
54
- let(:class_name) { 'DecoratorTest' }
55
- let(:docstring) { 'the foo method' }
56
- let(:param_string) { 'def foo param1, param2; end' }
57
- let(:method_defs) { [] }
58
- let(:method_string) { "#{class_name}#foo" }
59
- let(:code) do
60
- <<-eof
61
- class #{class_name}
62
- #{make_defs(*method_defs)}
63
- # #{docstring}
64
- mock_decorator #{param_string}
65
- end
66
- eof
67
- end
68
-
69
- before do
70
- Registry.clear
71
- YARD::Handlers::Base.clear_subclasses
72
-
73
- create_test_handler :mock
74
- create_test_handler :first
75
- create_test_handler :second
76
- create_test_handler :third
77
-
78
- StubbedSourceParser.parse_string code
79
- end
80
-
81
- it "returns an array of hashes containing the method proxy, node, and name" do
82
- expect(subject[:return]).to be_an Array
83
- expect(subject[:return].first[:name].to_s).to eq 'foo'
84
- expect(subject[:return].first[:method].to_s).to eq method_string
85
- expect(subject[:return].first[:node]).to be_a YARD::Parser::Ruby::AstNode
86
- end
87
-
88
- describe "method is a MethodObject if the method has been defined" do
89
- let(:code) { "class DecoratorTest; mock_decorator def foo; end; end" }
90
-
91
- specify do
92
- expect(subject[:return].first[:method]).
93
- to be_a YARD::CodeObjects::MethodObject
94
- end
95
- end
96
-
97
- describe "method is a Proxy if the method has not been defined" do
98
- let(:code) { "class DecoratorTest; mock_decorator :foo; end" }
99
-
100
- specify do
101
- expect(subject[:return].first[:method]).to be_a YARD::CodeObjects::Proxy
102
- end
103
- end
104
-
105
- specify "block yields method proxy, node, name" do
106
- expect(subject[:name]).to be_a Symbol
107
- expect(subject[:name]).to eq :foo
108
-
109
- expect(subject[:method]).to be_a YARD::CodeObjects::MethodObject
110
- expect(subject[:method].to_s).to eq method_string
111
-
112
- expect(subject[:node]).to be_a YARD::Parser::Ruby::AstNode
113
- end
114
-
115
- describe "capitalized method names" do
116
- let(:method_defs) { [:Foo] }
117
- let(:param_string) { 'def Foo param1, param2; end' }
118
-
119
- specify do
120
- expect(subject[:method].to_s).to eq "#{class_name}#Foo"
121
- end
122
- end
123
-
124
- describe "nodes argument" do
125
- subject { data[:mock][:return].map {|h| h[:method].to_s } }
126
-
127
- describe "assumes all params refer to methods by default" do
128
- let(:method_defs) { [:foo, :bar] }
129
- let(:param_string) { method_defs.map(&:inspect).join(',') }
130
- let(:nodes) { [] }
131
-
132
- specify do
133
- expect(subject).to eq ["#{class_name}#foo", "#{class_name}#bar"]
134
- end
135
- end
136
-
137
- describe "can specify which params to capture as methods" do
138
- let(:method_defs) { [:foo, :bar, :baz, :bat] }
139
- let(:parameters) do
140
- [:option_1, :baz, :bat, :option_2, :foo, :bar].map do |s|
141
- make_ast s.inspect
142
- end
143
- end
144
-
145
- describe "as a single param" do
146
- let(:nodes) { parameters[4] }
147
-
148
- specify do
149
- expect(subject).to eq ["#{class_name}#foo"]
150
- end
151
- end
152
-
153
- describe "as a list of params" do
154
- let(:nodes) { [parameters[4], parameters[5]] }
155
-
156
- specify do
157
- expect(subject).to eq ["#{class_name}#foo", "#{class_name}#bar"]
158
- end
159
- end
160
-
161
- describe "as a range" do
162
- let(:nodes) { parameters[4..-1] }
163
-
164
- specify do
165
- expect(subject).to eq ["#{class_name}#foo", "#{class_name}#bar"]
166
- end
167
- end
168
-
169
- describe "as multiple ranges" do
170
- # Written like this due to Ruby 1.8. Can also splat the ranges as
171
- # separate params:
172
- # *parameters[1..2], *parameters[4..-1]
173
- let(:nodes) { parameters[1..2] + parameters[4..-1] }
174
-
175
- specify do
176
- expect(subject).to eq [
177
- "#{class_name}#baz",
178
- "#{class_name}#bat",
179
- "#{class_name}#foo",
180
- "#{class_name}#bar"
181
- ]
182
- end
183
- end
184
- end
185
-
186
- describe "can select no nodes by passing nil" do
187
- let(:nodes) { [nil] }
188
-
189
- specify do
190
- expect(subject).to eq []
191
- end
192
- end
193
- end
194
-
195
- describe "scope option" do
196
- describe "defaults to :instance" do
197
- let(:mock_handler_opts) { {} }
198
-
199
- specify do
200
- expect(subject[:return].first[:method].to_s).to eq method_string
201
- end
202
- end
203
-
204
- describe "creates method proxies" do
205
- shared_examples "decorator helper scope" do
206
- let(:param_string) { decorator_params.map(&:inspect).join(',') }
207
-
208
- describe "for symbols" do
209
- let(:decorator_params) { [:foo, :bar] }
210
-
211
- specify do
212
- expect(subject.count).to eq decorator_params.count
213
-
214
- subject.each_with_index do |_, i|
215
- expect(subject[i]).to be_a YARD::CodeObjects::MethodObject
216
- expect(subject[i].to_s).to eq \
217
- "#{class_name}#{mock_handler_opts[:scope] == :class ? '.' : '#'}#{decorator_params[i]}"
218
- end
219
- end
220
- end
221
-
222
- describe "for string literals" do
223
- let(:decorator_params) { ['foo', 'bar'] }
224
-
225
- specify do
226
- expect(subject.count).to eq decorator_params.count
227
-
228
- subject.each_with_index do |_, i|
229
- expect(subject[i]).to be_a YARD::CodeObjects::MethodObject
230
- expect(subject[i].to_s).to eq \
231
- "#{class_name}#{mock_handler_opts[:scope] == :class ? '.' : '#'}#{decorator_params[i]}"
232
- end
233
- end
234
- end
235
-
236
- describe "for methods" do
237
- let(:param_string) { decorator_params.join(',') }
238
- let(:decorator_params) do
239
- ["def #{'self.' if mock_handler_opts[:scope] == :class}foo f1, f2; end",
240
- "def #{'self.' if mock_handler_opts[:scope] == :class}bar b1, b2; end"]
241
- end
242
-
243
- specify do
244
- expect(subject.count).to eq decorator_params.count
245
-
246
- subject.each_with_index do |_, i|
247
- expect(subject[i]).to be_a YARD::CodeObjects::MethodObject
248
- expect(subject[i].to_s).to eq \
249
- class_name +
250
- (mock_handler_opts[:scope] == :class ? '.' : '#') +
251
- decorator_params[i].split(' ')[1][/\w+$/]
252
- end
253
- end
254
- end
255
- end # decorator helper scope shared examples
256
-
257
- subject { data[:mock][:return].map {|h| h[:method] } }
258
-
259
- let(:docstring) { 'the foo method' }
260
- let(:method_defs) { [:foo, :bar] }
261
-
262
- describe "for :instance" do
263
- let(:mock_handler_opts) { {:scope => :instance} }
264
-
265
- include_examples "decorator helper scope"
266
- end
267
-
268
- describe "for :class" do
269
- let(:mock_handler_opts) { {:scope => :class} }
270
-
271
- include_examples "decorator helper scope"
272
- end
273
- end
274
- end
275
-
276
- describe "docstring from decorator" do
277
- subject { Registry.at method_string }
278
-
279
- specify "attaches to method definitions as decorator parameters" do
280
- expect(subject.docstring).to eq docstring
281
- end
282
-
283
- describe "does not attach" do
284
- describe "to undefined methods" do
285
- let(:code) do
286
- <<-eof
287
- class #{class_name}
288
- # #{docstring}
289
- mock_decorator :foo
290
- end
291
- eof
292
- end
293
-
294
- specify do
295
- expect(subject).not_to respond_to :docstring
296
- end
297
- end
298
-
299
- describe "to methods with existing docstring" do
300
- let(:code) do
301
- <<-eof
302
- class #{class_name}
303
-
304
- # original docstring
305
- def foo; end
306
-
307
- # #{docstring}
308
- mock_decorator :foo
309
- end
310
- eof
311
- end
312
-
313
- specify do
314
- expect(subject.docstring).to eq 'original docstring'
315
- end
316
- end
317
- end
318
- end
319
-
320
- describe "chained decorators" do
321
- subject { Registry.at method_string }
322
-
323
- let(:param_string) { 'def foo param1, param2; end' }
324
- let(:code) do
325
- <<-eof
326
- class #{class_name}
327
- #{make_defs(*method_defs)}
328
- # #{docstring}
329
- first_decorator second_decorator third_decorator #{param_string}
330
- end
331
- eof
332
- end
333
-
334
- specify "register nested method defs" do
335
- expect(subject).to be_a YARD::CodeObjects::MethodObject
336
- end
337
-
338
- describe "transfer docstring to decorated method defs" do
339
- specify do
340
- expect(subject.docstring).to eq docstring
341
- end
342
-
343
- describe "unless opt-out param is set" do
344
- let(:mock_handler_opts) { {:transfer_docstring => false} }
345
-
346
- specify do
347
- expect(subject.docstring.empty?).to be true
348
- end
349
- end
350
- end
351
-
352
- describe "don't transfer docstring to referenced methods" do
353
- let(:method_defs) { [:foo] }
354
- let(:param_string) { ':foo' }
355
-
356
- specify do
357
- expect(subject.docstring.empty?).to be true
358
- end
359
- end
360
-
361
- specify "don't transfer docstring to other decorators" do
362
- expect(Registry.at("#{class_name}#second_decorator")).
363
- not_to respond_to :docstring
364
-
365
- expect(Registry.at("#{class_name}#third_decorator")).
366
- not_to respond_to :docstring
367
- end
368
-
369
- describe "transfer source to decorated method defs" do
370
- specify do
371
- expect(subject.source).to eq code.lines.to_a[-2].strip
372
- end
373
-
374
- describe "unless opt-out param is set" do
375
- let(:mock_handler_opts) { {:transfer_source => false} }
376
-
377
- specify do
378
- expect(subject.source).to eq param_string
379
- end
380
- end
381
- end
382
-
383
- describe "don't transfer source to referenced methods" do
384
- let(:method_defs) { [:foo] }
385
- let(:param_string) { ':foo' }
386
-
387
- specify do
388
- expect(subject.source).to eq make_defs(*method_defs)
389
- end
390
- end
391
- end
392
- end # process_decorator
393
- end unless LEGACY_PARSER
@@ -1,226 +0,0 @@
1
- # frozen_string_literal: true
2
- require File.dirname(__FILE__) + '/spec_helper'
3
- require 'ostruct'
4
-
5
- RSpec.describe "YARD::Handlers::Ruby::#{LEGACY_PARSER ? "Legacy::" : ""}DSLHandler" do
6
- before(:all) { parse_file :dsl_handler_001, __FILE__ }
7
-
8
- it "creates a readable attribute when @!attribute r is found" do
9
- obj = Registry.at('Foo#attr1')
10
- expect(obj).not_to be nil
11
- expect(obj).to be_reader
12
- expect(obj.tag(:return).types).to eq ['Numeric']
13
- expect(Registry.at('Foo#attr1=')).to be nil
14
- end
15
-
16
- it "creates a writable attribute when @!attribute w is found" do
17
- obj = Registry.at('Foo#attr2=')
18
- expect(obj).not_to be nil
19
- expect(obj).to be_writer
20
- expect(Registry.at('Foo#attr2')).to be nil
21
- end
22
-
23
- it "defaults to readwrite @!attribute" do
24
- obj = Registry.at('Foo#attr3')
25
- expect(obj).not_to be nil
26
- expect(obj).to be_reader
27
- obj = Registry.at('Foo#attr3=')
28
- expect(obj).not_to be nil
29
- expect(obj).to be_writer
30
- end
31
-
32
- it "allows @!attribute to define alternate method name" do
33
- expect(Registry.at('Foo#attr4')).to be nil
34
- expect(Registry.at('Foo#custom')).not_to be nil
35
- end
36
-
37
- it "defaults to creating an instance method for any DSL method with special tags" do
38
- obj = Registry.at('Foo#implicit0')
39
- expect(obj).not_to be nil
40
- expect(obj.docstring).to eq "IMPLICIT METHOD!"
41
- expect(obj.tag(:return).types).to eq ['String']
42
- end
43
-
44
- it "recognizes implicit docstring when it has scope tag" do
45
- obj = Registry.at("Foo.implicit1")
46
- expect(obj).not_to be nil
47
- expect(obj.scope).to eq :class
48
- end
49
-
50
- it "recognizes implicit docstring when it has visibility tag" do
51
- obj = Registry.at("Foo#implicit2")
52
- expect(obj).not_to be nil
53
- expect(obj.visibility).to eq :protected
54
- end
55
-
56
- it "does not recognize implicit docstring with any other normal tag" do
57
- obj = Registry.at('Foo#implicit_invalid3')
58
- expect(obj).to be nil
59
- end
60
-
61
- it "sets the method name when using @!method" do
62
- obj = Registry.at('Foo.xyz')
63
- expect(obj).not_to be nil
64
- expect(obj.signature).to eq 'def xyz(a, b, c)'
65
- expect(obj.parameters).to eq [['a', nil], ['b', nil], ['c', nil]]
66
- expect(obj.source).to eq 'foo_bar'
67
- expect(obj.docstring).to eq 'The foo method'
68
- end
69
-
70
- it "recognizes methods with no attached source" do
71
- obj = Registry.at('Foo#no_src')
72
- expect(obj).not_to be nil
73
- expect(obj.signature).to eq 'def no_src'
74
- expect(obj.source).to eq ''
75
- end
76
-
77
- it "allows setting of @!scope" do
78
- expect(Registry.at('Foo.xyz').scope).to eq :class
79
- end
80
-
81
- it "creates module function if @!scope is module" do
82
- mod_c = Registry.at('Foo.modfunc1')
83
- mod_i = Registry.at('Foo#modfunc1')
84
- expect(mod_c.scope).to eq :class
85
- expect(mod_i.visibility).to eq :private
86
- end
87
-
88
- it "allows setting of @!visibility" do
89
- expect(Registry.at('Foo.xyz').visibility).to eq :protected
90
- end
91
-
92
- it "ignores DSL methods without tags" do
93
- expect(Registry.at('Foo#implicit_invalid')).to be nil
94
- end
95
-
96
- it "accepts a DSL method without tags if it has hash_flag (##)" do
97
- expect(Registry.at('Foo#implicit_valid')).not_to be nil
98
- expect(Registry.at('Foo#implicit_invalid2')).to be nil
99
- end
100
-
101
- it "allows creation of macros" do
102
- macro = CodeObjects::MacroObject.find('property')
103
- expect(macro).not_to be nil
104
- expect(macro).not_to be_attached
105
- expect(macro.method_object).to be nil
106
- end
107
-
108
- it "handles macros with no parameters to expand" do
109
- expect(Registry.at('Foo#none')).not_to be nil
110
- expect(Registry.at('Baz#none').signature).to eq 'def none(foo, bar)'
111
- end
112
-
113
- it "expands $N on method definitions" do
114
- expect(Registry.at('Foo#regular_meth').docstring).to eq 'a b c'
115
- end
116
-
117
- it "applies new macro docstrings on new objects" do
118
- obj = Registry.at('Foo#name')
119
- expect(obj).not_to be nil
120
- expect(obj.source).to eq 'property :name, String, :a, :b, :c'
121
- expect(obj.signature).to eq 'def name(a, b, c)'
122
- expect(obj.docstring).to eq 'A property that is awesome.'
123
- expect(obj.tag(:param).name).to eq 'a'
124
- expect(obj.tag(:param).text).to eq 'first parameter'
125
- expect(obj.tag(:return).types).to eq ['String']
126
- expect(obj.tag(:return).text).to eq 'the property name'
127
- end
128
-
129
- it "allows reuse of named macros" do
130
- obj = Registry.at('Foo#age')
131
- expect(obj).not_to be nil
132
- expect(obj.source).to eq 'property :age, Fixnum, :value'
133
- expect(obj.signature).to eq 'def age(value)'
134
- expect(obj.docstring).to eq 'A property that is awesome.'
135
- expect(obj.tag(:param).name).to eq 'value'
136
- expect(obj.tag(:param).text).to eq 'first parameter'
137
- expect(obj.tag(:return).types).to eq ['Fixnum']
138
- expect(obj.tag(:return).text).to eq 'the property age'
139
- end
140
-
141
- it "knows about method information on DSL with macro expansion" do
142
- expect(Registry.at('Foo#right_name')).not_to be nil
143
- expect(Registry.at('Foo#right_name').source).to eq 'implicit_with_different_method_name :wrong, :right'
144
- expect(Registry.at('Foo#wrong_name')).to be nil
145
- end
146
-
147
- it "uses attached macros" do
148
- macro = CodeObjects::MacroObject.find('parser')
149
- expect(macro.macro_data).to eq "@!method $1(opts = {})\n@return NOTHING!"
150
- expect(macro).not_to be nil
151
- expect(macro).to be_attached
152
- expect(macro.method_object).to eq P('Foo.parser')
153
- obj = Registry.at('Foo#c_parser')
154
- expect(obj).not_to be nil
155
- expect(obj.docstring).to eq ""
156
- expect(obj.signature).to eq "def c_parser(opts = {})"
157
- expect(obj.docstring.tag(:return).text).to eq "NOTHING!"
158
- end
159
-
160
- it "appends docstring on DSL method to attached macro" do
161
- obj = Registry.at('Foo#d_parser')
162
- expect(obj).not_to be nil
163
- expect(obj.docstring).to eq "Another docstring"
164
- expect(obj.signature).to eq "def d_parser(opts = {})"
165
- expect(obj.docstring.tag(:return).text).to eq "NOTHING!"
166
- end
167
-
168
- it "only uses attached macros on methods defined in inherited hierarchy" do
169
- expect(Registry.at('Bar#x_parser')).to be nil
170
- expect(Registry.at('Baz#y_parser')).not_to be nil
171
- end
172
-
173
- it "looks through mixins for attached macros" do
174
- meth = Registry.at('Baz#mixin_method')
175
- expect(meth).not_to be nil
176
- expect(meth.docstring).to eq 'DSL method mixin_method'
177
- end
178
-
179
- it "handles top-level DSL methods" do
180
- obj = Registry.at('#my_other_method')
181
- expect(obj).not_to be nil
182
- expect(obj.docstring).to eq "Docstring for method"
183
- end
184
-
185
- it "handles Constant.foo syntax" do
186
- obj = Registry.at('#beep')
187
- expect(obj).not_to be nil
188
- expect(obj.signature).to eq 'def beep(a, b, c)'
189
- end
190
-
191
- it "expands attached macros in first DSL method" do
192
- expect(Registry.at('DSLMethods#foo').docstring).to eq "Returns String for foo"
193
- expect(Registry.at('DSLMethods#bar').docstring).to eq "Returns Integer for bar"
194
- end
195
-
196
- it "does not detect implicit macros with invalid method names" do
197
- undoc_error <<-eof
198
- ##
199
- # IMPLICIT METHOD THAT SHOULD
200
- # NOT BE DETECTED
201
- dsl_method '/foo/bar'
202
- eof
203
- end
204
-
205
- it "warns on unparseable DSL statements" do
206
- undoc_error "private(*foo(bar))"
207
- end if HAVE_RIPPER
208
-
209
- # @note Currently unsupported behavior. Overriding a macro on an alias will
210
- # not work until macro lookups can be done by caller_method directly.
211
- # @todo optimize MacroObject lookup to work by caller name, not macro name.
212
- it "cannot attach a macro on alias of attached macro" do
213
- expect(Registry.at('AliasTest#main_foo1')).not_to be nil
214
- expect(Registry.at('AliasTest#alt_foo1')).to be nil
215
- end if HAVE_RIPPER
216
-
217
- it "searches attached macro's aliases for caller method match" do
218
- expect(Registry.at('AliasTest#main_foo2')).not_to be nil
219
- expect(Registry.at('AliasTest#alt_foo2')).to be nil
220
- end if HAVE_RIPPER
221
-
222
- it "does not create method object if directive data detected in expanded macro" do
223
- expect(Registry.at('DirectiveMethods#Bar')).to be nil
224
- expect(Registry.at('DirectiveMethods').mixins).to include P(:Bar)
225
- end
226
- end
@@ -1,46 +0,0 @@
1
- module A
2
- def a; end
3
- alias_method :b, :a
4
- alias_method :"cstrmeth", :"a"
5
-
6
- # Handle keyword syntax too
7
- alias :c :a
8
- alias :"cstrkey" :a
9
- alias d? a
10
- alias [] a
11
- alias []= a
12
- alias -@ a
13
- alias % a
14
- alias * a
15
- alias for a
16
- alias ConstantName a
17
-
18
- # Handle quoted symbols
19
- alias :'foo' :'a'
20
- end
21
-
22
- class C
23
- def x; end
24
- end
25
-
26
- class B < C
27
- alias_method(:q, :x)
28
- alias_method :r?, :x
29
- alias_method :s, :to_s
30
- alias_method :t, :inspect if 500 == 3 * CONSTANT
31
- alias_method :<<, :a
32
- alias_method :for, :a
33
- alias do x
34
- alias x2 do
35
- end
36
-
37
- class D
38
- # Foo bar
39
- def a; "FOO" end
40
-
41
- # @return [String]
42
- alias b a
43
-
44
- # @return [Numeric]
45
- def a; 0 end
46
- end
@@ -1,32 +0,0 @@
1
- module A
2
- attr_writer :x
3
- end
4
-
5
- class B
6
- class << self
7
- attr_accessor :z
8
- end
9
-
10
- attr :a, true
11
- attr :a2, false
12
- attr :a3
13
- # Docstring
14
- attr_reader :b, :c, :d
15
- attr_writer :e
16
- attr_accessor 'f'
17
-
18
- attr_accessor :z
19
- end
20
-
21
- class C
22
- def foo; end
23
- attr_writer :foo
24
-
25
- def bar=(value); end
26
- attr_reader :bar
27
- end
28
-
29
- class D
30
- protected
31
- attr_reader :parser
32
- end