rest-core 0.3.0 → 0.4.0.pre.0

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.
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