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.
Files changed (65) hide show
  1. data/Makefile +1 -1
  2. data/examples/international_example.rb +3 -3
  3. data/examples/us_autocomplete_example.rb +3 -3
  4. data/examples/us_extract_example.rb +3 -3
  5. data/examples/us_street_multiple_address_example.rb +6 -5
  6. data/examples/us_street_single_address_example.rb +5 -5
  7. data/examples/us_zipcode_multiple_lookup_example.rb +6 -5
  8. data/examples/us_zipcode_single_lookup_example.rb +4 -4
  9. data/lib/smartystreets_ruby_sdk.rb +26 -4
  10. data/lib/smartystreets_ruby_sdk/batch.rb +44 -41
  11. data/lib/smartystreets_ruby_sdk/client_builder.rb +115 -113
  12. data/lib/smartystreets_ruby_sdk/custom_header_sender.rb +10 -8
  13. data/lib/smartystreets_ruby_sdk/errors.rb +13 -11
  14. data/lib/smartystreets_ruby_sdk/exceptions.rb +27 -23
  15. data/lib/smartystreets_ruby_sdk/international_street.rb +3 -1
  16. data/lib/smartystreets_ruby_sdk/international_street/analysis.rb +11 -9
  17. data/lib/smartystreets_ruby_sdk/international_street/candidate.rb +28 -26
  18. data/lib/smartystreets_ruby_sdk/international_street/client.rb +45 -43
  19. data/lib/smartystreets_ruby_sdk/international_street/components.rb +53 -51
  20. data/lib/smartystreets_ruby_sdk/international_street/language_mode.rb +7 -3
  21. data/lib/smartystreets_ruby_sdk/international_street/lookup.rb +63 -61
  22. data/lib/smartystreets_ruby_sdk/international_street/metadata.rb +12 -10
  23. data/lib/smartystreets_ruby_sdk/json_able.rb +13 -11
  24. data/lib/smartystreets_ruby_sdk/logger.rb +2 -2
  25. data/lib/smartystreets_ruby_sdk/native_sender.rb +58 -56
  26. data/lib/smartystreets_ruby_sdk/native_serializer.rb +9 -7
  27. data/lib/smartystreets_ruby_sdk/proxy.rb +2 -2
  28. data/lib/smartystreets_ruby_sdk/request.rb +11 -9
  29. data/lib/smartystreets_ruby_sdk/response.rb +9 -7
  30. data/lib/smartystreets_ruby_sdk/retry_sender.rb +26 -24
  31. data/lib/smartystreets_ruby_sdk/shared_credentials.rb +11 -9
  32. data/lib/smartystreets_ruby_sdk/signing_sender.rb +11 -9
  33. data/lib/smartystreets_ruby_sdk/sleeper.rb +1 -1
  34. data/lib/smartystreets_ruby_sdk/static_credentials.rb +11 -9
  35. data/lib/smartystreets_ruby_sdk/status_code_sender.rb +31 -29
  36. data/lib/smartystreets_ruby_sdk/url_prefix_sender.rb +11 -9
  37. data/lib/smartystreets_ruby_sdk/us_autocomplete.rb +3 -1
  38. data/lib/smartystreets_ruby_sdk/us_autocomplete/client.rb +47 -45
  39. data/lib/smartystreets_ruby_sdk/us_autocomplete/geolocation_type.rb +9 -5
  40. data/lib/smartystreets_ruby_sdk/us_autocomplete/lookup.rb +26 -24
  41. data/lib/smartystreets_ruby_sdk/us_autocomplete/suggestion.rb +11 -9
  42. data/lib/smartystreets_ruby_sdk/us_extract.rb +4 -2
  43. data/lib/smartystreets_ruby_sdk/us_extract/address.rb +18 -16
  44. data/lib/smartystreets_ruby_sdk/us_extract/client.rb +34 -32
  45. data/lib/smartystreets_ruby_sdk/us_extract/lookup.rb +16 -14
  46. data/lib/smartystreets_ruby_sdk/us_extract/metadata.rb +13 -11
  47. data/lib/smartystreets_ruby_sdk/us_extract/result.rb +13 -11
  48. data/lib/smartystreets_ruby_sdk/us_street.rb +4 -2
  49. data/lib/smartystreets_ruby_sdk/us_street/analysis.rb +19 -17
  50. data/lib/smartystreets_ruby_sdk/us_street/candidate.rb +19 -17
  51. data/lib/smartystreets_ruby_sdk/us_street/client.rb +51 -49
  52. data/lib/smartystreets_ruby_sdk/us_street/components.rb +32 -30
  53. data/lib/smartystreets_ruby_sdk/us_street/lookup.rb +27 -26
  54. data/lib/smartystreets_ruby_sdk/us_street/match_type.rb +9 -5
  55. data/lib/smartystreets_ruby_sdk/us_street/metadata.rb +26 -24
  56. data/lib/smartystreets_ruby_sdk/us_zipcode.rb +4 -2
  57. data/lib/smartystreets_ruby_sdk/us_zipcode/alternate_county.rb +12 -10
  58. data/lib/smartystreets_ruby_sdk/us_zipcode/city.rb +13 -11
  59. data/lib/smartystreets_ruby_sdk/us_zipcode/client.rb +46 -44
  60. data/lib/smartystreets_ruby_sdk/us_zipcode/lookup.rb +16 -13
  61. data/lib/smartystreets_ruby_sdk/us_zipcode/result.rb +33 -31
  62. data/lib/smartystreets_ruby_sdk/us_zipcode/zip_code.rb +24 -21
  63. data/lib/smartystreets_ruby_sdk/version.rb +2 -2
  64. data/smartystreets_ruby_sdk.gemspec +1 -1
  65. metadata +2 -2
