bnet_scraper 0.3.1 → 0.4.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 (51) hide show
  1. data/CHANGELOG.md +9 -0
  2. data/Gemfile +1 -1
  3. data/LICENSE +1 -1
  4. data/README.md +51 -31
  5. data/bnet_scraper.gemspec +3 -1
  6. data/fixtures/vcr_cassettes/demon_achievements.yml +246 -0
  7. data/fixtures/vcr_cassettes/demon_leagues.yml +359 -0
  8. data/fixtures/vcr_cassettes/demon_match_history.yml +241 -0
  9. data/fixtures/vcr_cassettes/demon_matches.yml +240 -0
  10. data/fixtures/vcr_cassettes/demon_profile.yml +1428 -0
  11. data/fixtures/vcr_cassettes/demon_profile_leagues.yml +1291 -0
  12. data/fixtures/vcr_cassettes/full_demon_scrape.yml +5449 -0
  13. data/fixtures/vcr_cassettes/invalid_achievement.yml +199 -0
  14. data/fixtures/vcr_cassettes/invalid_leagues.yml +199 -0
  15. data/fixtures/vcr_cassettes/invalid_matches.yml +199 -0
  16. data/fixtures/vcr_cassettes/invalid_profile.yml +199 -0
  17. data/fixtures/vcr_cassettes/new_league.yml +595 -0
  18. data/fixtures/vcr_cassettes/profile_invalid.yml +199 -0
  19. data/fixtures/vcr_cassettes/profile_not_laddered.yml +443 -0
  20. data/fixtures/vcr_cassettes/realm_status.yml +578 -0
  21. data/lib/bnet_scraper/starcraft2.rb +7 -8
  22. data/lib/bnet_scraper/starcraft2/achievement_scraper.rb +5 -5
  23. data/lib/bnet_scraper/starcraft2/league.rb +54 -0
  24. data/lib/bnet_scraper/starcraft2/league_scraper.rb +3 -1
  25. data/lib/bnet_scraper/starcraft2/match.rb +15 -0
  26. data/lib/bnet_scraper/starcraft2/match_history_scraper.rb +9 -18
  27. data/lib/bnet_scraper/starcraft2/profile.rb +45 -0
  28. data/lib/bnet_scraper/starcraft2/profile_scraper.rb +68 -44
  29. data/spec/spec_helper.rb +14 -0
  30. data/spec/starcraft2/achievement_scraper_spec.rb +67 -83
  31. data/spec/starcraft2/league_scraper_spec.rb +25 -59
  32. data/spec/starcraft2/league_spec.rb +43 -0
  33. data/spec/starcraft2/match_history_scraper_spec.rb +19 -39
  34. data/spec/starcraft2/profile_scraper_spec.rb +36 -141
  35. data/spec/starcraft2/profile_spec.rb +46 -0
  36. data/spec/starcraft2/status_scraper_spec.rb +12 -5
  37. data/spec/starcraft2_spec.rb +19 -36
  38. data/spec/support/shared/sc2_scraper.rb +28 -13
  39. metadata +57 -42
  40. data/spec/support/achievements.html +0 -1156
  41. data/spec/support/failure.html +0 -565
  42. data/spec/support/initial_league.html +0 -1082
  43. data/spec/support/initial_leagues.html +0 -3598
  44. data/spec/support/league.html +0 -8310
  45. data/spec/support/leagues.html +0 -3810
  46. data/spec/support/load_fakeweb.rb +0 -42
  47. data/spec/support/matches.html +0 -1228
  48. data/spec/support/no_ladder.html +0 -967
  49. data/spec/support/no_ladder_leagues.html +0 -664
  50. data/spec/support/profile.html +0 -1074
  51. data/spec/support/status.html +0 -1
