starcraft2 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -18,7 +18,7 @@ module Starcraft2
18
18
  if (args = [:character_name, :id, :realm] - options.keys).empty?
19
19
  Profile.build(self, profile_data(options))
20
20
  else
21
- raise MissingArgumentsError, "Missing Keys: #{args.map {|i| ":#{i}"}.join(', ')}"
21
+ raise MissingArgumentsError, "Missing Keys: #{args.map { |i| ":#{i}" }.join(', ')}"
22
22
  end
23
23
  end
24
24
 
@@ -42,6 +42,10 @@ module Starcraft2
42
42
  ladder('grandmaster/last')
43
43
  end
44
44
 
45
+ def flush_cache
46
+ @memoizations = {}
47
+ end
48
+
45
49
  private
46
50
 
47
51
  def matches(options = {})
@@ -53,8 +57,10 @@ module Starcraft2
53
57
  end
54
58
 
55
59
  def profile_data(options)
56
- get_json do
57
- HTTParty.get(profile_url(options))
60
+ memoize(:profile_data, options) do
61
+ Utils.get_json do
62
+ HTTParty.get(profile_url(options))
63
+ end
58
64
  end
59
65
  end
60
66
 
@@ -67,14 +73,18 @@ module Starcraft2
67
73
  end
68
74
 
69
75
  def match_data(options)
70
- get_json do
71
- HTTParty.get(match_url(options))
76
+ memoize(:match_data, options) do
77
+ Utils.get_json do
78
+ HTTParty.get(match_url(options))
79
+ end
72
80
  end
73
81
  end
74
82
 
75
83
  def ladders_data(options)
76
- get_json do
77
- HTTParty.get(ladders_url(options))
84
+ memoize(:ladders_data, options) do
85
+ Utils.get_json do
86
+ HTTParty.get(ladders_url(options))
87
+ end
78
88
  end
79
89
  end
80
90
 
@@ -87,8 +97,10 @@ module Starcraft2
87
97
  end
88
98
 
89
99
  def achievements_data
90
- get_json do
91
- HTTParty.get(achievements_url)
100
+ memoize(:achievements_data) do
101
+ Utils.get_json do
102
+ HTTParty.get(achievements_url)
103
+ end
92
104
  end
93
105
  end
94
106
 
@@ -97,8 +109,10 @@ module Starcraft2
97
109
  end
98
110
 
99
111
  def rewards_data
100
- get_json do
101
- HTTParty.get(rewards_url)
112
+ memoize(:rewards_data) do
113
+ Utils.get_json do
114
+ HTTParty.get(rewards_url)
115
+ end
102
116
  end
103
117
  end
104
118
 
@@ -107,8 +121,10 @@ module Starcraft2
107
121
  end
108
122
 
109
123
  def ladder_data(id)
110
- get_json do
111
- HTTParty.get(ladder_url(id))
124
+ memoize(:ladder_data, id) do
125
+ Utils.get_json do
126
+ HTTParty.get(ladder_url(id))
127
+ end
112
128
  end
113
129
  end
114
130
 
@@ -120,26 +136,14 @@ module Starcraft2
120
136
  locale.nil? ? '' : "?locale=#{locale}"
121
137
  end
122
138
 
123
- def get_json
124
- response = yield
125
- case response.code
126
- when 200
127
- body = JSON.parse(response.body)
128
- case body['code']
129
- when 200
130
- body
131
- when 404
132
- raise Starcraft2::NotFoundError, body['message'] || body['reason']
133
- when 500
134
- raise Starcraft2::ApiError, body['message'] || body['reason']
135
- else
136
- body
137
- end
138
- when 404
139
- raise Starcraft2::NotFoundError, 'Record not found.'
140
- when 500
141
- raise Starcraft2::ApiError, 'An API error occurred.'
139
+ def memoize(name, *args)
140
+ @memoizations ||= {}
141
+ @memoizations[name] ||= {}
142
+ if @memoizations[name].has_key?(args)
143
+ @memoizations[name][args]
144
+ else
145
+ @memoizations[name][args] = yield
142
146
  end
