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
data/CHANGES.md CHANGED
@@ -1,5 +1,59 @@
1
1
  # rest-core CHANGES
2
2
 
3
+ ## rest-core 0.4.0 -- ?
4
+
5
+ ### Incompatible changes:
6
+
7
+ * [dry] Now `RestCore::Ask` is renamed to `RestCore::Dry` for better
8
+ understanding. Thanks miaout17
9
+
10
+ * [client] Now `request` method takes an env and an app to make requests,
11
+ instead of a weird requests array.
12
+
13
+ ### Compatible changes:
14
+
15
+ * [client] Introduced a new method `request_full` which is exactly the same
16
+ as `request` but also returns various information from the app, including
17
+ `RESPONSE_STATUS` and `RESPONSE_HEADERS`
18
+
19
+ * [client] Removed various unused, untested, undocumented legacy from
20
+ rest-graph.
21
+
22
+ * [error] Introduced `RestCore::Error` which is the base class for all
23
+ exceptions raised by rest-core
24
+
25
+ * [builder] Now `RestCore::Builder.default_app` is the default app which
26
+ would be used for building clients without setting an app. By default,
27
+ it's `RestClient`, but you can change it if you like.
28
+
29
+ * [builder] It no longer builds a @wrapped app. If you don't understand this,
30
+ then this does nothing for you. It's an internal change. (or bug fix)
31
+
32
+ * [wrapper] Now `RestCore::Wrapper.default_app` is the default app which
33
+ would be used for wrapping middlewares without setting an app. By default,
34
+ it's `Dry`, but you can change it if you like.
35
+
36
+ * [wrapped] Fixed a bug that force middlewares to implement `members` method,
37
+ which should be optional. Thanks miaout17
38
+
39
+ * [simple] Added a Simple client, which only wraps RestClient
40
+ * [univeral] Added an Universal client, which could be used for anything
41
+ * [flurry] Added a Flurry client, along with its `Flurry::RailsUtil`
42
+ * [mixi] Added a Mixi client
43
+
44
+ * [bypass] Added a Bypass middleware which does nothing but passing env
45
+ * [oauth2_header] OAuth2Header is a middleware which would pass access_token
46
+ in header instead of in query string.
47
+ * [common_logger] nil object would no longer be logged
48
+ * [json_decode] Do nothing if we are being asked for env (dry mode)
49
+ * [middleware] Now not only query values would be escaped, but also keys.
50
+
51
+ * [rib-rest-core] Introduced an interactive shell. You'll need [rib][] to
52
+ run this: `rib rest-core`. It is using an universal client to access
53
+ arbitrary websites.
54
+
55
+ [rib]: https://github.com/godfat/rib
56
+
3
57
  ## rest-core 0.3.0 -- 2011-09-03
4
58
 
5
59
  * [facebook] RestGraph is Facebook now.
@@ -16,6 +70,7 @@
16
70
  * [oauth2_query] Now we always use the term "access_token"
17
71
  * [config] Now Config#load and Config#load_for_rails take namespace
18
72
  e.g. rest-core.yaml:
73
+
19
74
  development:
20
75
  facebook:
21
76
  app_id: 123
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
1
  # rest-core [![Build Status](http://travis-ci.org/godfat/rest-core.png)](http://travis-ci.org/godfat/rest-core)
2
+
2
3
  by Cardinal Blue <http://cardinalblue.com>
3
4
 
4
5
  ## LINKS:
@@ -10,7 +11,7 @@ by Cardinal Blue <http://cardinalblue.com>
10
11
 
11
12
  ## DESCRIPTION:
12
13
 
13
- A modular Ruby REST client collection/infrastructure.
14
+ A modular Ruby REST client collection/infrastructure
14
15
 
15
16
  In this era of web services and mashups, we have seen a blooming of REST
16
17
  APIs. One might wonder, how do we use these APIs easily and elegantly?
