rest-more 0.7.1 → 0.7.2

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 (54) hide show
  1. data/.travis.yml +2 -1
  2. data/CHANGES.md +20 -0
  3. data/Gemfile +5 -1
  4. data/README.md +26 -0
  5. data/bin/rib-rest-core +22 -0
  6. data/example/rails2/Gemfile +1 -0
  7. data/example/rails2/app/views/application/helper.html.erb +1 -1
  8. data/example/rails2/config/environment.rb +10 -0
  9. data/example/rails2/config/rest-core.yaml +2 -2
  10. data/example/rails2/test/functional/application_controller_test.rb +3 -3
  11. data/example/rails2/test/unit/rails_util_test.rb +12 -7
  12. data/example/rails3/Gemfile +1 -0
  13. data/example/rails3/app/views/application/helper.html.erb +1 -1
  14. data/example/rails3/config/rest-core.yaml +2 -2
  15. data/example/rails3/test/functional/application_controller_test.rb +3 -3
  16. data/example/rails3/test/unit/rails_util_test.rb +12 -7
  17. data/lib/rest-core/client/bing.rb +92 -0
  18. data/lib/rest-core/client/bing/rails_util.rb +13 -0
  19. data/lib/rest-core/client/facebook.rb +2 -2
  20. data/lib/rest-core/client/facebook/rails_util.rb +28 -65
  21. data/lib/rest-core/client/flurry.rb +3 -3
  22. data/lib/rest-core/client/flurry/rails_util.rb +3 -64
  23. data/lib/rest-core/client/github.rb +3 -0
  24. data/lib/rest-core/client/github/rails_util.rb +13 -0
  25. data/lib/rest-core/client/linkedin.rb +2 -0
  26. data/lib/rest-core/client/linkedin/rails_util.rb +13 -0
  27. data/lib/rest-core/client/mixi.rb +2 -0
  28. data/lib/rest-core/client/mixi/rails_util.rb +13 -0
  29. data/lib/rest-core/client/twitter.rb +2 -0
  30. data/lib/rest-core/client/twitter/rails_util.rb +13 -0
  31. data/lib/rest-core/util/rails_util_util.rb +112 -5
  32. data/lib/rest-more.rb +4 -3
  33. data/lib/rest-more/version.rb +1 -1
  34. data/lib/rib/app/rest-core.rb +15 -0
  35. data/rest-more.gemspec +13 -4
  36. data/test/client/bing/test_api.rb +34 -0
  37. data/test/client/facebook/test_api.rb +12 -12
  38. data/test/client/facebook/test_cache.rb +3 -3
  39. data/test/client/facebook/test_default.rb +5 -5
  40. data/test/client/facebook/test_error.rb +25 -25
  41. data/test/client/facebook/test_handler.rb +12 -12
  42. data/test/client/facebook/test_load_config.rb +4 -4
  43. data/test/client/facebook/test_misc.rb +16 -16
  44. data/test/client/facebook/test_oauth.rb +3 -3
  45. data/test/client/facebook/test_old.rb +11 -11
  46. data/test/client/facebook/test_page.rb +4 -4
  47. data/test/client/facebook/test_parse.rb +14 -14
  48. data/test/client/facebook/test_serialize.rb +4 -4
  49. data/test/client/facebook/test_timeout.rb +4 -4
  50. data/test/client/flurry/test_metrics.rb +1 -1
  51. data/test/client/twitter/test_api.rb +1 -1
  52. metadata +16 -7
  53. data/lib/rest-core/client/simple.rb +0 -2
  54. data/lib/rest-core/client/universal.rb +0 -18
data/.travis.yml CHANGED
@@ -9,5 +9,6 @@ rvm:
9
9
  - 1.8.7
10
10
  - 1.9.2
11
11
  - 1.9.3
12
- - rbx
12
+ - rbx-18mode
13
+ - rbx-19mode
13
14
  - jruby
data/CHANGES.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # CHANGES
2
2
 