143
147
  end
144
148
  end
145
- end
149
+ end
@@ -1,31 +1,14 @@
1
- require 'ostruct'
2
1
  require 'httparty'
3
2
  require 'json'
4
3
 
5
- require File.join('starcraft2', 'errors', 'missing_arguments_error')
6
- require File.join('starcraft2', 'errors', 'api_error')
7
- require File.join('starcraft2', 'errors', 'not_found_error')
8
- require File.join('starcraft2', 'utils')
9
- require File.join('starcraft2', 'icon')
10
- require File.join('starcraft2', 'client')
11
- require File.join('starcraft2', 'achievement')
12
- require File.join('starcraft2', 'reward')
13
- require File.join('starcraft2', 'ladder')
14
- require File.join('starcraft2', 'member')
15
- require File.join('starcraft2', 'character')
16
- require File.join('starcraft2', 'profile', 'match')
17
- require File.join('starcraft2', 'profile', 'swarm_race')
18
- require File.join('starcraft2', 'profile', 'swarm_levels')
19
- require File.join('starcraft2', 'profile', 'career')
20
- require File.join('starcraft2', 'profile', 'campaign')
21
- require File.join('starcraft2', 'profile', 'season')
22
- require File.join('starcraft2', 'profile', 'stats')
23
- require File.join('starcraft2', 'profile', 'rewards')
24
- require File.join('starcraft2', 'profile', 'achievements')
25
- require File.join('starcraft2', 'profile', 'points')
26
- require File.join('starcraft2', 'profile', 'achievement_item')
27
- require File.join('starcraft2', 'profile', 'ladders')
28
- require File.join('starcraft2', 'profile', 'detailed_season')
29
- require File.join('starcraft2', 'profile', 'non_rank')
30
- require File.join('starcraft2', 'profile', 'ladder')
31
- require File.join('starcraft2', 'profile')
4
+ Dir[File.join("#{File.expand_path File.dirname(__FILE__)}", 'errors', '*.rb')].each do |file|
5
+ require file
6
+ end
7
+
8
+ Dir[File.join("#{File.expand_path File.dirname(__FILE__)}", 'profile', '*.rb')].each do |file|
9
+ require file
10
+ end
11
+
12
+ Dir[File.join("#{File.expand_path File.dirname(__FILE__)}", '*.rb')].each do |file|
13
+ require file
14
+ end
@@ -20,5 +20,25 @@ module Starcraft2
20
20
  klass.send(:"#{k}=", v)
21
21
  end
22
22
  end
23
+
24
+ def self.get_json
25
+ response = yield
26
+ case response.code
27
+ when 200
28
+ body = JSON.parse(response.body)
29
+ case body['code']
30
+ when 404
31
+ raise Starcraft2::NotFoundError, body['message'] || body['reason']
32
+ when 500
33
+ raise Starcraft2::ApiError, body['message'] || body['reason']
34
+ else
35
+ body
36
+ end
37
+ when 404
38
+ raise Starcraft2::NotFoundError, 'Record not found.'
39
+ when 500
40
+ raise Starcraft2::ApiError, 'An API error occurred.'
41
+ end
42
+ end
23
43
  end
24
44
  end
@@ -1,10 +1,12 @@
1
+ require 'simplecov'
2
+ SimpleCov.start do
3
+ add_filter 'spec'
4
+ end
5
+
1
6
  require File.join('bundler', 'setup')
2
7
  require 'rspec'
3
8
  require 'vcr'
4
9
  require 'starcraft2'
5
- require 'simplecov'
6
-
7
- SimpleCov.start
8
10
 
9
11
  VCR.configure do |c|
10
12
  c.cassette_library_dir = 'fixtures/cassettes'
@@ -1,4 +1,4 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
2
 
3
3
  describe Starcraft2::Client do