@@ -1,80 +1,82 @@
1
- module InternationalStreet
2
- # In addition to holding all of the input data for this lookup, this class also will contain the
3
- # result of the lookup after it comes back from the API.
4
- #
5
- # Note: Lookups must have certain required fields set with non-blank values.
6
- # These can be found at the URL below.
7
- #
8
- # See "https://smartystreets.com/docs/cloud/international-street-api#http-input-fields"
9
- #
10
- # @geocode:: Disabled by default. Set to true to enable.
11
- # @language:: When not set, the output language will match the language of the input values.
12
- # When set to language_mode.NATIVE, the results will always be in the language of the output country.
13
- # When set to language_mode.LATIN, the results will always be provided using a Latin character set.
14
- class Lookup
1
+ module SmartyStreets
2
+ module InternationalStreet
3
+ # In addition to holding all of the input data for this lookup, this class also will contain the
4
+ # result of the lookup after it comes back from the API.
5
+ #
6
+ # Note: Lookups must have certain required fields set with non-blank values.
7
+ # These can be found at the URL below.
8
+ #
9
+ # See "https://smartystreets.com/docs/cloud/international-street-api#http-input-fields"
10
+ #
11
+ # @geocode:: Disabled by default. Set to true to enable.
12
+ # @language:: When not set, the output language will match the language of the input values.
13
+ # When set to language_mode.NATIVE, the results will always be in the language of the output country.
14
+ # When set to language_mode.LATIN, the results will always be provided using a Latin character set.
15
+ class Lookup
15
16
 
16
- attr_accessor :freeform, :locality, :postal_code, :address3, :address2, :inputId, :address1,
17
- :geocode, :administrative_area, :country, :organization, :language, :address4, :result
17
+ attr_accessor :freeform, :locality, :postal_code, :address3, :address2, :inputId, :address1,
18
+ :geocode, :administrative_area, :country, :organization, :language, :address4, :result
18
19
 
19
- def initialize(freeform=nil, country=nil)
20
- @result = []
20
+ def initialize(freeform=nil, country=nil)
21
+ @result = []
21
22
 
22
- @inputId = nil
23
- @country = country
24
- @geocode = nil
25
- @language = nil
26
- @freeform = freeform
27
- @address1 = nil
28
- @address2 = nil
29
- @address3 = nil
30
- @address4 = nil
31
- @organization = nil
32
- @locality = nil
33
- @administrative_area = nil
34
- @postal_code = nil
35
- end
23
+ @inputId = nil
24
+ @country = country
25
+ @geocode = nil
26
+ @language = nil
27
+ @freeform = freeform
28
+ @address1 = nil
29
+ @address2 = nil
30
+ @address3 = nil
31
+ @address4 = nil
32
+ @organization = nil
33
+ @locality = nil
34
+ @administrative_area = nil
35
+ @postal_code = nil
36
+ end
36
37
 
37
- def missing_country
38
- field_is_missing(@country)
39
- end
38
+ def missing_country
39
+ field_is_missing(@country)
40
+ end
40
41
 
41
- def has_freeform
42
- field_is_set(@freeform)
43
- end
42
+ def has_freeform
43
+ field_is_set(@freeform)
44
+ end
44
45
 
45
- def missing_address1
46
- field_is_missing(@address1)
47
- end
46
+ def missing_address1
47
+ field_is_missing(@address1)
48
+ end
48
49
 
