postcodes_io 0.1.1 → 0.2.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.
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