postcodes_io 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/LICENSE.txt +1 -1
- data/README.md +20 -2
- data/lib/postcodes_io.rb +2 -0
- data/lib/postcodes_io/autocomplete.rb +37 -0
- data/lib/postcodes_io/autocomplete_list.rb +12 -0
- data/lib/postcodes_io/base.rb +10 -0
- data/lib/postcodes_io/postcode.rb +3 -8
- data/lib/postcodes_io/version.rb +1 -1
- data/spec/autocomplete_spec.rb +36 -0
- data/spec/fixtures/autocomplete_response.json +14 -0
- data/spec/lookup_spec.rb +62 -0
- data/spec/postcode_io_spec.rb +0 -57
- metadata +26 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a025c5964930e2fdd31f1d4ac696d14ef8db7244
|
4
|
+
data.tar.gz: 3d5e0090a957e1a6af46f68d1204eb0c2ee9b5a9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5ca6179bdb36644e0d64dc65f3ff37efa574cbe9e0440200ef788514de7728c9c6d0fa95c87adaa258022f0d8aca834d4c0177c4ef8de817ab2610bc6e98727d
|
7
|
+
data.tar.gz: 1cc677ceaf30e1c0db12e0c44d604a77b35b44d05533a81440e545553806fca89f1f7222bfaa8b1fa321b9fd8f4b00a9cb78ae35b8b8048896e331349a7e3ea6
|
data/.gitignore
CHANGED
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -23,7 +23,7 @@ Or install it yourself as:
|
|
23
23
|
Require the gem
|
24
24
|
|
25
25
|
```ruby
|
26
|
-
require '
|
26
|
+
require 'postcodes_io'
|
27
27
|
```
|
28
28
|
|
29
29
|
Create new instance of the Postcodes::IO
|
@@ -32,7 +32,7 @@ Create new instance of the Postcodes::IO
|
|
32
32
|
pio = Postcodes::IO.new
|
33
33
|
```
|
34
34
|
|
35
|
-
Lookup a postcode
|
35
|
+
####Lookup a postcode
|
36
36
|
```ruby
|
37
37
|
postcode = pio.lookup('NN12 8TN')
|
38
38
|
```
|
@@ -43,6 +43,24 @@ postcode.longitude # -1.02144562675883
|
|
43
43
|
postcode.latitude # 52.0776806788868
|
44
44
|
```
|
45
45
|
|
46
|
+
####Make a batch postcode lookup request
|
47
|
+
|
48
|
+
> max 100 postcodes per request
|
49
|
+
|
50
|
+
```ruby
|
51
|
+
postcodes = pio.lookup('NN12 8TN', 'DA3 8NG') # or pio.lookup(['NN12 8TN', 'DA3 8NG'])
|
52
|
+
postcodes.each do |p|
|
53
|
+
puts p.nuts
|
54
|
+
end
|
55
|
+
```
|
56
|
+
|
57
|
+
####Autocomplete a postcode
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
postcodes = pio.autocomplete('NN12')
|
61
|
+
puts postcodes.list # ["NN12 6AA", "NN12 6AB", "NN12 6AD", "NN12 6AE", "NN12 6AF", "NN12 6AG", "NN12 6AH", "NN12 6AJ", "NN12 6AL", "NN12 6AN"]
|
62
|
+
```
|
63
|
+
|
46
64
|
##All available fields
|
47
65
|
|
48
66
|
|name|description|
|
data/lib/postcodes_io.rb
CHANGED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'excon'
|
2
|
+
require 'json'
|
3
|
+
require 'postcodes_io/autocomplete_list'
|
4
|
+
|
5
|
+
module Postcodes
|
6
|
+
module Autocomplete
|
7
|
+
|
8
|
+
def autocomplete(postcode)
|
9
|
+
autocomplete_postcode postcode
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def autocomplete_postcode(postcode)
|
15
|
+
postcode = remove_whitespace postcode
|
16
|
+
response = Excon.get("https://api.postcodes.io/postcodes/#{postcode}/autocomplete")
|
17
|
+
|
18
|
+
unless response.status == 404
|
19
|
+
parsed_response = JSON.parse(response.body)
|
20
|
+
return Postcodes::AutocompleteList.new(parsed_response['result'])
|
21
|
+
end
|
22
|
+
return nil
|
23
|
+
end
|
24
|
+
|
25
|
+
def remove_whitespace(string)
|
26
|
+
string.gsub(/\s+/, '')
|
27
|
+
end
|
28
|
+
|
29
|
+
def process_response(response, &block)
|
30
|
+
unless response.status == 404
|
31
|
+
yield JSON.parse(response.body)
|
32
|
+
end
|
33
|
+
nil
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
@@ -1,17 +1,12 @@
|
|
1
|
+
require "postcodes_io/base"
|
2
|
+
|
1
3
|
module Postcodes
|
2
|
-
class Postcode
|
4
|
+
class Postcode < Base
|
3
5
|
|
4
6
|
attr_reader :info
|
5
7
|
|
6
8
|
def initialize(info)
|
7
9
|
@info = info
|
8
10
|
end
|
9
|
-
|
10
|
-
# allow accessing info values with dot notation
|
11
|
-
def method_missing(name, *args, &block)
|
12
|
-
return @info[name.to_s] if @info.key? name.to_s
|
13
|
-
return @info[name] if @info.key? name
|
14
|
-
super.method_missing name
|
15
|
-
end
|
16
11
|
end
|
17
12
|
end
|
data/lib/postcodes_io/version.rb
CHANGED
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Postcodes::IO do
|
4
|
+
|
5
|
+
let(:base_url) {'https://api.postcodes.io'}
|
6
|
+
let(:stub_autocomplete) { File.read('spec/fixtures/autocomplete_response.json') }
|
7
|
+
|
8
|
+
describe '#autocomplete' do
|
9
|
+
|
10
|
+
before :each do
|
11
|
+
stub_request(:get, "#{base_url}/postcodes/NN10/autocomplete")
|
12
|
+
.to_return(status: 200, body: stub_autocomplete)
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:input) { 'NN10' }
|
16
|
+
let(:output) { subject.autocomplete(input) }
|
17
|
+
|
18
|
+
it 'requests a postcode' do
|
19
|
+
output
|
20
|
+
WebMock.should have_requested(:get, "#{base_url}/postcodes/NN10/autocomplete")
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'returns autocompleted array' do
|
24
|
+
expect(output.list).to eq(["NN10 0AA",
|
25
|
+
"NN10 0AD",
|
26
|
+
"NN10 0AE",
|
27
|
+
"NN10 0AF",
|
28
|
+
"NN10 0AG",
|
29
|
+
"NN10 0AH",
|
30
|
+
"NN10 0AJ",
|
31
|
+
"NN10 0AL",
|
32
|
+
"NN10 0AN",
|
33
|
+
"NN10 0AP"])
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/spec/lookup_spec.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Postcodes::IO do
|
4
|
+
|
5
|
+
let(:base_url) {'https://api.postcodes.io'}
|
6
|
+
let(:stub_single_response) { File.read('spec/fixtures/lookup_response.json') }
|
7
|
+
let(:stub_multi_response) { File.read('spec/fixtures/lookup_multi_response.json') }
|
8
|
+
|
9
|
+
describe '#lookup' do
|
10
|
+
|
11
|
+
before :each do
|
12
|
+
stub_request(:get, "#{base_url}/postcodes/CM129TR")
|
13
|
+
.to_return(status: 200, body: stub_single_response)
|
14
|
+
end
|
15
|
+
|
16
|
+
let(:input) { 'CM12 9TR' }
|
17
|
+
let(:output) { subject.lookup(input) }
|
18
|
+
|
19
|
+
it 'requests a postcode' do
|
20
|
+
output
|
21
|
+
WebMock.should have_requested(:get, "#{base_url}/postcodes/CM129TR")
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'returns the long and lat' do
|
25
|
+
output.longitude.should == 0.411227930206834
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '#lookup with multiple postcodes' do
|
30
|
+
before :each do
|
31
|
+
stub_request(:post, "#{base_url}/postcodes")
|
32
|
+
.with(body: postcode_payload, headers: {'Content-Type' => 'application/json'})
|
33
|
+
.to_return(status: 200, body: stub_multi_response)
|
34
|
+
end
|
35
|
+
|
36
|
+
let(:input) { ['OX495NU', 'M320JG', 'NE301DP'] }
|
37
|
+
let(:output) { subject.lookup(input) }
|
38
|
+
let(:postcode_payload) { {postcodes: input}.to_json }
|
39
|
+
|
40
|
+
it 'makes a request with mutliple postcodes' do
|
41
|
+
output
|
42
|
+
WebMock.should have_requested(:post, "#{base_url}/postcodes")
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'returns a postcode object for each result' do
|
46
|
+
output.count.should == 3
|
47
|
+
output.each do |o|
|
48
|
+
o.class.should == Postcodes::Postcode
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe 'as splat' do
|
53
|
+
let(:output) { subject.lookup('OX495NU', 'M320JG', 'NE301DP') }
|
54
|
+
|
55
|
+
it 'allows passing postcodes as multiple arguments' do
|
56
|
+
output
|
57
|
+
WebMock.should have_requested(:post, "#{base_url}/postcodes")
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/spec/postcode_io_spec.rb
CHANGED
@@ -2,61 +2,4 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Postcodes::IO do
|
4
4
|
|
5
|
-
let(:base_url) {'https://api.postcodes.io'}
|
6
|
-
let(:stub_single_response) { File.read('spec/fixtures/lookup_response.json') }
|
7
|
-
let(:stub_multi_response) { File.read('spec/fixtures/lookup_multi_response.json') }
|
8
|
-
|
9
|
-
describe '#lookup' do
|
10
|
-
|
11
|
-
before :each do
|
12
|
-
stub_request(:get, "#{base_url}/postcodes/CM129TR")
|
13
|
-
.to_return(status: 200, body: stub_single_response)
|
14
|
-
end
|
15
|
-
|
16
|
-
let(:input) { 'CM12 9TR' }
|
17
|
-
let(:output) { subject.lookup(input) }
|
18
|
-
|
19
|
-
it 'requests a postcode' do
|
20
|
-
output
|
21
|
-
WebMock.should have_requested(:get, "#{base_url}/postcodes/CM129TR")
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'returns the long and lat' do
|
25
|
-
output.longitude.should == 0.411227930206834
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
describe '#lookup with multiple postcodes' do
|
30
|
-
before :each do
|
31
|
-
stub_request(:post, "#{base_url}/postcodes")
|
32
|
-
.with(body: postcode_payload, headers: {'Content-Type' => 'application/json'})
|
33
|
-
.to_return(status: 200, body: stub_multi_response)
|
34
|
-
end
|
35
|
-
|
36
|
-
let(:input) { ['OX495NU', 'M320JG', 'NE301DP'] }
|
37
|
-
let(:output) { subject.lookup(input) }
|
38
|
-
let(:postcode_payload) { {postcodes: input}.to_json }
|
39
|
-
|
40
|
-
it 'makes a request with mutliple postcodes' do
|
41
|
-
output
|
42
|
-
WebMock.should have_requested(:post, "#{base_url}/postcodes")
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'returns a postcode object for each result' do
|
46
|
-
output.count.should == 3
|
47
|
-
output.each do |o|
|
48
|
-
o.class.should == Postcodes::Postcode
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
describe 'as splat' do
|
53
|
-
let(:output) { subject.lookup('OX495NU', 'M320JG', 'NE301DP') }
|
54
|
-
|
55
|
-
it 'allows passing postcodes as multiple arguments' do
|
56
|
-
output
|
57
|
-
WebMock.should have_requested(:post, "#{base_url}/postcodes")
|
58
|
-
end
|
59
|
-
|
60
|
-
end
|
61
|
-
end
|
62
5
|
end
|
metadata
CHANGED
@@ -1,83 +1,83 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: postcodes_io
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Ruston
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-02-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.7'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.7'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - ~>
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '10.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - ~>
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '10.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: webmock
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: excon
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - ~>
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0.39'
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - ~>
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0.39'
|
83
83
|
description: Get rich data from postcode lookups. Wraps postcodes.io
|
@@ -87,19 +87,25 @@ executables: []
|
|
87
87
|
extensions: []
|
88
88
|
extra_rdoc_files: []
|
89
89
|
files:
|
90
|
-
- .gitignore
|
91
|
-
- .rspec
|
90
|
+
- ".gitignore"
|
91
|
+
- ".rspec"
|
92
92
|
- Gemfile
|
93
93
|
- LICENSE.txt
|
94
94
|
- README.md
|
95
95
|
- Rakefile
|
96
96
|
- lib/postcodes_io.rb
|
97
|
+
- lib/postcodes_io/autocomplete.rb
|
98
|
+
- lib/postcodes_io/autocomplete_list.rb
|
99
|
+
- lib/postcodes_io/base.rb
|
97
100
|
- lib/postcodes_io/lookup.rb
|
98
101
|
- lib/postcodes_io/postcode.rb
|
99
102
|
- lib/postcodes_io/version.rb
|
100
103
|
- postcodes_io.gemspec
|
104
|
+
- spec/autocomplete_spec.rb
|
105
|
+
- spec/fixtures/autocomplete_response.json
|
101
106
|
- spec/fixtures/lookup_multi_response.json
|
102
107
|
- spec/fixtures/lookup_response.json
|
108
|
+
- spec/lookup_spec.rb
|
103
109
|
- spec/postcode_io_spec.rb
|
104
110
|
- spec/spec_helper.rb
|
105
111
|
homepage: ''
|
@@ -112,22 +118,25 @@ require_paths:
|
|
112
118
|
- lib
|
113
119
|
required_ruby_version: !ruby/object:Gem::Requirement
|
114
120
|
requirements:
|
115
|
-
- -
|
121
|
+
- - ">="
|
116
122
|
- !ruby/object:Gem::Version
|
117
123
|
version: '0'
|
118
124
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
125
|
requirements:
|
120
|
-
- -
|
126
|
+
- - ">="
|
121
127
|
- !ruby/object:Gem::Version
|
122
128
|
version: '0'
|
123
129
|
requirements: []
|
124
130
|
rubyforge_project:
|
125
|
-
rubygems_version: 2.
|
131
|
+
rubygems_version: 2.5.1
|
126
132
|
signing_key:
|
127
133
|
specification_version: 4
|
128
134
|
summary: Lookup postcodes
|
129
135
|
test_files:
|
136
|
+
- spec/autocomplete_spec.rb
|
137
|
+
- spec/fixtures/autocomplete_response.json
|
130
138
|
- spec/fixtures/lookup_multi_response.json
|
131
139
|
- spec/fixtures/lookup_response.json
|
140
|
+
- spec/lookup_spec.rb
|
132
141
|
- spec/postcode_io_spec.rb
|
133
142
|
- spec/spec_helper.rb
|