tida_sina_weibo 0.0.1 → 0.0.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.
data/Gemfile CHANGED
@@ -2,6 +2,3 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in tida_sina_weibo.gemspec
4
4
  gemspec
5
-
6
- gem 'settingslogic'
7
- gem 'rest-client'
@@ -1,71 +1,96 @@
1
1
  require "rest-client"
2
- require "api_settings"
3
2
 
4
3
  module TidaSinaWeibo
4
+
5
+ API = {}
6
+ API[:status] = {}
7
+ API[:status][:update] = 'https://api.weibo.com/2/statuses/update.json'
8
+ API[:status][:upload] = 'https://upload.api.weibo.com/2/statuses/upload.json'
9
+ API[:status][:user_timeline] = 'https://api.weibo.com/2/statuses/user_timeline.json'
10
+ API[:status][:user_timeline_ids] = 'https://api.weibo.com/2/statuses/user_timeline/ids.json'
11
+ API[:status][:show] = 'https://api.weibo.com/2/statuses/show.json'
12
+ API[:status][:repost_timeline] = 'https://api.weibo.com/2/statuses/repost_timeline.json'
13
+ API[:status][:repost_timeline_ids] = 'https://api.weibo.com/2/statuses/repost_timeline/ids.json'
14
+ API[:status][:queryid] = 'https://api.weibo.com/2/statuses/queryid.json'
15
+ API[:status][:querymid] = 'https://api.weibo.com/2/statuses/querymid.json'
16
+ API[:comments] = {}
17
+ API[:comments][:show] = 'https://api.weibo.com/2/comments/show.json'
18
+ API[:user] = {}
19
+ API[:user][:show] = 'https://api.weibo.com/2/users/show.json'
20
+ API[:user][:domain_show] = 'https://api.weibo.com/2/users/domain_show.json'
21
+ API[:tags] = 'https://api.weibo.com/2/tags.json'
22
+ API[:friendships] = {}
23
+ API[:friendships][:followers] = 'https://api.weibo.com/2/friendships/followers.json'
24
+ API[:friendships][:followers_ids] = 'https://api.weibo.com/2/friendships/followers/ids.json'
25
+ API[:friendships][:show] = 'https://api.weibo.com/2/friendships/show.json'
26
+
5
27
  class ApiWrapper
28
+
6
29
  attr_reader :access_token
7
- attr_reader :token_provider
8
30
  attr_reader :request_data
31
+ attr_reader :token_provider
32
+ attr_reader :rest_client
9
33
 
10
- def initialize(token_prvdr)
11
- @token_provider = token_prvdr
12
- @access_token = @token_provider.token
34
+ def initialize(rest_client, tp)
35
+ @rest_client = rest_client
36
+ @token_provider = tp
37
+ @access_token = tp.token
13
38
  end
14
39
 
15
40
  def status_update(content)
16
- post_request(Settings.weibo.api.status.update, :status => content)
41
+ post_request(API[:status][:update], :status => content)
17
42
  end
18
43
 
19
44
  def status_upload(content, image_path)
20
- post_request(Settings.weibo.api.status.upload, :status => content, :pic => File.new(image_path, 'rb'))
45
+ post_request(API[:status][:upload], :status => content, :pic => File.new(image_path, 'rb'))
21
46
  end
22
47
 
23
48
  def status_user_timeline(uid, page = 1, count = 100)
24
- get_request(Settings.weibo.api.status.user_timeline, :params => {:uid => uid, :page => page, :count => count})
49
+ get_request(API[:status][:user_timeline], :params => {:uid => uid, :page => page, :count => count})
25
50
  end
26
51
 
27
52
  def status_repost_timeline(post_id, page = 1)
28
- get_request(Settings.weibo.api.status.repost_timeline, :params => {:id => post_id, :page => page, :count => 50})
53
+ get_request(API[:status][:repost_timeline], :params => {:id => post_id, :page => page, :count => 50})
29
54
  end
30
55
 
31
56
  def comments_show(post_id, page = 1)
32
- get_request(Settings.weibo.api.comments.show, :params => {:id => post_id, :page => page, :count => 50})
57
+ get_request(API[:comments][:show], :params => {:id => post_id, :page => page, :count => 50})
33
58
  end
34
59
 
35
60
  def status_show(wb_post_id)
36
- get_request(Settings.weibo.api.status.show, :params => {:id => wb_post_id})
61
+ get_request(API[:status][:show], :params => {:id => wb_post_id})
37
62
  end
38
63
 
39
64
  def user_show(uid, is_number_id = true)