3
+ ## rest-more 0.7.2 -- 2011-11-05
4
+
5
+ ### Incompatible changes
6
+
7
+ * [Flurry] renamed `api_key` to `apiKey` to better match the original name
8
+ from flurry. Also renamed `access_code` to `apiAccessCode`.
9
+ * [Facebook::RailsUtil] Some `module_function`s are changed to controller's
10
+ private methods. You aren't using it if you don't know what does this mean.
11
+
12
+ ### Enhancement
13
+
14
+ * Added `rib-rest-core` command line tool, extracted from rest-core.
15
+ * [RailsUtilUtil] Introduced this to ease the pain writing RailsUtil for
16
+ various clients.
17
+ * [Bing] Added Bing client and its RailsUtil.
18
+ * [Github] Added RailsUtil for Github client.
19
+ * [Linkedin] Added RailsUtil for Linkedin client.
20
+ * [Mixi] Added RailsUtil for Mixi client.
21
+ * [Twitter] Added RailsUtil for Twitter client.
22
+
3
23
  ## rest-more 0.7.1 -- 2011-10-31
4
24
 
5
25
  ### Bugs fixes
data/Gemfile CHANGED
@@ -1,7 +1,11 @@
1
1
 
2
2
  source 'http://rubygems.org'
3
3
 
4
- gemspec
4
+ # this is for travis-ci
5
+ gem 'rest-core', :path => 'rest-core' if
6
+ File.exist?("#{File.dirname(File.expand_path(__FILE__))}/rest-core/Gemfile")
7
+ gem 'rest-client'
8
+ gem 'rest-more', :path => '.'
5
9
 
6
10
  gem 'rake'
7
11
  gem 'bacon'
data/README.md CHANGED
@@ -48,6 +48,32 @@ See [example][] for more complex examples.
48
48
 
49
49
  [example]: https://github.com/cardinalblue/rest-more/tree/master/example
50
50
 
51
+ ## List of supported clients:
52
+
53
+ * Bing
54
+ * Facebook
55
+ * Flurry
56
+ * Github
57
+ * Linkedin
58
+ * Mixi
59
+ * Twitter
60
+
61
+ ## A simple interactive shell with [rib][]:
62
+
63
+ You need to install [rib][] in order to try this interactive shell:
64
+
65
+ gem install rib
66
+
67
+ Then you can try this by running `rib rest-core`:
68
+
69
+ rest-core>> self.site = 'https://api.github.com/users/'
70
+ rest-core>> self.json_decode = true
71
+ rest-core>> get 'cardinalblue'
72
+
73
+ Which is using `RestCore::Universal` for accessing arbitrary websites.
74
+
75
+ [rib]: https://github.com/godfat/rib
76
+
51
77
  ## rest-more users:
52
78
 