@@ -53,9 +54,7 @@ Or if you want development version, put this in Gemfile:
53
54
  linkedin.authorize!('..') # paste your code from browser
54
55
  linkedin.me # get current user info
55
56
 
56
- # below is exactly the same as [rest-graph][]
57
- require 'rest-core/client/rest-graph'
58
- RestGraph.new.get('4') # get user info
57
+ RestCore::Facebook.new.get('4') # get user info
59
58
 
60
59
  See [example][] for more complex examples.
61
60
 
@@ -86,6 +85,104 @@ See [built-in clients][] for more complex examples.
86
85
 
87
86
  [built-in clients]: https://github.com/cardinalblue/rest-core/tree/master/lib/rest-core/client
88
87
 
88
+ ## A simple interactive shell with [rib][]
89
+
90
+ You need to install [rib][] in order to try this interactive shell:
91
+
92
+ gem install rib
93
+
94
+ Then you can try this by running `rib rest-core`:
95
+
96
+ rest-core>> self.site = 'https://api.github.com/users/'
97
+ rest-core>> get 'cardinalblue', {}, :json_decode => true
98
+
99
+ Which is using `RestCore::Universal` for accessing arbitrary websites.
100
+
101
+ [rib]: https://github.com/godfat/rib
102
+
103
+ ## GLOSSARY:
104
+
105
+ * A _client_ is a class which can new connections to make requests.
106
+ For instance, `RestCore::Facebook.new.get('4')`
107
+
108
+ * An _app_ is an HTTP client which would do the underneath HTTP requests.
109
+ For instance, `RestCore::RestClient` is an HTTP client which uses
110
+ rest-client gem (`::RestClient`) to make HTTP requests.
111
+
112
+ * A _middleware_ is a component for a rest-core stack.
113
+ For instance, `RestCore::DefaultSite` is a middleware which would add
114
+ default site URL in front of the request URI if it is not started with
115
+ http://, thus you can do this: `RestCore::Facebook.get('4')` without
116
+ specifying where the site (Facebook) it is.
117
+
118
+ * `RestCore::Wrapper` is a utility which could help you wrap a number of
119
+ middlewares into another middleware. Currently, it's used in
120
+ `RestCore::Buidler` and `RestCore::Cache`.
121
+
122
+ * `RestCore::Builder` is a utility which could help you build a _client_
123
+ with a collection of _middlewares_ and an _app_. i.e. a rest-core stack.
124
+
125
+ * `RestCore::Middleware` is a utility which could help you build a non-trivial
126
+ middleware. More explanation to come...
127
+
128
+ * `RestCore::Client` is a module which would be included in a generated
129
+ _client_ by `RestCore::Builder`. It contains a number of convenient
130
+ functions which is generally useful.
131
+
132
+ * `RestCore::ClientOAuth1` is a module which should be included in a OAuth1.0
133
+ client. It contains a number of convenient functions which is useful for an
134
+ OAuth 1.0 client.
135
+
136
+ * An `env` is a hash which contains all the information for both request and
137
+ response. It's mostly seen in `@app.call(env)` See other explanation
138
+ such as `env[RestCore::REQUEST_METHOD]` for more detail.
139
+
140
+ * `env[RestCore::REQUEST_METHOD]` is a symbol representing which HTTP method
141
+ would be used in the subsequent HTTP request. The possible values are
142
+ either: `:get`, `:post`, `:put` or `:delete`.
143
+
144
+ * `env[RestCore::REQUEST_PATH]` is a string representing which HTTP path
145
+ would be used in the subsequent HTTP request. This path could also include
146
+ the protocol, not only the path. e.g. `"http://graph.facebook.com/4"` or
147
+ simply `"4"`. In the case of built-in Facebook client, the
148
+ `RestCore::DefaultSite` middleware would take care of the site.
149
+
150
+ * `env[RestCore::REQUEST_QUERY]` is a hash which keys are query keys and
151
+ values are query values. Both keys and values' type should be String, not
152
+ Symbol. Values with nil or false would be ignored. Both keys and values
153
+ would be escaped automatically.
154
+
155
+ * `env[RestCore::REQUEST_PAYLOAD]` is a hash which keys are payload keys and
156
+ values are payload values. Both keys and values' type should be String,
157
+ not Symbol. Values with nil or false would be ignored. Both keys and values
158
+ would be escaped automatically.
159
+
160
+ * `env[RestCore::REQUEST_HEADERS]` is a hash which keys are header names and
161
+ values are header values. Both keys and values' type should be String,
162
+ not Symbol. Values with nil or false would be ignored.
163
+
164
+ * `env[RestCore::RESPONSE_BODY]` is a string which is returned by the server.
165
+ Might be nil if there's no response or not yet making HTTP request.
166
+
167
+ * `env[RestCore::RESPONSE_STATUS]` is a number which is returned by the
168
+ server for the HTTP status. Might be nil if there's no response or not
169
+ yet making HTTP request.
170
+
171
+ * `env[RestCore::RESPONSE_HEADERS]` is a hash which is returned by the server
172
+ for the response headers. Both keys and values' type should be String.
173
+
174
+ * `env[RestCore::DRY]` is a boolean (either `true` or `false` or `nil`) which
175
+ indicates that if we're only asking for modified `env`, instead of making
176
+ real requests. It's used to ask for the real request URI, etc.
177
+
178
+ * `env[RestCore::FAIL]` is an array which contains failing events. Events
179
+ could be any objects, it's handled by `RestCore::ErrorDetector` or any
180
+ other custom _middleware_.
181
+
182
+ * `env[RestCore::LOG]` is an array which contains logging events. Events
183
+ could be any objects, it's handled by `RestCore::CommonLogger` or
184
+ any other custom _middleware_.
185
+
89
186
  ## LICENSE:
90
187
 
91
188
  Apache License 2.0
data/bin/rib-rest-core ADDED
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ begin
4
+ require 'rib/runner'
5
+ # create the shell before app to prvent your bundler (if any) kicks in
6
+ Rib.shell
7
+ # we need to require anything before loading the app,
8
+ # and both `rib auto` (true) and `rib-auto` (nil) should work
9
+ require 'rib/core' if Rib.config.delete(:mimic_irb) != false
10
+ require 'rib/app/rest-core'
11
+ # load the app
12
+ Rib::RestCore.load
13
+ Rib::Runner.run(ARGV)
14
+ rescue LoadError => e
15
+ abort("Error: #{e}\n" \
16
+ "Please install rib to use interactive rest-core:\n\n" \
17
+ " gem install rib\n\n" \
18
+ "Or add rib or rest-core to Gemfile if that's the case")
19
+ end
20
+
21
+ __END__
22
+ Run as interactive rest-core client
@@ -3,6 +3,7 @@ class ApplicationController < ActionController::Base
3
3
  protect_from_forgery
4
4
 
5
5
  include RestCore::Facebook::RailsUtil
6
+ include RestCore::Flurry::RailsUtil
6
7
 
7
8
  before_filter :filter_common , :only => [:index]
8
9
  before_filter :filter_canvas , :only => [:canvas]
@@ -1 +1,2 @@
1
- <%= rc_facebook.app_id %>
1
+ <%= rc_facebook.app_id %>
2
+ <%= rc_flurry .api_key %>
@@ -5,6 +5,10 @@ development: &default
5
5
  secret: '456'
6
6
  canvas: 'can'
7
7
 
8
+ flurry:
9
+ api_key: 'key'
10
+ access_code: 'code'
11
+
8
12
  production:
9
13
  *default
10
14
 
@@ -178,6 +178,8 @@ class ApplicationControllerTest < ActionController::TestCase
178
178
  def test_helper
179
179
  get(:helper)
180
180
  assert_response :success
