rest-more 1.0.2 → 2.0.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 (72) hide show
  1. data/.gitignore +0 -5
  2. data/.travis.yml +4 -6
  3. data/CHANGES.md +16 -0
  4. data/Gemfile +6 -3
  5. data/README.md +43 -129
  6. data/Rakefile +2 -3
  7. data/example/multi.rb +12 -23
  8. data/example/rails3/Gemfile +2 -1
  9. data/example/rails3/app/controllers/application_controller.rb +9 -4
  10. data/example/rails3/test/functional/application_controller_test.rb +1 -1
  11. data/example/rainbows.rb +48 -7
  12. data/example/simple.rb +3 -3
  13. data/example/sinatra/config.ru +1 -1
  14. data/lib/rest-core/client/dropbox.rb +19 -27
  15. data/lib/rest-core/client/facebook.rb +28 -51
  16. data/lib/rest-core/client/facebook/rails_util.rb +13 -11
  17. data/lib/rest-core/client/github.rb +13 -21
  18. data/lib/rest-core/client/linkedin.rb +19 -27
  19. data/lib/rest-core/client/twitter.rb +13 -21
  20. data/lib/rest-more.rb +0 -2
  21. data/lib/rest-more/test.rb +11 -0
  22. data/lib/rest-more/version.rb +1 -1
  23. data/rest-more.gemspec +7 -41
  24. data/task/.gitignore +1 -0
  25. data/task/gemgem.rb +267 -0
  26. data/test/dropbox/test_api.rb +1 -1
  27. data/test/facebook/config/rest-core.yaml +1 -1
  28. data/test/facebook/test_api.rb +10 -14
  29. data/test/facebook/test_error.rb +2 -2
  30. data/test/facebook/test_handler.rb +6 -6
  31. data/test/facebook/test_load_config.rb +4 -4
  32. data/test/facebook/test_misc.rb +3 -3
  33. data/test/facebook/test_old.rb +2 -37
  34. data/test/facebook/test_page.rb +26 -24
  35. data/test/facebook/test_parse.rb +1 -1
  36. data/test/facebook/test_serialize.rb +3 -19
  37. data/test/facebook/test_timeout.rb +6 -2
  38. data/test/twitter/test_api.rb +1 -1
  39. metadata +6 -40
  40. data/doc/ToC.md +0 -9
  41. data/doc/dependency.md +0 -4
  42. data/doc/design.md +0 -4
  43. data/doc/rest-graph.md +0 -4
  44. data/example/async.rb +0 -89
  45. data/example/facebook.rb +0 -13
  46. data/example/rails2/Gemfile +0 -22
  47. data/example/rails2/README +0 -4
  48. data/example/rails2/Rakefile +0 -11
  49. data/example/rails2/app/controllers/application_controller.rb +0 -138
  50. data/example/rails2/app/views/application/helper.html.erb +0 -1
  51. data/example/rails2/config/boot.rb +0 -130
  52. data/example/rails2/config/environment.rb +0 -25
  53. data/example/rails2/config/environments/development.rb +0 -17
  54. data/example/rails2/config/environments/production.rb +0 -28
  55. data/example/rails2/config/environments/test.rb +0 -30
  56. data/example/rails2/config/initializers/cookie_verification_secret.rb +0 -7
  57. data/example/rails2/config/initializers/new_rails_defaults.rb +0 -21
  58. data/example/rails2/config/initializers/session_store.rb +0 -15
  59. data/example/rails2/config/preinitializer.rb +0 -23
  60. data/example/rails2/config/rest-core.yaml +0 -12
  61. data/example/rails2/config/routes.rb +0 -43
  62. data/example/rails2/log +0 -0
  63. data/example/rails2/test/functional/application_controller_test.rb +0 -259
  64. data/example/rails2/test/test_helper.rb +0 -18
  65. data/example/rails2/test/unit/rails_util_test.rb +0 -49
  66. data/lib/rest-core/client/bing.rb +0 -102
  67. data/lib/rest-core/client/bing/rails_util.rb +0 -13
  68. data/lib/rest-core/client/mixi.rb +0 -60
  69. data/lib/rest-core/client/mixi/rails_util.rb +0 -13
  70. data/test/bing/test_api.rb +0 -34
  71. data/test/facebook/test_cache.rb +0 -58
  72. data/test/mixi/test_api.rb +0 -20
