addressfinder 1.1.0 → 1.1.1

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: 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