yard 0.9.21 → 0.9.26

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 (250) 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 +42 -0
  8. data/.github/workflows/gem.yml +27 -0
  9. data/.gitignore +0 -0
  10. data/.rspec +0 -0
  11. data/.rubocop.yml +37 -24
  12. data/.travis.yml +0 -3
  13. data/.yardopts +0 -0
  14. data/.yardopts_guide +0 -0
  15. data/.yardopts_i18n +0 -0
  16. data/CHANGELOG.md +47 -4
  17. data/CONTRIBUTING.md +2 -2
  18. data/Gemfile +4 -3
  19. data/README.md +97 -102
  20. data/Rakefile +2 -0
  21. data/lib/yard/cli/diff.rb +4 -1
  22. data/lib/yard/cli/server.rb +22 -13
  23. data/lib/yard/code_objects/method_object.rb +1 -1
  24. data/lib/yard/code_objects/namespace_mapper.rb +30 -3
  25. data/lib/yard/code_objects/proxy.rb +2 -1
  26. data/lib/yard/globals.rb +1 -1
  27. data/lib/yard/handlers/c/base.rb +35 -0
  28. data/lib/yard/handlers/ruby/mixin_handler.rb +4 -1
  29. data/lib/yard/parser/ruby/legacy/irb/slex.rb +1 -1
  30. data/lib/yard/parser/ruby/ruby_parser.rb +6 -4
  31. data/lib/yard/parser/ruby/token_resolver.rb +3 -1
  32. data/lib/yard/parser/source_parser.rb +1 -1
  33. data/lib/yard/registry_resolver.rb +10 -24
  34. data/lib/yard/registry_store.rb +1 -1
  35. data/lib/yard/serializers/yardoc_serializer.rb +1 -1
  36. data/lib/yard/server/commands/base.rb +2 -2
  37. data/lib/yard/templates/helpers/html_helper.rb +10 -3
  38. data/lib/yard/templates/helpers/html_syntax_highlight_helper.rb +1 -1
  39. data/lib/yard/templates/helpers/markup/rdoc_markup.rb +5 -4
  40. data/lib/yard/templates/section.rb +1 -3
  41. data/lib/yard/version.rb +1 -1
  42. data/samus.json +15 -46
  43. data/tasks/update_error_map.rake +53 -0
  44. data/templates/default/fulldoc/html/css/style.css +1 -0
  45. data/templates/default/fulldoc/html/js/jquery.js +4 -2
  46. data/yard.gemspec +1 -2
  47. metadata +9 -206
  48. data/spec/cli/command_parser_spec.rb +0 -43
  49. data/spec/cli/command_spec.rb +0 -36
  50. data/spec/cli/config_spec.rb +0 -148
  51. data/spec/cli/diff_spec.rb +0 -254
  52. data/spec/cli/display_spec.rb +0 -30
  53. data/spec/cli/gems_spec.rb +0 -81
  54. data/spec/cli/graph_spec.rb +0 -18
  55. data/spec/cli/help_spec.rb +0 -22
  56. data/spec/cli/i18n_spec.rb +0 -107
  57. data/spec/cli/list_spec.rb +0 -8
  58. data/spec/cli/markup_types_spec.rb +0 -22
  59. data/spec/cli/server_spec.rb +0 -324
  60. data/spec/cli/stats_spec.rb +0 -96
  61. data/spec/cli/yard_on_yard_spec.rb +0 -38
  62. data/spec/cli/yardoc_spec.rb +0 -896
  63. data/spec/cli/yri_spec.rb +0 -101
  64. data/spec/code_objects/base_spec.rb +0 -485
  65. data/spec/code_objects/class_object_spec.rb +0 -226
  66. data/spec/code_objects/code_object_list_spec.rb +0 -36
  67. data/spec/code_objects/constants_spec.rb +0 -116
  68. data/spec/code_objects/extra_file_object_spec.rb +0 -161
  69. data/spec/code_objects/macro_object_spec.rb +0 -150
  70. data/spec/code_objects/method_object_spec.rb +0 -184
  71. data/spec/code_objects/module_object_spec.rb +0 -142
  72. data/spec/code_objects/namespace_object_spec.rb +0 -171
  73. data/spec/code_objects/proxy_spec.rb +0 -147
  74. data/spec/code_objects/spec_helper.rb +0 -3
  75. data/spec/config_spec.rb +0 -171
  76. data/spec/core_ext/array_spec.rb +0 -13
  77. data/spec/core_ext/file_spec.rb +0 -72
  78. data/spec/core_ext/hash_spec.rb +0 -14
  79. data/spec/core_ext/insertion_spec.rb +0 -37
  80. data/spec/core_ext/module_spec.rb +0 -9
  81. data/spec/core_ext/string_spec.rb +0 -42
  82. data/spec/core_ext/symbol_hash_spec.rb +0 -89
  83. data/spec/docstring_parser_spec.rb +0 -280
  84. data/spec/docstring_spec.rb +0 -373
  85. data/spec/handlers/alias_handler_spec.rb +0 -82
  86. data/spec/handlers/attribute_handler_spec.rb +0 -96
  87. data/spec/handlers/base_spec.rb +0 -216
  88. data/spec/handlers/c/alias_handler_spec.rb +0 -34
  89. data/spec/handlers/c/attribute_handler_spec.rb +0 -41
  90. data/spec/handlers/c/class_handler_spec.rb +0 -78
  91. data/spec/handlers/c/constant_handler_spec.rb +0 -71
  92. data/spec/handlers/c/init_handler_spec.rb +0 -48
  93. data/spec/handlers/c/method_handler_spec.rb +0 -327
  94. data/spec/handlers/c/mixin_handler_spec.rb +0 -44
  95. data/spec/handlers/c/module_handler_spec.rb +0 -71
  96. data/spec/handlers/c/override_comment_handler_spec.rb +0 -47
  97. data/spec/handlers/c/path_handler_spec.rb +0 -36
  98. data/spec/handlers/c/spec_helper.rb +0 -23
  99. data/spec/handlers/c/struct_handler_spec.rb +0 -16
  100. data/spec/handlers/class_condition_handler_spec.rb +0 -87
  101. data/spec/handlers/class_handler_spec.rb +0 -247
  102. data/spec/handlers/class_method_handler_shared_examples.rb +0 -133
  103. data/spec/handlers/class_variable_handler_spec.rb +0 -12
  104. data/spec/handlers/constant_handler_spec.rb +0 -112
  105. data/spec/handlers/decorator_handler_methods_spec.rb +0 -393
  106. data/spec/handlers/dsl_handler_spec.rb +0 -226
  107. data/spec/handlers/examples/alias_handler_001.rb.txt +0 -46
  108. data/spec/handlers/examples/attribute_handler_001.rb.txt +0 -32
  109. data/spec/handlers/examples/class_condition_handler_001.rb.txt +0 -69
  110. data/spec/handlers/examples/class_handler_001.rb.txt +0 -120
  111. data/spec/handlers/examples/class_variable_handler_001.rb.txt +0 -10
  112. data/spec/handlers/examples/constant_handler_001.rb.txt +0 -35
  113. data/spec/handlers/examples/dsl_handler_001.rb.txt +0 -156
  114. data/spec/handlers/examples/exception_handler_001.rb.txt +0 -59
  115. data/spec/handlers/examples/extend_handler_001.rb.txt +0 -19
  116. data/spec/handlers/examples/method_condition_handler_001.rb.txt +0 -10
  117. data/spec/handlers/examples/method_handler_001.rb.txt +0 -128
  118. data/spec/handlers/examples/mixin_handler_001.rb.txt +0 -40
  119. data/spec/handlers/examples/module_handler_001.rb.txt +0 -29
  120. data/spec/handlers/examples/private_constant_handler_001.rb.txt +0 -8
  121. data/spec/handlers/examples/process_handler_001.rb.txt +0 -11
  122. data/spec/handlers/examples/visibility_handler_001.rb.txt +0 -36
  123. data/spec/handlers/examples/yield_handler_001.rb.txt +0 -54
  124. data/spec/handlers/exception_handler_spec.rb +0 -49
  125. data/spec/handlers/extend_handler_spec.rb +0 -28
  126. data/spec/handlers/legacy_base_spec.rb +0 -128
  127. data/spec/handlers/method_condition_handler_spec.rb +0 -15
  128. data/spec/handlers/method_handler_spec.rb +0 -214
  129. data/spec/handlers/mixin_handler_spec.rb +0 -60
  130. data/spec/handlers/module_function_handler_spec.rb +0 -106
  131. data/spec/handlers/module_handler_spec.rb +0 -35
  132. data/spec/handlers/private_class_method_handler_spec.rb +0 -11
  133. data/spec/handlers/private_constant_handler_spec.rb +0 -25
  134. data/spec/handlers/processor_spec.rb +0 -35
  135. data/spec/handlers/public_class_method_handler_spec.rb +0 -11
  136. data/spec/handlers/ruby/base_spec.rb +0 -95
  137. data/spec/handlers/ruby/legacy/base_spec.rb +0 -84
  138. data/spec/handlers/spec_helper.rb +0 -33
  139. data/spec/handlers/visibility_handler_spec.rb +0 -44
  140. data/spec/handlers/yield_handler_spec.rb +0 -52
  141. data/spec/i18n/locale_spec.rb +0 -81
  142. data/spec/i18n/message_spec.rb +0 -52
  143. data/spec/i18n/messages_spec.rb +0 -67
  144. data/spec/i18n/pot_generator_spec.rb +0 -295
  145. data/spec/i18n/text_spec.rb +0 -184
  146. data/spec/logging_spec.rb +0 -44
  147. data/spec/options_spec.rb +0 -171
  148. data/spec/parser/base_spec.rb +0 -24
  149. data/spec/parser/c_parser_spec.rb +0 -236
  150. data/spec/parser/examples/array.c.txt +0 -6267
  151. data/spec/parser/examples/example1.rb.txt +0 -8
  152. data/spec/parser/examples/extrafile.c.txt +0 -8
  153. data/spec/parser/examples/file.c.txt +0 -28
  154. data/spec/parser/examples/multifile.c.txt +0 -22
  155. data/spec/parser/examples/namespace.cpp.txt +0 -68
  156. data/spec/parser/examples/override.c.txt +0 -424
  157. data/spec/parser/examples/parse_in_order_001.rb.txt +0 -2
  158. data/spec/parser/examples/parse_in_order_002.rb.txt +0 -2
  159. data/spec/parser/examples/tag_handler_001.rb.txt +0 -8
  160. data/spec/parser/ruby/ast_node_spec.rb +0 -33
  161. data/spec/parser/ruby/legacy/statement_list_spec.rb +0 -299
  162. data/spec/parser/ruby/legacy/token_list_spec.rb +0 -79
  163. data/spec/parser/ruby/ruby_parser_spec.rb +0 -508
  164. data/spec/parser/ruby/token_resolver_spec.rb +0 -165
  165. data/spec/parser/source_parser_spec.rb +0 -727
  166. data/spec/parser/tag_parsing_spec.rb +0 -17
  167. data/spec/rake/yardoc_task_spec.rb +0 -118
  168. data/spec/registry_spec.rb +0 -463
  169. data/spec/registry_store_spec.rb +0 -327
  170. data/spec/rubygems/doc_manager_spec.rb +0 -112
  171. data/spec/serializers/data/serialized_yardoc/checksums +0 -1
  172. data/spec/serializers/data/serialized_yardoc/objects/Foo.dat +0 -0
  173. data/spec/serializers/data/serialized_yardoc/objects/Foo/bar_i.dat +0 -0
  174. data/spec/serializers/data/serialized_yardoc/objects/Foo/baz_i.dat +0 -0
  175. data/spec/serializers/data/serialized_yardoc/objects/root.dat +0 -0
  176. data/spec/serializers/data/serialized_yardoc/proxy_types +0 -2
  177. data/spec/serializers/file_system_serializer_spec.rb +0 -145
  178. data/spec/serializers/spec_helper.rb +0 -2
  179. data/spec/serializers/yardoc_serializer_spec.rb +0 -78
  180. data/spec/server/adapter_spec.rb +0 -39
  181. data/spec/server/commands/base_spec.rb +0 -91
  182. data/spec/server/commands/library_command_spec.rb +0 -39
  183. data/spec/server/doc_server_helper_spec.rb +0 -72
  184. data/spec/server/doc_server_serializer_spec.rb +0 -60
  185. data/spec/server/rack_adapter_spec.rb +0 -21
  186. data/spec/server/router_spec.rb +0 -123
  187. data/spec/server/spec_helper.rb +0 -22
  188. data/spec/server/static_caching_spec.rb +0 -47
  189. data/spec/server/webrick_servlet_spec.rb +0 -20
  190. data/spec/server_spec.rb +0 -19
  191. data/spec/spec_helper.rb +0 -212
  192. data/spec/tags/default_factory_spec.rb +0 -168
  193. data/spec/tags/default_tag_spec.rb +0 -11
  194. data/spec/tags/directives_spec.rb +0 -463
  195. data/spec/tags/library_spec.rb +0 -48
  196. data/spec/tags/overload_tag_spec.rb +0 -53
  197. data/spec/tags/ref_tag_list_spec.rb +0 -53
  198. data/spec/tags/types_explainer_spec.rb +0 -203
  199. data/spec/templates/class_spec.rb +0 -45
  200. data/spec/templates/constant_spec.rb +0 -41
  201. data/spec/templates/engine_spec.rb +0 -131
  202. data/spec/templates/examples/class001.html +0 -308
  203. data/spec/templates/examples/class001.txt +0 -36
  204. data/spec/templates/examples/class002.html +0 -39
  205. data/spec/templates/examples/constant001.txt +0 -25
  206. data/spec/templates/examples/constant002.txt +0 -7
  207. data/spec/templates/examples/constant003.txt +0 -11
  208. data/spec/templates/examples/method001.html +0 -137
  209. data/spec/templates/examples/method001.txt +0 -35
  210. data/spec/templates/examples/method002.html +0 -91
  211. data/spec/templates/examples/method002.txt +0 -20
  212. data/spec/templates/examples/method003.html +0 -165
  213. data/spec/templates/examples/method003.txt +0 -45
  214. data/spec/templates/examples/method004.html +0 -48
  215. data/spec/templates/examples/method004.txt +0 -10
  216. data/spec/templates/examples/method005.html +0 -105
  217. data/spec/templates/examples/method005.txt +0 -33
  218. data/spec/templates/examples/method006.html +0 -108
  219. data/spec/templates/examples/method006.txt +0 -20
  220. data/spec/templates/examples/module001.dot +0 -33
  221. data/spec/templates/examples/module001.html +0 -833
  222. data/spec/templates/examples/module001.txt +0 -33
  223. data/spec/templates/examples/module002.html +0 -341
  224. data/spec/templates/examples/module003.html +0 -202
  225. data/spec/templates/examples/module004.html +0 -394
  226. data/spec/templates/examples/module005.html +0 -82
  227. data/spec/templates/examples/tag001.txt +0 -82
  228. data/spec/templates/helpers/base_helper_spec.rb +0 -171
  229. data/spec/templates/helpers/html_helper_spec.rb +0 -687
  230. data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +0 -65
  231. data/spec/templates/helpers/markup/rdoc_markup_spec.rb +0 -84
  232. data/spec/templates/helpers/markup_helper_spec.rb +0 -136
  233. data/spec/templates/helpers/method_helper_spec.rb +0 -107
  234. data/spec/templates/helpers/module_helper_spec.rb +0 -35
  235. data/spec/templates/helpers/shared_signature_examples.rb +0 -126
  236. data/spec/templates/helpers/text_helper_spec.rb +0 -65
  237. data/spec/templates/markup_processor_integrations/asciidoctor_spec.rb +0 -60
  238. data/spec/templates/markup_processor_integrations/integration_spec_helper.rb +0 -46
  239. data/spec/templates/markup_processor_integrations/rdoc_markdown_spec.rb +0 -59
  240. data/spec/templates/markup_processor_integrations/rdoc_spec.rb +0 -39
  241. data/spec/templates/markup_processor_integrations/redcarpet_spec.rb +0 -59
  242. data/spec/templates/markup_processor_integrations/redcloth_spec.rb +0 -48
  243. data/spec/templates/method_spec.rb +0 -118
  244. data/spec/templates/module_spec.rb +0 -203
  245. data/spec/templates/onefile_spec.rb +0 -66
  246. data/spec/templates/section_spec.rb +0 -144
  247. data/spec/templates/spec_helper.rb +0 -76
  248. data/spec/templates/tag_spec.rb +0 -52
  249. data/spec/templates/template_spec.rb +0 -410
  250. data/spec/verifier_spec.rb +0 -106
@@ -1,165 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe YARD::Parser::Ruby::TokenResolver do
4
- before(:all) do
5
- YARD.parse_string <<-eof
6
- module A
7
- def nomatch; end
8
-
9
- module B
10
- class C
11
- def initialize; end
12
-
13
- # @return [A::B::C]
14
- def self.foo; end
15
-
16
- # @return [self]
17
- def self.foo2; end
18
-
19
- def bar; end
20
-
21
- # @return [nil, D<String>]
22
- def baz; end
23
-
24
- # @return [nil]
25
- # @return [D<String>]
26
- def baz2; end
27
-
28
- # @overload qux(a)
29
- # @return [nil]
30
- # @overload qux(b)
31
- # @return [D<String>]
32
- def qux; end
33
- end
34
-
35
- class SubC < C
36
- end
37
- end
38
- end
39
-
40
- module D
41
- def baz; end
42
- end
43
-
44
- class Q
45
- def method; end
46
-
47
- # @return [Q]
48
- def self.q; end
49
- end
50
- eof
51
- end
52
-
53
- def tokens_match
54
- expect(@resolved.map {|t| t.first.last }.join).to eq @src
55
- end
56
-
57
- def objs_match(*objects)
58
- other_objs = @resolved.reject {|_, o| !o }.map {|_, o| o.path }
59
- expect(other_objs).to eq objects.flatten
60
- tokens_match
61
- end
62
-
63
- def tokenize(src, object = nil)
64
- @src = src
65
- @resolver = YARD::Parser::Ruby::TokenResolver.new(src, object)
66
- @resolved = @resolver.map {|t, o| [t[0, 2], o] }
67
- end
68
-
69
- it "returns regular tokens" do
70
- str = "def foo; Z::X::Y end"
71
- tokenize(str)
72
- tokens_match
73
- end
74
-
75
- it "resolves objects in compound constant paths" do
76
- tokenize "A::B::C"
77
- objs_match "A", "A::B", "A::B::C"
78
- end
79
-
80
- it "ignores full constant path if it breaks at beginning" do
81
- tokenize "E::A::B::C"
82
- objs_match []
83
- end
84
-
85
- it "ignores rest of constant path if sub-objects don't match" do
86
- tokenize "D::A::B::C"
87
- objs_match "D"
88
- end
89
-
90
- it "resets parsing at non-op tokens" do
91
- tokenize "A::B::C < Q"
92
- objs_match "A", "A::B", "A::B::C", "Q"
93
- end
94
-
95
- it "does not restart constant path" do
96
- tokenize "A::B::D::A"
97
- objs_match "A", "A::B"
98
- end
99
-
100
- it "resolves objects from base namespace" do
101
- tokenize "A::B::C C", Registry.at("A::B")
102
- objs_match "A", "A::B", "A::B::C", "A::B::C"
103
- end
104
-
105
- it "resolves methods" do
106
- tokenize "A::B::C.foo"
107
- objs_match "A", "A::B", "A::B::C", "A::B::C.foo"
108
- end
109
-
110
- it "supports 'new' constructor method" do
111
- tokenize "A::B::C.new"
112
- objs_match "A", "A::B", "A::B::C", "A::B::C#initialize"
113
- end
114
-
115
- it "skips constructor method if not found but continues resolving" do
116
- tokenize "Q.new.method"
117
- objs_match "Q", "Q#method"
118
- end
119
-
120
- it "resolves methods in inheritance tree" do
121
- tokenize "A::B::SubC.new"
122
- objs_match "A", "A::B", "A::B::SubC", "A::B::C#initialize"
123
- end
124
-
125
- it "parses compound method call chains based on return type" do
126
- tokenize "A::B::C.foo.baz"
127
- objs_match "A", "A::B", "A::B::C", "A::B::C.foo", "A::B::C#baz"
128
- end
129
-
130
- it "stops resolving if return types not found" do
131
- tokenize "A::B::C.foo.bar.baz.baz"
132
- objs_match "A", "A::B", "A::B::C", "A::B::C.foo", "A::B::C#bar"
133
- end
134
-
135
- it "handles multiple return types (returns first valid type match)" do
136
- tokenize "A::B::C.foo.baz.baz"
137
- objs_match "A", "A::B", "A::B::C", "A::B::C.foo", "A::B::C#baz", "D#baz"
138
- end
139
-
140
- it "doesn't perform lexical matching on methods" do
141
- tokenize "A::B::C.nomatch"
142
- objs_match "A", "A::B", "A::B::C"
143
- end
144
-
145
- it "handles multiple return tags (returns first valid type match)" do
146
- tokenize "A::B::C.foo.baz2.baz"
147
- objs_match "A", "A::B", "A::B::C", "A::B::C.foo", "A::B::C#baz2", "D#baz"
148
- end
149
-
150
- it "handles self as return type" do
151
- tokenize "A::B::C.foo2.baz"
152
- objs_match "A", "A::B", "A::B::C", "A::B::C.foo2", "A::B::C#baz"
153
- end
154
-
155
- it "handles multiple return tags inside overload tags" do
156
- tokenize "A::B::C.foo.qux.baz"
157
- objs_match "A", "A::B", "A::B::C", "A::B::C.foo", "A::B::C#qux", "D#baz"
158
- end
159
-
160
- it "resolves method calls with arguments" do
161
- tokenize "Q.q(A::B, A::B::C.foo().bar).q.q"
162
- objs_match "Q", "Q.q", "A", "A::B", "A", "A::B", "A::B::C",
163
- "A::B::C.foo", "A::B::C#bar", "Q.q", "Q.q"
164
- end
165
- end if HAVE_RIPPER
@@ -1,727 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class MyParser < Parser::Base; end
4
-
5
- RSpec.shared_examples_for "parser type registration" do
6
- after do
7
- Parser::SourceParser.parser_types.delete(:my_parser)
8
- Parser::SourceParser.parser_type_extensions.delete(:my_parser)
9
- end
10
- end
11
-
12
- RSpec.describe YARD::Parser::SourceParser do
13
- before do
14
- Registry.clear
15
- end
16
-
17
- def parse_list(*list)
18
- files = list.map do |v|
19
- filename, source = *v
20
- allow(File).to receive(:read_binary).with(filename).and_return(source)
21
- filename
22
- end
23
- Parser::SourceParser.send(:parse_in_order, *files)
24
- end
25
-
26
- def before_list(&block)
27
- Parser::SourceParser.before_parse_list(&block)
28
- end
29
-
30
- def after_list(&block)
31
- Parser::SourceParser.after_parse_list(&block)
32
- end
33
-
34
- def before_file(&block)
35
- Parser::SourceParser.before_parse_file(&block)
36
- end
37
-
38
- def after_file(&block)
39
- Parser::SourceParser.after_parse_file(&block)
40
- end
41
-
42
- describe ".before_parse_list" do
43
- before do
44
- Parser::SourceParser.before_parse_list_callbacks.clear
45
- Parser::SourceParser.after_parse_list_callbacks.clear
46
- end
47
-
48
- it "handles basic callback support" do
49
- before_list do |files, globals|
50
- expect(files).to eq ['foo.rb', 'bar.rb']
51
- expect(globals).to eq OpenStruct.new
52
- end
53
- parse_list ['foo.rb', 'foo!'], ['bar.rb', 'class Foo; end']
54
- expect(Registry.at('Foo')).not_to be nil
55
- end
56
-
57
- it "supports multiple callbacks" do
58
- checks = []
59
- before_list { checks << :one }
60
- before_list { checks << :two }
61
- parse_list ['file.rb', ''], ['file2.rb', ''], ['file3.rb', 'class Foo; end']
62
- expect(Registry.at('Foo')).not_to be nil
63
- expect(checks).to eq [:one, :two]
64
- end
65
-
66
- it "cancels parsing if it returns false" do
67
- checks = []
68
- before_list { checks << :one }
69
- before_list { false }
70
- before_list { checks << :three }
71
- parse_list ['file.rb', ''], ['file2.rb', ''], ['file3.rb', 'class Foo; end']
72
- expect(Registry.at('Foo')).to be nil
73
- expect(checks).to eq [:one]
74
- end
75
-
76
- it "does not cancel on nil" do
77
- checks = []
78
- before_list { checks << :one }
79
- before_list { nil }
80
- before_list { checks << :two }
81
- parse_list ['file.rb', ''], ['file2.rb', ''], ['file3.rb', 'class Foo; end']
82
- expect(Registry.at('Foo')).not_to be nil
83
- expect(checks).to eq [:one, :two]
84
- end
85
-
86
- it "passes in globals" do
87
- before_list {|_f, g| g.x = 1 }
88
- before_list {|_f, g| g.x += 1 }
89
- before_list {|_f, g| g.x += 1 }
90
- after_list {|_f, g| expect(g.x).to eq 3 }
91
- parse_list ['file.rb', ''], ['file2.rb', ''], ['file3.rb', 'class Foo; end']
92
- expect(Registry.at('Foo')).not_to be nil
93
- end
94
- end
95
-
96
- describe ".after_parse_list" do
97
- before do
98
- Parser::SourceParser.before_parse_list_callbacks.clear
99
- Parser::SourceParser.after_parse_list_callbacks.clear
100
- end
101
-
102
- it "handles basic callback support and maintain files/globals" do
103
- before_list {|_f, g| g.foo = :bar }
104
- after_list do |files, globals|
105
- expect(files).to eq ['foo.rb', 'bar.rb']
106
- expect(globals.foo).to eq :bar
107
- end
108
- parse_list ['foo.rb', 'foo!'], ['bar.rb', 'class Foo; end']
109
- expect(Registry.at('Foo')).not_to be nil
110
- end
111
-
112
- it "supports multiple callbacks" do
113
- checks = []
114
- after_list { checks << :one }
115
- after_list { checks << :two }
116
- parse_list ['file.rb', ''], ['file2.rb', ''], ['file3.rb', 'class Foo; end']
117
- expect(Registry.at('Foo')).not_to be nil
118
- expect(checks).to eq [:one, :two]
119
- end
120
-
121
- it "does not cancel parsing if it returns false" do
122
- checks = []
123
- after_list { checks << :one }
124
- after_list { false }
125
- after_list { checks << :three }
126
- parse_list ['file.rb', ''], ['file2.rb', ''], ['file3.rb', 'class Foo; end']
127
- expect(Registry.at('Foo')).not_to be nil
128
- expect(checks).to eq [:one, :three]
129
- end
130
- end
131
-
132
- describe ".before_parse_file" do
133
- before do
134
- Parser::SourceParser.before_parse_file_callbacks.clear
135
- Parser::SourceParser.after_parse_file_callbacks.clear
136
- end
137
-
138
- it "handles basic callback support" do
139
- before_file do |parser|
140
- expect(parser.contents).to eq 'class Foo; end'
141
- expect(parser.file).to match(/(foo|bar)\.rb/)
142
- end
143
- parse_list ['foo.rb', 'class Foo; end'], ['bar.rb', 'class Foo; end']
144
- expect(Registry.at('Foo')).not_to be nil
145
- end
146
-
147
- it "supports multiple callbacks" do
148
- checks = []
149
- before_file { checks << :one }
150
- before_file { checks << :two }
151
- parse_list ['file.rb', ''], ['file2.rb', ''], ['file3.rb', 'class Foo; end']
152
- expect(Registry.at('Foo')).not_to be nil
153
- expect(checks).to eq [:one, :two, :one, :two, :one, :two]
154
- end
155
-
156
- it "cancels parsing if it returns false" do
157
- checks = []
158
- before_file { checks << :one }
159
- before_file { false }
160
- before_file { checks << :three }
161
- parse_list ['file.rb', ''], ['file2.rb', ''], ['file3.rb', 'class Foo; end']
162
- expect(Registry.at('Foo')).to be nil
163
- expect(checks).to eq [:one, :one, :one]
164
- end
165
-
166
- it "does not cancel on nil" do
167
- checks = []
168
- before_file { checks << :one }
169
- before_file { nil }
170
- before_file { checks << :two }
171
- parse_list ['file.rb', ''], ['file2.rb', ''], ['file3.rb', 'class Foo; end']
172
- expect(Registry.at('Foo')).not_to be nil
173
- expect(checks).to eq [:one, :two, :one, :two, :one, :two]
174
- end
175
- end
176
-
177
- describe ".after_parse_file" do
178
- before do
179
- Parser::SourceParser.before_parse_file_callbacks.clear
180
- Parser::SourceParser.after_parse_file_callbacks.clear
181
- end
182
-
183
- it "handles basic callback support" do
184
- after_file do |parser|
185
- expect(parser.contents).to eq 'class Foo; end'
186
- expect(parser.file).to match(/(foo|bar)\.rb/)
187
- end
188
- parse_list ['foo.rb', 'class Foo; end'], ['bar.rb', 'class Foo; end']
189
- expect(Registry.at('Foo')).not_to be nil
190
- end
191
-
192
- it "supports multiple callbacks" do
193
- checks = []
194
- after_file { checks << :one }
195
- after_file { checks << :two }
196
- parse_list ['file.rb', ''], ['file2.rb', ''], ['file3.rb', 'class Foo; end']
197
- expect(Registry.at('Foo')).not_to be nil
198
- expect(checks).to eq [:one, :two, :one, :two, :one, :two]
199
- end
200
-
201
- it "does not cancel parsing if it returns false" do
202
- checks = []
203
- after_file { checks << :one }
204
- after_file { false }
205
- after_file { checks << :three }
206
- parse_list ['file.rb', ''], ['file2.rb', ''], ['file3.rb', 'class Foo; end']
207
- expect(Registry.at('Foo')).not_to be nil
208
- expect(checks).to eq [:one, :three, :one, :three, :one, :three]
209
- end
210
- end
211
-
212
- describe ".register_parser_type" do
213
- it_should_behave_like "parser type registration"
214
-
215
- it "registers a subclass of Parser::Base" do
216
- parser = double(:parser)
217
- expect(parser).to receive(:parse)
218
- expect(MyParser).to receive(:new).with('content', '(stdin)').and_return(parser)
219
- Parser::SourceParser.register_parser_type(:my_parser, MyParser, 'myparser')
220
- Parser::SourceParser.parse_string('content', :my_parser)
221
- end
222
-
223
- it "requires class to be a subclass of Parser::Base" do
224
- expect { Parser::SourceParser.register_parser_type(:my_parser, String) }.to raise_error(ArgumentError)
225
- expect { Parser::SourceParser.register_parser_type(:my_parser, Parser::Base) }.to raise_error(ArgumentError)
226
- end
227
- end
228
-
229
- describe ".parser_type_for_extension" do
230
- it_should_behave_like "parser type registration"
231
-
232
- it "finds an extension in a registered array of extensions" do
233
- Parser::SourceParser.register_parser_type(:my_parser, MyParser, ['a', 'b', 'd'])
234
- expect(Parser::SourceParser.parser_type_for_extension('a')).to eq :my_parser
235
- expect(Parser::SourceParser.parser_type_for_extension('b')).to eq :my_parser
236
- expect(Parser::SourceParser.parser_type_for_extension('d')).to eq :my_parser
237
- expect(Parser::SourceParser.parser_type_for_extension('c')).not_to eq :my_parser
238
- end
239
-
240
- it "finds an extension in a Regexp" do
241
- Parser::SourceParser.register_parser_type(:my_parser, MyParser, /abc$/)
242
- expect(Parser::SourceParser.parser_type_for_extension('dabc')).to eq :my_parser
243
- expect(Parser::SourceParser.parser_type_for_extension('dabcd')).not_to eq :my_parser
244
- end
245
-
246
- it "finds an extension in a list of Regexps" do
247
- Parser::SourceParser.register_parser_type(:my_parser, MyParser, [/ab$/, /abc$/])
248
- expect(Parser::SourceParser.parser_type_for_extension('dabc')).to eq :my_parser
249
- expect(Parser::SourceParser.parser_type_for_extension('dabcd')).not_to eq :my_parser
250
- end
251
-
252
- it "finds an extension in a String" do
253
- Parser::SourceParser.register_parser_type(:my_parser, MyParser, "abc")
254
- expect(Parser::SourceParser.parser_type_for_extension('abc')).to eq :my_parser
255
- expect(Parser::SourceParser.parser_type_for_extension('abcd')).not_to eq :my_parser
256
- end
257
- end
258
-
259
- describe "#parse_string" do
260
- it "parses basic Ruby code" do
261
- YARD.parse_string(<<-eof)
262
- module Hello
263
- class Hi
264
- # Docstring
265
- # Docstring2
266
- def me; "VALUE" end
267
- end
268
- end
269
- eof
270
- expect(Registry.at(:Hello)).not_to eq nil
271
- expect(Registry.at("Hello::Hi#me")).not_to eq nil
272
- expect(Registry.at("Hello::Hi#me").docstring).to eq "Docstring\nDocstring2"
273
- expect(Registry.at("Hello::Hi#me").docstring.line_range).to eq(3..4)
274
- end
275
-
276
- it "parses Ruby code with metaclasses" do
277
- YARD.parse_string(<<-eof)
278
- module Hello
279
- class Hi
280
- class <<self
281
- # Docstring
282
- def me; "VALUE" end
283
- end
284
- end
285
- end
286
- eof
287
- expect(Registry.at(:Hello)).not_to eq nil
288
- expect(Registry.at("Hello::Hi.me")).not_to eq nil
289
- expect(Registry.at("Hello::Hi.me").docstring).to eq "Docstring"
290
- end
291
-
292
- it "only uses prepended comments for an object" do
293
- YARD.parse_string(<<-eof)
294
- # Test
295
-
296
- # PASS
297
- module Hello
298
- end # FAIL
299
- eof
300
- expect(Registry.at(:Hello).docstring).to eq "PASS"
301
- end
302
-
303
- it "does not add comments appended to last line of block" do
304
- YARD.parse_string <<-eof
305
- module Hello2
306
- end # FAIL
307
- eof
308
- expect(Registry.at(:Hello2).docstring).to be_blank
309
- end
310
-
311
- it "adds comments appended to an object's first line" do
312
- YARD.parse_string <<-eof
313
- module Hello # PASS
314
- HELLO
315
- end
316
-
317
- module Hello2 # PASS
318
- # ANOTHER PASS
319
- def x; end
320
- end
321
- eof
322
-
323
- expect(Registry.at(:Hello).docstring).to eq "PASS"
324
- expect(Registry.at(:Hello2).docstring).to eq "PASS"
325
- expect(Registry.at('Hello2#x').docstring).to eq "ANOTHER PASS"
326
- end
327
-
328
- it "takes preceding comments only if they exist" do
329
- YARD.parse_string <<-eof
330
- # PASS
331
- module Hello # FAIL
332
- HELLO
333
- end
334
- eof
335
-
336
- expect(Registry.at(:Hello).docstring).to eq "PASS"
337
- end
338
-
339
- it "strips all hashes prefixed on comment line" do
340
- YARD.parse_string(<<-eof)
341
- ### PASS
342
- #### PASS
343
- ##### PASS
344
- module Hello
345
- end
346
- eof
347
- expect(Registry.at(:Hello).docstring).to eq "PASS\nPASS\nPASS"
348
- end
349
-
350
- it "handles =begin/=end style comments" do
351
- YARD.parse_string "=begin\nfoo\nbar\n=end\nclass Foo; end\n"
352
- expect(Registry.at(:Foo).docstring).to eq "foo\nbar"
353
-
354
- YARD.parse_string "=begin\n\nfoo\nbar\n=end\nclass Foo; end\n"
355
- expect(Registry.at(:Foo).docstring).to eq "foo\nbar"
356
-
357
- YARD.parse_string "=begin\nfoo\n\nbar\n=end\nclass Foo; end\n"
358
- expect(Registry.at(:Foo).docstring).to eq "foo\n\nbar"
359
- end
360
-
361
- it "knows about docstrings starting with ##" do
362
- {'#' => false, '##' => true}.each do |hash, expected|
363
- YARD.parse_string "#{hash}\n# Foo bar\nclass Foo; end"
364
- expect(Registry.at(:Foo).docstring.hash_flag).to eq expected
365
- end
366
- end
367
-
368
- it "removes shebang from initial file comments" do
369
- YARD.parse_string "#!/bin/ruby\n# this is a comment\nclass Foo; end"
370
- expect(Registry.at(:Foo).docstring).to eq "this is a comment"
371
- end
372
-
373
- it "removes encoding line from initial file comments" do
374
- YARD.parse_string "# encoding: utf-8\n# this is a comment\nclass Foo; end"
375
- expect(Registry.at(:Foo).docstring).to eq "this is a comment"
376
- end
377
-
378
- it "adds macros on any object" do
379
- YARD.parse_string <<-eof
380
- # @!macro [new] foo
381
- # This is a macro
382
- # @return [String] the string
383
- class Foo
384
- # @!macro foo
385
- def foo; end
386
- end
387
- eof
388
-
389
- macro = CodeObjects::MacroObject.find('foo')
390
- expect(macro.macro_data).to eq "This is a macro\n@return [String] the string"
391
- expect(Registry.at('Foo').docstring.to_raw).to eq macro.macro_data
392
- expect(Registry.at('Foo#foo').docstring.to_raw).to eq macro.macro_data
393
- end
394
-
395
- it "allows directives parsed on lone comments" do
396
- YARD.parse_string(<<-eof)
397
- class Foo
398
- # @!method foo(a = "hello")
399
- # @!scope class
400
- # @!visibility private
401
- # @param [String] a the name of the foo
402
- # @return [Symbol] the symbolized foo
403
-
404
- # @!method bar(value)
405
- end
406
- eof
407
- foo = Registry.at('Foo.foo')
408
- bar = Registry.at('Foo#bar')
409
- expect(foo).not_to be nil
410
- expect(foo.visibility).to eq :private
411
- expect(foo.tag(:param).name).to eq 'a'
412
- expect(foo.tag(:return).types).to eq ['Symbol']
413
- expect(bar).not_to be nil
414
- expect(bar.signature).to eq 'def bar(value)'
415
- end
416
-
417
- it "parses lone comments at end of blocks" do
418
- YARD.parse_string(<<-eof)
419
- class Foo
420
- none
421
-
422
- # @!method foo(a = "hello")
423
- end
424
- eof
425
- foo = Registry.at('Foo#foo')
426
- expect(foo).not_to be nil
427
- expect(foo.signature).to eq 'def foo(a = "hello")'
428
- end
429
-
430
- it "handles lone comment with no code" do
431
- YARD.parse_string '# @!method foo(a = "hello")'
432
- foo = Registry.at('#foo')
433
- expect(foo).not_to be nil
434
- expect(foo.signature).to eq 'def foo(a = "hello")'
435
- end
436
-
437
- it "handles non-ASCII encoding in heredoc" do
438
- YARD.parse_string <<-eof
439
- # encoding: utf-8
440
-
441
- heredoc <<-ending
442
- foo\u{ffe2} bar.
443
- ending
444
-
445
- # Hello \u{ffe2} world
446
- class Foo < Bar
447
- attr_accessor :foo
448
- end
449
- eof
450
- expect(Registry.at('Foo').superclass).to eq P('Bar')
451
- end
452
- end
453
-
454
- describe "#parse" do
455
- it "parses a basic Ruby file" do
456
- parse_file :example1, __FILE__
457
- expect(Registry.at(:Hello)).not_to eq nil
458
- expect(Registry.at("Hello::Hi#me")).not_to eq nil
459
- expect(Registry.at("Hello::Hi#me").docstring).to eq "Docstring"
460
- end
461
-
462
- it "parses a set of file globs" do
463
- expect(Dir).to receive(:[]).with('lib/**/*.rb').and_return([])
464
- YARD.parse('lib/**/*.rb')
465
- end
466
-
467
- it "parses a set of absolute paths" do
468
- expect(Dir).not_to receive(:[])
469
- expect(File).to receive(:file?).with('/path/to/file').and_return(true)
470
- expect(File).to receive(:read_binary).with('/path/to/file').and_return("")
471
- YARD.parse('/path/to/file')
472
- end
473
-
474
- it "cleans paths before parsing" do
475
- expect(File).to receive(:open).and_return("")
476
- parser = Parser::SourceParser.new(:ruby, true)
477
- parser.parse('a//b//c')
478
- expect(parser.file).to eq 'a/b/c'
479
- end
480
-
481
- it "parses files with '*' in them as globs and others as absolute paths" do
482
- expect(Dir).to receive(:[]).with('*.rb').and_return(['a.rb', 'b.rb'])
483
- expect(File).to receive(:file?).with('/path/to/file').and_return(true)
484
- expect(File).to receive(:file?).with('a.rb').and_return(true)
485
- expect(File).to receive(:file?).with('b.rb').and_return(true)
486
- expect(File).to receive(:read_binary).with('/path/to/file').and_return("")
487
- expect(File).to receive(:read_binary).with('a.rb').and_return("")
488
- expect(File).to receive(:read_binary).with('b.rb').and_return("")
489
- YARD.parse ['/path/to/file', '*.rb']
490
- end
491
-
492
- it "converts directories into globs" do
493
- expect(Dir).to receive(:[]).with('foo/**/*.{rb,c,cc,cxx,cpp}').and_return(['foo/a.rb', 'foo/bar/b.rb'])
494
- expect(File).to receive(:directory?).with('foo').and_return(true)
495
- expect(File).to receive(:file?).with('foo/a.rb').and_return(true)
496
- expect(File).to receive(:file?).with('foo/bar/b.rb').and_return(true)
497
- expect(File).to receive(:read_binary).with('foo/a.rb').and_return("")
498
- expect(File).to receive(:read_binary).with('foo/bar/b.rb').and_return("")
499
- YARD.parse ['foo']
500
- end
501
-
502
- it "uses Registry.checksums cache if file is cached" do
503
- data = 'DATA'
504
- hash = Registry.checksum_for(data)
505
- cmock = double(:cmock)
506
- expect(cmock).to receive(:[]).with('foo/bar').and_return(hash)
507
- expect(Registry).to receive(:checksums).and_return(cmock)
508
- expect(File).to receive(:file?).with('foo/bar').and_return(true)
509
- expect(File).to receive(:read_binary).with('foo/bar').and_return(data)
510
- YARD.parse('foo/bar')
511
- end
512
-
513
- it "supports excluded paths" do
514
- expect(File).to receive(:file?).with('foo/bar').and_return(true)
515
- expect(File).to receive(:file?).with('foo/baz').and_return(true)
516
- expect(File).not_to receive(:read_binary)
517
- YARD.parse(["foo/bar", "foo/baz"], ["foo", /baz$/])
518
- end
519
-
520
- it "converts file contents to proper encoding if coding line is present" do
521
- valid = []
522
- valid << "# encoding: sjis"
523
- valid << "# encoding: utf-8"
524
- valid << "# xxxxxencoding: sjis"
525
- valid << "# xxxxxencoding: sjis xxxxxx"
526
- valid << "# ENCODING: sjis"
527
- valid << "#coDiNG: sjis"
528
- valid << "# -*- coding: sjis -*-"
529
- valid << "# -*- coding: utf-8; indent-tabs-mode: nil"
530
- valid << "### coding: sjis"
531
- valid << "# encoding=sjis"
532
- valid << "# encoding:sjis"
533
- valid << "# encoding = sjis"
534
- valid << "# encoding == sjis"
535
- valid << "# encoding : sjis"
536
- valid << "# encoding :: sjis"
537
- valid << "#!/bin/shebang\n# encoding: sjis"
538
- valid << "#!/bin/shebang\r\n# coding: sjis"
539
- invalid = []
540
- invalid << "#\n# encoding: sjis"
541
- invalid << "#!/bin/shebang\n#\n# encoding: sjis"
542
- invalid << "# !/bin/shebang\n# encoding: sjis"
543
- {:to => valid, :not_to => invalid}.each do |msg, list|
544
- list.each do |src|
545
- Registry.clear
546
- parser = Parser::SourceParser.new
547
- expect(File).to receive(:read_binary).with('tmpfile').and_return(src)
548
- result = parser.parse("tmpfile")
549
- if HAVE_RIPPER && YARD.ruby19?
550
- if msg == :not_to
551
- default_encoding = 'UTF-8'
552
- expect(result.enumerator[0].source.encoding.to_s).to eq(default_encoding)
553
- else
554
- expect(['Shift_JIS', 'Windows-31J', 'UTF-8']).send(msg,
555
- include(result.enumerator[0].source.encoding.to_s))
556
- end
557
- end
558
- expect(result.encoding_line).send(msg, eq(src.split("\n").last))
559
- end
560
- end
561
- end
562
-
563
- it "converts C file contents to proper encoding if coding line is present" do
564
- valid = []
565
- valid << "/* coding: utf-8 */"
566
- valid << "/* -*- coding: utf-8; c-file-style: \"ruby\" -*- */"
567
- valid << "// coding: utf-8"
568
- valid << "// -*- coding: utf-8; c-file-style: \"ruby\" -*-"
569
- invalid = []
570
- {:to => valid, :not_to => invalid}.each do |msg, list|
571
- list.each do |src|
572
- Registry.clear
573
- parser = Parser::SourceParser.new
574
- expect(File).to receive(:read_binary).with('tmpfile.c').and_return(src)
575
- result = parser.parse("tmpfile.c")
576
- content = result.instance_variable_get("@content")
577
- expect(['UTF-8']).send(msg, include(content.encoding.to_s))
578
- end
579
- end
580
- end if YARD.ruby19?
581
-
582
- Parser::SourceParser::ENCODING_BYTE_ORDER_MARKS.each do |encoding, bom|
583
- it "understands #{encoding.upcase} BOM" do
584
- parser = Parser::SourceParser.new
585
- src = bom + String.new("class FooBar; end").force_encoding('binary')
586
- src.force_encoding('binary')
587
- expect(File).to receive(:read_binary).with('tmpfile').and_return(src)
588
- result = parser.parse('tmpfile')
589
- expect(Registry.all(:class).first.path).to eq "FooBar"
590
- expect(result.enumerator[0].source.encoding.to_s.downcase).to eq encoding
591
- end
592
- end if HAVE_RIPPER && YARD.ruby19?
593
- end
594
-
595
- describe "#parse_in_order" do
596
- def in_order_parse(*files)
597
- paths = files.map {|f| File.join(File.dirname(__FILE__), 'examples', f.to_s + '.rb.txt') }
598
- YARD::Parser::SourceParser.parse(paths, [], Logger::DEBUG)
599
- end
600
-
601
- it "attempts to parse files in order" do
602
- log.enter_level(Logger::DEBUG) do
603
- msgs = []
604
- expect(log).to receive(:debug) {|m| msgs << m }.at_least(:once)
605
- allow(log).to receive(:<<)
606
- in_order_parse 'parse_in_order_001', 'parse_in_order_002'
607
- expect(msgs[1]).to match(/Parsing .+parse_in_order_001.+/)
608
- expect(msgs[2]).to match(/Missing object MyModule/)
609
- expect(msgs[3]).to match(/Parsing .+parse_in_order_002.+/)
610
- expect(msgs[4]).to match(/Re-processing .+parse_in_order_001.+/)
611
- end
612
- end
613
-
614
- it "attempts to order files by length for globs (process toplevel files first)" do
615
- files = %w(a a/b a/b/c)
616
- files.each do |file|
617
- expect(File).to receive(:file?).with(file).and_return(true)
618
- expect(File).to receive(:read_binary).with(file).ordered.and_return('')
619
- end
620
- expect(Dir).to receive(:[]).with('a/**/*').and_return(files.reverse)
621
- YARD.parse 'a/**/*'
622
- end
623
-
624
- it "allows overriding of length sorting when single file is presented" do
625
- files = %w(a/b/c a a/b)
626
- files.each do |file|
627
- expect(File).to receive(:file?).with(file).at_least(1).times.and_return(true)
628
- expect(File).to receive(:read_binary).with(file).ordered.and_return('')
629
- end
630
- expect(Dir).to receive(:[]).with('a/**/*').and_return(files.reverse)
631
- YARD.parse ['a/b/c', 'a/**/*']
632
- end
633
- end
634
-
635
- describe "#parse_statements" do
636
- before do
637
- Registry.clear
638
- end
639
-
640
- it "displays a warning for invalid parser type" do
641
- expect(log).to receive(:warn).with(/unrecognized file/)
642
- expect(log).to receive(:backtrace)
643
- YARD::Parser::SourceParser.parse_string("int main() { }", :d)
644
- end
645
-
646
- if HAVE_RIPPER
647
- it "displays a warning for a syntax error (with new parser)" do
648
- expect(log).to receive(:warn).with(/Syntax error in/)
649
- expect(log).to receive(:backtrace)
650
- YARD::Parser::SourceParser.parse_string("%!!!", :ruby)
651
- end
652
- end
653
-
654
- it "handles groups" do
655
- YARD.parse_string <<-eof
656
- class A
657
- # @group Group Name
658
- def foo; end
659
- def foo2; end
660
-
661
- # @endgroup
662
-
663
- def bar; end
664
-
665
- # @group Group 2
666
- def baz; end
667
- end
668
- eof
669
-
670
- expect(Registry.at('A').groups).to eq ['Group Name', 'Group 2']
671
- expect(Registry.at('A#bar').group).to be nil
672
- expect(Registry.at('A#foo').group).to eq "Group Name"
673
- expect(Registry.at('A#foo2').group).to eq "Group Name"
674
- expect(Registry.at('A#baz').group).to eq "Group 2"
675
- end
676
-
677
- it "handles multi-line class/module references" do
678
- YARD.parse_string <<-eof
679
- class A::
680
- B::C; end
681
- eof
682
- expect(Registry.all).to eq [P('A::B::C')]
683
- end
684
-
685
- it "handles sclass definitions of multi-line class/module references" do
686
- YARD.parse_string <<-eof
687
- class << A::
688
- B::C
689
- def foo; end
690
- end
691
- eof
692
- expect(Registry.all.size).to eq 2
693
- expect(Registry.at('A::B::C')).not_to be nil
694
- expect(Registry.at('A::B::C.foo')).not_to be nil
695
- end
696
-
697
- it "handles lone comment blocks at the end of a namespace" do
698
- YARD.parse_string <<-eof
699
- module A
700
- class B
701
- def c; end
702
-
703
- # @!method d
704
- end
705
- end
706
- eof
707
- expect(Registry.at('A#d')).to be nil
708
- expect(Registry.at('A::B#d')).not_to be nil
709
- end
710
-
711
- if YARD.ruby2?
712
- it "supports named arguments with default values" do
713
- YARD.parse_string 'def foo(a, b = 1, *c, d, e: 3, **f, &g) end'
714
- args = [['a', nil], ['b', '1'], ['*c', nil], ['d', nil], ['e:', '3'], ['**f', nil], ['&g', nil]]
715
- expect(Registry.at('#foo').parameters).to eq(args)
716
- end
717
- end
718
-
719
- if NAMED_OPTIONAL_ARGUMENTS && !LEGACY_PARSER
720
- it "supports named arguments without default values" do
721
- YARD.parse_string 'def foo(a, b = 1, *c, d, e: 3, f:, **g, &h) end'
722
- args = [['a', nil], ['b', '1'], ['*c', nil], ['d', nil], ['e:', '3'], ['f:', nil], ['**g', nil], ['&h', nil]]
723
- expect(Registry.at('#foo').parameters).to eq(args)
724
- end
725
- end
726
- end
727
- end