smartystreets_ruby_sdk 3.1.0 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Makefile +1 -1
- data/examples/international_example.rb +3 -3
- data/examples/us_autocomplete_example.rb +3 -3
- data/examples/us_extract_example.rb +3 -3
- data/examples/us_street_multiple_address_example.rb +6 -5
- data/examples/us_street_single_address_example.rb +5 -5
- data/examples/us_zipcode_multiple_lookup_example.rb +6 -5
- data/examples/us_zipcode_single_lookup_example.rb +4 -4
- data/lib/smartystreets_ruby_sdk.rb +26 -4
- data/lib/smartystreets_ruby_sdk/batch.rb +44 -41
- data/lib/smartystreets_ruby_sdk/client_builder.rb +115 -113
- data/lib/smartystreets_ruby_sdk/custom_header_sender.rb +10 -8
- data/lib/smartystreets_ruby_sdk/errors.rb +13 -11
- data/lib/smartystreets_ruby_sdk/exceptions.rb +27 -23
- data/lib/smartystreets_ruby_sdk/international_street.rb +3 -1
- data/lib/smartystreets_ruby_sdk/international_street/analysis.rb +11 -9
- data/lib/smartystreets_ruby_sdk/international_street/candidate.rb +28 -26
- data/lib/smartystreets_ruby_sdk/international_street/client.rb +45 -43
- data/lib/smartystreets_ruby_sdk/international_street/components.rb +53 -51
- data/lib/smartystreets_ruby_sdk/international_street/language_mode.rb +7 -3
- data/lib/smartystreets_ruby_sdk/international_street/lookup.rb +63 -61
- data/lib/smartystreets_ruby_sdk/international_street/metadata.rb +12 -10
- data/lib/smartystreets_ruby_sdk/json_able.rb +13 -11
- data/lib/smartystreets_ruby_sdk/logger.rb +2 -2
- data/lib/smartystreets_ruby_sdk/native_sender.rb +58 -56
- data/lib/smartystreets_ruby_sdk/native_serializer.rb +9 -7
- data/lib/smartystreets_ruby_sdk/proxy.rb +2 -2
- data/lib/smartystreets_ruby_sdk/request.rb +11 -9
- data/lib/smartystreets_ruby_sdk/response.rb +9 -7
- data/lib/smartystreets_ruby_sdk/retry_sender.rb +26 -24
- data/lib/smartystreets_ruby_sdk/shared_credentials.rb +11 -9
- data/lib/smartystreets_ruby_sdk/signing_sender.rb +11 -9
- data/lib/smartystreets_ruby_sdk/sleeper.rb +1 -1
- data/lib/smartystreets_ruby_sdk/static_credentials.rb +11 -9
- data/lib/smartystreets_ruby_sdk/status_code_sender.rb +31 -29
- data/lib/smartystreets_ruby_sdk/url_prefix_sender.rb +11 -9
- data/lib/smartystreets_ruby_sdk/us_autocomplete.rb +3 -1
- data/lib/smartystreets_ruby_sdk/us_autocomplete/client.rb +47 -45
- data/lib/smartystreets_ruby_sdk/us_autocomplete/geolocation_type.rb +9 -5
- data/lib/smartystreets_ruby_sdk/us_autocomplete/lookup.rb +26 -24
- data/lib/smartystreets_ruby_sdk/us_autocomplete/suggestion.rb +11 -9
- data/lib/smartystreets_ruby_sdk/us_extract.rb +4 -2
- data/lib/smartystreets_ruby_sdk/us_extract/address.rb +18 -16
- data/lib/smartystreets_ruby_sdk/us_extract/client.rb +34 -32
- data/lib/smartystreets_ruby_sdk/us_extract/lookup.rb +16 -14
- data/lib/smartystreets_ruby_sdk/us_extract/metadata.rb +13 -11
- data/lib/smartystreets_ruby_sdk/us_extract/result.rb +13 -11
- data/lib/smartystreets_ruby_sdk/us_street.rb +4 -2
- data/lib/smartystreets_ruby_sdk/us_street/analysis.rb +19 -17
- data/lib/smartystreets_ruby_sdk/us_street/candidate.rb +19 -17
- data/lib/smartystreets_ruby_sdk/us_street/client.rb +51 -49
- data/lib/smartystreets_ruby_sdk/us_street/components.rb +32 -30
- data/lib/smartystreets_ruby_sdk/us_street/lookup.rb +27 -26
- data/lib/smartystreets_ruby_sdk/us_street/match_type.rb +9 -5
- data/lib/smartystreets_ruby_sdk/us_street/metadata.rb +26 -24
- data/lib/smartystreets_ruby_sdk/us_zipcode.rb +4 -2
- data/lib/smartystreets_ruby_sdk/us_zipcode/alternate_county.rb +12 -10
- data/lib/smartystreets_ruby_sdk/us_zipcode/city.rb +13 -11
- data/lib/smartystreets_ruby_sdk/us_zipcode/client.rb +46 -44
- data/lib/smartystreets_ruby_sdk/us_zipcode/lookup.rb +16 -13
- data/lib/smartystreets_ruby_sdk/us_zipcode/result.rb +33 -31
- data/lib/smartystreets_ruby_sdk/us_zipcode/zip_code.rb +24 -21
- data/lib/smartystreets_ruby_sdk/version.rb +2 -2
- data/smartystreets_ruby_sdk.gemspec +1 -1
- metadata +2 -2
@@ -2,45 +2,47 @@ require_relative '../request'
|
|
2
2
|
require_relative '../exceptions'
|
3
3
|
require_relative 'result'
|
4
4
|
|
5
|
-
module
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
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'
|
5
|
+
module SmartyStreets
|
6
|
+
module USExtract
|
7
|
+
# It is recommended to instantiate this class using ClientBuilder.build_us_extract_api_client()
|
8
|
+
class Client
|
9
|
+
def initialize(sender, serializer)
|
10
|
+
@sender = sender
|
11
|
+
@serializer = serializer
|
18
12
|
end
|
19
13
|
|
20
|
-
|
21
|
-
|
22
|
-
|
14
|
+
# Sends a Lookup object to the US Extract Code API and stores the result in the Lookup's result field.
|
15
|
+
# It also returns the result directly.
|
16
|
+
def send(lookup)
|
17
|
+
if lookup.nil? or lookup.text.nil? or not lookup.text.is_a? String or lookup.text.empty?
|
18
|
+
raise SmartyError, 'Client.send() requires a Lookup with the "text" field set'
|
19
|
+
end
|
23
20
|
|
24
|
-
|
25
|
-
|
21
|
+
request = build_request(lookup)
|
22
|
+
response = @sender.send(request)
|
23
|
+
result = USExtract::Result.new(@serializer.deserialize(response.payload))
|
26
24
|
|
27
|
-
|
28
|
-
|
29
|
-
request.content_type = 'text/plain'
|
30
|
-
request.payload = lookup.text
|
25
|
+
lookup.result = result
|
26
|
+
end
|
31
27
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
28
|
+
def build_request(lookup)
|
29
|
+
request = Request.new
|
30
|
+
request.content_type = 'text/plain'
|
31
|
+
request.payload = lookup.text
|
36
32
|
|
37
|
-
|
38
|
-
|
33
|
+
add_parameter(request, 'html', lookup.html.to_s)
|
34
|
+
add_parameter(request, 'aggressive', lookup.aggressive.to_s)
|
35
|
+
add_parameter(request, 'addr_line_breaks', lookup.addresses_have_line_breaks.to_s)
|
36
|
+
add_parameter(request, 'addr_per_line', lookup.addresses_per_line.to_s)
|
37
|
+
|
38
|
+
request
|
39
|
+
end
|
39
40
|
|
40
|
-
|
41
|
-
|
42
|
-
|
41
|
+
def add_parameter(request, key, value)
|
42
|
+
if value and not value.empty?
|
43
|
+
request.parameters[key] = value
|
44
|
+
end
|
43
45
|
end
|
44
46
|
end
|
45
47
|
end
|
46
|
-
end
|
48
|
+
end
|
@@ -1,20 +1,22 @@
|
|
1
1
|
require_relative '../json_able'
|
2
2
|
|
3
|
-
module
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
3
|
+
module SmartyStreets
|
4
|
+
module USExtract
|
5
|
+
# In addition to holding all of the input data for this lookup, this class also will contain the result
|
6
|
+
# of the lookup after it comes back from the API.
|
7
|
+
#
|
8
|
+
# See "https://smartystreets.com/docs/cloud/us-extract-api#http-request-input-fields"
|
9
|
+
class Lookup < JSONAble
|
10
|
+
attr_accessor :text, :result, :aggressive, :addresses_per_line, :html, :addresses_have_line_breaks
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
12
|
+
def initialize(text=nil, html=nil, aggressive=nil, addresses_have_line_breaks=nil, addresses_per_line=nil)
|
13
|
+
@text = text
|
14
|
+
@html = html
|
15
|
+
@aggressive = aggressive
|
16
|
+
@addresses_have_line_breaks = addresses_have_line_breaks
|
17
|
+
@addresses_per_line = addresses_per_line
|
18
|
+
@result = nil
|
19
|
+
end
|
18
20
|
end
|
19
21
|
end
|
20
22
|
end
|
@@ -1,15 +1,17 @@
|
|
1
|
-
module
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
module SmartyStreets
|
2
|
+
module USExtract
|
3
|
+
# See "https://smartystreets.com/docs/cloud/us-extract-api#http-response-status"
|
4
|
+
class Metadata
|
5
|
+
attr_reader :unicode, :lines, :verified_count, :character_count, :bytes, :address_count
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
7
|
+
def initialize(obj)
|
8
|
+
@lines = obj['lines']
|
9
|
+
@unicode = obj['unicode']
|
10
|
+
@address_count = obj['address_count']
|
11
|
+
@verified_count = obj['verified_count']
|
12
|
+
@bytes = obj['bytes']
|
13
|
+
@character_count = obj['character_count']
|
14
|
+
end
|
13
15
|
end
|
14
16
|
end
|
15
17
|
end
|
@@ -1,19 +1,21 @@
|
|
1
1
|
require_relative './address'
|
2
2
|
require_relative './metadata'
|
3
3
|
|
4
|
-
module
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
module SmartyStreets
|
5
|
+
module USExtract
|
6
|
+
# See "https://smartystreets.com/docs/cloud/us-extract-api#http-response-status"
|
7
|
+
class Result
|
8
|
+
attr_reader :metadata, :addresses
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
def initialize(obj)
|
11
|
+
@metadata = USExtract::Metadata.new(obj.fetch('meta', {}))
|
12
|
+
addresses = obj.fetch('addresses', [])
|
13
|
+
@addresses = []
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
15
|
+
addresses.each {|address|
|
16
|
+
@addresses.push(Address.new(address))
|
17
|
+
}
|
18
|
+
end
|
17
19
|
end
|
18
20
|
end
|
19
21
|
end
|
@@ -1,20 +1,22 @@
|
|
1
|
-
module
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
module SmartyStreets
|
2
|
+
module USStreet
|
3
|
+
# See "https://smartystreets.com/docs/cloud/us-street-api#analysis"
|
4
|
+
class Analysis
|
5
|
+
attr_reader :lacs_link_code, :active, :footnotes, :lacs_link_indicator, :dpv_match_code, :is_suite_link_match,
|
6
|
+
:is_ews_match, :dpv_footnotes, :cmra, :vacant
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
8
|
+
def initialize(obj)
|
9
|
+
@dpv_match_code = obj['dpv_match_code']
|
10
|
+
@dpv_footnotes = obj['dpv_footnotes']
|
11
|
+
@cmra = obj['dpv_cmra']
|
12
|
+
@vacant = obj['dpv_vacant']
|
13
|
+
@active = obj['active']
|
14
|
+
@is_ews_match = obj['ews_match']
|
15
|
+
@footnotes = obj['footnotes']
|
16
|
+
@lacs_link_code = obj['lacslink_code']
|
17
|
+
@lacs_link_indicator = obj['lacslink_indicator']
|
18
|
+
@is_suite_link_match = obj['suitelink_match']
|
19
|
+
end
|
18
20
|
end
|
19
21
|
end
|
20
|
-
end
|
22
|
+
end
|
@@ -2,23 +2,25 @@ require_relative 'components'
|
|
2
2
|
require_relative 'metadata'
|
3
3
|
require_relative 'analysis'
|
4
4
|
|
5
|
-
module
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
module SmartyStreets
|
6
|
+
module USStreet
|
7
|
+
# See "https://smartystreets.com/docs/cloud/us-street-api#metadata"
|
8
|
+
class Candidate
|
9
|
+
attr_reader :input_index, :candidate_index, :addressee, :delivery_line_1, :delivery_line_2, :delivery_point_barcode,
|
10
|
+
:last_line, :metadata, :components, :analysis
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
12
|
+
def initialize(obj)
|
13
|
+
@input_index = obj['input_index']
|
14
|
+
@candidate_index = obj['candidate_index']
|
15
|
+
@addressee = obj['addressee']
|
16
|
+
@delivery_line_1 = obj['delivery_line_1']
|
17
|
+
@delivery_line_2 = obj['delivery_line_2']
|
18
|
+
@last_line = obj['last_line']
|
19
|
+
@delivery_point_barcode = obj['delivery_point_barcode']
|
20
|
+
@components = Components.new(obj.fetch('components', {}))
|
21
|
+
@metadata = Metadata.new(obj.fetch('metadata', {}))
|
22
|
+
@analysis = Analysis.new(obj.fetch('analysis', {}))
|
23
|
+
end
|
22
24
|
end
|
23
25
|
end
|
24
|
-
end
|
26
|
+
end
|
@@ -2,68 +2,70 @@ require_relative '../batch'
|
|
2
2
|
require_relative '../request'
|
3
3
|
require_relative 'candidate'
|
4
4
|
|
5
|
-
module
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
5
|
+
module SmartyStreets
|
6
|
+
module USStreet
|
7
|
+
# It is recommended to instantiate this class using ClientBuilder.build_us_street_api_client
|
8
|
+
class Client
|
9
|
+
def initialize(sender, serializer)
|
10
|
+
@sender = sender
|
11
|
+
@serializer = serializer
|
12
|
+
end
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
# Sends a Lookup object to the US Street API and stores the result in the Lookup's result field.
|
15
|
+
def send_lookup(lookup)
|
16
|
+
batch = SmartyStreets::Batch.new
|
17
|
+
batch.add(lookup)
|
18
|
+
send_batch(batch)
|
19
|
+
end
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
# Sends a Batch object containing no more than 100 Lookup objects to the US Street API and stores the
|
22
|
+
# results in the result field of the Lookup object.
|
23
|
+
def send_batch(batch)
|
24
|
+
smarty_request = Request.new
|
24
25
|
|
25
|
-
|
26
|
+
return if batch.empty?
|
26
27
|
|
27
|
-
|
28
|
-
|
28
|
+
converted_lookups = remap_keys(batch.all_lookups)
|
29
|
+
smarty_request.payload = @serializer.serialize(converted_lookups)
|
29
30
|
|
30
|
-
|
31
|
+
response = @sender.send(smarty_request)
|
31
32
|
|
32
|
-
|
33
|
+
raise response.error if response.error
|
33
34
|
|
34
|
-
|
35
|
-
|
35
|
+
candidates = @serializer.deserialize(response.payload)
|
36
|
+
candidates = [] if candidates == nil
|
36
37
|
|
37
|
-
|
38
|
-
|
38
|
+
assign_candidates_to_lookups(batch, candidates)
|
39
|
+
end
|
39
40
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
41
|
+
def remap_keys(obj)
|
42
|
+
converted_obj = []
|
43
|
+
obj.each do |lookup|
|
44
|
+
converted_lookup = {}
|
44
45
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
46
|
+
converted_lookup['street'] = lookup.street
|
47
|
+
converted_lookup['street2'] = lookup.street2
|
48
|
+
converted_lookup['secondary'] = lookup.secondary
|
49
|
+
converted_lookup['city'] = lookup.city
|
50
|
+
converted_lookup['state'] = lookup.state
|
51
|
+
converted_lookup['zipcode'] = lookup.zipcode
|
52
|
+
converted_lookup['lastline'] = lookup.lastline
|
53
|
+
converted_lookup['addressee'] = lookup.addressee
|
54
|
+
converted_lookup['urbanization'] = lookup.urbanization
|
55
|
+
converted_lookup['match'] = lookup.match
|
56
|
+
converted_lookup['candidates'] = lookup.candidates
|
56
57
|
|
57
|
-
|
58
|
+
converted_obj.push(converted_lookup)
|
59
|
+
end
|
60
|
+
converted_obj
|
58
61
|
end
|
59
|
-
converted_obj
|
60
|
-
end
|
61
62
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
63
|
+
def assign_candidates_to_lookups(batch, candidates)
|
64
|
+
candidates.each do |raw_candidate|
|
65
|
+
candidate = Candidate.new(raw_candidate)
|
66
|
+
batch[candidate.input_index].result.push(candidate)
|
67
|
+
end
|
66
68
|
end
|
67
69
|
end
|
68
70
|
end
|
69
|
-
end
|
71
|
+
end
|
@@ -1,33 +1,35 @@
|
|
1
|
-
module
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
1
|
+
module SmartyStreets
|
2
|
+
module USStreet
|
3
|
+
# This class contains the matched address broken down into its fundamental pieces.
|
4
|
+
#
|
5
|
+
# See "https://smartystreets.com/docs/cloud/us-street-api#components"
|
6
|
+
class Components
|
7
|
+
attr_reader :street_postdirection, :delivery_point_check_digit, :secondary_designator, :secondary_number, :zipcode,
|
8
|
+
:pmb_number, :state_abbreviation, :extra_secondary_designator, :urbanization, :street_name, :city_name,
|
9
|
+
:default_city_name, :street_suffix, :primary_number, :plus4_code, :street_predirection, :pmb_designator,
|
10
|
+
:extra_secondary_number, :delivery_point
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
12
|
+
def initialize(obj)
|
13
|
+
@urbanization = obj['urbanization']
|
14
|
+
@primary_number = obj['primary_number']
|
15
|
+
@street_name = obj['street_name']
|
16
|
+
@street_predirection = obj['street_predirection']
|
17
|
+
@street_postdirection = obj['street_postdirection']
|
18
|
+
@street_suffix = obj['street_suffix']
|
19
|
+
@secondary_number = obj['secondary_number']
|
20
|
+
@secondary_designator = obj['secondary_designator']
|
21
|
+
@extra_secondary_number = obj['extra_secondary_number']
|
22
|
+
@extra_secondary_designator = obj['extra_secondary_designator']
|
23
|
+
@pmb_designator = obj['pmb_designator']
|
24
|
+
@pmb_number = obj['pmb_number']
|
25
|
+
@city_name = obj['city_name']
|
26
|
+
@default_city_name = obj['default_city_name']
|
27
|
+
@state_abbreviation = obj['state_abbreviation']
|
28
|
+
@zipcode = obj['zipcode']
|
29
|
+
@plus4_code = obj['plus4_code']
|
30
|
+
@delivery_point = obj['delivery_point']
|
31
|
+
@delivery_point_check_digit = obj['delivery_point_check_digit']
|
32
|
+
end
|
31
33
|
end
|
32
34
|
end
|
33
|
-
end
|
35
|
+
end
|