hearthstone_api 1.0.3

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 (46) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/Gemfile +3 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +259 -0
  6. data/Rakefile +2 -0
  7. data/hearthstone_api.gemspec +34 -0
  8. data/lib/hearthstone_api.rb +18 -0
  9. data/lib/hearthstone_api/base_model.rb +21 -0
  10. data/lib/hearthstone_api/cardbacks.rb +7 -0
  11. data/lib/hearthstone_api/cards.rb +39 -0
  12. data/lib/hearthstone_api/configuration.rb +23 -0
  13. data/lib/hearthstone_api/connection.rb +4 -0
  14. data/lib/hearthstone_api/exceptions.rb +6 -0
  15. data/lib/hearthstone_api/info.rb +7 -0
  16. data/lib/hearthstone_api/request.rb +31 -0
  17. data/lib/hearthstone_api/version.rb +3 -0
  18. data/spec/hearthstone_api/cardbacks_spec.rb +20 -0
  19. data/spec/hearthstone_api/cards_spec.rb +192 -0
  20. data/spec/hearthstone_api/hearthstone_api_spec.rb +7 -0
  21. data/spec/hearthstone_api/info_spec.rb +21 -0
  22. data/spec/spec_helper.rb +17 -0
  23. data/spec/support/vcr_cassettes/hearthstone_api/cardbacks.yml +186 -0
  24. data/spec/support/vcr_cassettes/hearthstone_api/cardbacks/options.yml +57 -0
  25. data/spec/support/vcr_cassettes/hearthstone_api/cards.yml +5366 -0
  26. data/spec/support/vcr_cassettes/hearthstone_api/cards/classes.yml +105 -0
  27. data/spec/support/vcr_cassettes/hearthstone_api/cards/classes/options.yml +105 -0
  28. data/spec/support/vcr_cassettes/hearthstone_api/cards/faction.yml +155 -0
  29. data/spec/support/vcr_cassettes/hearthstone_api/cards/options.yml +471 -0
  30. data/spec/support/vcr_cassettes/hearthstone_api/cards/quality.yml +403 -0
  31. data/spec/support/vcr_cassettes/hearthstone_api/cards/quality/options.yml +403 -0
  32. data/spec/support/vcr_cassettes/hearthstone_api/cards/races.yml +85 -0
  33. data/spec/support/vcr_cassettes/hearthstone_api/cards/races/options.yml +85 -0
  34. data/spec/support/vcr_cassettes/hearthstone_api/cards/search.yml +147 -0
  35. data/spec/support/vcr_cassettes/hearthstone_api/cards/set.yml +44 -0
  36. data/spec/support/vcr_cassettes/hearthstone_api/cards/set/options.yml +44 -0
  37. data/spec/support/vcr_cassettes/hearthstone_api/cards/sets.yml +710 -0
  38. data/spec/support/vcr_cassettes/hearthstone_api/cards/sets/options.yml +396 -0
  39. data/spec/support/vcr_cassettes/hearthstone_api/cards/single/id.yml +48 -0
  40. data/spec/support/vcr_cassettes/hearthstone_api/cards/single/id/options.yml +89 -0
  41. data/spec/support/vcr_cassettes/hearthstone_api/cards/single/name.yml +48 -0
  42. data/spec/support/vcr_cassettes/hearthstone_api/cards/type.yml +882 -0
  43. data/spec/support/vcr_cassettes/hearthstone_api/cards/type/options.yml +120 -0
  44. data/spec/support/vcr_cassettes/hearthstone_api/info.yml +92 -0
  45. data/spec/support/vcr_cassettes/hearthstone_api/info/options.yml +46 -0
  46. metadata +249 -0