49
- def has_postal_code
50
- field_is_set(@postal_code)
51
- end
50
+ def has_postal_code
51
+ field_is_set(@postal_code)
52
+ end
52
53
 
53
- def missing_locality_or_administrative_area
54
- field_is_missing(@locality) or field_is_missing(@administrative_area)
55
- end
54
+ def missing_locality_or_administrative_area
55
+ field_is_missing(@locality) or field_is_missing(@administrative_area)
56
+ end
56
57
 
57
- def field_is_missing(field)
58
- field.nil? or field.empty?
59
- end
58
+ def field_is_missing(field)
59
+ field.nil? or field.empty?
60
+ end
60
61
 
61
- def field_is_set(field)
62
- not field_is_missing(field)
63
- end
62
+ def field_is_set(field)
63
+ not field_is_missing(field)
64
+ end
64
65
 
65
- def ensure_enough_info
66
- raise UnprocessableEntityError, 'Country field is required.' if missing_country
66
+ def ensure_enough_info
67
+ raise UnprocessableEntityError, 'Country field is required.' if missing_country
67
68
 
68
- return true if has_freeform
69
+ return true if has_freeform
69
70
 
70
- raise UnprocessableEntityError, 'Either freeform or address1 is required.' if missing_address1
71
+ raise UnprocessableEntityError, 'Either freeform or address1 is required.' if missing_address1
71
72
 
72
- return true if has_postal_code
73
+ return true if has_postal_code
73
74
 
74
- if missing_locality_or_administrative_area
75
- raise UnprocessableEntityError, 'Insufficient information:'\
75
+ if missing_locality_or_administrative_area
76
+ raise UnprocessableEntityError, 'Insufficient information:'\
76
77
  'One or more required fields were not set on the lookup.'
78
+ end
77
79
  end
78
80
  end
79
81
  end
80
- end
82
+ end
@@ -1,14 +1,16 @@
1
- module InternationalStreet
2
- # See "https://smartystreets.com/docs/cloud/international-street-api#metadata"
3
- class Metadata
1
+ module SmartyStreets
2
+ module InternationalStreet
3
+ # See "https://smartystreets.com/docs/cloud/international-street-api#metadata"
4
+ class Metadata
4
5
 
5
- attr_reader :longitude, :geocode_precision, :max_geocode_precision, :latitude
6
+ attr_reader :longitude, :geocode_precision, :max_geocode_precision, :latitude
6
7
 
7
- def initialize(obj)
8
- @latitude = obj.fetch('latitude', nil)
9
- @longitude = obj.fetch('longitude', nil)
10
- @geocode_precision = obj.fetch('geocode_precision', nil)
11
- @max_geocode_precision = obj.fetch('max_geocode_precision', nil)
8
+ def initialize(obj)
9
+ @latitude = obj.fetch('latitude', nil)
10
+ @longitude = obj.fetch('longitude', nil)
11
+ @geocode_precision = obj.fetch('geocode_precision', nil)
12
+ @max_geocode_precision = obj.fetch('max_geocode_precision', nil)
13
+ end
12
14
  end
13
15
  end
14
- end
16
+ end
@@ -1,17 +1,19 @@
1
1
  require 'json'
2
2
 
3
- class JSONAble
4
- def to_json(options={})
5
- hash = {}
6
- instance_variables.each do |var|
7
- hash[var.to_s.delete('@')] = instance_variable_get var
3
+ module SmartyStreets
4
+ class JSONAble
5
+ def to_json(options={})
6
+ hash = {}
7
+ instance_variables.each do |var|
8
+ hash[var.to_s.delete('@')] = instance_variable_get var
9
+ end
10
+ hash.to_json
8
11
  end
9
- hash.to_json
10
- end
11
12
 
12
- def from_json!(string)
13
- JSON.load(string).each do |var, val|
14
- instance_variable_set var, val
13
+ def from_json!(string)
14
+ JSON.load(string).each do |var, val|
15
+ instance_variable_set var, val
16
+ end
15
17
  end
16
18
  end
17
- end
19
+ end
@@ -1,7 +1,7 @@
1
- module SmartystreetsRubySdk
1
+ module SmartyStreets
2
2
  class Logger
3
3
  def log(message)
4
4
  puts message
5
5
  end
6
6
  end
7
- end
7
+ end
@@ -2,81 +2,83 @@ require 'net/http'
2
2
  require_relative 'version'
3
3
  require_relative 'response'
4
4
 
