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.
Files changed (41) hide show
  1. data/Gemfile +15 -0
  2. data/Gemfile.lock +33 -0
  3. data/LICENSE.txt +20 -0
  4. data/README.rdoc +40 -0
  5. data/Rakefile +46 -0
  6. data/VERSION +1 -0
  7. data/lib/api_enums.rb +65 -0
  8. data/lib/api_request.rb +133 -0
  9. data/lib/api_requestor.rb +5 -0
  10. data/lib/arena_team_request.rb +23 -0
  11. data/lib/authorized_api_request.rb +62 -0
  12. data/lib/blizzard-community-api.rb +101 -0
  13. data/lib/character_classes_request.rb +11 -0
  14. data/lib/character_profile_request.rb +33 -0
  15. data/lib/character_races_request.rb +11 -0
  16. data/lib/configuration.rb +67 -0
  17. data/lib/current_auctions_request.rb +21 -0
  18. data/lib/guild_perks_request.rb +11 -0
  19. data/lib/guild_profile_request.rb +33 -0
  20. data/lib/guild_rewards_request.rb +11 -0
  21. data/lib/item_classes_request.rb +11 -0
  22. data/lib/item_request.rb +21 -0
  23. data/lib/realm_status_request.rb +28 -0
  24. data/spec/api_request_spec.rb +99 -0
  25. data/spec/api_spec.rb +84 -0
  26. data/spec/arena_team_request_spec.rb +46 -0
  27. data/spec/authorized_api_request_spec.rb +78 -0
  28. data/spec/authorized_spec.rb +89 -0
  29. data/spec/character_classes_request_spec.rb +38 -0
  30. data/spec/character_profile_request_spec.rb +92 -0
  31. data/spec/character_races_spec.rb +38 -0
  32. data/spec/current_auctions_request_spec.rb +41 -0
  33. data/spec/guild_perks_request_spec.rb +33 -0
  34. data/spec/guild_profile_request_spec.rb +59 -0
  35. data/spec/guild_rewards_request_spec.rb +54 -0
  36. data/spec/item_classes_request_spec.rb +36 -0
  37. data/spec/item_request_spec.rb +74 -0
  38. data/spec/realm_status_request_spec.rb +57 -0
  39. data/spec/rspec_helper.rb +8 -0
  40. data/spec/rspec_matchers.rb +18 -0
  41. 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,11 @@
1
+ require "api_request"
2
+
3
+ module WOW
4
+ class CharacterClassesRequest < ApiRequest
5
+
6
+ def path
7
+ "#{super}/data/character/classes"
8
+ end
9
+
10
+ end
11
+ 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,11 @@
1
+ require "api_request"
2
+
3
+ module WOW
4
+ class CharacterRacesRequest < ApiRequest
5
+
6
+ def path
7
+ "#{super}/data/character/races"
8
+ end
9
+
10
+ end
11
+ 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,11 @@
1
+ require 'api_request'
2
+
3
+ module WOW
4
+ class GuildPerksRequest < ApiRequest
5
+
6
+ def path
7
+ "#{super}/data/guild/perks"
8
+ end
9
+
10
+ end
11
+ 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
@@ -0,0 +1,11 @@
1
+ require 'api_request'
2
+
3
+ module WOW
4
+ class GuildRewardsRequest < ApiRequest
5
+
6
+ def path
7
+ "#{super}/data/guild/rewards"
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require 'api_request'
2
+
3
+ module WOW
4
+ class ItemClassesRequest < ApiRequest
5
+
6
+ def path
7
+ "#{super}/data/item/classes"
8
+ end
9
+
10
+ end
11
+ end
@@ -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