@@ -0,0 +1,23 @@
1
+ module HearthstoneApi
2
+ module Configuration
3
+ attr_accessor :endpoint
4
+ attr_accessor :api_key
5
+
6
+ DEFAULT_ENDPOINT = "https://omgvamp-hearthstone-v1.p.mashape.com"
7
+ DEFAULT_API_KEY = ENV["HEARTHSTONE_API_KEY"]
8
+
9
+ def self.extended(base)
10
+ base.reset
11
+ end
12
+
13
+ def reset
14
+ self.endpoint = DEFAULT_ENDPOINT
15
+ self.api_key = DEFAULT_API_KEY
16
+ raise HearthstoneApi::NoApiKeyError.new "No API key set." unless api_key
17
+ end
18
+
19
+ def configure
20
+ yield self
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,4 @@
1
+ module HearthstoneApi
2
+ module Connection
3
+ end
4
+ end
@@ -0,0 +1,6 @@
1
+ module HearthstoneApi
2
+ class Error < StandardError; end
3
+ class ResponseError < Error; end
4
+ class UnsupportedMethodError < Error; end
5
+ class NoApiKeyError < Error; end
6
+ end
@@ -0,0 +1,7 @@
1
+ module HearthstoneApi
2
+ class Info < BaseModel
3
+ def self.all(options = {})
4
+ get "/info", options
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,31 @@
1
+ module HearthstoneApi
2
+ module Request
3
+ require "uri"
4
+
5
+ def get(path, options = {})
6
+ response = request(:get, path, options)
7
+ raise HearthstoneApi::ResponseError.new unless response.code == 200
8
+ return response
9
+ end
10
+
11
+ private
12
+
13
+ def headers
14
+ { "X-Mashape-Key" => HearthstoneApi.api_key }
15
+ end
16
+
17
+ def request(method, path, options = {})
18
+ case method
19
+ when :get
20
+ options = { headers: headers, query: options }
21
+
22
+ response = HearthstoneApi.get(
23
+ URI.encode(endpoint + path),
24
+ options
25
+ )
26
+ else
27
+ raise HearthstoneApi::UnsupportedMethodError.new
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,3 @@
1
+ module HearthstoneApi
2
+ VERSION = "1.0.3"
3
+ end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+
3
+ describe HearthstoneApi::Cardbacks do
4
+ let(:cardbacks) { described_class }
5
+ let(:locale) { "jaJP" }
6
+
7
+ describe "all cardbacks" do
8
+ it "returns cards" do
9
+ VCR.use_cassette("hearthstone_api/cardbacks") do
10
+ expect(cardbacks.all).to_not be_empty
11
+ end
12
+ end
13
+
14
+ it "accepts options" do
15
+ VCR.use_cassette("hearthstone_api/cardbacks/options") do
16
+ expect(cardbacks.all(locale: locale).first["locale"]).to eq(locale)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,192 @@
1
+ require "spec_helper"
2
+
3
+ describe HearthstoneApi::Cards do
4
+ let(:cards) { described_class }
5
+
6
+ describe "all cards" do
7
+ let(:option) { "attack" }
8
+
9
+ it "returns cards" do
10
+ VCR.use_cassette("hearthstone_api/cards") do
11
+ expect(cards.all).to_not be_empty
12
+ end
13
+ end
14
+
15
+ it "accepts options" do
16
+ VCR.use_cassette("hearthstone_api/cards/options") do
17
+ query = cards.all(option => 1)
18
+ option_values = query[query.keys.first].collect{ |c| c[option] }.uniq
19
+ expect(option_values).to eq([1])
20
+ end
21
+ end
22
+ end
23
+
24
+ describe "class cards" do
25
+ let(:klass) { "Paladin" }
26
+ let(:option) { "cost" }
27
+
28
+ it "returns class cards" do
29
+ VCR.use_cassette("hearthstone_api/cards/classes") do
30
+ query = cards.classes(klass, option => 1)
31
+ class_values = query.collect{ |c| c["playerClass"] }.uniq
32
+ expect(class_values).to eq([klass])
33
+ end
34
+ end
35
+
36
+ it "accepts options" do
37
+ VCR.use_cassette("hearthstone_api/cards/classes/options") do
38
+ query = cards.classes(klass, option => 1)
39
+ option_values = query.collect { |c| c[option] }.uniq
40
+ expect(option_values).to eq([1])
41
+ end
42
+ end
43
+ end
44
+
45
+ describe "single card" do
46
+ context "when finding by id" do
47
+ let(:id) { "EX1_572" }
48
+ let(:locale) { "jaJP" }
49
+
50
+ it "returns the card" do
51
+ VCR.use_cassette("hearthstone_api/cards/single/id") do
52
+ query = cards.single(id)
53
+ expect(query.first["cardId"]).to eq(id)
54
+ end
55
+ end
56
+
57
+ it "accepts options" do
58
+ VCR.use_cassette("hearthstone_api/cards/single/id/options") do
59
+ query = cards.single(id, locale: locale)
60
+ expect(query.first["locale"]).to eq(locale)
61
+ end
62
+ end
63
+ end
64
+
65
+ context "when finding by name" do
66
+ let(:name) { "Ysera" }
67
+ let(:locale) { "jaJP" }
68
+ let(:locale_name) { "イセラ" }
69
+
70
+ it "returns the card" do
71
+ VCR.use_cassette("hearthstone_api/cards/single/name") do
72
+ query = cards.single(name)
73
+ expect(query.first["name"]).to eq(name)
74
+ end
75
+ end
76
+
77
+ it "accepts options" do
78
+ VCR.use_cassette("hearthstone_api/cards/single/id/options") do
79
+ query = cards.single(name, locale: locale)
80
+ expect(query.first["name"]).to eq(locale_name)
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ describe "type of card" do
87
+ let(:type) { "Weapon" }
88
+ let(:locale) { "jaJP" }
89
+
90
+ it "returns cards by type" do
91
+ VCR.use_cassette("hearthstone_api/cards/type") do
92
+ query = cards.type(type, locale: locale)
93
+ expect(query.first["type"]).to eq(type)
94
+ end
95
+ end
96
+
97
+ it "accepts options" do
98
+ VCR.use_cassette("hearthstone_api/cards/type/options") do
99
+ query = cards.type(type, locale: locale)
100
+ expect(query.first["locale"]).to eq(locale)
101
+ end
102
+ end
103
+ end
104
+
105
+ describe "cards by set" do
106
+ let(:set) { "Classic" }
107
+ let(:locale) { "jaJP" }
108
+
109
+ it "returns cards by set" do
110
+ VCR.use_cassette("hearthstone_api/cards/sets") do
111
+ query = cards.sets(set, locale: locale)
112
+ expect(query.first["cardSet"]).to eq(set)
113
+ end
114
+ end
115
+
116
+ it "accepts options" do
117
+ VCR.use_cassette("hearthstone_api/cards/sets/options") do
118
+ query = cards.sets(set, locale: locale)
119
+ expect(query.first["locale"]).to eq(locale)
120
+ end
121
+ end
122
+ end
123
+
124
+ describe "cards by race" do
125
+ let(:race) { "Murloc" }
126
+ let(:locale) { "jaJP" }
127
+
128
+ it "returns cards by race" do
129
+ VCR.use_cassette("hearthstone_api/cards/races") do
130
+ query = cards.races(race, locale: locale)
131
+ expect(query.first["race"]).to eq(race)
132
+ end
133
+ end
134
+
135
+ it "accepts options" do
136
+ VCR.use_cassette("hearthstone_api/cards/races/options") do
137
+ query = cards.races(race, locale: locale)
138
+ expect(query.first["locale"]).to eq(locale)
139
+ end
140
+ end
141
+ end
142
+
143
+ describe "cards by quality" do
144
+ let(:quality) { "Legendary" }
145
+ let(:locale) { "jaJP" }
146
+
147
+ it "returns cards by quality" do
148
+ VCR.use_cassette("hearthstone_api/cards/quality") do
149
+ query = cards.qualities(quality, locale: locale)
150
+ expect(query.first["rarity"]).to eq(quality)
151
+ end
152
+ end
153
+
154
+ it "accepts options" do
155
+ VCR.use_cassette("hearthstone_api/cards/quality/options") do
156
+ query = cards.qualities(quality, locale: locale)
157
+ expect(query.first["locale"]).to eq(locale)
158
+ end
159
+ end
160
+ end
161
+
162
+ describe "cards by faction" do
163
+ let(:faction) { "Horde" }
164
+ let(:locale) { "jaJP" }
165
+
166
+ it "returns cards by faction" do
167
+ VCR.use_cassette("hearthstone_api/cards/faction") do
168
+ query = cards.factions(faction)
169
+ expect(query.first["faction"]).to eq(faction)
170
+ end
171
+ end
172
+
173
+ it "accepts options" do
174
+ VCR.use_cassette("hearthstone_api/cards/faction/options") do
175
+ query = cards.factions(faction, locale: locale)
176
+ expect(query.first["locale"]).to eq(locale)
177
+ end
178
+ end
179
+ end
180
+
181
+ describe "search" do
182
+ let(:search_term) { "Onyxia" }
183
+ let(:locale) { "jaJP" }
184
+
185
+ it "returns cards by partial search" do
186
+ VCR.use_cassette("hearthstone_api/cards/search") do
187
+ query = cards.search(search_term.slice(0...4))
188
+ expect(query.first["name"]).to eq(search_term)
189
+ end
190
+ end
191
+ end
192
+ end
@@ -0,0 +1,7 @@
1
+ require "spec_helper"
2
+
3
+ describe HearthstoneApi do
4
+ it "is a module" do
5
+ expect(described_class).to be_a_kind_of(Module)
6
+ end
7
+ end
@@ -0,0 +1,21 @@
1
+ require "spec_helper"
2
+
3
+ describe HearthstoneApi::Info do
4
+ let(:info) { described_class }
5
+ let(:locale) { "jaJP" }
6
+
7
+ describe "all cards" do
8
+ it "returns info" do
9
+ VCR.use_cassette("hearthstone_api/info") do
10
+ expect(info.all).to_not be_empty
11
+ end
12
+ end
13
+
14
+ it "accepts options" do
15
+ VCR.use_cassette("hearthstone_api/info/options") do
16
+ query = info.all(locale: locale)
17
+ expect(query["classes"]).to include("ドルイド")
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,17 @@
1
+ require "hearthstone_api"
2
+ require "rspec"
3
+ require "vcr"
4
+ require "byebug"
5
+ require "dotenv"
6
+
7
+ VCR.configure do |c|
8
+ c.cassette_library_dir = "spec/support/vcr_cassettes"
9
+ c.hook_into :webmock
10
+ c.configure_rspec_metadata!
11
+ c.allow_http_connections_when_no_cassette = false
12
+ c.default_cassette_options = {:record => :new_episodes}
13
+ end
14
+
15
+ RSpec.configure do |config|
16
+ Dotenv.load
17
+ end
@@ -0,0 +1,186 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://omgvamp-hearthstone-v1.p.mashape.com/cardbacks
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ X-Mashape-Key:
11
+ - DoDCP9IGmDmsh0Uy8eEE3sP90fLIp1ufwa2jsnymHi6MOLR9Rk
12
+ response:
13
+ status:
14
+ code: 200
15
+ message: OK
16
+ headers:
17
+ Cache-Control:
18
+ - private, must-revalidate
19
+ Content-Type:
20
+ - application/json
21
+ Date:
22
+ - Wed, 04 May 2016 18:58:01 GMT
23
+ Expires:
24
+ - "-1"
25
+ Pragma:
26
+ - no-cache
27
+ Server:
28
+ - Mashape/5.0.6
29
+ Set-Cookie:
30
+ - XSRF-TOKEN=eyJpdiI6ImtZNmNjR0xwZVlrVjN3NUE4aldcL0NRPT0iLCJ2YWx1ZSI6IlhRUWhcLzNyMFpadm5oeTk2bzZNV1hxclVUSXMzMCtKZFU3SUVURWY1NVZiOVhTdEJZYkxTRGxKWXlyWTYwRFJQWEhpOTNcL3djMElqaXBiRmVsNXlrMGc9PSIsIm1hYyI6ImMwYWYxNzEyNTQxYzA4YTM2MWMzZDg0ZjZjMWQ4YTVmYjI1MDg1NTJjZGE3MmY1ODIyOTI5MDM5NzQ2NjhmYWMifQ%3D%3D;
31
+ expires=Wed, 04-May-2016 20:58:01 GMT; Max-Age=7200; path=/
32
+ - laravel_session=eyJpdiI6InJEUDN1QjhOZG9pV3dnRWE4M0VPd0E9PSIsInZhbHVlIjoia0J2eWdrTXh2VzFaU09WYVZDelFLSTRqUll1bTRFZm5tMjRXS1hwVTVLcDQ3YWhZZFRKY1pweVg2Z1VVZDBVMWt3bkp4RzhNNXhyeUpxQVwvXC9yTkQ5dz09IiwibWFjIjoiNDlhODAxNGMwMjQ2MTRjZmU4MjMyNGJlNTVkOTlkMzM4MDAxOGU2MmE2NTgyMDVhODA5NDg4MDAzNzY0NDllOCJ9;
33
+ expires=Wed, 04-May-2016 20:58:01 GMT; Max-Age=7200; path=/; httponly
34
+ X-Powered-By:
35
+ - PHP/5.6.13
36
+ Transfer-Encoding:
37
+ - chunked
38
+ Connection:
39
+ - keep-alive
40
+ body:
41
+ encoding: UTF-8
42
+ string: '[{"cardBackId":"0","name":"Classic","description":"The only card back
43
+ you\u2019ll ever need.","source":"startup","sourceDescription":"Default","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Default.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Default.gif","sortCategory":"1","sortOrder":"1","locale":"enUS"},{"cardBackId":"1","name":"Pandaria","description":"Hearthstone
44
+ is a very popular game in Pandaria. Official card game of the Shado-Pan!","source":"season","sourceDescription":"Season","howToGet":"Acquired
45
+ from achieving Rank 20 in Ranked Play, April 2014.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Pandaria.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Pandaria.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"2","name":"Black
46
+ Temple","description":"\u201cFel Flame Green\u201d is always in fashion at
47
+ the Black Temple.","source":"season","sourceDescription":"Season","howToGet":"Acquired
48
+ from achieving Rank 20 in Ranked Play, May 2014.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_BlackTemple.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_BlackTemple.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"3","name":"Rainbow!","description":"Unfortunately,
49
+ the rainbow generator can only produce oval rainbows. Gnomish technology
50
+ still has a ways to go.","source":"season","sourceDescription":"Season","howToGet":"Acquired
51
+ from achieving Rank 20 in Ranked Play, June 2014.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Charm.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Charm.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"4","name":"Fireside","description":"A
52
+ generous gift from the Innkeeper. He loves to see his guests having a good
53
+ time together.","source":"achieve","sourceDescription":"Special","howToGet":"Play
54
+ three matches against players on the same local network as you. (Must have
55
+ at least 3 players on that network!)","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Launch.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Launch.gif","sortCategory":"2","sortOrder":"1","locale":"enUS"},{"cardBackId":"5","name":"Legend","description":"Wow. Hardcore.","source":"achieve","sourceDescription":"Legend","howToGet":"Acquired
56
+ from achieving Legend Rank in Ranked Play.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Legend.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Legend.gif","sortCategory":"6","sortOrder":"1","locale":"enUS"},{"cardBackId":"6","name":"Naxxramas","description":"The
57
+ gooey center is Ooze slime. Don\u2019t lick it.","source":"season","sourceDescription":"Season","howToGet":"Acquired
58
+ from achieving Rank 20 in Ranked Play, July 2014.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Naxxramas.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Naxxramas.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"7","name":"Heroic
59
+ Naxxramas","description":"You can tell a lot about an Abomination by his stitching. This
60
+ one just screams \u201cinsane\u201d. Literally.","source":"fixed_reward","sourceDescription":"Adventure","howToGet":"Acquired
61
+ from completing the Curse of Naxxramas in Heroic mode.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Naxxramas2.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Naxxramas2.gif","sortCategory":"3","sortOrder":"1","locale":"enUS"},{"cardBackId":"8","name":"Icecrown","description":"In
62
+ the frozen heart of Icecrown Citadel, a hero\u2019s mettle will be tested. Bring
63
+ a parka.","source":"season","sourceDescription":"Season","howToGet":"Acquired
64
+ from achieving Rank 20 in Ranked Play, August 2014.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_IceCrown.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_IceCrown.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"9","name":"Pirates!","description":"Treasure. Grog. Hooks
65
+ for hands. Way better than Ninjas!","source":"season","sourceDescription":"Season","howToGet":"Acquired
66
+ from achieving Rank 20 in Ranked Play, September 2014.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Pirate.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Pirate.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"10","name":"Hallow''s
67
+ End","description":"The Hallow\u2019s End candy bucket! Or the Headless Horseman\u2019s
68
+ spare head! Stick your hand in and find out.","source":"season","sourceDescription":"Season","howToGet":"Acquired
69
+ from achieving Rank 20 in Ranked Play, October 2014.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Hallows_End.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Hallows_End.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"11","name":"Goblins","description":"4
70
+ out of 5 goblins agree: This card back doesn\u2019t explode!","source":"season","sourceDescription":"Season","howToGet":"Acquired
71
+ from achieving Rank 20 in Ranked Play, November 2014.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Goblin.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Goblin.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"12","name":"Blizzard
72
+ 2014","description":"The year Hearthstone was born. What a great year!","source":"achieve","sourceDescription":"Special","howToGet":"Acquired
73
+ by participating in Blizzard events during 2014.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Blizzard2014.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Blizzard2014.gif","sortCategory":"11","sortOrder":"1","locale":"enUS"},{"cardBackId":"13","name":"Dalaran
74
+ Flame","description":"Mascot of Dalaran University. Rarely seen, because
75
+ no one ever shows up to football games there.","source":"achieve","sourceDescription":"Special","howToGet":"Acquired
76
+ by participating in TeSPA or other college affiliate program.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_TeSPA.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_TeSPA.gif","sortCategory":"7","sortOrder":"1","locale":"enUS"},{"cardBackId":"14","name":"Warlords","description":"When
77
+ they aren\u2019t plotting to kill everyone and take over the world, even the
78
+ Iron Horde enjoy a game of Hearthstone.","source":"achieve","sourceDescription":"Special","howToGet":"Acquired
79
+ from Warlords of Draenor Digital Deluxe Edition.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Warlords_of_Draenor.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Warlords_of_Draenor.gif","sortCategory":"8","sortOrder":"2","locale":"enUS"},{"cardBackId":"15","name":"Gnomes","description":"This
80
+ multifunctional device also works as a gnomish army knife, a shoe horn and
81
+ a pass to the Deeprun Tram. Gnomish ingenuity!","source":"season","sourceDescription":"Season","howToGet":"Acquired
82
+ from achieving Rank 20 in Ranked Play, December 2014.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Gnome.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Gnome.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"16","name":"Maraad","description":"Vindicator
83
+ Maraad was a paladin of great courage and strength. Don\u2019t let the pretty
84
+ pastel tones fool you.","source":"season","sourceDescription":"Season","howToGet":"Acquired
85
+ from achieving Rank 20 in Ranked Play, January 2015.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Maraad.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Maraad.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"17","name":"Lunar
86
+ New Year","description":"Happy New Year!","source":"season","sourceDescription":"Season","howToGet":"Acquired
87
+ from achieving Rank 20 in Ranked Play, February 2015.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Lunar.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Lunar.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"18","name":"Molten
88
+ Core","description":"The Molten Core of Azeroth and not a chocolate lava cake,
89
+ unfortunately.","source":"achieve","sourceDescription":"Special","howToGet":"Was
90
+ acquired from pre-purchase of Blackrock Mountain.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_MoltonCore.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_MoltonCore.gif","sortCategory":"10","sortOrder":"1","locale":"enUS"},{"cardBackId":"19","name":"Ragnaros","description":"The
91
+ Firelord is most often seen relaxing in his hot tub, even when he\u2019s trying
92
+ to burn down the world.","source":"season","sourceDescription":"Season","howToGet":"Acquired
93
+ from achieving Rank 20 in Ranked Play, March 2015.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Ragnaros.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Ragnaros.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"20","name":"Golden
94
+ Celebration","description":"Solid gold, baby.","source":"achieve","sourceDescription":"Special","howToGet":"Acquired
95
+ with a high level finish in approved eSports events.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_GoldenCelebration.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_GoldenCelebration.gif","sortCategory":"12","sortOrder":"1","locale":"enUS"},{"cardBackId":"21","name":"Nefarian","description":"You
96
+ didn\u2019t actually believe someone named \u201cLord Victor Nefarious\u201d
97
+ wasn\u2019t up to anything nefarious, did you?","source":"fixed_reward","sourceDescription":"Adventure","howToGet":"Acquired
98
+ from completing Blackrock Mountain in Heroic mode.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Nefarian.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Nefarian.gif","sortCategory":"3","sortOrder":"2","locale":"enUS"},{"cardBackId":"22","name":"Cupcake","description":"\u201cIs
99
+ that a cupcake on a cake?\u201d you ask? Yes. Yes it is.","source":"season","sourceDescription":"Season","howToGet":"Acquired
100
+ from achieving Rank 20 in Ranked Play, April 2015.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Cupcake.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Cupcake.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"23","name":"Ninjas!","description":"Stealth. Style. Shurikens. Way
101
+ better than Pirates!","source":"season","sourceDescription":"Season","howToGet":"Acquired
102
+ from achieving Rank 20 in Ranked Play, May 2015.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Ninja.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Ninja.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"24","name":"Heroes
103
+ of the Storm","description":"This arrived for you from the Nexus. Might want
104
+ to watch out for those whirling blade thingies.","source":"achieve","sourceDescription":"Special","howToGet":"Acquired
105
+ from reaching Level 12 in the Blizzard game Heroes of the Storm.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_HotS.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_HotS.gif","sortCategory":"8","sortOrder":"1","locale":"enUS"},{"cardBackId":"25","name":"Alleria","description":"When
106
+ she wants to shoot an apple on your head, you don\u2019t have to worry. Unless
107
+ you\u2019re an orc.","source":"fixed_reward","sourceDescription":"Hero","howToGet":"Acquired
108
+ from purchasing the Hero Alleria Windrunner.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Alleria.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Alleria.gif","sortCategory":"4","sortOrder":"3","locale":"enUS"},{"cardBackId":"26","name":"Magni","description":"As
109
+ the eldest of the three Bronzebeard brothers, Magni always got the coolest
110
+ toys. He always shared, though!","source":"fixed_reward","sourceDescription":"Hero","howToGet":"Acquired
111
+ from purchasing the Hero Magni Bronzebeard.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Magni.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Magni.gif","sortCategory":"4","sortOrder":"2","locale":"enUS"},{"cardBackId":"27","name":"Medivh","description":"He
112
+ certainly has a thing for crows and ravens.","source":"fixed_reward","sourceDescription":"Hero","howToGet":"Acquired
113
+ from purchasing the Hero Medivh.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Medivh.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Medivh.gif","sortCategory":"4","sortOrder":"1","locale":"enUS"},{"cardBackId":"28","name":"Darnassus","description":"Nestled
114
+ in the boughs of a giant tree, Darnassus is the capital city of the night
115
+ elves. Also home of the world famous Darnassus Kimchi Pie!","source":"season","howToGet":"Acquired
116
+ from achieving Rank 20 in Ranked Play, June 2015.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Druid.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Druid.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"29","name":"Samsung
117
+ Galaxy","description":"Gifts from the Galaxy! This card back is truly out
118
+ of this world.","source":"fixed_reward","howToGet":"Awarded through the Samsung
119
+ Galaxy promotion!","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Samsung.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Samsung.gif","sortCategory":"9","sortOrder":"1","locale":"enUS"},{"cardBackId":"30","name":"Darkspear","description":"Vol''jin''s
120
+ tribe, the Darkspear trolls, no longer practices cannibalism. Officially.","source":"season","howToGet":"Acquired
121
+ from achieving Rank 20 in Ranked Play, July 2015.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Troll.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Troll.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"31","name":"The
122
+ Grand Tournament","description":"After the fall of the Lich King, it was suggested
123
+ that we celebrate then go home. Those of us who stayed decided to continue
124
+ the Tournament with a new mission: FUN!","source":"fixed_reward","howToGet":"Was
125
+ acquired from pre-purchase of The Grand Tournament Card Packs.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_TGT.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_TGT.gif","sortCategory":"10","sortOrder":"2","locale":"enUS"},{"cardBackId":"32","name":"Tournament
126
+ Grounds","description":"All over The Grand Tournament''s grounds, you can
127
+ find knights at jousting practice. Poor target dummies. So much senseless
128
+ hay shed on the path to glory...","source":"season","howToGet":"Acquired from
129
+ achieving Rank 20 in Ranked Play, August 2015.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_TGT_Season.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_TGT_Season.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"33","name":"Power
130
+ Core","description":"We can feel the energy in the air. And it''s coming from...
131
+ YOU!","source":"achieve","howToGet":"Acquired from attending approved eSports
132
+ events.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Esports.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Esports.gif","sortCategory":"7","sortOrder":"2","locale":"enUS"},{"cardBackId":"34","name":"Exodar","description":"The
133
+ capital city of the draenei is actually a crash-landed dimensional ship. Despite
134
+ its wonders and Velen''s best efforts, its tourism industry is sluggish due
135
+ to its remote location (and the man-eating mutant plants).","source":"season","howToGet":"Acquired
136
+ from achieving Rank 20 in Ranked Play, September 2015.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Draenei.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Draenei.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"35","name":"Highmaul","description":"5
137
+ out of 10 ogres agree: this card back is SMASHING!","source":"season","howToGet":"Acquired
138
+ from achieving Rank 20 in Ranked Play, October 2015.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Highmaul.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Highmaul.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"36","name":"Explorer\u2019s
139
+ Map","description":"A League of Explorers treasure map! Or the Cartographer\u2019s
140
+ grocery list? Let\u2019s find out!","source":"season","howToGet":"Acquired
141
+ from achieving Rank 20 in Ranked Play, November 2015.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_LOE1.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_LOE1.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"37","name":"Staff
142
+ of Origination","description":"Wait, isn''t this staff supposed to be in the
143
+ museum? RENO!!!","source":"fixed_reward","howToGet":"Acquired from completing
144
+ the League of Explorers in Heroic mode.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_LOE2.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_LOE2.gif","sortCategory":"3","sortOrder":"3","locale":"enUS"},{"cardBackId":"38","name":"Blizzard
145
+ 2015","description":"Hearthstone on phones, Tavern Brawls, Blackrock Mountain,
146
+ The Grand Tournament and more! A very cool year, indeed.","source":"achieve","howToGet":"Acquired
147
+ by participating in Blizzard events during 2015.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Blizzard2015.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Blizzard2015.gif","sortCategory":"11","sortOrder":"2","locale":"enUS"},{"cardBackId":"39","name":"Legacy
148
+ of the Void","description":"Came with a note. What on Azeroth does \"En Taro
149
+ Adun\" mean?","source":"achieve","howToGet":"Acquired from Legacy of the Void
150
+ Deluxe Edition.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Void.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Void.gif","sortCategory":"8","sortOrder":"3","locale":"enUS"},{"cardBackId":"40","name":"Love
151
+ Is in the Air","description":"Many believe goblins made up this holiday to
152
+ sell candy. It\u2019s not true! They also sell flowers and perfume!","source":"season","howToGet":"Acquired
153
+ from achieving Rank 20 in Ranked Play, January 2016.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Love_Is_In_The_Air.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Love_Is_In_The_Air.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"41","name":"Thunder
154
+ Bluff","description":"Unofficial slogan: \u201cGreat warriors come from happy
155
+ Tauren tribes. Happy Tauren come from Thunder Bluff!\u201d","source":"season","howToGet":"Acquired
156
+ from achieving Rank 20 in Ranked Play, February 2016.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Tauren.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Tauren.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"42","name":"Thrall","description":"The
157
+ World Shaman is probably THE best known celebrity in Azeroth. It\u2019s a
158
+ mystery that his signature necklace never caught on as a fashion trend.","source":"season","howToGet":"Acquired
159
+ from achieving Rank 20 in Ranked Play, December 2015.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Shaman.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Shaman.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"43","name":"Winter
160
+ Veil Wreath","description":"A beautiful Winter Veil wreath around a snow globe
161
+ full of THE FROSTY DESTRUCTION OF YOUR OPPONENTS! I mean\u2026 good cheer.","source":"tavern_brawl","howToGet":"Acquired
162
+ from the Feast of Winter Veil Tavern Brawl, 2015.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_WinterVeil.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_WinterVeil.gif","sortCategory":"13","sortOrder":"0","locale":"enUS"},{"cardBackId":"44","name":"Overwatch","description":"The
163
+ cavalry\u2019s here!","source":"achieve","howToGet":"Acquired from Overwatch
164
+ Origins or Collector''s Edition.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Overwatch.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Overwatch.gif","sortCategory":"8","sortOrder":"4","locale":"enUS"},{"cardBackId":"45","name":"Eyes
165
+ of C''Thun","description":"For an Old God who''s stuck in the lightless depths
166
+ of an ancient temple, C''Thun sure has a lot of eyeballs.","source":"fixed_reward","howToGet":"Was
167
+ acquired from pre-purchase of the Whispers of the Old Gods Card Packs.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_OG2.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_OG2.gif","sortCategory":"10","sortOrder":"3","locale":"enUS"},{"cardBackId":"46","name":"Hogger","description":"The
168
+ Terror of Elwynn, the King of Gnolls. They say he bathes in the tears of young
169
+ heroes, hence the wet dog smell.","source":"season","howToGet":"Acquired from
170
+ achieving Rank 20 in Ranked Play, March 2016.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Hogger.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Hogger.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"47","name":"Clutch
171
+ of Yogg-Saron","description":"There are several cults trying to summon the
172
+ Old God Yogg-Saron, and the competition for cultists is causing salaries to
173
+ skyrocket.","source":"season","howToGet":"Acquired from achieving Rank 20
174
+ in Ranked Play, April 2016.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_OG1.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_OG1.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"48","name":"Shadowmoon
175
+ Valley","description":"After Outland became what it is, Shadowmoon Valley
176
+ has always been full of demonic energy. Gul''dan''s favorite spa destination!","source":"season","howToGet":"Acquired
177
+ from achieving Rank 20 in Ranked Play, May 2016.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Shadowmoon.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Shadowmoon.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"49","name":"Zul''Drak","description":"Home
178
+ of the Drakkari ice trolls, Zul''Drak consistently produces the best figure
179
+ skaters of all the troll tribes.","source":"season","howToGet":"Acquired from
180
+ achieving Rank 20 in Ranked Play, June 2016.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Zuldrak.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Zuldrak.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"},{"cardBackId":"50","name":"Halfhill","description":"Surrounded
181
+ by fertile farmland that grows delectable giant produce, Halfhill is the culinary
182
+ heart of Pandaria. \"Come to Halfhill! Double your weight!\"","source":"season","howToGet":"Acquired
183
+ from achieving Rank 20 in Ranked Play, July 2016.","enabled":true,"img":"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Pandaria_02.png","imgAnimated":"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Pandaria_02.gif","sortCategory":"5","sortOrder":"0","locale":"enUS"}]'
184
+ http_version:
185
+ recorded_at: Wed, 04 May 2016 18:58:01 GMT
186
+ recorded_with: VCR 2.9.3