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
@@ -1,11 +1,13 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
module SmartyStreets
|
2
|
+
class SharedCredentials
|
3
|
+
def initialize(id, host_name)
|
4
|
+
@id = id
|
5
|
+
@host_name = host_name
|
6
|
+
end
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
def sign(request)
|
9
|
+
request.parameters['auth-id'] = @id
|
10
|
+
request.referer = @host_name
|
11
|
+
end
|
10
12
|
end
|
11
|
-
end
|
13
|
+
end
|
@@ -1,11 +1,13 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
module SmartyStreets
|
2
|
+
class SigningSender
|
3
|
+
def initialize(signer, inner)
|
4
|
+
@signer = signer
|
5
|
+
@inner = inner
|
6
|
+
end
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
def send(request)
|
9
|
+
@signer.sign(request)
|
10
|
+
@inner.send(request)
|
11
|
+
end
|
10
12
|
end
|
11
|
-
end
|
13
|
+
end
|
@@ -1,11 +1,13 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
module SmartyStreets
|
2
|
+
class StaticCredentials
|
3
|
+
def initialize(auth_id, auth_token)
|
4
|
+
@auth_id = auth_id
|
5
|
+
@auth_token = auth_token
|
6
|
+
end
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
def sign(request)
|
9
|
+
request.parameters['auth-id'] = @auth_id
|
10
|
+
request.parameters['auth-token'] = @auth_token
|
11
|
+
end
|
10
12
|
end
|
11
|
-
end
|
13
|
+
end
|
@@ -1,37 +1,39 @@
|
|
1
1
|
require_relative 'exceptions'
|
2
2
|
require_relative 'errors'
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
module SmartyStreets
|
5
|
+
class StatusCodeSender
|
6
|
+
def initialize(inner)
|
7
|
+
@inner = inner
|
8
|
+
end
|
8
9
|
|
9
|
-
|
10
|
-
|
10
|
+
def send(request)
|
11
|
+
response = @inner.send(request)
|
11
12
|
|
12
|
-
|
13
|
+
assign_exception(response) if response.error == nil
|
13
14
|
|
14
|
-
|
15
|
-
|
15
|
+
response
|
16
|
+
end
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
18
|
+
def assign_exception(response)
|
19
|
+
response.error = case response.status_code
|
20
|
+
when '401'
|
21
|
+
BadCredentialsError.new(BAD_CREDENTIALS)
|
22
|
+
when '402'
|
23
|
+
PaymentRequiredError.new(PAYMENT_REQUIRED)
|
24
|
+
when '413'
|
25
|
+
RequestEntityTooLargeError.new(REQUEST_ENTITY_TOO_LARGE)
|
26
|
+
when '400'
|
27
|
+
BadRequestError.new(BAD_REQUEST)
|
28
|
+
when '429'
|
29
|
+
TooManyRequestsError.new(TOO_MANY_REQUESTS)
|
30
|
+
when '500'
|
31
|
+
InternalServerError.new(INTERNAL_SERVER_ERROR)
|
32
|
+
when '503'
|
33
|
+
ServiceUnavailableError.new(SERVICE_UNAVAILABLE)
|
34
|
+
else
|
35
|
+
nil
|
36
|
+
end
|
37
|
+
end
|
36
38
|
end
|
37
|
-
end
|
39
|
+
end
|
@@ -1,12 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
module SmartyStreets
|
2
|
+
class URLPrefixSender
|
3
|
+
def initialize(url_prefix, inner)
|
4
|
+
@url_prefix = url_prefix
|
5
|
+
@inner = inner
|
6
|
+
end
|
6
7
|
|
7
|
-
|
8
|
-
|
8
|
+
def send(request)
|
9
|
+
request.url_prefix = @url_prefix
|
9
10
|
|
10
|
-
|
11
|
+
@inner.send(request)
|
12
|
+
end
|
11
13
|
end
|
12
|
-
end
|
14
|
+
end
|
@@ -3,64 +3,66 @@ require_relative '../exceptions'
|
|
3
3
|
require_relative 'geolocation_type'
|
4
4
|
require_relative 'suggestion'
|
5
5
|
|
6
|
-
module
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
# Sends a Lookup object to the US Autocomplete API and stores the result in the Lookup's result field.
|
15
|
-
def send(lookup)
|
16
|
-
if not lookup or not lookup.prefix
|
17
|
-
raise SmartyException, 'Send() must be passed a Lookup with the prefix field set.'
|
6
|
+
module SmartyStreets
|
7
|
+
module USAutocomplete
|
8
|
+
# It is recommended to instantiate this class using ClientBuilder.build_us_autocomplete_api_client
|
9
|
+
class Client
|
10
|
+
def initialize(sender, serializer)
|
11
|
+
@sender = sender
|
12
|
+
@serializer = serializer
|
18
13
|
end
|
19
14
|
|
20
|
-
|
15
|
+
# Sends a Lookup object to the US Autocomplete API and stores the result in the Lookup's result field.
|
16
|
+
def send(lookup)
|
17
|
+
if not lookup or not lookup.prefix
|
18
|
+
raise SmartyStreets::SmartyError, 'Send() must be passed a Lookup with the prefix field set.'
|
19
|
+
end
|
21
20
|
|
22
|
-
|
21
|
+
request = build_request(lookup)
|
22
|
+
|
23
|
+
response = @sender.send(request)
|
24
|
+
|
25
|
+
result = @serializer.deserialize(response.payload)
|
26
|
+
suggestions = convert_suggestions(result.fetch('suggestions', []))
|
27
|
+
lookup.result = suggestions
|
28
|
+
end
|
23
29
|
|
24
|
-
result = @serializer.deserialize(response.payload)
|
25
|
-
suggestions = convert_suggestions(result.fetch('suggestions', []))
|
26
|
-
lookup.result = suggestions
|
27
|
-
end
|
28
30
|
|
31
|
+
def build_request(lookup)
|
32
|
+
request = Request.new
|
29
33
|
|
30
|
-
|
31
|
-
|
34
|
+
add_parameter(request, 'prefix', lookup.prefix)
|
35
|
+
add_parameter(request, 'suggestions', lookup.max_suggestions.to_s)
|
36
|
+
add_parameter(request, 'city_filter', build_filter_string(lookup.city_filter))
|
37
|
+
add_parameter(request, 'state_filter', build_filter_string(lookup.state_filter))
|
38
|
+
add_parameter(request, 'prefer', build_filter_string(lookup.prefer))
|
39
|
+
if lookup.geolocate_type != GeolocationType::NONE
|
40
|
+
request.parameters['geolocate'] = 'true'
|
41
|
+
request.parameters['geolocate_precision'] = lookup.geolocate_type
|
42
|
+
else
|
43
|
+
request.parameters['geolocate'] = 'false'
|
44
|
+
end
|
32
45
|
|
33
|
-
|
34
|
-
add_parameter(request, 'suggestions', lookup.max_suggestions.to_s)
|
35
|
-
add_parameter(request, 'city_filter', build_filter_string(lookup.city_filter))
|
36
|
-
add_parameter(request, 'state_filter', build_filter_string(lookup.state_filter))
|
37
|
-
add_parameter(request, 'prefer', build_filter_string(lookup.prefer))
|
38
|
-
if lookup.geolocate_type != GeolocationType::NONE
|
39
|
-
request.parameters['geolocate'] = 'true'
|
40
|
-
request.parameters['geolocate_precision'] = lookup.geolocate_type
|
41
|
-
else
|
42
|
-
request.parameters['geolocate'] = 'false'
|
46
|
+
request
|
43
47
|
end
|
44
48
|
|
45
|
-
|
46
|
-
|
49
|
+
def build_filter_string(filter_list)
|
50
|
+
filter_list ? filter_list.join(',') : nil
|
51
|
+
end
|
47
52
|
|
48
|
-
|
49
|
-
|
50
|
-
end
|
53
|
+
def convert_suggestions(suggestion_hashes)
|
54
|
+
converted_suggestions = []
|
51
55
|
|
52
|
-
|
53
|
-
|
56
|
+
suggestion_hashes.each do |suggestion|
|
57
|
+
converted_suggestions.push(USAutocomplete::Suggestion.new(suggestion))
|
58
|
+
end
|
54
59
|
|
55
|
-
|
56
|
-
converted_suggestions.push(USAutocomplete::Suggestion.new(suggestion))
|
60
|
+
converted_suggestions
|
57
61
|
end
|
58
62
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
def add_parameter(request, key, value)
|
63
|
-
request.parameters[key] = value unless value.nil? or value.empty?
|
63
|
+
def add_parameter(request, key, value)
|
64
|
+
request.parameters[key] = value unless value.nil? or value.empty?
|
65
|
+
end
|
64
66
|
end
|
65
67
|
end
|
66
|
-
end
|
68
|
+
end
|
@@ -1,34 +1,36 @@
|
|
1
1
|
require_relative '../json_able'
|
2
2
|
|
3
|
-
module
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
module SmartyStreets
|
4
|
+
module USAutocomplete
|
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-autocomplete-api#http-request-input-fields"
|
9
|
+
class Lookup < JSONAble
|
9
10
|
|
10
|
-
|
11
|
+
attr_accessor :result, :prefix, :state_filter, :prefer, :max_suggestions, :geolocate_type, :city_filter
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
13
|
+
def initialize(prefix=nil, suggestions=nil, city_filter=nil, state_filter=nil, prefer=nil, geolocate_type=nil)
|
14
|
+
@result = []
|
15
|
+
@prefix = prefix
|
16
|
+
@max_suggestions = suggestions
|
17
|
+
@city_filter = city_filter ? city_filter : []
|
18
|
+
@state_filter = state_filter ? state_filter : []
|
19
|
+
@prefer = prefer ? prefer : []
|
20
|
+
@geolocate_type = geolocate_type
|
21
|
+
end
|
21
22
|
|
22
|
-
|
23
|
-
|
24
|
-
|
23
|
+
def add_city_filter(city)
|
24
|
+
@city_filter.push(city)
|
25
|
+
end
|
25
26
|
|
26
|
-
|
27
|
-
|
28
|
-
|
27
|
+
def add_state_filter(state)
|
28
|
+
@state_filter.push(state)
|
29
|
+
end
|
29
30
|
|
30
|
-
|
31
|
-
|
31
|
+
def add_prefer(prefer)
|
32
|
+
@prefer.push(prefer)
|
33
|
+
end
|
32
34
|
end
|
33
35
|
end
|
34
36
|
end
|
@@ -1,14 +1,16 @@
|
|
1
|
-
module
|
2
|
-
|
3
|
-
|
1
|
+
module SmartyStreets
|
2
|
+
module USAutocomplete
|
3
|
+
# See "https://smartystreets.com/docs/cloud/us-autocomplete-api#http-response"
|
4
|
+
class Suggestion
|
4
5
|
|
5
|
-
|
6
|
+
attr_reader :text, :street_line, :state, :city
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
def initialize(obj)
|
9
|
+
@text = obj.fetch('text', nil)
|
10
|
+
@street_line = obj.fetch('street_line', nil)
|
11
|
+
@city = obj.fetch('city', nil)
|
12
|
+
@state = obj.fetch('state', nil)
|
13
|
+
end
|
12
14
|
end
|
13
15
|
end
|
14
16
|
end
|
@@ -1,22 +1,24 @@
|
|
1
1
|
require_relative '../us_street/candidate'
|
2
2
|
|
3
|
-
module
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
module SmartyStreets
|
4
|
+
module USExtract
|
5
|
+
# See "https://smartystreets.com/docs/cloud/us-extract-api#http-response-status"
|
6
|
+
class Address
|
7
|
+
attr_reader :text, :start, :verified, :end, :line, :candidates
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
9
|
+
def initialize(obj)
|
10
|
+
@text = obj['text']
|
11
|
+
@verified = obj['verified']
|
12
|
+
@line = obj['line']
|
13
|
+
@start = obj['start']
|
14
|
+
@end = obj['end']
|
15
|
+
candidates = obj.fetch('api_output', [])
|
16
|
+
@candidates = []
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
18
|
+
candidates.each {|candidate|
|
19
|
+
@candidates.push(USStreet::Candidate.new(candidate))
|
20
|
+
}
|
21
|
+
end
|
20
22
|
end
|
21
23
|
end
|
22
|
-
end
|
24
|
+
end
|