4
4
  let(:client) { Starcraft2::Client.new(@options) }
@@ -33,9 +33,12 @@ describe Starcraft2::Client do
33
33
 
34
34
  describe '.profile' do
35
35
  it 'should return an sc2 profile' do
36
- VCR.use_cassette("profile_#{999000}") do
36
+ VCR.use_cassette('profile_999000') do
37
37
  options = {:character_name => 'DayNine', :id => 999000, :realm => 1}
38
- client.profile(options).class.should == Starcraft2::Profile
38
+ profile = client.profile(options)
39
+ profile.class.should == Starcraft2::Profile
40
+ profile.display_name.should == 'DayNine'
41
+ profile.id.should == 999000
39
42
  end
40
43
  end
41
44
 
@@ -53,13 +56,11 @@ describe Starcraft2::Client do
53
56
  describe '.achievements' do
54
57
  it 'should return an array of achievements' do
55
58
  VCR.use_cassette('achievements') do
56
- client.achievements.class.should == Array
57
- end
58
- end
59
-
60
- it 'should return items of type Starcraft2::Achievement' do
61
- VCR.use_cassette('achievements') do
62
- client.achievements.first.class.should == Starcraft2::Achievement
59
+ achievements = client.achievements
60
+ achievements.class.should == Array
61
+ achievements.each do |a|
62
+ a.class.should == Starcraft2::Achievement
63
+ end
63
64
  end
64
65
  end
65
66
 
@@ -75,13 +76,11 @@ describe Starcraft2::Client do
75
76
  describe '.rewards' do
76
77
  it 'should return an array of rewards' do
77
78
  VCR.use_cassette('rewards') do
78
- client.rewards.class.should == Array
79
- end
80
- end
81
-
82
- it 'should return items of type Starcraft2::Reward' do
83
- VCR.use_cassette('rewards') do
84
- client.rewards.first.class.should == Starcraft2::Reward
79
+ rewards = client.rewards
80
+ rewards.class.should == Array
81
+ rewards.each do |r|
82
+ r.class.should == Starcraft2::Reward
83
+ end
85
84
  end
86
85
  end
87
86
 
@@ -102,15 +101,44 @@ describe Starcraft2::Client do
102
101
  end
103
102
  let(:member) { ladder.first }
104
103
 
105
- it 'should return an array of members' do
104
+ it 'should return an array of members with characters' do
106
105
  ladder.class.should == Array
107
106
  ladder.each do |m|
108
107
  m.class.should == Starcraft2::Member
108
+ m.character.class.should == Starcraft2::Character
109
109
  end
110
110
  end
111
111
 
112
- it 'should build characters within the members' do
112
+ it 'should return the first grandmaster' do
113
+ member.character.id == 2778732
114
+ member.character.realm == 1
115
+ member.character.display_name == 'lIlIlIlIlIlI'
116
+ member.character.clan_name == ''
117
+ member.character.clan_tag == ''
118
+ member.character.profile_path == '/profile/2778732/1/lIlIlIlIlIlI/'
119
+
120
+ member.points.should == 2374.0
121
+ member.wins.should == 253
122
+ member.losses.should == 102
123
+ member.join_timestamp.should == 1373859935
124
+ member.highest_rank.should == 1
125
+ member.previous_rank.should == 1
126
+ member.favorite_race_p1.should == 'PROTOSS'
127
+ end
128
+ end
129
+
130
+ describe '.last_grandmaster_ladder' do
131
+ let(:ladder) do
132
+ VCR.use_cassette('last_grandmaster') do
133
+ client.last_grandmaster_ladder
134
+ end
135
+ end
136
+ let(:member) { ladder.first }
137
+
138
+ it 'should return an array of members with characters' do
139
+ ladder.class.should == Array
113
140
  ladder.each do |m|
141
+ m.class.should == Starcraft2::Member
114
142
  m.character.class.should == Starcraft2::Character
115
143
  end
116
144
  end