181
- assert_equal RestCore::Facebook.default_app_id, @response.body.strip
181
+ assert_equal "#{RestCore::Facebook.default_app_id}\n" \
182
+ "#{RestCore::Flurry .default_api_key}",
183
+ @response.body.strip
182
184
  end
183
185
  end
@@ -3,6 +3,7 @@ class ApplicationController < ActionController::Base
3
3
  protect_from_forgery
4
4
 
5
5
  include RestCore::Facebook::RailsUtil
6
+ include RestCore::Flurry::RailsUtil
6
7
 
7
8
  before_filter :filter_common , :only => [:index]
8
9
  before_filter :filter_canvas , :only => [:canvas]
@@ -1 +1,2 @@
1
- <%= rc_facebook.app_id %>
1
+ <%= rc_facebook.app_id %>
2
+ <%= rc_flurry .api_key %>
@@ -5,6 +5,10 @@ development: &default
5
5
  secret: '456'
6
6
  canvas: 'can'
7
7
 
8
+ flurry:
9
+ api_key: 'key'
10
+ access_code: 'code'
11
+
8
12
  production:
9
13
  *default
10
14
 
@@ -178,6 +178,8 @@ class ApplicationControllerTest < ActionController::TestCase
178
178
  def test_helper
179
179
  get(:helper)
180
180
  assert_response :success
181
- assert_equal RestCore::Facebook.default_app_id, @response.body.strip
181
+ assert_equal "#{RestCore::Facebook.default_app_id}\n" \
182
+ "#{RestCore::Flurry .default_api_key}",
183
+ @response.body.strip
182
184
  end
183
185
  end
@@ -1,7 +1,7 @@
1
1
 
2
2
  require 'rest-core/middleware'
3
3
 
4
- class RestCore::Ask
4
+ class RestCore::Dry
5
5
  include RestCore::Middleware
6
6
  def call env
7
7
  env
@@ -6,18 +6,34 @@ class RestCore::Builder
6
6
  include RestCore
7
7
  include Wrapper
8
8
 
9
+ class << self
10
+ attr_writer :default_app
11
+ end
12
+ def self.default_app
13
+ @default_app ||= RestClient
14
+ end
15
+
9
16
  def self.client *attrs, &block
10
17
  new(&block).to_client(*attrs)
11
18
  end
12
19
 
13
20
  def to_client *attrs
14
- # struct = Struct.new(*members, *attrs) if RUBY_VERSION >= 1.9.2
15
- struct = Struct.new(*(members + attrs))
21
+ fields = members + attrs
22
+ struct = if fields.empty?
23
+ Struct.new(nil)
24
+ else
25
+ Struct.new(*fields)
26
+ end
16
27
  client = Class.new(struct)
17
- client.send(:include, Client)
18
28
  client.const_set('Struct', struct)
29
+ client.send(:include, Client)
19
30
  class << client; attr_reader :builder; end
20
31
  client.instance_variable_set(:@builder, self)
21
32
  client
22
33
  end
34
+
35
+ def initialize &block
36
+ @middles ||= []
37
+ instance_eval(&block) if block_given?
38
+ end
23
39
  end
@@ -1,33 +1,27 @@
1
1
 
2
+ require 'rest-core/util/rails_util_util'
3
+
2
4
  require 'cgi'
3
5
  require 'uri'
4
6
 
