open_dota_api 0.4.0 → 0.4.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 808512136e0502bf89c7a10c8922302f70917042d7a866cf10ff3e8a441ee299
4
- data.tar.gz: 0d8487e5a03d1d4c7020c1a739938ecacd52edc60a55801918d3a693310215b6
3
+ metadata.gz: 41e0de50f5999f18334dd3bc4feb1504de64fb93123e104d738601b6128254c8
4
+ data.tar.gz: f5cc9056ef69f00d95ad1f534d1e3d870be1e51fa6f6195eaea5a3e4db8a5644
5
5
  SHA512:
6
- metadata.gz: 795eac8e9764bca6fe5cba16bcf29965cc3e4efef6ec6d41dc89303f1d0be0f46d62332c40d2b3928648de259a05f5ccda7158b057aed9e8cc8d6d1a1f341392
7
- data.tar.gz: d2844e9bd2e35298cfce1f4b0664ae188ede5b2d5a912b0978e497aab99cd77056655d4069bb01c25c4b87100d090c625ab5cc2907d01a362acf6e7e4b36bd15
6
+ metadata.gz: 0fae16428f8cf5aef6be3f2f85248ddc055e873d3c8b0dd9ca60b63421313a41f775ec78b3661ee83835cf551e5cb5af6f157d872e430be1f6dbd415582a3c49
7
+ data.tar.gz: bd954371cd4a6ad867be36f184830efe93816088b6fb46984c1d749f39fc12b327d2b311a7b4c54b5b10685589bab4af4c6fec24a51f96ca58c9ba3301120531
@@ -3,7 +3,7 @@ require 'open_dota_api/version'
3
3
 
4
4
  module OpenDotaApi
5
5
  extend SingleForwardable
6
- def_delegators :client, :leagues, :teams, :matches, :heroes, :pro_players, :explorer
6
+ def_delegators :client, :limits, :leagues, :teams, :matches, :heroes, :pro_players, :explorer
7
7
 
8
8
  def self.client
9
9
  @client ||= Client.new
@@ -1,4 +1,5 @@
1
1
  require 'open_dota_api/connection'
2
+ require 'open_dota_api/health'
2
3
  require 'open_dota_api/league'
3
4
  require 'open_dota_api/team'
4
5
  require 'open_dota_api/match'
@@ -10,46 +11,41 @@ module OpenDotaApi
10
11
  class Client
11
12
  INTERFACE = 'api'.freeze
12
13
 
13
- def leagues(attributes = {})
14
- leagues_data = request(League::ENDPOINT, query_params: { api_key: attributes.delete(:api_key) }.compact)
15
- return {} unless leagues_data.success?
14
+ def limits(attributes = {})
15
+ return @limits unless @limits.nil?
16
16
 
17
- League.instantiate(leagues_data)
17
+ request(Health::ENDPOINT, params: attributes)
18
+ @limits
18
19
  end
19
20
 
20
- def teams(attributes = {})
21
- teams_data = request(Team::ENDPOINT, query_params: { api_key: attributes.delete(:api_key) }.compact)
22
- return {} unless teams_data.success?
21
+ def leagues(attributes = {})
22
+ data = request(League::ENDPOINT, params: attributes)
23
+ League.instantiate(data)
24
+ end
23
25
 
24
- Team.instantiate(teams_data)
26
+ def teams(attributes = {})
27
+ data = request(Team::ENDPOINT, params: attributes)
28
+ Team.instantiate(data)
25
29
  end
26
30
 
27
31
  def matches(match_id = nil, attributes = {})
28
- match_data = request(Match::ENDPOINT, match_id, query_params: { api_key: attributes.delete(:api_key) }.compact)
29
- return {} unless match_data.success?
30
-
31
- Match.new(match_data)
32
+ data = request(Match::ENDPOINT, match_id, params: attributes)
33
+ Match.new(data)
32
34
  end
33
35
 
34
36
  def heroes(attributes = {})
