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,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