smartystreets_ruby_sdk 2.0.2 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Makefile +1 -1
- data/Vagrantfile +4 -2
- data/examples/international_example.rb +31 -0
- data/examples/us_autocomplete_example.rb +38 -0
- data/examples/us_extract_example.rb +52 -0
- data/examples/us_street_multiple_address_example.rb +11 -9
- data/examples/us_street_single_address_example.rb +3 -3
- data/examples/us_zipcode_multiple_lookup_example.rb +7 -5
- data/examples/us_zipcode_single_lookup_example.rb +3 -3
- data/lib/smartystreets_ruby_sdk/batch.rb +7 -3
- data/lib/smartystreets_ruby_sdk/client_builder.rb +118 -0
- data/lib/smartystreets_ruby_sdk/errors.rb +15 -7
- data/lib/smartystreets_ruby_sdk/exceptions.rb +12 -5
- data/lib/smartystreets_ruby_sdk/international_street.rb +10 -0
- data/lib/smartystreets_ruby_sdk/international_street/analysis.rb +13 -0
- data/lib/smartystreets_ruby_sdk/international_street/candidate.rb +33 -0
- data/lib/smartystreets_ruby_sdk/international_street/client.rb +56 -0
- data/lib/smartystreets_ruby_sdk/international_street/components.rb +55 -0
- data/lib/smartystreets_ruby_sdk/international_street/language_mode.rb +5 -0
- data/lib/smartystreets_ruby_sdk/international_street/lookup.rb +80 -0
- data/lib/smartystreets_ruby_sdk/international_street/metadata.rb +14 -0
- data/lib/smartystreets_ruby_sdk/json_able.rb +3 -3
- data/lib/smartystreets_ruby_sdk/native_sender.rb +6 -2
- data/lib/smartystreets_ruby_sdk/request.rb +2 -1
- data/lib/smartystreets_ruby_sdk/retry_sender.rb +5 -7
- data/lib/smartystreets_ruby_sdk/us_autocomplete.rb +7 -0
- data/lib/smartystreets_ruby_sdk/us_autocomplete/client.rb +66 -0
- data/lib/smartystreets_ruby_sdk/us_autocomplete/geolocation_type.rb +5 -0
- data/lib/smartystreets_ruby_sdk/us_autocomplete/lookup.rb +34 -0
- data/lib/smartystreets_ruby_sdk/us_autocomplete/suggestion.rb +14 -0
- data/lib/smartystreets_ruby_sdk/us_extract.rb +8 -0
- data/lib/smartystreets_ruby_sdk/us_extract/address.rb +22 -0
- data/lib/smartystreets_ruby_sdk/us_extract/client.rb +46 -0
- data/lib/smartystreets_ruby_sdk/us_extract/lookup.rb +20 -0
- data/lib/smartystreets_ruby_sdk/us_extract/metadata.rb +15 -0
- data/lib/smartystreets_ruby_sdk/us_extract/result.rb +19 -0
- data/lib/smartystreets_ruby_sdk/us_street.rb +1 -1
- data/lib/smartystreets_ruby_sdk/us_street/analysis.rb +1 -0
- data/lib/smartystreets_ruby_sdk/us_street/candidate.rb +1 -0
- data/lib/smartystreets_ruby_sdk/us_street/client.rb +9 -5
- data/lib/smartystreets_ruby_sdk/us_street/components.rb +3 -0
- data/lib/smartystreets_ruby_sdk/us_street/lookup.rb +6 -0
- data/lib/smartystreets_ruby_sdk/us_street/match_type.rb +5 -0
- data/lib/smartystreets_ruby_sdk/us_street/metadata.rb +1 -0
- data/lib/smartystreets_ruby_sdk/us_zipcode.rb +1 -1
- data/lib/smartystreets_ruby_sdk/us_zipcode/alternate_county.rb +13 -0
- data/lib/smartystreets_ruby_sdk/us_zipcode/city.rb +2 -0
- data/lib/smartystreets_ruby_sdk/us_zipcode/client.rb +12 -4
- data/lib/smartystreets_ruby_sdk/us_zipcode/lookup.rb +4 -0
- data/lib/smartystreets_ruby_sdk/us_zipcode/result.rb +3 -2
- data/lib/smartystreets_ruby_sdk/us_zipcode/zip_code.rb +16 -3
- data/lib/smartystreets_ruby_sdk/version.rb +1 -1
- metadata +28 -7
- data/lib/smartystreets_ruby_sdk/core_client_builder.rb +0 -57
- data/lib/smartystreets_ruby_sdk/match_type.rb +0 -5
- data/lib/smartystreets_ruby_sdk/us_street/client_builder.rb +0 -15
- data/lib/smartystreets_ruby_sdk/us_zipcode/client_builder.rb +0 -15
@@ -0,0 +1,34 @@
|
|
1
|
+
require_relative '../json_able'
|
2
|
+
|
3
|
+
module USAutocomplete
|
4
|
+
# In addition to holding all of the input data for this lookup, this class also will contain the result
|
5
|
+
# of the lookup after it comes back from the API.
|
6
|
+
#
|
7
|
+
# See "https://smartystreets.com/docs/cloud/us-autocomplete-api#http-request-input-fields"
|
8
|
+
class Lookup < JSONAble
|
9
|
+
|
10
|
+
attr_accessor :result, :prefix, :state_filter, :prefer, :max_suggestions, :geolocate_type, :city_filter
|
11
|
+
|
12
|
+
def initialize(prefix=nil, suggestions=nil, city_filter=nil, state_filter=nil, prefer=nil, geolocate_type=nil)
|
13
|
+
@result = []
|
14
|
+
@prefix = prefix
|
15
|
+
@max_suggestions = suggestions
|
16
|
+
@city_filter = city_filter ? city_filter : []
|
17
|
+
@state_filter = state_filter ? state_filter : []
|
18
|
+
@prefer = prefer ? prefer : []
|
19
|
+
@geolocate_type = geolocate_type
|
20
|
+
end
|
21
|
+
|
22
|
+
def add_city_filter(city)
|
23
|
+
@city_filter.push(city)
|
24
|
+
end
|
25
|
+
|
26
|
+
def add_state_filter(state)
|
27
|
+
@state_filter.push(state)
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_prefer(prefer)
|
31
|
+
@prefer.push(prefer)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module USAutocomplete
|
2
|
+
# See "https://smartystreets.com/docs/cloud/us-autocomplete-api#http-response"
|
3
|
+
class Suggestion
|
4
|
+
|
5
|
+
attr_reader :text, :street_line, :state, :city
|
6
|
+
|
7
|
+
def initialize(obj)
|
8
|
+
@text = obj.fetch('text', nil)
|
9
|
+
@street_line = obj.fetch('street_line', nil)
|
10
|
+
@city = obj.fetch('city', nil)
|
11
|
+
@state = obj.fetch('state', nil)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require_relative '../us_street/candidate'
|
2
|
+
|
3
|
+
module USExtract
|
4
|
+
# See "https://smartystreets.com/docs/cloud/us-extract-api#http-response-status"
|
5
|
+
class Address
|
6
|
+
attr_reader :text, :start, :verified, :end, :line, :candidates
|
7
|
+
|
8
|
+
def initialize(obj)
|
9
|
+
@text = obj['text']
|
10
|
+
@verified = obj['verified']
|
11
|
+
@line = obj['line']
|
12
|
+
@start = obj['start']
|
13
|
+
@end = obj['end']
|
14
|
+
candidates = obj.fetch('api_output', [])
|
15
|
+
@candidates = []
|
16
|
+
|
17
|
+
candidates.each { |candidate|
|
18
|
+
@candidates.push(USStreet::Candidate.new(candidate))
|
19
|
+
}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require_relative '../request'
|
2
|
+
require_relative '../exceptions'
|
3
|
+
require_relative 'result'
|
4
|
+
|
5
|
+
module USExtract
|
6
|
+
# It is recommended to instantiate this class using ClientBuilder.build_us_extract_api_client()
|
7
|
+
class Client
|
8
|
+
def initialize(sender, serializer)
|
9
|
+
@sender = sender
|
10
|
+
@serializer = serializer
|
11
|
+
end
|
12
|
+
|
13
|
+
# Sends a Lookup object to the US Extract Code API and stores the result in the Lookup's result field.
|
14
|
+
# It also returns the result directly.
|
15
|
+
def send(lookup)
|
16
|
+
if lookup.nil? or lookup.text.nil? or not lookup.text.is_a? String or lookup.text.empty?
|
17
|
+
raise SmartyException, 'Client.send() requires a Lookup with the "text" field set'
|
18
|
+
end
|
19
|
+
|
20
|
+
request = build_request(lookup)
|
21
|
+
response = @sender.send(request)
|
22
|
+
result = Result.new(@serializer.deserialize(response.payload))
|
23
|
+
|
24
|
+
lookup.result = result
|
25
|
+
end
|
26
|
+
|
27
|
+
def build_request(lookup)
|
28
|
+
request = Request.new
|
29
|
+
request.content_type = 'text/plain'
|
30
|
+
request.payload = lookup.text
|
31
|
+
|
32
|
+
add_parameter(request, 'html', lookup.html.to_s)
|
33
|
+
add_parameter(request, 'aggressive', lookup.aggressive.to_s)
|
34
|
+
add_parameter(request, 'addr_line_breaks', lookup.addresses_have_line_breaks.to_s)
|
35
|
+
add_parameter(request, 'addr_per_line', lookup.addresses_per_line.to_s)
|
36
|
+
|
37
|
+
request
|
38
|
+
end
|
39
|
+
|
40
|
+
def add_parameter(request, key, value)
|
41
|
+
if value and not value.empty?
|
42
|
+
request.parameters[key] = value
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative '../json_able'
|
2
|
+
|
3
|
+
module USExtract
|
4
|
+
# In addition to holding all of the input data for this lookup, this class also will contain the result
|
5
|
+
# of the lookup after it comes back from the API.
|
6
|
+
#
|
7
|
+
# See "https://smartystreets.com/docs/cloud/us-extract-api#http-request-input-fields"
|
8
|
+
class Lookup < JSONAble
|
9
|
+
attr_accessor :text, :result, :aggressive, :addresses_per_line, :html, :addresses_have_line_breaks
|
10
|
+
|
11
|
+
def initialize(text=nil, html=nil, aggressive=nil, addresses_have_line_breaks=nil, addresses_per_line=nil)
|
12
|
+
@text = text
|
13
|
+
@html = html
|
14
|
+
@aggressive = aggressive
|
15
|
+
@addresses_have_line_breaks = addresses_have_line_breaks
|
16
|
+
@addresses_per_line = addresses_per_line
|
17
|
+
@result = nil
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module USExtract
|
2
|
+
# See "https://smartystreets.com/docs/cloud/us-extract-api#http-response-status"
|
3
|
+
class Metadata
|
4
|
+
attr_reader :unicode, :lines, :verified_count, :character_count, :bytes, :address_count
|
5
|
+
|
6
|
+
def initialize(obj)
|
7
|
+
@lines = obj['lines']
|
8
|
+
@unicode = obj['unicode']
|
9
|
+
@address_count = obj['address_count']
|
10
|
+
@verified_count = obj['verified_count']
|
11
|
+
@bytes = obj['bytes']
|
12
|
+
@character_count = obj['character_count']
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative './address'
|
2
|
+
require_relative './metadata'
|
3
|
+
|
4
|
+
module USExtract
|
5
|
+
# See "https://smartystreets.com/docs/cloud/us-extract-api#http-response-status"
|
6
|
+
class Result
|
7
|
+
attr_reader :metadata, :addresses
|
8
|
+
|
9
|
+
def initialize(obj)
|
10
|
+
@metadata = Metadata.new(obj.fetch('meta', {}))
|
11
|
+
addresses = obj.fetch('addresses', [])
|
12
|
+
@addresses = []
|
13
|
+
|
14
|
+
addresses.each { |address|
|
15
|
+
@addresses.push(Address.new(address))
|
16
|
+
}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
require_relative './us_street/analysis'
|
2
2
|
require_relative './us_street/candidate'
|
3
3
|
require_relative './us_street/client'
|
4
|
-
require_relative './us_street/client_builder'
|
5
4
|
require_relative './us_street/components'
|
6
5
|
require_relative './us_street/lookup'
|
7
6
|
require_relative './us_street/metadata'
|
7
|
+
require_relative './us_street/match_type'
|
8
8
|
|
9
9
|
module USStreet
|
10
10
|
end
|
@@ -3,6 +3,7 @@ require_relative 'metadata'
|
|
3
3
|
require_relative 'analysis'
|
4
4
|
|
5
5
|
module USStreet
|
6
|
+
# See "https://smartystreets.com/docs/cloud/us-street-api#metadata"
|
6
7
|
class Candidate
|
7
8
|
attr_reader :input_index, :candidate_index, :addressee, :delivery_line_1, :delivery_line_2, :delivery_point_barcode,
|
8
9
|
:last_line, :metadata, :components, :analysis
|
@@ -3,22 +3,26 @@ require_relative '../request'
|
|
3
3
|
require_relative 'candidate'
|
4
4
|
|
5
5
|
module USStreet
|
6
|
+
# It is recommended to instantiate this class using ClientBuilder.build_us_street_api_client
|
6
7
|
class Client
|
7
8
|
def initialize(sender, serializer)
|
8
9
|
@sender = sender
|
9
10
|
@serializer = serializer
|
10
11
|
end
|
11
12
|
|
13
|
+
# Sends a Lookup object to the US Street API and stores the result in the Lookup's result field.
|
12
14
|
def send_lookup(lookup)
|
13
15
|
batch = Batch.new
|
14
16
|
batch.add(lookup)
|
15
17
|
send_batch(batch)
|
16
18
|
end
|
17
19
|
|
20
|
+
# Sends a Batch object containing no more than 100 Lookup objects to the US Street API and stores the
|
21
|
+
# results in the result field of the Lookup object.
|
18
22
|
def send_batch(batch)
|
19
23
|
smarty_request = Request.new
|
20
24
|
|
21
|
-
return if batch.
|
25
|
+
return if batch.empty?
|
22
26
|
|
23
27
|
converted_lookups = remap_keys(batch.all_lookups)
|
24
28
|
smarty_request.payload = @serializer.serialize(converted_lookups)
|
@@ -35,7 +39,7 @@ module USStreet
|
|
35
39
|
|
36
40
|
def remap_keys(obj)
|
37
41
|
converted_obj = []
|
38
|
-
obj.each
|
42
|
+
obj.each do |lookup|
|
39
43
|
converted_lookup = {}
|
40
44
|
|
41
45
|
converted_lookup['street'] = lookup.street
|
@@ -51,15 +55,15 @@ module USStreet
|
|
51
55
|
converted_lookup['candidates'] = lookup.candidates
|
52
56
|
|
53
57
|
converted_obj.push(converted_lookup)
|
54
|
-
|
58
|
+
end
|
55
59
|
converted_obj
|
56
60
|
end
|
57
61
|
|
58
62
|
def assign_candidates_to_lookups(batch, candidates)
|
59
|
-
candidates.each
|
63
|
+
candidates.each do |raw_candidate|
|
60
64
|
candidate = Candidate.new(raw_candidate)
|
61
65
|
batch[candidate.input_index].result.push(candidate)
|
62
|
-
|
66
|
+
end
|
63
67
|
end
|
64
68
|
end
|
65
69
|
end
|
@@ -1,4 +1,7 @@
|
|
1
1
|
module USStreet
|
2
|
+
# This class contains the matched address broken down into its fundamental pieces.
|
3
|
+
#
|
4
|
+
# See "https://smartystreets.com/docs/cloud/us-street-api#components"
|
2
5
|
class Components
|
3
6
|
attr_reader :street_postdirection, :delivery_point_check_digit, :secondary_designator, :secondary_number, :zipcode,
|
4
7
|
:pmb_number, :state_abbreviation, :extra_secondary_designator, :urbanization, :street_name, :city_name,
|
@@ -1,6 +1,12 @@
|
|
1
1
|
require_relative '../json_able'
|
2
2
|
|
3
3
|
module USStreet
|
4
|
+
# In addition to holding all of the input data for this lookup, this class also will contain
|
5
|
+
# the result of the lookup after it comes back from the API.
|
6
|
+
#
|
7
|
+
# See "https://smartystreets.com/docs/cloud/us-street-api#input-fields"
|
8
|
+
#
|
9
|
+
# @match:: Must be set to 'strict', 'range', or 'invalid'. Constants for these are in match_type.rb
|
4
10
|
class Lookup < JSONAble
|
5
11
|
attr_accessor :input_id, :street, :street2, :secondary, :city, :state, :zipcode, :lastline, :addressee, :urbanization,
|
6
12
|
:match, :candidates, :result
|
@@ -1,4 +1,5 @@
|
|
1
1
|
module USStreet
|
2
|
+
# See "https://smartystreets.com/docs/cloud/us-street-api#metadata"
|
2
3
|
class Metadata
|
3
4
|
attr_reader :elot_sort, :longitude, :elot_sequence, :county_fips, :building_default_indicator, :rdi,
|
4
5
|
:congressional_district, :latitude, :precision, :time_zone, :zip_type, :county_name, :utc_offset,
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require_relative './us_zipcode/city'
|
2
2
|
require_relative './us_zipcode/client'
|
3
|
-
require_relative './us_zipcode/client_builder'
|
4
3
|
require_relative './us_zipcode/lookup'
|
5
4
|
require_relative './us_zipcode/result'
|
6
5
|
require_relative './us_zipcode/zip_code'
|
6
|
+
require_relative './us_zipcode/alternate_county'
|
7
7
|
|
8
8
|
module USZipcode
|
9
9
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module USZipcode
|
2
|
+
# See "https://smartystreets.com/docs/cloud/us-zipcode-api#zipcodes"
|
3
|
+
class AlternateCounty
|
4
|
+
attr_reader :state_abbreviation, :state, :county_name, :county_fips
|
5
|
+
|
6
|
+
def initialize(obj)
|
7
|
+
@county_fips = obj.fetch('county_fips', nil)
|
8
|
+
@county_name = obj.fetch('county_name', nil)
|
9
|
+
@state_abbreviation = obj.fetch('state_abbreviation', nil)
|
10
|
+
@state = obj.fetch('state', nil)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -3,22 +3,26 @@ require_relative '../batch'
|
|
3
3
|
require_relative '../request'
|
4
4
|
|
5
5
|
module USZipcode
|
6
|
+
# It is recommended to instantiate this class using ClientBuilder.build_us_zipcode_api_client.
|
6
7
|
class Client
|
7
8
|
def initialize(sender, serializer)
|
8
9
|
@sender = sender
|
9
10
|
@serializer = serializer
|
10
11
|
end
|
11
12
|
|
13
|
+
# Sends a Lookup object to the US ZIP Code API and stores the result in the Lookup's result field.
|
12
14
|
def send_lookup(lookup)
|
13
15
|
batch = Batch.new
|
14
16
|
batch.add(lookup)
|
15
17
|
send_batch(batch)
|
16
18
|
end
|
17
19
|
|
20
|
+
# Sends a Batch object containing no more than 100 Lookup objects to the US ZIP Code API and stores the
|
21
|
+
# results in the result field of the Lookup object.
|
18
22
|
def send_batch(batch)
|
19
23
|
smarty_request = Request.new
|
20
24
|
|
21
|
-
return if batch.
|
25
|
+
return if batch.empty?
|
22
26
|
|
23
27
|
converted_lookups = remap_keys(batch.all_lookups)
|
24
28
|
smarty_request.payload = @serializer.serialize(converted_lookups)
|
@@ -44,14 +48,18 @@ module USZipcode
|
|
44
48
|
obj.each do |lookup|
|
45
49
|
converted_lookup = {}
|
46
50
|
|
47
|
-
converted_lookup
|
48
|
-
converted_lookup
|
49
|
-
converted_lookup
|
51
|
+
add_field(converted_lookup, 'city', lookup.city)
|
52
|
+
add_field(converted_lookup, 'state', lookup.state)
|
53
|
+
add_field(converted_lookup, 'zipcode', lookup.zipcode)
|
50
54
|
|
51
55
|
converted_obj.push(converted_lookup)
|
52
56
|
end
|
53
57
|
|
54
58
|
converted_obj
|
55
59
|
end
|
60
|
+
|
61
|
+
def add_field(converted_lookup, key, value)
|
62
|
+
converted_lookup[key] = value unless value.nil? or value.empty?
|
63
|
+
end
|
56
64
|
end
|
57
65
|
end
|
@@ -1,5 +1,9 @@
|
|
1
1
|
require_relative '../json_able'
|
2
2
|
module USZipcode
|
3
|
+
# In addition to holding all of the input data for this lookup, this class also
|
4
|
+
# will contain the result of the lookup after it comes back from the API.
|
5
|
+
#
|
6
|
+
# See "https://smartystreets.com/docs/cloud/us-zipcode-api#http-request-input-fields"
|
3
7
|
class Lookup < JSONAble
|
4
8
|
attr_accessor :result, :state, :zipcode, :input_id, :city
|
5
9
|
|
@@ -2,6 +2,7 @@ require_relative 'city'
|
|
2
2
|
require_relative 'zip_code'
|
3
3
|
|
4
4
|
module USZipcode
|
5
|
+
# See "https://smartystreets.com/docs/cloud/us-zipcode-api#root"
|
5
6
|
class Result
|
6
7
|
attr_reader :reason, :input_index, :cities, :zipcodes, :status
|
7
8
|
|
@@ -16,8 +17,8 @@ module USZipcode
|
|
16
17
|
@zipcodes = convert_zipcodes
|
17
18
|
end
|
18
19
|
|
19
|
-
def
|
20
|
-
@status
|
20
|
+
def valid?
|
21
|
+
@status.nil? and @reason.nil?
|
21
22
|
end
|
22
23
|
|
23
24
|
def convert_cities
|
@@ -1,6 +1,11 @@
|
|
1
|
+
require_relative 'alternate_county'
|
2
|
+
|
1
3
|
module USZipcode
|
4
|
+
# See "https://smartystreets.com/docs/cloud/us-zipcode-api#zipcodes"
|
2
5
|
class ZipCode
|
3
|
-
attr_reader :longitude, :county_name, :zipcode, :zipcode_type, :county_fips,
|
6
|
+
attr_reader :longitude, :county_name, :zipcode, :zipcode_type, :county_fips,
|
7
|
+
:latitude, :precision, :default_city, :alternate_counties,
|
8
|
+
:state_abbreviation, :state
|
4
9
|
|
5
10
|
def initialize(obj)
|
6
11
|
@zipcode = obj['zipcode']
|
@@ -11,7 +16,15 @@ module USZipcode
|
|
11
16
|
@latitude = obj['latitude']
|
12
17
|
@longitude = obj['longitude']
|
13
18
|
@precision = obj['precision']
|
14
|
-
@
|
19
|
+
@state = obj['state']
|
20
|
+
@state_abbreviation = obj['state_abbreviation']
|
21
|
+
alternate_counties = obj.fetch('alternate_counties', [])
|
22
|
+
|
23
|
+
@alternate_counties = []
|
24
|
+
|
25
|
+
alternate_counties.each do |county|
|
26
|
+
@alternate_counties.push(USZipcode::AlternateCounty.new(county))
|
27
|
+
end
|
15
28
|
end
|
16
29
|
end
|
17
|
-
end
|
30
|
+
end
|