35
- heroes_data = request(Hero::ENDPOINT, query_params: { api_key: attributes.delete(:api_key) }.compact)
36
- return {} unless heroes_data.success?
37
-
38
- Hero.instantiate(heroes_data)
37
+ data = request(Hero::ENDPOINT, params: attributes)
38
+ Hero.instantiate(data)
39
39
  end
40
40
 
41
41
  def pro_players(attributes = {})
42
- pro_players_data = request(ProPlayer::ENDPOINT, query_params: { api_key: attributes.delete(:api_key) }.compact)
43
- return {} unless pro_players_data
44
-
45
- ProPlayer.instantiate(pro_players_data)
42
+ data = request(ProPlayer::ENDPOINT, params: attributes)
43
+ ProPlayer.instantiate(data)
46
44
  end
47
45
 
48
46
  def explorer(league_id = nil, attributes = {})
49
- explorer_data = request(Explorer::ENDPOINT, query_params: { api_key: attributes.delete(:api_key) }.merge(Explorer.query_params(league_id)).compact)
50
- return {} unless explorer_data.success?
51
-
52
- Explorer.new(explorer_data)
47
+ data = request(Explorer::ENDPOINT, params: Explorer.query_params(league_id).merge(attributes))
48
+ Explorer.new(data)
53
49
  end
54
50
 
55
51
  private
@@ -58,12 +54,23 @@ module OpenDotaApi
58
54
  @connection ||= Connection.new
59
55
  end
60
56
 
61
- def request(method, argument = nil, query_params: {})
62
- params = query_params.merge({ api_key: OpenDotaApi.api_key }.compact)
63
- argument = argument ? "/#{argument}" : nil
64
- pathname = "/#{INTERFACE}/#{method}#{argument}"
57
+ def request(method, argument = nil, params: {})
58
+ pathname = "/#{INTERFACE}/#{method}#{("/#{argument}" if argument)}"
59
+
60
+ global_api_key = { api_key: OpenDotaApi.api_key }.compact
61
+
62
+ data = connection.get(pathname, query: global_api_key.merge(params.compact))
63
+ return {} unless data.success?
64
+
65
+ limits_fixation(data)
66
+ data
67
+ end
65
68
 
66
- connection.get(pathname, query: params)
69
+ def limits_fixation(data)
70
+ @limits = {
71
+ per_min: data.headers['x-rate-limit-remaining-minute'],
72
+ per_month: data.headers['x-rate-limit-remaining-month']
73
+ }
67
74
  end
68
75
  end
69
76
  end
@@ -0,0 +1,5 @@
1
+ module OpenDotaApi
2
+ class Health
3
+ ENDPOINT = 'health'.freeze
4
+ end
5
+ end
@@ -1,3 +1,3 @@
1
1
  module OpenDotaApi
2
- VERSION = '0.4.0'.freeze
2
+ VERSION = '0.4.1'.freeze
3
3
  end
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe OpenDotaApi::Client do
4
- let(:client) { described_class.new }
5
4
  let(:endpoint) {}
6
5
  let(:match_id) { 3_149_215_336 }
7
6
  let(:league_id) { 5401 }
@@ -14,7 +13,9 @@ describe OpenDotaApi::Client do
14
13
  let(:data_file) {}
15
14
  let(:headers) do
16
15
  {
17
- 'content-type' => ['application/json; charset=utf-8']
16
+ 'content-type' => ['application/json; charset=utf-8'],
17
+ 'x-rate-limit-remaining-minute' => rand(60),
18
+ 'x-rate-limit-remaining-month' => rand(50000)
18
19
  }
19
20
  end
20
21
 
@@ -33,6 +34,14 @@ describe OpenDotaApi::Client do
33
34
  stub_request(:get, api_url)
