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.
Files changed (98) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/gem-publish.yml +58 -0
  3. data/.gitignore +4 -0
  4. data/CHANGELOG.md +5 -0
  5. data/Dockerfile +10 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.md +202 -0
  8. data/Makefile +33 -0
  9. data/README.md +31 -0
  10. data/Rakefile +5 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/docker-compose.yml +12 -0
  14. data/examples/international_autocomplete_example.rb +47 -0
  15. data/examples/international_example.rb +53 -0
  16. data/examples/us_autocomplete_pro_example.rb +56 -0
  17. data/examples/us_extract_example.rb +63 -0
  18. data/examples/us_reverse_geo_example.rb +47 -0
  19. data/examples/us_street_multiple_address_example.rb +87 -0
  20. data/examples/us_street_single_address_example.rb +67 -0
  21. data/examples/us_zipcode_multiple_lookup_example.rb +80 -0
  22. data/examples/us_zipcode_single_lookup_example.rb +55 -0
  23. data/lib/smartystreets_ruby_sdk/batch.rb +59 -0
  24. data/lib/smartystreets_ruby_sdk/client_builder.rb +188 -0
  25. data/lib/smartystreets_ruby_sdk/custom_header_sender.rb +13 -0
  26. data/lib/smartystreets_ruby_sdk/errors.rb +27 -0
  27. data/lib/smartystreets_ruby_sdk/exceptions.rb +39 -0
  28. data/lib/smartystreets_ruby_sdk/international_autocomplete/client.rb +61 -0
  29. data/lib/smartystreets_ruby_sdk/international_autocomplete/lookup.rb +21 -0
  30. data/lib/smartystreets_ruby_sdk/international_autocomplete/suggestion.rb +16 -0
  31. data/lib/smartystreets_ruby_sdk/international_street/analysis.rb +17 -0
  32. data/lib/smartystreets_ruby_sdk/international_street/candidate.rb +23 -0
  33. data/lib/smartystreets_ruby_sdk/international_street/changes.rb +15 -0
  34. data/lib/smartystreets_ruby_sdk/international_street/client.rb +63 -0
  35. data/lib/smartystreets_ruby_sdk/international_street/components.rb +58 -0
  36. data/lib/smartystreets_ruby_sdk/international_street/language_mode.rb +9 -0
  37. data/lib/smartystreets_ruby_sdk/international_street/lookup.rb +82 -0
  38. data/lib/smartystreets_ruby_sdk/international_street/metadata.rb +17 -0
  39. data/lib/smartystreets_ruby_sdk/international_street/rootlevel.rb +25 -0
  40. data/lib/smartystreets_ruby_sdk/international_street.rb +12 -0
  41. data/lib/smartystreets_ruby_sdk/json_able.rb +19 -0
  42. data/lib/smartystreets_ruby_sdk/license_sender.rb +15 -0
  43. data/lib/smartystreets_ruby_sdk/logger.rb +7 -0
  44. data/lib/smartystreets_ruby_sdk/native_sender.rb +85 -0
  45. data/lib/smartystreets_ruby_sdk/native_serializer.rb +13 -0
  46. data/lib/smartystreets_ruby_sdk/proxy.rb +16 -0
  47. data/lib/smartystreets_ruby_sdk/request.rb +14 -0
  48. data/lib/smartystreets_ruby_sdk/response.rb +11 -0
  49. data/lib/smartystreets_ruby_sdk/retry_sender.rb +39 -0
  50. data/lib/smartystreets_ruby_sdk/shared_credentials.rb +13 -0
  51. data/lib/smartystreets_ruby_sdk/signing_sender.rb +13 -0
  52. data/lib/smartystreets_ruby_sdk/sleeper.rb +7 -0
  53. data/lib/smartystreets_ruby_sdk/static_credentials.rb +13 -0
  54. data/lib/smartystreets_ruby_sdk/status_code_sender.rb +41 -0
  55. data/lib/smartystreets_ruby_sdk/url_prefix_sender.rb +14 -0
  56. data/lib/smartystreets_ruby_sdk/us_autocomplete/client.rb +72 -0
  57. data/lib/smartystreets_ruby_sdk/us_autocomplete/geolocation_type.rb +9 -0
  58. data/lib/smartystreets_ruby_sdk/us_autocomplete/lookup.rb +38 -0
  59. data/lib/smartystreets_ruby_sdk/us_autocomplete/suggestion.rb +16 -0
  60. data/lib/smartystreets_ruby_sdk/us_autocomplete.rb +9 -0
  61. data/lib/smartystreets_ruby_sdk/us_autocomplete_pro/client.rb +78 -0
  62. data/lib/smartystreets_ruby_sdk/us_autocomplete_pro/geolocation_type.rb +8 -0
  63. data/lib/smartystreets_ruby_sdk/us_autocomplete_pro/lookup.rb +63 -0
  64. data/lib/smartystreets_ruby_sdk/us_autocomplete_pro/suggestion.rb +18 -0
  65. data/lib/smartystreets_ruby_sdk/us_autocomplete_pro.rb +10 -0
  66. data/lib/smartystreets_ruby_sdk/us_extract/address.rb +24 -0
  67. data/lib/smartystreets_ruby_sdk/us_extract/client.rb +49 -0
  68. data/lib/smartystreets_ruby_sdk/us_extract/lookup.rb +22 -0
  69. data/lib/smartystreets_ruby_sdk/us_extract/metadata.rb +17 -0
  70. data/lib/smartystreets_ruby_sdk/us_extract/result.rb +21 -0
  71. data/lib/smartystreets_ruby_sdk/us_extract.rb +10 -0
  72. data/lib/smartystreets_ruby_sdk/us_reverse_geo/address.rb +16 -0
  73. data/lib/smartystreets_ruby_sdk/us_reverse_geo/client.rb +38 -0
  74. data/lib/smartystreets_ruby_sdk/us_reverse_geo/coordinate.rb +25 -0
  75. data/lib/smartystreets_ruby_sdk/us_reverse_geo/lookup.rb +21 -0
  76. data/lib/smartystreets_ruby_sdk/us_reverse_geo/result.rb +20 -0
  77. data/lib/smartystreets_ruby_sdk/us_reverse_geo/us_reverse_geo_response.rb +17 -0
  78. data/lib/smartystreets_ruby_sdk/us_reverse_geo.rb +12 -0
  79. data/lib/smartystreets_ruby_sdk/us_street/analysis.rb +24 -0
  80. data/lib/smartystreets_ruby_sdk/us_street/candidate.rb +27 -0
  81. data/lib/smartystreets_ruby_sdk/us_street/client.rb +78 -0
  82. data/lib/smartystreets_ruby_sdk/us_street/components.rb +35 -0
  83. data/lib/smartystreets_ruby_sdk/us_street/lookup.rb +32 -0
  84. data/lib/smartystreets_ruby_sdk/us_street/match_type.rb +10 -0
  85. data/lib/smartystreets_ruby_sdk/us_street/metadata.rb +30 -0
  86. data/lib/smartystreets_ruby_sdk/us_street.rb +12 -0
  87. data/lib/smartystreets_ruby_sdk/us_zipcode/alternate_county.rb +15 -0
  88. data/lib/smartystreets_ruby_sdk/us_zipcode/city.rb +16 -0
  89. data/lib/smartystreets_ruby_sdk/us_zipcode/client.rb +72 -0
  90. data/lib/smartystreets_ruby_sdk/us_zipcode/lookup.rb +21 -0
  91. data/lib/smartystreets_ruby_sdk/us_zipcode/result.rb +47 -0
  92. data/lib/smartystreets_ruby_sdk/us_zipcode/zip_code.rb +33 -0
  93. data/lib/smartystreets_ruby_sdk/us_zipcode.rb +11 -0
  94. data/lib/smartystreets_ruby_sdk/version.rb +3 -0
  95. data/lib/smartystreets_ruby_sdk.rb +33 -0
  96. data/ruby-sdk-demo.json +354 -0
  97. data/smartystreets_ruby_sdk.gemspec +26 -0
  98. metadata +201 -0