@@ -1,77 +1,43 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe BnetScraper::Starcraft2::LeagueScraper do
4
- let(:url) { "http://us.battle.net/sc2/en/profile/2377239/1/Demon/ladder/12345" }
4
+ let(:url) { "http://us.battle.net/sc2/en/profile/2377239/1/Demon/ladder/134659" }
5
5
  subject { BnetScraper::Starcraft2::LeagueScraper.new(url: url) }
6
6
 
7
7
  it_behaves_like 'an SC2 Scraper' do
8
8
  let(:scraper_class) { BnetScraper::Starcraft2::LeagueScraper }
9
- let(:subject) { scraper_class.new(url: "http://us.battle.net/sc2/en/profile/2377239/1/Demon/ladder/12345") }
9
+ let(:subject) { scraper_class.new(url: "http://us.battle.net/sc2/en/profile/2377239/1/Demon/ladder/134659") }
10
10
  end
11
11
 
12
12
  describe '#initialize' do
13
13
  it 'should dissect the league_id from the URL' do
14
- subject.league_id.should == '12345'
14
+ subject.league_id.should == '134659'
15
15
  end
16
16
  end
17
17
 
18
18
  describe '#scrape' do
19
- it 'should set the season value' do
20
- subject.season.should be_nil
21
- subject.scrape
22
- subject.season.should == '6'
23
- end
24
-
25
- it 'should set the name' do
26
- subject.name.should be_nil
27
- subject.scrape
28
- subject.name.should == 'Aleksander Pepper'
29
- end
30
-
31
- it 'should set the divison' do
32
- subject.division.should be_nil
33
- subject.scrape
34
- subject.division.should == 'Diamond'
35
- end
36
-
37
- it 'should set the size' do
38
- subject.size.should be_nil
39
- subject.scrape
40
- subject.size.should == '4v4'
41
- end
42
-
43
- it 'should set if player is random' do
44
- subject.random.should be_nil
45
- subject.scrape
46
- subject.random.should be_false
47
- end
48
-
49
- it 'should call output' do
50
- subject.should_receive(:output)
51
- subject.scrape
52
- end
53
-
54
- it 'should raise InvalidProfileError when response is 404' do
55
- url = 'http://us.battle.net/sc2/en/profile/2377239/1/SomeDude/leagues/12345'
56
- scraper = BnetScraper::Starcraft2::LeagueScraper.new(url: url)
57
- expect { scraper.scrape }.to raise_error(BnetScraper::InvalidProfileError)
58
- end
59
- end
60
-
61
- describe '#output' do
62
- it 'should return a hash of league data' do
63
- expected = {
64
- season: '6',
65
- name: 'Aleksander Pepper',
66
- division: 'Diamond',
67
- size: '4v4',
68
- random: false,
69
- bnet_id: '2377239',
70
- account: 'Demon'
71
- }
72
-
73
- subject.scrape
74
- subject.output.should == expected
19
+ context 'valid profile' do
20
+ before do
21
+ VCR.use_cassette('demon_leagues') do
22
+ subject.scrape
23
+ end
24
+ end
25
+
26
+ its(:season) { should == '2013 Season 1' }
27
+ its(:name) { should == 'Kalathi Echo' }
28
+ its(:division) { should == 'Platinum' }
29
+ its(:size) { should == '1v1' }
30
+ its(:random) { should be_false }
31
+ end
32
+
33
+ context 'invalid profile' do
34
+ it 'should raise InvalidProfileError' do
35
+ VCR.use_cassette('invalid_leagues') do
36
+ url = 'http://us.battle.net/sc2/en/profile/2377239/1/SomeDude/leagues/12345'
37
+ scraper = BnetScraper::Starcraft2::LeagueScraper.new(url: url)
38
+ expect { scraper.scrape }.to raise_error(BnetScraper::InvalidProfileError)
39
+ end
40
+ end
75
41
  end
76
42
  end
77
43
  end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ describe BnetScraper::Starcraft2::League do