@@ -132,4 +160,12 @@ describe Starcraft2::Client do
132
160
  member.favorite_race_p1.should == 'PROTOSS'
133
161
  end
134
162
  end
135
- end
163
+
164
+ describe '.flush_cache' do
165
+ it 'should clear out all memoizations' do
166
+ client.instance_variable_set('@memoizations', {:foo => 'bar'})
167
+ client.flush_cache
168
+ client.instance_variable_get('@memoizations').should == {}
169
+ end
170
+ end
171
+ end
@@ -8,13 +8,14 @@ describe Starcraft2::Profile do
8
8
  let(:profile) { Starcraft2::Profile.build(client, @profile) }
9
9
 
10
10
  before do
11
- VCR.use_cassette("profile_999000") do
11
+ VCR.use_cassette('profile_999000') do
12
12
  @profile = JSON.parse(HTTParty.get('https://us.battle.net/api/sc2/profile/999000/1/DayNine/').body)
13
13
  end
14
14
  end
15
15
 
16
16
  it 'should build a profile' do
17
17
  profile.class.should == Starcraft2::Profile
18
+ profile.display_name.should == 'DayNine'
18
19
  end
19
20
  end
20
21
 
@@ -1,12 +1,38 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Starcraft2::Reward do
4
+ describe '.initialize' do
5
+ let(:reward) { Starcraft2::Reward.new(@options) }
6
+
7
+ before do
8
+ @options = {
9
+ 'title' => 'Test Title',
10
+ 'id' => 3,
11
+ 'icon' => {'x' => 1, 'y' => 2, 'w' => 3, 'h' => 4, 'offset' => 0, 'url' => 'https://example.com'},
12
+ 'achievement_id' => 5
13
+ }
14
+ end
15
+
16
+ it 'should store attributes as underscored' do
17
+ reward.title.should == 'Test Title'
18
+ reward.id.should == 3
19
+ reward.icon.class.should == Starcraft2::Icon
20
+ reward.icon.x.should == 1
21
+ reward.icon.y.should == 2
22
+ reward.icon.w.should == 3
23
+ reward.icon.h.should == 4
24
+ reward.icon.offset.should == 0
25
+ reward.icon.url.should == 'https://example.com'
26
+ reward.achievement_id.should == 5
27
+ end
28
+ end
29
+
4
30
  describe '#build' do
5
- let(:rewards) { Starcraft2::Reward.build(@raw_reward_data) }
31
+ let(:rewards) { Starcraft2::Reward.build(@rewards) }
6
32
 
7
33
  before do
8
34
  VCR.use_cassette('rewards') do
9
- @raw_reward_data = JSON.parse(HTTParty.get('https://us.battle.net/api/sc2/data/rewards').body)
35
+ @rewards = JSON.parse(HTTParty.get('https://us.battle.net/api/sc2/data/rewards').body)
10
36
  end
11
37
  end
12
38
 
@@ -19,7 +45,6 @@ describe Starcraft2::Reward do
19
45
 
20
46
  it 'should import the first reward' do
21
47
  reward = rewards.first
22
-
23
48
  reward.title.should == 'Kachinsky'
24
49
  reward.id.should == 2951153716
25
50
  reward.icon.x.should == 0
@@ -31,30 +56,4 @@ describe Starcraft2::Reward do
31
56
  reward.achievement_id.should == 0
32
57
  end
33
58
  end
34
-
35
- describe '.initialize' do
36
- let(:reward) { Starcraft2::Reward.new(@options) }
37
-
38
- before do
39
- @options = {
40
- 'title' => 'Test Title',
41
- 'id' => 3,
42
- 'icon' => {'x' => 1, 'y' => 2, 'w' => 3, 'h' => 4, 'offset' => 0, 'url' => 'https://example.com'},
43
- 'achievement_id' => 5
44
- }
45
- end
46
-
47
- it 'should store attributes as underscored' do
48
- reward.title.should == 'Test Title'
49
- reward.id.should == 3
50
- reward.icon.class.should == Starcraft2::Icon
51
- reward.icon.x.should == 1
52
- reward.icon.y.should == 2
53
- reward.icon.w.should == 3
54
- reward.icon.h.should == 4
55
- reward.icon.offset.should == 0
56
- reward.icon.url.should == 'https://example.com'
57
- reward.achievement_id.should == 5
58
- end
59
- end
60
59
  end