5
- class RestCore::Facebook
6
- module DefaultAttributes
7
- def default_canvas ; '' ; end
8
- def default_iframe ; false; end
9
- def default_auto_authorize ; false; end
10
- def default_auto_authorize_options; {} ; end
11
- def default_auto_authorize_scope ; '' ; end
12
- def default_ensure_authorized ; false; end
13
- def default_write_session ; false; end
14
- def default_write_cookies ; false; end
15
- def default_write_handler ; nil; end
16
- def default_check_handler ; nil; end
17
- end
18
-
19
- module RailsCache
20
- def [] key ; read(key) ; end
21
- def []= key, value; write(key, value) ; end
22
- def store key, value,
23
- options={}; write(key, value, options); end
24
- end
7
+ module RestCore::Facebook::DefaultAttributes
8
+ def default_canvas ; '' ; end
9
+ def default_iframe ; false; end
10
+ def default_auto_authorize ; false; end
11
+ def default_auto_authorize_options; {} ; end
12
+ def default_auto_authorize_scope ; '' ; end
13
+ def default_ensure_authorized ; false; end
14
+ def default_write_session ; false; end
15
+ def default_write_cookies ; false; end
16
+ def default_write_handler ; nil; end
17
+ def default_check_handler ; nil; end
25
18
  end
26
19
 
27
20
  module RestCore::Facebook::RailsUtil
21
+ include RestCore
22
+
28
23
  def self.init app=Rails
29
- ActiveSupport::Cache::Store.send(:include, RestCore::Facebook::RailsCache)
30
- RestCore::Config.load_for_rails(RestCore::Facebook, 'facebook', app)
24
+ Config.load_for_rails(Facebook, 'facebook', app)
31
25
  end
32
26
 
33
27
  module Helper
@@ -40,9 +34,9 @@ module RestCore::Facebook::RailsUtil
40
34
  # skip if included already, any better way to detect this?
41
35
  return if controller.respond_to?(:rc_facebook, true)
42
36
 
43
- controller.rescue_from(RestCore::Facebook::Error::AccessToken,
37
+ controller.rescue_from(Facebook::Error::AccessToken,
44
38
  :with => :rc_facebook_on_access_token_error)
45
- controller.helper(RestCore::Facebook::RailsUtil::Helper)
39
+ controller.helper(Facebook::RailsUtil::Helper)
46
40
  controller.instance_methods.select{ |method|
47
41
  method.to_s =~ /^rc_facebook/
48
42
  }.each{ |method| controller.send(:protected, method) }
@@ -50,9 +44,9 @@ module RestCore::Facebook::RailsUtil
50
44
 
51
45
  def rc_facebook_setup options={}
52
46
  rc_facebook_options_ctl.merge!(
53
- rc_facebook_extract_options(options, :reject))
47
+ RailsUtilUtil.extract_options(Facebook.members, options, :reject))
54
48
  rc_facebook_options_new.merge!(
55
- rc_facebook_extract_options(options, :select))
49
+ RailsUtilUtil.extract_options(Facebook.members, options, :select))
56
50
 
57
51
  # we'll need to reinitialize rc_facebook with the new options,
58
52
  # otherwise if you're calling rc_facebook before rc_facebook_setup,
@@ -84,7 +78,7 @@ module RestCore::Facebook::RailsUtil
84
78
 
85
79
  # override this if you need different app_id and secret
86
80
  def rc_facebook
87
- @rc_facebook ||= RestCore::Facebook.new(rc_facebook_options_new)
81
+ @rc_facebook ||= Facebook.new(rc_facebook_options_new)
88
82
  end
89
83
 
90
84
  def rc_facebook_on_access_token_error error=nil
@@ -157,7 +151,7 @@ module RestCore::Facebook::RailsUtil
157
151
  if rc_facebook_options_ctl.has_key?(key)
158
152
  rc_facebook_options_ctl[key]
159
153
  else
160
- RestCore::Facebook.send("default_#{key}")
154
+ Facebook.send("default_#{key}")
161
155
  end
162
156
  end
163
157
 
@@ -221,8 +215,10 @@ module RestCore::Facebook::RailsUtil
221
215
  def rc_facebook_check_code
222
216
  return if rc_facebook.authorized? || !params[:code]
223
217
 
