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.
Files changed (45) hide show
  1. data/CHANGES.md +55 -0
  2. data/README.md +101 -4
  3. data/bin/rib-rest-core +22 -0
  4. data/example/rails2/app/controllers/application_controller.rb +1 -0
  5. data/example/rails2/app/views/application/helper.html.erb +2 -1
  6. data/example/rails2/config/rest-core.yaml +4 -0
  7. data/example/rails2/test/functional/application_controller_test.rb +3 -1
  8. data/example/rails3/app/controllers/application_controller.rb +1 -0
  9. data/example/rails3/app/views/application/helper.html.erb +2 -1
  10. data/example/rails3/config/rest-core.yaml +4 -0
  11. data/example/rails3/test/functional/application_controller_test.rb +3 -1
  12. data/lib/rest-core/app/{ask.rb → dry.rb} +1 -1
  13. data/lib/rest-core/builder.rb +19 -3
  14. data/lib/rest-core/client/facebook/rails_util.rb +26 -37
  15. data/lib/rest-core/client/facebook.rb +19 -23
  16. data/lib/rest-core/client/flurry/rails_util.rb +72 -0
  17. data/lib/rest-core/client/flurry.rb +89 -0
  18. data/lib/rest-core/client/github.rb +3 -6
  19. data/lib/rest-core/client/linkedin.rb +3 -7
  20. data/lib/rest-core/client/mixi.rb +51 -0
  21. data/lib/rest-core/client/simple.rb +2 -0
  22. data/lib/rest-core/client/twitter.rb +5 -9
  23. data/lib/rest-core/client/universal.rb +18 -0
  24. data/lib/rest-core/client.rb +40 -82
  25. data/lib/rest-core/error.rb +5 -0
  26. data/lib/rest-core/middleware/bypass.rb +13 -0
  27. data/lib/rest-core/middleware/common_logger.rb +3 -2
  28. data/lib/rest-core/middleware/json_decode.rb +1 -0
  29. data/lib/rest-core/middleware/oauth2_header.rb +23 -0
  30. data/lib/rest-core/middleware.rb +2 -1
  31. data/lib/rest-core/test.rb +1 -3
  32. data/lib/rest-core/util/rails_util_util.rb +19 -0
  33. data/lib/rest-core/version.rb +1 -1
  34. data/lib/rest-core/wrapper.rb +10 -4
  35. data/lib/rest-core.rb +9 -2
  36. data/lib/rib/app/rest-core.rb +15 -0
  37. data/rest-core.gemspec +26 -8
  38. data/task/gemgem.rb +75 -9
  39. data/test/client/facebook/test_api.rb +3 -3
  40. data/test/client/facebook/test_misc.rb +3 -3
  41. data/test/test_builder.rb +14 -0
  42. data/test/test_client.rb +14 -0
  43. data/test/test_oauth1_header.rb +1 -1
  44. data/test/test_wrapper.rb +30 -0
  45. 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 , lambda{|obj|obj}
12
+ use s::CommonLogger , nil
13
13
  use s::Cache , nil, 3600 do
14
- use s::ErrorHandler , lambda{|env| raise env[s::RESPONSE_BODY]['message']}
14
+ use s::ErrorHandler, lambda{|env| raise env[s::RESPONSE_BODY]['message']}
15
15
  use s::ErrorDetectorHttp
16
- use s::JsonDecode , true
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 , method(:puts)
17
-
16
+ use s::CommonLogger , nil
18
17
  use s::Cache , nil, 3600 do