5
- class NativeSender
6
- def initialize(max_timeout = 10_000, proxy = nil)
7
- @max_timeout = max_timeout
8
- @proxy = proxy
9
- end
5
+ module SmartyStreets
6
+ class NativeSender
7
+ def initialize(max_timeout = 10_000, proxy = nil)
8
+ @max_timeout = max_timeout
9
+ @proxy = proxy
10
+ end
10
11
 
11
- def send(smarty_request)
12
- request = self.class.build_request(smarty_request)
12
+ def send(smarty_request)
13
+ request = self.class.build_request(smarty_request)
13
14
 
14
- begin
15
- http = build_http(request)
16
- http.use_ssl = true
17
- http.ssl_version = :TLSv1_2
18
- http.read_timeout = @max_timeout
15
+ begin
16
+ http = build_http(request)
17
+ http.use_ssl = true
18
+ http.ssl_version = :TLSv1_2
19
+ http.read_timeout = @max_timeout
19
20
 
20
- response = http.request(request)
21
+ response = http.request(request)
22
+
23
+ http.finish if http.started?
24
+ rescue StandardError => err
25
+ return Response.new(nil, nil, err)
26
+ end
21
27
 
22
- http.finish if http.started?
23
- rescue StandardError => err
24
- return Response.new(nil, nil, err)
28
+ build_smarty_response(response)
25
29
  end
26
30
 
27
- build_smarty_response(response)
28
- end
31
+ def self.build_request(smarty_request)
32
+ query = create_query(smarty_request)
29
33
 
30
- def self.build_request(smarty_request)
31
- query = create_query(smarty_request)
34
+ if smarty_request.payload.nil?
35
+ request = Net::HTTP::Get.new(URI.parse("#{smarty_request.url_prefix}?#{query}"))
36
+ else
37
+ request = Net::HTTP::Post.new(URI.parse("#{smarty_request.url_prefix}?#{query}"))
38
+ end
32
39
 
33
- if smarty_request.payload.nil?
34
- request = Net::HTTP::Get.new(URI.parse("#{smarty_request.url_prefix}?#{query}"))
35
- else
36
- request = Net::HTTP::Post.new(URI.parse("#{smarty_request.url_prefix}?#{query}"))
40
+ request.content_type = 'application/json'
41
+ request.body = smarty_request.payload
42
+ request['User-Agent'] = "smartystreets (sdk:ruby@#{SmartyStreets::VERSION})"
43
+ request['Referer'] = smarty_request.referer unless smarty_request.referer.nil?
44
+ set_custom_headers(smarty_request.headers, request)
45
+ request
37
46
  end
38
47
 
39
- request.content_type = 'application/json'
40
- request.body = smarty_request.payload
41
- request['User-Agent'] = "smartystreets (sdk:ruby@#{SmartystreetsRubySdk::VERSION})"
42
- request['Referer'] = smarty_request.referer unless smarty_request.referer.nil?
43
- set_custom_headers(smarty_request.headers, request)
44
- request
45
- end
48
+ def build_smarty_response(native_response)
49
+ Response.new(native_response.body, native_response.code)
50
+ end
46
51
 
47
- def build_smarty_response(native_response)
48
- Response.new(native_response.body, native_response.code)
49
- end
52
+ def build_http(request)
53
+ uri = request.uri
50
54
 
51
- def build_http(request)
52
- uri = request.uri
55
+ if @proxy.nil?
56
+ http = Net::HTTP.new(uri.hostname, uri.port)
57
+ else
58
+ http = Net::HTTP.new(uri.hostname, uri.port, @proxy.host,
59
+ @proxy.port, @proxy.username, @proxy.password)
60
+ end
53
61
 
54
- if @proxy.nil?
55
- http = Net::HTTP.new(uri.hostname, uri.port)
56
- else
57
- http = Net::HTTP.new(uri.hostname, uri.port, @proxy.host,
58
- @proxy.port, @proxy.username, @proxy.password)
62
+ http
59
63
  end
60
64
 
61
- http
62
- end
65
+ def self.create_query(smarty_request)
66
+ query_string = ''
63
67
 
64
- def self.create_query(smarty_request)
65
- query_string = ''
68
+ smarty_request.parameters.each do |key, value|
69
+ query_string.concat("&#{key}=#{value}")
70
+ end
66
71
 
67
- smarty_request.parameters.each do |key, value|
68
- query_string.concat("&#{key}=#{value}")
72
+ query_string[0] = ''
73
+ query_string
69
74
  end
70
75
 
