halo-api 0.3.1 → 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
  SHA1:
3
- metadata.gz: 64d185252ce2e1aa3141aef30fa2d920271d7f1c
4
- data.tar.gz: ecf4da6883b446f590d0fcfa8764de508760de99
3
+ metadata.gz: d241a3a1fe1f27c5cb995fafd2d02b4a9d861a9e
4
+ data.tar.gz: 2f16787de453f9975aba2c683ef74b4cebc9ab14
5
5
  SHA512:
6
- metadata.gz: 23c8dc1d1b6c53d17bf88ac0d8f696478ba5ade17d641e3421416c2926cd9bc35adbb06da8114845508cbb0c896f7150ef4c8105bd1d559c0e396db797f75593
7
- data.tar.gz: f7359da19034d9f54523f8c971fa8e5453365ed92de7ef23a1860a4a88a0dce1f9d16a783e47e9de28d6b48671689a6d8e9132ee159cd035ede6ad07f369901b
6
+ metadata.gz: 98e71bf3bb6b85f0d9386ed8c9e83615e11a5a2abdb4228817af018557c4aebfd596d0c48a4a173b0acacbfa4e8efdbc3edfb27ee5e9fa1cd808504283cfbc82
7
+ data.tar.gz: b9d1cc843c195d556b896ccc87fb7d7e3656ca46ac40a68103102ac37914e6853b6e0dc54bc618d6f27aa0ce7373a78865c7b79ae723fb8fca8a0e64fc4da511
data/.gitignore CHANGED
@@ -10,5 +10,10 @@
10
10
 
11
11
  # rspec failure tracking
12
12
  .rspec_status
13
+
14
+ # Environment
13
15
  .env
14
- /.idea
16
+
17
+ # rvm
18
+ .ruby-gemset
19
+ .ruby-version
data/.rspec CHANGED
@@ -1,3 +1,4 @@
1
1
  --format documentation
2
2
  --color
3
- --require spec_helper
3
+ --require spec_helper
4
+ --fail-fast
@@ -1,10 +1,10 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 2.0.0
5
- - 2.1.10
6
- - 2.2.0
4
+ - 2.2.2
7
5
  - 2.3.0
8
6
  - 2.4.1
9
7
  - ruby-head
10
8
  before_install: gem install bundler -v 1.15.4
9
+ services:
10
+ - redis-server
data/README.md CHANGED
@@ -25,11 +25,19 @@ Or install it yourself as:
25
25
 
26
26
  ## Usage
27
27
 
28
- Basic examples:
28
+ Basic configuration:
29
+ ````ruby
30
+ Halo.configure do |config|
31
+ config.api_key = ENV['HALO_API_KEY']
32
+ end
33
+ ````
34
+
35
+ With redis and region (optional parameters)
29
36
  ````ruby
30
37
  Halo.configure do |config|
31
38
  config.api_key = ENV['HALO_API_KEY']
32
39
  config.region = ENV['HALO_REGION']
40
+ config.redis = ENV['HALO_REDIS']
33
41
  end
34
42
  ````
35
43
 
@@ -47,6 +55,10 @@ h2w_campaign_levels = halo_wars2_client.metadata.campaign_levels
47
55
 
48
56
  - [x] Halo 5 endpoints
49
57
  - [x] Halo Wars 2 endpoints
58
+ - [x] Redis response caching support
59
+ - [ ] Request rate limiter
60
+ - [ ] Custom query builder
61
+ - [ ] Paged requests
50
62
  - [ ] Documentation
51
63
 
52
64
  ## Contributing
@@ -22,18 +22,19 @@ Gem::Specification.new do |spec|
22
22
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
23
  spec.require_paths = ['lib']
24
24
 
25
- # This gem will work with 2.0.0 or greater
26
- spec.required_ruby_version = '>= 2.0.0'
25
+ # This gem will work with 2.2.2 or greater
26
+ spec.required_ruby_version = '>= 2.2.2'
27
27
 
28
28
  spec.add_runtime_dependency 'httparty', '~> 0.15.6'
29
29
  spec.add_runtime_dependency 'addressable', '~> 2.5', '>= 2.5.2'
30
+ spec.add_runtime_dependency 'redis', '~> 4.0'
30
31
 
31
32
  spec.add_development_dependency 'bundler', '~> 1.15'
32
- spec.add_development_dependency 'rake', '~> 12.0'
33
- spec.add_development_dependency 'rspec', '~> 3.0'
33
+ spec.add_development_dependency 'rake', '~> 12.1'
34
+ spec.add_development_dependency 'rspec', '~> 3.6'
34
35
  spec.add_development_dependency 'dotenv', '~> 2.2', '>= 2.2.1'