4
+ let(:href) { 'http://us.battle.net/sc2/en/profile/2377239/1/Demon/ladder/134659' }
5
+ let(:league) { BnetScraper::Starcraft2::League.new href: href }
6
+ subject { league }
7
+
8
+ it 'scrapes if name is not set' do
9
+ VCR.use_cassette('demon_leagues') do
10
+ league.name.should == 'Kalathi Echo'
11
+ end
12
+ end
13
+
14
+ it 'scrapes if season is not set' do
15
+ VCR.use_cassette('demon_leagues') do
16
+ league.season.should == '2013 Season 1'
17
+ end
18
+ end
19
+
20
+ it 'scrapes if division is not set' do
21
+ VCR.use_cassette('demon_leagues') do
22
+ league.division.should == 'Platinum'
23
+ end
24
+ end
25
+
26
+ it 'scrapes if size is not set' do
27
+ VCR.use_cassette('demon_leagues') do
28
+ league.size.should == '1v1'
29
+ end
30
+ end
31
+
32
+ it 'scrapes if bnet_id is not set' do
33
+ VCR.use_cassette('demon_leagues') do
34
+ league.bnet_id.should == '2377239'
35
+ end
36
+ end
37
+
38
+ it 'scrapes if account is not set' do
39
+ VCR.use_cassette('demon_leagues') do
40
+ league.account.should == 'Demon'
41
+ end
42
+ end
43
+ end
@@ -2,7 +2,8 @@ require 'spec_helper'
2
2
 
3
3
  describe BnetScraper::Starcraft2::MatchHistoryScraper do
4
4
  let(:url) { 'http://us.battle.net/sc2/en/profile/2377239/1/Demon/matches' }
5
- subject { BnetScraper::Starcraft2::MatchHistoryScraper.new(url: url) }
5
+ let(:scraper) { BnetScraper::Starcraft2::MatchHistoryScraper.new(url: url) }
6
+ subject { scraper }
6
7
 
7
8
  it_behaves_like 'an SC2 Scraper' do
8
9
  let(:scraper_class) { BnetScraper::Starcraft2::MatchHistoryScraper }
@@ -11,49 +12,28 @@ describe BnetScraper::Starcraft2::MatchHistoryScraper do
11
12
 
12
13
  describe '#scrape' do
13
14
 
14
- before :each do
15
- subject.scrape
15
+ before do
16
+ VCR.use_cassette('demon_matches') do
17
+ scraper.scrape
18
+ end
16
19
  end
20
+
21
+ its(:matches) { should have(25).matches }
17
22
 
18
- it 'sets the matches to an array of match data' do
19
- subject.matches.should have(25).matches
20
- end
21
-
22
- it 'should set the name of the map for each match' do
23
- subject.matches[0][:map_name].should == 'Bx Monobattle - Sand Canyon (Fix)'
24
- end
25
-
26
- it 'should set the type of the match for each match' do
27
- subject.matches[0][:type].should == 'Custom'
28
- end
29
-
30
- it 'should set the outcome of each match' do
31
- subject.matches[0][:outcome].should == :win
32
- end
33
-
34
- it 'should set the match date of each match' do
35
- subject.matches[0][:date].should == '3/12/2012'
23
+ describe 'each match' do
24
+ subject { scraper.matches[0] }
25
+ its(:map_name) { should == 'Cloud Kingdom LE' }
26
+ its(:type) { should == '1v1' }
27
+ its(:outcome) { should == :win }
28
+ its(:date) { should == '2/20/2013' }
36
29
  end
37
30
 
38
31
  it 'should raised InvalidProfileError when response is 404' do