53
79
  * [s2sync](https://github.com/brucehsu/s2sync)
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
@@ -4,6 +4,7 @@ source 'http://rubygems.org'
4
4
  gem 'rails', '2.3.14'
5
5
 
6
6
  gem 'rest-client' # for rest-core
7
+ gem 'rest-core', :path => '../../rest-core'
7
8
  gem 'rest-more', :path => '../../'
8
9
 
9
10
  group 'test' do
@@ -1,2 +1,2 @@
1
1
  <%= rc_facebook.app_id %>
2
- <%= rc_flurry .api_key %>
2
+ <%= rc_flurry .apiKey %>
@@ -3,6 +3,16 @@
3
3
  # Specifies gem version of Rails to use when vendor/rails is not present
4
4
  RAILS_GEM_VERSION = '2.3.14' unless defined? RAILS_GEM_VERSION
5
5
 
6
+ # monkey patch from https://github.com/rails/rails/pull/3473
7
+ class MissingSourceFile < LoadError #:nodoc:
8
+ REGEXPS = [
9
+ [/^no such file to load -- (.+)$/i, 1],
10
+ [/^Missing \w+ (file\s*)?([^\s]+.rb)$/i, 2],
11
+ [/^Missing API definition file in (.+)$/i, 1],
12
+ [/^cannot load such file -- (.+)$/i, 1]
13
+ ]
14
+ end
15
+
6
16
  # Bootstrap the Rails environment, frameworks, and default configuration
7
17
  require File.join(File.dirname(__FILE__), 'boot')
8
18
 
@@ -6,8 +6,8 @@ development: &default
6
6
  canvas: 'can'
7
7
 
8
8
  flurry:
9
- api_key: 'key'
10
- access_code: 'code'
9
+ apiKey: 'key'
10
+ apiAccessCode: 'code'
11
11
 
12
12
  production:
13
13
  *default
@@ -145,7 +145,7 @@ class ApplicationControllerTest < ActionController::TestCase
145
145
  stub_request(:get, 'https://graph.facebook.com/me?access_token=wozilla').
146
146
  to_return(:body => '["fireball"]')
147
147
 
148
- @request.session[RestCore::Facebook::RailsUtil.rc_facebook_storage_key] =
148
+ @request.session[@controller.send(:rc_facebook_storage_key)] =
149
149
  RestCore::Facebook.new(:access_token => 'wozilla').fbs
150
150
 
151
151
  get(:session_)
@@ -158,7 +158,7 @@ class ApplicationControllerTest < ActionController::TestCase
158
158
  stub_request(:get, 'https://graph.facebook.com/me?access_token=blizzard').
159
159
  to_return(:body => '["yeti"]')
160
160
 
161
- @request.cookies[RestCore::Facebook::RailsUtil.rc_facebook_storage_key] =
161
+ @request.cookies[@controller.send(:rc_facebook_storage_key)] =
162
162
  RestCore::Facebook.new(:access_token => 'blizzard').fbs
163
163
 
164
164
  get(:cookies_)
@@ -182,7 +182,7 @@ class ApplicationControllerTest < ActionController::TestCase
182
182
  get(:helper)
183
183
  assert_response :success
184
184
  assert_equal "#{RestCore::Facebook.default_app_id}\n" \
185
- "#{RestCore::Flurry .default_api_key}",
185
+ "#{RestCore::Flurry .default_apiKey}",
186
186
  @response.body.strip
187
187
  end
188
188
 
@@ -6,8 +6,13 @@ class RailsUtilTest < ActiveSupport::TestCase
6
6
  include RR::Adapters::TestUnit
7
7
 
8
8
  def setup_mock url
9
- mock(RestCore::Facebook::RailsUtil).rc_facebook_in_canvas?{ false }
10
- mock(RestCore::Facebook::RailsUtil).request{
9
+ @controller = Class.new do
10
+ def self.helper dummy ; end
11
+ def self.rescue_from dummy, _; end
12
+ include RestCore::Facebook::RailsUtil
13
+ end.new
14
+ mock(@controller).rc_facebook_in_canvas?{ false }
15
+ mock(@controller).request{
11
16
  mock(Object.new).url{ url }
12
17
  }
13
18
  end
@@ -15,30 +20,30 @@ class RailsUtilTest < ActiveSupport::TestCase
15
20
  def test_rest_graph_normalized_request_uri_0
16
21
  setup_mock( 'http://test.com/?code=123&lang=en')
17
22
  assert_equal('http://test.com/?lang=en',
18
- RestCore::Facebook::RailsUtil.rc_facebook_normalized_request_uri)
23
+ @controller.send(:rc_facebook_normalized_request_uri))
19
24
  end
20
25
 
21
26
  def test_rest_graph_normalized_request_uri_1
22
27
  setup_mock( 'http://test.com/?lang=en&code=123')
23
28
  assert_equal('http://test.com/?lang=en',
24
- RestCore::Facebook::RailsUtil.rc_facebook_normalized_request_uri)
29
+ @controller.send(:rc_facebook_normalized_request_uri))
25
30
  end
26
31
 
