gds-api-adapters 3.3.1 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -9,8 +9,8 @@ module GdsApi
9
9
 
10
10
  include GdsApi::ExceptionHandling
11
11
 
12
- def self.cache(size=DEFAULT_CACHE_SIZE)
13
- @cache ||= LRUCache.new(max_size: size)
12
+ def self.cache(size=DEFAULT_CACHE_SIZE, ttl=DEFAULT_CACHE_TTL)
13
+ @cache ||= LRUCache.new(max_size: size, ttl: ttl)
14
14
  end
15
15
 
16
16
  def self.cache=(c)
@@ -22,7 +22,8 @@ module GdsApi
22
22
  def initialize(options = {})
23
23
  @logger = options[:logger] || GdsApi::Base.logger
24
24
  cache_size = options[:cache_size] || DEFAULT_CACHE_SIZE
25
- @cache = JsonClient.cache(cache_size)
25
+ cache_ttl = options[:cache_ttl] || DEFAULT_CACHE_TTL
26
+ @cache = JsonClient.cache(cache_size, cache_ttl)
26
27
  @options = options
27
28
  end
28
29
 
@@ -33,6 +34,7 @@ module GdsApi
33
34
  }
34
35
  DEFAULT_TIMEOUT_IN_SECONDS = 4
35
36
  DEFAULT_CACHE_SIZE = 10
37
+ DEFAULT_CACHE_TTL = 15 * 60 # 15 minutes
36
38
 
37
39
  def get_raw(url)
38
40
  do_raw_request(Net::HTTP::Get, url)
@@ -1,3 +1,3 @@
1
1
  module GdsApi
2
- VERSION = '3.3.1'
2
+ VERSION = '3.4.0'
3
3
  end
@@ -11,6 +11,7 @@ class JsonClientTest < MiniTest::Spec
11
11
  end
12
12
 
13
13
  def teardown
14
+ super
14
15
  GdsApi::JsonClient.cache = @json_client_cache
15
16
  end
16
17
 
@@ -57,12 +58,112 @@ class JsonClientTest < MiniTest::Spec
57
58
  end
58
59
 
59
60
  def test_should_cache_multiple_requests_to_same_url_across_instances
61
+ GdsApi::JsonClient.cache = nil # clear the stubbed cache instance
62
+
60
63
  url = "http://some.endpoint/some.json"
61
64
  result = {"foo" => "bar"}
62
- stub_request(:get, url).to_return(:body => JSON.dump(result), :status => 200).times(1)
65
+ stub_request(:get, url).to_return(:body => JSON.dump(result), :status => 200)
63
66
  response_a = GdsApi::JsonClient.new.get_json(url)
64
67
  response_b = GdsApi::JsonClient.new.get_json(url)
65
68
  assert_equal response_a.object_id, response_b.object_id
