smartystreets_ruby_sdk 0.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.
- checksums.yaml +7 -0
- data/.github/workflows/gem-publish.yml +58 -0
- data/.gitignore +4 -0
- data/CHANGELOG.md +5 -0
- data/Dockerfile +10 -0
- data/Gemfile +4 -0
- data/LICENSE.md +202 -0
- data/Makefile +33 -0
- data/README.md +31 -0
- data/Rakefile +5 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/docker-compose.yml +12 -0
- data/examples/international_autocomplete_example.rb +47 -0
- data/examples/international_example.rb +53 -0
- data/examples/us_autocomplete_pro_example.rb +56 -0
- data/examples/us_extract_example.rb +63 -0
- data/examples/us_reverse_geo_example.rb +47 -0
- data/examples/us_street_multiple_address_example.rb +87 -0
- data/examples/us_street_single_address_example.rb +67 -0
- data/examples/us_zipcode_multiple_lookup_example.rb +80 -0
- data/examples/us_zipcode_single_lookup_example.rb +55 -0
- data/lib/smartystreets_ruby_sdk/batch.rb +59 -0
- data/lib/smartystreets_ruby_sdk/client_builder.rb +188 -0
- data/lib/smartystreets_ruby_sdk/custom_header_sender.rb +13 -0
- data/lib/smartystreets_ruby_sdk/errors.rb +27 -0
- data/lib/smartystreets_ruby_sdk/exceptions.rb +39 -0
- data/lib/smartystreets_ruby_sdk/international_autocomplete/client.rb +61 -0
- data/lib/smartystreets_ruby_sdk/international_autocomplete/lookup.rb +21 -0
- data/lib/smartystreets_ruby_sdk/international_autocomplete/suggestion.rb +16 -0
- data/lib/smartystreets_ruby_sdk/international_street/analysis.rb +17 -0
- data/lib/smartystreets_ruby_sdk/international_street/candidate.rb +23 -0
- data/lib/smartystreets_ruby_sdk/international_street/changes.rb +15 -0
- data/lib/smartystreets_ruby_sdk/international_street/client.rb +63 -0
- data/lib/smartystreets_ruby_sdk/international_street/components.rb +58 -0
- data/lib/smartystreets_ruby_sdk/international_street/language_mode.rb +9 -0
- data/lib/smartystreets_ruby_sdk/international_street/lookup.rb +82 -0
- data/lib/smartystreets_ruby_sdk/international_street/metadata.rb +17 -0
- data/lib/smartystreets_ruby_sdk/international_street/rootlevel.rb +25 -0
- data/lib/smartystreets_ruby_sdk/international_street.rb +12 -0
- data/lib/smartystreets_ruby_sdk/json_able.rb +19 -0
- data/lib/smartystreets_ruby_sdk/license_sender.rb +15 -0
- data/lib/smartystreets_ruby_sdk/logger.rb +7 -0
- data/lib/smartystreets_ruby_sdk/native_sender.rb +85 -0
- data/lib/smartystreets_ruby_sdk/native_serializer.rb +13 -0
- data/lib/smartystreets_ruby_sdk/proxy.rb +16 -0
- data/lib/smartystreets_ruby_sdk/request.rb +14 -0
- data/lib/smartystreets_ruby_sdk/response.rb +11 -0
- data/lib/smartystreets_ruby_sdk/retry_sender.rb +39 -0
- data/lib/smartystreets_ruby_sdk/shared_credentials.rb +13 -0
- data/lib/smartystreets_ruby_sdk/signing_sender.rb +13 -0
- data/lib/smartystreets_ruby_sdk/sleeper.rb +7 -0
- data/lib/smartystreets_ruby_sdk/static_credentials.rb +13 -0
- data/lib/smartystreets_ruby_sdk/status_code_sender.rb +41 -0
- data/lib/smartystreets_ruby_sdk/url_prefix_sender.rb +14 -0
- data/lib/smartystreets_ruby_sdk/us_autocomplete/client.rb +72 -0
- data/lib/smartystreets_ruby_sdk/us_autocomplete/geolocation_type.rb +9 -0
- data/lib/smartystreets_ruby_sdk/us_autocomplete/lookup.rb +38 -0
- data/lib/smartystreets_ruby_sdk/us_autocomplete/suggestion.rb +16 -0
- data/lib/smartystreets_ruby_sdk/us_autocomplete.rb +9 -0
- data/lib/smartystreets_ruby_sdk/us_autocomplete_pro/client.rb +78 -0
- data/lib/smartystreets_ruby_sdk/us_autocomplete_pro/geolocation_type.rb +8 -0
- data/lib/smartystreets_ruby_sdk/us_autocomplete_pro/lookup.rb +63 -0
- data/lib/smartystreets_ruby_sdk/us_autocomplete_pro/suggestion.rb +18 -0
- data/lib/smartystreets_ruby_sdk/us_autocomplete_pro.rb +10 -0
- data/lib/smartystreets_ruby_sdk/us_extract/address.rb +24 -0
- data/lib/smartystreets_ruby_sdk/us_extract/client.rb +49 -0
- data/lib/smartystreets_ruby_sdk/us_extract/lookup.rb +22 -0
- data/lib/smartystreets_ruby_sdk/us_extract/metadata.rb +17 -0
- data/lib/smartystreets_ruby_sdk/us_extract/result.rb +21 -0
- data/lib/smartystreets_ruby_sdk/us_extract.rb +10 -0
- data/lib/smartystreets_ruby_sdk/us_reverse_geo/address.rb +16 -0
- data/lib/smartystreets_ruby_sdk/us_reverse_geo/client.rb +38 -0
- data/lib/smartystreets_ruby_sdk/us_reverse_geo/coordinate.rb +25 -0
- data/lib/smartystreets_ruby_sdk/us_reverse_geo/lookup.rb +21 -0
- data/lib/smartystreets_ruby_sdk/us_reverse_geo/result.rb +20 -0
- data/lib/smartystreets_ruby_sdk/us_reverse_geo/us_reverse_geo_response.rb +17 -0
- data/lib/smartystreets_ruby_sdk/us_reverse_geo.rb +12 -0
- data/lib/smartystreets_ruby_sdk/us_street/analysis.rb +24 -0
- data/lib/smartystreets_ruby_sdk/us_street/candidate.rb +27 -0
- data/lib/smartystreets_ruby_sdk/us_street/client.rb +78 -0
- data/lib/smartystreets_ruby_sdk/us_street/components.rb +35 -0
- data/lib/smartystreets_ruby_sdk/us_street/lookup.rb +32 -0
- data/lib/smartystreets_ruby_sdk/us_street/match_type.rb +10 -0
- data/lib/smartystreets_ruby_sdk/us_street/metadata.rb +30 -0
- data/lib/smartystreets_ruby_sdk/us_street.rb +12 -0
- data/lib/smartystreets_ruby_sdk/us_zipcode/alternate_county.rb +15 -0
- data/lib/smartystreets_ruby_sdk/us_zipcode/city.rb +16 -0
- data/lib/smartystreets_ruby_sdk/us_zipcode/client.rb +72 -0
- data/lib/smartystreets_ruby_sdk/us_zipcode/lookup.rb +21 -0
- data/lib/smartystreets_ruby_sdk/us_zipcode/result.rb +47 -0
- data/lib/smartystreets_ruby_sdk/us_zipcode/zip_code.rb +33 -0
- data/lib/smartystreets_ruby_sdk/us_zipcode.rb +11 -0
- data/lib/smartystreets_ruby_sdk/version.rb +3 -0
- data/lib/smartystreets_ruby_sdk.rb +33 -0
- data/ruby-sdk-demo.json +354 -0
- data/smartystreets_ruby_sdk.gemspec +26 -0
- metadata +201 -0
@@ -0,0 +1,13 @@
|
|
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
|
7
|
+
|
8
|
+
def sign(request)
|
9
|
+
request.parameters['auth-id'] = @auth_id
|
10
|
+
request.parameters['auth-token'] = @auth_token
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require_relative 'exceptions'
|
2
|
+
require_relative 'errors'
|
3
|
+
|
4
|
+
module SmartyStreets
|
5
|
+
class StatusCodeSender
|
6
|
+
def initialize(inner)
|
7
|
+
@inner = inner
|
8
|
+
end
|
9
|
+
|
10
|
+
def send(request)
|
11
|
+
response = @inner.send(request)
|
12
|
+
|
13
|
+
assign_exception(response) if response.error == nil
|
14
|
+
|
15
|
+
response
|
16
|
+
end
|
17
|
+
|
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 '422'
|
29
|
+
UnprocessableEntityError.new(UNPROCESSABLE_ENTITY)
|
30
|
+
when '429'
|
31
|
+
TooManyRequestsError.new(TOO_MANY_REQUESTS)
|
32
|
+
when '500'
|
33
|
+
InternalServerError.new(INTERNAL_SERVER_ERROR)
|
34
|
+
when '503'
|
35
|
+
ServiceUnavailableError.new(SERVICE_UNAVAILABLE)
|
36
|
+
else
|
37
|
+
nil
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require_relative '../request'
|
2
|
+
require_relative '../exceptions'
|
3
|
+
require_relative 'geolocation_type'
|
4
|
+
require_relative 'suggestion'
|
5
|
+
|
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
|
13
|
+
end
|
14
|
+
|
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
|
20
|
+
|
21
|
+
request = build_request(lookup)
|
22
|
+
|
23
|
+
response = @sender.send(request)
|
24
|
+
|
25
|
+
raise response.error if response.error
|
26
|
+
|
27
|
+
result = @serializer.deserialize(response.payload)
|
28
|
+
suggestions = convert_suggestions(result.fetch('suggestions', []))
|
29
|
+
lookup.result = suggestions
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
def build_request(lookup)
|
34
|
+
request = Request.new
|
35
|
+
|
36
|
+
add_parameter(request, 'prefix', lookup.prefix)
|
37
|
+
add_parameter(request, 'suggestions', lookup.max_suggestions.to_s)
|
38
|
+
add_parameter(request, 'city_filter', build_filter_string(lookup.city_filter))
|
39
|
+
add_parameter(request, 'state_filter', build_filter_string(lookup.state_filter))
|
40
|
+
add_parameter(request, 'prefer', build_filter_string(lookup.prefer))
|
41
|
+
add_parameter(request, 'prefer_ratio', lookup.prefer_ratio.to_s)
|
42
|
+
if lookup.geolocate_type != GeolocationType::NONE
|
43
|
+
request.parameters['geolocate'] = 'true'
|
44
|
+
request.parameters['geolocate_precision'] = lookup.geolocate_type
|
45
|
+
else
|
46
|
+
request.parameters['geolocate'] = 'false'
|
47
|
+
end
|
48
|
+
|
49
|
+
request
|
50
|
+
end
|
51
|
+
|
52
|
+
def build_filter_string(filter_list)
|
53
|
+
filter_list ? filter_list.join(',') : nil
|
54
|
+
end
|
55
|
+
|
56
|
+
def convert_suggestions(suggestion_hashes)
|
57
|
+
converted_suggestions = []
|
58
|
+
return converted_suggestions if suggestion_hashes.nil?
|
59
|
+
|
60
|
+
suggestion_hashes.each do |suggestion|
|
61
|
+
converted_suggestions.push(USAutocomplete::Suggestion.new(suggestion))
|
62
|
+
end
|
63
|
+
|
64
|
+
converted_suggestions
|
65
|
+
end
|
66
|
+
|
67
|
+
def add_parameter(request, key, value)
|
68
|
+
request.parameters[key] = value unless value.nil? or value.empty?
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative '../json_able'
|
2
|
+
|
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
|
10
|
+
|
11
|
+
attr_accessor :result, :prefix, :state_filter, :prefer, :prefer_ratio, :max_suggestions, :geolocate_type, :city_filter
|
12
|
+
|
13
|
+
def initialize(prefix=nil, suggestions=nil, city_filter=nil, state_filter=nil,
|
14
|
+
prefer=nil, prefer_ratio=nil, geolocate_type=nil)
|
15
|
+
@result = []
|
16
|
+
@prefix = prefix
|
17
|
+
@max_suggestions = suggestions
|
18
|
+
@city_filter = city_filter ? city_filter : []
|
19
|
+
@state_filter = state_filter ? state_filter : []
|
20
|
+
@prefer = prefer ? prefer : []
|
21
|
+
@prefer_ratio = prefer_ratio
|
22
|
+
@geolocate_type = geolocate_type
|
23
|
+
end
|
24
|
+
|
25
|
+
def add_city_filter(city)
|
26
|
+
@city_filter.push(city)
|
27
|
+
end
|
28
|
+
|
29
|
+
def add_state_filter(state)
|
30
|
+
@state_filter.push(state)
|
31
|
+
end
|
32
|
+
|
33
|
+
def add_prefer(prefer)
|
34
|
+
@prefer.push(prefer)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module SmartyStreets
|
2
|
+
module USAutocomplete
|
3
|
+
# See "https://smartystreets.com/docs/cloud/us-autocomplete-api#http-response"
|
4
|
+
class Suggestion
|
5
|
+
|
6
|
+
attr_reader :text, :street_line, :state, :city
|
7
|
+
|
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
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require_relative '../request'
|
2
|
+
require_relative '../exceptions'
|
3
|
+
require_relative 'geolocation_type'
|
4
|
+
require_relative 'suggestion'
|
5
|
+
|
6
|
+
module SmartyStreets
|
7
|
+
module USAutocompletePro
|
8
|
+
# It is recommended to instantiate this class using ClientBuilder.build_us_autocomplete_pro_api_client
|
9
|
+
class Client
|
10
|
+
def initialize(sender, serializer)
|
11
|
+
@sender = sender
|
12
|
+
@serializer = serializer
|
13
|
+
end
|
14
|
+
|
15
|
+
# Sends a Lookup object to the US Autocomplete Pro API and stores the result in the Lookup's result field.
|
16
|
+
def send(lookup)
|
17
|
+
if not lookup or not lookup.search
|
18
|
+
raise SmartyStreets::SmartyError, 'Send() must be passed a Lookup with the prefix field set.'
|
19
|
+
end
|
20
|
+
|
21
|
+
request = build_request(lookup)
|
22
|
+
|
23
|
+
response = @sender.send(request)
|
24
|
+
|
25
|
+
raise response.error if response.error
|
26
|
+
|
27
|
+
result = @serializer.deserialize(response.payload)
|
28
|
+
suggestions = convert_suggestions(result.fetch('suggestions', []))
|
29
|
+
lookup.result = suggestions
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
def build_request(lookup)
|
34
|
+
request = Request.new
|
35
|
+
|
36
|
+
add_parameter(request, 'search', lookup.search)
|
37
|
+
add_parameter(request, 'max_results', lookup.max_results.to_s)
|
38
|
+
add_parameter(request, 'include_only_cities', build_filter_string(lookup.city_filter))
|
39
|
+
add_parameter(request, 'include_only_states', build_filter_string(lookup.state_filter))
|
40
|
+
add_parameter(request, 'include_only_zip_codes', build_filter_string(lookup.zip_filter))
|
41
|
+
add_parameter(request, 'exclude_states', build_filter_string(lookup.exclude_states))
|
42
|
+
add_parameter(request, 'prefer_cities', build_filter_string(lookup.prefer_cities))
|
43
|
+
add_parameter(request, 'prefer_states', build_filter_string(lookup.prefer_states))
|
44
|
+
add_parameter(request, 'prefer_zip_codes', build_filter_string(lookup.prefer_zip_codes))
|
45
|
+
add_parameter(request, 'prefer_ratio', lookup.prefer_ratio.to_s)
|
46
|
+
add_parameter(request, 'source', lookup.source)
|
47
|
+
if lookup.prefer_zip_codes or lookup.zip_filter
|
48
|
+
request.parameters['prefer_geolocation'] = GeolocationType::NONE
|
49
|
+
else
|
50
|
+
add_parameter(request, 'prefer_geolocation', lookup.prefer_geolocation)
|
51
|
+
end
|
52
|
+
add_parameter(request, 'selected', lookup.selected)
|
53
|
+
|
54
|
+
request
|
55
|
+
end
|
56
|
+
|
57
|
+
def build_filter_string(filter_list)
|
58
|
+
filter_list ? filter_list.join(';') : nil
|
59
|
+
end
|
60
|
+
|
61
|
+
def convert_suggestions(suggestion_hashes)
|
62
|
+
converted_suggestions = []
|
63
|
+
return converted_suggestions if suggestion_hashes.nil?
|
64
|
+
|
65
|
+
suggestion_hashes.each do |suggestion|
|
66
|
+
converted_suggestions.push(USAutocompletePro::Suggestion.new(suggestion))
|
67
|
+
end
|
68
|
+
|
69
|
+
converted_suggestions
|
70
|
+
end
|
71
|
+
|
72
|
+
def add_parameter(request, key, value)
|
73
|
+
request.parameters[key] = value unless value.nil? or value.empty?
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require_relative '../json_able'
|
2
|
+
|
3
|
+
module SmartyStreets
|
4
|
+
module USAutocompletePro
|
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
|
10
|
+
|
11
|
+
attr_accessor :result, :search, :max_results, :city_filter, :state_filter, :zip_filter,
|
12
|
+
:exclude_states, :prefer_cities, :prefer_states, :prefer_zip_codes, :prefer_ratio,
|
13
|
+
:prefer_geolocation, :selected, :source
|
14
|
+
|
15
|
+
def initialize(search=nil, max_results=nil, city_filter=nil, state_filter=nil, zip_filter=nil,
|
16
|
+
exclude_states=nil, prefer_cities=nil, prefer_states=nil, prefer_zips=nil, prefer_ratio=nil,
|
17
|
+
prefer_geolocation=nil, selected=nil, source=nil)
|
18
|
+
@result = []
|
19
|
+
@search = search
|
20
|
+
@max_results = max_results
|
21
|
+
@city_filter = city_filter ? city_filter : []
|
22
|
+
@state_filter = state_filter ? state_filter : []
|
23
|
+
@zip_filter = zip_filter ? zip_filter : []
|
24
|
+
@exclude_states = exclude_states ? exclude_states : []
|
25
|
+
@prefer_cities = prefer_cities ? prefer_cities : []
|
26
|
+
@prefer_states = prefer_states ? prefer_states : []
|
27
|
+
@prefer_zip_codes = prefer_zips ? prefer_zips : []
|
28
|
+
@prefer_ratio = prefer_ratio
|
29
|
+
@prefer_geolocation = prefer_geolocation
|
30
|
+
@selected = selected
|
31
|
+
@source = source
|
32
|
+
end
|
33
|
+
|
34
|
+
def add_city_filter(city)
|
35
|
+
@city_filter.push(city)
|
36
|
+
end
|
37
|
+
|
38
|
+
def add_state_filter(state)
|
39
|
+
@state_filter.push(state)
|
40
|
+
end
|
41
|
+
|
42
|
+
def add_zip_filter(zip)
|
43
|
+
@zip_filter.push(zip)
|
44
|
+
end
|
45
|
+
|
46
|
+
def add_state_exclusion(state)
|
47
|
+
@exclude_states.push(state)
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_preferred_city(city)
|
51
|
+
@prefer_cities.push(city)
|
52
|
+
end
|
53
|
+
|
54
|
+
def add_preferred_state(state)
|
55
|
+
@prefer_states.push(state)
|
56
|
+
end
|
57
|
+
|
58
|
+
def add_preferred_zip(zip)
|
59
|
+
@prefer_zip_codes.push(zip)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module SmartyStreets
|
2
|
+
module USAutocompletePro
|
3
|
+
# See "https://smartystreets.com/docs/cloud/us-autocomplete-api#http-response"
|
4
|
+
class Suggestion
|
5
|
+
|
6
|
+
attr_reader :street_line, :secondary, :city, :state, :zipcode, :entries
|
7
|
+
|
8
|
+
def initialize(obj)
|
9
|
+
@street_line = obj.fetch('street_line', nil)
|
10
|
+
@secondary = obj.fetch('secondary', nil)
|
11
|
+
@city = obj.fetch('city', nil)
|
12
|
+
@state = obj.fetch('state', nil)
|
13
|
+
@zipcode = obj.fetch('zipcode', nil)
|
14
|
+
@entries = obj.fetch('entries', 0)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require_relative './us_autocomplete_pro/lookup'
|
2
|
+
require_relative './us_autocomplete_pro/geolocation_type'
|
3
|
+
require_relative './us_autocomplete_pro/suggestion'
|
4
|
+
require_relative './us_autocomplete_pro/client'
|
5
|
+
|
6
|
+
module SmartyStreets
|
7
|
+
module USAutocompletePro
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative '../us_street/candidate'
|
2
|
+
|
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
|
8
|
+
|
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 = []
|
17
|
+
|
18
|
+
candidates.each {|candidate|
|
19
|
+
@candidates.push(USStreet::Candidate.new(candidate))
|
20
|
+
}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require_relative '../request'
|
2
|
+
require_relative '../exceptions'
|
3
|
+
require_relative 'result'
|
4
|
+
|
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
|
12
|
+
end
|
13
|
+
|
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
|
20
|
+
|
21
|
+
request = build_request(lookup)
|
22
|
+
response = @sender.send(request)
|
23
|
+
raise response.error if response.error
|
24
|
+
result = USExtract::Result.new(@serializer.deserialize(response.payload))
|
25
|
+
|
26
|
+
lookup.result = result
|
27
|
+
end
|
28
|
+
|
29
|
+
def build_request(lookup)
|
30
|
+
request = Request.new
|
31
|
+
request.content_type = 'text/plain'
|
32
|
+
request.payload = lookup.text
|
33
|
+
|
34
|
+
add_parameter(request, 'html', lookup.html.to_s)
|
35
|
+
add_parameter(request, 'aggressive', lookup.aggressive.to_s)
|
36
|
+
add_parameter(request, 'addr_line_breaks', lookup.addresses_have_line_breaks.to_s)
|
37
|
+
add_parameter(request, 'addr_per_line', lookup.addresses_per_line.to_s)
|
38
|
+
|
39
|
+
request
|
40
|
+
end
|
41
|
+
|
42
|
+
def add_parameter(request, key, value)
|
43
|
+
if value and not value.empty?
|
44
|
+
request.parameters[key] = value
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require_relative '../json_able'
|
2
|
+
|
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
|
11
|
+
|
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
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,17 @@
|
|
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
|
6
|
+
|
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
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative './address'
|
2
|
+
require_relative './metadata'
|
3
|
+
|
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
|
9
|
+
|
10
|
+
def initialize(obj)
|
11
|
+
@metadata = USExtract::Metadata.new(obj.fetch('meta', {}))
|
12
|
+
addresses = obj.fetch('addresses', [])
|
13
|
+
@addresses = []
|
14
|
+
|
15
|
+
addresses.each {|address|
|
16
|
+
@addresses.push(SmartyStreets::USExtract::Address.new(address))
|
17
|
+
}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require_relative './us_extract/lookup'
|
2
|
+
require_relative './us_extract/address'
|
3
|
+
require_relative './us_extract/metadata'
|
4
|
+
require_relative './us_extract/result'
|
5
|
+
require_relative './us_extract/client'
|
6
|
+
|
7
|
+
module SmartyStreets
|
8
|
+
module USExtract
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module SmartyStreets
|
2
|
+
module USReverseGeo
|
3
|
+
# See "https://smartystreets.com/docs/cloud/us-reverse-geo-api#address"
|
4
|
+
class Address
|
5
|
+
attr_reader :street, :city, :state_abbreviation, :zipcode
|
6
|
+
|
7
|
+
def initialize(obj)
|
8
|
+
@street = obj['street']
|
9
|
+
@city = obj['city']
|
10
|
+
@state_abbreviation = obj['state_abbreviation']
|
11
|
+
@zipcode = obj['zipcode']
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative '../request'
|
2
|
+
require_relative 'us_reverse_geo_response'
|
3
|
+
|
4
|
+
module SmartyStreets
|
5
|
+
module USReverseGeo
|
6
|
+
# It is recommended to instantiate this class using ClientBuilder.build_us_reverse_geo_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 Reverse Geo API and stores the result in the Lookup's response field.
|
14
|
+
def send(lookup)
|
15
|
+
request = build_request(lookup)
|
16
|
+
|
17
|
+
response = @sender.send(request)
|
18
|
+
|
19
|
+
raise response.error if response.error
|
20
|
+
|
21
|
+
lookup.response = Response.new(@serializer.deserialize(response.payload))
|
22
|
+
end
|
23
|
+
|
24
|
+
def build_request(lookup)
|
25
|
+
request = SmartyStreets::Request.new
|
26
|
+
|
27
|
+
add_parameter(request, 'latitude', lookup.latitude)
|
28
|
+
add_parameter(request, 'longitude', lookup.longitude)
|
29
|
+
|
30
|
+
request
|
31
|
+
end
|
32
|
+
|
33
|
+
def add_parameter(request, key, value)
|
34
|
+
request.parameters[key] = value unless value.nil? or value.empty?
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module SmartyStreets
|
2
|
+
module USReverseGeo
|
3
|
+
# See "https://smartystreets.com/docs/cloud/us-reverse-geo-api#coordinate"
|
4
|
+
class Coordinate
|
5
|
+
attr_reader :latitude, :longitude, :accuracy, :license
|
6
|
+
|
7
|
+
def initialize(obj)
|
8
|
+
@latitude = obj.fetch('latitude', nil)
|
9
|
+
@longitude = obj.fetch('longitude', nil)
|
10
|
+
@accuracy = obj.fetch('accuracy', nil)
|
11
|
+
@license = obj.fetch('license', nil)
|
12
|
+
end
|
13
|
+
|
14
|
+
def get_license()
|
15
|
+
case @license
|
16
|
+
when 1
|
17
|
+
return "SmartyStreets Proprietary"
|
18
|
+
else
|
19
|
+
return "SmartyStreets"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|