rest-core 0.3.0 → 0.4.0.pre.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.md +55 -0
- data/README.md +101 -4
- data/bin/rib-rest-core +22 -0
- data/example/rails2/app/controllers/application_controller.rb +1 -0
- data/example/rails2/app/views/application/helper.html.erb +2 -1
- data/example/rails2/config/rest-core.yaml +4 -0
- data/example/rails2/test/functional/application_controller_test.rb +3 -1
- data/example/rails3/app/controllers/application_controller.rb +1 -0
- data/example/rails3/app/views/application/helper.html.erb +2 -1
- data/example/rails3/config/rest-core.yaml +4 -0
- data/example/rails3/test/functional/application_controller_test.rb +3 -1
- data/lib/rest-core/app/{ask.rb → dry.rb} +1 -1
- data/lib/rest-core/builder.rb +19 -3
- data/lib/rest-core/client/facebook/rails_util.rb +26 -37
- data/lib/rest-core/client/facebook.rb +19 -23
- data/lib/rest-core/client/flurry/rails_util.rb +72 -0
- data/lib/rest-core/client/flurry.rb +89 -0
- data/lib/rest-core/client/github.rb +3 -6
- data/lib/rest-core/client/linkedin.rb +3 -7
- data/lib/rest-core/client/mixi.rb +51 -0
- data/lib/rest-core/client/simple.rb +2 -0
- data/lib/rest-core/client/twitter.rb +5 -9
- data/lib/rest-core/client/universal.rb +18 -0
- data/lib/rest-core/client.rb +40 -82
- data/lib/rest-core/error.rb +5 -0
- data/lib/rest-core/middleware/bypass.rb +13 -0
- data/lib/rest-core/middleware/common_logger.rb +3 -2
- data/lib/rest-core/middleware/json_decode.rb +1 -0
- data/lib/rest-core/middleware/oauth2_header.rb +23 -0
- data/lib/rest-core/middleware.rb +2 -1
- data/lib/rest-core/test.rb +1 -3
- data/lib/rest-core/util/rails_util_util.rb +19 -0
- data/lib/rest-core/version.rb +1 -1
- data/lib/rest-core/wrapper.rb +10 -4
- data/lib/rest-core.rb +9 -2
- data/lib/rib/app/rest-core.rb +15 -0
- data/rest-core.gemspec +26 -8
- data/task/gemgem.rb +75 -9
- data/test/client/facebook/test_api.rb +3 -3
- data/test/client/facebook/test_misc.rb +3 -3
- data/test/test_builder.rb +14 -0
- data/test/test_client.rb +14 -0
- data/test/test_oauth1_header.rb +1 -1
- data/test/test_wrapper.rb +30 -0
- metadata +29 -11
@@ -0,0 +1,89 @@
|
|
1
|
+
|
2
|
+
require 'rest-core'
|
3
|
+
|
4
|
+
require 'time' # for Time.parse
|
5
|
+
|
6
|
+
RestCore::Flurry = RestCore::Builder.client(:api_key, :access_code) do
|
7
|
+
s = self.class # this is only for ruby 1.8!
|
8
|
+
|
9
|
+
use s::DefaultSite , 'http://api.flurry.com/'
|
10
|
+
use s::DefaultHeaders, {'Accept' => 'application/json'}
|
11
|
+
use s::DefaultQuery , {}
|
12
|
+
|
13
|
+
use s::CommonLogger , nil
|
14
|
+
use s::Cache , {}, 3600 do
|
15
|
+
use s::ErrorHandler, lambda{|env| raise env[s::RESPONSE_BODY]['message']}
|
16
|
+
use s::ErrorDetectorHttp
|
17
|
+
use s::JsonDecode , true
|
18
|
+
end
|
19
|
+
|
20
|
+
run s::RestClient
|
21
|
+
end
|
22
|
+
|
23
|
+
module RestCore::Flurry::Client
|
24
|
+
# see: http://wiki.flurry.com/index.php?title=AppInfo
|
25
|
+
# >> f.app_info
|
26
|
+
# => {"@platform"=>"iPhone", "@name"=>"PicCollage",
|
27
|
+
# "@createdDate"=>"2011-07-24", "@category"=>"Photography",
|
28
|
+
# "@version"=>"1.0", "@generatedDate"=>"9/15/11 7:08 AM",
|
29
|
+
# "version"=>[{"@name"=>"2.1", ...
|
30
|
+
def app_info query={}
|
31
|
+
get('appInfo/getApplication', query)
|
32
|
+
end
|
33
|
+
|
34
|
+
# see: http://wiki.flurry.com/index.php?title=EventMetrics
|
35
|
+
# >> f.event_matrics(:startDate => '2011-09-14', :endDate => '2011-09-15')
|
36
|
+
# => {"@type"=>"Summary", "@startDate"=>"2011-09-14",
|
37
|
+
# "@endDate"=>"2011-09-15", "@version"=>"1.0",
|
38
|
+
# "@generatedDate"=>"9/15/117:08 AM",
|
39
|
+
# "event"=>[{"@usersLastWeek"=>"164", "@usersLastMonth"=>"642", ...
|
40
|
+
def event_metrics query={}
|
41
|
+
get('eventMetrics/Summary', query)
|
42
|
+
end
|
43
|
+
|
44
|
+
# see: http://wiki.flurry.com/index.php?title=AppMetrics
|
45
|
+
# >> f.metrics('ActiveUsers', {}, :weeks => 4)
|
46
|
+
# => [["2011-09-16", 7929], ["2011-09-15", 36453], ["2011-09-14", 34026],
|
47
|
+
# ["2011-09-13", 34245], ["2011-09-12", 36879], ["2011-09-11", 44101],
|
48
|
+
# ["2011-09-10", 43362], ["2011-09-09", 36442], ...
|
49
|
+
def metrics path, query={}, opts={}
|
50
|
+
if weeks = opts.delete(:weeks)
|
51
|
+
query[:startDate] =
|
52
|
+
(Time.now + 86400 - 86400*7*weeks).strftime('%Y-%m-%d')
|
53
|
+
end
|
54
|
+
|
55
|
+
query[:endDate] ||= Time.now.strftime('%Y-%m-%d')
|
56
|
+
|
57
|
+
get("appMetrics/#{path}", query, opts)['day'].
|
58
|
+
map{ |i| [i['@date'], i['@value'].to_i] }.reverse
|
59
|
+
end
|
60
|
+
|
61
|
+
# >> f.weekly(f.metrics('ActiveUsers', {}, :weeks => 4))
|
62
|
+
# => [258213, 247935, 260418, 236995]
|
63
|
+
def weekly array
|
64
|
+
start = Time.parse(array.last.first).to_i
|
65
|
+
array.group_by{ |(date, value)|
|
66
|
+
current = Time.parse(date).to_i
|
67
|
+
(current - start) / (86400*7)
|
68
|
+
# calling .last to discard week numbers created by group_by
|
69
|
+
}.sort.map(&:last).map{ |week|
|
70
|
+
week.map{ |(date, num)| num }.inject(&:+) }
|
71
|
+
end
|
72
|
+
|
73
|
+
# >> f.sum(f.weekly(f.metrics('ActiveUsers', {}, :weeks => 4)))
|
74
|
+
# => [258213, 495870, 768771, 982343]
|
75
|
+
def sum array
|
76
|
+
array.map.with_index{ |num, index|
|
77
|
+
num + array[1, index].inject(0, &:+)
|
78
|
+
}
|
79
|
+
end
|
80
|
+
|
81
|
+
def query
|
82
|
+
{'apiKey' => api_key ,
|
83
|
+
'apiAccessCode' => access_code}
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
RestCore::Flurry.send(:include, RestCore::Flurry::Client)
|
88
|
+
require 'rest-core/client/flurry/rails_util' if
|
89
|
+
Object.const_defined?(:Rails)
|
@@ -9,13 +9,10 @@ RestCore::Github = RestCore::Builder.client do
|
|
9
9
|
use s::DefaultHeaders, {'Accept' => 'application/json'}
|
10
10
|
use s::Oauth2Query , 'access_token', nil
|
11
11
|
|
12
|
-
use s::CommonLogger ,
|
12
|
+
use s::CommonLogger , nil
|
13
13
|
use s::Cache , nil, 3600 do
|
14
|
-
use s::ErrorHandler
|
14
|
+
use s::ErrorHandler, lambda{|env| raise env[s::RESPONSE_BODY]['message']}
|
15
15
|
use s::ErrorDetectorHttp
|
16
|
-
use s::JsonDecode
|
17
|
-
run s::Ask
|
16
|
+
use s::JsonDecode , true
|
18
17
|
end
|
19
|
-
|
20
|
-
run s::RestClient
|
21
18
|
end
|
@@ -13,10 +13,9 @@ RestCore::Linkedin = RestCore::Builder.client(:data) do
|
|
13
13
|
'uas/oauth/requestToken', 'uas/oauth/accessToken',
|
14
14
|
'https://www.linkedin.com/uas/oauth/authorize'
|
15
15
|
|
16
|
-
use s::CommonLogger ,
|
17
|
-
|
16
|
+
use s::CommonLogger , nil
|
18
17
|
use s::Cache , nil, 3600 do
|
19
|
-
use s::ErrorHandler
|
18
|
+
use s::ErrorHandler, lambda{|env|
|
20
19
|
if (body = env[s::RESPONSE_BODY]).kind_of?(Hash)
|
21
20
|
raise body['message']
|
22
21
|
else
|
@@ -24,13 +23,10 @@ RestCore::Linkedin = RestCore::Builder.client(:data) do
|
|
24
23
|
end
|
25
24
|
}
|
26
25
|
use s::ErrorDetectorHttp
|
27
|
-
use s::JsonDecode
|
28
|
-
run s::Ask
|
26
|
+
use s::JsonDecode , true
|
29
27
|
end
|
30
28
|
|
31
29
|
use s::Defaults , :data => lambda{{}}
|
32
|
-
|
33
|
-
run s::RestClient
|
34
30
|
end
|
35
31
|
|
36
32
|
module RestCore::Linkedin::Client
|
@@ -0,0 +1,51 @@
|
|
1
|
+
|
2
|
+
RestCore::Mixi = RestCore::Builder.client(
|
3
|
+
:data, :consumer_key, :consumer_secret, :redirect_uri) do
|
4
|
+
s = self.class # this is only for ruby 1.8!
|
5
|
+
use s::Timeout , 10
|
6
|
+
|
7
|
+
use s::DefaultSite , 'http://api.mixi-platform.com/'
|
8
|
+
use s::DefaultHeaders, {'Accept' => 'application/json'}
|
9
|
+
|
10
|
+
use s::Oauth2Header , nil
|
11
|
+
|
12
|
+
use s::CommonLogger , nil
|
13
|
+
use s::Cache , nil, 3600 do
|
14
|
+
use s::ErrorHandler , lambda{ |env| p env }
|
15
|
+
use s::ErrorDetectorHttp
|
16
|
+
use s::JsonDecode , true
|
17
|
+
end
|
18
|
+
|
19
|
+
use s::Defaults , :data => lambda{{}}
|
20
|
+
end
|
21
|
+
|
22
|
+
module RestCore::Mixi::Client
|
23
|
+
include RestCore
|
24
|
+
|
25
|
+
def access_token
|
26
|
+
data['access_token'] if data.kind_of?(Hash)
|
27
|
+
end
|
28
|
+
|
29
|
+
def authorize_url queries={}
|
30
|
+
url('https://mixi.jp/connect_authorize.pl',
|
31
|
+
{:client_id => consumer_key,
|
32
|
+
:response_type => 'code',
|
33
|
+
:scope => 'r_profile'}.merge(queries))
|
34
|
+
end
|
35
|
+
|
36
|
+
def authorize! code, payload={}, opts={}
|
37
|
+
pl = {:client_id => consumer_key ,
|
38
|
+
:client_secret => consumer_secret,
|
39
|
+
:redirect_uri => redirect_uri ,
|
40
|
+
:grant_type => 'authorization_code',
|
41
|
+
:code => code}.merge(payload)
|
42
|
+
|
43
|
+
self.data = post('https://secure.mixi-platform.com/2/token', pl, {}, opts)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
RestCore::Mixi.send(:include, RestCore::Mixi::Client)
|
48
|
+
|
49
|
+
$m = RestCore::Mixi.new(:consumer_key => '87b9651a2291e4853ac0',
|
50
|
+
:consumer_secret => '98866989c89c42e47d7d38394637faa84341ebb4',
|
51
|
+
:redirect_uri => 'http://pic-collage.com')
|
@@ -11,22 +11,18 @@ RestCore::Twitter = RestCore::Builder.client(:data) do
|
|
11
11
|
use s::Oauth1Header ,
|
12
12
|
'oauth/request_token', 'oauth/access_token', 'oauth/authorize'
|
13
13
|
|
14
|
-
use s::CommonLogger ,
|
15
|
-
|
14
|
+
use s::CommonLogger , nil
|
16
15
|
use s::Cache , nil, 3600 do
|
17
|
-
use s::ErrorHandler
|
18
|
-
|
16
|
+
use s::ErrorHandler, lambda{ |env|
|
17
|
+
raise ::RestCore::Twitter::Error.call(env) }
|
19
18
|
use s::ErrorDetectorHttp
|
20
|
-
use s::JsonDecode
|
21
|
-
run s::Ask
|
19
|
+
use s::JsonDecode , true
|
22
20
|
end
|
23
21
|
|
24
22
|
use s::Defaults , :data => lambda{{}}
|
25
|
-
|
26
|
-
run s::RestClient
|
27
23
|
end
|
28
24
|
|
29
|
-
class RestCore::Twitter::Error <
|
25
|
+
class RestCore::Twitter::Error < RestCore::Error
|
30
26
|
include RestCore
|
31
27
|
class ServerError < Twitter::Error; end
|
32
28
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
|
2
|
+
RestCore::Universal = RestCore::Builder.client(:data) do
|
3
|
+
s = self.class # this is only for ruby 1.8!
|
4
|
+
use s::Timeout , 0
|
5
|
+
|
6
|
+
use s::DefaultSite , nil
|
7
|
+
use s::DefaultHeaders, {}
|
8
|
+
use s::DefaultQuery , {}
|
9
|
+
|
10
|
+
use s::CommonLogger , method(:puts)
|
11
|
+
use s::Cache , {}, 3600 do
|
12
|
+
use s::ErrorHandler, nil
|
13
|
+
use s::ErrorDetectorHttp
|
14
|
+
use s::JsonDecode , false
|
15
|
+
end
|
16
|
+
|
17
|
+
use s::Defaults , :data => lambda{{}}
|
18
|
+
end
|
data/lib/rest-core/client.rb
CHANGED
@@ -48,10 +48,10 @@ module RestCore::Client
|
|
48
48
|
mod.send(:include, accessor)
|
49
49
|
end
|
50
50
|
|
51
|
-
attr_reader :app, :
|
51
|
+
attr_reader :app, :dry
|
52
52
|
def initialize o={}
|
53
53
|
@app ||= self.class.builder.to_app
|
54
|
-
@
|
54
|
+
@dry ||= self.class.builder.to_app(Dry)
|
55
55
|
o.each{ |key, value| send("#{key}=", value) if respond_to?("#{key}=") }
|
56
56
|
end
|
57
57
|
|
@@ -73,7 +73,7 @@ module RestCore::Client
|
|
73
73
|
end
|
74
74
|
send("#{k}=", vv)}
|
75
75
|
initialize(o)
|
76
|
-
@app, @
|
76
|
+
@app, @dry = lighten_app(app), lighten_app(dry)
|
77
77
|
self
|
78
78
|
end
|
79
79
|
|
@@ -83,10 +83,10 @@ module RestCore::Client
|
|
83
83
|
|
84
84
|
def url path, query={}, opts={}
|
85
85
|
Middleware.request_uri(
|
86
|
-
|
86
|
+
dry.call(build_env({
|
87
87
|
REQUEST_PATH => path,
|
88
88
|
REQUEST_QUERY => query,
|
89
|
-
|
89
|
+
DRY => true}.merge(opts))))
|
90
90
|
end
|
91
91
|
|
92
92
|
# extra options:
|
@@ -105,53 +105,54 @@ module RestCore::Client
|
|
105
105
|
# headers: Hash # additional hash you want to pass
|
106
106
|
# # default: {}
|
107
107
|
def get path, query={}, opts={}, &cb
|
108
|
-
request(
|
108
|
+
request(
|
109
|
+
{REQUEST_METHOD => :get ,
|
110
|
+
REQUEST_PATH => path ,
|
111
|
+
REQUEST_QUERY => query }.merge(opts), &cb)
|
109
112
|
end
|
110
113
|
|
111
114
|
def delete path, query={}, opts={}, &cb
|
112
|
-
request(
|
115
|
+
request(
|
116
|
+
{REQUEST_METHOD => :delete,
|
117
|
+
REQUEST_PATH => path ,
|
118
|
+
REQUEST_QUERY => query }.merge(opts), &cb)
|
113
119
|
end
|
114
120
|
|
115
121
|
def post path, payload={}, query={}, opts={}, &cb
|
116
|
-
request(
|
122
|
+
request(
|
123
|
+
{REQUEST_METHOD => :post ,
|
124
|
+
REQUEST_PATH => path ,
|
125
|
+
REQUEST_QUERY => query ,
|
126
|
+
REQUEST_PAYLOAD => payload}.merge(opts), &cb)
|
117
127
|
end
|
118
128
|
|
119
129
|
def put path, payload={}, query={}, opts={}, &cb
|
120
|
-
request(
|
130
|
+
request(
|
131
|
+
{REQUEST_METHOD => :put ,
|
132
|
+
REQUEST_PATH => path ,
|
133
|
+
REQUEST_QUERY => query ,
|
134
|
+
REQUEST_PAYLOAD => payload}.merge(opts), &cb)
|
121
135
|
end
|
122
136
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
end
|
132
|
-
|
133
|
-
def apost path, payload={}, query={}, opts={}, &cb
|
134
|
-
post(path, payload, query, {:async => true}.merge(opts), &cb)
|
135
|
-
end
|
136
|
-
|
137
|
-
def aput path, payload={}, query={}, opts={}, &cb
|
138
|
-
put(path, payload, query, {:async => true}.merge(opts), &cb)
|
139
|
-
end
|
140
|
-
|
141
|
-
def multi reqs, opts={}, &cb
|
142
|
-
request({:async => true}.merge(opts), *reqs, &cb)
|
137
|
+
def request env, app=app
|
138
|
+
if block_given?
|
139
|
+
request_full(env, app){ |response|
|
140
|
+
yield(response[RESPONSE_BODY])
|
141
|
+
}
|
142
|
+
else
|
143
|
+
request_full(env, app)[RESPONSE_BODY]
|
144
|
+
end
|
143
145
|
end
|
144
146
|
|
145
|
-
def
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
LOG => []}.merge(opts)))[RESPONSE_BODY]
|
147
|
+
def request_full env, app=app
|
148
|
+
response = app.call(build_env(
|
149
|
+
{REQUEST_METHOD => :get,
|
150
|
+
REQUEST_PATH => '/' ,
|
151
|
+
REQUEST_QUERY => {} ,
|
152
|
+
REQUEST_PAYLOAD => {} ,
|
153
|
+
REQUEST_HEADERS => {} ,
|
154
|
+
FAIL => [] ,
|
155
|
+
LOG => [] }.merge(env)))
|
155
156
|
|
156
157
|
if block_given?
|
157
158
|
yield(response)
|
@@ -232,47 +233,4 @@ module RestCore::Client
|
|
232
233
|
app.class.new(*members)
|
233
234
|
end
|
234
235
|
end
|
235
|
-
|
236
|
-
private
|
237
|
-
def request_em opts, reqs
|
238
|
-
start_time = Time.now
|
239
|
-
rs = reqs.map{ |(meth, path, query, payload)|
|
240
|
-
r = EM::HttpRequest.new(path).send(meth, :body => payload,
|
241
|
-
:head => build_headers(opts),
|
242
|
-
:query => query)
|
243
|
-
if cached = cache_get(opts, path)
|
244
|
-
# TODO: this is hack!!
|
245
|
-
r.instance_variable_set('@response', cached)
|
246
|
-
r.instance_variable_set('@state' , :finish)
|
247
|
-
r.on_request_complete
|
248
|
-
r.succeed(r)
|
249
|
-
else
|
250
|
-
r.callback{
|
251
|
-
cache_for(opts, path, meth, r.response)
|
252
|
-
log(env.merge('event' =>
|
253
|
-
Event::Requested.new(Time.now - start_time, path)))
|
254
|
-
}
|
255
|
-
r.error{
|
256
|
-
log(env.merge('event' =>
|
257
|
-
Event::Failed.new(Time.now - start_time, path)))
|
258
|
-
}
|
259
|
-
end
|
260
|
-
r
|
261
|
-
}
|
262
|
-
EM::MultiRequest.new(rs){ |m|
|
263
|
-
# TODO: how to deal with the failed?
|
264
|
-
clients = m.responses[:succeeded]
|
265
|
-
results = clients.map{ |client|
|
266
|
-
post_request(opts, client.uri, client.response)
|
267
|
-
}
|
268
|
-
|
269
|
-
if reqs.size == 1
|
270
|
-
yield(results.first)
|
271
|
-
else
|
272
|
-
log(env.merge('event' => Event::MultiDone.new(Time.now - start_time,
|
273
|
-
clients.map(&:uri).join(', '))))
|
274
|
-
yield(results)
|
275
|
-
end
|
276
|
-
}
|
277
|
-
end
|
278
236
|
end
|
@@ -16,8 +16,9 @@ class RestCore::CommonLogger
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def flush env
|
19
|
-
return env if !log_method(env) || env[
|
20
|
-
(env[LOG] || []).
|
19
|
+
return env if !log_method(env) || env[DRY]
|
20
|
+
(env[LOG] || []).compact.
|
21
|
+
each{ |obj| log_method(env).call("RestCore: #{obj}") }
|
21
22
|
env.merge(LOG => [])
|
22
23
|
end
|
23
24
|
|
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
require 'rest-core/middleware'
|
3
|
+
|
4
|
+
class RestCore::Oauth2Header
|
5
|
+
def self.members; [:access_token]; end
|
6
|
+
include RestCore::Middleware
|
7
|
+
|
8
|
+
def call env
|
9
|
+
start_time = Time.now
|
10
|
+
headers = {'Authorization' => "OAuth #{access_token(env)}"}.
|
11
|
+
merge(env[REQUEST_HEADERS] || {}) if access_token(env)
|
12
|
+
|
13
|
+
event = Event::WithHeader.new(Time.now - start_time,
|
14
|
+
"Authorization: #{headers['Authorization']}") if headers
|
15
|
+
|
16
|
+
app.call(log(cache_key(
|
17
|
+
env.merge(REQUEST_HEADERS => headers || env[REQUEST_HEADERS])), event))
|
18
|
+
end
|
19
|
+
|
20
|
+
def cache_key env
|
21
|
+
env.merge('cache.key' => "#{request_uri(env)}&#{access_token(env)}")
|
22
|
+
end
|
23
|
+
end
|
data/lib/rest-core/middleware.rb
CHANGED
@@ -46,7 +46,8 @@ module RestCore::Middleware
|
|
46
46
|
else
|
47
47
|
q = if env[REQUEST_PATH] =~ /\?/ then '&' else '?' end
|
48
48
|
"#{env[REQUEST_PATH]}#{q}" \
|
49
|
-
"#{query.map{ |(k, v)|
|
49
|
+
"#{query.map{ |(k, v)|
|
50
|
+
"#{CGI.escape(k.to_s)}=#{CGI.escape(v.to_s)}" }.join('&')}"
|
50
51
|
end
|
51
52
|
end
|
52
53
|
public :request_uri
|
data/lib/rest-core/test.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
|
2
|
+
module RestCore; end
|
3
|
+
module RestCore::RailsUtilUtil
|
4
|
+
module Cache
|
5
|
+
def [] key ; read(key) ; end
|
6
|
+
def []= key, value; write(key, value) ; end
|
7
|
+
def store key, value,
|
8
|
+
options={}; write(key, value, options); end
|
9
|
+
end
|
10
|
+
|
11
|
+
module_function
|
12
|
+
def extract_options members, options, method
|
13
|
+
# Hash[] is for ruby 1.8.7
|
14
|
+
# map(&:to_sym) is for ruby 1.8.7
|
15
|
+
Hash[options.send(method){ |(k, v)| members.map(&:to_sym).member?(k) }]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
ActiveSupport::Cache::Store.send(:include, RestCore::RailsUtilUtil::Cache)
|
data/lib/rest-core/version.rb
CHANGED
data/lib/rest-core/wrapper.rb
CHANGED
@@ -5,12 +5,18 @@ module RestCore::Wrapper
|
|
5
5
|
include RestCore
|
6
6
|
def self.included mod
|
7
7
|
mod.send(:attr_reader, :init, :middles, :wrapped)
|
8
|
+
class << mod
|
9
|
+
attr_writer :default_app
|
10
|
+
def default_app
|
11
|
+
@default_app ||= RestCore::Dry
|
12
|
+
end
|
13
|
+
end
|
8
14
|
end
|
9
15
|
|
10
16
|
def initialize &block
|
11
17
|
@middles ||= []
|
12
18
|
instance_eval(&block) if block_given?
|
13
|
-
@wrapped ||= to_app
|
19
|
+
@wrapped ||= to_app
|
14
20
|
end
|
15
21
|
|
16
22
|
def use middle, *args, &block
|
@@ -25,14 +31,14 @@ module RestCore::Wrapper
|
|
25
31
|
middles.map{ |(middle, args, block)|
|
26
32
|
if middle.public_method_defined?(:wrapped)
|
27
33
|
# TODO: this is hacky... try to avoid calling new!
|
28
|
-
middle.members + middle.new(
|
34
|
+
middle.members + middle.new(Dry.new, *args, &block).members
|
29
35
|
else
|
30
36
|
middle.members
|
31
|
-
end
|
37
|
+
end if middle.respond_to?(:members)
|
32
38
|
}.flatten
|
33
39
|
end
|
34
40
|
|
35
|
-
def to_app init=@init
|
41
|
+
def to_app init=@init || self.class.default_app
|
36
42
|
# === foldr m.new app middles
|
37
43
|
middles.reverse.inject(init.new){ |app_, (middle, args, block)|
|
38
44
|
begin
|
data/lib/rest-core.rb
CHANGED
@@ -10,13 +10,14 @@ module RestCore
|
|
10
10
|
RESPONSE_STATUS = 'RESPONSE_STATUS'
|
11
11
|
RESPONSE_HEADERS = 'RESPONSE_HEADERS'
|
12
12
|
|
13
|
-
|
13
|
+
DRY = 'core.dry'
|
14
14
|
FAIL = 'core.fail'
|
15
15
|
LOG = 'core.log'
|
16
16
|
|
17
17
|
# core utilities
|
18
18
|
autoload :Builder , 'rest-core/builder'
|
19
19
|
autoload :Client , 'rest-core/client'
|
20
|
+
autoload :Error , 'rest-core/error'
|
20
21
|
autoload :Event , 'rest-core/event'
|
21
22
|
autoload :Middleware , 'rest-core/middleware'
|
22
23
|
autoload :Wrapper , 'rest-core/wrapper'
|
@@ -30,6 +31,7 @@ module RestCore
|
|
30
31
|
autoload :Vendor , 'rest-core/util/vendor'
|
31
32
|
|
32
33
|
# middlewares
|
34
|
+
autoload :Bypass , 'rest-core/middleware/bypass'
|
33
35
|
autoload :Cache , 'rest-core/middleware/cache'
|
34
36
|
autoload :CommonLogger , 'rest-core/middleware/common_logger'
|
35
37
|
autoload :DefaultHeaders, 'rest-core/middleware/default_headers'
|
@@ -41,18 +43,23 @@ module RestCore
|
|
41
43
|
autoload :ErrorHandler , 'rest-core/middleware/error_handler'
|
42
44
|
autoload :JsonDecode , 'rest-core/middleware/json_decode'
|
43
45
|
autoload :Oauth1Header , 'rest-core/middleware/oauth1_header'
|
46
|
+
autoload :Oauth2Header , 'rest-core/middleware/oauth2_header'
|
44
47
|
autoload :Oauth2Query , 'rest-core/middleware/oauth2_query'
|
45
48
|
autoload :Timeout , 'rest-core/middleware/timeout'
|
46
49
|
|
47
50
|
# apps
|
48
|
-
autoload :
|
51
|
+
autoload :Dry , 'rest-core/app/dry'
|
49
52
|
autoload :RestClient , 'rest-core/app/rest-client'
|
50
53
|
|
51
54
|
# clients
|
55
|
+
autoload :Simple , 'rest-core/client/simple'
|
52
56
|
autoload :Github , 'rest-core/client/github'
|
53
57
|
autoload :Twitter , 'rest-core/client/twitter'
|
54
58
|
autoload :Linkedin , 'rest-core/client/linkedin'
|
55
59
|
autoload :Facebook , 'rest-core/client/facebook'
|
60
|
+
autoload :Mixi , 'rest-core/client/mixi'
|
61
|
+
autoload :Universal , 'rest-core/client/universal'
|
62
|
+
autoload :Flurry , 'rest-core/client/flurry'
|
56
63
|
end
|
57
64
|
|
58
65
|
RC = RestCore unless Object.const_defined?(:RC)
|