addressfinder 1.1.0 → 1.1.1

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: 66c372b498b7ea4985e39e71a716d420c1c513b6
4
- data.tar.gz: 3fc1051f78850bba86129bcb27dd559af33fc0f3
3
+ metadata.gz: 75748dbec5997618df1a9aef78d9bfabced2f496
4
+ data.tar.gz: 77750d90c4738a6fcfd099837d76cae0dd9ff825
5
5
  SHA512:
6
- metadata.gz: 68dfa823334e903b4e3d13b78ab3b09e42295524b4fe9ada388691fe2fd5c323eb765036220bf179c8378167fd406531a419d29b89917f20714679d262c8667d
7
- data.tar.gz: 1afe7e53b11b4962fc65e6f63c28e0ded310e6f72507b0e91ec52afee9397bcdfeeb4ff0b4bdb183640d035b2efc55798b3e810541f1437e1d7d9f9c45bbe855
6
+ metadata.gz: cfcd83c4a5a3fcde6b12a71587a8f60b5a2044f1fffc4eba479baa14ab51300d1537ee80a376076e896a3d05f297f1171a1d5bbd64e624fe1ef798524eb98440
7
+ data.tar.gz: 67b503303c3c5360112b77e256187492c952bf4da48ae9881943aaed606d24fa916e55d7f43d7e44ba65e26eacc0f8b0f0e87f332b8ef6682e4a8d45d30c56a6
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.2
4
+ - 2.2.3
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ # AddressFinder 1.1.1 (September 14, 2015) #
2
+
3
+ * Minor bugfixes
4
+
5
+ # AddressFinder 1.1.0 (September 11, 2015) #
6
+
7
+ * Support for bulk operations
8
+
1
9
  # AddressFinder 1.0.0 (September 10, 2015) #
2
10
 
3
11
  * Support for address cleansing API
