rest-more 2.0.4 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +6 -6
  2. data/.gitignore +1 -2
  3. data/.gitmodules +1 -1
  4. data/.travis.yml +5 -4
  5. data/CHANGES.md +1 -1
  6. data/Gemfile +16 -10
  7. data/README.md +209 -44
  8. data/Rakefile +11 -22
  9. data/doc/{tutorial/facebook.md → facebook.md} +1 -1
  10. data/example/multi.rb +3 -3
  11. data/example/rails3/Gemfile +18 -8
  12. data/example/rails3/app/controllers/application_controller.rb +2 -5
  13. data/example/rails3/config/application.rb +1 -1
  14. data/example/rails3/test/functional/application_controller_test.rb +0 -12
  15. data/example/rails3/test/test_helper.rb +12 -5
  16. data/example/rails3/test/unit/rails_util_test.rb +1 -6
  17. data/example/simple.rb +2 -2
  18. data/lib/rest-core/client/firebase.rb +50 -0
  19. data/lib/rest-core/client/instagram.rb +59 -0
  20. data/lib/rest-core/client/linkedin.rb +0 -4
  21. data/lib/rest-more.rb +8 -6
  22. data/lib/rest-more/test.rb +0 -11
  23. data/lib/rest-more/version.rb +1 -1
  24. data/rest-more.gemspec +20 -17
  25. data/task/README.md +54 -0
  26. data/task/gemgem.rb +151 -156
  27. data/test/dropbox/test_api.rb +1 -1
  28. data/test/facebook/test_api.rb +6 -7
  29. data/test/facebook/test_error.rb +1 -1
  30. data/test/facebook/test_handler.rb +2 -2
  31. data/test/facebook/test_load_config.rb +1 -1
  32. data/test/facebook/test_misc.rb +4 -14
  33. data/test/facebook/test_oauth.rb +1 -1
  34. data/test/facebook/test_old.rb +1 -1
  35. data/test/facebook/test_page.rb +4 -5
  36. data/test/facebook/test_parse.rb +0 -7
  37. data/test/facebook/test_serialize.rb +1 -1
  38. data/test/facebook/test_timeout.rb +4 -4
  39. data/test/instagram/test_api.rb +54 -0
  40. data/test/twitter/test_api.rb +1 -1
  41. metadata +26 -23
  42. data/example/rainbows.rb +0 -67
  43. data/task/.gitignore +0 -1
@@ -4,7 +4,7 @@ require 'rest-more/test'
4
4
  describe RC::Dropbox do
5
5
  after do
6
6
  WebMock.reset!
7
- RR.verify
7
+ Muack.verify
8
8
  end
9
9
 
10
10
  should 'get right' do
@@ -4,13 +4,12 @@ require 'rest-more/test'
4
4
  describe RC::Facebook do
5
5
  after do
6
6
  WebMock.reset!
7
- RR.verify
7
+ Muack.verify
8
8
  end
9
9
 
10
10
  should 'generate correct url' do
11
- TestHelper.normalize_url(
12
11
  RC::Facebook.new(:access_token => 'awesome').
13
- url('path', :query => 'str')).should.eq \
12
+ url('path', :query => 'str').should.eq \
14
13
  'https://graph.facebook.com/path?access_token=awesome&query=str'
15
14
  end
16
15
 
@@ -18,8 +17,8 @@ describe RC::Facebook do
18
17
  stub_request(:get, 'http://nothing.godfat.org/me').with(
19
18
  :headers => {'Accept' => 'text/plain',
20
19
  'Accept-Language' => 'zh-tw',
21
- 'Accept-Encoding' => 'gzip, deflate', # this is by ruby
22
- 'User-Agent' => 'Ruby' # this is by ruby
20
+ 'Accept-Encoding' => /^gzip, ?deflate$/, # this is by ruby
21
+ 'User-Agent' => 'Ruby' # this is by ruby
23
22
  }).to_return(:body => '{"data": []}')
24
23
 