19
- use s::ErrorHandler , lambda{|env|
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 , true
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')
@@ -0,0 +1,2 @@
1
+
2
+ RestCore::Simple = RestCore::Builder.client
@@ -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 , lambda{|obj|obj}
15
-
14
+ use s::CommonLogger , nil
16
15
  use s::Cache , nil, 3600 do
17
- use s::ErrorHandler , lambda{ |env|
18
- raise ::RestCore::Twitter::Error.call(env) }
16
+ use s::ErrorHandler, lambda{ |env|
17
+ raise ::RestCore::Twitter::Error.call(env) }
19
18
  use s::ErrorDetectorHttp
20
- use s::JsonDecode , true
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 < RuntimeError
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
@@ -48,10 +48,10 @@ module RestCore::Client
48
48
  mod.send(:include, accessor)
49
49
  end
50
50
 
51
- attr_reader :app, :ask
51
+ attr_reader :app, :dry
52
52
  def initialize o={}
53
53
  @app ||= self.class.builder.to_app
54
- @ask ||= self.class.builder.to_app(Ask)
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, @ask = lighten_app(app), lighten_app(ask)
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
- ask.call(build_env({
86
+ dry.call(build_env({
87
87
  REQUEST_PATH => path,
88
88
  REQUEST_QUERY => query,
89
- ASK => true}.merge(opts))))
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(opts, [:get , path, query], &cb)
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(opts, [:delete, path, query], &cb)
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(opts, [:post , path, query, payload], &cb)
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(opts, [:put , path, query, payload], &cb)
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
- # request by eventmachine (em-http)
124
-
125
- def aget path, query={}, opts={}, &cb
126
- get(path, query, {:async => true}.merge(opts), &cb)
127
- end
128
-
129
- def adelete path, query={}, opts={}, &cb
130
- delete(path, query, {:async => true}.merge(opts), &cb)
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 request opts, *reqs
146
- req = reqs.first
147
- response = app.call(build_env({
148
- REQUEST_METHOD => req[0] ,
149
- REQUEST_PATH => req[1] ,
150
- REQUEST_QUERY => req[2] ,
151
- REQUEST_PAYLOAD => req[3] ,
152
- REQUEST_HEADERS => opts['headers'],
153
- FAIL => [] ,
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
@@ -0,0 +1,5 @@
1
+
2
+ module RestCore
3
+ class Error < RuntimeError
4
+ end
5
+ end
@@ -0,0 +1,13 @@
1
+
2
+ module RestCore; end
3
+
4
+ # the simplest middleware
5
+ class RestCore::Bypass
6
+ def initialize app
7
+ @app = app
8
+ end
9
+
10
+ def call env
11
+ @app.call(env)
12
+ end
13
+ 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[ASK]
20
- (env[LOG] || []).each{ |obj| log_method(env).call("RestCore: #{obj}") }
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
 
@@ -6,6 +6,7 @@ class RestCore::JsonDecode
6
6
  include RestCore::Middleware
7
7
 
8
8
  def call env
9
+ return app.call(env) if env[DRY]
9
10
  response = app.call(env)
10
11
  if json_decode(env)
11
12
  response.merge(RESPONSE_BODY =>
@@ -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
@@ -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)| "#{k}=#{CGI.escape(v.to_s)}" }.join('&')}"
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
@@ -1,7 +1,5 @@
1
1
 
2
- require 'rest-core/client/facebook'
3
-
4
- # need to require this before webmock in order to enable mocking in em-http
2
+ require 'rest-core'
5
3
 
6
4
  require 'rr'
7
5
  require 'webmock'
@@ -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)
@@ -1,4 +1,4 @@
1
1
 
2
2
  module RestCore
3
- VERSION = '0.3.0'
3
+ VERSION = '0.4.0.pre.0'
4
4
  end
@@ -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(@init || Ask)
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(Ask.new, *args, &block).members
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
- ASK = 'core.ask'
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 :Ask , 'rest-core/app/ask'
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)
@@ -0,0 +1,15 @@
1
+
2
+ require 'rest-core'
3
+
4
+ module Rib; end
5
+ module Rib::RestCore
6
+ Rib::Shell.use(self)
7
+ def self.load
8
+ Rib.shell.config[:binding] =
9
+ ::RestCore::Universal.new.instance_eval{binding}
10
+ end
11
+
12
+ def prompt
13
+ "rest-core#{super}"
14
+ end
15
+ end