27
32
  def test_rest_graph_normalized_request_uri_2
28
33
  setup_mock( 'http://test.com/?session=abc&lang=en&code=123')
29
34
  assert_equal('http://test.com/?lang=en',
30
- RestCore::Facebook::RailsUtil.rc_facebook_normalized_request_uri)
35
+ @controller.send(:rc_facebook_normalized_request_uri))
31
36
  end
32
37
 
33
38
  def test_rest_graph_normalized_request_uri_3
34
39
  setup_mock( 'http://test.com/?code=123')
35
40
  assert_equal('http://test.com/',
36
- RestCore::Facebook::RailsUtil.rc_facebook_normalized_request_uri)
41
+ @controller.send(:rc_facebook_normalized_request_uri))
37
42
  end
38
43
 
39
44
  def test_rest_graph_normalized_request_uri_4
40
45
  setup_mock( 'http://test.com/?signed_request=abc&code=123')
41
46
  assert_equal('http://test.com/',
42
- RestCore::Facebook::RailsUtil.rc_facebook_normalized_request_uri)
47
+ @controller.send(:rc_facebook_normalized_request_uri))
43
48
  end
44
49
  end
@@ -4,6 +4,7 @@ source 'http://rubygems.org'
4
4
  gem 'rails', '3.0.9'
5
5
 
6
6
  gem 'rest-client' # for rest-core
7
+ gem 'rest-core', :path => '../../rest-core'
7
8
  gem 'rest-more', :path => '../../'
8
9
 
9
10
  group 'test' do
@@ -1,2 +1,2 @@
1
1
  <%= rc_facebook.app_id %>
2
- <%= rc_flurry .api_key %>
2
+ <%= rc_flurry .apiKey %>
@@ -6,8 +6,8 @@ development: &default
6
6
  canvas: 'can'
7
7
 
8
8
  flurry:
9
- api_key: 'key'
10
- access_code: 'code'
9
+ apiKey: 'key'
10
+ apiAccessCode: 'code'
11
11
 
12
12
  production:
13
13
  *default
@@ -145,7 +145,7 @@ class ApplicationControllerTest < ActionController::TestCase
145
145
  stub_request(:get, 'https://graph.facebook.com/me?access_token=wozilla').
146
146
  to_return(:body => '["fireball"]')
147
147
 
148
- @request.session[RestCore::Facebook::RailsUtil.rc_facebook_storage_key] =
148
+ @request.session[@controller.send(:rc_facebook_storage_key)] =
149
149
  RestCore::Facebook.new(:access_token => 'wozilla').fbs
150
150
 
151
151
  get(:session_)
@@ -158,7 +158,7 @@ class ApplicationControllerTest < ActionController::TestCase
158
158
  stub_request(:get, 'https://graph.facebook.com/me?access_token=blizzard').
159
159
  to_return(:body => '["yeti"]')
160
160
 
161
- @request.cookies[RestCore::Facebook::RailsUtil.rc_facebook_storage_key] =
161
+ @request.cookies[@controller.send(:rc_facebook_storage_key)] =
162
162
  RestCore::Facebook.new(:access_token => 'blizzard').fbs
163
163
 
164
164
  get(:cookies_)
@@ -182,7 +182,7 @@ class ApplicationControllerTest < ActionController::TestCase
182
182
  get(:helper)
183
183
  assert_response :success
184
184
  assert_equal "#{RestCore::Facebook.default_app_id}\n" \
185
- "#{RestCore::Flurry .default_api_key}",
185
+ "#{RestCore::Flurry .default_apiKey}",
186
186
  @response.body.strip
187
187
  end
188
188
 
@@ -6,8 +6,13 @@ class RailsUtilTest < ActiveSupport::TestCase
6
6
  include RR::Adapters::TestUnit
7
7
 
8
8
  def setup_mock url
