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.
- checksums.yaml +4 -4
- data/.rubocop.yml +37 -24
- data/CHANGELOG.md +18 -3
- data/README.md +96 -101
- data/Rakefile +2 -0
- data/lib/yard/cli/diff.rb +4 -1
- data/lib/yard/cli/server.rb +22 -13
- data/lib/yard/code_objects/proxy.rb +2 -1
- data/lib/yard/globals.rb +1 -1
- data/lib/yard/handlers/c/base.rb +164 -129
- data/lib/yard/parser/ruby/ruby_parser.rb +6 -4
- data/lib/yard/registry_store.rb +1 -1
- data/lib/yard/templates/helpers/html_helper.rb +10 -3
- data/lib/yard/templates/helpers/markup/rdoc_markup.rb +5 -4
- data/lib/yard/version.rb +1 -1
- data/tasks/update_error_map.rake +53 -0
- data/yard.gemspec +1 -1
- metadata +3 -207
- data/spec/cli/command_parser_spec.rb +0 -43
- data/spec/cli/command_spec.rb +0 -36
- data/spec/cli/config_spec.rb +0 -148
- data/spec/cli/diff_spec.rb +0 -254
- data/spec/cli/display_spec.rb +0 -30
- data/spec/cli/gems_spec.rb +0 -81
- data/spec/cli/graph_spec.rb +0 -18
- data/spec/cli/help_spec.rb +0 -22
- data/spec/cli/i18n_spec.rb +0 -107
- data/spec/cli/list_spec.rb +0 -8
- data/spec/cli/markup_types_spec.rb +0 -22
- data/spec/cli/server_spec.rb +0 -324
- data/spec/cli/stats_spec.rb +0 -96
- data/spec/cli/yard_on_yard_spec.rb +0 -38
- data/spec/cli/yardoc_spec.rb +0 -896
- data/spec/cli/yri_spec.rb +0 -101
- data/spec/code_objects/base_spec.rb +0 -485
- data/spec/code_objects/class_object_spec.rb +0 -226
- data/spec/code_objects/code_object_list_spec.rb +0 -36
- data/spec/code_objects/constants_spec.rb +0 -116
- data/spec/code_objects/extra_file_object_spec.rb +0 -161
- data/spec/code_objects/macro_object_spec.rb +0 -150
- data/spec/code_objects/method_object_spec.rb +0 -184
- data/spec/code_objects/module_object_spec.rb +0 -142
- data/spec/code_objects/namespace_mapper_spec.rb +0 -32
- data/spec/code_objects/namespace_object_spec.rb +0 -171
- data/spec/code_objects/proxy_spec.rb +0 -147
- data/spec/code_objects/spec_helper.rb +0 -3
- data/spec/config_spec.rb +0 -171
- data/spec/core_ext/array_spec.rb +0 -13
- data/spec/core_ext/file_spec.rb +0 -72
- data/spec/core_ext/hash_spec.rb +0 -14
- data/spec/core_ext/insertion_spec.rb +0 -37
- data/spec/core_ext/module_spec.rb +0 -9
- data/spec/core_ext/string_spec.rb +0 -42
- data/spec/core_ext/symbol_hash_spec.rb +0 -89
- data/spec/docstring_parser_spec.rb +0 -280
- data/spec/docstring_spec.rb +0 -373
- data/spec/handlers/alias_handler_spec.rb +0 -82
- data/spec/handlers/attribute_handler_spec.rb +0 -96
- data/spec/handlers/base_spec.rb +0 -216
- data/spec/handlers/c/alias_handler_spec.rb +0 -34
- data/spec/handlers/c/attribute_handler_spec.rb +0 -41
- data/spec/handlers/c/class_handler_spec.rb +0 -78
- data/spec/handlers/c/constant_handler_spec.rb +0 -71
- data/spec/handlers/c/init_handler_spec.rb +0 -48
- data/spec/handlers/c/method_handler_spec.rb +0 -327
- data/spec/handlers/c/mixin_handler_spec.rb +0 -44
- data/spec/handlers/c/module_handler_spec.rb +0 -71
- data/spec/handlers/c/override_comment_handler_spec.rb +0 -47
- data/spec/handlers/c/path_handler_spec.rb +0 -36
- data/spec/handlers/c/spec_helper.rb +0 -23
- data/spec/handlers/c/struct_handler_spec.rb +0 -16
- data/spec/handlers/class_condition_handler_spec.rb +0 -87
- data/spec/handlers/class_handler_spec.rb +0 -247
- data/spec/handlers/class_method_handler_shared_examples.rb +0 -133
- data/spec/handlers/class_variable_handler_spec.rb +0 -12
- data/spec/handlers/constant_handler_spec.rb +0 -112
- data/spec/handlers/decorator_handler_methods_spec.rb +0 -393
- data/spec/handlers/dsl_handler_spec.rb +0 -226
- data/spec/handlers/examples/alias_handler_001.rb.txt +0 -46
- data/spec/handlers/examples/attribute_handler_001.rb.txt +0 -32
- data/spec/handlers/examples/class_condition_handler_001.rb.txt +0 -69
- data/spec/handlers/examples/class_handler_001.rb.txt +0 -120
- data/spec/handlers/examples/class_variable_handler_001.rb.txt +0 -10
- data/spec/handlers/examples/constant_handler_001.rb.txt +0 -35
- data/spec/handlers/examples/dsl_handler_001.rb.txt +0 -156
- data/spec/handlers/examples/exception_handler_001.rb.txt +0 -59
- data/spec/handlers/examples/extend_handler_001.rb.txt +0 -19
- data/spec/handlers/examples/method_condition_handler_001.rb.txt +0 -10
- data/spec/handlers/examples/method_handler_001.rb.txt +0 -128
- data/spec/handlers/examples/mixin_handler_001.rb.txt +0 -40
- data/spec/handlers/examples/module_handler_001.rb.txt +0 -29
- data/spec/handlers/examples/private_constant_handler_001.rb.txt +0 -8
- data/spec/handlers/examples/process_handler_001.rb.txt +0 -11
- data/spec/handlers/examples/visibility_handler_001.rb.txt +0 -36
- data/spec/handlers/examples/yield_handler_001.rb.txt +0 -54
- data/spec/handlers/exception_handler_spec.rb +0 -49
- data/spec/handlers/extend_handler_spec.rb +0 -28
- data/spec/handlers/legacy_base_spec.rb +0 -128
- data/spec/handlers/method_condition_handler_spec.rb +0 -15
- data/spec/handlers/method_handler_spec.rb +0 -214
- data/spec/handlers/mixin_handler_spec.rb +0 -60
- data/spec/handlers/module_function_handler_spec.rb +0 -106
- data/spec/handlers/module_handler_spec.rb +0 -35
- data/spec/handlers/private_class_method_handler_spec.rb +0 -11
- data/spec/handlers/private_constant_handler_spec.rb +0 -25
- data/spec/handlers/processor_spec.rb +0 -35
- data/spec/handlers/public_class_method_handler_spec.rb +0 -11
- data/spec/handlers/ruby/base_spec.rb +0 -95
- data/spec/handlers/ruby/legacy/base_spec.rb +0 -84
- data/spec/handlers/spec_helper.rb +0 -33
- data/spec/handlers/visibility_handler_spec.rb +0 -44
- data/spec/handlers/yield_handler_spec.rb +0 -52
- data/spec/i18n/locale_spec.rb +0 -81
- data/spec/i18n/message_spec.rb +0 -52
- data/spec/i18n/messages_spec.rb +0 -67
- data/spec/i18n/pot_generator_spec.rb +0 -295
- data/spec/i18n/text_spec.rb +0 -184
- data/spec/logging_spec.rb +0 -44
- data/spec/options_spec.rb +0 -171
- data/spec/parser/base_spec.rb +0 -24
- data/spec/parser/c_parser_spec.rb +0 -236
- data/spec/parser/examples/array.c.txt +0 -6267
- data/spec/parser/examples/example1.rb.txt +0 -8
- data/spec/parser/examples/extrafile.c.txt +0 -8
- data/spec/parser/examples/file.c.txt +0 -28
- data/spec/parser/examples/multifile.c.txt +0 -22
- data/spec/parser/examples/namespace.cpp.txt +0 -68
- data/spec/parser/examples/override.c.txt +0 -424
- data/spec/parser/examples/parse_in_order_001.rb.txt +0 -2
- data/spec/parser/examples/parse_in_order_002.rb.txt +0 -2
- data/spec/parser/examples/tag_handler_001.rb.txt +0 -8
- data/spec/parser/ruby/ast_node_spec.rb +0 -33
- data/spec/parser/ruby/legacy/statement_list_spec.rb +0 -299
- data/spec/parser/ruby/legacy/token_list_spec.rb +0 -79
- data/spec/parser/ruby/ruby_parser_spec.rb +0 -520
- data/spec/parser/ruby/token_resolver_spec.rb +0 -165
- data/spec/parser/source_parser_spec.rb +0 -727
- data/spec/parser/tag_parsing_spec.rb +0 -17
- data/spec/rake/yardoc_task_spec.rb +0 -118
- data/spec/registry_resolver_spec.rb +0 -15
- data/spec/registry_spec.rb +0 -463
- data/spec/registry_store_spec.rb +0 -327
- data/spec/rubygems/doc_manager_spec.rb +0 -112
- data/spec/serializers/data/serialized_yardoc/checksums +0 -1
- data/spec/serializers/data/serialized_yardoc/objects/Foo.dat +0 -0
- data/spec/serializers/data/serialized_yardoc/objects/Foo/bar_i.dat +0 -0
- data/spec/serializers/data/serialized_yardoc/objects/Foo/baz_i.dat +0 -0
- data/spec/serializers/data/serialized_yardoc/objects/root.dat +0 -0
- data/spec/serializers/data/serialized_yardoc/proxy_types +0 -2
- data/spec/serializers/file_system_serializer_spec.rb +0 -145
- data/spec/serializers/spec_helper.rb +0 -2
- data/spec/serializers/yardoc_serializer_spec.rb +0 -90
- data/spec/server/adapter_spec.rb +0 -39
- data/spec/server/commands/base_spec.rb +0 -91
- data/spec/server/commands/library_command_spec.rb +0 -39
- data/spec/server/doc_server_helper_spec.rb +0 -72
- data/spec/server/doc_server_serializer_spec.rb +0 -60
- data/spec/server/rack_adapter_spec.rb +0 -21
- data/spec/server/router_spec.rb +0 -123
- data/spec/server/spec_helper.rb +0 -22
- data/spec/server/static_caching_spec.rb +0 -47
- data/spec/server/webrick_servlet_spec.rb +0 -20
- data/spec/server_spec.rb +0 -19
- data/spec/spec_helper.rb +0 -212
- data/spec/tags/default_factory_spec.rb +0 -168
- data/spec/tags/default_tag_spec.rb +0 -11
- data/spec/tags/directives_spec.rb +0 -463
- data/spec/tags/library_spec.rb +0 -48
- data/spec/tags/overload_tag_spec.rb +0 -53
- data/spec/tags/ref_tag_list_spec.rb +0 -53
- data/spec/tags/types_explainer_spec.rb +0 -203
- data/spec/templates/class_spec.rb +0 -45
- data/spec/templates/constant_spec.rb +0 -41
- data/spec/templates/engine_spec.rb +0 -131
- data/spec/templates/examples/class001.html +0 -308
- data/spec/templates/examples/class001.txt +0 -36
- data/spec/templates/examples/class002.html +0 -39
- data/spec/templates/examples/constant001.txt +0 -25
- data/spec/templates/examples/constant002.txt +0 -7
- data/spec/templates/examples/constant003.txt +0 -11
- data/spec/templates/examples/method001.html +0 -137
- data/spec/templates/examples/method001.txt +0 -35
- data/spec/templates/examples/method002.html +0 -91
- data/spec/templates/examples/method002.txt +0 -20
- data/spec/templates/examples/method003.html +0 -165
- data/spec/templates/examples/method003.txt +0 -45
- data/spec/templates/examples/method004.html +0 -48
- data/spec/templates/examples/method004.txt +0 -10
- data/spec/templates/examples/method005.html +0 -105
- data/spec/templates/examples/method005.txt +0 -33
- data/spec/templates/examples/method006.html +0 -108
- data/spec/templates/examples/method006.txt +0 -20
- data/spec/templates/examples/module001.dot +0 -33
- data/spec/templates/examples/module001.html +0 -833
- data/spec/templates/examples/module001.txt +0 -33
- data/spec/templates/examples/module002.html +0 -341
- data/spec/templates/examples/module003.html +0 -202
- data/spec/templates/examples/module004.html +0 -394
- data/spec/templates/examples/module005.html +0 -82
- data/spec/templates/examples/tag001.txt +0 -82
- data/spec/templates/helpers/base_helper_spec.rb +0 -171
- data/spec/templates/helpers/html_helper_spec.rb +0 -666
- data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +0 -65
- data/spec/templates/helpers/markup/rdoc_markup_spec.rb +0 -84
- data/spec/templates/helpers/markup_helper_spec.rb +0 -136
- data/spec/templates/helpers/method_helper_spec.rb +0 -107
- data/spec/templates/helpers/module_helper_spec.rb +0 -35
- data/spec/templates/helpers/shared_signature_examples.rb +0 -126
- data/spec/templates/helpers/text_helper_spec.rb +0 -65
- data/spec/templates/markup_processor_integrations/asciidoctor_spec.rb +0 -60
- data/spec/templates/markup_processor_integrations/integration_spec_helper.rb +0 -50
- data/spec/templates/markup_processor_integrations/rdoc_markdown_spec.rb +0 -48
- data/spec/templates/markup_processor_integrations/rdoc_spec.rb +0 -39
- data/spec/templates/markup_processor_integrations/redcarpet_spec.rb +0 -64
- data/spec/templates/markup_processor_integrations/redcloth_spec.rb +0 -64
- data/spec/templates/method_spec.rb +0 -118
- data/spec/templates/module_spec.rb +0 -203
- data/spec/templates/onefile_spec.rb +0 -66
- data/spec/templates/section_spec.rb +0 -144
- data/spec/templates/spec_helper.rb +0 -76
- data/spec/templates/tag_spec.rb +0 -52
- data/spec/templates/template_spec.rb +0 -410
- 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
|