smartystreets_ruby_sdk 3.1.0 → 4.0.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.
- 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
|