39
- url = 'http://us.battle.net/sc2/en/profile/2377239/1/SomeDude/matches'
40
- scraper = BnetScraper::Starcraft2::MatchHistoryScraper.new(url: url)
41
- expect { scraper.scrape }.to raise_error(BnetScraper::InvalidProfileError)
42
- end
43
- end
44
-
45
- describe '#output' do
46
- before :each do
47
- subject.scrape
48
- end
49
-
50
- it 'should return a hash of the scraped match data' do
51
- expected = {
52
- matches: subject.matches,
53
- wins: subject.wins,
54
- losses: subject.losses
55
- }
56
- subject.output.should == expected
32
+ VCR.use_cassette('invalid_matches') do
33
+ url = 'http://us.battle.net/sc2/en/profile/2377239/1/SomeDude/matches'
34
+ scraper = BnetScraper::Starcraft2::MatchHistoryScraper.new(url: url)
35
+ expect { scraper.scrape }.to raise_error(BnetScraper::InvalidProfileError)
36
+ end
57
37
  end
58
38
  end
59
39
  end
@@ -6,73 +6,70 @@ describe BnetScraper::Starcraft2::ProfileScraper do
6
6
  let(:subject) { scraper_class.new(url: 'http://us.battle.net/sc2/en/profile/2377239/1/Demon/') }
7
7
  end
8
8
 
9
- subject { BnetScraper::Starcraft2::ProfileScraper.new(bnet_id: '2377239', account: 'Demon') }
9
+ let(:scraper) { BnetScraper::Starcraft2::ProfileScraper.new(bnet_id: '2377239', account: 'Demon') }
10
10
 
11
11
  describe '#get_profile_data' do
12
12
  before do
13
- subject.get_profile_data
13
+ VCR.use_cassette('demon_profile', record: :new_episodes) do
14
+ scraper.get_profile_data
15
+ end
14
16
  end
15
17
 
16
- its(:race) { should == 'Protoss' }
17
- its(:achievement_points) { should == '3660' }
18
- its(:current_solo_league) { should == 'Not Yet Ranked' }
18
+ subject { scraper.profile }
19
+
20
+ its(:achievement_points) { should == '3680' }
21
+ its(:current_solo_league) { should == 'Platinum' }
19
22
  its(:highest_solo_league) { should == 'Platinum' }
20
- its(:current_team_league) { should == 'Not Yet Ranked' }
21
- its(:highest_team_league) { should == 'Diamond' }
22
- its(:career_games) { should == '1568' }
23
- its(:games_this_season) { should == '0' }
24
- its(:most_played) { should == '4v4' }
23
+ its(:current_team_league) { should == 'Diamond' }
24
+ its(:highest_team_league) { should == 'Master' }
25
+ its(:career_games) { should == '1719' }
26
+ its(:games_this_season) { should == '114' }
27
+ its(:portrait) { should == 'Mohandar' }
28
+ its(:terran_swarm_level) { should == 0 }
29
+ its(:protoss_swarm_level) { should == 0 }
30
+ its(:zerg_swarm_level) { should == 0 }
25
31
 
26
32
  context 'first league ever' do
27
- subject { BnetScraper::Starcraft2::ProfileScraper.new url: 'http://us.battle.net/sc2/en/profile/3513522/1/Heritic/' }
33
+ let(:scraper) { BnetScraper::Starcraft2::ProfileScraper.new url: 'http://us.battle.net/sc2/en/profile/3513522/1/Heritic/' }
28
34
 
29
- before do
30
- subject.scrape
35
+ subject do
36
+ VCR.use_cassette('new_league', record: :new_episodes) do
37
+ scraper.scrape
38
+ end
31
39
  end
32
40
 
33
41
  its(:current_solo_league) { should == 'Bronze' }
34
42
  its(:highest_solo_league) { should == 'Bronze' }
35
- its(:current_team_league) { should == 'Silver' }
43
+ its(:current_team_league) { should == 'Bronze' }
36
44
  its(:highest_team_league) { should == 'Silver' }
37
45
  end
38
46
  end
39
47
 
40
48
  describe 'get_league_list' do
41
- it 'should set an array of leagues' do
42
- subject.should have(0).leagues
43
- subject.get_league_list
44
-
45
- subject.should have(12).leagues
49
+ before do
50
+ VCR.use_cassette('demon_profile_leagues') do
51
+ scraper.get_league_list
52
+ end
46
53
  end