25
24
  RC::Facebook.new(:site => 'http://nothing.godfat.org/',
@@ -32,8 +31,8 @@ describe RC::Facebook do
32
31
  stub_request(:get, 'http://example.com/').with(
33
32
  :headers => {'Accept' => 'application/json',
34
33
  'Accept-Language' => 'en-us',
35
- 'Accept-Encoding' => 'gzip, deflate', # this is by ruby
36
- 'User-Agent' => 'Ruby', # this is by ruby
34
+ 'Accept-Encoding' => /^gzip, ?deflate$/, # this is by ruby
35
+ 'User-Agent' => 'Ruby', # this is by ruby
37
36
  'X-Forwarded-For' => '127.0.0.1',
38
37
  }).to_return(:body => '{"data": []}')
39
38
 
@@ -4,7 +4,7 @@ require 'rest-more/test'
4
4
  describe RC::Facebook::Error do
5
5
  after do
6
6
  WebMock.reset!
7
- RR.verify
7
+ Muack.verify
8
8
  end
9
9
 
10
10
  should 'have the right ancestors' do
@@ -4,7 +4,7 @@ require 'rest-more/test'
4
4
  describe RC::Facebook do
5
5
  after do
6
6
  WebMock.reset!
7
- RR.verify
7
+ Muack.verify
8
8
  end
9
9
 
10
10
  describe 'log method' do
@@ -16,7 +16,7 @@ describe RC::Facebook do
16
16
  rg = RC::Facebook.new(:log_method => lambda{ |s| logger << [s] })
17
17
  rg.get('me').tap{}
18
18
 
19
- logger.size.should.eq 3 # Auto + Future + Requested
19
+ logger.size.should.eq 1
20
20
  end
21
21
  end
22
22
 
@@ -10,7 +10,7 @@ describe RC::Config do
10
10
  end
11
11
 
12
12
  after do
13
- RR.verify
13
+ Muack.verify
14
14
  end
15
15
 
16
16
  def check
@@ -4,7 +4,7 @@ require 'rest-more/test'
4
4
  describe RC::Facebook do
5
5
  after do
6
6
  WebMock.reset!
7
- RR.verify
7
+ Muack.verify
8
8
  end
9
9
 
10
10
  should 'return true in authorized? if there is an access_token' do
@@ -31,30 +31,20 @@ describe RC::Facebook do
31
31
  }
32
32
  end
33
33
 
34
- should 'build empty query string' do
35
- # TODO: WTF is this trying to test!?
36
- rg = RC::Facebook.new
37
- rg.dry.call(rg.send(:build_env)){ |res|
38
- (res[RC::REQUEST_QUERY] || {}).should.eq({})
39
- }
40
- end
41
-
42
34
  should 'create access_token in query string' do
43
35
  rg = RC::Facebook.new(:access_token => 'token')
44
36
  rg.dry.call(rg.send(:build_env)){ |res|
45
- # TODO: WTF is this `|| {}` !?
46
- (res[RC::REQUEST_QUERY] || {}).should.eq({'access_token' => 'token'})
37
+ res[RC::REQUEST_QUERY].should.eq({'access_token' => 'token'})
47
38
  }
48
39
  end
49
40
 
50
41
  should 'build correct query string' do
51
42
  rg = RC::Facebook.new(:access_token => 'token')
52
- TestHelper.normalize_url(rg.url('', :message => 'hi!!')).
43
+ rg.url('', :message => 'hi!!').
53
44
  should.eq "#{rg.site}?access_token=token&message=hi%21%21"
54
45
 
55
46
  rg.access_token = nil
56
- TestHelper.normalize_url(rg.url('', :message => 'hi!!',
57
- :subject => '(&oh&)')).
47
+ rg.url('', :message => 'hi!!', :subject => '(&oh&)').
58
48
  should.eq "#{rg.site}?message=hi%21%21&subject=%28%26oh%26%29"
59
49
  end
60
50
 
@@ -12,7 +12,7 @@ describe RC::Facebook do
12
12
  end
13
13
 
14
14
  should 'return correct oauth url' do
15
- TestHelper.normalize_url(@rg.authorize_url(:redirect_uri => @uri)).
15
+ @rg.authorize_url(:redirect_uri => @uri).
16
16
  should.eq 'https://www.facebook.com/dialog/oauth?' \
17
17
  'client_id=29&redirect_uri=http%3A%2F%2Fzzz.tw'
18
18
  end
@@ -4,7 +4,7 @@ require 'rest-more/test'
4
4
  describe RC::Facebook do
5
5
  after do
6
6
  WebMock.reset!
7
- RR.verify
7
+ Muack.verify
8
8
  end
9
9
 
10
10
  should 'do fql query with/without access_token' do
@@ -4,7 +4,7 @@ require 'rest-more/test'
4
4
  describe RC::Facebook do
5
5
  after do
6
6
  WebMock.reset!
7
- RR.verify
7
+ Muack.verify
8
8
  end
9
9
 
10
10
  should 'get the next/prev page' do
@@ -26,9 +26,9 @@ describe RC::Facebook do
26
26
  kind = "#{type}_page"
