bnet_scraper 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,12 @@
1
1
  # Changelog!
2
2
 
3
+ ## 0.6.0 (May 09 2013)
4
+
5
+ * Adds GrandmasterScraper to pull all grandmasters by region
6
+ * Updates Portrait names for anniversary
7
+ * Improves portait code
8
+ * Documentation updates
9
+
3
10
  ## 0.5.0 (Mar 29 2013)
4
11
 
5
12
  * Adds Heart of the Swarm Portrait Names
data/README.md CHANGED
@@ -168,6 +168,17 @@ BnetScraper::Starcraft2::Status.fetch # => [
168
168
  ]
169
169
  ```
170
170
 
171
+ ## BnetScraper::Starcraft2::GrandmasterScraper
172
+
173
+ This pulls the list of 200 Grandmasters for a given region. Each player is returned as a hash.
174
+
175
+ ``` ruby
176
+ scraper = BnetScraper::Starcraft2::GrandmasterScraper.new(region: :na)
177
+ players = scraper.scraper
178
+ players.size # => 200
179
+ players[0].keys # => [:rank, :name, :race, :points, :wins, :losses]
180
+ ```
181
+
171
182
  # Contribute!
172
183
 
173
184
  I would love to see contributions! Please send a pull request with a feature branch containing specs
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "bnet_scraper"
6
- s.version = "0.5.0"
6
+ s.version = "0.6.0"
7
7
  s.authors = ["Andrew Nordman"]
8
8
  s.email = ["cadwallion@gmail.com"]
9
9
  s.homepage = "https://github.com/agoragames/bnet_scraper/"
@@ -4,6 +4,7 @@ require 'bnet_scraper/starcraft2/league_scraper'
4
4
  require 'bnet_scraper/starcraft2/achievement_scraper'
5
5
  require 'bnet_scraper/starcraft2/match_history_scraper'
6
6
  require 'bnet_scraper/starcraft2/status_scraper'
7
+ require 'bnet_scraper/starcraft2/grandmaster_scraper'
7
8
 
8
9
  module BnetScraper
9
10
  # This module contains everything about scraping Starcraft 2 Battle.net accounts.
@@ -27,60 +28,7 @@ module BnetScraper
27
28
  'tw.battle.net' => 'fea'
28
29
  }
29
30
 
30
- # The armory uses spritemaps that are sequentially named and have a fixed
31
- # 6x6 grid. We'll simply use the portrait names, left to right, top to
32
- # bottom.
33
- #
34
- # Note: I couldn't identify the exact names of some of these and instead of
35
- # guessing, I didn't name them. Some appear in multiple files too, which
36
- # is odd.
37
- #
38
- # I decided th pad the arrays even if there are no images to make various
39
- # helping functionality (e.g. retrieving position for a name) easier.
40
- # I've also kept them in 6x6 here for better overview.
41
-
42
- PORTRAITS = [
43
- [
44
- 'Kachinsky', 'Cade', 'Thatcher', 'Hall', 'Tiger Marine', 'Panda Marine',
45
- 'General Warfield', 'Jim Raynor', 'Arcturus Mengsk', 'Sarah Kerrigan', 'Kate Lockwell', 'Rory Swann',
46
- 'Egon Stetmann', 'Hill', 'Adjutant', 'Dr. Ariel Hanson', 'Gabriel Tosh', 'Matt Horner',
47
- 'Tychus Findlay', 'Zeratul', 'Valerian Mengsk', 'Spectre', 'Raynor Marine', 'Tauren Marine',
48
- 'Night Elf Banshee', 'Diablo Marine', 'SCV', 'Firebat', 'Vulture', 'Hellion',
49
- 'Medic', 'Spartan Company', 'Wraith', 'Diamondback', 'Probe', 'Scout'
50
- ],
51
- [
52
- 'Tauren Marine', 'Night Elf Banshee', 'Diablo Marine', 'Worgen Marine', 'Goblin Marine', 'PanTerran Marine',
53
- 'Wizard Templar', 'Tyrael Marine', 'Witch Doctor Zergling', 'Stank', 'Night Elf Templar', 'Infested Orc',
54
- '', 'Diablo Marine', '', 'Pandaren Firebat', 'Prince Valerian', 'Zagara',
55
- 'Lasarra', 'Dehaka', 'Infested Stukov', 'Mira Horner', 'Primal Queen', 'Izsha',
56
- 'Abathur', 'Ghost Kerrigan', 'Zurvan', 'Narud', '', '',
57
- '', '', '', '', '', ''
58
- ],
59
- [
60
- 'Ghost', 'Thor', 'Battlecruiser', 'Nova', 'Zealot', 'Stalker',
61
- 'Phoenix', 'Immortal', 'Void Ray', 'Colossus', 'Carrier', 'Tassadar',
62
- 'Reaper', 'Sentry', 'Overseer', 'Viking', 'High Templar', 'Mutalisk',
63
- 'Banshee', 'Hybrid Destroyer', 'Dark Voice', 'Urubu', 'Lyote', 'Automaton 2000',
64
- 'Orian', 'Wolf Marine', 'Murloc Marine', 'Worgen Marine', 'Goblin Marine', 'Zealot Chef',
65
- 'Stank', 'Ornatus', 'Facebook Corps Members', 'Lion Marines', 'Dragons', 'Raynor Marine'
66
- ],
67
- [
68
- 'Urun', 'Nyon', 'Executor', 'Mohandar', 'Selendis', 'Artanis',
69
- 'Drone', 'Infested Colonist', 'Infested Marine', 'Corruptor', 'Aberration', 'Broodlord',
70
- 'Overmind', 'Leviathan', 'Overlord', 'Hydralisk Marine', "Zer'atai Dark Templar", 'Goliath',
71
- 'Lenassa Dark Templar', 'Mira Han', 'Archon', 'Hybrid Reaver', 'Predator', 'Unknown',
72
- 'Zergling', 'Roach', 'Baneling', 'Hydralisk', 'Queen', 'Infestor',
73
- 'Ultralisk', 'Queen of Blades', 'Marine', 'Marauder', 'Medivac', 'Siege Tank'
74
- ],
75
- [
76
- 'Level 3 Zealot', 'Level 5 Stalker', 'Level 8 Sentinel', 'Level 11 Immortal', 'Level 14 Oracle', 'Level 17 High Templar',
77
- 'Level 21 Tempest', 'Level 23 Colossus', 'Level 27 Carrier', 'Level 29 Zeratul', 'Level 3 Marine', 'Level 5 Marauder',
78
- 'Level 8 Hellbat', 'Level 11 Widow Mine', 'Level 14 Medivac', 'Level 17 Banshee', 'Level 21 Ghost', 'Level 23 Thor',
79
- 'Level 27 Battlecruiser', 'Level 29 Raynor', 'Level 3 Zergling', 'Level 5 Roach', 'Level 8 Hydralisk', 'Level 11 Locust',
80
- 'Level 14 Swarm Host', 'Level 17 Infestor', 'Level 21 Viper', 'Level 23 Broodlord', 'Level 27 Ultralisk', 'Level 29 Kerrigan',
81
- 'Protoss Champion',' Terran Champion', 'Zerg Champion', '', '', ''
82
- ]
83
- ]
31
+
84
32
 
85
33
  # This is a convenience method that chains calls to ProfileScraper,
86
34
  # followed by a scrape of each league returned in the `leagues` array
@@ -0,0 +1,49 @@
1
+ module BnetScraper
2
+ module Starcraft2
3
+ class GrandmasterScraper < BaseScraper
4
+ attr_reader :players
5
+ REGIONS = [:us, :eu, :kr, :tw, :sea]
6
+
7
+ def initialize options = {}
8
+ @players = []
9
+ if REGIONS.include? options[:region]
10
+ @url = "https://#{options[:region]}.battle.net/sc2/en/ladder/grandmaster/heart-of-the-swarm"
11
+ else
12
+ raise "Invalid Region #{options[:region]}"
13
+ end
14
+ end
15
+
16
+ def scrape
17
+ html = retrieve_data
18
+
19
+ get_grandmasters html
20
+
21
+ @players
22
+ end
23
+
24
+ def retrieve_data
25
+ response = Faraday.get @url
26
+
27
+ if response.success?
28
+ Nokogiri::HTML(response.body)
29
+ end
30
+ end
31
+
32
+ def get_grandmasters html
33
+ html.css("#ladder tbody tr").each do |player_data|
34
+ player_cells = player_data.css("td[class='align-center']")
35
+ player = {
36
+ name: player_data.css("td a").inner_text.strip,
37
+ points: player_cells[2].inner_text,
38
+ wins: player_cells[3].inner_text,
39
+ losses: player_cells[4].inner_text,
40
+ race: player_data.css("td a").attr('class').value.sub('race-', ''),
41
+ rank: player_cells[1].inner_text.strip
42
+ }
43
+
44
+ @players << player
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,82 @@
1
+ module BnetScraper
2
+ module Starcraft2
3
+ # Portrait information pulled from the Armory. Portraits are 90-pixel jpgs that are either viewed as a single
4
+ # image or as part of a 6x6 spritesheet. There are several spritesheets with a few cells in the sheets not yet
5
+ # filled but will be in the future.
6
+ #
7
+ # The Profile page uses the spritesheet version of the Portrait with an X/Y background position. This is
8
+ # converted into sheet, column, and row, which allows us to know the name and map to the single image url as
9
+ # well.
10
+ class Portrait
11
+ # The armory uses spritemaps that are sequentially named and have a fixed
12
+ # 6x6 grid. We'll simply use the portrait names, left to right, top to
13
+ # bottom. The sheets are padded even when no portrait is present to account for the 36-image sheet
14
+ NAMES = [
15
+ # SPRITESHEET 1
16
+ 'Kachinsky', 'Cade', 'Thatcher', 'Hall', 'Tiger Marine', 'Panda Marine',
17
+ 'General Warfield', 'Jim Raynor', 'Arcturus Mengsk', 'Sarah Kerrigan', 'Kate Lockwell', 'Rory Swann',
18
+ 'Egon Stetmann', 'Hill', 'Adjutant', 'Dr. Ariel Hanson', 'Gabriel Tosh', 'Matt Horner',
19
+ 'Tychus Findlay', 'Zeratul', 'Valerian Mengsk', 'Spectre', 'Raynor Marine', 'Tauren Marine',
20
+ 'Night Elf Banshee', 'Diablo Marine', 'SCV', 'Firebat', 'Vulture', 'Hellion',
21
+ 'Medic', 'Spartan Company', 'Wraith', 'Diamondback', 'Probe', 'Scout',
22
+ # SPRITESHEET 2
23
+ 'Tauren Marine', 'Night Elf Banshee', 'Diablo Marine', 'Worgen Marine', 'Goblin Marine', 'PanTerran Marine',
24
+ 'Wizard Templar', 'Tyrael Marine', 'Witch Doctor Zergling', 'Stank', 'Night Elf Templar', 'Infested Orc',
25
+ '', 'Diablo Marine', '', 'Pandaren Firebat', 'Prince Valerian', 'Zagara',
26
+ 'Lasarra', 'Dehaka', 'Infested Stukov', 'Mira Horner', 'Primal Queen', 'Izsha',
27
+ 'Abathur', 'Ghost Kerrigan', 'Zurvan', 'Narud', '', '15 Year Terran',
28
+ '15 Year Protoss', '15 Year Zerg', '', '', '', '',
29
+ # SPRITESHEET 3
30
+ 'Ghost', 'Thor', 'Battlecruiser', 'Nova', 'Zealot', 'Stalker',
31
+ 'Phoenix', 'Immortal', 'Void Ray', 'Colossus', 'Carrier', 'Tassadar',
32
+ 'Reaper', 'Sentry', 'Overseer', 'Viking', 'High Templar', 'Mutalisk',
33
+ 'Banshee', 'Hybrid Destroyer', 'Dark Voice', 'Urubu', 'Lyote', 'Automaton 2000',
34
+ 'Orian', 'Wolf Marine', 'Murloc Marine', 'Worgen Marine', 'Goblin Marine', 'Zealot Chef',
35
+ 'Stank', 'Ornatus', 'Facebook Corps Members', 'Lion Marines', 'Dragons', 'Raynor Marine',
36
+ # SPRITESHEET 4
37
+ 'Urun', 'Nyon', 'Executor', 'Mohandar', 'Selendis', 'Artanis',
38
+ 'Drone', 'Infested Colonist', 'Infested Marine', 'Corruptor', 'Aberration', 'Broodlord',
39
+ 'Overmind', 'Leviathan', 'Overlord', 'Hydralisk Marine', "Zer'atai Dark Templar", 'Goliath',
40
+ 'Lenassa Dark Templar', 'Mira Han', 'Archon', 'Hybrid Reaver', 'Predator', 'Unknown',
41
+ 'Zergling', 'Roach', 'Baneling', 'Hydralisk', 'Queen', 'Infestor',
42
+ 'Ultralisk', 'Queen of Blades', 'Marine', 'Marauder', 'Medivac', 'Siege Tank',
43
+ # SPRITESHEET 5
44
+ 'Level 3 Zealot', 'Level 5 Stalker', 'Level 8 Sentinel', 'Level 11 Immortal', 'Level 14 Oracle', 'Level 17 High Templar',
45
+ 'Level 21 Tempest', 'Level 23 Colossus', 'Level 27 Carrier', 'Level 29 Zeratul', 'Level 3 Marine', 'Level 5 Marauder',
46
+ 'Level 8 Hellbat', 'Level 11 Widow Mine', 'Level 14 Medivac', 'Level 17 Banshee', 'Level 21 Ghost', 'Level 23 Thor',
47
+ 'Level 27 Battlecruiser', 'Level 29 Raynor', 'Level 11 Locust', 'Level 3 Zergling', 'Level 5 Roach', 'Level 8 Hydralisk',
48
+ 'Level 14 Swarm Host', 'Level 17 Infestor', 'Level 21 Viper', 'Level 23 Broodlord', 'Level 27 Ultralisk', 'Level 29 Kerrigan',
49
+ 'Protoss Champion',' Terran Champion', 'Zerg Champion', '', '', ''
50
+ ]
51
+ attr_reader :name, :sheet, :row, :column
52
+ def initialize sheet, pixel_size, pixel_column, pixel_row
53
+ @sheet = sheet
54
+ @column = pixel_column / pixel_size
55
+ @row = pixel_row / pixel_size
56
+ @name = name_from_position
57
+ end
58
+
59
+ def name_from_position
60
+ index = (@sheet * 36) + image_position
61
+ NAMES[index]
62
+ end
63
+
64
+ # @return [String] The URL to the portrait image iteslf
65
+ def url
66
+ "http://media.blizzard.com/sc2/portraits/#{@sheet}-#{image_position}.jpg"
67
+ end
68
+
69
+ # @return [String] The URL to the spritesheet the portrait is part of
70
+ def spritesheet_url
71
+ "http://media.blizzard.com/sc2/portraits/#{@sheet}-90.jpg"
72
+ end
73
+
74
+ # The image position within a given 6x6 spritesheet
75
+ #
76
+ # @return [Fixnum] image position within the spritesheet
77
+ def image_position
78
+ (@row * 6) + @column
79
+ end
80
+ end
81
+ end
82
+ end
@@ -1,4 +1,5 @@
1
1
  require 'bnet_scraper/starcraft2/profile'
2
+ require 'bnet_scraper/starcraft2/portrait'
2
3
 
3
4
  module BnetScraper
4
5
  module Starcraft2
@@ -82,15 +83,9 @@ module BnetScraper
82
83
  # is the position within the spritesheet
83
84
  #
84
85
  # @param [Nokogiri::XML] html node
85
- # @return [String] Portrait name
86
+ # @return [BnetScraper::Starcraft2::Portrait] Portrait containing spritesheet information
86
87
  def get_portrait html
87
- @profile.portrait = begin
88
- portrait_info = extract_portrait_info html
89
- position = get_portrait_position html, portrait_info
90
- PORTRAITS[portrait_info[0].to_i][position-1]
91
- rescue
92
- nil
93
- end
88
+ @profile.portrait = Portrait.new(*extract_portrait_info(html))
94
89
  end
95
90
 
96
91
  # Extracts portrait information (spritesheet page, portsize size, X, Y) from HTML page
@@ -98,21 +93,7 @@ module BnetScraper
98
93
  # @param [Nokogiri::XML] html node
99
94
  # @return [Fixnum, Fixnum, Fixnum, Fixnum] Array of sprite information
100
95
  def extract_portrait_info html
101
- html.css("#portrait .icon-frame").attr('style').to_s.scan(/url\('.+(\d+)-(\d+)\.jpg'\) ([\-\d]+)px ([\-\d]+)px/).flatten
102
- end
103
-
104
- # Translates x/y positions of the background spritesheet into an array index. There are
105
- # 6 pictures per row, but X/Y is in pixels, so account for portrait size in the incrementor
106
- #
107
- # @param [Nokogiri::HTML] html node
108
- # @param [Fixnum] size of portrait in pixels
109
- # @return [Fixnum] index position of portrait spritesheet
110
- def get_portrait_position html, portrait_info
111
- size = portrait_info[1].to_i
112
- x = portrait_info[2].to_i
113
- y = portrait_info[3].to_i
114
-
115
- ((-y/size) * 6) + (-x/size + 1)
96
+ html.css("#portrait .icon-frame").attr('style').to_s.scan(/url\('.+(\d+)-(\d+)\.jpg'\) -{0,1}(\d+)px -{0,1}(\d+)px/).flatten.map(&:to_i)
116
97
  end
117
98
 
118
99
  # Extracts the current and highest ever solo league achieved
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ describe BnetScraper::Starcraft2::GrandmasterScraper do
4
+ describe '#scrape' do
5
+ let(:scraper) { BnetScraper::Starcraft2::GrandmasterScraper.new(region: :us) }
6
+ subject { scraper }
7
+ before do
8
+ VCR.use_cassette('grandmaster_na', record: :new_episodes) do
9
+ scraper.scrape
10
+ end
11
+ end
12
+ it { should have(200).players }
13
+
14
+ context 'player statistics' do
15
+ let(:player) { scraper.players[0] }
16
+
17
+ it 'should have rank 1' do
18
+ player[:rank].should == '1st'
19
+ end
20
+
21
+ it 'should have a race' do
22
+ player[:race].should == 'zerg'
23
+ end
24
+
25
+ it 'should have a name' do
26
+ player[:name].should == '[Qntc] QuanticHyuN'
27
+ end
28
+
29
+ it 'should have points' do
30
+ player[:points].should == '953'
31
+ end
32
+
33
+ it 'should have wins' do
34
+ player[:wins].should == '71'
35
+ end
36
+
37
+ it 'should have losses' do
38
+ player[:losses].should == '11'
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe BnetScraper::Starcraft2::Portrait do
4
+ subject { BnetScraper::Starcraft2::Portrait.new(3, 90, 360, 0) }
5
+ its(:name) { should == 'Selendis' }
6
+ its(:sheet) { should == 3 }
7
+ its(:row) { should == 0 }
8
+ its(:column) { should == 4 }
9
+ its(:image_position) { should == 4 }
10
+ its(:url) { should == 'http://media.blizzard.com/sc2/portraits/3-4.jpg' }
11
+ its(:spritesheet_url) { should == 'http://media.blizzard.com/sc2/portraits/3-90.jpg' }
12
+ end
@@ -9,12 +9,14 @@ describe BnetScraper::Starcraft2::ProfileScraper do
9
9
  let(:scraper) { BnetScraper::Starcraft2::ProfileScraper.new(bnet_id: '2377239', account: 'Demon') }
10
10
 
11
11
  describe '#scrape' do
12
- subject do
12
+ let(:output) do
13
13
  VCR.use_cassette('demon_profile', record: :new_episodes) do
14
14
  scraper.scrape
15
15
  end
16
16
  end
17
17
 
18
+ subject { output }
19
+
18
20
  its(:achievement_points) { should == '4890' }
19
21
  its(:current_solo_league) { should == 'None' }
20
22
  its(:highest_solo_league) { should == 'Platinum' }
@@ -22,11 +24,15 @@ describe BnetScraper::Starcraft2::ProfileScraper do
22
24
  its(:highest_team_league) { should == 'Master' }
23
25
  its(:career_games) { should == '1804' }
24
26
  its(:games_this_season) { should == '27' }
25
- its(:portrait) { should == 'Mohandar' }
26
27
  its(:terran_swarm_level) { should == 0 }
27
28
  its(:protoss_swarm_level) { should == 12 }
28
29
  its(:zerg_swarm_level) { should == 0 }
29
30
 
31
+ it 'should have a scraped portrait' do
32
+ output.portrait.name.should == 'Mohandar'
33
+ output.portrait.url.should == 'http://media.blizzard.com/sc2/portraits/3-3.jpg'
34
+ end
35
+
30
36
  context 'first league ever' do
31
37
  let(:scraper) { BnetScraper::Starcraft2::ProfileScraper.new url: 'http://us.battle.net/sc2/en/profile/3513522/1/Heritic/' }
32
38
 
@@ -0,0 +1,456 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://us.battle.net/sc2/en/ladder/grandmaster/heart-of-the-swarm
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ user-agent:
11
+ - Faraday v0.8.7
12
+ accept-encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ accept:
15
+ - ! '*/*'
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ date:
22
+ - Fri, 10 May 2013 04:17:31 GMT
23
+ server:
24
+ - Apache
25
+ x-frame-options:
26
+ - SAMEORIGIN
27
+ set-cookie:
28
+ - perm=1; Domain=battle.net; Path=/
29
+ content-language:
30
+ - en-US
31
+ vary:
32
+ - Accept-Encoding
33
+ content-encoding:
34
+ - gzip
35
+ connection:
36
+ - close
37
+ transfer-encoding:
38
+ - chunked
39
+ content-type:
40
+ - application/xhtml+xml;charset=UTF-8
41
+ body:
42
+ encoding: ASCII-8BIT
43
+ string: !binary |-
44
+ H4sIAAAAAAAAA+y963LbSLIu+rsnYt4BzV6xZZ/dvOBKwm55QpZsWW3Jdlty
45
+ d093MDpAskTCAgEOAOri2R2xf5yXOP9W7B874sSJ2A8xj7Ke5GRWFcgCRckp
46
+ lewlCKtnLYu4fVko5FeZWVmXHyb5NDLOp1GcbTYmeT570m6fnZ21zuxWko7b
47
+ pu/77XO8p4E3PYmCeLzZYHFznjWMYRRkWXH07K9/+WHCgpHAepKMF3DJeNaa
48
+ snacfdeQF48Hly+2jwffcZA8zCP2bDcN4tE0yHKWGvssGM+Z0TR2gykzdufh
49
+ CA8O8yDdToPj3Njb+6EtnoLHpywPjGES5yzONxvHQZSxhoHCmuwf8/B0sxFO
50
+ gzHLkyQaBGnDaF9+Zu/FJhuN2ffDSZpM2aZZfvzX5oet5nYynQV5OIiYRIjC
51
+ +MRIWbTZyCZJmg/nuRECIDyasuPNRjsbWu0sh0eG7SgZBlFzmEynSdzmhYF3
52
+ D07x9gzva8GvhpFfzJgsa/u8ybFWBbEgHU6KO4PZLAqHIABAkxmLxdURy4Zp
53
+ OMOz//0cv6Eojqz7edYaBDnUWytmeZt/xvYoyAMFAOCxYjcbzxc3Gofyymp5
54
+ 8ouIZRPG8qJMOTvP28MMNGXKRmEAhYyiz9YI3N8WP1vw82+njislfdts/h4e
55
+ G3sv+s+MLym2GbJVyb+zeBQe95vNUjkM78uXxCMWpfvli9K9tihcttSVBTP/
56
+ 9X/+9e97e8DVN+wsK0ljcfuYsVE75hcuq3CQJ1Ohsfx9ggjagTjI2SUS3PpF
57
+ 8d2QbfylLPcO1RmRo2A0Yqn8syLjzhVZvspCca2vprhLyR5R9J0p6lJ091rR
58
+ ogFUwT8Gp4E42zCydHiN/n/M2vkkTEfNWZDmF+2P/5iz9KL1UbDg2Q9tgXIH
59
+ UoZJyr4ELpq5PJythV5Rh2slwf3tNlTs9s7W0dbvf/1Lnl4Y/zRGyXA+BZPZ
60
+ YudsCCZxCib70cbzYHgyTpN5PNpD67UdDCds43uDW+LvjTyds8fGnwbwfDh5
61
+ BD//+Sdi9/tYJLV09I+4WrhtrExRIR/SyNg0NpQq2nha3DAJUjY6LG4r31Wq
62
+ yMUjgyBjKiJbXpqlyUc2zJWri0vDUSxPS7PL9bo1iMJPn4J01AIhy0LNZzNw
63
+ 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
453
+ 8tpypZMf2tjP/uz/FwAAAP//AwDOa6eLf9ACAA==
454
+ http_version: '1.1'
455
+ recorded_at: Fri, 10 May 2013 04:17:31 GMT
456
+ recorded_with: VCR 2.4.0
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bnet_scraper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-29 00:00:00.000000000 Z
12
+ date: 2013-05-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -146,19 +146,23 @@ files:
146
146
  - lib/bnet_scraper/starcraft2/achievement.rb
147
147
  - lib/bnet_scraper/starcraft2/achievement_scraper.rb
148
148
  - lib/bnet_scraper/starcraft2/base_scraper.rb
149
+ - lib/bnet_scraper/starcraft2/grandmaster_scraper.rb
149
150
  - lib/bnet_scraper/starcraft2/league.rb
150
151
  - lib/bnet_scraper/starcraft2/league_scraper.rb
151
152
  - lib/bnet_scraper/starcraft2/match.rb
152
153
  - lib/bnet_scraper/starcraft2/match_history_scraper.rb
154
+ - lib/bnet_scraper/starcraft2/portrait.rb
153
155
  - lib/bnet_scraper/starcraft2/profile.rb
154
156
  - lib/bnet_scraper/starcraft2/profile_scraper.rb
155
157
  - lib/bnet_scraper/starcraft2/status_scraper.rb
156
158
  - spec/spec_helper.rb
157
159
  - spec/starcraft2/achievement_scraper_spec.rb
158
160
  - spec/starcraft2/base_scraper_spec.rb
161
+ - spec/starcraft2/grandmaster_scraper_spec.rb
159
162
  - spec/starcraft2/league_scraper_spec.rb
160
163
  - spec/starcraft2/league_spec.rb
161
164
  - spec/starcraft2/match_history_scraper_spec.rb
165
+ - spec/starcraft2/portrait_spec.rb
162
166
  - spec/starcraft2/profile_scraper_spec.rb
163
167
  - spec/starcraft2/profile_spec.rb
164
168
  - spec/starcraft2/status_scraper_spec.rb
@@ -170,6 +174,7 @@ files:
170
174
  - spec/support/fixtures/vcr_cassettes/demon_profile.yml
171
175
  - spec/support/fixtures/vcr_cassettes/demon_profile_leagues.yml
172
176
  - spec/support/fixtures/vcr_cassettes/full_demon_scrape.yml
177
+ - spec/support/fixtures/vcr_cassettes/grandmaster_na.yml
173
178
  - spec/support/fixtures/vcr_cassettes/invalid_achievement.yml
174
179
  - spec/support/fixtures/vcr_cassettes/invalid_leagues.yml
175
180
  - spec/support/fixtures/vcr_cassettes/invalid_matches.yml
@@ -207,9 +212,11 @@ test_files:
207
212
  - spec/spec_helper.rb
208
213
  - spec/starcraft2/achievement_scraper_spec.rb
209
214
  - spec/starcraft2/base_scraper_spec.rb
215
+ - spec/starcraft2/grandmaster_scraper_spec.rb
210
216
  - spec/starcraft2/league_scraper_spec.rb
211
217
  - spec/starcraft2/league_spec.rb
212
218
  - spec/starcraft2/match_history_scraper_spec.rb
219
+ - spec/starcraft2/portrait_spec.rb
213
220
  - spec/starcraft2/profile_scraper_spec.rb
214
221
  - spec/starcraft2/profile_spec.rb
215
222
  - spec/starcraft2/status_scraper_spec.rb
@@ -221,6 +228,7 @@ test_files:
221
228
  - spec/support/fixtures/vcr_cassettes/demon_profile.yml
222
229
  - spec/support/fixtures/vcr_cassettes/demon_profile_leagues.yml
223
230
  - spec/support/fixtures/vcr_cassettes/full_demon_scrape.yml
231
+ - spec/support/fixtures/vcr_cassettes/grandmaster_na.yml
224
232
  - spec/support/fixtures/vcr_cassettes/invalid_achievement.yml
225
233
  - spec/support/fixtures/vcr_cassettes/invalid_leagues.yml
226
234
  - spec/support/fixtures/vcr_cassettes/invalid_matches.yml
@@ -230,4 +238,3 @@ test_files:
230
238
  - spec/support/fixtures/vcr_cassettes/profile_not_laddered.yml
231
239
  - spec/support/fixtures/vcr_cassettes/realm_status.yml
232
240
  - spec/support/shared/sc2_scraper.rb
233
- has_rdoc: