blizzard_api 1.0.0 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 862b08dc9410cd376ae326bd9617b5dc0a83bcdba3bd72096f9f538993bf65ae
4
- data.tar.gz: 81822af210c99fe12144be084cbaaa41dc2ad45a3c968d52dda94137e69e3bbc
3
+ metadata.gz: 680ed6a0b92283da14b06fd82d2b68d907f54ae43286dcdadce49c59d5d2f006
4
+ data.tar.gz: 55533dafd67060eaa7c5100da709d9477941cbc3e1d110d01feb7384857bb791
5
5
  SHA512:
6
- metadata.gz: 1ad2ee3a2e8c6fdecd512967e86645604ff0b5452fecdf7e7511a9d8fcb9b094aef2e96fcbe34d405221a9f41646635a61a0d07281f0a4da3b6b0cb45e59832a
7
- data.tar.gz: 3cfa00ba28278318d9348d1ce81fa63f83fb7b455f5a0340360ed402d95c36b7a2a28b9c8a16c4ca3252e55e6dc6e6d721f53e918b923e1726430708f0ec1dc8
6
+ metadata.gz: 9f389ae7148b0e0527cbae0f00153e9db2d400496223c4c69a86149720115d39959e69365004914128a53072dc838bcec5161d9a436e880a7e96bd8ac39d5669
7
+ data.tar.gz: cbcfceaeab33b4a85e6c0fe6d408c2762e4cd0ba14fadb471eec2ff00e246e0982bcc7e3820d56c87788e0a011d2055e0b27fb0e4effbb795c0435b93bd0f1d1
data/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  Please view this file on the master branch, otherwise it may be outdated
2
2
 
3
+ **Version 3.1.0**
4
+
5
+ Fixed the latest build to exclude non 200 responses from caching.
6
+
7
+ **Version 3.0.0**
8
+
9
+ Changed the way `:extended` mode is handled regarding caching. Now the extended mode will use cache and return a fake
10
+ response object if the content is cached (Cache is still ignored when using the `:since` option).
11
+ A cached response can be identified by the presence of a `cached?` method on the response object.
12
+
13
+ Some automated tests for SC2 endpoints are now ignoring `503` errors. The state of the API is somehow unknown since it
14
+ is down most of the time.
15
+
16
+ **Version 2.0.0**
17
+
18
+ Removed the `icon` field from PlayableClass, it was meant to mimic the old communit API behavior during the transition
19
+ to the new game_data version.
20
+
3
21
  **Version 1.0.0**
4
22
 
5
23
  Removed the `complete` method from WoW game data endpoints.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- blizzard_api (1.0.0)
4
+ blizzard_api (3.1.0)
5
5
  redis (~> 4.1, >= 4.1.0)
6
6
 
7
7
  GEM
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BlizzardApi
4
+ ##
5
+ # Simple replacement for the http response object for cached data
6
+ class ApiResponse
7
+ attr_reader :code, :body
8
+
9
+ def initialize(body)
10
+ @code = 200
11
+ @body = body
12
+ end
13
+
14
+ def cached?
15
+ true
16
+ end
17
+ end
18
+ end
19
+
20
+ module Net
21
+ # Workaround for fake response payloads
22
+ class HTTPResponse
23
+ def cached?
24
+ false
25
+ end
26
+ end
27
+ end
@@ -9,7 +9,7 @@ module BlizzardApi
9
9
  #
10
10
  # You can get an instance of this class using the default region as follows:
11
11
  # api_instance = BlizzardApi::Diablo.character
12
- class Character < BlizzardApi::Diablo::Request
12
+ class CharacterClass < BlizzardApi::Diablo::Request
13
13
  ##
14
14
  # Return information about a class
15
15
  #
@@ -35,7 +35,7 @@ module BlizzardApi
35
35
  # Fetch leaderboard data for the current endpoint
36
36
  #
37
37
  # @param [Integer] id One of the IDs returned by the {index}
38
- # @param [Integer] leaderboard_id Leaderboard id
38
+ # @param [String] leaderboard_id Leaderboard id
39
39
  # @!macro request_options
40
40
  #
41
41
  # @!macro response
@@ -34,7 +34,7 @@ module BlizzardApi
34
34
  require_relative 'diablo/community/act'
35
35
  require_relative 'diablo/community/artisan'
36
36
  require_relative 'diablo/community/follower'
37
- require_relative 'diablo/community/character'
37
+ require_relative 'diablo/community/character_class'
38
38
  require_relative 'diablo/community/item_type'
39
39
  require_relative 'diablo/community/item'
40
40
  require_relative 'diablo/community/profile'
@@ -64,7 +64,7 @@ module BlizzardApi
64
64
  # @!macro init_options
65
65
  # @return {Character}
66
66
  def self.character(**options)
67
- BlizzardApi::Diablo::Character.new(**options)
67
+ BlizzardApi::Diablo::CharacterClass.new(**options)
68
68
  end
69
69
 
70
70
  ##
@@ -20,7 +20,7 @@ module BlizzardApi
20
20
  # @!macro request_options
21
21
  #
22
22
  # @!macro response
23
- def index(**options)
23
+ def search(**options)
24
24
  api_request "#{base_url(:community)}/#{@endpoint}/", **default_options.merge(options)
25
25
  end
26
26
 
@@ -82,20 +82,28 @@ module BlizzardApi
82
82
  def request(url, **options)
83
83
  # Creates the whole url for request
84
84
  parsed_url = URI.parse(url)
85
-
86
85
  data = using_cache?(options) ? find_in_cache(parsed_url.to_s) : nil
87
86
 
88
87
  # If data was found that means cache is enabled and valid
89
- return JSON.parse(data, symbolize_names: true) if data
88
+ return prepare_response data if data
90
89
 
91
90
  response = consume_api parsed_url, **options
92
91
 
93
- save_in_cache parsed_url.to_s, response.body, options[:ttl] || CACHE_DAY if using_cache? options
92
+ handle_cache_on_response parsed_url, response, **options
93
+ end
94
94
 
95
- response_data = response.code.to_i.eql?(304) ? nil : JSON.parse(response.body, symbolize_names: true)
96
- return [response, response_data] if mode.eql? :extended
95
+ def handle_cache_on_response(parsed_url, response, **options)
96
+ case response.code.to_i
97
+ when 304
98
+ response_data = nil
99
+ when 200
100
+ response_data = response.body
101
+ else
102
+ return nil, response
103
+ end
97
104
 
98
- response_data
105
+ save_in_cache parsed_url.to_s, response.body, options[:ttl] || CACHE_DAY if using_cache? options
106
+ prepare_response response_data, response
99
107
  end
100
108
 
101
109
  def api_request(uri, **query_string)
@@ -110,7 +118,7 @@ module BlizzardApi
110
118
 
111
119
  # In case uri already have query string parameters joins them with &
112
120
  if query_string.size.positive?
113
- query_string = URI.encode_www_form(query_string, false)
121
+ query_string = URI.encode_www_form(query_string)
114
122
  uri = uri.include?('?') ? "#{uri}&#{query_string}" : "#{uri}?#{query_string}"
115
123
  end
116
124
 
@@ -119,10 +127,22 @@ module BlizzardApi
119
127
 
120
128
  private
121
129
 
130
+ ##
131
+ # Resolves the response based on the mode
132
+ def prepare_response(data, response = nil)
133
+ parsed_data = data.nil? ? data : JSON.parse(data, symbolize_names: true)
134
+
135
+ return parsed_data unless mode.eql? :extended
136
+
137
+ response ||= ApiResponse.new(data)
138
+
139
+ [response, parsed_data]
140
+ end
141
+
122
142
  ##
123
143
  # @param options [Hash] Request options
124
144
  def using_cache?(options)
125
- return false if mode.eql?(:extended) || options.key?(:since)
145
+ return false if options.key?(:since)
126
146
 
127
147
  !options.fetch(:ignore_cache, false)
128
148
  end
@@ -130,6 +150,7 @@ module BlizzardApi
130
150
  def http_connection(url)
131
151
  Net::HTTP.new(url.host, url.port).tap do |http|
132
152
  http.use_ssl = true
153
+ http.keep_alive_timeout = 30
133
154
  end
134
155
  end
135
156
 
@@ -2,5 +2,5 @@
2
2
 
3
3
  module BlizzardApi
4
4
  # Gem version
5
- VERSION = '1.0.0'
5
+ VERSION = '3.1.0'
6
6
  end
@@ -13,7 +13,7 @@ module BlizzardApi
13
13
  setup 'guild-crest', :static, CACHE_TRIMESTER
14
14
 
15
15
  def get
16
- raise BlizzardApi::ApiException, 'This endpoint doens\'t have a get method'
16
+ raise BlizzardApi::ApiException, 'This endpoint does not have a get method'
17
17
  end
18
18
 
19
19
  ##
@@ -23,22 +23,6 @@ module BlizzardApi
23
23
  api_request "#{endpoint_uri}/#{id}/pvp-talent-slots", **default_options.merge(options)
24
24
  end
25
25
 
26
- ##
27
- # Return playable class data by its id
28
- #
29
- # @param id [Integer] Playable class id
30
- #
31
- # @!macro request_options
32
- # @option options [Boolean] :classic If set to true, this method will call the classic version
33
- # @option options [Boolean] :classic1x If set to true, this method will call the classic era version
34
- #
35
- # @!macro response
36
- def get(id, **options)
37
- data = api_request "#{endpoint_uri}/#{id}", **default_options.merge(options)
38
- data[:icon] = get_class_icon data[:media], **options
39
- data
40
- end
41
-
42
26
  ##
43
27
  # Fetch media for one of the playable classes listed by the {#index} using its *id*
44
28
  #
@@ -50,15 +34,6 @@ module BlizzardApi
50
34
  def media(id, **options)
51
35
  api_request "#{base_url(:media)}/playable-class/#{id}", **default_options.merge(options)
52
36
  end
53
-
54
- protected
55
-
56
- def get_class_icon(media_url, **options)
57
- return if options.include? :classic
58
-
59
- media_data = request media_url[:key][:href], **options
60
- %r{56/([a-z_]+).jpg}.match(media_data[:assets][0][:value].to_s)[1]
61
- end
62
37
  end
63
38
  end
64
39
  end
@@ -17,7 +17,7 @@ module BlizzardApi
17
17
  #
18
18
  # @!macro response
19
19
  def index
20
- raise BlizzardApi::ApiException, 'This endpoint does not have a index method'
20
+ raise BlizzardApi::ApiException, 'This endpoint does not have an index method'
21
21
  end
22
22
 
23
23
  ##
@@ -19,7 +19,7 @@ module BlizzardApi
19
19
  #
20
20
  # @!macro response
21
21
  def index
22
- raise BlizzardApi::ApiException, 'This endpoint does not have a index method'
22
+ raise BlizzardApi::ApiException, 'This endpoint does not have an index method'
23
23
  end
24
24
 
25
25
  ##
@@ -9,16 +9,11 @@ module BlizzardApi
9
9
  #
10
10
  # You can get an instance of this class using the default region as follows:
11
11
  # api_instance = BlizzardApi::Wow.wow_token
12
- class WowToken < Wow::Request
13
- ##
14
- # Returns wow token data
15
- #
16
- # @!macro request_options
17
- #
18
- # @!macro response
19
- def get(**options)
20
- opts = { namespace: :dynamic, ttl: CACHE_HOUR }.merge(options)
21
- api_request "#{base_url(:game_data)}/token/index", **opts
12
+ class WowToken < GenericDataEndpoint
13
+ setup 'token', :dynamic, CACHE_HOUR
14
+
15
+ def get
16
+ raise BlizzardApi::ApiException, 'This endpoint does not have a index method'
22
17
  end
23
18
  end
24
19
  end
@@ -13,7 +13,7 @@ module BlizzardApi
13
13
  include BlizzardApi::Wow::Slug
14
14
 
15
15
  ##
16
- # Return character achievements
16
+ # Return character basic data
17
17
  #
18
18
  # @see https://develop.battle.net/documentation/api-reference/world-of-warcraft-profile-api
19
19
  #
data/lib/blizzard_api.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require_relative 'blizzard_api/configuration'
4
4
  require_relative 'blizzard_api/token_manager'
5
5
  require_relative 'blizzard_api/api_standards'
6
+ require_relative 'blizzard_api/api_response'
6
7
  require_relative 'blizzard_api/request'
7
8
  require_relative 'blizzard_api/exception'
8
9
  require_relative 'blizzard_api/version'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blizzard_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Francis Schiavo
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-01-09 00:00:00.000000000 Z
11
+ date: 2022-04-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis
@@ -121,12 +121,13 @@ files:
121
121
  - bin/setup
122
122
  - blizzard_api.gemspec
123
123
  - lib/blizzard_api.rb
124
+ - lib/blizzard_api/api_response.rb
124
125
  - lib/blizzard_api/api_standards.rb
125
126
  - lib/blizzard_api/configuration.rb
126
127
  - lib/blizzard_api/diablo.rb
127
128
  - lib/blizzard_api/diablo/community/act.rb
128
129
  - lib/blizzard_api/diablo/community/artisan.rb
129
- - lib/blizzard_api/diablo/community/character.rb
130
+ - lib/blizzard_api/diablo/community/character_class.rb
130
131
  - lib/blizzard_api/diablo/community/follower.rb
131
132
  - lib/blizzard_api/diablo/community/item.rb
132
133
  - lib/blizzard_api/diablo/community/item_type.rb