apidoc 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile.lock +2 -2
- data/README.rdoc +2 -4
- data/VERSION +1 -1
- data/apidoc.gemspec +2 -2
- data/lib/apidoc.rb +44 -11
- data/spec/apidoc_spec.rb +199 -0
- metadata +23 -23
data/Gemfile.lock
CHANGED
data/README.rdoc
CHANGED
@@ -9,10 +9,8 @@ stumbled upon http://apiary.io. While I appreciate the motivation for this
|
|
9
9
|
project, I really wanted an API documentation tool that is:
|
10
10
|
|
11
11
|
1. Example based: Show me what a _real_ request looks like with _real_ data.
|
12
|
-
2. Self-testing and replicable: Build API documentation as part of your CI build, and know
|
13
|
-
|
14
|
-
3. Minimalist: `apidoc` is designed to make requests using the content type of
|
15
|
-
your choice and display the request, response and a short description. Nothing more.
|
12
|
+
2. Self-testing and replicable: Build API documentation as part of your CI build, and know it's up-to-date because it ran real requests against your application.
|
13
|
+
3. Minimalist: `apidoc` is designed to make requests using the content type of your choice and display the request, response and a short description. Nothing more.
|
16
14
|
|
17
15
|
|
18
16
|
== Install
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.1
|
data/apidoc.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "apidoc"
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["T.J. VanSlyke"]
|
12
|
-
s.date = "2012-06-
|
12
|
+
s.date = "2012-06-04"
|
13
13
|
s.description = "Minimalist API documentation generator for Rack applications."
|
14
14
|
s.email = "tj@turing.com"
|
15
15
|
s.executables = ["apidoc"]
|
data/lib/apidoc.rb
CHANGED
@@ -17,13 +17,17 @@ module ApiDoc
|
|
17
17
|
|
18
18
|
class Runner
|
19
19
|
def initialize(&block)
|
20
|
-
@resources
|
21
|
-
@accept
|
22
|
-
@content_type
|
20
|
+
@resources = []
|
21
|
+
@accept = nil
|
22
|
+
@content_type = nil
|
23
|
+
@before_each_blocks = []
|
24
|
+
@before_all_blocks = []
|
25
|
+
@after_each_blocks = []
|
26
|
+
@after_all_blocks = []
|
23
27
|
Blueprint.new self, &block
|
24
28
|
end
|
25
29
|
|
26
|
-
attr_accessor :resources, :accept, :content_type
|
30
|
+
attr_accessor :resources, :accept, :content_type, :before_each_blocks, :before_all_blocks, :after_each_blocks, :after_all_blocks
|
27
31
|
|
28
32
|
class Blueprint
|
29
33
|
def initialize(runner, &block)
|
@@ -35,6 +39,24 @@ module ApiDoc
|
|
35
39
|
@runner.accept = type
|
36
40
|
end
|
37
41
|
|
42
|
+
def before(type=:each, &block)
|
43
|
+
case type
|
44
|
+
when :each
|
45
|
+
@runner.before_each_blocks << block
|
46
|
+
when :all
|
47
|
+
@runner.before_all_blocks << block
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def after(type=:each, &block)
|
52
|
+
case type
|
53
|
+
when :each
|
54
|
+
@runner.after_each_blocks << block
|
55
|
+
when :all
|
56
|
+
@runner.after_all_blocks << block
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
38
60
|
def content_type(type)
|
39
61
|
@runner.content_type = type
|
40
62
|
end
|
@@ -61,7 +83,13 @@ module ApiDoc
|
|
61
83
|
end
|
62
84
|
|
63
85
|
def run
|
64
|
-
@
|
86
|
+
@before_all_blocks.each {|block| block.call}
|
87
|
+
@resources.each do |resource|
|
88
|
+
@before_each_blocks.each {|block| block.call}
|
89
|
+
resource.run
|
90
|
+
@after_each_blocks.each {|block| block.call}
|
91
|
+
end
|
92
|
+
@after_all_blocks.each {|block| block.call}
|
65
93
|
end
|
66
94
|
end
|
67
95
|
|
@@ -121,10 +149,12 @@ module ApiDoc
|
|
121
149
|
@runner = runner
|
122
150
|
@path = path
|
123
151
|
@params = nil
|
152
|
+
@before_blocks = []
|
153
|
+
@after_blocks = []
|
124
154
|
Blueprint.new self, &block
|
125
155
|
end
|
126
156
|
|
127
|
-
attr_accessor :path, :method, :
|
157
|
+
attr_accessor :path, :method, :params, :desc, :before_blocks, :after_blocks
|
128
158
|
attr_writer :accept, :content_type
|
129
159
|
|
130
160
|
class Blueprint
|
@@ -149,8 +179,12 @@ module ApiDoc
|
|
149
179
|
@resource.params = block
|
150
180
|
end
|
151
181
|
|
152
|
-
def
|
153
|
-
@resource.
|
182
|
+
def before(&block)
|
183
|
+
@resource.before_blocks << block
|
184
|
+
end
|
185
|
+
|
186
|
+
def after(&block)
|
187
|
+
@resource.after_blocks << block
|
154
188
|
end
|
155
189
|
end
|
156
190
|
|
@@ -169,11 +203,10 @@ module ApiDoc
|
|
169
203
|
end
|
170
204
|
|
171
205
|
def run
|
172
|
-
|
173
|
-
instance_eval &@setup
|
174
|
-
end
|
206
|
+
@before_blocks.each {|block| instance_eval &block }
|
175
207
|
@params = @params.call if @params.is_a?(Proc)
|
176
208
|
@response = make_request(@path, @params)
|
209
|
+
@after_blocks.each {|block| instance_eval &block }
|
177
210
|
end
|
178
211
|
|
179
212
|
def response_body
|
data/spec/apidoc_spec.rb
CHANGED
@@ -207,5 +207,204 @@ describe ApiDoc do
|
|
207
207
|
its(:response_body) { should == JSON.generate({ meat: 'beef', lettuce: true }) }
|
208
208
|
end
|
209
209
|
|
210
|
+
describe "when specifying a global before block" do
|
211
|
+
before do
|
212
|
+
$var = 0
|
213
|
+
@doc = ApiDoc.new(TestApp) do
|
214
|
+
before do
|
215
|
+
$var += 1
|
216
|
+
end
|
217
|
+
|
218
|
+
get '/tacos.json' do
|
219
|
+
desc "Get all tacos as JSON"
|
220
|
+
end
|
221
|
+
|
222
|
+
get '/tacos.xml' do
|
223
|
+
desc "Get all tacos as XML"
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
@doc.run
|
228
|
+
end
|
229
|
+
|
230
|
+
it "should have run the before block twice, once for each resource" do
|
231
|
+
$var.should == 2
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
describe "when specifying a global before each block" do
|
236
|
+
before do
|
237
|
+
$var = 0
|
238
|
+
@doc = ApiDoc.new(TestApp) do
|
239
|
+
before :each do
|
240
|
+
$var += 1
|
241
|
+
end
|
242
|
+
|
243
|
+
get '/tacos.json' do
|
244
|
+
desc "Get all tacos as JSON"
|
245
|
+
end
|
246
|
+
|
247
|
+
get '/tacos.xml' do
|
248
|
+
desc "Get all tacos as XML"
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
@doc.run
|
253
|
+
end
|
254
|
+
|
255
|
+
it "should have run the before block twice, once for each resource" do
|
256
|
+
$var.should == 2
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
describe "when specifying a global before all block" do
|
261
|
+
before do
|
262
|
+
$var = 0
|
263
|
+
@doc = ApiDoc.new(TestApp) do
|
264
|
+
before :all do
|
265
|
+
$var += 1
|
266
|
+
end
|
267
|
+
|
268
|
+
get '/tacos.json' do
|
269
|
+
desc "Get all tacos as JSON"
|
270
|
+
end
|
271
|
+
|
272
|
+
get '/tacos.xml' do
|
273
|
+
desc "Get all tacos as XML"
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
@doc.run
|
278
|
+
end
|
279
|
+
|
280
|
+
it "should have run the before block once and only once" do
|
281
|
+
$var.should == 1
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
describe "when specifying a global after block" do
|
286
|
+
before do
|
287
|
+
$var = 0
|
288
|
+
@doc = ApiDoc.new(TestApp) do
|
289
|
+
after do
|
290
|
+
$var += 1
|
291
|
+
end
|
292
|
+
|
293
|
+
get '/tacos.json' do
|
294
|
+
desc "Get all tacos as JSON"
|
295
|
+
end
|
296
|
+
|
297
|
+
get '/tacos.xml' do
|
298
|
+
desc "Get all tacos as XML"
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
@doc.run
|
303
|
+
end
|
304
|
+
|
305
|
+
it "should have run the after block twice, once for each resource" do
|
306
|
+
$var.should == 2
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
describe "when specifying a global after each block" do
|
311
|
+
before do
|
312
|
+
$var = 0
|
313
|
+
@doc = ApiDoc.new(TestApp) do
|
314
|
+
after :each do
|
315
|
+
$var += 1
|
316
|
+
end
|
317
|
+
|
318
|
+
get '/tacos.json' do
|
319
|
+
desc "Get all tacos as JSON"
|
320
|
+
end
|
321
|
+
|
322
|
+
get '/tacos.xml' do
|
323
|
+
desc "Get all tacos as XML"
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
327
|
+
@doc.run
|
328
|
+
end
|
329
|
+
|
330
|
+
it "should have run the after block twice, once for each resource" do
|
331
|
+
$var.should == 2
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
describe "when specifying a global after all block" do
|
336
|
+
before do
|
337
|
+
$var = 0
|
338
|
+
@doc = ApiDoc.new(TestApp) do
|
339
|
+
after :all do
|
340
|
+
$var += 1
|
341
|
+
end
|
342
|
+
|
343
|
+
get '/tacos.json' do
|
344
|
+
desc "Get all tacos as JSON"
|
345
|
+
end
|
346
|
+
|
347
|
+
get '/tacos.xml' do
|
348
|
+
desc "Get all tacos as XML"
|
349
|
+
end
|
350
|
+
end
|
351
|
+
|
352
|
+
@doc.run
|
353
|
+
end
|
354
|
+
|
355
|
+
it "should have run the after block once and only once" do
|
356
|
+
$var.should == 1
|
357
|
+
end
|
358
|
+
end
|
359
|
+
|
360
|
+
describe "when specifying a resource-specific before block" do
|
361
|
+
before do
|
362
|
+
$var = 0
|
363
|
+
@doc = ApiDoc.new(TestApp) do
|
364
|
+
get '/tacos.json' do
|
365
|
+
desc "Get all tacos as JSON"
|
366
|
+
before do
|
367
|
+
$var += 1
|
368
|
+
end
|
369
|
+
end
|
370
|
+
|
371
|
+
get '/tacos.xml' do
|
372
|
+
desc "Get all tacos as XML"
|
373
|
+
end
|
374
|
+
end
|
375
|
+
|
376
|
+
@doc.run
|
377
|
+
end
|
378
|
+
|
379
|
+
it "should only run the before block for its resource" do
|
380
|
+
$var.should == 1
|
381
|
+
end
|
382
|
+
end
|
383
|
+
|
384
|
+
describe "when specifying a resource-specific after block" do
|
385
|
+
before do
|
386
|
+
$var = 0
|
387
|
+
@doc = ApiDoc.new(TestApp) do
|
388
|
+
get '/tacos.json' do
|
389
|
+
desc "Get all tacos as JSON"
|
390
|
+
after do
|
391
|
+
$var += 1
|
392
|
+
end
|
393
|
+
end
|
394
|
+
|
395
|
+
get '/tacos.xml' do
|
396
|
+
desc "Get all tacos as XML"
|
397
|
+
end
|
398
|
+
end
|
399
|
+
|
400
|
+
@doc.run
|
401
|
+
end
|
402
|
+
|
403
|
+
it "should only run the before block for its resource" do
|
404
|
+
$var.should == 1
|
405
|
+
end
|
406
|
+
end
|
407
|
+
|
408
|
+
|
210
409
|
end
|
211
410
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apidoc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-06-
|
12
|
+
date: 2012-06-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|
16
|
-
requirement: &
|
16
|
+
requirement: &70350038658700 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70350038658700
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: mustache
|
27
|
-
requirement: &
|
27
|
+
requirement: &70350038681100 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70350038681100
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rack-test
|
38
|
-
requirement: &
|
38
|
+
requirement: &70350038680340 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70350038680340
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: mustache
|
49
|
-
requirement: &
|
49
|
+
requirement: &70350038679720 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70350038679720
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rspec
|
60
|
-
requirement: &
|
60
|
+
requirement: &70350038679140 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 2.8.0
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70350038679140
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rdoc
|
71
|
-
requirement: &
|
71
|
+
requirement: &70350038678540 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ~>
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '3.12'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70350038678540
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: bundler
|
82
|
-
requirement: &
|
82
|
+
requirement: &70350038678040 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ~>
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: 1.0.0
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70350038678040
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: jeweler
|
93
|
-
requirement: &
|
93
|
+
requirement: &70350038677520 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ~>
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: 1.8.3
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *70350038677520
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: json
|
104
|
-
requirement: &
|
104
|
+
requirement: &70350038676880 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ! '>='
|
@@ -109,10 +109,10 @@ dependencies:
|
|
109
109
|
version: '0'
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *70350038676880
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: sinatra
|
115
|
-
requirement: &
|
115
|
+
requirement: &70350038676280 !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
118
118
|
- - ! '>='
|
@@ -120,7 +120,7 @@ dependencies:
|
|
120
120
|
version: '0'
|
121
121
|
type: :development
|
122
122
|
prerelease: false
|
123
|
-
version_requirements: *
|
123
|
+
version_requirements: *70350038676280
|
124
124
|
description: Minimalist API documentation generator for Rack applications.
|
125
125
|
email: tj@turing.com
|
126
126
|
executables:
|
@@ -167,7 +167,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
167
167
|
version: '0'
|
168
168
|
segments:
|
169
169
|
- 0
|
170
|
-
hash:
|
170
|
+
hash: 1447906958388022363
|
171
171
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
172
172
|
none: false
|
173
173
|
requirements:
|