54
+
55
+ subject { scraper.profile.leagues }
56
+ it { should have(8).leagues }
47
57
  end
48
58
 
49
59
  describe '#scrape' do
50
- it 'should call get_profile_data' do
51
- subject.should_receive(:get_profile_data)
52
- subject.scrape
53
- end
54
-
55
- it 'should call get_league_list' do
56
- subject.should_receive(:get_league_list)
57
- subject.scrape
58
- end
59
-
60
-
61
-
62
- it 'should call output' do
63
- subject.should_receive(:output)
64
- subject.scrape
65
- end
66
-
67
60
  it 'should return InvalidProfileError if response is 404' do
68
- scraper = BnetScraper::Starcraft2::ProfileScraper.new url: 'http://us.battle.net/sc2/en/profile/2377239/1/SomeDude/'
69
- expect { scraper.scrape }.to raise_error(BnetScraper::InvalidProfileError)
61
+ VCR.use_cassette('profile_invalid') do
62
+ scraper = BnetScraper::Starcraft2::ProfileScraper.new url: 'http://us.battle.net/sc2/en/profile/2377239/1/SomeDude/'
63
+ expect { scraper.scrape }.to raise_error(BnetScraper::InvalidProfileError)
64
+ end
70
65
  end
71
66
 
72
67
  context 'account that has not laddered' do
73
68
  let(:scraper) {BnetScraper::Starcraft2::ProfileScraper.new(url: 'http://us.battle.net/sc2/en/profile/3354437/1/ClarkeKent/') }
74
69
  before do
75
- scraper.scrape
70
+ VCR.use_cassette('profile_not_laddered') do
71
+ scraper.scrape
72
+ end
76
73
  end
77
74
 
78
75
  it 'should have an empty array of leagues' do
@@ -80,106 +77,4 @@ describe BnetScraper::Starcraft2::ProfileScraper do
80
77
  end
81
78
  end
82
79
  end