data/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # AddressFinder Ruby Gem
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/addressfinder.svg)](http://badge.fury.io/rb/addressfinder)
4
+ [![Build Status](https://travis-ci.org/AbleTech/addressfinder-ruby.svg)](https://travis-ci.org/AbleTech/addressfinder-ruby)
5
+
3
6
  A client library for accessing the AddressFinder APIs.
4
7
 
5
8
  ## Installation
@@ -23,19 +26,23 @@ Or install it yourself as:
23
26
  You should call the configure block on startup of your app. In a Ruby on Rails application this
24
27
  is normally performed in an initializer file. For example `./config/initializers/addressfinder.rb`
25
28
 
26
- AddressFinder.configure do |af|
27
- # Mandatory configuration
28
- af.api_key = 'XXXXXXXXXX'
29
- af.api_secret = 'YYYYYYYYYY'
30
- af.default_country = 'nz'
31
-
32
- # Optional configuration
33
- af.timeout = 10 # seconds
34
- af.proxy_host = 'corp.proxy.com'
35
- af.proxy_port = 8080
36
- af.proxy_user = 'username'
37
- af.proxy_password = 'password'
38
- end
29
+ ```ruby
30
+ AddressFinder.configure do |af|
31
+ # Mandatory configuration
32
+ af.api_key = 'XXXXXXXXXX'
33
+ af.api_secret = 'YYYYYYYYYY'
34
+ af.default_country = 'nz'
35
+
36
+ # Optional configuration
37
+ af.timeout = 10 # seconds
38
+ af.proxy_host = 'corp.proxy.com'
39
+ af.proxy_port = 8080
40
+ af.proxy_user = 'username'
41
+ af.proxy_password = 'password'
42
+ end
43
+ ```
44
+
45
+ You can obtain your API key and secret from the AddressFinder Portal.
39
46
 
40
47
  ### Address Cleansing
41
48
 
@@ -45,10 +52,33 @@ https://addressfinder.nz/docs/address_cleanse_api/
45
52
 
46
53
  Usage example:
47
54
 
48
- result = AddressFinder.cleanse(q: '186 Willis St, Wellington')
55
+ ```ruby
56
+ result = AddressFinder.cleanse(q: '186 Willis St, Wellington')
57
+
58
+ if result
59
+ $stdout.puts "Success: #{result.postal}"
60
+ else
61
+ $stdout.puts "Sorry, can't find that address"
62
+ end
63
+ ```
64
+
65
+ ### Bulk Operations
66
+
67
+ If you have a series of calls you need to make to AddressFinder, you can use the
68
+ bulk method which re-uses the HTTP connection.
69
+
70
+ Usage example:
71
+
72
+ ```ruby
73
+ AddressFinder.bulk do |af|
74
+ CSV.foreach('auckland_addresses.csv') do |row|
75
+ result = af.cleanse(q: row[0], region_code: '1')
49
76
 
50
77
  if result
51
- $stdout.puts "Found: #{result.postal}"
78
+ $stdout.puts "Success: #{result.postal}"
52
79
  else
53
80
  $stdout.puts "Sorry, can't find that address"
54
81
  end
82
+ end
83
+ end
84
+ ```
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new
5
+
6
+ task :default => :spec
7
+ task :test => :spec
@@ -14,4 +14,12 @@ Gem::Specification.new do |gem|
14
14
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
15
15
  gem.test_files = gem.files.grep(%r{^(spec|features)/})
16
16
  gem.require_paths = ["lib"]
17
+
18
+ gem.required_ruby_version = '~> 2.1'
19
+ gem.add_runtime_dependency 'multi_json', '~> 1.0'
20
+
21
+ gem.add_development_dependency 'rspec', '>= 3.3.0'
22
+ gem.add_development_dependency 'bundler'
23
+ gem.add_development_dependency 'rake'
24
+ gem.add_development_dependency 'webmock'
17
25
  end
data/lib/addressfinder.rb CHANGED
@@ -1,6 +1,9 @@
1
+ require 'net/http'
2
+ require 'multi_json'
1
3
  require 'addressfinder/version'
2
4
  require 'addressfinder/configuration'
3
5
  require 'addressfinder/cleanse'
6
+ require 'addressfinder/bulk'
4
7
  require 'addressfinder/errors'
5
8
 
6
9
  module AddressFinder
@@ -19,8 +22,26 @@ module AddressFinder
19
22
  @configuration ||= AddressFinder::Configuration.new
20
23
  end
21
24
 
22
- def cleanse(*args)
23
- AddressFinder::Cleanse.new(*args).perform
25
+ def cleanse(args={})
26
+ AddressFinder::Cleanse.new(args.merge(http: configure_http)).perform.result
27
+ end
28
+
29
+ def bulk(&block)
30
+ # TODO include parameter http: configure_http
31
+ AddressFinder::Bulk.new(&block).perform
32
+ end
33
+
34
+ private
35
+
36
+ def configure_http
37
+ http = Net::HTTP.new(configuration.hostname, configuration.port,
38
+ configuration.proxy_host, configuration.proxy_port,
39
+ configuration.proxy_user, configuration.proxy_password)
40
+ http.open_timeout = configuration.timeout
41
+ http.read_timeout = configuration.timeout
42
+ http.use_ssl = true
43
+
44
+ http
24
45
  end
25
46
  end
26
47
  end
@@ -0,0 +1,37 @@
1
+ module AddressFinder
2
+ class Bulk
3
+ def initialize(&block)
4
+ @block = block
5
+ end
6
+
7
+ def perform
8
+ Net::HTTP.start(config.hostname, config.port, use_ssl: true,
9
+ open_timeout: config.timeout,
10
+ read_timeout: config.timeout) do |http|
11
+ block.call ClientProxy.new(http: http)
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ attr_reader :block
18
+
19
+ def config
20
+ @_config ||= AddressFinder.configuration
21
+ end
22
+
23
+ class ClientProxy
24
+ def initialize(http:)
25
+ @http = http
26
+ end
27
+
28
+ def cleanse(args={})
29
+ AddressFinder::Cleanse.new(args.merge(http: http)).perform
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :http
35
+ end
36
+ end
37
+ end
@@ -1,6 +1,11 @@
1
+ require 'ostruct'
2
+
1
3
  module AddressFinder
2
4
  class Cleanse
3
- def initialize(q:, country: nil, delivered: nil, post_box: nil, rural: nil, region_code: nil)
5
+
6
+ attr_reader :result
7
+
8
+ def initialize(q:, country: nil, delivered: nil, post_box: nil, rural: nil, region_code: nil, http:)
4
9
  @params = {}
5
10
  @params['q'] = q
6
11
  @params['delivered'] = delivered if delivered
@@ -11,35 +16,34 @@ module AddressFinder
11
16
  @params['key'] = config.api_key
12
17
  @params['secret'] = config.api_secret
13
18
  @country = country || config.default_country
19
+ @http = http
14
20
  end
15
21
 
16
22
  def perform
17
23
  build_request
18
24
  execute_request
19
25
  build_result
26
+
27
+ self
20
28
  end
21
29
 
22
30
  private
23
31
 
24
- attr_reader :full_url, :params, :response_body, :response_status, :result, :country
32
+ attr_reader :request_uri, :params, :result, :country, :http
33
+ attr_accessor :response_body, :response_status
34
+ attr_writer :result
25
35
 
26
36
  def build_request
27
- @full_url = "https://#{config.hostname}:#{config.port}/api/#{country}/address/cleanse?#{encoded_params}"
37
+ @request_uri = "/api/#{country}/address/cleanse?#{encoded_params}"
28
38
  end
29
39
 
30
40
  def execute_request
31
- uri = URI.parse(full_url)
32
- http = Net::HTTP.new(uri.host, uri.port, config.proxy_host, config.proxy_port, config.proxy_user, config.proxy_password)
33
- http.open_timeout = config.timeout
34
- http.read_timeout = config.timeout
35
- http.use_ssl = (uri.scheme == "https")
36
-
37
- request = Net::HTTP::Get.new(uri.request_uri)
41
+ request = Net::HTTP::Get.new(request_uri)
38
42
 
39
43
  response = http.request(request)
40
44
 
41
- @response_body = response.body
42
- @response_status = response.code
45
+ self.response_body = response.body
46
+ self.response_status = response.code
43
47
  end
44
48
 
45
49
  def build_result
@@ -48,10 +52,10 @@ module AddressFinder
48
52
  end
49
53
 
50
54
  if response_hash['matched']
51
- return Result.new(response_hash)
55
+ self.result = Result.new(response_hash)
56
+ else
57
+ self.result = nil
52
58
  end
53
-
54
- nil
55
59
  end
56
60
 
57
61
  def encoded_params
@@ -60,7 +64,7 @@ module AddressFinder
60
64
  end
61
65
 
62
66
  def response_hash
63
- @_response_hash ||= JSON.parse(response_body)
67
+ @_response_hash ||= MultiJson.load(response_body)
64
68
  end
65
69
 
66
70
  def config
@@ -15,6 +15,7 @@ module AddressFinder
15
15
  self.hostname = 'api.addressfinder.io'
16
16
  self.port = 443
17
17
  self.timeout = 10
18
+ self.default_country = 'nz'
18
19
  end
19
20
  end
20
21
  end
@@ -1,3 +1,3 @@
1
1
  module AddressFinder
2
- VERSION = '1.1.0'
2
+ VERSION = '1.1.1'
3
3
  end
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe AddressFinder::Cleanse do
4
+ before do
5
+ AddressFinder.configure do |af|
6
+ af.api_key = 'XXX'
7
+ af.api_secret = 'YYY'
8
+ af.default_country = 'nz'
9
+ end
10
+ end
11
+
12
+ describe '#build_request' do
13
+ let(:cleanser){ AddressFinder::Cleanse.new(args) }
14
+ let(:http){ AddressFinder.send(:configure_http) }
15
+
16
+ subject(:request_uri){ cleanser.send(:build_request) }
17
+
18
+ context 'with minimal arguments' do
19
+ let(:args){ {q: '186 willis st', http: http} }
20
+
21
+ it { expect(request_uri).to eq('/api/nz/address/cleanse?q=186%20willis%20st&format=json&key=XXX&secret=YYY') }
22
+ end
23
+
24
+ context 'with more arguments' do
25
+ let(:args){ {q: '186 willis st', delivered: true, region_code: 'A', http: http} }
26
+
27
+ it { expect(request_uri).to eq('/api/nz/address/cleanse?q=186%20willis%20st&delivered=true&region_code=A&format=json&key=XXX&secret=YYY') }
28
+ end
29
+
30
+ context 'with a country override' do
31
+ let(:args){ {q: '186 willis st', country: 'au', http: http} }
32
+
33
+ it { expect(request_uri).to eq('/api/au/address/cleanse?q=186%20willis%20st&format=json&key=XXX&secret=YYY') }
34
+ end
35
+ end
36
+
37
+ describe '#build_result' do
38
+ let(:cleanser){ AddressFinder::Cleanse.new(q: 'ignored', http: nil) }
39
+
40
+ before do
41
+ cleanser.send('response_body=', body)
42
+ cleanser.send('response_status=', status)
43
+ end
44
+
45
+ subject(:result){ cleanser.send(:build_result) }
46
+
47
+ context 'with a successful result' do
48
+ let(:body){ '{"matched": true, "postal_address": "Texas"}' }
49
+ let(:status){ '200' }
50
+
51
+ it { expect(result.class).to eq(AddressFinder::Cleanse::Result) }
52
+
53
+ it { expect(result.matched).to eq(true) }
54
+
55
+ it { expect(result.postal_address).to eq("Texas") }
56
+ end
57
+
58
+ context 'with an unfound result' do
59
+ let(:body){ '{"matched": false}' }
60
+ let(:status){ '200' }
61
+
62
+ it { expect(result).to eq(nil) }
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,17 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper.rb"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+
8
+ require 'rubygems'
9
+ require 'bundler'
10
+ require 'webmock/rspec'
11
+ require 'addressfinder'
12
+
13
+ RSpec.configure do |config|
14
+ config.mock_with :rspec
15
+ end
16
+
17
+ WebMock.disable_net_connect!
metadata CHANGED
@@ -1,15 +1,85 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: addressfinder
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nigel Ramsay
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-11 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2015-09-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: multi_json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 3.3.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 3.3.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: webmock
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
13
83
  description: Ruby client library for AddressFinder
14
84
  email:
15
85
  - nigel@abletech.nz
@@ -18,16 +88,21 @@ extensions: []
18
88
  extra_rdoc_files: []
19
89
  files:
20
90
  - ".gitignore"
91
+ - ".travis.yml"
21
92
  - CHANGELOG.md
22
93
  - Gemfile
23
94
  - LICENSE
24
95
  - README.md
96
+ - Rakefile
25
97
  - addressfinder.gemspec
26
98
  - lib/addressfinder.rb
99
+ - lib/addressfinder/bulk.rb
27
100
  - lib/addressfinder/cleanse.rb
28
101
  - lib/addressfinder/configuration.rb
29
102
  - lib/addressfinder/errors.rb
30
103
  - lib/addressfinder/version.rb
104
+ - spec/lib/addressfinder/cleanse_spec.rb
105
+ - spec/spec_helper.rb
31
106
  homepage: https://github.com/AbleTech/addressfinder-ruby
32
107
  licenses: []
33
108
  metadata: {}
@@ -37,9 +112,9 @@ require_paths:
37
112
  - lib
38
113
  required_ruby_version: !ruby/object:Gem::Requirement
39
114
  requirements:
40
- - - ">="
115
+ - - "~>"
41
116
  - !ruby/object:Gem::Version
42
- version: '0'
117
+ version: '2.1'
43
118
  required_rubygems_version: !ruby/object:Gem::Requirement
44
119
  requirements:
45
120
  - - ">="
@@ -47,8 +122,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
47
122
  version: '0'
48
123
  requirements: []
49
124
  rubyforge_project:
50
- rubygems_version: 2.4.6
125
+ rubygems_version: 2.4.8
51
126
  signing_key:
52
127
  specification_version: 4
53
128
  summary: Provides easy access to AddressFinder APIs
54
- test_files: []
129
+ test_files:
130
+ - spec/lib/addressfinder/cleanse_spec.rb
131
+ - spec/spec_helper.rb