34
35
  .with(headers: { 'Accept': '*/*', 'Accept-Encoding': 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent': 'Ruby' })
35
36
  .to_return(status: 200, body: data_file, headers: headers)
37
+
38
+ stub_request(:get, "http://api.opendota.com/api/health").
39
+ with(headers: { 'Accept': '*/*', 'Accept-Encoding': 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent': 'Ruby' }).
40
+ to_return(status: 200, body: "", headers: headers)
41
+
42
+ stub_request(:get, "http://api.opendota.com/api/health?api_key=random-value").
43
+ with(headers: { 'Accept': '*/*', 'Accept-Encoding': 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent': 'Ruby' }).
44
+ to_return(status: 200, body: "", headers: {})
36
45
  end
37
46
 
38
47
  it 'returns interface' do
@@ -40,16 +49,38 @@ describe OpenDotaApi::Client do
40
49
  end
41
50
 
42
51
  describe 'default attributes' do
52
+ describe '#limits' do
53
+ let(:endpoint) { OpenDotaApi::Health::ENDPOINT }
54
+
55
+ it 'updates limits' do
56
+ expect{ subject.limits }.to change{ subject.instance_variable_get(:@limits) }.from(nil).to(Hash)
57
+ end
58
+
59
+ context 'check limit after it was set' do
60
+ before do
61
+ subject.limits
62
+ end
63
+
64
+ it 'reads limits' do
65
+ expect{subject.limits}.to_not change(subject, :limits)
66
+ end
67
+ end
68
+ end
69
+
43
70
  describe '#leagues' do
44
71
  let(:endpoint) { OpenDotaApi::League::ENDPOINT }
45
72
  let(:data_file) { leagues_file }
46
73
 
47
74
  it 'returns array of objects' do
48
- expect(client.leagues.all? { |league| league.is_a? OpenDotaApi::League }).to be_truthy
75
+ expect(subject.leagues.all? { |league| league.is_a? OpenDotaApi::League }).to be_truthy
49
76
  end
50
77
 
51
78
  it 'returns list' do
52
- expect(client.leagues.to_deep_hash).to eq expected_leagues.to_deep_hash
79
+ expect(subject.leagues.to_deep_hash).to eq expected_leagues.to_deep_hash
80
+ end
81
+
82
+ it 'updates limits' do
83
+ expect{subject.leagues}.to change{ subject.instance_variable_get(:@limits) }.from(nil).to(Hash)
53
84
  end
54
85
  end
55
86
 
@@ -58,11 +89,15 @@ describe OpenDotaApi::Client do
58
89
  let(:data_file) { teams_file }
59
90
 
60
91
  it 'returns array of objects' do
61
- expect(client.teams.all? { |team| team.is_a? OpenDotaApi::Team }).to be_truthy
92
+ expect(subject.teams.all? { |team| team.is_a? OpenDotaApi::Team }).to be_truthy
62
93
  end
63
94
 
64
95
  it 'returns list' do
65
- expect(client.teams.to_deep_hash).to eq expected_teams.to_deep_hash
96
+ expect(subject.teams.to_deep_hash).to eq expected_teams.to_deep_hash
97
+ end
98
+
99
+ it 'updates limits' do
100
+ expect{subject.teams}.to change{ subject.instance_variable_get(:@limits) }.from(nil).to(Hash)
66
101
  end
67
102
  end
68
103
 
@@ -71,11 +106,15 @@ describe OpenDotaApi::Client do
71
106
  let(:data_file) { match_file }
72
107
 
73
108
  it 'returns object' do
74
- expect(client.matches(match_id).is_a?(OpenDotaApi::Match)).to be_truthy
109
+ expect(subject.matches(match_id).is_a?(OpenDotaApi::Match)).to be_truthy
75
110
  end
76
111
 
77
112
  it 'returns match' do
78
- expect(client.matches(match_id).to_deep_hash).to eq expected_match.to_deep_hash
113
+ expect(subject.matches(match_id).to_deep_hash).to eq expected_match.to_deep_hash
114
+ end
115
+
116
+ it 'updates limits' do
117
+ expect{subject.matches(match_id)}.to change{ subject.instance_variable_get(:@limits) }.from(nil).to(Hash)
79
118
  end
80
119
  end
81
120
 
@@ -84,11 +123,15 @@ describe OpenDotaApi::Client do
84
123
  let(:data_file) { heroes_file }
85
124
 
86
125
  it 'returns array of objects' do
87
- expect(client.heroes.all? { |hero| hero.is_a? OpenDotaApi::Hero }).to be_truthy
126
+ expect(subject.heroes.all? { |hero| hero.is_a? OpenDotaApi::Hero }).to be_truthy
88
127
  end
89
128
 
90
129
  it 'returns list' do
91
- expect(client.heroes.to_deep_hash).to eq expected_heroes.to_deep_hash
130
+ expect(subject.heroes.to_deep_hash).to eq expected_heroes.to_deep_hash
131
+ end
132
+
133
+ it 'updates limits' do
134
+ expect{subject.heroes}.to change{ subject.instance_variable_get(:@limits) }.from(nil).to(Hash)
92
135
  end
93
136
  end
94
137
 
@@ -97,22 +140,30 @@ describe OpenDotaApi::Client do
97
140
  let(:data_file) { pro_players_file }
98
141
 
99
142
  it 'returns array of objects' do
100
- expect(client.pro_players.all? { |hero| hero.is_a? OpenDotaApi::ProPlayer }).to be_truthy
143
+ expect(subject.pro_players.all? { |hero| hero.is_a? OpenDotaApi::ProPlayer }).to be_truthy
101
144
  end
102
145
 
103
146
  it 'returns list' do
104
- expect(client.pro_players.to_deep_hash).to eq expected_heroes.to_deep_hash
147
+ expect(subject.pro_players.to_deep_hash).to eq expected_heroes.to_deep_hash
148
+ end
149
+
150
+ it 'updates limits' do
151
+ expect{subject.pro_players}.to change{ subject.instance_variable_get(:@limits) }.from(nil).to(Hash)
105
152
  end
106
153
  end
107
154
 
108
155
  describe '#explorer' do
109
156
  let(:query) { OpenDotaApi::Explorer.query_params(league_id) }
110
- let(:endpoint) { "#{OpenDotaApi::Explorer::ENDPOINT}" }
157
+ let(:endpoint) { OpenDotaApi::Explorer::ENDPOINT }
111
158
  let(:params) { "?#{query.keys[0]}=#{query.values[0]}" }
112
159
  let(:data_file) { explorer_file }
113
160
 
114
161
  it 'returns array of match ids' do
115
- expect(client.explorer(league_id).league_matches_ids.is_a?(Array)).to be_truthy
162
+ expect(subject.explorer(league_id).league_matches_ids.is_a?(Array)).to be_truthy
163
+ end
164
+
165
+ it 'updates limits' do
166
+ expect{subject.explorer(league_id)}.to change{ subject.instance_variable_get(:@limits) }.from(nil).to(Hash)
116
167
  end
117
168
 
118
169
  context 'API_KEY' do
@@ -122,7 +173,11 @@ describe OpenDotaApi::Client do
122
173
  end
123
174
 
124
175
  it 'returns array of match ids' do
125
- expect(client.explorer(league_id).league_matches_ids.is_a?(Array)).to be_truthy
176
+ expect(subject.explorer(league_id).league_matches_ids.is_a?(Array)).to be_truthy
177
+ end
178
+
179
+ it 'updates limits' do
180
+ expect{subject.explorer(league_id)}.to change{ subject.instance_variable_get(:@limits) }.from(nil).to(Hash)
126
181
  end
127
182
  end
128
183
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: open_dota_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - YaroslavO
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-29 00:00:00.000000000 Z
11
+ date: 2019-10-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hashable
@@ -148,6 +148,7 @@ files:
148
148
  - lib/open_dota_api/entities/instantiable.rb
149
149
  - lib/open_dota_api/entity.rb
150
150
  - lib/open_dota_api/explorer.rb
151
+ - lib/open_dota_api/health.rb
151
152
  - lib/open_dota_api/hero.rb
152
153
  - lib/open_dota_api/league.rb
153
154
  - lib/open_dota_api/match.rb