gds-api-adapters 4.4.0 → 4.5.0
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.
- data/lib/gds_api/content_api/list_response.rb +1 -1
- data/lib/gds_api/json_client.rb +1 -1
- data/lib/gds_api/mapit.rb +43 -0
- data/lib/gds_api/response.rb +6 -6
- data/lib/gds_api/test_helpers/mapit.rb +56 -0
- data/lib/gds_api/version.rb +1 -1
- data/test/json_client_test.rb +9 -0
- data/test/mapit_test.rb +60 -0
- metadata +8 -4
data/lib/gds_api/json_client.rb
CHANGED
@@ -109,7 +109,7 @@ module GdsApi
|
|
109
109
|
|
110
110
|
# If no custom response is given, just instantiate Response
|
111
111
|
create_response ||= Proc.new { |r| Response.new(r) }
|
112
|
-
create_response.call(response
|
112
|
+
create_response.call(response)
|
113
113
|
end
|
114
114
|
|
115
115
|
# Take a hash of parameters for Request#execute; return a hash of
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
require_relative 'exceptions'
|
3
|
+
|
4
|
+
class GdsApi::Mapit < GdsApi::Base
|
5
|
+
include GdsApi::ExceptionHandling
|
6
|
+
|
7
|
+
def location_for_postcode(postcode)
|
8
|
+
response = get_json("#{base_url}/postcode/#{CGI.escape postcode}.json")
|
9
|
+
return Location.new(response) unless response.nil?
|
10
|
+
rescue GdsApi::HTTPErrorResponse => e
|
11
|
+
# allow 400 errors, as they can be invalid postcodes people have entered
|
12
|
+
raise GdsApi::HTTPErrorResponse.new(e.code) unless e.code == 400
|
13
|
+
end
|
14
|
+
|
15
|
+
class Location
|
16
|
+
attr_reader :response
|
17
|
+
|
18
|
+
def initialize(response)
|
19
|
+
@response = response
|
20
|
+
end
|
21
|
+
|
22
|
+
def lat
|
23
|
+
@response['wgs84_lat']
|
24
|
+
end
|
25
|
+
|
26
|
+
def lon
|
27
|
+
@response['wgs84_lon']
|
28
|
+
end
|
29
|
+
|
30
|
+
def areas
|
31
|
+
@response['areas'].map {|i, area| OpenStruct.new(area) }
|
32
|
+
end
|
33
|
+
|
34
|
+
def postcode
|
35
|
+
@response['postcode']
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
def base_url
|
41
|
+
endpoint
|
42
|
+
end
|
43
|
+
end
|
data/lib/gds_api/response.rb
CHANGED
@@ -9,21 +9,21 @@ module GdsApi
|
|
9
9
|
|
10
10
|
def_delegators :to_hash, :[], :"<=>", :each
|
11
11
|
|
12
|
-
def initialize(
|
13
|
-
@
|
12
|
+
def initialize(http_response)
|
13
|
+
@http_response = http_response
|
14
14
|
end
|
15
15
|
|
16
16
|
def raw_response_body
|
17
|
-
@
|
17
|
+
@http_response.body
|
18
18
|
end
|
19
19
|
|
20
20
|
def to_hash
|
21
|
-
@parsed ||= JSON.parse(@
|
21
|
+
@parsed ||= JSON.parse(@http_response.body)
|
22
22
|
end
|
23
23
|
|
24
24
|
def code
|
25
25
|
# Return an integer code for consistency with HTTPErrorResponse
|
26
|
-
@
|
26
|
+
@http_response.code
|
27
27
|
end
|
28
28
|
|
29
29
|
def to_ostruct
|
@@ -58,4 +58,4 @@ module GdsApi
|
|
58
58
|
end
|
59
59
|
end
|
60
60
|
end
|
61
|
-
end
|
61
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module GdsApi
|
2
|
+
module TestHelpers
|
3
|
+
module Mapit
|
4
|
+
|
5
|
+
MAPIT_ENDPOINT = Plek.current.find('mapit')
|
6
|
+
|
7
|
+
def mapit_has_a_postcode(postcode, coords)
|
8
|
+
response = {
|
9
|
+
"wgs84_lat" => coords.first,
|
10
|
+
"wgs84_lon" => coords.last,
|
11
|
+
"postcode" => postcode
|
12
|
+
}
|
13
|
+
|
14
|
+
stub_request(:get, "#{MAPIT_ENDPOINT}/postcode/" + postcode.sub(' ','+') + ".json")
|
15
|
+
.to_return(:body => response.to_json, :status => 200)
|
16
|
+
stub_request(:get, "#{MAPIT_ENDPOINT}/postcode/partial/" + postcode.split(' ').first + ".json")
|
17
|
+
.to_return(:body => response.to_json, :status => 200)
|
18
|
+
end
|
19
|
+
|
20
|
+
def mapit_has_a_postcode_and_areas(postcode, coords, areas)
|
21
|
+
response = {
|
22
|
+
"wgs84_lat" => coords.first,
|
23
|
+
"wgs84_lon" => coords.last,
|
24
|
+
"postcode" => postcode
|
25
|
+
}
|
26
|
+
|
27
|
+
area_response = Hash[areas.map.with_index {|area, i|
|
28
|
+
[i, {
|
29
|
+
'codes' => {
|
30
|
+
'ons' => area['ons'],
|
31
|
+
'gss' => area['gss']
|
32
|
+
},
|
33
|
+
'name' => area['name'],
|
34
|
+
'type' => area['type']
|
35
|
+
}]
|
36
|
+
}]
|
37
|
+
|
38
|
+
stub_request(:get, "#{MAPIT_ENDPOINT}/postcode/" + postcode.sub(' ','+') + ".json")
|
39
|
+
.to_return(:body => response.merge({'areas' => area_response}).to_json, :status => 200)
|
40
|
+
stub_request(:get, "#{MAPIT_ENDPOINT}/postcode/partial/" + postcode.split(' ').first + ".json")
|
41
|
+
.to_return(:body => response.to_json, :status => 200)
|
42
|
+
end
|
43
|
+
|
44
|
+
def mapit_does_not_have_a_postcode(postcode)
|
45
|
+
stub_request(:get, "#{MAPIT_ENDPOINT}/postcode/" + postcode.sub(' ','+') + ".json")
|
46
|
+
.to_return(:body => { "code" => 404, "error" => "No Postcode matches the given query." }.to_json, :status => 404)
|
47
|
+
end
|
48
|
+
|
49
|
+
def mapit_does_not_have_a_bad_postcode(postcode)
|
50
|
+
stub_request(:get, "#{MAPIT_ENDPOINT}/postcode/" + postcode.sub(' ','+') + ".json")
|
51
|
+
.to_return(:body => { "code" => 400, "error" => "Postcode '#{postcode}' is not valid." }.to_json, :status => 400)
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/gds_api/version.rb
CHANGED
data/test/json_client_test.rb
CHANGED
@@ -408,4 +408,13 @@ class JsonClientTest < MiniTest::Spec
|
|
408
408
|
response = client.put_json("http://some.other.endpoint/some.json", {})
|
409
409
|
assert_equal 2, response.a
|
410
410
|
end
|
411
|
+
|
412
|
+
def test_client_can_decompress_gzip_responses
|
413
|
+
url = "http://some.endpoint/some.json"
|
414
|
+
# {"test": "hello"}
|
415
|
+
stub_request(:get, url).to_return(:body => "\u001F\x8B\b\u0000Q\u000F\u0019Q\u0000\u0003\xABVP*I-.Q\xB2RP\xCAH\xCD\xC9\xC9WR\xA8\u0005\u0000\xD1C\u0018\xFE\u0013\u0000\u0000\u0000", :status => 200, :headers => { 'Content-Encoding' => 'gzip' })
|
416
|
+
response = @client.get_json(url)
|
417
|
+
|
418
|
+
assert_equal "hello", response["test"]
|
419
|
+
end
|
411
420
|
end
|
data/test/mapit_test.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'gds_api/mapit'
|
3
|
+
require 'gds_api/test_helpers/mapit'
|
4
|
+
|
5
|
+
describe GdsApi::Mapit do
|
6
|
+
include GdsApi::TestHelpers::Mapit
|
7
|
+
|
8
|
+
before do
|
9
|
+
@base_api_url = Plek.current.find("mapit")
|
10
|
+
@api = GdsApi::Mapit.new(@base_api_url)
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "postcodes" do
|
14
|
+
it "should return the coordinates" do
|
15
|
+
mapit_has_a_postcode("SW1A 1AA", [ 51.5010096, -0.1415870 ])
|
16
|
+
|
17
|
+
response = @api.location_for_postcode("SW1A 1AA")
|
18
|
+
assert_equal 51.5010096, response.lat
|
19
|
+
assert_equal -0.1415870, response.lon
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should return the postcode" do
|
23
|
+
mapit_has_a_postcode("SW1A 1AA", [ 51.5010096, -0.1415870 ])
|
24
|
+
|
25
|
+
response = @api.location_for_postcode("SW1A 1AA")
|
26
|
+
assert_equal "SW1A 1AA", response.postcode
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should return areas" do
|
30
|
+
mapit_has_a_postcode_and_areas("SW1A 1AA", [ 51.5010096, -0.1415870 ], [
|
31
|
+
{ 'name' => 'Lancashire County Council', 'type' => 'CTY', 'ons' => '30', 'gss' => 'E10000017' },
|
32
|
+
{ 'name' => 'South Ribble Borough Council', 'type' => 'DIS', 'ons' => '30UN', 'gss' => 'E07000126' }
|
33
|
+
])
|
34
|
+
|
35
|
+
response = @api.location_for_postcode("SW1A 1AA")
|
36
|
+
assert_equal 2, response.areas.length
|
37
|
+
|
38
|
+
assert_equal "Lancashire County Council", response.areas.first.name
|
39
|
+
assert_equal "South Ribble Borough Council", response.areas.last.name
|
40
|
+
|
41
|
+
assert_equal "CTY", response.areas.first.type
|
42
|
+
assert_equal "DIS", response.areas.last.type
|
43
|
+
|
44
|
+
assert_equal "30", response.areas.first.codes['ons']
|
45
|
+
assert_equal "30UN", response.areas.last.codes['ons']
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should return nil if a postcode doesn't exist" do
|
49
|
+
mapit_does_not_have_a_postcode("SW1A 1AA")
|
50
|
+
|
51
|
+
assert_nil @api.location_for_postcode("SW1A 1AA")
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should return nil for an invalid postcode" do
|
55
|
+
mapit_does_not_have_a_bad_postcode("B4DP05TC0D3")
|
56
|
+
|
57
|
+
assert_nil @api.location_for_postcode("B4DP05TC0D3")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: gds-api-adapters
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 4.
|
5
|
+
version: 4.5.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: 2013-02-
|
13
|
+
date: 2013-02-12 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: plek
|
@@ -195,6 +195,7 @@ files:
|
|
195
195
|
- lib/gds_api/imminence.rb
|
196
196
|
- lib/gds_api/rummager.rb
|
197
197
|
- lib/gds_api/content_api.rb
|
198
|
+
- lib/gds_api/mapit.rb
|
198
199
|
- lib/gds_api/exceptions.rb
|
199
200
|
- lib/gds_api/json_client.rb
|
200
201
|
- lib/gds_api/core-ext/openstruct.rb
|
@@ -204,6 +205,7 @@ files:
|
|
204
205
|
- lib/gds_api/test_helpers/licence_application.rb
|
205
206
|
- lib/gds_api/test_helpers/imminence.rb
|
206
207
|
- lib/gds_api/test_helpers/content_api.rb
|
208
|
+
- lib/gds_api/test_helpers/mapit.rb
|
207
209
|
- lib/gds_api/test_helpers/content_api/artefact_stub.rb
|
208
210
|
- lib/gds_api/test_helpers/publisher.rb
|
209
211
|
- lib/gds_api/test_helpers/panopticon.rb
|
@@ -216,6 +218,7 @@ files:
|
|
216
218
|
- test/rummager_test.rb
|
217
219
|
- test/publisher_api_test.rb
|
218
220
|
- test/licence_application_api_test.rb
|
221
|
+
- test/mapit_test.rb
|
219
222
|
- test/panopticon_api_test.rb
|
220
223
|
- test/imminence_api_test.rb
|
221
224
|
- test/json_client_test.rb
|
@@ -236,7 +239,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
236
239
|
requirements:
|
237
240
|
- - ">="
|
238
241
|
- !ruby/object:Gem::Version
|
239
|
-
hash:
|
242
|
+
hash: -3906045177861584672
|
240
243
|
segments:
|
241
244
|
- 0
|
242
245
|
version: "0"
|
@@ -245,7 +248,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
245
248
|
requirements:
|
246
249
|
- - ">="
|
247
250
|
- !ruby/object:Gem::Version
|
248
|
-
hash:
|
251
|
+
hash: -3906045177861584672
|
249
252
|
segments:
|
250
253
|
- 0
|
251
254
|
version: "0"
|
@@ -260,6 +263,7 @@ test_files:
|
|
260
263
|
- test/rummager_test.rb
|
261
264
|
- test/publisher_api_test.rb
|
262
265
|
- test/licence_application_api_test.rb
|
266
|
+
- test/mapit_test.rb
|
263
267
|
- test/panopticon_api_test.rb
|
264
268
|
- test/imminence_api_test.rb
|
265
269
|
- test/json_client_test.rb
|