@@ -0,0 +1,13 @@
1
+ module SmartyStreets
2
+ class SigningSender
3
+ def initialize(signer, inner)
4
+ @signer = signer
5
+ @inner = inner
6
+ end
7
+
8
+ def send(request)
9
+ @signer.sign(request)
10
+ @inner.send(request)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ module SmartyStreets
2
+ class Sleeper
3
+ def sleep(seconds)
4
+ Kernel::sleep(seconds)
5
+ end
6
+ end
7
+ end
@@ -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,14 @@
1
+ module SmartyStreets
2
+ class URLPrefixSender
3
+ def initialize(url_prefix, inner)
4
+ @url_prefix = url_prefix
5
+ @inner = inner
6
+ end
7
+
8
+ def send(request)
9
+ request.url_prefix = @url_prefix
10
+
11
+ @inner.send(request)
12
+ end
13
+ end
14
+ 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,9 @@
1
+ module SmartyStreets
2
+ module USAutocomplete
3
+ module GeolocationType
4
+ CITY = 'city'
5
+ STATE = 'state'
6
+ NONE = 'null'
7
+ end
8
+ end
9
+ 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,9 @@
1
+ require_relative './us_autocomplete/lookup'
2
+ require_relative './us_autocomplete/geolocation_type'
3
+ require_relative './us_autocomplete/suggestion'
4
+ require_relative './us_autocomplete/client'
5
+
6
+ module SmartyStreets
7
+ module USAutocomplete
8
+ end
9
+ 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,8 @@
1
+ module SmartyStreets
2
+ module USAutocompletePro
3
+ module GeolocationType
4
+ CITY = 'city'
5
+ NONE = 'none'
6
+ end
7
+ end
8
+ end
@@ -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
+