sidekiq-statsd 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.yardopts +1 -1
- data/README.md +8 -4
- data/lib/sidekiq/statsd/client.rb +10 -10
- data/lib/sidekiq/statsd/server_middleware.rb +8 -9
- data/lib/sidekiq/statsd/version.rb +1 -1
- data/spec/sidekiq/statsd/client_spec.rb +6 -6
- data/spec/spec_helper.rb +1 -0
- data/vendor/ruby/1.9.1/bin/yard +1 -1
- data/vendor/ruby/1.9.1/bin/yardoc +1 -1
- data/vendor/ruby/1.9.1/bin/yri +1 -1
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/lib/yard/tags/default_factory.rb +176 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/lib/yard/tags/default_tag.rb +12 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/lib/yard/tags/directives.rb +595 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/lib/yard/tags/library.rb +630 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/lib/yard/tags/option_tag.rb +12 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/lib/yard/tags/overload_tag.rb +65 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/lib/yard/tags/ref_tag.rb +7 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/lib/yard/tags/ref_tag_list.rb +27 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/lib/yard/tags/tag.rb +57 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/lib/yard/tags/tag_format_error.rb +6 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/spec/tags/default_factory_spec.rb +152 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/spec/tags/default_tag_spec.rb +11 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/spec/tags/directives_spec.rb +436 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/spec/tags/library_spec.rb +34 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/spec/tags/overload_tag_spec.rb +53 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/spec/tags/ref_tag_list_spec.rb +53 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/templates/default/tags/html/example.erb +11 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/templates/default/tags/html/index.erb +3 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/templates/default/tags/html/option.erb +24 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/templates/default/tags/html/overload.erb +14 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/templates/default/tags/html/see.erb +8 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/templates/default/tags/html/tag.erb +20 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/templates/default/tags/setup.rb +55 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/templates/default/tags/text/example.erb +12 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/templates/default/tags/text/index.erb +1 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/templates/default/tags/text/option.erb +20 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/templates/default/tags/text/overload.erb +19 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/templates/default/tags/text/see.erb +11 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/templates/default/tags/text/tag.erb +13 -0
- data/vendor/ruby/1.9.1/gems/yard-0.8.6.1/templates/guide/tags/html/setup.rb +8 -0
- metadata +34 -4
@@ -0,0 +1,436 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../spec_helper"
|
2
|
+
|
3
|
+
def tag_parse(content, object = nil, handler = nil)
|
4
|
+
@parser = DocstringParser.new
|
5
|
+
@parser.parse(content, object, handler)
|
6
|
+
@parser
|
7
|
+
end
|
8
|
+
|
9
|
+
describe YARD::Tags::ParseDirective do
|
10
|
+
describe '#call' do
|
11
|
+
after { Registry.clear }
|
12
|
+
|
13
|
+
it "should parse if handler=nil but use file=(stdin)" do
|
14
|
+
tag_parse %{@!parse
|
15
|
+
# Docstring here
|
16
|
+
def foo; end
|
17
|
+
}
|
18
|
+
Registry.at('#foo').docstring.should == "Docstring here"
|
19
|
+
Registry.at('#foo').file.should == '(stdin)'
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should allow parser type to be specified in type" do
|
23
|
+
tag_parse %{@!parse [c]
|
24
|
+
void Init_Foo() {
|
25
|
+
rb_define_method(rb_cMyClass, "foo", foo, 1);
|
26
|
+
}
|
27
|
+
}
|
28
|
+
Registry.at('MyClass#foo').should_not be_nil
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should parse code in context of current handler" do
|
32
|
+
src = <<-eof
|
33
|
+
class A
|
34
|
+
# @!parse
|
35
|
+
# def foo; end
|
36
|
+
eval "def foo; end"
|
37
|
+
end
|
38
|
+
eof
|
39
|
+
parser = Parser::SourceParser.new
|
40
|
+
parser.file = "myfile.rb"
|
41
|
+
parser.parse(StringIO.new(src))
|
42
|
+
Registry.at('A#foo').file.should == 'myfile.rb'
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe YARD::Tags::GroupDirective do
|
48
|
+
describe '#call' do
|
49
|
+
it "should do nothing if handler=nil" do
|
50
|
+
tag_parse("@!group foo")
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should set group value in parser state (with handler)" do
|
54
|
+
handler = OpenStruct.new(:extra_state => OpenStruct.new)
|
55
|
+
tag_parse("@!group foo", nil, handler)
|
56
|
+
handler.extra_state.group.should == 'foo'
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe YARD::Tags::EndGroupDirective do
|
62
|
+
describe '#call' do
|
63
|
+
it "should do nothing if handler=nil" do
|
64
|
+
tag_parse("@!endgroup foo")
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should set group value in parser state (with handler)" do
|
68
|
+
handler = OpenStruct.new(:extra_state => OpenStruct.new(:group => "foo"))
|
69
|
+
tag_parse("@!endgroup", nil, handler)
|
70
|
+
handler.extra_state.group.should be_nil
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe YARD::Tags::MacroDirective do
|
76
|
+
def handler
|
77
|
+
OpenStruct.new(:call_params => %w(a b c),
|
78
|
+
:caller_method => 'foo',
|
79
|
+
:scope => :instance, :visibility => :public,
|
80
|
+
:namespace => P('Foo::Bar'),
|
81
|
+
:statement => OpenStruct.new(:source => 'foo :a, :b, :c'))
|
82
|
+
end
|
83
|
+
|
84
|
+
after(:all) { Registry.clear }
|
85
|
+
|
86
|
+
describe '#call' do
|
87
|
+
it "should define new macro when [new] is provided" do
|
88
|
+
tag_parse("@!macro [new] foo\n foo")
|
89
|
+
CodeObjects::MacroObject.find('foo').macro_data.should == 'foo'
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should define new macro if text block is provided" do
|
93
|
+
tag_parse("@!macro bar\n bar")
|
94
|
+
CodeObjects::MacroObject.find('bar').macro_data.should == 'bar'
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should expand macros and return #expanded_text to tag parser" do
|
98
|
+
tag_parse("@!macro [new] foo\n foo")
|
99
|
+
tag_parse("@!macro foo").text.should == 'foo'
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should not expand new macro if docstring is unattached" do
|
103
|
+
tag_parse("@!macro [new] foo\n foo").text.should_not == 'foo'
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should expand new anonymous macro even if docstring is unattached" do
|
107
|
+
tag_parse("@!macro\n foo").text.should == 'foo'
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should allow multiple macros to be expanded" do
|
111
|
+
tag_parse("@!macro [new] foo\n foo")
|
112
|
+
tag_parse("@!macro bar\n bar")
|
113
|
+
tag_parse("@!macro foo\n@!macro bar").text.should == "foo\nbar"
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should allow anonymous macros" do
|
117
|
+
tag_parse("@!macro\n a b c", nil, handler)
|
118
|
+
@parser.text.should == 'a b c'
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should expand call_params and caller_method using $N when handler is provided" do
|
122
|
+
tag_parse("@!macro\n $1 $2 $3", nil, handler)
|
123
|
+
@parser.text.should == 'a b c'
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should attach macro to method if one exists" do
|
127
|
+
tag_parse("@!macro [attach] attached\n $1 $2 $3", nil, handler)
|
128
|
+
macro = CodeObjects::MacroObject.find('attached')
|
129
|
+
macro.method_object.should == P('Foo::Bar.foo')
|
130
|
+
end
|
131
|
+
|
132
|
+
it "should not expand new attached macro if defined on class method" do
|
133
|
+
baz = CodeObjects::MethodObject.new(P('Foo::Bar'), :baz, :class)
|
134
|
+
baz.visibility.should == :public
|
135
|
+
tag_parse("@!macro [attach] attached2\n @!visibility private", baz, handler)
|
136
|
+
macro = CodeObjects::MacroObject.find('attached2')
|
137
|
+
macro.method_object.should == P('Foo::Bar.baz')
|
138
|
+
baz.visibility.should == :public
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should expand macro if defined on class method and there is no data block" do
|
142
|
+
tag_parse("@!macro [new] attached3\n expanded_data")
|
143
|
+
baz = CodeObjects::MethodObject.new(P('Foo::Bar'), :baz, :class)
|
144
|
+
doc = DocstringParser.new.parse('@!macro attached3', baz, handler).to_docstring
|
145
|
+
doc.should == 'expanded_data'
|
146
|
+
end
|
147
|
+
|
148
|
+
it "should not attempt to expand macro values if handler = nil" do
|
149
|
+
tag_parse("@!macro [attach] xyz\n $1 $2 $3")
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
describe YARD::Tags::MethodDirective do
|
155
|
+
describe '#call' do
|
156
|
+
after { Registry.clear }
|
157
|
+
|
158
|
+
it "should use entire docstring if no indented data is found" do
|
159
|
+
YARD.parse_string <<-eof
|
160
|
+
class Foo
|
161
|
+
# @!method foo
|
162
|
+
# @!method bar
|
163
|
+
# @!scope class
|
164
|
+
end
|
165
|
+
eof
|
166
|
+
Registry.at('Foo.foo').should be_a(CodeObjects::MethodObject)
|
167
|
+
Registry.at('Foo.bar').should be_a(CodeObjects::MethodObject)
|
168
|
+
end
|
169
|
+
|
170
|
+
it "should handle indented block text in @!method" do
|
171
|
+
YARD.parse_string <<-eof
|
172
|
+
# @!method foo(a)
|
173
|
+
# Docstring here
|
174
|
+
# @return [String] the foo
|
175
|
+
# Ignore this
|
176
|
+
# @param [String] a
|
177
|
+
eof
|
178
|
+
foo = Registry.at('#foo')
|
179
|
+
foo.docstring.should == "Docstring here"
|
180
|
+
foo.docstring.tag(:return).should_not be_nil
|
181
|
+
foo.tag(:param).should be_nil
|
182
|
+
end
|
183
|
+
|
184
|
+
it "should execute directives on object in indented block" do
|
185
|
+
YARD.parse_string <<-eof
|
186
|
+
class Foo
|
187
|
+
# @!method foo(a)
|
188
|
+
# @!scope class
|
189
|
+
# @!visibility private
|
190
|
+
# @!method bar
|
191
|
+
# Hello
|
192
|
+
# Ignore this
|
193
|
+
end
|
194
|
+
eof
|
195
|
+
foo = Registry.at('Foo.foo')
|
196
|
+
foo.visibility.should == :private
|
197
|
+
bar = Registry.at('Foo#bar')
|
198
|
+
bar.visibility.should == :public
|
199
|
+
end
|
200
|
+
|
201
|
+
it "should be able to define multiple @methods in docstring" do
|
202
|
+
YARD.parse_string <<-eof
|
203
|
+
class Foo
|
204
|
+
# @!method foo1
|
205
|
+
# Docstring1
|
206
|
+
# @!method foo2
|
207
|
+
# Docstring2
|
208
|
+
# @!method foo3
|
209
|
+
# @!scope class
|
210
|
+
# Docstring3
|
211
|
+
end
|
212
|
+
eof
|
213
|
+
foo1 = Registry.at('Foo#foo1')
|
214
|
+
foo2 = Registry.at('Foo#foo2')
|
215
|
+
foo3 = Registry.at('Foo.foo3')
|
216
|
+
foo1.docstring.should == 'Docstring1'
|
217
|
+
foo2.docstring.should == 'Docstring2'
|
218
|
+
foo3.docstring.should == 'Docstring3'
|
219
|
+
end
|
220
|
+
|
221
|
+
it "should define the method inside namespace if attached to namespace object" do
|
222
|
+
YARD.parse_string <<-eof
|
223
|
+
module Foo
|
224
|
+
# @!method foo
|
225
|
+
# Docstring1
|
226
|
+
# @!method bar
|
227
|
+
# Docstring2
|
228
|
+
class Bar
|
229
|
+
end
|
230
|
+
end
|
231
|
+
eof
|
232
|
+
Registry.at('Foo::Bar#foo').docstring.should == 'Docstring1'
|
233
|
+
Registry.at('Foo::Bar#bar').docstring.should == 'Docstring2'
|
234
|
+
end
|
235
|
+
|
236
|
+
it "should set scope to class if signature has 'self.' prefix" do
|
237
|
+
YARD.parse_string <<-eof
|
238
|
+
# @!method self.foo
|
239
|
+
# @!method self. bar
|
240
|
+
# @!method self.baz()
|
241
|
+
class Foo
|
242
|
+
end
|
243
|
+
eof
|
244
|
+
%w(foo bar baz).each do |name|
|
245
|
+
Registry.at("Foo.#{name}").should be_a(CodeObjects::MethodObject)
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
it "should define parameters from signature" do
|
250
|
+
YARD.parse_string <<-eof
|
251
|
+
# @!method foo(a, b, c = nil)
|
252
|
+
eof
|
253
|
+
Registry.at('#foo').parameters.should == [['a', nil], ['b', nil], ['c', 'nil']]
|
254
|
+
end
|
255
|
+
|
256
|
+
it "should be able to define method with module scope (module function)" do
|
257
|
+
YARD.parse_string <<-eof
|
258
|
+
# @!method foo
|
259
|
+
# @!scope module
|
260
|
+
# This is a docstring
|
261
|
+
# @return [Boolean] whether this is true
|
262
|
+
class Foo
|
263
|
+
end
|
264
|
+
eof
|
265
|
+
foo_c = Registry.at('Foo.foo')
|
266
|
+
foo_i = Registry.at('Foo#foo')
|
267
|
+
foo_c.should_not be_nil
|
268
|
+
foo_i.should_not be_nil
|
269
|
+
foo_c.should be_module_function
|
270
|
+
foo_c.docstring.should == foo_i.docstring
|
271
|
+
foo_c.tag(:return).text.should == foo_i.tag(:return).text
|
272
|
+
end
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
describe YARD::Tags::AttributeDirective do
|
277
|
+
describe '#call' do
|
278
|
+
after { Registry.clear }
|
279
|
+
|
280
|
+
it "should use entire docstring if no indented data is found" do
|
281
|
+
YARD.parse_string <<-eof
|
282
|
+
class Foo
|
283
|
+
# @!attribute foo
|
284
|
+
# @!attribute bar
|
285
|
+
# @!scope class
|
286
|
+
end
|
287
|
+
eof
|
288
|
+
Registry.at('Foo.foo').should be_reader
|
289
|
+
Registry.at('Foo.bar').should be_reader
|
290
|
+
end
|
291
|
+
|
292
|
+
it "should handle indented block in @!attribute" do
|
293
|
+
YARD.parse_string <<-eof
|
294
|
+
# @!attribute foo
|
295
|
+
# Docstring here
|
296
|
+
# @return [String] the foo
|
297
|
+
# Ignore this
|
298
|
+
# @param [String] a
|
299
|
+
eof
|
300
|
+
foo = Registry.at('#foo')
|
301
|
+
foo.is_attribute?.should == true
|
302
|
+
foo.docstring.should == "Docstring here"
|
303
|
+
foo.docstring.tag(:return).should_not be_nil
|
304
|
+
foo.tag(:param).should be_nil
|
305
|
+
end
|
306
|
+
|
307
|
+
it "should be able to define multiple @attributes in docstring" do
|
308
|
+
YARD.parse_string <<-eof
|
309
|
+
class Foo
|
310
|
+
# @!attribute [r] foo1
|
311
|
+
# Docstring1
|
312
|
+
# @!attribute [w] foo2
|
313
|
+
# Docstring2
|
314
|
+
# @!attribute foo3
|
315
|
+
# @!scope class
|
316
|
+
# Docstring3
|
317
|
+
end
|
318
|
+
eof
|
319
|
+
foo1 = Registry.at('Foo#foo1')
|
320
|
+
foo2 = Registry.at('Foo#foo2=')
|
321
|
+
foo3 = Registry.at('Foo.foo3')
|
322
|
+
foo4 = Registry.at('Foo.foo3=')
|
323
|
+
foo1.should be_reader
|
324
|
+
foo2.should be_writer
|
325
|
+
foo3.should be_reader
|
326
|
+
foo1.docstring.should == 'Docstring1'
|
327
|
+
foo2.docstring.should == 'Docstring2'
|
328
|
+
foo3.docstring.should == 'Docstring3'
|
329
|
+
foo4.should be_writer
|
330
|
+
foo1.attr_info[:write].should be_nil
|
331
|
+
foo2.attr_info[:read].should be_nil
|
332
|
+
end
|
333
|
+
|
334
|
+
it "should define the attr inside namespace if attached to namespace object" do
|
335
|
+
YARD.parse_string <<-eof
|
336
|
+
module Foo
|
337
|
+
# @!attribute [r] foo
|
338
|
+
# @!attribute [r] bar
|
339
|
+
class Bar
|
340
|
+
end
|
341
|
+
end
|
342
|
+
eof
|
343
|
+
Registry.at('Foo::Bar#foo').should be_reader
|
344
|
+
Registry.at('Foo::Bar#bar').should be_reader
|
345
|
+
end
|
346
|
+
end
|
347
|
+
|
348
|
+
it "should set scope to class if signature has 'self.' prefix" do
|
349
|
+
YARD.parse_string <<-eof
|
350
|
+
# @!attribute self.foo
|
351
|
+
# @!attribute self. bar
|
352
|
+
# @!attribute self.baz
|
353
|
+
class Foo
|
354
|
+
end
|
355
|
+
eof
|
356
|
+
%w(foo bar baz).each do |name|
|
357
|
+
Registry.at("Foo.#{name}").should be_reader
|
358
|
+
end
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
362
|
+
describe YARD::Tags::ScopeDirective do
|
363
|
+
describe '#call' do
|
364
|
+
after { Registry.clear }
|
365
|
+
|
366
|
+
it "should set state on tag parser if object = nil" do
|
367
|
+
tag_parse("@!scope class")
|
368
|
+
@parser.state.scope.should == :class
|
369
|
+
end
|
370
|
+
|
371
|
+
it "should set state on tag parser if object is namespace" do
|
372
|
+
object = CodeObjects::ClassObject.new(:root, 'Foo')
|
373
|
+
tag_parse("@!scope class", object)
|
374
|
+
object[:scope].should be_nil
|
375
|
+
@parser.state.scope.should == :class
|
376
|
+
end
|
377
|
+
|
378
|
+
it "should set scope on object if object is a method object" do
|
379
|
+
object = CodeObjects::MethodObject.new(:root, 'foo')
|
380
|
+
tag_parse("@!scope class", object)
|
381
|
+
object.scope.should == :class
|
382
|
+
end
|
383
|
+
|
384
|
+
%w(class instance module).each do |type|
|
385
|
+
it "should allow #{type} as value" do
|
386
|
+
tag_parse("@!scope #{type}")
|
387
|
+
@parser.state.scope.should == type.to_sym
|
388
|
+
end
|
389
|
+
end
|
390
|
+
|
391
|
+
%w(invalid foo FOO CLASS INSTANCE).each do |type|
|
392
|
+
it "should not allow #{type} as value" do
|
393
|
+
tag_parse("@!scope #{type}")
|
394
|
+
@parser.state.scope.should be_nil
|
395
|
+
end
|
396
|
+
end
|
397
|
+
end
|
398
|
+
end
|
399
|
+
|
400
|
+
describe YARD::Tags::VisibilityDirective do
|
401
|
+
describe '#call' do
|
402
|
+
after { Registry.clear }
|
403
|
+
|
404
|
+
it "should set visibility on tag parser if object = nil" do
|
405
|
+
tag_parse("@!visibility private")
|
406
|
+
@parser.state.visibility.should == :private
|
407
|
+
end
|
408
|
+
|
409
|
+
it "should set state on tag parser if object is namespace" do
|
410
|
+
object = CodeObjects::ClassObject.new(:root, 'Foo')
|
411
|
+
tag_parse("@!visibility protected", object)
|
412
|
+
object.visibility.should == :protected
|
413
|
+
@parser.state.visibility.should be_nil
|
414
|
+
end
|
415
|
+
|
416
|
+
it "should set visibility on object if object is a method object" do
|
417
|
+
object = CodeObjects::MethodObject.new(:root, 'foo')
|
418
|
+
tag_parse("@!visibility private", object)
|
419
|
+
object.visibility.should == :private
|
420
|
+
end
|
421
|
+
|
422
|
+
%w(public private protected).each do |type|
|
423
|
+
it "should allow #{type} as value" do
|
424
|
+
tag_parse("@!visibility #{type}")
|
425
|
+
@parser.state.visibility.should == type.to_sym
|
426
|
+
end
|
427
|
+
end
|
428
|
+
|
429
|
+
%w(invalid foo FOO PRIVATE INSTANCE).each do |type|
|
430
|
+
it "should not allow #{type} as value" do
|
431
|
+
tag_parse("@!visibility #{type}")
|
432
|
+
@parser.state.visibility.should be_nil
|
433
|
+
end
|
434
|
+
end
|
435
|
+
end
|
436
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe YARD::Tags::Library do
|
4
|
+
def tag(docstring)
|
5
|
+
Docstring.new(docstring).tags.first
|
6
|
+
end
|
7
|
+
|
8
|
+
describe '#see_tag' do
|
9
|
+
it "should take a URL" do
|
10
|
+
tag("@see http://example.com").name.should == "http://example.com"
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should take an object path" do
|
14
|
+
tag("@see String#reverse").name.should == "String#reverse"
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should take a description after the url/object" do
|
18
|
+
tag = tag("@see http://example.com An Example Site")
|
19
|
+
tag.name.should == "http://example.com"
|
20
|
+
tag.text.should == "An Example Site"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '.define_tag' do
|
25
|
+
it "should allow defining tags with '.' in the name (x.y.z defines method x_y_z)" do
|
26
|
+
Tags::Library.define_tag("foo", 'x.y.z')
|
27
|
+
Tags::Library.define_tag("foo2", 'x.y.zz', Tags::OverloadTag)
|
28
|
+
Tags::Library.instance.method(:x_y_z_tag).should_not be_nil
|
29
|
+
Tags::Library.instance.method(:x_y_zz_tag).should_not be_nil
|
30
|
+
tag('@x.y.z foo bar').text.should == 'foo bar'
|
31
|
+
tag('@x.y.zz foo(bar)').signature.should == 'foo(bar)'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe YARD::Tags::OverloadTag do
|
4
|
+
before do
|
5
|
+
@tag = Tags::OverloadTag.new(:overload, <<-'eof')
|
6
|
+
def bar(a, b = 1, &block)
|
7
|
+
Hello world
|
8
|
+
@param a [String]
|
9
|
+
@return [String]
|
10
|
+
eof
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should parse the first line as a method signature" do
|
14
|
+
@tag.signature.should == "def bar(a, b = 1, &block)"
|
15
|
+
@tag.parameters.should == [['a', nil], ['b', "1"], ['&block', nil]]
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should parse the rest of the text as a new Docstring" do
|
19
|
+
@tag.docstring.should be_instance_of(Docstring)
|
20
|
+
@tag.docstring.should == "Hello world"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should set Docstring's object after #object= is called" do
|
24
|
+
m = mock(:object)
|
25
|
+
@tag.object = m
|
26
|
+
@tag.docstring.object.should == m
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should respond to #tag, #tags and #has_tag?" do
|
30
|
+
@tag.object = mock(:object)
|
31
|
+
@tag.tags.size.should == 2
|
32
|
+
@tag.tag(:param).name.should == "a"
|
33
|
+
@tag.has_tag?(:return).should == true
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should not be a CodeObjects::Base when not hooked up to an object" do
|
37
|
+
@tag.object = nil
|
38
|
+
@tag.is_a?(CodeObjects::Base).should == false
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should be a CodeObjects::Base when hooked up to an object" do
|
42
|
+
@tag.object = mock(:object)
|
43
|
+
@tag.object.should_receive(:is_a?).at_least(3).times.with(CodeObjects::Base).and_return(true)
|
44
|
+
@tag.is_a?(CodeObjects::Base).should == true
|
45
|
+
@tag.kind_of?(CodeObjects::Base).should == true
|
46
|
+
(CodeObjects::Base === @tag).should == true
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should not parse 'def' out of method name" do
|
50
|
+
tag = Tags::OverloadTag.new(:overload, "default")
|
51
|
+
tag.signature.should == "default"
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe YARD::Tags::RefTagList do
|
4
|
+
before { YARD::Registry.clear }
|
5
|
+
|
6
|
+
it "should accept symbol or string as owner's path and convert it into a proxy" do
|
7
|
+
t = Tags::RefTagList.new('author', :String)
|
8
|
+
t.owner.should == P(:String)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should accept proxy object as owner" do
|
12
|
+
t = Tags::RefTagList.new('author', P(:String))
|
13
|
+
t.owner.should == P(:String)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should return tags from a proxy object" do
|
17
|
+
o = CodeObjects::ClassObject.new(:root, :String)
|
18
|
+
t = Tags::Tag.new(:author, 'foo')
|
19
|
+
o.docstring.add_tag(t)
|
20
|
+
|
21
|
+
ref = Tags::RefTagList.new('author', :String)
|
22
|
+
ref.tags.should == [t]
|
23
|
+
ref.tags.first.text.should == 'foo'
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should return named tags from a proxy object" do
|
27
|
+
o = CodeObjects::ClassObject.new(:root, :String)
|
28
|
+
p1 = Tags::Tag.new(:param, 'bar1', nil, 'foo')
|
29
|
+
p2 = Tags::Tag.new(:param, 'bar2', nil, 'foo')
|
30
|
+
p3 = Tags::Tag.new(:param, 'bar3', nil, 'bar')
|
31
|
+
t1 = Tags::Tag.new(:return, 'blah')
|
32
|
+
o.docstring.add_tag(p1, t1, p2, p3)
|
33
|
+
|
34
|
+
ref = Tags::RefTagList.new('param', :String, 'foo')
|
35
|
+
ref.tags.should == [p1, p2]
|
36
|
+
ref.tags.first.text.should == 'bar1'
|
37
|
+
end
|
38
|
+
|
39
|
+
it "all tags should respond to #owner and be a RefTag" do
|
40
|
+
o = CodeObjects::ClassObject.new(:root, :String)
|
41
|
+
p1 = Tags::Tag.new(:param, 'bar1', nil, 'foo')
|
42
|
+
p2 = Tags::Tag.new(:param, 'bar2', nil, 'foo')
|
43
|
+
p3 = Tags::Tag.new(:param, 'bar3', nil, 'bar')
|
44
|
+
t1 = Tags::Tag.new(:return, 'blah')
|
45
|
+
o.docstring.add_tag(p1, t1, p2, p3)
|
46
|
+
|
47
|
+
ref = Tags::RefTagList.new('param', :String)
|
48
|
+
ref.tags.each do |t|
|
49
|
+
t.should be_kind_of(Tags::RefTag)
|
50
|
+
t.owner.should == o
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<% if object.has_tag?(:example) %>
|
2
|
+
<div class="examples">
|
3
|
+
<p class="tag_title">Examples:</p>
|
4
|
+
<% object.tags(:example).each do |tag| %>
|
5
|
+
<% unless tag.name.empty? %>
|
6
|
+
<p class="example_title"><%= htmlify_line(tag.name) %></p>
|
7
|
+
<% end %>
|
8
|
+
<pre class="example code"><code><%= html_syntax_highlight(tag.text) %></code></pre>
|
9
|
+
<% end %>
|
10
|
+
</div>
|
11
|
+
<% end %>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<% if object.has_tag?(:option) %>
|
2
|
+
<% object.parameters.each do |param, default| %>
|
3
|
+
<% tags = object.tags(:option).select {|x| x.name.to_s == param.to_s } %>
|
4
|
+
<% next if tags.empty? %>
|
5
|
+
<p class="tag_title">Options Hash (<tt><%= param %></tt>):</p>
|
6
|
+
<ul class="option">
|
7
|
+
<% for tag in tags %>
|
8
|
+
<li>
|
9
|
+
<span class="name"><%= tag.pair.name %></span>
|
10
|
+
<span class="type"><%= format_types(tag.pair.types || ['Object']) %></span>
|
11
|
+
<span class="default">
|
12
|
+
<% if tag.pair.defaults %>
|
13
|
+
— default:
|
14
|
+
<%= tag.pair.defaults.map {|t| "<tt>#{h t}</tt>" }.join(", ") %>
|
15
|
+
<% end %>
|
16
|
+
</span>
|
17
|
+
<% if tag.pair.text && tag.pair.text =~ /\S/ %>
|
18
|
+
— <%= htmlify_line(tag.pair.text) %>
|
19
|
+
<% end %>
|
20
|
+
</li>
|
21
|
+
<% end %>
|
22
|
+
</ul>
|
23
|
+
<% end %>
|
24
|
+
<% end %>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<% if object.tags(:overload).size == 1 %>
|
2
|
+
<%= yieldall :object => object.tag(:overload) %>
|
3
|
+
<% elsif object.has_tag?(:overload) && object.tags(:overload).any? {|o| !o.docstring.blank? } %>
|
4
|
+
<p class="tag_title">Overloads:</p>
|
5
|
+
<ul class="overload">
|
6
|
+
<% object.tags(:overload).each do |overload| %>
|
7
|
+
<% next if overload.docstring.blank? %>
|
8
|
+
<li class="overload_item">
|
9
|
+
<span class="signature"><%= signature(overload, false, false) %></span>
|
10
|
+
<%= yieldall :object => overload %>
|
11
|
+
</li>
|
12
|
+
<% end %>
|
13
|
+
</ul>
|
14
|
+
<% end %>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<p class="tag_title"><%= @label ? @label : YARD::Tags::Library.labels[@name] %>:</p>
|
2
|
+
<ul class="<%= @name %>">
|
3
|
+
<% object.tags(@name).each do |tag| %>
|
4
|
+
<li>
|
5
|
+
<% unless @no_names %>
|
6
|
+
<span class='name'><%= h tag.name %></span>
|
7
|
+
<% end %>
|
8
|
+
<% unless @no_types %>
|
9
|
+
<span class='type'><%= format_types(tag.types) %></span>
|
10
|
+
<% end %>
|
11
|
+
<% if @name == :param && (o=object.parameters.assoc(tag.name.to_s)) && o[1] %>
|
12
|
+
<em class="default">(defaults to: <tt><%= h o[1] %></tt>)</em>
|
13
|
+
<% end %>
|
14
|
+
<% if tag.text && !tag.text.empty? %>
|
15
|
+
<% unless (@no_types || tag.types.nil? || tag.types.empty?) && @no_names %>—<% end %>
|
16
|
+
<%= htmlify_line(tag.text) %>
|
17
|
+
<% end %>
|
18
|
+
</li>
|
19
|
+
<% end %>
|
20
|
+
</ul>
|