224
- rc_facebook.authorize!(:code => params[:code],
225
- :redirect_uri => rc_facebook_normalized_request_uri)
218
+ rc_facebook.authorize!(
219
+ :code => params[:code],
220
+ :redirect_uri => rc_facebook_normalized_request_uri)
221
+
226
222
  logger.debug(
227
223
  "DEBUG: Facebook: detected code with " \
228
224
  "#{rc_facebook_normalized_request_uri}," \
@@ -329,13 +325,6 @@ module RestCore::Facebook::RailsUtil
329
325
  !rc_facebook_oget(:auto_authorize_options).blank? ||
330
326
  rc_facebook_oget(:auto_authorize)
331
327
  end
332
-
333
- def rc_facebook_extract_options options, method
334
- # Hash[] is for ruby 1.8.7
335
- # map(&:to_sym) is for ruby 1.8.7
336
- Hash[options.send(method){ |(k, v)|
337
- RestCore::Facebook.members.map(&:to_sym).member?(k) }]
338
- end
339
328
  # ==================== end misc ================================
340
329
  end
341
330
 
@@ -13,28 +13,24 @@ RestCore::Facebook = RestCore::Builder.client(
13
13
  'Accept-Language' => 'en-us'}
14
14
  use s::Oauth2Query , nil
15
15
 
16
- use s::CommonLogger , lambda{|obj|obj}
17
-
16
+ use s::CommonLogger , nil
18
17
  use s::Cache , nil, 3600 do
19
- use s::ErrorHandler , lambda{ |env|
20
- raise ::RestCore::Facebook::Error.call(env) }
21
- use s::ErrorDetector , lambda{ |env|
18
+ use s::ErrorHandler, lambda{ |env|
19
+ raise ::RestCore::Facebook::Error.call(env) }
20
+ use s::ErrorDetector, lambda{ |env|
22
21
  if env[s::RESPONSE_BODY].kind_of?(Hash)
23
22
  env[s::RESPONSE_BODY]['error'] ||
24
23
  env[s::RESPONSE_BODY]['error_code']
25
24
  end}
26
25
 
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
30
  :old_site => 'https://api.facebook.com/'
33
-
34
- run s::RestClient
35
31
  end
36
32
 
37
- class RestCore::Facebook::Error < RuntimeError
33
+ class RestCore::Facebook::Error < RestCore::Error
38
34
  include RestCore
39
35
  class AccessToken < Facebook::Error; end
40
36
  class InvalidAccessToken < AccessToken ; end
@@ -91,7 +87,7 @@ module RestCore::Facebook::Client
91
87
 
92
88
  def next_page hash, opts={}, &cb
93
89
  if hash['paging'].kind_of?(Hash) && hash['paging']['next']
94
- request(opts, [:get, hash['paging']['next']], &cb)
90
+ get(hash['paging']['next'], {}, opts, &cb)
95
91
  else
96
92
  yield(nil) if block_given?
97
93
  end
@@ -99,7 +95,7 @@ module RestCore::Facebook::Client
99
95
 
100
96
  def prev_page hash, opts={}, &cb
101
97
  if hash['paging'].kind_of?(Hash) && hash['paging']['previous']
102
- request(opts, [:get, hash['paging']['previous']], &cb)
98
+ get(hash['paging']['previous'], {}, opts, &cb)
103
99
  else
104
100
  yield(nil) if block_given?
105
101
  end
@@ -171,8 +167,8 @@ module RestCore::Facebook::Client
171
167
  def authorize! opts={}
172
168
  query = {:client_id => app_id, :client_secret => secret}.merge(opts)
173
169
  self.data = Vendor.parse_query(
174
- request({:json_decode => false}.merge(opts),
175
- [:get, url('oauth/access_token', query)]))
170
+ get(url('oauth/access_token'), query,
171
+ {:json_decode => false}.merge(opts)))
176
172
  end
177
173
 
178
174
  # old rest facebook api, i will definitely love to remove them someday
@@ -181,15 +177,14 @@ module RestCore::Facebook::Client
181
177
  uri = url("method/#{path}", {:format => 'json'}.merge(query),
182
178
  {:site => old_site}.merge(opts))
183
179
  if opts[:post]
184
- request(
185
- opts.merge('cache.key' => uri, 'cache.post' => true),
186
- [:post,
187
- url("method/#{path}", {:format => 'json'},
188
- {:site => old_site}.merge(opts)),
189
- {}, query],
190
- &cb)
180
+ post(url("method/#{path}", {:format => 'json'},
181
+ {:site => old_site}.merge(opts)),
182
+ query,
183
+ {} ,
184
+ opts.merge('cache.key' => uri, 'cache.post' => true),
185
+ &cb)
191
186
  else
192
- request(opts, [:get, uri], &cb)
187
+ get(uri, {}, opts, &cb)
193
188
  end
194
189
  end
195
190
 
@@ -209,7 +204,8 @@ module RestCore::Facebook::Client
209
204
  def exchange_sessions query={}, opts={}, &cb
210
205
  q = {:client_id => app_id, :client_secret => secret,
211
206
  :type => 'client_cred'}.merge(query)
212
- request(opts, [:post, url('oauth/exchange_sessions', q)], &cb)
207
+ post(url('oauth/exchange_sessions', q),
208
+ {}, {}, opts, &cb)
213
209
  end
214
210
 
215
211
  protected
@@ -0,0 +1,72 @@
1
+
2
+ require 'rest-core/util/rails_util_util'
3
+
4
+ module RestCore::Flurry::DefaultAttributes
5
+ def default_api_key ; nil; end
6
+ def default_access_code; nil; end
7
+ end
8
+
9
+ module RestCore::Flurry::RailsUtil
10
+ include RestCore
11
+
12
+ def self.init app=Rails
13
+ Config.load_for_rails(Flurry, 'flurry', app)
14
+ end
15
+
16
+ module Helper
17
+ def rc_flurry
18
+ controller.send(:rc_flurry)
19
+ end
20
+ end
21
+
22
+ def self.included controller
23
+ # skip if included already, any better way to detect this?
24
+ return if controller.respond_to?(:rc_flurry, true)
25
+
26
+ controller.helper(Flurry::RailsUtil::Helper)
27
+ controller.instance_methods.select{ |method|
28
+ method.to_s =~ /^rc_flurry/
29
+ }.each{ |method| controller.send(:protected, method) }
30
+ end
31
+
32
+ def rc_flurry_setup options={}
33
+ rc_flurry_options_ctl.merge!(
34
+ RailsUtilUtil.extract_options(Flurry.members, options, :reject))
35
+ rc_flurry_options_new.merge!(
36
+ RailsUtilUtil.extract_options(Flurry.members, options, :select))
37
+
38
+ # we'll need to reinitialize rc_flurry with the new options,
39
+ # otherwise if you're calling rc_flurry before rc_flurry_setup,
40
+ # you'll end up with default options without the ones you've passed
41
+ # into rc_flurry_setup.
42
+ rc_flurry.send(:initialize, rc_flurry_options_new)
43
+
44
+ true # keep going
45
+ end
46
+
47
+ def rc_flurry
48
+ @rc_flurry ||= Flurry.new(rc_flurry_options_new)
49
+ end
50
+
51
+ module_function
52
+
53
+ # ==================== begin options utility =======================
54
+ def rc_flurry_oget key
55
+ if rc_flurry_options_ctl.has_key?(key)
56
+ rc_flurry_options_ctl[key]
57
+ else
58
+ Flurry.send("default_#{key}")
59
+ end
60
+ end
61
+
62
+ def rc_flurry_options_ctl
63
+ @rc_flurry_options_ctl ||= {}
64
+ end
65
+
66
+ def rc_flurry_options_new
67
+ @rc_flurry_options_new ||= {:log_method => logger.method(:debug)}
68
+ end
69
+ # ==================== end options utility =======================
70
+ end
71
+
72
+ RestCore::Flurry::RailsUtil.init(Rails)