40
65
  if is_number_id
41
- get_request(Settings.weibo.api.user.show, {:params => {:uid => uid}})
66
+ get_request(API[:user][:show], {:params => {:uid => uid}})
42
67
  else
43
- get_request(Settings.weibo.api.user.show, {:params => {:screen_name => uid}})
68
+ get_request(API[:user][:show], {:params => {:screen_name => uid}})
44
69
  end
45
70
  end
46
71
 
47
72
  def user_domain_show(domain)
48
- get_request(Settings.weibo.api.user.domain_show, :params => {:domain => domain})
73
+ get_request(API[:user][:domain_show], :params => {:domain => domain})
49
74
  end
50
75
 
51
76
  def friendships_followers(uid, cursor)
52
- get_request(Settings.weibo.api.friendships.followers, :params => {:uid => uid, :cursor => cursor})
77
+ get_request(API[:friendships][:followers], :params => {:uid => uid, :cursor => cursor})
53
78
  end
54
79
 
55
80
  def friendships_followers_ids(uid, cursor)
56
- get_request(Settings.weibo.api.friendships.followers_ids, :params => {:uid => uid, :cursor => cursor})
81
+ get_request(API[:friendships][:followers_ids], :params => {:uid => uid, :cursor => cursor})
57
82
  end
58
83
 
59
84
  def tags(uid)
60
- get_request(Settings.weibo.api.tags, :params => {:uid => uid})
85
+ get_request(API[:tags], :params => {:uid => uid})
61
86
  end
62
87
 
63
88
  def queryid(mid)
64
- data = get_request(Settings.weibo.api.status.queryid, {:params => {:mid => mid, :type => 1, :isBase62 => 1}})
89
+ get_request(API[:status][:queryid], {:params => {:mid => mid, :type => 1, :isBase62 => 1}})
65
90
  end
66
91
 
67
92
  def querymid(id, batch = false)
68
- data = get_request(Settings.weibo.api.status.querymid, {:params => {:id => id, :type => 1, :is_batch => batch ? 1 : 0}})
93
+ get_request(API[:status][:querymid], {:params => {:id => id, :type => 1, :is_batch => batch ? 1 : 0}})
69
94
  end
70
95
 
71
96
  def querymids(ids)
@@ -80,8 +105,7 @@ module TidaSinaWeibo
80
105
  end
81
106
 
82
107
  def get_request(url, data)
83
- r = rest_request(url, data, false)
84
- return r
108
+ rest_request(url, data, false)
85
109
  end
86
110
 
87
111
  def rest_request(url, data, method_post)
@@ -99,23 +123,16 @@ module TidaSinaWeibo
99
123
  rd = data.clone
100
124
  params = {:access_token => @access_token}
101
125
  rd[:params] = data[:params].merge(params)
102
- Rails.logger.debug "Request params hash is #{rd}"
103
-
104
- parse_response do
105
- if method_post
106
- r = JSON.parse RestClient.post(url, rd)
107
- Rails.logger.debug "- Request response: #{r}"
108
- return r, 0
109
- else
110
- r = JSON.parse RestClient.get(url, rd)
111
- Rails.logger.debug "- Request response: #{r}"
112
- return r, 0
113
- end
126
+
127
+ if method_post
128
+ r = rest_client.post(url, rd)
129
+ return r, 0
130
+ else
131
+ r = rest_client.get(url, rd)
132
+ return r, 0
114
133
  end
115
- rescue RestClient::Exception => e
116
- Rails.logger.error "! Request Failed #{e.to_s}"
117
- r = JSON.parse e.http_body
118
- Rails.logger.error "! Sina Weibo API Error Code: #{r["error_code"]} Error: #{r["error"]}"
134
+ rescue RestClientException => e
135
+ r = e.body
119
136
  api_error_code = r["error_code"].to_i
120
137
 
121
138
  if invalid_access_token? api_error_code
@@ -127,15 +144,12 @@ module TidaSinaWeibo
127
144
  end
128
145
 
129
146
  if reached_ip_access_limit? api_error_code
130
- raise IPAccessLimitException.new
147
+ e = IPAccessLimitException.new self.access_token
148
+ raise e
131
149
  end
132
150
 
133
151
  return nil, -2
134
152
  end
135
-
136
- def parse_response(&block)
137
- JSON.parse(block.call)
138
- end
139
153
 
140
154
  def invalid_access_token?(error_code)
141
155
  return error_code == 21332 || error_code == 21327
@@ -150,13 +164,11 @@ module TidaSinaWeibo
150
164
  end
151
165
 
