open_dota_api 0.4.0 → 0.4.1

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: 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