blizzard-community-api 1.0.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.
- data/Gemfile +15 -0
- data/Gemfile.lock +33 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +40 -0
- data/Rakefile +46 -0
- data/VERSION +1 -0
- data/lib/api_enums.rb +65 -0
- data/lib/api_request.rb +133 -0
- data/lib/api_requestor.rb +5 -0
- data/lib/arena_team_request.rb +23 -0
- data/lib/authorized_api_request.rb +62 -0
- data/lib/blizzard-community-api.rb +101 -0
- data/lib/character_classes_request.rb +11 -0
- data/lib/character_profile_request.rb +33 -0
- data/lib/character_races_request.rb +11 -0
- data/lib/configuration.rb +67 -0
- data/lib/current_auctions_request.rb +21 -0
- data/lib/guild_perks_request.rb +11 -0
- data/lib/guild_profile_request.rb +33 -0
- data/lib/guild_rewards_request.rb +11 -0
- data/lib/item_classes_request.rb +11 -0
- data/lib/item_request.rb +21 -0
- data/lib/realm_status_request.rb +28 -0
- data/spec/api_request_spec.rb +99 -0
- data/spec/api_spec.rb +84 -0
- data/spec/arena_team_request_spec.rb +46 -0
- data/spec/authorized_api_request_spec.rb +78 -0
- data/spec/authorized_spec.rb +89 -0
- data/spec/character_classes_request_spec.rb +38 -0
- data/spec/character_profile_request_spec.rb +92 -0
- data/spec/character_races_spec.rb +38 -0
- data/spec/current_auctions_request_spec.rb +41 -0
- data/spec/guild_perks_request_spec.rb +33 -0
- data/spec/guild_profile_request_spec.rb +59 -0
- data/spec/guild_rewards_request_spec.rb +54 -0
- data/spec/item_classes_request_spec.rb +36 -0
- data/spec/item_request_spec.rb +74 -0
- data/spec/realm_status_request_spec.rb +57 -0
- data/spec/rspec_helper.rb +8 -0
- data/spec/rspec_matchers.rb +18 -0
- metadata +92 -0
@@ -0,0 +1,101 @@
|
|
1
|
+
# Holds the static defaults
|
2
|
+
require "configuration"
|
3
|
+
|
4
|
+
# The following includes are request objects.
|
5
|
+
# You can feel free to uncomment any of them that you want to use independently
|
6
|
+
# of the API cass
|
7
|
+
|
8
|
+
# This is only required if you need authorized request support
|
9
|
+
#require "authorized_api_request"
|
10
|
+
# You only need this if you're making character requests
|
11
|
+
#require "character_profile_request"
|
12
|
+
#require "character_classes_request"
|
13
|
+
#require "character_races_request"
|
14
|
+
# You only need this if you're making guild requests
|
15
|
+
#require "guild_profile_request"
|
16
|
+
#require "guild_perks_request"
|
17
|
+
#require "guild_rewards_request"
|
18
|
+
# You only need this if you're making item requests
|
19
|
+
#require "item_request"
|
20
|
+
#require "item_classes_request"
|
21
|
+
# You only need this if you're making PvP related requests
|
22
|
+
#require "arena_team_request"
|
23
|
+
# You only need this if you're making auction house requests
|
24
|
+
#require "current_auctions_request"
|
25
|
+
# You only need this if you're making realm status requests
|
26
|
+
#require "realm_status_request"
|
27
|
+
|
28
|
+
module WOW
|
29
|
+
class API
|
30
|
+
def self.get_character_profile(name, realm, options={})
|
31
|
+
require "character_profile_request"
|
32
|
+
invoke_request(CharacterProfileRequest.new(name, realm, options))
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.get_guild_profile(name, realm, options={})
|
36
|
+
require "guild_profile_request"
|
37
|
+
invoke_request(GuildProfileRequest.new(name, realm, options))
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.get_realm_status(options={})
|
41
|
+
require "realm_status_request"
|
42
|
+
invoke_request(RealmStatusRequest.new(options))
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.get_current_auctions(realm, options={})
|
46
|
+
require "current_auctions_request"
|
47
|
+
invoke_request(CurrentAuctionsRequest.new(realm, options))
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.get_item(item_id, options={})
|
51
|
+
require "item_request"
|
52
|
+
invoke_request(ItemRequest.new(item_id, options))
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.get_arena_team(realm, team_size, team_name, options={})
|
56
|
+
require "arena_team_request"
|
57
|
+
invoke_request(ArenaTeamRequest.new(realm, team_size, team_name, options))
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.get_character_classes(options={})
|
61
|
+
require "character_classes_request"
|
62
|
+
invoke_request(CharacterClassesRequest.new(options))
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.get_character_races(options={})
|
66
|
+
require "character_races_request"
|
67
|
+
invoke_request(CharacterRacesRequest.new(options))
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.get_guild_perks(options={})
|
71
|
+
require "guild_perks_request"
|
72
|
+
invoke_request(GuildPerksRequest.new(options))
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.get_guild_rewards(options={})
|
76
|
+
require "guild_rewards_request"
|
77
|
+
invoke_request(GuildRewardsRequest.new(options))
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.get_item_classes(options={})
|
81
|
+
require "item_classes_request"
|
82
|
+
invoke_request(ItemClassesRequest.new(options))
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
def self.invoke_request(request)
|
88
|
+
request.invoke
|
89
|
+
end
|
90
|
+
|
91
|
+
class Authorized < API
|
92
|
+
|
93
|
+
private
|
94
|
+
|
95
|
+
def self.invoke_request(request)
|
96
|
+
require "authorized_api_request"
|
97
|
+
AuthorizedApiRequest.new(request,Configuration.public_key,Configuration.private_key).invoke
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require "api_request"
|
2
|
+
|
3
|
+
module WOW
|
4
|
+
class CharacterProfileRequest < ApiRequest
|
5
|
+
|
6
|
+
def initialize(name, realm, options={})
|
7
|
+
super(options)
|
8
|
+
if(!name.is_a?(String) || name.empty? || !realm.is_a?(String) || realm.empty?)
|
9
|
+
raise(SyntaxError, "Name and realm must be non-empty string values")
|
10
|
+
end
|
11
|
+
unless(options[:fields].nil? || options[:fields].is_a?(Array))
|
12
|
+
raise(SyntaxError, "Fields collection must be an Array")
|
13
|
+
end
|
14
|
+
@name = name
|
15
|
+
@realm = realm
|
16
|
+
@fields = options[:fields]
|
17
|
+
end
|
18
|
+
|
19
|
+
attr_reader :name, :realm, :fields
|
20
|
+
|
21
|
+
def path
|
22
|
+
"#{super}/character/#{uri_encode(realm)}/#{uri_encode(name)}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def query
|
26
|
+
if(fields.is_a?(Array) && !fields.empty?)
|
27
|
+
return super.merge({ "fields" => fields })
|
28
|
+
end
|
29
|
+
super
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module WOW
|
2
|
+
class Configuration
|
3
|
+
@@private_key = nil
|
4
|
+
@@public_key = nil
|
5
|
+
@@default_locale = :en_US
|
6
|
+
@@default_proxy_host = nil
|
7
|
+
@@default_proxy_port = nil
|
8
|
+
@@default_proxy_username = nil
|
9
|
+
@@default_proxy_password = nil
|
10
|
+
|
11
|
+
def self.private_key=(value)
|
12
|
+
@@private_key = value
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.private_key
|
16
|
+
@@private_key
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.public_key
|
20
|
+
@@public_key
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.public_key=(value)
|
24
|
+
@@public_key = value
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.default_locale=(value)
|
28
|
+
@@default_locale = value
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.default_locale
|
32
|
+
@@default_locale
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.default_proxy_port=(value)
|
36
|
+
@@default_proxy_port = value
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.default_proxy_host=(value)
|
40
|
+
@@default_proxy_host = value
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.default_proxy_port
|
44
|
+
@@default_proxy_port
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.default_proxy_host
|
48
|
+
@@default_proxy_host
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.default_proxy_username
|
52
|
+
@@default_proxy_username
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.default_proxy_username=(value)
|
56
|
+
@@default_proxy_username = value
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.default_proxy_password
|
60
|
+
@@default_proxy_password
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.default_proxy_password=(value)
|
64
|
+
@@default_proxy_password = value
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'api_request'
|
2
|
+
|
3
|
+
module WOW
|
4
|
+
class CurrentAuctionsRequest < ApiRequest
|
5
|
+
|
6
|
+
def initialize(realm, options={})
|
7
|
+
super(options)
|
8
|
+
if(!realm.is_a?(String) || realm.empty?)
|
9
|
+
raise(SyntaxError, "Realm must be non-empty string values")
|
10
|
+
end
|
11
|
+
@realm = realm
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_reader :realm
|
15
|
+
|
16
|
+
def path
|
17
|
+
"#{super}/auction/data/#{uri_encode(realm).downcase}"
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require "api_request.rb"
|
2
|
+
|
3
|
+
module WOW
|
4
|
+
class GuildProfileRequest < ApiRequest
|
5
|
+
|
6
|
+
def initialize(name, realm, options={})
|
7
|
+
super(options)
|
8
|
+
if(!name.is_a?(String) || name.empty? || !realm.is_a?(String) || realm.empty?)
|
9
|
+
raise(SyntaxError, "Name and realm must be non-empty string values")
|
10
|
+
end
|
11
|
+
unless(options[:fields].nil? || options[:fields].is_a?(Array))
|
12
|
+
raise(SyntaxError, "Fields collection must be an Array")
|
13
|
+
end
|
14
|
+
@name = name
|
15
|
+
@realm = realm
|
16
|
+
@fields = options[:fields]
|
17
|
+
end
|
18
|
+
|
19
|
+
attr_reader :name, :realm, :fields
|
20
|
+
|
21
|
+
def path
|
22
|
+
"#{super}/guild/#{uri_encode(realm)}/#{uri_encode(name)}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def query
|
26
|
+
if(fields.is_a?(Array) && !fields.empty?)
|
27
|
+
return super.merge({ "fields" => fields })
|
28
|
+
end
|
29
|
+
super
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
data/lib/item_request.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'api_request'
|
2
|
+
|
3
|
+
module WOW
|
4
|
+
class ItemRequest < ApiRequest
|
5
|
+
|
6
|
+
def initialize(item_id, options={})
|
7
|
+
super(options)
|
8
|
+
if(!item_id.is_a?(Integer))
|
9
|
+
raise(SyntaxError, "ItemId must be an integer value")
|
10
|
+
end
|
11
|
+
@item_id = item_id
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_reader :item_id
|
15
|
+
|
16
|
+
def path
|
17
|
+
"#{super}/item/#{item_id}"
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "api_request"
|
2
|
+
|
3
|
+
module WOW
|
4
|
+
class RealmStatusRequest < ApiRequest
|
5
|
+
|
6
|
+
def initialize(options={})
|
7
|
+
super(options)
|
8
|
+
unless(options[:realms].nil? || options[:realms].is_a?(Array))
|
9
|
+
raise(SyntaxError, "Fields collection must be an Array")
|
10
|
+
end
|
11
|
+
@realms = options[:realms] ||= []
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_reader :realms
|
15
|
+
|
16
|
+
def path
|
17
|
+
"#{super}/realm/status"
|
18
|
+
end
|
19
|
+
|
20
|
+
def query
|
21
|
+
if(realms.is_a?(Array) && !realms.empty?)
|
22
|
+
return super.merge({ "realms" => realms })
|
23
|
+
end
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require "rspec_helper"
|
2
|
+
require "../lib/api_request"
|
3
|
+
|
4
|
+
include WOW
|
5
|
+
|
6
|
+
describe ApiRequest do
|
7
|
+
describe "::new" do
|
8
|
+
it "should create an instance of ApiRequest" do
|
9
|
+
request = ApiRequest.new()
|
10
|
+
request.should be_a(ApiRequest)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
describe "#query" do
|
14
|
+
it "should be initialized to an empty hash" do
|
15
|
+
request = ApiRequest.new()
|
16
|
+
request.query.should == {}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
describe "#locale" do
|
20
|
+
it "should be initialized to configuration defaults" do
|
21
|
+
request = ApiRequest.new()
|
22
|
+
request.locale.should == Configuration.default_locale
|
23
|
+
end
|
24
|
+
it "should be modifiable via constructor options" do
|
25
|
+
request = ApiRequest.new(:locale => API_LOCALES[1])
|
26
|
+
request.locale.should == API_LOCALES[1]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
describe "#last_modified" do
|
30
|
+
it "should be initialized to min time" do
|
31
|
+
request = ApiRequest.new()
|
32
|
+
request.last_modified.should == Time.at(0)
|
33
|
+
end
|
34
|
+
it "should be modifiable via constructor options" do
|
35
|
+
now = Time.now
|
36
|
+
request = ApiRequest.new(:last_modified => now)
|
37
|
+
request.last_modified.should == now
|
38
|
+
end
|
39
|
+
end
|
40
|
+
describe "#scheme" do
|
41
|
+
it "should be http" do
|
42
|
+
request = ApiRequest.new()
|
43
|
+
request.scheme.should == "http"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
describe "#hostname" do
|
47
|
+
it "should be initialized to the default locale" do
|
48
|
+
request = ApiRequest.new()
|
49
|
+
request.hostname.should == API_HOST_NAMES[Configuration.default_locale]
|
50
|
+
end
|
51
|
+
it "should change with locale change" do
|
52
|
+
request = ApiRequest.new(:locale => API_LOCALES[1])
|
53
|
+
request.hostname.should == API_HOST_NAMES[API_LOCALES[1]]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
describe "#uri" do
|
57
|
+
it "should be initialized to the scheme hostname and api root" do
|
58
|
+
request = ApiRequest.new()
|
59
|
+
request.uri.should == URI.parse("#{request.scheme}://#{API_HOST_NAMES[request.locale]}#{API_ROOT_PATH}")
|
60
|
+
end
|
61
|
+
it "should be changed by locale" do
|
62
|
+
request = ApiRequest.new(:locale => API_LOCALES[1])
|
63
|
+
request.uri.should == URI.parse("#{request.scheme}://#{API_HOST_NAMES[API_LOCALES[1]]}#{API_ROOT_PATH}")
|
64
|
+
end
|
65
|
+
end
|
66
|
+
describe "#headers" do
|
67
|
+
it "should contain default headers" do
|
68
|
+
request = ApiRequest.new()
|
69
|
+
request.headers["Date"].should_not be_nil
|
70
|
+
DateTime.parse(request.headers["Date"]).should < DateTime.now
|
71
|
+
request.headers["If-Modified-Since"].should_not be_nil
|
72
|
+
DateTime.parse(request.headers["If-Modified-Since"]).to_time.should == Time.at(0).utc
|
73
|
+
end
|
74
|
+
it "should change with the last_modified option" do
|
75
|
+
last_modified = Time.now.utc
|
76
|
+
request = ApiRequest.new(:last_modified => last_modified)
|
77
|
+
DateTime.parse(request.headers["If-Modified-Since"]).to_time.utc.to_i.should == last_modified.to_i
|
78
|
+
end
|
79
|
+
end
|
80
|
+
describe "#invoke", :live => true do
|
81
|
+
require "../lib/character_profile_request"
|
82
|
+
it "should return a json response" do
|
83
|
+
request = CharacterProfileRequest.new("Aven","Draenor")
|
84
|
+
request.invoke.should be_a(Hash)
|
85
|
+
end
|
86
|
+
it "should return cached value on subsequent calls" do
|
87
|
+
request = CharacterProfileRequest.new("Aven","Draenor")
|
88
|
+
obj_id_1 = request.invoke.object_id
|
89
|
+
obj_id_2 = request.invoke.object_id
|
90
|
+
obj_id_1.should == obj_id_2
|
91
|
+
end
|
92
|
+
it "should force refresh with option[:force_refresh => true]" do
|
93
|
+
request = CharacterProfileRequest.new("Aven","Draenor")
|
94
|
+
obj_id_1 = request.invoke.object_id
|
95
|
+
obj_id_2 = request.invoke(:force_refresh => true).object_id
|
96
|
+
obj_id_1.should_not == obj_id_2
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|