152
166
  def change_access_token
153
- Rails.logger.info "* Changing access token}"
154
- Rails.logger.info "- Old access token is #{@access_token}"
155
167
  self.token_provider.change
156
168
  @access_token = self.token_provider.token
157
- Rails.logger.info "- New access token is #{@access_token}"
158
169
  if @access_token.nil?
159
- raise NoAccessTokenAvaiableException.new
170
+ e = NoAccessTokenAvaiableException.new
171
+ raise e
160
172
  end
161
173
  end
162
174
  end
@@ -0,0 +1,41 @@
1
+ require 'rest-client'
2
+
3
+ module TidaSinaWeibo
4
+
5
+ class Exception < RuntimeError
6
+ attr_accessor :message
7
+
8
+ def initialize message = nil
9
+ @message = message
10
+ end
11
+
12
+ def inspect
13
+ self.message
14
+ end
15
+
16
+ def to_s
17
+ inspect
18
+ end
19
+ end
20
+
21
+ class NoAccessTokenAvaiableException < Exception
22
+ def initialize
23
+ super "There is not any valid access token"
24
+ end
25
+ end
26
+
27
+ class IPAccessLimitException < Exception
28
+ def initialize(token)
29
+ super "The access token #{token} reached IP access limit"
30
+ end
31
+ end
32
+
33
+ class RestClientException < RestClient::Exception
34
+ attr_reader :body
35
+
36
+ def initialize(rest_client_exception)
37
+ @body = ::JSON.parse rest_client_exception.http_body if rest_client_exception
38
+ end
39
+ end
40
+
41
+ end
@@ -0,0 +1,21 @@
1
+ require 'rest-client'
2
+
3
+ module TidaSinaWeibo
4
+
5
+ class RestClientWrapper
6
+ def get(url, data)
7
+ JSON.parse RestClient.get(url, data)
8
+ rescue RestClient::Exception => e
9
+ ex = RestClientException.new e
10
+ raise ex
11
+ end
12
+
13
+ def post(url, data)
14
+ JSON.parse RestClient.post(url, data)
15
+ rescue RestClient::Exception => e
16
+ ex = RestClientException.new e
17
+ raise ex
18
+ end
19
+ end
20
+
21
+ end
@@ -1,3 +1,3 @@
1
1
  module TidaSinaWeibo
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -1,3 +1,14 @@
1
+
1
2
  require "tida_sina_weibo/version"
3
+ require 'tida_sina_weibo/exceptions'
2
4
  require 'tida_sina_weibo/api_wrapper'
5
+ require 'tida_sina_weibo/rest_client_wrapper'
6
+
7
+ module TidaSinaWeibo
8
+
9
+ def api_wrapper(tp)
10
+ ApiWrapper.new RestClientWrapper.new, tp
11
+ end
12
+
13
+ end
3
14
 
@@ -0,0 +1,61 @@
1
+ require 'tida_sina_weibo'
2
+
3
+ describe TidaSinaWeibo::ApiWrapper do
4
+ it 'get setting property' do
5
+ TidaSinaWeibo::API[:status][:update].should eql('https://api.weibo.com/2/statuses/update.json')
6
+ end
7
+
8
+ it 'get request success' do
9
+ request_wrapper = double('request_wrapper')
10
+ request_wrapper.stub(:get) {{'result' => 'ok'}}
11
+
12
+ token_provider = double('token_provider')
13
+ token_provider.stub(:token) { 'token'}
14
+
15
+ target = TidaSinaWeibo::ApiWrapper.new request_wrapper, token_provider
16
+ result = target.status_show '1'
17
+ result.should eql({'result' =>'ok'})
18
+ end
19
+
20
+ it 'get request raise invalid_access_token exception' do
21
+ rest_client_exception = TidaSinaWeibo::RestClientException.new nil
22
+
23
+ request_wrapper = double('request_wrapper')
24
+ request_wrapper.should_receive(:get).and_raise(rest_client_exception)
25
+
26
+ rest_client_exception.stub(:body) { {'error_code' => '21332'} }
27
+
28
+ token_provider = double('token_provider')
29
+ token_provider.stub(:token) { 'token' }
30
+ token_provider.stub(:change)
31
+ token_provider.stub(:token) { nil }
32
+
33
+ target = TidaSinaWeibo::ApiWrapper.new request_wrapper, token_provider
34
+ begin
35
+ result = target.status_show '1'
36
+ raise 'Expect exception raise'
37
+ rescue TidaSinaWeibo::NoAccessTokenAvaiableException
38
+ end
39
+ end
40
+
41
+ it 'get request raise reached_account_access_limit exception' do
42
+ rest_client_exception = TidaSinaWeibo::RestClientException.new nil
43
+
44
+ request_wrapper = double('request_wrapper')
45
+ request_wrapper.should_receive(:get).and_raise(rest_client_exception)
46
+
47
+ rest_client_exception.stub(:body) { {'error_code' => '10023'} }
48
+
49
+ token_provider = double('token_provider')
50
+ token_provider.stub(:token) { 'token' }
51
+ token_provider.stub(:change)
52
+ token_provider.stub(:token) { nil }
53
+
54
+ target = TidaSinaWeibo::ApiWrapper.new request_wrapper, token_provider
55
+ begin
56
+ result = target.status_show '1'
57
+ raise 'Expect exception raise'
58
+ rescue TidaSinaWeibo::NoAccessTokenAvaiableException
59
+ end
60
+ end
61
+ end
@@ -16,4 +16,9 @@ Gem::Specification.new do |gem|
16
16
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
17
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
18
  gem.require_paths = ["lib"]