9
- mock(RestCore::Facebook::RailsUtil).rc_facebook_in_canvas?{ false }
10
- mock(RestCore::Facebook::RailsUtil).request{
9
+ @controller = Class.new do
10
+ def self.helper dummy ; end
11
+ def self.rescue_from dummy, _; end
12
+ include RestCore::Facebook::RailsUtil
13
+ end.new
14
+ mock(@controller).rc_facebook_in_canvas?{ false }
15
+ mock(@controller).request{
11
16
  mock(Object.new).url{ url }
12
17
  }
13
18
  end
@@ -15,30 +20,30 @@ class RailsUtilTest < ActiveSupport::TestCase
15
20
  def test_rest_graph_normalized_request_uri_0
16
21
  setup_mock( 'http://test.com/?code=123&lang=en')
17
22
  assert_equal('http://test.com/?lang=en',
18
- RestCore::Facebook::RailsUtil.rc_facebook_normalized_request_uri)
23
+ @controller.send(:rc_facebook_normalized_request_uri))
19
24
  end
20
25
 
21
26
  def test_rest_graph_normalized_request_uri_1
22
27
  setup_mock( 'http://test.com/?lang=en&code=123')
23
28
  assert_equal('http://test.com/?lang=en',
24
- RestCore::Facebook::RailsUtil.rc_facebook_normalized_request_uri)
29
+ @controller.send(:rc_facebook_normalized_request_uri))
25
30
  end
26
31
 
27
32
  def test_rest_graph_normalized_request_uri_2
28
33
  setup_mock( 'http://test.com/?session=abc&lang=en&code=123')
29
34
  assert_equal('http://test.com/?lang=en',
30
- RestCore::Facebook::RailsUtil.rc_facebook_normalized_request_uri)
35
+ @controller.send(:rc_facebook_normalized_request_uri))
31
36
  end
32
37
 
33
38
  def test_rest_graph_normalized_request_uri_3
34
39
  setup_mock( 'http://test.com/?code=123')
35
40
  assert_equal('http://test.com/',
36
- RestCore::Facebook::RailsUtil.rc_facebook_normalized_request_uri)
41
+ @controller.send(:rc_facebook_normalized_request_uri))
37
42
  end
38
43
 
39
44
  def test_rest_graph_normalized_request_uri_4
40
45
  setup_mock( 'http://test.com/?signed_request=abc&code=123')
41
46
  assert_equal('http://test.com/',
42
- RestCore::Facebook::RailsUtil.rc_facebook_normalized_request_uri)
47
+ @controller.send(:rc_facebook_normalized_request_uri))
43
48
  end
44
49
  end