35
- spec.add_development_dependency 'rubocop', '~> 0.49.1'
36
+ spec.add_development_dependency 'rubocop', '~> 0.50'
36
37
  spec.add_development_dependency 'coveralls', '~> 0.8.21'
37
- spec.add_development_dependency 'pry', '~> 0.10.3'
38
+ spec.add_development_dependency 'pry', '~> 0.11'
38
39
  spec.add_development_dependency 'wwtd', '~> 1.3'
39
40
  end
@@ -1,18 +1,61 @@
1
+ require 'httparty'
2
+ require 'addressable/uri'
3
+
1
4
  module Halo
2
- class APIResponse
5
+ class InvalidCacheStore < StandardError; end
3
6
 
4
- attr_accessor :data
7
+ class APIResponse
8
+ include HTTParty
5
9
 
6
10
  def initialize(options = {})
7
- @data = []
8
- @client = options[:client]
11
+ client = options.delete(:client)
12
+ @api_key = client.api_key
13
+ @region = client.region
14
+ @cache_store = client.cache_store || {}
15
+
16
+ raise InvalidCacheStore if cached? && !redis_store.is_a?(Redis)
17
+
18
+ self.class.base_uri 'https://www.haloapi.com'
9
19
  end
10
20
 
11
- def get_data(path, options)
12
- return if @client.nil?
13
- response = @client.get(path, options)
14
- @data = response.parsed_response
21
+ def get_data(path, options = {})
22
+ if cached?
23
+ result = redis_store.get("#{path}#{options}")
24
+ return JSON.parse(result) if result
25
+ end
26
+ response = perform_uncached_request(:get, path, options)
27
+ redis_store.setex "#{path}#{options}", ttl, response.to_json if cached?
28
+ response
15
29
  end
16
30
 
31
+ def perform_uncached_request(verb, path, params = {})
32
+ options = {}
33
+ headers = {
34
+ 'Ocp-Apim-Subscription-Key' => @api_key,
35
+ 'Accept-Language' => @region
36
+ }
37
+
38
+ options[:headers] = headers unless headers.empty?
39
+ options[:query] = params unless params.empty?
40
+
41
+ response = self.class.send(verb, Addressable::URI.encode(path), options)
42
+
43
+ response.respond_to?(:parsed_response) ? response.parsed_response : response
44
+ end
45
+
46
+ # @return [Redis] returns the cache store
47
+ def redis_store
48
+ @cache_store[:redis]
49
+ end
50
+
51
+ # @return [Boolean] true if the request should be cached
52
+ def cached?
53
+ @cache_store[:cached]
54
+ end
55
+
56
+ # @return [Integer] the ttl to apply to cached keys
57
+ def ttl
58
+ @cache_store[:ttl]
59
+ end
17
60
  end
18
61
  end
@@ -1,7 +1,8 @@
1
1
  require 'halo-api/version'
2
2
  require 'halo-api/api_response'
3
- require 'httparty'
4
- require 'addressable/uri'
3
+ require 'halo-api/configuration'
4
+
5
+ require 'redis'
5
6
 
6
7
 
7
8
  module Halo
@@ -11,34 +12,35 @@ module Halo
11
12
  attr_accessor(*Configuration::OPTIONS)
12
13
 
13
14
  def initialize(options = {})
14
- @api_key = options[:api_key]
15
- @region = options[:region]
16
- @endpoint = options[:endpoint]
17
-
18
15
  options = Halo.options.merge(options)
19
16
 
20
17
  Halo::Configuration::OPTIONS.each do |key|
21
18
  send("#{key}=", options[key])
22
19
  end
23
20
 
24
- self.class.base_uri "https://www.haloapi.com#{@endpoint}"
21
+ set_up_cache(options.delete(:redis), options.delete(:ttl))
25
22
  end
26
23
 
27
- def get(path, params = {})
28
- make_request :get, path, params
24
+ def set_up_cache(redis_url, ttl)
25
+ return @cached = false unless redis_url
26
+ @ttl = ttl || Halo::Configuration::DEFAULT_TTL
27
+ @cached = true
28
+ @redis = Redis.new url: redis_url
29
29
  end
30
30
 
