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.
- checksums.yaml +4 -4
- data/.dockerignore +0 -0
- data/.gitattributes +4 -0
- data/.github/FUNDING.yml +3 -0
- data/.github/ISSUE_TEMPLATE.md +6 -6
- data/.github/PULL_REQUEST_TEMPLATE.md +5 -5
- data/.github/workflows/ci.yml +30 -0
- data/.github/workflows/gem.yml +19 -0
- data/.gitignore +0 -0
- data/.rspec +0 -0
- data/.rubocop.yml +37 -24
- data/.yardopts +0 -0
- data/.yardopts_guide +0 -0
- data/.yardopts_i18n +0 -0
- data/CHANGELOG.md +50 -4
- data/CONTRIBUTING.md +2 -2
- data/Gemfile +5 -3
- data/README.md +97 -102
- data/Rakefile +2 -3
- data/lib/yard/cli/diff.rb +4 -1
- data/lib/yard/cli/server.rb +22 -13
- data/lib/yard/cli/stats.rb +2 -0
- data/lib/yard/cli/yardoc.rb +2 -1
- data/lib/yard/code_objects/method_object.rb +1 -1
- data/lib/yard/code_objects/namespace_mapper.rb +30 -3
- data/lib/yard/code_objects/proxy.rb +2 -1
- data/lib/yard/globals.rb +1 -1
- data/lib/yard/handlers/c/base.rb +35 -0
- data/lib/yard/handlers/ruby/method_handler.rb +1 -1
- data/lib/yard/handlers/ruby/mixin_handler.rb +7 -2
- data/lib/yard/handlers/ruby/module_function_handler.rb +15 -3
- data/lib/yard/parser/ruby/ast_node.rb +2 -2
- data/lib/yard/parser/ruby/ruby_parser.rb +7 -5
- data/lib/yard/parser/ruby/token_resolver.rb +3 -1
- data/lib/yard/parser/source_parser.rb +1 -1
- data/lib/yard/registry_resolver.rb +10 -24
- data/lib/yard/registry_store.rb +1 -1
- data/lib/yard/serializers/yardoc_serializer.rb +1 -1
- data/lib/yard/server/commands/base.rb +2 -2
- data/lib/yard/server/commands/library_command.rb +1 -1
- data/lib/yard/tags/directives.rb +10 -1
- data/lib/yard/templates/helpers/html_helper.rb +15 -5
- data/lib/yard/templates/helpers/markup/rdoc_markup.rb +5 -4
- data/lib/yard/templates/helpers/markup_helper.rb +2 -1
- data/lib/yard/templates/section.rb +1 -3
- data/lib/yard/version.rb +1 -1
- data/lib/yard.rb +3 -0
- data/samus.json +15 -46
- data/tasks/prepare_tag.rake +45 -0
- data/tasks/update_error_map.rake +53 -0
- data/templates/default/fulldoc/html/css/style.css +1 -0
- data/yard.gemspec +3 -2
- metadata +23 -207
- data/.travis.yml +0 -52
- 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_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 -508
- 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_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/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/Foo.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 -78
- 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 -687
- 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 -46
- data/spec/templates/markup_processor_integrations/rdoc_markdown_spec.rb +0 -59
- data/spec/templates/markup_processor_integrations/rdoc_spec.rb +0 -39
- data/spec/templates/markup_processor_integrations/redcarpet_spec.rb +0 -59
- data/spec/templates/markup_processor_integrations/redcloth_spec.rb +0 -48
- 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,247 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
3
|
-
|
4
|
-
RSpec.describe "YARD::Handlers::Ruby::#{LEGACY_PARSER ? "Legacy::" : ""}ClassHandler" do
|
5
|
-
before(:all) { parse_file :class_handler_001, __FILE__ }
|
6
|
-
|
7
|
-
it "parses a class block with docstring" do
|
8
|
-
expect(P("A").docstring).to eq "Docstring"
|
9
|
-
end
|
10
|
-
|
11
|
-
it "handles complex class names" do
|
12
|
-
expect(P("A::B::C")).not_to eq nil
|
13
|
-
end
|
14
|
-
|
15
|
-
it "handles the subclassing syntax" do
|
16
|
-
expect(P("A::B::C").superclass).to eq P(:String)
|
17
|
-
expect(P("A::X").superclass).to eq Registry.at("A::B::C")
|
18
|
-
end
|
19
|
-
|
20
|
-
it "interprets class << self as a class level block" do
|
21
|
-
expect(P("A.classmethod1")).not_to eq nil
|
22
|
-
end
|
23
|
-
|
24
|
-
it "interprets class << ClassName as a class level block in ClassName's namespace" do
|
25
|
-
expect(P("A::B::C.Hello")).to be_instance_of(CodeObjects::MethodObject)
|
26
|
-
end
|
27
|
-
|
28
|
-
it "makes visibility public when parsing a block" do
|
29
|
-
expect(P("A::B::C#method1").visibility).to eq :public
|
30
|
-
end
|
31
|
-
|
32
|
-
it "sets superclass type to :class if it is a Proxy" do
|
33
|
-
expect(P("A::B::C").superclass.type).to eq :class
|
34
|
-
end
|
35
|
-
|
36
|
-
it "looks for a superclass before creating the class if it shares the same name" do
|
37
|
-
expect(P('B::A').superclass).to eq P('A')
|
38
|
-
end
|
39
|
-
|
40
|
-
it "handles class definitions in the form ::ClassName" do
|
41
|
-
expect(Registry.at("MyRootClass")).not_to be nil
|
42
|
-
end
|
43
|
-
|
44
|
-
it "handles superclass as a constant-style method (camping style < R /path/)" do
|
45
|
-
expect(P('Test1').superclass).to eq P(:R)
|
46
|
-
expect(P('Test2').superclass).to eq P(:R)
|
47
|
-
expect(P('Test6').superclass).to eq P(:NotDelegateClass)
|
48
|
-
end
|
49
|
-
|
50
|
-
it "handles superclass with OStruct.new or Struct.new syntax (superclass should be OStruct/Struct)" do
|
51
|
-
expect(P('Test3').superclass).to eq P(:Struct)
|
52
|
-
expect(P('Test4').superclass).to eq P(:OStruct)
|
53
|
-
end
|
54
|
-
|
55
|
-
it "handles DelegateClass(CLASSNAME) superclass syntax" do
|
56
|
-
expect(P('Test5').superclass).to eq P(:Array)
|
57
|
-
end
|
58
|
-
|
59
|
-
it "handles a superclass of the same name in the form ::ClassName" do
|
60
|
-
expect(P('Q::Logger').superclass).to eq P(:Logger)
|
61
|
-
expect(P('Q::Foo').superclass).not_to eq P('Q::Logger')
|
62
|
-
end
|
63
|
-
|
64
|
-
["CallMethod('test')", "VSD^#}}", 'not.aclass', 'self'].each do |klass|
|
65
|
-
it "raises an UndocumentableError for invalid class '#{klass}'" do
|
66
|
-
with_parser(:ruby18) { undoc_error "class #{klass}; end" }
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
['@@INVALID', 'hi', '$MYCLASS', 'AnotherClass.new'].each do |klass|
|
71
|
-
it "raises an UndocumentableError for invalid superclass '#{klass}' but it should create the class." do
|
72
|
-
expect(YARD::CodeObjects::ClassObject).to receive(:new).with(Registry.root, 'A')
|
73
|
-
with_parser(:ruby18) { undoc_error "class A < #{klass}; end" }
|
74
|
-
expect(Registry.at('A').superclass).to eq P(:Object)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
['not.aclass', 'self', 'AnotherClass.new'].each do |klass|
|
79
|
-
it "raises an UndocumentableError if the constant class reference 'class << SomeConstant' does not point to a valid class name" do
|
80
|
-
with_parser(:ruby18) do
|
81
|
-
undoc_error <<-eof
|
82
|
-
CONST = #{klass}
|
83
|
-
class << CONST; end
|
84
|
-
eof
|
85
|
-
end
|
86
|
-
expect(Registry.at(klass)).to be nil
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
it "documents 'class << SomeConstant' by using SomeConstant's value as a reference to the real class name" do
|
91
|
-
expect(Registry.at('String.classmethod')).not_to be nil
|
92
|
-
end
|
93
|
-
|
94
|
-
it "allows class << SomeRubyClass to create the class if it does not exist" do
|
95
|
-
expect(Registry.at('Symbol.toString')).not_to be nil
|
96
|
-
end
|
97
|
-
|
98
|
-
it "documents 'class Exception' without running into superclass issues" do
|
99
|
-
Parser::SourceParser.parse_string <<-eof
|
100
|
-
class Exception
|
101
|
-
end
|
102
|
-
eof
|
103
|
-
expect(Registry.at(:Exception)).not_to be nil
|
104
|
-
end
|
105
|
-
|
106
|
-
it "documents 'class RT < XX::RT' with proper superclass even if XX::RT is a proxy" do
|
107
|
-
expect(Registry.at(:RT)).not_to be nil
|
108
|
-
expect(Registry.at(:RT).superclass).to eq P('XX::RT')
|
109
|
-
end
|
110
|
-
|
111
|
-
it "does not overwrite docstring with an empty one" do
|
112
|
-
expect(Registry.at(:Zebra).docstring).to eq "Docstring 2"
|
113
|
-
end
|
114
|
-
|
115
|
-
it "turns 'class Const < Struct.new(:sym)' into class Const with attr :sym" do
|
116
|
-
obj = Registry.at("Point")
|
117
|
-
expect(obj).to be_kind_of(CodeObjects::ClassObject)
|
118
|
-
attrs = obj.attributes[:instance]
|
119
|
-
[:x, :y, :z].each do |key|
|
120
|
-
expect(attrs).to have_key(key)
|
121
|
-
expect(attrs[key][:read]).not_to be nil
|
122
|
-
expect(attrs[key][:write]).not_to be nil
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
it "turns 'class Const < Struct.new('Name', :sym)' into class Const with attr :sym" do
|
127
|
-
obj = Registry.at("AnotherPoint")
|
128
|
-
expect(obj).to be_kind_of(CodeObjects::ClassObject)
|
129
|
-
attrs = obj.attributes[:instance]
|
130
|
-
[:a, :b, :c].each do |key|
|
131
|
-
expect(attrs).to have_key(key)
|
132
|
-
expect(attrs[key][:read]).not_to be nil
|
133
|
-
expect(attrs[key][:write]).not_to be nil
|
134
|
-
end
|
135
|
-
|
136
|
-
expect(Registry.at("XPoint")).to be nil
|
137
|
-
end
|
138
|
-
|
139
|
-
it "creates a Struct::Name class when class Const < Struct.new('Name', :sym) is found" do
|
140
|
-
obj = Registry.at("Struct::XPoint")
|
141
|
-
expect(obj).not_to be nil
|
142
|
-
end
|
143
|
-
|
144
|
-
it "attaches attribtues to the generated Struct::Name class when Struct.new('Name') is used" do
|
145
|
-
obj = Registry.at("Struct::XPoint")
|
146
|
-
attrs = obj.attributes[:instance]
|
147
|
-
[:a, :b, :c].each do |key|
|
148
|
-
expect(attrs).to have_key(key)
|
149
|
-
expect(attrs[key][:read]).not_to be nil
|
150
|
-
expect(attrs[key][:write]).not_to be nil
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
it "uses @attr to set attribute descriptions on Struct subclasses" do
|
155
|
-
obj = Registry.at("DoccedStruct#input")
|
156
|
-
expect(obj.docstring).to eq "the input stream"
|
157
|
-
end
|
158
|
-
|
159
|
-
it "uses @attr to set attribute types on Struct subclasses" do
|
160
|
-
obj = Registry.at("DoccedStruct#someproc")
|
161
|
-
expect(obj).not_to be nil
|
162
|
-
expect(obj.tag(:return)).not_to be nil
|
163
|
-
expect(obj.tag(:return).types).to eq ["Proc", "#call"]
|
164
|
-
end
|
165
|
-
|
166
|
-
it "defaults types unspecified by @attr to Object on Struct subclasses" do
|
167
|
-
obj = Registry.at("DoccedStruct#mode")
|
168
|
-
expect(obj).not_to be nil
|
169
|
-
expect(obj.tag(:return)).not_to be nil
|
170
|
-
expect(obj.tag(:return).types).to eq ["Object"]
|
171
|
-
end
|
172
|
-
|
173
|
-
it "creates parameters for writers of Struct subclass's attributes" do
|
174
|
-
obj = Registry.at("DoccedStruct#input=")
|
175
|
-
expect(obj.tags(:param).size).to eq 1
|
176
|
-
expect(obj.tag(:param).types).to eq ["IO"]
|
177
|
-
end
|
178
|
-
|
179
|
-
["SemiDoccedStruct", "NotAStruct"].each do |struct|
|
180
|
-
describe("Attributes on a " + (struct == "NotAStruct" ? "class" : "struct")) do
|
181
|
-
it "defines both readers and writers when @attr is used on Structs" do
|
182
|
-
obj = Registry.at(struct)
|
183
|
-
attrs = obj.attributes[:instance]
|
184
|
-
expect(attrs[:first][:read]).not_to be nil
|
185
|
-
expect(attrs[:first][:write]).not_to be nil
|
186
|
-
end
|
187
|
-
|
188
|
-
it "defines only a reader when only @attr_reader is used on Structs" do
|
189
|
-
obj = Registry.at(struct)
|
190
|
-
attrs = obj.attributes[:instance]
|
191
|
-
expect(attrs[:second][:read]).not_to be nil
|
192
|
-
expect(attrs[:second][:write]).to be nil
|
193
|
-
end
|
194
|
-
|
195
|
-
it "defines only a writer when only @attr_writer is used on Structs" do
|
196
|
-
obj = Registry.at(struct)
|
197
|
-
attrs = obj.attributes[:instance]
|
198
|
-
expect(attrs[:third][:read]).to be nil
|
199
|
-
expect(attrs[:third][:write]).not_to be nil
|
200
|
-
end
|
201
|
-
|
202
|
-
it "defines a reader with correct return types when @attr_reader is used on Structs" do
|
203
|
-
obj = Registry.at("#{struct}#second")
|
204
|
-
expect(obj.tag(:return).types).to eq ["Fixnum"]
|
205
|
-
end
|
206
|
-
|
207
|
-
it "defines a writer with correct parameter types when @attr_writer is used on Structs" do
|
208
|
-
obj = Registry.at("#{struct}#third=")
|
209
|
-
expect(obj.tag(:param).types).to eq ["Array"]
|
210
|
-
end
|
211
|
-
|
212
|
-
it "defines a reader and a writer when both @attr_reader and @attr_writer are used" do
|
213
|
-
obj = Registry.at(struct)
|
214
|
-
attrs = obj.attributes[:instance]
|
215
|
-
expect(attrs[:fourth][:read]).not_to be nil
|
216
|
-
expect(attrs[:fourth][:write]).not_to be nil
|
217
|
-
end
|
218
|
-
|
219
|
-
it "uses @attr_reader for the getter when both @attr_reader and @attr_writer are given" do
|
220
|
-
obj = Registry.at("#{struct}#fourth")
|
221
|
-
expect(obj.tag(:return).types).to eq ["#read"]
|
222
|
-
end
|
223
|
-
|
224
|
-
it "uses @attr_writer for the setter when both @attr_reader and @attr_writer are given" do
|
225
|
-
obj = Registry.at("#{struct}#fourth=")
|
226
|
-
expect(obj.tag(:param).types).to eq ["IO"]
|
227
|
-
end
|
228
|
-
|
229
|
-
it "extracts text from @attr_reader" do
|
230
|
-
expect(Registry.at("#{struct}#fourth").docstring).to eq "returns a proc that reads"
|
231
|
-
end
|
232
|
-
|
233
|
-
it "extracts text from @attr_writer" do
|
234
|
-
expect(Registry.at("#{struct}#fourth=").docstring).to eq "sets the proc that writes stuff"
|
235
|
-
end
|
236
|
-
end
|
237
|
-
end
|
238
|
-
|
239
|
-
it "inherits from a regular struct" do
|
240
|
-
expect(Registry.at('RegularStruct').superclass).to eq P(:Struct)
|
241
|
-
expect(Registry.at('RegularStruct2').superclass).to eq P(:Struct)
|
242
|
-
end
|
243
|
-
|
244
|
-
it "handles inheritance from 'self'" do
|
245
|
-
expect(Registry.at('Outer1::Inner1').superclass).to eq Registry.at('Outer1')
|
246
|
-
end
|
247
|
-
end
|
@@ -1,133 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
RSpec.shared_examples "class method visibility decorator" do
|
3
|
-
# Use let(:visibility) to specify the name of the x_class_method
|
4
|
-
# visibility decorator to test.
|
5
|
-
|
6
|
-
describe do
|
7
|
-
before do
|
8
|
-
StubbedSourceParser.parse_string <<-CODE
|
9
|
-
class A
|
10
|
-
def self.b; end
|
11
|
-
def self.c; end
|
12
|
-
def self.d; end
|
13
|
-
def self.e; end
|
14
|
-
|
15
|
-
#{visibility}_class_method(:c, :d)
|
16
|
-
#{visibility}_class_method("e")
|
17
|
-
end
|
18
|
-
CODE
|
19
|
-
end
|
20
|
-
|
21
|
-
it "handles private_class_method statement" do
|
22
|
-
expect(Registry.at('A.c').visibility).to eq visibility
|
23
|
-
expect(Registry.at('A.d').visibility).to eq visibility
|
24
|
-
expect(Registry.at('A.e').visibility).to eq visibility
|
25
|
-
end
|
26
|
-
|
27
|
-
# Issue #760
|
28
|
-
# https://github.com/lsegal/yard/issues/760
|
29
|
-
it "handles singleton classes" do
|
30
|
-
# Note: It's important to def a method within the singleton class or
|
31
|
-
# the bug may not trigger.
|
32
|
-
code = <<-CODE
|
33
|
-
class SingletonClass
|
34
|
-
private_class_method :new
|
35
|
-
def self.foo
|
36
|
-
"foo"
|
37
|
-
end
|
38
|
-
end
|
39
|
-
CODE
|
40
|
-
|
41
|
-
StubbedSourceParser.parse_string(code) # Should be successful.
|
42
|
-
end unless LEGACY_PARSER
|
43
|
-
end
|
44
|
-
|
45
|
-
describe "handles reopened class" do
|
46
|
-
before do
|
47
|
-
StubbedSourceParser.parse_string <<-CODE
|
48
|
-
class SingletonClass
|
49
|
-
|
50
|
-
#{'private' unless visibility.to_sym == :private}
|
51
|
-
|
52
|
-
# != visibility
|
53
|
-
def self.foo
|
54
|
-
'foo'
|
55
|
-
end
|
56
|
-
|
57
|
-
# == visibility
|
58
|
-
def self.bar
|
59
|
-
end
|
60
|
-
|
61
|
-
# == visibility from reopening class.
|
62
|
-
def self.baz
|
63
|
-
end
|
64
|
-
|
65
|
-
#{visibility}_class_method :new, :bar
|
66
|
-
|
67
|
-
end
|
68
|
-
CODE
|
69
|
-
|
70
|
-
StubbedSourceParser.parse_string <<-CODE
|
71
|
-
# Reopening singleton class.
|
72
|
-
class SingletonClass
|
73
|
-
#{visibility}_class_method :baz
|
74
|
-
|
75
|
-
#{'private' unless visibility.to_sym == :private}
|
76
|
-
# != visibility from reopened class. (Verifies class was reopened.)
|
77
|
-
def self.bat
|
78
|
-
end
|
79
|
-
|
80
|
-
end
|
81
|
-
CODE
|
82
|
-
end
|
83
|
-
|
84
|
-
specify do
|
85
|
-
expect(Registry.at('SingletonClass.foo').visibility).not_to eq visibility
|
86
|
-
expect(Registry.at('SingletonClass.bar').visibility).to eq visibility
|
87
|
-
expect(Registry.at('SingletonClass.baz').visibility).to eq visibility
|
88
|
-
expect(Registry.at('SingletonClass.bat').visibility).not_to eq visibility
|
89
|
-
end
|
90
|
-
end unless LEGACY_PARSER # reopened class
|
91
|
-
|
92
|
-
describe "as method definition decorator" do
|
93
|
-
subject { Registry.at('SingletonClass.foo') }
|
94
|
-
|
95
|
-
# Valid as of Ruby 2.1.0:
|
96
|
-
# private_class_method def self.foo; end
|
97
|
-
|
98
|
-
let(:code) do
|
99
|
-
<<-CODE
|
100
|
-
class SingletonClass
|
101
|
-
# Valid Ruby 2.1.0 syntax.
|
102
|
-
#{method_def}
|
103
|
-
'it works'
|
104
|
-
end
|
105
|
-
end
|
106
|
-
CODE
|
107
|
-
end
|
108
|
-
|
109
|
-
let(:method_def) { "#{visibility}_class_method def self.foo param1, param2" }
|
110
|
-
|
111
|
-
before { StubbedSourceParser.parse_string code }
|
112
|
-
|
113
|
-
it "handles self.foo" do
|
114
|
-
expect(subject.visibility).to eq visibility
|
115
|
-
end
|
116
|
-
|
117
|
-
it "handles parameters correctly" do
|
118
|
-
expect(subject.parameters.map(&:first)).to eq ['param1', 'param2']
|
119
|
-
end
|
120
|
-
|
121
|
-
it "attaches documentation to method definition" do
|
122
|
-
expect(subject.docstring).to eq "Valid Ruby 2.1.0 syntax."
|
123
|
-
end
|
124
|
-
|
125
|
-
describe "handles SingletonClass.foo" do
|
126
|
-
let(:method_def) { "#{visibility}_class_method def SingletonClass.foo" }
|
127
|
-
|
128
|
-
specify do
|
129
|
-
expect(subject.visibility).to eq visibility
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end unless LEGACY_PARSER
|
133
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require File.dirname(__FILE__) + '/spec_helper'
|
3
|
-
|
4
|
-
RSpec.describe "YARD::Handlers::Ruby::#{LEGACY_PARSER ? "Legacy::" : ""}ClassVariableHandler" do
|
5
|
-
before(:all) { parse_file :class_variable_handler_001, __FILE__ }
|
6
|
-
|
7
|
-
it "does not parse class variables inside methods" do
|
8
|
-
obj = Registry.at("A::B::@@somevar")
|
9
|
-
expect(obj.source).to eq "@@somevar = \"hello\""
|
10
|
-
expect(obj.value).to eq '"hello"'
|
11
|
-
end
|
12
|
-
end
|
@@ -1,112 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require File.dirname(__FILE__) + '/spec_helper'
|
3
|
-
|
4
|
-
RSpec.describe "YARD::Handlers::Ruby::#{LEGACY_PARSER ? "Legacy::" : ""}ConstantHandler" do
|
5
|
-
before(:all) { parse_file :constant_handler_001, __FILE__ }
|
6
|
-
|
7
|
-
it "does not parse constants inside methods" do
|
8
|
-
expect(Registry.at("A::B::SOMECONSTANT").source).to eq "SOMECONSTANT= \"hello\""
|
9
|
-
end
|
10
|
-
|
11
|
-
it "only parses valid constants" do
|
12
|
-
expect(Registry.at("A::B::notaconstant")).to be nil
|
13
|
-
end
|
14
|
-
|
15
|
-
it "maintains newlines" do
|
16
|
-
expect(Registry.at("A::B::MYCONSTANT").value.delete("\r")).to eq "A +\nB +\nC +\nD"
|
17
|
-
end
|
18
|
-
|
19
|
-
it "turns Const = Struct.new(:sym) into class Const with attr :sym" do
|
20
|
-
obj = Registry.at("MyClass")
|
21
|
-
expect(obj).to be_kind_of(CodeObjects::ClassObject)
|
22
|
-
attrs = obj.attributes[:instance]
|
23
|
-
[:a, :b, :c].each do |key|
|
24
|
-
expect(attrs).to have_key(key)
|
25
|
-
expect(attrs[key][:read]).not_to be nil
|
26
|
-
expect(attrs[key][:write]).not_to be nil
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'documents block for Struct.new if present' do
|
31
|
-
obj = Registry.at("MyStructWithConstant")
|
32
|
-
expect(obj).to be_kind_of(CodeObjects::ClassObject)
|
33
|
-
expect(obj.constants[0].docstring).to eq 'A constant.'
|
34
|
-
expect(obj.constants[0].name).to eq :CONSTANT
|
35
|
-
expect(obj.constants[0].value).to eq "42"
|
36
|
-
expect(obj.constants[1].docstring).to eq 'Special constant (empty symbol)'
|
37
|
-
expect(obj.constants[1].name).to eq :EMPTY
|
38
|
-
expect(obj.constants[1].value).to eq ":''"
|
39
|
-
end
|
40
|
-
|
41
|
-
it "turns Const = Struct.new('Name', :sym) into class Const with attr :sym" do
|
42
|
-
obj = Registry.at("NotMyClass")
|
43
|
-
expect(obj).to be_kind_of(CodeObjects::ClassObject)
|
44
|
-
attrs = obj.attributes[:instance]
|
45
|
-
[:b, :c].each do |key|
|
46
|
-
expect(attrs).to have_key(key)
|
47
|
-
expect(attrs[key][:read]).not_to be nil
|
48
|
-
expect(attrs[key][:write]).not_to be nil
|
49
|
-
end
|
50
|
-
|
51
|
-
expect(Registry.at("NotMyClass2")).to be nil
|
52
|
-
end
|
53
|
-
|
54
|
-
it "turns Const = Struct.new into empty struct" do
|
55
|
-
obj = Registry.at("MyEmptyStruct")
|
56
|
-
expect(obj).not_to be nil
|
57
|
-
expect(obj.attributes[:instance]).to be_empty
|
58
|
-
end
|
59
|
-
|
60
|
-
it "maintains docstrings on structs defined via constants" do
|
61
|
-
obj = Registry.at("DocstringStruct")
|
62
|
-
expect(obj).not_to be nil
|
63
|
-
expect(obj.docstring).to eq "A crazy struct."
|
64
|
-
expect(obj.attributes[:instance]).not_to be_empty
|
65
|
-
a1 = Registry.at("DocstringStruct#bar")
|
66
|
-
a2 = Registry.at("DocstringStruct#baz")
|
67
|
-
expect(a1.docstring).to eq "An attr"
|
68
|
-
expect(a1.tag(:return).types).to eq ["String"]
|
69
|
-
expect(a2.docstring).to eq "Another attr"
|
70
|
-
expect(a2.tag(:return).types).to eq ["Number"]
|
71
|
-
a3 = Registry.at("DocstringStruct#new_syntax")
|
72
|
-
expect(a3.docstring).to eq "Attribute defined with the new syntax"
|
73
|
-
expect(a3.tag(:return).types).to eq ["Symbol"]
|
74
|
-
end
|
75
|
-
|
76
|
-
it "raises undocumentable error in 1.9 parser for Struct.new assignment to non-const" do
|
77
|
-
undoc_error "nonconst = Struct.new"
|
78
|
-
end unless LEGACY_PARSER
|
79
|
-
|
80
|
-
%w(module class).each do |type|
|
81
|
-
it "does not allow #{type} to be redefined as constant" do
|
82
|
-
undoc_error <<-eof
|
83
|
-
#{type} Foo; end
|
84
|
-
Foo = "value"
|
85
|
-
eof
|
86
|
-
end
|
87
|
-
end unless LEGACY_PARSER
|
88
|
-
|
89
|
-
it "allows constant to have same name as constant in parent namespace" do
|
90
|
-
YARD.parse_string <<-eof
|
91
|
-
module A
|
92
|
-
class C; end
|
93
|
-
module B; C = 1 end
|
94
|
-
end
|
95
|
-
eof
|
96
|
-
expect(log.io.string).to eq ""
|
97
|
-
expect(Registry.at('A::B::C').type).to eq :constant
|
98
|
-
end
|
99
|
-
|
100
|
-
it "detects compound constant names" do
|
101
|
-
YARD.parse_string <<-eof
|
102
|
-
module A
|
103
|
-
class AA; end
|
104
|
-
AA::B = true
|
105
|
-
end
|
106
|
-
A::AA::C = true
|
107
|
-
eof
|
108
|
-
|
109
|
-
expect(Registry.at('A::AA::B').type).to eq :constant
|
110
|
-
expect(Registry.at('A::AA::C').type).to eq :constant
|
111
|
-
end if HAVE_RIPPER
|
112
|
-
end
|