83
-
84
- describe '#output' do
85
- it 'should extract profile data from the response' do
86
- expected = {
87
- bnet_id: '2377239',
88
- account: 'Demon',
89
- bnet_index: 1,
90
- race: 'Protoss',
91
- career_games: '1568',
92
- games_this_season: '0',
93
- highest_solo_league: 'Platinum',
94
- current_solo_league: 'Not Yet Ranked',
95
- highest_team_league: 'Diamond',
96
- current_team_league: 'Not Yet Ranked',
97
- most_played: '4v4',
98
- achievement_points: '3660',
99
- portrait: 'Mohandar',
100
- leagues: [
101
- {
102
- name: "1v1 Platinum Rank 95",
103
- id: "96905",
104
- href: "http://us.battle.net/sc2/en/profile/2377239/1/Demon/ladder/96905#current-rank"
105
- },
106
- {
107
- name: "2v2 Random Platinum ...",
108
- id: "96716",
109
- href: "http://us.battle.net/sc2/en/profile/2377239/1/Demon/ladder/96716#current-rank"
110
- },
111
- {
112
- name: "2v2 Diamond Rank 45",
113
- id: "98162",
114
- href: "http://us.battle.net/sc2/en/profile/2377239/1/Demon/ladder/98162#current-rank"
115
- },
116
- {
117
- name: "2v2 Silver Rank 8",
118
- id: "97369",
119
- href: "http://us.battle.net/sc2/en/profile/2377239/1/Demon/ladder/97369#current-rank"
120
- },
121
- {
122
- name: "3v3 Random Gold Rank...",
123
- id: "96828",
124
- href: "http://us.battle.net/sc2/en/profile/2377239/1/Demon/ladder/96828#current-rank"
125
- },
126
- {
127
- name: "3v3 Diamond Rank 56",
128
- id: "97985",
129
- href: "http://us.battle.net/sc2/en/profile/2377239/1/Demon/ladder/97985#current-rank"
130
- },
131
- {
132
- name: "3v3 Silver Rank 5",
133
- id: "98523",
134
- href: "http://us.battle.net/sc2/en/profile/2377239/1/Demon/ladder/98523#current-rank"
135
- },
136
- {
137
- name: "3v3 Platinum Rank 88",
138
- id: "96863",
139
- href: "http://us.battle.net/sc2/en/profile/2377239/1/Demon/ladder/96863#current-rank"
140
- },
141
- {
142
- name: "3v3 Gold Rank 75",
143
- id: "97250",
144
- href: "http://us.battle.net/sc2/en/profile/2377239/1/Demon/ladder/97250#current-rank"
145
- },
146
- {
147
- name: "4v4 Random Platinum ...",
148
- id: "96830",
149
- href: "http://us.battle.net/sc2/en/profile/2377239/1/Demon/ladder/96830#current-rank"
150
- },
151
- {
152
- name: "4v4 Gold Rank 38",
153
- id: "98336",
154
- href: "http://us.battle.net/sc2/en/profile/2377239/1/Demon/ladder/98336#current-rank"
155
- },
156
- {
157
- name: "4v4 Diamond Rank 54",
158
- id: "98936",
159
- href: "http://us.battle.net/sc2/en/profile/2377239/1/Demon/ladder/98936#current-rank"
160
- }
161
- ]
162
- }
163
-
164
- subject.output.should == {
165
- bnet_id: '2377239',
166
- account: 'Demon',
167
- bnet_index: 1,
168
- race: nil,
169
- career_games: nil,
170
- games_this_season: nil,
171
- most_played: nil,
172
- highest_solo_league: nil,
173
- current_solo_league: nil,
174
- highest_team_league: nil,
175
- current_team_league: nil,
176
- achievement_points: nil,
177
- leagues: [],
178
- portrait: nil
179
- }
180
-
181
- subject.scrape
182
- subject.output.should == expected
183
- end
184
- end
185
80
  end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe BnetScraper::Starcraft2::Profile do
4
+ let(:url) { 'http://us.battle.net/sc2/en/profile/2377239/1/Demon/' }
5
+ let(:profile) { BnetScraper::Starcraft2::Profile.new url: url }
6
+ subject { profile }
7
+
8
+ its(:swarm_levels) { should be_instance_of Hash }
9
+ its(:swarm_levels) { should have_key :zerg }
10
+ its(:swarm_levels) { should have_key :protoss }
11
+ its(:swarm_levels) { should have_key :terran }
12
+
13
+ it 'retrieves achievements when first accessed' do
14
+ VCR.use_cassette('demon_achievements') do
15
+ profile.achievements.should have_key(:recent)
16
+ profile.achievements.should have_key(:showcase)
17
+ profile.achievements.should have_key(:progress)
18
+ end
19
+ end
20
+
21
+ it 'sends recent_achievements to achievements hash' do
22
+ VCR.use_cassette('demon_achievements') do
23
+ profile.recent_achievements.should == profile.achievements[:recent]
24
+ end
25
+ end
26
+
27
+ it 'sends progress_achievements to achievements hash' do
28
+ VCR.use_cassette('demon_achievements') do
29
+ profile.progress_achievements.should == profile.achievements[:progress]
30
+ end
31
+ end
32
+
33
+ it 'sends showcase_achievements to achievements hash' do
34
+ VCR.use_cassette('demon_achievements') do
35
+ profile.showcase_achievements.should == profile.achievements[:showcase]
36
+ end
37
+ end
38
+
39
+ it 'retrieves match history when first accessed' do
40
+ VCR.use_cassette('demon_match_history') do
41
+ profile.match_history.should have(25).matches
42
+ profile.match_history.first.should be_instance_of BnetScraper::Starcraft2::Match
43
+ end
44
+ end
45
+
46
+ end