27
27
  data = {'paging' => {type => 'zzz'}, 'data' => ['z']}
28
28
 
29
- f.for_pages(data, -1, {}, kind).should == nil
30
- f.for_pages(data, 0, {}, kind).should == nil
31
- f.for_pages(data, 1, {}, kind).should == data
29
+ f.for_pages(data, -1, {}, kind).should.eq nil
30
+ f.for_pages(data, 0, {}, kind).should.eq nil
31
+ f.for_pages(data, 1, {}, kind).should.eq data
32
32
 
33
33
  (2..4).each{ |pages|
34
34
  # merge data
@@ -49,7 +49,6 @@ describe RC::Facebook do
49
49
  end
50
50
 
51
51
  should 'for_pages with callback' do
52
- t = Thread.current
53
52
  f = RC::Facebook.new(:site => '', :cache => false)
54
53
  %w[next previous].each{ |type|
55
54
  kind = "#{type}_page"
@@ -134,13 +134,6 @@ describe RC::Facebook do
134
134
  end
135
135
  end
136
136
 
137
- should 'fallback to ruby-hmac if Digest.new raise an runtime error' do
138
- key, data = 'top', 'secret'
139
- digest = OpenSSL::HMAC.digest('sha256', key, data)
140
- mock(OpenSSL::HMAC).digest('sha256', key, data){ raise 'boom' }
141
- RC::Hmac.sha256(key, data).should.eq digest
142
- end
143
-
144
137
  should 'generate correct fbs with correct sig' do
145
138
  RC::Facebook.new(:access_token => 'fake', :secret => 's').fbs.
146
139
  should.eq \
@@ -4,7 +4,7 @@ require 'rest-more/test'
4
4
  describe RC::Facebook do
5
5
  after do
6
6
  WebMock.reset!
7
- RR.verify
7
+ Muack.verify
8
8
  end
9
9
 
10
10
  should 'be serialized with lighten' do
@@ -4,14 +4,14 @@ require 'rest-more/test'
4
4
  describe RC::Facebook do
5
5
  after do
6
6
  WebMock.reset!
7
- RR.verify
7
+ Muack.verify
8
8
  end
9
9
 
10
10
  should 'respect timeout' do
11
11
  stub_request(:get, 'https://graph.facebook.com/me').
12
12
  to_return(:body => '{}')
13
- any_instance_of(RC::Timeout::TimerThread){ |timer|
14
- mock.proxy(timer).on_timeout
13
+ any_instance_of(RC::Timeout::Timer){ |timer|
14
+ mock(timer).on_timeout
15
15
  }
16
16
  RC::Facebook.new.get('me').should.eq({})
17
17
  end
@@ -19,7 +19,7 @@ describe RC::Facebook do
19
19
  should 'override timeout' do
20
20
  stub_request(:get, 'https://graph.facebook.com/me').
21
21
  to_return(:body => 'true')
22
- mock.proxy(RC::Timeout::TimerThread).new(99, is_a(Timeout::Error))
22
+ mock(RC::Timeout::Timer).new(99, is_a(Timeout::Error))
23
23
  RC::Facebook.new(:timeout => 1).get('me', {}, :timeout => 99).
24
24
  should.eq true
25
25
  end
@@ -0,0 +1,54 @@
1
+
2
+ require 'rest-more/test'
3
+
4
+ describe RC::Instagram do
5
+ after do
6
+ WebMock.reset!
7
+ end
8
+
9
+ json = <<-JSON
10
+ {"meta":{"code":200},
11
+ "data":[{"username":"restmore",
12
+ "profile_picture":"http://images.ak.instagram.com/profile.jpg",
13
+ "full_name":"Rest More", "id":"123"}],
14
+ "access_token":"A"}
15
+ JSON
16
+
17
+ client = RC::Instagram.new(:client_id => 'Z', :client_secret => 'S',
18
+ :access_token => 'X')
19
+
20
+ should 'have correct authorize url' do
21
+ client.authorize_url.should.eq \
22
+ 'https://api.instagram.com/oauth/authorize?' \
23
+ 'client_id=Z&response_type=code'
24
+ end
25
+
26
+ should 'authorize! and get the access token' do
27
+ stub_request(:post, 'https://api.instagram.com/oauth/access_token').
28
+ with(:body => {'client_id' => 'Z', 'client_secret' => 'S',
29
+ 'grant_type' => 'authorization_code', 'code' => 'C'}).
30
+ to_return(:body => json)
31
+
32
+ begin
33
+ client.authorize!(:code => 'C').should.kind_of?(Hash)
34
+ client.access_token. should.eq 'A'
35
+ ensure
36
+ client.data = nil
37
+ end
38
+ end
39
+
40
+ should 'retrieve user profile based on username' do
41
+ stub_request(:get, 'https://api.instagram.com/v1/users/search?' \
42
+ 'client_id=Z&q=restmore').
43
+ to_return(:body => json)
44
+
45
+ client.get('v1/users/search', :q => 'restmore').should.eq(
46
+ {'meta' => {'code' => 200},
47
+ 'data' => [{'username' => 'restmore',
48
+ 'profile_picture' =>
49
+ 'http://images.ak.instagram.com/profile.jpg',
50
+ 'full_name' => 'Rest More',
51
+ 'id' => '123'}],
52
+ 'access_token' => 'A'})
53
+ end
54
+ end
@@ -4,7 +4,7 @@ require 'rest-more/test'
4
4
  describe RC::Twitter do
5
5
  after do
6
6
  WebMock.reset!
7
- RR.verify
7
+ Muack.verify
8
8
  end
9
9
 
10
10
  should 'get right' do
metadata CHANGED
@@ -1,44 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rest-more
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.4
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
- - Cardinal Blue
8
7
  - Lin Jen-Shin (godfat)
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-04-13 00:00:00.000000000 Z
11
+ date: 2014-05-04 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rest-core
16
15
  requirement: !ruby/object:Gem::Requirement
17
16
  requirements:
18
- - - ! '>='
17
+ - - ">="
19
18
  - !ruby/object:Gem::Version
20
- version: 2.0.3
19
+ version: 3.0.0
21
20
  type: :runtime
22
21
  prerelease: false
23
22
  version_requirements: !ruby/object:Gem::Requirement
24
23
  requirements:
25
- - - ! '>='
24
+ - - ">="
26
25
  - !ruby/object:Gem::Version
27
- version: 2.0.3
28
- description: ! 'Various REST clients such as Facebook and Twitter built with [rest-core][]
26
+ version: 3.0.0
27
+ description: |-
28
+ Various REST clients such as Facebook and Twitter built with [rest-core][].
29
29
 
30
-
31
- [rest-core]: https://github.com/cardinalblue/rest-core'
30
+ [rest-core]: https://github.com/godfat/rest-core
32
31
  email:
33
- - dev (XD) cardinalblue.com
32
+ - godfat (XD) godfat.org
34
33
  executables:
35
34
  - rib-rest-core
36
35
  extensions: []
37
36
  extra_rdoc_files: []
38
37
  files:
39
- - .gitignore
40
- - .gitmodules
41
- - .travis.yml
38
+ - ".gitignore"
39
+ - ".gitmodules"
40
+ - ".travis.yml"
42
41
  - CHANGES.md
43
42
  - Gemfile
44
43
  - LICENSE
@@ -46,7 +45,7 @@ files:
46
45
  - Rakefile
47
46
  - TODO.md
48
47
  - bin/rib-rest-core
49
- - doc/tutorial/facebook.md
48
+ - doc/facebook.md
50
49
  - example/multi.rb
51
50
  - example/rails3/Gemfile
52
51
  - example/rails3/README
@@ -67,14 +66,15 @@ files:
67
66
  - example/rails3/test/functional/application_controller_test.rb
68
67
  - example/rails3/test/test_helper.rb
69
68
  - example/rails3/test/unit/rails_util_test.rb
70
- - example/rainbows.rb
71
69
  - example/simple.rb
72
70
  - example/sinatra/config.ru
73
71
  - lib/rest-core/client/dropbox.rb
74
72
  - lib/rest-core/client/facebook.rb
75
73
  - lib/rest-core/client/facebook/rails_util.rb
74
+ - lib/rest-core/client/firebase.rb
76
75
  - lib/rest-core/client/github.rb
77
76
  - lib/rest-core/client/github/rails_util.rb
77
+ - lib/rest-core/client/instagram.rb
78
78
  - lib/rest-core/client/linkedin.rb
79
79
  - lib/rest-core/client/linkedin/rails_util.rb
80
80
  - lib/rest-core/client/twitter.rb
@@ -86,7 +86,7 @@ files:
86
86
  - lib/rest-more/version.rb
87
87
  - lib/rib/app/rest-core.rb
88
88
  - rest-more.gemspec
89
- - task/.gitignore
89
+ - task/README.md
90
90
  - task/gemgem.rb
91
91
  - test/dropbox/test_api.rb
92
92
  - test/facebook/config/rest-core.yaml
@@ -102,9 +102,11 @@ files:
102
102
  - test/facebook/test_parse.rb
103
103
  - test/facebook/test_serialize.rb
104
104
  - test/facebook/test_timeout.rb
105
+ - test/instagram/test_api.rb
105
106
  - test/twitter/test_api.rb
106
- homepage: https://github.com/cardinalblue/rest-more
107
- licenses: []
107
+ homepage: https://github.com/godfat/rest-more
108
+ licenses:
109
+ - Apache License 2.0
108
110
  metadata: {}
109
111
  post_install_message:
110
112
  rdoc_options: []
@@ -112,20 +114,20 @@ require_paths:
112
114
  - lib
113
115
  required_ruby_version: !ruby/object:Gem::Requirement
114
116
  requirements:
115
- - - ! '>='
117
+ - - ">="
116
118
  - !ruby/object:Gem::Version
117
119
  version: '0'
118
120
  required_rubygems_version: !ruby/object:Gem::Requirement
119
121
  requirements:
120
- - - ! '>='
122
+ - - ">="
121
123
  - !ruby/object:Gem::Version
122
124
  version: '0'
123
125
  requirements: []
124
126
  rubyforge_project:
125
- rubygems_version: 2.0.0
127
+ rubygems_version: 2.2.2
126
128
  signing_key:
127
129
  specification_version: 4
128
- summary: Various REST clients such as Facebook and Twitter built with [rest-core][]
130
+ summary: Various REST clients such as Facebook and Twitter built with [rest-core][].
129
131
  test_files:
130
132
  - test/dropbox/test_api.rb
131
133
  - test/facebook/test_api.rb
@@ -140,4 +142,5 @@ test_files:
140
142
  - test/facebook/test_parse.rb
141
143
  - test/facebook/test_serialize.rb
142
144
  - test/facebook/test_timeout.rb
145
+ - test/instagram/test_api.rb
143
146
  - test/twitter/test_api.rb
data/example/rainbows.rb DELETED
@@ -1,67 +0,0 @@
1
-
2
- worker_processes 4 # assuming four CPU cores
3
- preload_app true
4
-
5
- Rainbows! do
6
- use :EventMachine, :em_client_class => lambda{
7
- RainbowsEventMachineThreadPoolClient
8
- # or
9
- # RainbowsEventMachineFiberSpawnClient
10
- }
11
- worker_connections 100
12
-
13
- client_max_body_size 20*1024*1024 # 20 megabytes
14
- client_header_buffer_size 8*1024 # 8 kilobytes
15
- end
16
-
17
- after_fork{ |_, _|
18
- EM.threadpool_size = 32
19
- class RainbowsEventMachineThreadPoolClient < Rainbows::EventMachine::Client
20
- def app_call input
21
- set_comm_inactivity_timeout 0
22
- @env[RACK_INPUT] = input
23
- @env[REMOTE_ADDR] = @_io.kgio_addr
24
- @env[ASYNC_CALLBACK] = method(:write_async_response)
25
- @env[ASYNC_CLOSE] = EM::DefaultDeferrable.new
26
- @deferred = true
27
- EM.defer{
28
- status, headers, body = catch(:async) {
29
- APP.call(@env.merge!(RACK_DEFAULTS))
30
- }
31
- if nil == status || -1 == status
32
- @deferred = true
33
- else
34
- @deferred = nil
35
- ev_write_response(status, headers, body, @hp.next?)
36
- end
37
- }
38
- end
39
- end
40
-
41
- class RainbowsEventMachineFiberSpawnClient < Rainbows::EventMachine::Client
42
- def app_call input
43
- set_comm_inactivity_timeout 0
44
- @env[RACK_INPUT] = input
45
- @env[REMOTE_ADDR] = @_io.kgio_addr
46
- @env[ASYNC_CALLBACK] = method(:write_async_response)
47
- @env[ASYNC_CLOSE] = EM::DefaultDeferrable.new
48
- f = Fiber.new{
49
- status, headers, body = catch(:async) {
50
- APP.call(@env.merge!(RACK_DEFAULTS))
51
- }
52
- if nil == status || -1 == status
53
- @deferred = true
54
- else
55
- @deferred = nil
56
- ev_write_response(status, headers, body, @hp.next?)
57
- end
58
- }
59
- f.resume
60
- @deferred = true if f.alive?
61
- end
62
- end
63
- }
64
-
65
- EM.error_handler{ |e|
66
- puts "Error: EM.error_handler: #{e.inspect} #{e.backtrace.inspect}"
67
- }