@@ -55,4 +55,82 @@ describe Starcraft2::Utils do
55
55
  ladders.current_season.last.ladder.first.ladder_name.should == 'Torrasque Upsilon'
56
56
  end
57
57
  end
58
+
59
+ describe '#get_json' do
60
+ let(:success) { {'code' => 200, 'message' => 'success', 'status' => 'nok'} }
61
+ let(:error) { {'code' => 500, 'message' => 'error', 'status' => 'nok'} }
62
+ let(:not_found) { {'code' => 404, 'message' => 'not found', 'status' => 'nok'} }
63
+
64
+ describe 'HTTP 200' do
65
+ let(:request) { HTTParty::Request.new Net::HTTP::Get, '/' }
66
+ let(:response) { Net::HTTPOK.new('1.1', 200, 'OK') }
67
+
68
+ it 'should return the parsed json body' do
69
+ response.stub(:body).and_return(success.to_json)
70
+ response_lambda = lambda { success.to_json }
71
+
72
+ Starcraft2::Utils.get_json do
73
+ HTTParty::Response.new(request, response, response_lambda)
74
+ end.should == success
75
+ end
76
+
77
+ context 'json contains code 404' do
78
+ it 'should throw a NotFoundError' do
79
+ response.stub(:body).and_return(not_found.to_json)
80
+ response_lambda = lambda { not_found.to_json }
81
+
82
+ expect {
83
+ Starcraft2::Utils.get_json do
84
+ HTTParty::Response.new(request, response, response_lambda)
85
+ end
86
+ }.to raise_error(Starcraft2::NotFoundError, anything)
87
+ end
88
+ end
89
+
90
+ context 'json contains code 500' do
91
+ it 'should throw an ApiError' do
92
+ response.stub(:body).and_return(error.to_json)
93
+ response_lambda = lambda { error.to_json }
94
+
95
+ expect {
96
+ Starcraft2::Utils.get_json do
97
+ HTTParty::Response.new(request, response, response_lambda)
98
+ end
99
+ }.to raise_error(Starcraft2::ApiError, anything)
100
+ end
101
+ end
102
+ end
103
+
104
+ describe 'HTTP 404' do
105
+ let(:request) { HTTParty::Request.new Net::HTTP::Get, '/' }
106
+ let(:response) { Net::HTTPNotFound.new('1.1', 404, 'OK') }
107
+
108
+ it 'should throw a NotFoundError' do
109
+ response.stub(:body).and_return(not_found.to_json)
110
+ response_lambda = lambda { not_found.to_json }
111
+
112
+ expect {
113
+ Starcraft2::Utils.get_json do
114
+ HTTParty::Response.new(request, response, response_lambda)
115
+ end
116
+ }.to raise_error(Starcraft2::NotFoundError, anything)
117
+ end
118
+ end
119
+
120
+ describe 'HTTP 500' do
121
+ let(:request) { HTTParty::Request.new Net::HTTP::Get, '/' }
122
+ let(:response) { Net::HTTPInternalServerError.new('1.1', 500, 'OK') }
123
+
124
+ it 'should throw an ApiError' do
125
+ response.stub(:body).and_return(error.to_json)
126
+ response_lambda = lambda { error.to_json }
127
+
128
+ expect {
129
+ Starcraft2::Utils.get_json do
130
+ HTTParty::Response.new(request, response, response_lambda)
131
+ end
132
+ }.to raise_error(Starcraft2::ApiError, anything)
133
+ end
134
+ end
135
+ end
58
136
  end