apiary 0.0.3 → 0.0.4
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 +5 -2
- data/README.markdown +13 -1
- data/apiary.gemspec +2 -2
- data/lib/apiary.rb +29 -21
- data/lib/apiary/api_method.rb +5 -0
- data/lib/apiary/async_response.rb +10 -0
- data/lib/apiary/version.rb +1 -1
- data/test/fixtures/basic_async.rb +21 -0
- data/test/helper.rb +1 -0
- data/test/test_async.rb +30 -0
- metadata +27 -7
data/Gemfile.lock
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
apiary (0.0.
|
4
|
+
apiary (0.0.4)
|
5
5
|
callsite
|
6
|
-
em-http-request
|
7
6
|
http_router
|
8
7
|
method-args
|
9
8
|
rack
|
10
9
|
thin
|
10
|
+
thin_async
|
11
11
|
|
12
12
|
GEM
|
13
13
|
remote: http://rubygems.org/
|
@@ -39,6 +39,8 @@ GEM
|
|
39
39
|
daemons (>= 1.0.9)
|
40
40
|
eventmachine (>= 0.12.6)
|
41
41
|
rack (>= 1.0.0)
|
42
|
+
thin_async (0.1.1)
|
43
|
+
thin (>= 1.2.1)
|
42
44
|
url_mount (0.2.1)
|
43
45
|
rack
|
44
46
|
|
@@ -55,3 +57,4 @@ DEPENDENCIES
|
|
55
57
|
rack
|
56
58
|
rake
|
57
59
|
thin
|
60
|
+
thin_async
|
data/README.markdown
CHANGED
@@ -35,4 +35,16 @@ And you'll get back
|
|
35
35
|
|
36
36
|
74.21
|
37
37
|
|
38
|
-
Currently, `get`, `post`, `put` and `delete` are supported. You can also supply a path after any verb to have a custom path. Also, the current Rack env hash is available under `rack_env` if you need to take a look at the current request.
|
38
|
+
Currently, `get`, `post`, `put` and `delete` are supported. You can also supply a path after any verb to have a custom path. Also, the current Rack env hash is available under `rack_env` if you need to take a look at the current request.
|
39
|
+
|
40
|
+
## Async Usage
|
41
|
+
|
42
|
+
If you want to use this in async mode, put an `a` in front of the method annotation. For instance
|
43
|
+
|
44
|
+
aget
|
45
|
+
def c2f(val)
|
46
|
+
EM.add_timer(0.1) do
|
47
|
+
async_response << "The temperature is :"
|
48
|
+
async_response.end(Float(val) * 9 / 5 + 32)
|
49
|
+
end
|
50
|
+
end
|
data/apiary.gemspec
CHANGED
@@ -24,8 +24,8 @@ Gem::Specification.new do |s|
|
|
24
24
|
s.add_dependency 'thin'
|
25
25
|
s.add_dependency 'http_router'
|
26
26
|
s.add_dependency 'rack'
|
27
|
-
s.add_dependency '
|
27
|
+
s.add_dependency 'thin_async'
|
28
28
|
s.add_development_dependency 'rake'
|
29
|
+
s.add_development_dependency 'em-http-request'
|
29
30
|
s.add_development_dependency 'minitest', '~> 2.0.0'
|
30
|
-
|
31
31
|
end
|
data/lib/apiary.rb
CHANGED
@@ -4,45 +4,41 @@ require 'http_router'
|
|
4
4
|
require 'thin'
|
5
5
|
require 'rack'
|
6
6
|
require 'apiary/version'
|
7
|
+
require 'apiary/api_method'
|
8
|
+
require 'apiary/async_response'
|
7
9
|
|
8
10
|
module Apiary
|
9
|
-
ApiMethod = Struct.new(:method, :http_method, :path)
|
10
11
|
|
11
|
-
attr_accessor :rack_env
|
12
|
+
attr_accessor :rack_env, :async_response
|
12
13
|
|
13
14
|
module ClassMethods
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
__set_routing(:get, path)
|
21
|
-
end
|
22
|
-
|
23
|
-
def put(path = nil)
|
24
|
-
__set_routing(:put, path)
|
25
|
-
end
|
16
|
+
[:get, :post, :put, :delete].each do |m|
|
17
|
+
class_eval "
|
18
|
+
def a#{m}(path=nil)
|
19
|
+
__set_routing(:get, path, true)
|
20
|
+
end
|
26
21
|
|
27
|
-
|
28
|
-
|
22
|
+
def #{m}(path=nil)
|
23
|
+
__set_routing(:get, path)
|
24
|
+
end
|
25
|
+
"
|
29
26
|
end
|
30
27
|
|
31
28
|
def version(number)
|
32
29
|
@version = number
|
33
30
|
end
|
34
31
|
|
35
|
-
def __set_routing(method, path)
|
36
|
-
@http_method, @path = method, path
|
32
|
+
def __set_routing(method, path, async = false)
|
33
|
+
@http_method, @path, @async = method, path, async
|
37
34
|
end
|
38
35
|
|
39
36
|
def method_added(m)
|
40
37
|
if @http_method
|
41
38
|
MethodArgs.register(Callsite.parse(caller.first).filename)
|
42
39
|
@cmds ||= []
|
43
|
-
@cmds << ApiMethod.new(m, @http_method, @path)
|
44
|
-
@http_method = nil
|
45
|
-
@path = nil
|
40
|
+
@cmds << ApiMethod.new(m, @http_method, @path, @async)
|
41
|
+
@http_method, @path, @async = nil, nil, nil
|
46
42
|
end
|
47
43
|
end
|
48
44
|
|
@@ -65,7 +61,19 @@ module Apiary
|
|
65
61
|
route.to { |env|
|
66
62
|
instance = (blk ? blk.call : new)
|
67
63
|
instance.rack_env = env
|
68
|
-
|
64
|
+
response = AsyncResponse.new(env)
|
65
|
+
if cmd.async?
|
66
|
+
instance.async_response = response
|
67
|
+
instance.send(cmd.method, *env['router.response'].param_values)
|
68
|
+
else
|
69
|
+
EM.defer(proc{
|
70
|
+
response.status = 200
|
71
|
+
response << instance.send(cmd.method, *env['router.response'].param_values).to_s
|
72
|
+
}, proc{
|
73
|
+
response.done
|
74
|
+
})
|
75
|
+
end
|
76
|
+
response.finish
|
69
77
|
}
|
70
78
|
end
|
71
79
|
router
|
data/lib/apiary/version.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
class BasicAsync
|
2
|
+
include Apiary
|
3
|
+
|
4
|
+
version '1.0'
|
5
|
+
|
6
|
+
def initialize(var = nil)
|
7
|
+
@var = var
|
8
|
+
end
|
9
|
+
|
10
|
+
aget
|
11
|
+
def ping
|
12
|
+
EM.add_timer(0.1) do
|
13
|
+
async_response.end 'ping'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
aget
|
18
|
+
def var
|
19
|
+
async_response.end @var
|
20
|
+
end
|
21
|
+
end
|
data/test/helper.rb
CHANGED
data/test/test_async.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
class TestAsync < MiniTest::Unit::TestCase
|
2
|
+
def test_simple
|
3
|
+
run_with(BasicAsync) do
|
4
|
+
request('/1.0/ping') do |http|
|
5
|
+
assert_equal 200, http.response_header.status
|
6
|
+
assert_equal 'ping', http.response
|
7
|
+
done
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_not_found
|
13
|
+
run_with(BasicAsync) do
|
14
|
+
request('/1.0/something_else') do |http|
|
15
|
+
assert_equal 404, http.response_header.status
|
16
|
+
done
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_custom_initializer
|
22
|
+
run_with(BasicAsync, proc{ BasicAsync.new('hi there')}) do
|
23
|
+
request('/1.0/var') do |http|
|
24
|
+
assert_equal 200, http.response_header.status
|
25
|
+
assert_equal 'hi there', http.response
|
26
|
+
done
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apiary
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 4
|
10
|
+
version: 0.0.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Joshua Hull
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-01-
|
18
|
+
date: 2011-01-18 00:00:00 -08:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -89,7 +89,7 @@ dependencies:
|
|
89
89
|
type: :runtime
|
90
90
|
version_requirements: *id005
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
|
-
name:
|
92
|
+
name: thin_async
|
93
93
|
prerelease: false
|
94
94
|
requirement: &id006 !ruby/object:Gem::Requirement
|
95
95
|
none: false
|
@@ -117,9 +117,23 @@ dependencies:
|
|
117
117
|
type: :development
|
118
118
|
version_requirements: *id007
|
119
119
|
- !ruby/object:Gem::Dependency
|
120
|
-
name:
|
120
|
+
name: em-http-request
|
121
121
|
prerelease: false
|
122
122
|
requirement: &id008 !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
hash: 3
|
128
|
+
segments:
|
129
|
+
- 0
|
130
|
+
version: "0"
|
131
|
+
type: :development
|
132
|
+
version_requirements: *id008
|
133
|
+
- !ruby/object:Gem::Dependency
|
134
|
+
name: minitest
|
135
|
+
prerelease: false
|
136
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
123
137
|
none: false
|
124
138
|
requirements:
|
125
139
|
- - ~>
|
@@ -131,7 +145,7 @@ dependencies:
|
|
131
145
|
- 0
|
132
146
|
version: 2.0.0
|
133
147
|
type: :development
|
134
|
-
version_requirements: *
|
148
|
+
version_requirements: *id009
|
135
149
|
description: Convert your existing class into an EM-based API.
|
136
150
|
email:
|
137
151
|
- joshbuddy@gmail.com
|
@@ -149,9 +163,13 @@ files:
|
|
149
163
|
- Rakefile
|
150
164
|
- apiary.gemspec
|
151
165
|
- lib/apiary.rb
|
166
|
+
- lib/apiary/api_method.rb
|
167
|
+
- lib/apiary/async_response.rb
|
152
168
|
- lib/apiary/version.rb
|
153
169
|
- test/fixtures/basic.rb
|
170
|
+
- test/fixtures/basic_async.rb
|
154
171
|
- test/helper.rb
|
172
|
+
- test/test_async.rb
|
155
173
|
- test/test_basic.rb
|
156
174
|
has_rdoc: true
|
157
175
|
homepage: https://github.com/joshbuddy/apiary
|
@@ -189,5 +207,7 @@ specification_version: 3
|
|
189
207
|
summary: Convert your existing class into an EM-based API
|
190
208
|
test_files:
|
191
209
|
- test/fixtures/basic.rb
|
210
|
+
- test/fixtures/basic_async.rb
|
192
211
|
- test/helper.rb
|
212
|
+
- test/test_async.rb
|
193
213
|
- test/test_basic.rb
|