71
- query_string[0] = ''
72
- query_string
73
- end
74
-
75
- def self.set_custom_headers(smarty_headers, request)
76
- smarty_headers.each do |key, values|
77
- values.each do |value|
78
- request.add_field(key, value)
76
+ def self.set_custom_headers(smarty_headers, request)
77
+ smarty_headers.each do |key, values|
78
+ values.each do |value|
79
+ request.add_field(key, value)
80
+ end
79
81
  end
80
82
  end
81
83
  end
82
- end
84
+ end
@@ -1,11 +1,13 @@
1
1
  require 'json'
2
2
 
3
- class NativeSerializer
4
- def serialize(obj)
5
- obj.to_json
6
- end
3
+ module SmartyStreets
4
+ class NativeSerializer
5
+ def serialize(obj)
6
+ obj.to_json
7
+ end
7
8
 
8
- def deserialize(payload)
9
- JSON.load(payload)
9
+ def deserialize(payload)
10
+ JSON.load(payload)
11
+ end
10
12
  end
11
- end
13
+ end
@@ -1,4 +1,4 @@
1
- module SmartystreetsRubySdk
1
+ module SmartyStreets
2
2
  # Contains information about the proxy through which all requests will be sent.
3
3
  #
4
4
  # host should not include a scheme
@@ -13,4 +13,4 @@ module SmartystreetsRubySdk
13
13
  @password = password
14
14
  end
15
15
  end
16
- end
16
+ end
@@ -1,12 +1,14 @@
1
- class Request
2
- attr_accessor :parameters, :payload, :url_prefix, :referer, :headers, :content_type
1
+ module SmartyStreets
2
+ class Request
3
+ attr_accessor :parameters, :payload, :url_prefix, :referer, :headers, :content_type
3
4
 
4
- def initialize
5
- @parameters = {}
6
- @payload = nil
7
- @url_prefix = nil
8
- @referer = nil
9
- @headers = {}
10
- @content_type = 'application/json'
5
+ def initialize
6
+ @parameters = {}
7
+ @payload = nil
8
+ @url_prefix = nil
9
+ @referer = nil
10
+ @headers = {}
11
+ @content_type = 'application/json'
12
+ end
11
13
  end
12
14
  end
@@ -1,9 +1,11 @@
1
- class Response
2
- attr_accessor :payload, :status_code, :error
1
+ module SmartyStreets
2
+ class Response
3
+ attr_accessor :payload, :status_code, :error
3
4
 
4
- def initialize(payload, status_code, error=nil)
5
- @payload = payload
6
- @status_code = status_code
7
- @error = error
5
+ def initialize(payload, status_code, error = nil)
6
+ @payload = payload
7
+ @status_code = status_code
8
+ @error = error
9
+ end
8
10
  end
9
- end
11
+ end
@@ -1,32 +1,34 @@
1
- class RetrySender
2
- MAX_BACKOFF_DURATION = 10
3
- STATUS_OK = '200'.freeze
4
-
5
- def initialize(max_retries, inner, sleeper, logger)
6
- @max_retries = max_retries
7
- @inner = inner
8
- @sleeper = sleeper
9
- @logger = logger
10
- end
1
+ module SmartyStreets
2
+ class RetrySender
3
+ MAX_BACKOFF_DURATION = 10
4
+ STATUS_OK = '200'.freeze
5
+
6
+ def initialize(max_retries, inner, sleeper, logger)
7
+ @max_retries = max_retries
8
+ @inner = inner
9
+ @sleeper = sleeper
10
+ @logger = logger
11
+ end
11
12
 
12
- def send(request)
13
- response = @inner.send(request)
13
+ def send(request)
14
+ response = @inner.send(request)
14
15
 
15
- (0..@max_retries-1).each do |i|
16
- break if response.status_code == STATUS_OK
16
+ (0..@max_retries-1).each do |i|
17
+ break if response.status_code == STATUS_OK
17
18
 
18
- backoff(i)
19
+ backoff(i)
19
20
 
20
- response = @inner.send(request)
21
- end
21
+ response = @inner.send(request)
22
+ end
22
23
 
23
- response
24
- end
24
+ response
25
+ end
25
26
 
26
- def backoff(attempt)
27
- backoff_duration = [attempt, MAX_BACKOFF_DURATION].min
27
+ def backoff(attempt)
28
+ backoff_duration = [attempt, MAX_BACKOFF_DURATION].min
28
29
 
29
- @logger.log("There was an error processing the request. Retrying in #{backoff_duration} seconds...")
30
- @sleeper.sleep(backoff_duration)
30
+ @logger.log("There was an error processing the request. Retrying in #{backoff_duration} seconds...")
31
+ @sleeper.sleep(backoff_duration)
32
+ end
31
33
  end
32
- end
34
+ end