69
+ assert_requested :get, url, times: 1
70
+ end
71
+
72
+ def test_should_cache_up_to_10_items_by_default
73
+ GdsApi::JsonClient.cache = nil # clear the stubbed cache instance
74
+
75
+ url = "http://some.endpoint/"
76
+ result = {"foo" => "bar"}
77
+ stub_request(:get, %r{\A#{url}}).to_return do |request|
78
+ {:body => {"url" => request.uri}.to_json, :status => 200}
79
+ end
80
+
81
+ response_a = GdsApi::JsonClient.new.get_json("#{url}/first.json")
82
+ response_b = GdsApi::JsonClient.new.get_json("#{url}/second.json")
83
+ 9.times { |n| GdsApi::JsonClient.new.get_json("#{url}/#{n}.json") }
84
+
85
+ response_c = GdsApi::JsonClient.new.get_json("#{url}/second.json")
86
+ response_d = GdsApi::JsonClient.new.get_json("#{url}/first.json")
87
+
88
+ assert_requested :get, "#{url}/second.json", times: 1
89
+ assert_requested :get, "#{url}/first.json", times: 2
90
+ assert_equal response_b.to_hash, response_c.to_hash
91
+ assert_equal response_a.to_hash, response_d.to_hash
92
+ end
93
+
94
+ def test_allow_overriding_the_number_of_cached_items
95
+ GdsApi::JsonClient.cache = nil # clear the stubbed cache instance
96
+
97
+ url = "http://some.endpoint/"
98
+ result = {"foo" => "bar"}
99
+ stub_request(:get, %r{\A#{url}}).to_return do |request|
100
+ {:body => {"url" => request.uri}.to_json, :status => 200}
101
+ end
102
+
103
+ response_a = GdsApi::JsonClient.new(:cache_size => 5).get_json("#{url}/first.json")
104
+ response_b = GdsApi::JsonClient.new.get_json("#{url}/second.json")
105
+ 4.times { |n| GdsApi::JsonClient.new.get_json("#{url}/#{n}.json") }
106
+
107
+ response_c = GdsApi::JsonClient.new.get_json("#{url}/second.json")
108
+ response_d = GdsApi::JsonClient.new.get_json("#{url}/first.json")
109
+
110
+ assert_requested :get, "#{url}/second.json", times: 1
111
+ assert_requested :get, "#{url}/first.json", times: 2
112
+ assert_equal response_b.to_hash, response_c.to_hash
113
+ assert_equal response_a.to_hash, response_d.to_hash
114
+ end
115
+ def test_should_cache_requests_for_15_mins_by_default
116
+ GdsApi::JsonClient.cache = nil # cause it to contruct a new cache instance.
117
+
118
+ url = "http://some.endpoint/some.json"
119
+ result = {"foo" => "bar"}
120
+ stub_request(:get, url).to_return(:body => JSON.dump(result), :status => 200)#.times(1)
121
+ response_a = GdsApi::JsonClient.new.get_json(url)
122
+ response_b = GdsApi::JsonClient.new.get_json(url)
123
+
124
+ assert_requested :get, url, times: 1
125
+ assert_equal response_a.object_id, response_b.object_id
126
+
127
+ Timecop.travel( 15 * 60 - 30) do # now + 14 mins 30 secs
128
+ response_c = GdsApi::JsonClient.new.get_json(url)
129
+
130
+ assert_requested :get, url, times: 1
131
+ assert_same response_a, response_c
132
+ end
133
+
134
+ Timecop.travel( 15 * 60 + 30) do # now + 15 mins 30 secs
135
+ response_d = GdsApi::JsonClient.new.get_json(url)
136
+
137
+ assert_requested :get, url, times: 2
138
+ assert_equal response_a.to_hash, response_d.to_hash
139
+ end
140
+ end
141
+
142
+ def test_should_allow_overriding_cache_ttl
143
+ GdsApi::JsonClient.cache = nil # cause it to contruct a new cache instance.
144
+
145
+ url = "http://some.endpoint/some.json"
146
+ result = {"foo" => "bar"}
147
+ stub_request(:get, url).to_return(:body => JSON.dump(result), :status => 200)#.times(1)
148
+ response_a = GdsApi::JsonClient.new(:cache_ttl => 5 * 60).get_json(url)
149
+ response_b = GdsApi::JsonClient.new.get_json(url)
150
+
151
+ assert_requested :get, url, times: 1
152
+ assert_equal response_a.object_id, response_b.object_id
153
+
154
+ Timecop.travel( 5 * 60 - 30) do # now + 4 mins 30 secs
155
+ response_c = GdsApi::JsonClient.new.get_json(url)
156
+
157
+ assert_requested :get, url, times: 1
158
+ assert_same response_a, response_c
159
+ end
160
+
161
+ Timecop.travel( 5 * 60 + 30) do # now + 5 mins 30 secs
162
+ response_d = GdsApi::JsonClient.new.get_json(url)
163
+
164
+ assert_requested :get, url, times: 2
165
+ assert_equal response_a.to_hash, response_d.to_hash
166
+ end
66
167
  end
67
168
 
68
169
  def test_should_raise_http_not_found_if_404_returned_from_endpoint
data/test/test_helper.rb CHANGED
@@ -2,11 +2,11 @@ require 'bundler'
2
2
  Bundler.setup :default, :development, :test
3
3
 
4
4
  require 'minitest/autorun'
5
- require 'webmock/minitest'
6
5
  require 'rack/utils'
7
6
  require 'simplecov'
8
7
  require 'simplecov-rcov'
9
8
  require 'mocha'
9
+ require 'timecop'
10
10
 
11
11
  SimpleCov.start do
12
12
  add_filter "/test/"
@@ -14,4 +14,11 @@ SimpleCov.start do
14
14
  formatter SimpleCov::Formatter::RcovFormatter
15
15
  end
16
16
 
17
+ class MiniTest::Unit::TestCase
18
+ def teardown
19
+ Timecop.return
20
+ end
21
+ end
22
+
23
+ require 'webmock/minitest'
17
24
  WebMock.disable_net_connect!
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: gds-api-adapters
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 3.3.1
5
+ version: 3.4.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - James Stewart
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2012-10-11 00:00:00 Z
13
+ date: 2012-10-26 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: plek
@@ -144,6 +144,17 @@ dependencies:
144
144
  type: :development
145
145
  prerelease: false
146
146
  version_requirements: *id012
147
+ - !ruby/object:Gem::Dependency
148
+ name: timecop
149
+ requirement: &id013 !ruby/object:Gem::Requirement
150
+ none: false
151
+ requirements:
152
+ - - ~>
153
+ - !ruby/object:Gem::Version
154
+ version: 0.5.1
155
+ type: :development
156
+ prerelease: false
157
+ version_requirements: *id013
147
158
  description: A set of adapters providing easy access to the GDS gov.uk APIs
148
159
  email:
149
160
  - jystewart@gmail.com
@@ -155,43 +166,43 @@ extra_rdoc_files: []
155
166
 
156
167
  files:
157
168
  - lib/gds_api/version.rb
158
- - lib/gds_api/publisher.rb
159
- - lib/gds_api/panopticon/registerer.rb
160
169
  - lib/gds_api/typhoeus_client.rb
161
- - lib/gds_api/content_api.rb
162
- - lib/gds_api/imminence.rb
170
+ - lib/gds_api/base.rb
171
+ - lib/gds_api/licence_application.rb
163
172
  - lib/gds_api/contactotron.rb
164
- - lib/gds_api/test_helpers/publisher.rb
165
- - lib/gds_api/test_helpers/content_api.rb
166
- - lib/gds_api/test_helpers/imminence.rb
167
- - lib/gds_api/test_helpers/contactotron.rb
173
+ - lib/gds_api/panopticon/registerer.rb
174
+ - lib/gds_api/needotron.rb
175
+ - lib/gds_api/imminence.rb
176
+ - lib/gds_api/rummager.rb
177
+ - lib/gds_api/content_api.rb
178
+ - lib/gds_api/exceptions.rb
179
+ - lib/gds_api/json_client.rb
180
+ - lib/gds_api/core-ext/openstruct.rb
181
+ - lib/gds_api/response.rb
182
+ - lib/gds_api/publisher.rb
168
183
  - lib/gds_api/test_helpers/licence_application.rb
184
+ - lib/gds_api/test_helpers/contactotron.rb
185
+ - lib/gds_api/test_helpers/imminence.rb
186
+ - lib/gds_api/test_helpers/content_api.rb
187
+ - lib/gds_api/test_helpers/publisher.rb
169
188
  - lib/gds_api/test_helpers/panopticon.rb
170
189
  - lib/gds_api/test_helpers/json_client_helper.rb
171
- - lib/gds_api/licence_application.rb
172
- - lib/gds_api/base.rb
173
- - lib/gds_api/json_client.rb
174
- - lib/gds_api/response.rb
175
- - lib/gds_api/rummager.rb
176
- - lib/gds_api/panopticon.rb
177
- - lib/gds_api/core-ext/openstruct.rb
178
190
  - lib/gds_api/part_methods.rb
179
- - lib/gds_api/needotron.rb
180
- - lib/gds_api/exceptions.rb
191
+ - lib/gds_api/panopticon.rb
181
192
  - lib/gds_api/helpers.rb
182
193
  - README.md
183
194
  - Rakefile
184
- - test/contactotron_api_test.rb
185
- - test/panopticon_api_test.rb
186
- - test/publisher_api_test.rb
187
195
  - test/rummager_test.rb
196
+ - test/publisher_api_test.rb
197
+ - test/licence_application_api_test.rb
198
+ - test/panopticon_api_test.rb
188
199
  - test/imminence_api_test.rb
189
- - test/panopticon_registerer_test.rb
190
- - test/content_api_test.rb
191
200
  - test/json_client_test.rb
192
- - test/gds_api_base_test.rb
193
- - test/licence_application_api_test.rb
194
201
  - test/test_helper.rb
202
+ - test/gds_api_base_test.rb
203
+ - test/content_api_test.rb
204
+ - test/panopticon_registerer_test.rb
205
+ - test/contactotron_api_test.rb
195
206
  homepage: http://github.com/alphagov/gds-api-adapters
196
207
  licenses: []
197
208
 
@@ -205,7 +216,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
205
216
  requirements:
206
217
  - - ">="
207
218
  - !ruby/object:Gem::Version
208
- hash: 259809380172045694
219
+ hash: 1331475186711709986
209
220
  segments:
210
221
  - 0
211
222
  version: "0"
@@ -214,7 +225,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
214
225
  requirements:
215
226
  - - ">="
216
227
  - !ruby/object:Gem::Version
217
- hash: 259809380172045694
228
+ hash: 1331475186711709986
218
229
  segments:
219
230
  - 0
220
231
  version: "0"
@@ -226,14 +237,14 @@ signing_key:
226
237
  specification_version: 3
227
238
  summary: Adapters to work with GDS APIs
228
239
  test_files:
229
- - test/contactotron_api_test.rb
230
- - test/panopticon_api_test.rb
231
- - test/publisher_api_test.rb
232
240
  - test/rummager_test.rb
241
+ - test/publisher_api_test.rb
242
+ - test/licence_application_api_test.rb
243
+ - test/panopticon_api_test.rb
233
244
  - test/imminence_api_test.rb
234
- - test/panopticon_registerer_test.rb
235
- - test/content_api_test.rb
236
245
  - test/json_client_test.rb
237
- - test/gds_api_base_test.rb
238
- - test/licence_application_api_test.rb
239
246
  - test/test_helper.rb
247
+ - test/gds_api_base_test.rb
248
+ - test/content_api_test.rb
249
+ - test/panopticon_registerer_test.rb
250
+ - test/contactotron_api_test.rb