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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 196afbb36d87c52f7caeab5b4f071e38c374fb0d
4
- data.tar.gz: 40c3c8ffd86ad103c4813d9b291b55c07537707b
3
+ metadata.gz: a025c5964930e2fdd31f1d4ac696d14ef8db7244
4
+ data.tar.gz: 3d5e0090a957e1a6af46f68d1204eb0c2ee9b5a9
5
5
  SHA512:
6
- metadata.gz: f54fc9694d50ac7e89e5976d0c8c07c6bda8daf4f47389ce8106d69f55acbb2744f691fe232c940d25220a6e64f32b3257da81c0dbe52cd9f7fae19540c35d66
7
- data.tar.gz: b3ea796621c10a802e7e846f99f7bef95d2fbbf16663f1050199098a4977f02f43fb498b513a0f2643faa3f6aabe96473f4755626267e97765e298ad870352ff
6
+ metadata.gz: 5ca6179bdb36644e0d64dc65f3ff37efa574cbe9e0440200ef788514de7728c9c6d0fa95c87adaa258022f0d8aca834d4c0177c4ef8de817ab2610bc6e98727d
7
+ data.tar.gz: 1cc677ceaf30e1c0db12e0c44d604a77b35b44d05533a81440e545553806fca89f1f7222bfaa8b1fa321b9fd8f4b00a9cb78ae35b8b8048896e331349a7e3ea6
data/.gitignore CHANGED
@@ -12,3 +12,4 @@
12
12
  *.o
13
13
  *.a
14
14
  mkmf.log
15
+ .idea/
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014 TODO: Write your name
1
+ Copyright (c) 2015 James Ruston
2
2
 
3
3
  MIT License
4
4
 
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 'PostcodesIO'
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
@@ -1,9 +1,11 @@
1
1
  require "postcodes_io/version"
2
2
  require "postcodes_io/lookup"
3
+ require "postcodes_io/autocomplete"
3
4
  require "postcodes_io/postcode"
4
5
 
5
6
  module Postcodes
6
7
  class IO
7
8
  include Lookup
9
+ include Autocomplete
8
10
  end
9
11
  end
@@ -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
@@ -0,0 +1,12 @@
1
+ require "postcodes_io/base"
2
+
3
+ module Postcodes
4
+ class AutocompleteList < Base
5
+
6
+ attr_reader :list
7
+
8
+ def initialize(list)
9
+ @list = list
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ module Postcodes
2
+ class Base
3
+ # allow accessing info values with dot notation
4
+ def method_missing(name, *args, &block)
5
+ return @info[name.to_s] if @info.key? name.to_s
6
+ return @info[name] if @info.key? name
7
+ super.method_missing name
8
+ end
9
+ end
10
+ 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
@@ -1,3 +1,3 @@
1
1
  module Postcodes
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -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
@@ -0,0 +1,14 @@
1
+ {
2
+ "result": [
3
+ "NN10 0AA",
4
+ "NN10 0AD",
5
+ "NN10 0AE",
6
+ "NN10 0AF",
7
+ "NN10 0AG",
8
+ "NN10 0AH",
9
+ "NN10 0AJ",
10
+ "NN10 0AL",
11
+ "NN10 0AN",
12
+ "NN10 0AP"
13
+ ]
14
+ }
@@ -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
@@ -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.1.1
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: 2014-08-21 00:00:00.000000000 Z
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.2.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