19
+
20
+ gem.add_development_dependency "rspec", "~> 2.6"
21
+
22
+ gem.add_dependency "settingslogic"
23
+ gem.add_dependency "rest-client"
19
24
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tida_sina_weibo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,55 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
  date: 2013-01-08 00:00:00.000000000 Z
13
- dependencies: []
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '2.6'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '2.6'
30
+ - !ruby/object:Gem::Dependency
31
+ name: settingslogic
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rest-client
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
14
62
  description: SinaWeibo API gem
15
63
  email:
16
64
  - babaru.trinit@gmail.com
@@ -24,10 +72,11 @@ files:
24
72
  - README.md
25
73
  - Rakefile
26
74
  - lib/tida_sina_weibo.rb
27
- - lib/tida_sina_weibo/api_settings.rb
28
- - lib/tida_sina_weibo/api_settings.yml
29
75
  - lib/tida_sina_weibo/api_wrapper.rb
76
+ - lib/tida_sina_weibo/exceptions.rb
77
+ - lib/tida_sina_weibo/rest_client_wrapper.rb
30
78
  - lib/tida_sina_weibo/version.rb
79
+ - spec/api_wrapper_spec.rb
31
80
  - tida_sina_weibo.gemspec
32
81
  homepage: ''
33
82
  licenses: []
@@ -53,4 +102,5 @@ rubygems_version: 1.8.24
53
102
  signing_key:
54
103
  specification_version: 3
55
104
  summary: SinaWeibo API gem
56
- test_files: []
105
+ test_files:
106
+ - spec/api_wrapper_spec.rb
@@ -1,8 +0,0 @@
1
- module TidaSinaWeibo
2
-
3
- class ApiSettings < Settingslogic
4
- source "#{Rails.root}/config/application.yml"
5
- namespace Rails.env
6
- end
7
-
8
- end
@@ -1,32 +0,0 @@
1
- defaults: &defaults
2
- api:
3
- status:
4
- update: 'https://api.weibo.com/2/statuses/update.json'
5
- upload: 'https://upload.api.weibo.com/2/statuses/upload.json'
6
- user_timeline: 'https://api.weibo.com/2/statuses/user_timeline.json'
7
- user_timeline_ids: 'https://api.weibo.com/2/statuses/user_timeline/ids.json'
8
- show: 'https://api.weibo.com/2/statuses/show.json'
9
- repost_timeline: 'https://api.weibo.com/2/statuses/repost_timeline.json'
10
- repost_timeline_ids: 'https://api.weibo.com/2/statuses/repost_timeline/ids.json'
11
- queryid: 'https://api.weibo.com/2/statuses/queryid.json'
12
- querymid: 'https://api.weibo.com/2/statuses/querymid.json'
13
- comments:
14
- show: 'https://api.weibo.com/2/comments/show.json'
15
- user:
16
- show: 'https://api.weibo.com/2/users/show.json'
17
- domain_show: 'https://api.weibo.com/2/users/domain_show.json'
18
- tags: 'https://api.weibo.com/2/tags.json'
19
- friendships:
20
- followers: 'https://api.weibo.com/2/friendships/followers.json'
21
- followers_ids: 'https://api.weibo.com/2/friendships/followers/ids.json'
22
- show: 'https://api.weibo.com/2/friendships/show.json'
23
-
24
-
25
- development:
26
- <<: *defaults
27
-
28
- test:
29
- <<: *defaults
30
-
31
- production:
32
- <<: *defaults