@@ -0,0 +1,92 @@
1
+
2
+ require 'rest-core'
3
+
4
+ RestCore::Bing = RestCore::Builder.client(:AppId) do
5
+ s = self.class # this is only for ruby 1.8!
6
+ use s::Timeout , 10
7
+
8
+ use s::DefaultSite , 'http://api.bing.net/json.aspx'
9
+ use s::DefaultHeaders, {'Accept' => 'application/json'}
10
+ use s::DefaultQuery , {}
11
+
12
+ use s::CommonLogger , nil
13
+ use s::Cache , nil, 600 do
14
+ use s::ErrorHandler, lambda{ |env|
15
+ raise ::RestCore::Bing::Error.call(env) }
16
+ use s::ErrorDetector, lambda{ |env|
17
+ if env[s::RESPONSE_BODY].kind_of?(Hash) &&
18
+ (res = env[s::RESPONSE_BODY]['SearchResponse']).kind_of?(Hash)
19
+ res['Errors']
20
+ end}
21
+ use s::JsonDecode , true
22
+ end
23
+ end
24
+
25
+ module RestCore::Bing::Client
26
+ def query
27
+ {'AppId' => self.AppId,
28
+ 'JsonType' => 'raw' ,
29
+ 'Version' => '2.2' }
30
+ end
31
+
32
+ def search_image term, query={}, opts={}
33
+ get('', {:Query => term, :Sources => 'Image'}.merge(query), opts)[
34
+ 'SearchResponse']['Image']['Results'] || []
35
+ end
36
+
37
+ def search_image_urls term, query={}, opts={}
38
+ search_image(term, query, opts).map{ |i| i['MediaUrl'] }
39
+ end
40
+ end
41
+
42
+ class RestCore::Bing::Error < RestCore::Error
43
+ include RestCore
44
+ class MissingParameter < Bing::Error; end
45
+ class InvalidParameter < Bing::Error; end
46
+ class QueryTooLong < Bing::Error; end
47
+ class AppIdNotFunctioning < Bing::Error; end
48
+ class ExceededLimit < Bing::Error; end
49
+ class NoAccess < Bing::Error; end
50
+ class ResultsTemporarilyUnavailable < Bing::Error; end
51
+ class ServiceTemporarilyUnavailable < Bing::Error; end
52
+ class SourceTypeError < Bing::Error; end
53
+
54
+ attr_reader :error, :url
55
+ def initialize error, url=''
56
+ @error, @url = error, url
57
+ super("#{error.inspect} from #{url}")
58
+ end
59
+
60
+ def self.call env
61
+ error, url = env[RESPONSE_BODY], Middleware.request_uri(env)
62
+ code = extract_error_code(error)
63
+
64
+ return new(env[FAIL], url) unless code
65
+
66
+ case code
67
+ when 1001; MissingParameter
68
+ when 1002; InvalidParameter
69
+ when 1005; QueryTooLong
70
+ when 2001; AppIdNotFunctioning
71
+ when 2002; ExceededLimit
72
+ when 2003; NoAccess
73
+ when 3001; ResultsTemporarilyUnavailable
74
+ when 3002; ServiceTemporarilyUnavailable
75
+ when 4001; SourceTypeError
76
+ end.new(error, url)
77
+ end
78
+
79
+ def self.extract_error_code error
80
+ code = error.kind_of?(Hash) &&
81
+ (error = error['SearchResponse']).kind_of?(Hash) &&
82
+ (error = error['Errors'] ).kind_of?(Array) &&
83
+ (error = error[0] ).kind_of?(Hash) &&
84
+ (error = error['Code'] )
85
+
86
+ code && code.to_i
87
+ end
88
+ end
89
+
90
+ RestCore::Bing.send(:include, RestCore::Bing::Client)
91
+ require 'rest-core/client/bing/rails_util' if
92
+ Object.const_defined?(:Rails)
@@ -0,0 +1,13 @@
1
+
2
+ require 'rest-core/util/rails_util_util'
3
+
4
+ module RestCore::Bing::DefaultAttributes
5
+ def default_log_method; Rails.logger.method(:debug); end
6
+ def default_cache ; Rails.cache ; end
7
+ end
8
+
9
+ module RestCore::Bing::RailsUtil
10
+ include RestCore::RailsUtilUtil
11
+ end
12
+
13
+ RestCore::Bing::RailsUtil.init(Rails)
@@ -132,7 +132,7 @@ module RestCore::Facebook::Client
132
132
  def parse_fbs! fbs
133
133
  self.data = check_sig_and_return_data(
134
134
  # take out facebook sometimes there but sometimes not quotes in cookies
135
- Vendor.parse_query(fbs.to_s.sub(/^"/, '').sub(/"$/, '')))
135
+ ParseQuery.parse_query(fbs.to_s.sub(/^"/, '').sub(/"$/, '')))
136
136
  end
137
137
 
138
138
  def parse_fbsr! fbsr
@@ -180,7 +180,7 @@ module RestCore::Facebook::Client
180
180
 
181
181
  def authorize! opts={}
182
182
  query = {:client_id => app_id, :client_secret => secret}.merge(opts)
183
- self.data = Vendor.parse_query(
183
+ self.data = ParseQuery.parse_query(
184
184
  get(url('oauth/access_token'), query,
185
185
  {:json_decode => false}.merge(opts)))
186
186
  end