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,133 +0,0 @@
1
- # frozen_string_literal: true
2
- RSpec.shared_examples "class method visibility decorator" do
3
- # Use let(:visibility) to specify the name of the x_class_method
4
- # visibility decorator to test.
5
-
6
- describe do
7
- before do
8
- StubbedSourceParser.parse_string <<-CODE
9
- class A
10
- def self.b; end
11
- def self.c; end
12
- def self.d; end
13
- def self.e; end
14
-
15
- #{visibility}_class_method(:c, :d)
16
- #{visibility}_class_method("e")
17
- end
18
- CODE
19
- end
20
-
21
- it "handles private_class_method statement" do
22
- expect(Registry.at('A.c').visibility).to eq visibility
23
- expect(Registry.at('A.d').visibility).to eq visibility
24
- expect(Registry.at('A.e').visibility).to eq visibility
25
- end
26
-
27
- # Issue #760
28
- # https://github.com/lsegal/yard/issues/760
29
- it "handles singleton classes" do
30
- # Note: It's important to def a method within the singleton class or
31
- # the bug may not trigger.
32
- code = <<-CODE
33
- class SingletonClass
34
- private_class_method :new
35
- def self.foo
36
- "foo"
37
- end
38
- end
39
- CODE
40
-
41
- StubbedSourceParser.parse_string(code) # Should be successful.
42
- end unless LEGACY_PARSER
43
- end
44
-
45
- describe "handles reopened class" do
46
- before do
47
- StubbedSourceParser.parse_string <<-CODE
48
- class SingletonClass
49
-
50
- #{'private' unless visibility.to_sym == :private}
51
-
52
- # != visibility
53
- def self.foo
54
- 'foo'
55
- end
56
-
57
- # == visibility
58
- def self.bar
59
- end
60
-
61
- # == visibility from reopening class.
62
- def self.baz
63
- end
64
-
65
- #{visibility}_class_method :new, :bar
66
-
67
- end
68
- CODE
69
-
70
- StubbedSourceParser.parse_string <<-CODE
71
- # Reopening singleton class.
72
- class SingletonClass
73
- #{visibility}_class_method :baz
74
-
75
- #{'private' unless visibility.to_sym == :private}
76
- # != visibility from reopened class. (Verifies class was reopened.)
77
- def self.bat
78
- end
79
-
80
- end
81
- CODE
82
- end
83
-
84
- specify do
85
- expect(Registry.at('SingletonClass.foo').visibility).not_to eq visibility
86
- expect(Registry.at('SingletonClass.bar').visibility).to eq visibility
87
- expect(Registry.at('SingletonClass.baz').visibility).to eq visibility
88
- expect(Registry.at('SingletonClass.bat').visibility).not_to eq visibility
89
- end
90
- end unless LEGACY_PARSER # reopened class
91
-
92
- describe "as method definition decorator" do
93
- subject { Registry.at('SingletonClass.foo') }
94
-
95
- # Valid as of Ruby 2.1.0:
96
- # private_class_method def self.foo; end
97
-
98
- let(:code) do
99
- <<-CODE
100
- class SingletonClass
101
- # Valid Ruby 2.1.0 syntax.
102
- #{method_def}
103
- 'it works'
104
- end
105
- end
106
- CODE
107
- end
108
-
109
- let(:method_def) { "#{visibility}_class_method def self.foo param1, param2" }
110
-
111
- before { StubbedSourceParser.parse_string code }
112
-
113
- it "handles self.foo" do
114
- expect(subject.visibility).to eq visibility
115
- end
116
-
117
- it "handles parameters correctly" do
118
- expect(subject.parameters.map(&:first)).to eq ['param1', 'param2']
119
- end
120
-
121
- it "attaches documentation to method definition" do
122
- expect(subject.docstring).to eq "Valid Ruby 2.1.0 syntax."
123
- end
124
-
125
- describe "handles SingletonClass.foo" do
126
- let(:method_def) { "#{visibility}_class_method def SingletonClass.foo" }
127
-
128
- specify do
129
- expect(subject.visibility).to eq visibility
130
- end
131
- end
132
- end unless LEGACY_PARSER
133
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
- require File.dirname(__FILE__) + '/spec_helper'
3
-
4
- RSpec.describe "YARD::Handlers::Ruby::#{LEGACY_PARSER ? "Legacy::" : ""}ClassVariableHandler" do
5
- before(:all) { parse_file :class_variable_handler_001, __FILE__ }
6
-
7
- it "does not parse class variables inside methods" do
8
- obj = Registry.at("A::B::@@somevar")
9
- expect(obj.source).to eq "@@somevar = \"hello\""
10
- expect(obj.value).to eq '"hello"'
11
- end
12
- end
@@ -1,112 +0,0 @@
1
- # frozen_string_literal: true
2
- require File.dirname(__FILE__) + '/spec_helper'
3
-
4
- RSpec.describe "YARD::Handlers::Ruby::#{LEGACY_PARSER ? "Legacy::" : ""}ConstantHandler" do
5
- before(:all) { parse_file :constant_handler_001, __FILE__ }
6
-
7
- it "does not parse constants inside methods" do
8
- expect(Registry.at("A::B::SOMECONSTANT").source).to eq "SOMECONSTANT= \"hello\""
9
- end
10
-
11
- it "only parses valid constants" do
12
- expect(Registry.at("A::B::notaconstant")).to be nil
13
- end
14
-
15
- it "maintains newlines" do
16
- expect(Registry.at("A::B::MYCONSTANT").value.delete("\r")).to eq "A +\nB +\nC +\nD"
17
- end
18
-
19
- it "turns Const = Struct.new(:sym) into class Const with attr :sym" do
20
- obj = Registry.at("MyClass")
21
- expect(obj).to be_kind_of(CodeObjects::ClassObject)
22
- attrs = obj.attributes[:instance]
23
- [:a, :b, :c].each do |key|
24
- expect(attrs).to have_key(key)
25
- expect(attrs[key][:read]).not_to be nil
26
- expect(attrs[key][:write]).not_to be nil
27
- end
28
- end
29
-
30
- it 'documents block for Struct.new if present' do
31
- obj = Registry.at("MyStructWithConstant")
32
- expect(obj).to be_kind_of(CodeObjects::ClassObject)
33
- expect(obj.constants[0].docstring).to eq 'A constant.'
34
- expect(obj.constants[0].name).to eq :CONSTANT
35
- expect(obj.constants[0].value).to eq "42"
36
- expect(obj.constants[1].docstring).to eq 'Special constant (empty symbol)'
37
- expect(obj.constants[1].name).to eq :EMPTY
38
- expect(obj.constants[1].value).to eq ":''"
39
- end
40
-
41
- it "turns Const = Struct.new('Name', :sym) into class Const with attr :sym" do
42
- obj = Registry.at("NotMyClass")
43
- expect(obj).to be_kind_of(CodeObjects::ClassObject)
44
- attrs = obj.attributes[:instance]
45
- [:b, :c].each do |key|
46
- expect(attrs).to have_key(key)
47
- expect(attrs[key][:read]).not_to be nil
48
- expect(attrs[key][:write]).not_to be nil
49
- end
50
-
51
- expect(Registry.at("NotMyClass2")).to be nil
52
- end
53
-
54
- it "turns Const = Struct.new into empty struct" do
55
- obj = Registry.at("MyEmptyStruct")
56
- expect(obj).not_to be nil
57
- expect(obj.attributes[:instance]).to be_empty
58
- end
59
-
60
- it "maintains docstrings on structs defined via constants" do
61
- obj = Registry.at("DocstringStruct")
62
- expect(obj).not_to be nil
63
- expect(obj.docstring).to eq "A crazy struct."
64
- expect(obj.attributes[:instance]).not_to be_empty
65
- a1 = Registry.at("DocstringStruct#bar")
66
- a2 = Registry.at("DocstringStruct#baz")
67
- expect(a1.docstring).to eq "An attr"
68
- expect(a1.tag(:return).types).to eq ["String"]
69
- expect(a2.docstring).to eq "Another attr"
70
- expect(a2.tag(:return).types).to eq ["Number"]
71
- a3 = Registry.at("DocstringStruct#new_syntax")
72
- expect(a3.docstring).to eq "Attribute defined with the new syntax"
73
- expect(a3.tag(:return).types).to eq ["Symbol"]
74
- end
75
-
76
- it "raises undocumentable error in 1.9 parser for Struct.new assignment to non-const" do
77
- undoc_error "nonconst = Struct.new"
78
- end unless LEGACY_PARSER
79
-
80
- %w(module class).each do |type|
81
- it "does not allow #{type} to be redefined as constant" do
82
- undoc_error <<-eof
83
- #{type} Foo; end
84
- Foo = "value"
85
- eof
86
- end
87
- end unless LEGACY_PARSER
88
-
89
- it "allows constant to have same name as constant in parent namespace" do
90
- YARD.parse_string <<-eof
91
- module A
92
- class C; end
93
- module B; C = 1 end
94
- end
95
- eof
96
- expect(log.io.string).to eq ""
97
- expect(Registry.at('A::B::C').type).to eq :constant
98
- end
99
-
100
- it "detects compound constant names" do
101
- YARD.parse_string <<-eof
102
- module A
103
- class AA; end
104
- AA::B = true
105
- end
106
- A::AA::C = true
107
- eof
108
-
109
- expect(Registry.at('A::AA::B').type).to eq :constant
110
- expect(Registry.at('A::AA::C').type).to eq :constant
111
- end if HAVE_RIPPER
112
- end
@@ -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