@@ -1,18 +0,0 @@
1
-
2
- ENV["RAILS_ENV"] = "test"
3
- require File.expand_path('../../config/environment', __FILE__)
4
- begin
5
- require 'rails/test_help'
6
- rescue LoadError # for rails2
7
- require 'test_help'
8
- end
9
-
10
- class ActiveSupport::TestCase
11
- def normalize_query query, amp='&'
12
- '?' + query[1..-1].split(amp).sort.join(amp)
13
- end
14
-
15
- def normalize_url url, amp='&'
16
- url.sub(/\?.+/){ |query| normalize_query(query, amp) }
17
- end
18
- end
@@ -1,49 +0,0 @@
1
-
2
- require 'test_helper'
3
- require 'rr'
4
-
5
- class RailsUtilTest < ActiveSupport::TestCase
6
- include RR::Adapters::TestUnit
7
-
8
- def setup_mock url
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{
16
- mock(Object.new).url{ url }
17
- }
18
- end
19
-
20
- def test_rest_graph_normalized_request_uri_0
21
- setup_mock( 'http://test.com/?code=123&lang=en')
22
- assert_equal('http://test.com/?lang=en',
23
- @controller.send(:rc_facebook_normalized_request_uri))
24
- end
25
-
26
- def test_rest_graph_normalized_request_uri_1
27
- setup_mock( 'http://test.com/?lang=en&code=123')
28
- assert_equal('http://test.com/?lang=en',
29
- @controller.send(:rc_facebook_normalized_request_uri))
30
- end
31
-
32
- def test_rest_graph_normalized_request_uri_2
33
- setup_mock( 'http://test.com/?session=abc&lang=en&code=123')
34
- assert_equal('http://test.com/?lang=en',
35
- @controller.send(:rc_facebook_normalized_request_uri))
36
- end
37
-
38
- def test_rest_graph_normalized_request_uri_3
39
- setup_mock( 'http://test.com/?code=123')
40
- assert_equal('http://test.com/',
41
- @controller.send(:rc_facebook_normalized_request_uri))
42
- end
43
-
44
- def test_rest_graph_normalized_request_uri_4
45
- setup_mock( 'http://test.com/?signed_request=abc&code=123')
46
- assert_equal('http://test.com/',
47
- @controller.send(:rc_facebook_normalized_request_uri))
48
- end
49
- end
@@ -1,102 +0,0 @@
1
-
2
- require 'rest-core'
3
-
4
- # http://msdn.microsoft.com/en-us/library/dd250846.aspx
5
- RestCore::Bing = RestCore::Builder.client(:AppId) do
6
- s = RestCore
7
- use s::Timeout , 10
8
-
9
- use s::DefaultSite , 'http://api.bing.net/json.aspx'
10
- use s::DefaultHeaders, {'Accept' => 'application/json'}
11
- use s::DefaultQuery , {}
12
-
13
- use s::CommonLogger , nil
14
- use s::Cache , nil, 600 do
15
- use s::ErrorHandler, lambda{ |env|
16
- if env[s::ASYNC]
17
- if env[s::RESPONSE_BODY].kind_of?(::Exception)
18
- env
19
- else
20
- env.merge(s::RESPONSE_BODY => ::RestCore::Bing::Error.call(env))
21
- end
22
- else
23
- raise ::RestCore::Bing::Error.call(env)
24
- end}
25
- use s::ErrorDetector, lambda{ |env|
26
- if env[s::RESPONSE_BODY].kind_of?(Hash) &&
27
- (res = env[s::RESPONSE_BODY]['SearchResponse']).kind_of?(Hash)
28
- res['Errors']
29
- end}
30
- use s::JsonDecode , true
31
- end
32
- end
33
-
34
- # http://msdn.microsoft.com/en-us/library/dd251042.aspx
35
- class RestCore::Bing::Error < RestCore::Error
36
- include RestCore
37
- class MissingParameter < Bing::Error; end
38
- class InvalidParameter < Bing::Error; end
39
- class QueryTooLong < Bing::Error; end
40
- class AppIdNotFunctioning < Bing::Error; end
41
- class ExceededLimit < Bing::Error; end
42
- class NoAccess < Bing::Error; end
43
- class ResultsTemporarilyUnavailable < Bing::Error; end
44
- class ServiceTemporarilyUnavailable < Bing::Error; end
45
- class SourceTypeError < Bing::Error; end
46
-
47
- attr_reader :error, :code, :url
48
- def initialize error, code, url=''
49
- @error, @code, @url = error, code, url
50
- super("[#{code}] #{error.inspect} from #{url}")
51
- end
52
-
53
- def self.call env
54
- error, url = env[RESPONSE_BODY], Middleware.request_uri(env)
55
- code = extract_error_code(error)
56
-
57
- return new(error, code, url) unless code
58
-
59
- case code
60
- when 1001; MissingParameter
61
- when 1002; InvalidParameter
62
- when 1005; QueryTooLong
63
- when 2001; AppIdNotFunctioning
64
- when 2002; ExceededLimit
65
- when 2003; NoAccess
66
- when 3001; ResultsTemporarilyUnavailable
67
- when 3002; ServiceTemporarilyUnavailable
68
- when 4001; SourceTypeError
69
- end.new(error, code, url)
70
- end
71
-
72
- def self.extract_error_code error
73
- code = error.kind_of?(Hash) &&
74
- (error = error['SearchResponse']).kind_of?(Hash) &&
75
- (error = error['Errors'] ).kind_of?(Array) &&
76
- (error = error[0] ).kind_of?(Hash) &&
77
- (error = error['Code'] )
78
-
79
- code && code.to_i
80
- end
81
- end
82
-
83
- module RestCore::Bing::Client
84
- def query
85
- {'AppId' => self.AppId,
86
- 'JsonType' => 'raw' ,
87
- 'Version' => '2.2' }
88
- end
89
-
90
- def search_image term, query={}, opts={}
91
- get('', {:Query => term, :Sources => 'Image'}.merge(query), opts)[
92
- 'SearchResponse']['Image']['Results'] || []
93
- end
94
-
95
- def search_image_urls term, query={}, opts={}
96
- search_image(term, query, opts).map{ |i| i['MediaUrl'] }
97
- end
98
- end
99
-
100
- RestCore::Bing.send(:include, RestCore::Bing::Client)
101
- require 'rest-core/client/bing/rails_util' if
102
- Object.const_defined?(:Rails)
@@ -1,13 +0,0 @@
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)
@@ -1,60 +0,0 @@
1
-
2
- # http://developer.mixi.co.jp/connect/mixi_graph_api/
3
- RestCore::Mixi = RestCore::Builder.client(
4
- :data, :consumer_key, :consumer_secret, :redirect_uri) do
5
- s = RestCore
6
- use s::Timeout , 10
7
-
8
- use s::DefaultSite , 'http://api.mixi-platform.com/'
9
- use s::DefaultHeaders, {'Accept' => 'application/json'}
10
-
11
- use s::Oauth2Header , 'OAuth', nil
12
-
13
- use s::CommonLogger , nil
14
- use s::Cache , nil, 600 do
15
- use s::ErrorHandler , lambda{ |env| p env }
16
- use s::ErrorDetectorHttp
17
- use s::JsonDecode , true
18
- end
19
- end
20
-
21
- module RestCore::Mixi::Client
22
- include RestCore
23
-
24
- def me query={}, opts={}
25
- get('2/people/@me/@self', query, opts)
26
- end
27
-
28
- def access_token
29
- data['access_token'] if data.kind_of?(Hash)
30
- end
31
-
32
- def access_token= token
33
- data['access_token'] = token if data.kind_of?(Hash)
34
- end
35
-
36
- def authorize_url queries={}
37
- url('https://mixi.jp/connect_authorize.pl',
38
- {:client_id => consumer_key,
39
- :response_type => 'code',
40
- :scope => 'r_profile'}.merge(queries))
41
- end
42
-
43
- def authorize! payload={}, opts={}
44
- pl = {:client_id => consumer_key ,
45
- :client_secret => consumer_secret,
46
- :redirect_uri => redirect_uri ,
47
- :grant_type => 'authorization_code'}.merge(payload)
48
-
49
- self.data = post('https://secure.mixi-platform.com/2/token', pl, {}, opts)
50
- end
51
-
52
- private
53
- def default_data
54
- {}
55
- end
56
- end
57
-
58
- RestCore::Mixi.send(:include, RestCore::Mixi::Client)
59
- require 'rest-core/client/mixi/rails_util' if
60
- Object.const_defined?(:Rails)
@@ -1,13 +0,0 @@
1
-
2
- require 'rest-core/util/rails_util_util'
3
-
4
- module RestCore::Mixi::DefaultAttributes
5
- def default_log_method; Rails.logger.method(:debug); end
6
- def default_cache ; Rails.cache ; end
7
- end
8
-
9
- module RestCore::Mixi::RailsUtil
10
- include RestCore::RailsUtilUtil
11
- end
12
-
13
- RestCore::Mixi::RailsUtil.init(Rails)
@@ -1,34 +0,0 @@
1
-
2
- require 'rest-more/test'
3
-
4
- describe RC::Bing do
5
- after do
6
- WebMock.reset!
7
- RR.verify
8
- end
9
-
10
- def stub_with body, query={}
11
- stub_request(:get, 'http://api.bing.net/json.aspx').
12
- with(:query => {'JsonType' => 'raw', 'Version' => '2.2'}.merge(query)).
13
- to_return(:body => body)
14
- end
15
-
16
- should 'get right' do
17
- stub_with('{"status":"OK"}')
18
- RC::Bing.new.get('').should.eq({'status' => 'OK'})
19
- end
20
-
21
- should 'be able to set AppId' do
22
- RC::Bing.new(:AppId => 'QQ').AppId.should.eq 'QQ'
23
- end
24
-
25
- should 'use AppId for requests' do
26
- stub_with('{}', 'AppId' => 'zz')
27
- RC::Bing.new(:AppId => 'zz').get('').should.eq({})
28
- end
29
-
30
- should 'raise correct error' do
31
- stub_with('{"SearchResponse":{"Errors":[{"Code":2003}]}}')
32
- lambda{RC::Bing.new.get('')}.should.raise(RC::Bing::Error::NoAccess)
33
- end
34
- end
@@ -1,58 +0,0 @@
1
-
2
- require 'rest-more/test'
3
-
4
- describe RC::Facebook do
5
- after do
6
- WebMock.reset!
7
- RR.verify
8
- end
9
-
10
- describe 'cache' do
11
- before do
12
- @url, @body = "https://graph.facebook.com/cache", '{"message":"ok"}'
13
- @cache_key = Digest::MD5.hexdigest(@url)
14
- @cache = {}
15
- @rg = RC::Facebook.new(:cache => @cache, :json_decode => false)
16
- stub_request(:get, @url).to_return(:body => @body).times(1)
17
- end
18
-
19
- should 'enable cache if passing cache' do
20
- 3.times{ @rg.get('cache').should.eq @body }
21
- @cache.should.eq({@cache_key => @body})
22
- end
23
-
24
- should 'respect expires_in' do
25
- mock(@cache).method(:store){ mock!.arity{ -3 } }
26
- mock(@cache).store(@cache_key, @body, :expires_in => 3)
27
- @rg.get('cache', {}, :expires_in => 3).should.eq @body
28
- end
29
-
30
- should 'update cache if there is cache option set to false' do
31
- @rg.get('cache') .should.eq @body
32
- stub_request(:get, @url).to_return(:body => @body.reverse).times(2)
33
- @rg.get('cache') .should.eq @body
34
- @rg.get('cache', {}, :cache => false).should.eq @body.reverse
35
- @rg.get('cache') .should.eq @body.reverse
36
- @rg.cache = nil
37
- @rg.get('cache', {}, :cache => false).should.eq @body.reverse
38
- end
39
- end
40
-
41
- should 'not cache post/put/delete' do
42
- [:put, :post, :delete].each{ |meth|
43
- url, body = "https://graph.facebook.com/cache", '{"message":"ok"}'
44
- stub_request(meth, url).to_return(:body => body).times(3)
45
-
46
- cache = {}
47
- rg = RC::Facebook.new(:cache => cache)
48
- 3.times{
49
- if meth == :delete
50
- rg.send(meth, 'cache').should.eq({'message' => 'ok'})
51
- else
52
- rg.send(meth, 'cache', 'payload').should.eq({'message' => 'ok'})
53
- end
54
- }
55
- cache.should.eq({})
56
- }
57
- end
58
- end
@@ -1,20 +0,0 @@
1
-
2
- require 'rest-more/test'
3
-
4
- describe RC::Mixi do
5
- after do
6
- WebMock.reset!
7
- RR.verify
8
- end
9
-
10
- should 'get right' do
11
- stub_request(:get, 'http://api.mixi-platform.com/me').
12
- to_return(:body => '{"status": "OK"}')
13
-
14
- RC::Mixi.new.get('me').should.eq({'status' => 'OK'})
15
- end
16
-
17
- should 'be able to set access_token' do
18
- RC::Mixi.new(:access_token => 'QQ').access_token.should.eq 'QQ'
19
- end
20
- end