31
- def make_request(verb, path, params = {})
32
- options = {}
33
- headers = {
34
- 'Ocp-Apim-Subscription-Key' => @api_key,
35
- 'Accept-Language' => @region
31
+ # Returns an options hash with cache keys
32
+ # @return [Hash]
33
+ def cache_store
34
+ {
35
+ redis: @redis,
36
+ ttl: @ttl,
37
+ cached: @cached
36
38
  }
39
+ end
37
40
 
38
- options[:headers] = headers unless headers.empty?
39
- options[:query] = params unless params.empty?
40
-
41
- self.class.send(verb, Addressable::URI.encode(path), options)
41
+ # @return [Boolean] true if the request should be cached
42
+ def cached?
43
+ cache_store[:cached]
42
44
  end
43
45
 
44
46
 
@@ -1,10 +1,12 @@
1
1
  module Halo
2
2
  module Configuration
3
3
 
4
- OPTIONS = %i[api_key region].freeze
4
+ OPTIONS = %i[api_key region redis ttl].freeze
5
5
 
6
6
  DEFAULT_API_KEY = nil
7
- DEFAULT_REGION = :en
7
+ DEFAULT_REGION = 'en'
8
+ DEFAULT_REDIS = 'redis://localhost:6379'
9
+ DEFAULT_TTL = 1800
8
10
 
9
11
  attr_accessor(*OPTIONS)
10
12
 
@@ -1,3 +1,3 @@
1
1
  module Halo
2
- VERSION = '0.3.1'.freeze
2
+ VERSION = '0.4.1'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: halo-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carlos Ruiz
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-09-11 00:00:00.000000000 Z
11
+ date: 2017-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -44,6 +44,20 @@ dependencies:
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
46
  version: 2.5.2
47
+ - !ruby/object:Gem::Dependency
48
+ name: redis
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '4.0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '4.0'
47
61
  - !ruby/object:Gem::Dependency
48
62
  name: bundler
49
63
  requirement: !ruby/object:Gem::Requirement
@@ -64,28 +78,28 @@ dependencies:
64
78
  requirements:
65
79
  - - "~>"
66
80
  - !ruby/object:Gem::Version
67
- version: '12.0'
81
+ version: '12.1'
68
82
  type: :development
69
83
  prerelease: false
70
84
  version_requirements: !ruby/object:Gem::Requirement
71
85
  requirements:
72
86
  - - "~>"
73
87
  - !ruby/object:Gem::Version
74
- version: '12.0'
88
+ version: '12.1'
75
89
  - !ruby/object:Gem::Dependency
76
90
  name: rspec
77
91
  requirement: !ruby/object:Gem::Requirement
78
92
  requirements:
79
93
  - - "~>"
80
94
  - !ruby/object:Gem::Version
81
- version: '3.0'
95
+ version: '3.6'
82
96
  type: :development
83
97
  prerelease: false
84
98
  version_requirements: !ruby/object:Gem::Requirement
85
99
  requirements:
86
100
  - - "~>"
87
101
  - !ruby/object:Gem::Version
88
- version: '3.0'
102
+ version: '3.6'
89
103
  - !ruby/object:Gem::Dependency
90
104
  name: dotenv
91
105
  requirement: !ruby/object:Gem::Requirement
@@ -112,14 +126,14 @@ dependencies:
112
126
  requirements:
113
127
  - - "~>"
114
128
  - !ruby/object:Gem::Version
115
- version: 0.49.1
129
+ version: '0.50'
116
130
  type: :development
117
131
  prerelease: false
118
132
  version_requirements: !ruby/object:Gem::Requirement
119
133
  requirements:
120
134
  - - "~>"
121
135
  - !ruby/object:Gem::Version
122
- version: 0.49.1
136
+ version: '0.50'
123
137
  - !ruby/object:Gem::Dependency
124
138
  name: coveralls
125
139
  requirement: !ruby/object:Gem::Requirement
@@ -140,14 +154,14 @@ dependencies:
140
154
  requirements:
141
155
  - - "~>"
142
156
  - !ruby/object:Gem::Version
143
- version: 0.10.3
157
+ version: '0.11'
144
158
  type: :development
145
159
  prerelease: false
146
160
  version_requirements: !ruby/object:Gem::Requirement
147
161
  requirements:
148
162
  - - "~>"
149
163
  - !ruby/object:Gem::Version
150
- version: 0.10.3
164
+ version: '0.11'
151
165
  - !ruby/object:Gem::Dependency
152
166
  name: wwtd
153
167
  requirement: !ruby/object:Gem::Requirement
@@ -171,8 +185,6 @@ extra_rdoc_files: []
171
185
  files:
172
186
  - ".gitignore"
173
187
  - ".rspec"
174
- - ".ruby-gemset"
175
- - ".ruby-version"
176
188
  - ".travis.yml"
177
189
  - Gemfile
178
190
  - LICENSE.txt
@@ -206,7 +218,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
206
218
  requirements:
207
219
  - - ">="
208
220
  - !ruby/object:Gem::Version
209
- version: 2.0.0
221
+ version: 2.2.2
210
222
  required_rubygems_version: !ruby/object:Gem::Requirement
211
223
  requirements:
212
224
  - - ">="
@@ -1 +0,0 @@
1
- halo-api
@@ -1 +0,0 @@
1
- ruby-2.4.1