smartystreets_ruby_sdk 5.14.13 → 5.14.17

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 42a215aa8d810dbd85f5739ae7a73dbd0ead4a253627d8bfeb36d017e36ca716
4
- data.tar.gz: 3be273085fc4466f96c0376e9d101d5dc2464210aa3a092c00e0f4ddade0fb12
3
+ metadata.gz: f3b53c497e2b878f2e38640936f0506d2e5261a667ce32d01858c09f630a9d9f
4
+ data.tar.gz: 1b14bbb12896b4c35477039085b3fb4979956a019dcbf88d1fd51a130be625c4
5
5
  SHA512:
6
- metadata.gz: 318e5a6802ffa480c4a83887637a0e64c41e3481d5cfd28799de3d455f68369f2733c9fad6afa9b1e95974524da273daf688d54f124062d8ea9e634b80ad0bda
7
- data.tar.gz: f719f070faf89dfe73c4e248f19cdb71c769ecdd88e2e5bd2ddf0ec9cfcd4f35f66630fe763b05e6903b7a76af5932302ed41ff29dcbceac46d43dc0f513d00a
6
+ metadata.gz: d7b37c5ca35a41d18cbb57bb66f6afd6c08c1ab2da90fb13ce26d4c749856c5120081ede5421ede7a7a83dd5d5b999ae246b345a9595d2d23ba32bc84b4118e9
7
+ data.tar.gz: ddcb7bd954004e635befcbe9fe42577a22383edd74cfea57669c4d3eca7d398f55c664650739b2bf277da4a14e5dd2eb0548191f9e261c65abcdcd7b0ef746d6
@@ -13,47 +13,15 @@ jobs:
13
13
  steps:
14
14
  - uses: actions/checkout@v3
15
15
  with:
16
- fetch-depth: 0 # need all the commits
16
+ fetch-depth: 0
17
17
 
18
18
  - uses: ruby/setup-ruby@v1
19
19
  with:
20
20
  ruby-version: '2.6'
21
21
  bundler-cache: false
22
-
23
- - uses: actions/setup-node@v2
24
-
25
- - name: Clean
26
- run: |
27
- rm -f *.gem
28
- git checkout lib/smartystreets_ruby_sdk/version.rb
29
-
30
- - name: Dependencies
31
- run: |
32
- gem install minitest
33
-
34
- - name: Test
35
- run: |
36
- rake test
37
-
38
- - name: Set Environment Variable
39
- run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
40
-
41
- - name: Grab Version
42
- run: |
43
- echo "Module SmartyStreets
44
- VERSION = '${{ env.RELEASE_VERSION }}'
45
- end" >> version.rb \
46
- && cat version.rb \
47
- && gem build *.gemspec \
48
- && git checkout lib/smartystreets_ruby_sdk/version.rb
49
22
 
50
- - name: Push to rubygems.org
23
+ - name: Publish
51
24
  run: |
52
- mkdir -p $HOME/.gem
53
- touch $HOME/.gem/credentials
54
- chmod 0600 $HOME/.gem/credentials
55
- printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
56
- gem push *.gem
57
- # chmod 0600 /root/.gem/credentials
25
+ VERSION=${GITHUB_REF#refs/*/} API_KEY=${{ secrets.GEM_HOST_API_KEY }} make publish
58
26
  env:
59
- GEM_HOST_API_KEY: "${{secrets.GEM_HOST_API_KEY}}"
27
+ API_KEY: "${{ secrets.GEM_HOST_API_KEY }}"
data/Makefile CHANGED
@@ -1,6 +1,5 @@
1
1
  #!/usr/bin/make -f
2
2
 
3
- VERSION := $(shell tagit -p --dry-run)
4
3
  VERSION_FILE := lib/smartystreets_ruby_sdk/version.rb
5
4
 
6
5
  clean:
@@ -14,20 +13,16 @@ dependencies:
14
13
  gem install minitest
15
14
 
16
15
  package: clean dependencies test
17
- sed -i "s/0\.0\.0/$(VERSION)/g" "$(VERSION_FILE)" \
18
- && gem build *.gemspec \
19
- && git checkout "$(VERSION_FILE)"
16
+ sed -i "s/0\.0\.0/${VERSION}/g" "$(VERSION_FILE)" \
17
+ && gem build *.gemspec \
18
+ && git checkout "$(VERSION_FILE)"
20
19
 
21
20
  publish: package
22
- chmod 0600 /root/.gem/credentials
21
+ mkdir -p ~/.gem
22
+ touch ~/.gem/credentials
23
+ chmod 0600 ~/.gem/credentials
24
+ printf -- "---\n:rubygems_api_key: ${API_KEY}\n" > ~/.gem/credentials
25
+ cat ~/.gem/credentials
23
26
  gem push *.gem
24
27
 
25
- #####################################################################
26
-
27
- workspace:
28
- docker-compose run sdk /bin/sh
29
-
30
- release:
31
- docker-compose run sdk make publish && tagit -p && git push origin --tags
32
-
33
- .PHONY: clean test dependencies package publish workspace release
28
+ .PHONY: clean test dependencies package publish
@@ -1,6 +1,7 @@
1
1
  require 'smartystreets_ruby_sdk/static_credentials'
2
2
  require 'smartystreets_ruby_sdk/client_builder'
3
3
  require 'smartystreets_ruby_sdk/us_street/lookup'
4
+ require 'smartystreets_ruby_sdk/us_street/match_type'
4
5
 
5
6
  class USStreetSingleAddressExample
6
7
  def run
@@ -16,9 +17,11 @@ class USStreetSingleAddressExample
16
17
  # The appropriate license values to be used for your subscriptions
17
18
  # can be found on the Subscriptions page of the account dashboard.
18
19
  # https://www.smartystreets.com/docs/cloud/licensing
19
- client = SmartyStreets::ClientBuilder.new(credentials).with_licenses(['us-core-cloud'])
20
- # with_proxy('localhost', 8080, 'proxyUser', 'proxyPassword'). # Uncomment this line to try it with a proxy
21
- build_us_street_api_client
20
+ #
21
+ # To try with a proxy, add this method call after with_licences
22
+ # with_proxy('localhost', 8080, 'proxyUser', 'proxyPassword')
23
+ client = SmartyStreets::ClientBuilder.new(credentials).with_licenses(['us-core-cloud']).
24
+ build_us_street_api_client
22
25
 
23
26
  # Documentation for input fields can be found at:
24
27
  # https://smartystreets.com/docs/cloud/us-street-api
@@ -34,7 +37,8 @@ class USStreetSingleAddressExample
34
37
  lookup.state = 'CA'
35
38
  lookup.zipcode = '21229'
36
39
  lookup.candidates = 3
37
- lookup.match = Lookup.INVALID # "invalid" is the most permissive match,
40
+ lookup.match = SmartyStreets::USStreet::MatchType::INVALID
41
+ # "invalid" is the most permissive match,
38
42
  # this will always return at least one result even if the address is invalid.
39
43
  # Refer to the documentation for additional Match Strategy options.
40
44
 
@@ -64,4 +68,4 @@ class USStreetSingleAddressExample
64
68
  end
65
69
 
66
70
  example = USStreetSingleAddressExample.new
67
- example.run
71
+ example.run
@@ -39,7 +39,7 @@ module SmartyStreets
39
39
  @max_timeout = 10
40
40
  @url_prefix = nil
41
41
  @proxy = nil
42
- @headers = nil
42
+ @header = nil
43
43
  @licenses = %w()
44
44
  @debug = nil
45
45
  end
@@ -98,8 +98,8 @@ module SmartyStreets
98
98
  # headers is a Hash object.
99
99
  #
100
100
  # Returns self to accommodate method chaining.
101
- def with_custom_headers(headers)
102
- @headers = headers
101
+ def with_custom_headers(header)
102
+ @header = header
103
103
  self
104
104
  end
105
105
 
@@ -170,7 +170,7 @@ module SmartyStreets
170
170
 
171
171
  sender = StatusCodeSender.new(sender)
172
172
 
173
- sender = CustomHeaderSender.new(sender, @headers) unless @headers.nil?
173
+ sender = CustomHeaderSender.new(sender, @header) unless @header.nil?
174
174
 
175
175
  sender = SigningSender.new(@signer, sender) unless @signer.nil?
176
176
 
@@ -1,12 +1,12 @@
1
1
  module SmartyStreets
2
2
  class CustomHeaderSender
3
- def initialize(inner, headers)
3
+ def initialize(inner, header)
4
4
  @inner = inner
5
- @headers = headers
5
+ @header = header
6
6
  end
7
7
 
8
8
  def send(request)
9
- request.headers = @headers
9
+ request.header = @header
10
10
  @inner.send(request)
11
11
  end
12
12
  end
@@ -15,8 +15,7 @@ module SmartyStreets
15
15
 
16
16
  UNPROCESSABLE_ENTITY = 'GET request lacked required fields.'.freeze
17
17
 
18
- TOO_MANY_REQUESTS = 'When using public "website key" authentication,
19
- we restrict the number of requests coming from a given source over too short of a time.'.freeze
18
+ TOO_MANY_REQUESTS = 'The rate limit has been exceeded.'.freeze
20
19
 
21
20
  INTERNAL_SERVER_ERROR = 'Internal Server Error.'.freeze
22
21
 
@@ -5,17 +5,21 @@ module SmartyStreets
5
5
  attr_reader :premise, :thoroughfare_trailing_type, :sub_building, :locality, :post_box_number,
6
6
  :thoroughfare_name, :thoroughfare_postdirection, :dependent_thoroughfare, :premise_prefix_number,
7
7
  :thoroughfare, :dependent_thoroughfare_name, :postal_code_short, :dependent_thoroughfare_trailing_type,
8
- :administrative_area, :post_box, :building_leading_type, :dependent_locality_name, :thoroughfare_type,
8
+ :administrative_area, :administrative_area_short, :administrative_area_long, :post_box,
9
+ :building_leading_type, :dependent_locality_name, :thoroughfare_type,
9
10
  :dependent_thoroughfare_postdirection, :double_dependent_locality, :premise_number,
10
11
  :dependent_thoroughfare_type, :post_box_type, :building, :sub_administrative_area, :postal_code_extra,
11
12
  :sub_building_name, :postal_code, :dependent_locality, :premise_type, :sub_building_number,
12
13
  :super_administrative_area, :premise_extra, :dependent_thoroughfare_predirection,
13
- :building_trailing_type, :thoroughfare_predirection, :building_name, :country_iso_3, :sub_building_type
14
+ :building_trailing_type, :thoroughfare_predirection, :building_name, :level_type, :level_number,
15
+ :country_iso_3, :sub_building_type
14
16
 
15
17
  def initialize(obj)
16
18
  @country_iso_3 = obj.fetch('country_iso_3', nil)
17
19
  @super_administrative_area = obj.fetch('super_administrative_area', nil)
18
20
  @administrative_area = obj.fetch('administrative_area', nil)
21
+ @administrative_area_short = obj.fetch('administrative_area_short', nil)
22
+ @administrative_area_long = obj.fetch('administrative_area_long', nil)
19
23
  @sub_administrative_area = obj.fetch('sub_administrative_area', nil)
20
24
  @dependent_locality= obj.fetch('dependent_locality', nil)
21
25
  @dependent_locality_name = obj.fetch('dependent_locality_name', nil)
@@ -49,6 +53,8 @@ module SmartyStreets
49
53
  @sub_building_number = obj.fetch('sub_building_number', nil)
50
54
  @sub_building_name = obj.fetch('sub_building_name', nil)
51
55
  @sub_building = obj.fetch('sub_building', nil)
56
+ @level_type = obj.fetch('level_type', nil)
57
+ @level_number = obj.fetch('level_number', nil)
52
58
  @post_box = obj.fetch('post_box', nil)
53
59
  @post_box_type = obj.fetch('post_box_type', nil)
54
60
  @post_box_number = obj.fetch('post_box_number', nil)
@@ -24,7 +24,11 @@ module SmartyStreets
24
24
 
25
25
  http.finish if http.started?
26
26
  rescue StandardError => err
27
- return Response.new(nil, nil, err)
27
+ if response.nil?
28
+ return Response.new(nil, nil, nil, err)
29
+ else
30
+ return Response.new(nil, nil, response.header, err)
31
+ end
28
32
  end
29
33
 
30
34
  build_smarty_response(response)
@@ -43,12 +47,16 @@ module SmartyStreets
43
47
  request.body = smarty_request.payload
44
48
  request['User-Agent'] = "smartystreets (sdk:ruby@#{SmartyStreets::VERSION})"
45
49
  request['Referer'] = smarty_request.referer unless smarty_request.referer.nil?
46
- set_custom_headers(smarty_request.headers, request)
50
+ set_custom_headers(smarty_request.header, request)
47
51
  request
48
52
  end
49
53
 
50
54
  def build_smarty_response(native_response)
51
- Response.new(native_response.body, native_response.code)
55
+ if native_response.header.nil?
56
+ Response.new(native_response.body, native_response.code)
57
+ else
58
+ Response.new(native_response.body, native_response.code, native_response.header)
59
+ end
52
60
  end
53
61
 
54
62
  def build_http(request)
@@ -70,8 +78,8 @@ module SmartyStreets
70
78
  URI.encode_www_form(smarty_request.parameters)
71
79
  end
72
80
 
73
- def self.set_custom_headers(smarty_headers, request)
74
- smarty_headers.each do |key, values|
81
+ def self.set_custom_headers(smarty_header, request)
82
+ smarty_header.each do |key, values|
75
83
  if values.respond_to? :each
76
84
  values.each do |value|
77
85
  request.add_field(key, value)
@@ -1,13 +1,13 @@
1
1
  module SmartyStreets
2
2
  class Request
3
- attr_accessor :parameters, :payload, :url_prefix, :referer, :headers, :content_type
3
+ attr_accessor :parameters, :payload, :url_prefix, :referer, :header, :content_type
4
4
 
5
5
  def initialize
6
6
  @parameters = {}
7
7
  @payload = nil
8
8
  @url_prefix = nil
9
9
  @referer = nil
10
- @headers = {}
10
+ @header = {}
11
11
  @content_type = 'application/json'
12
12
  end
13
13
  end
@@ -1,10 +1,11 @@
1
1
  module SmartyStreets
2
2
  class Response
3
- attr_accessor :payload, :status_code, :error
3
+ attr_accessor :payload, :status_code, :header, :error
4
4
 
5
- def initialize(payload, status_code, error = nil)
5
+ def initialize(payload, status_code, header = nil, error = nil)
6
6
  @payload = payload
7
7
  @status_code = status_code
8
+ @header = header
8
9
  @error = error
9
10
  end
10
11
  end
@@ -1,8 +1,8 @@
1
1
  module SmartyStreets
2
2
  class RetrySender
3
3
  MAX_BACKOFF_DURATION = 10
4
- STATUS_INTERNAL_SERVER_ERROR = 500
5
4
  STATUS_TOO_MANY_REQUESTS = 429
5
+ STATUS_TO_RETRY = [408, 429, 500, 502, 503, 504]
6
6
 
7
7
  def initialize(max_retries, inner, sleeper, logger)
8
8
  @max_retries = max_retries
@@ -15,14 +15,20 @@ module SmartyStreets
15
15
  response = @inner.send(request)
16
16
 
17
17
  (0..@max_retries-1).each do |i|
18
- if response.status_code.to_i == STATUS_TOO_MANY_REQUESTS
19
- backoff(5)
20
- end
21
-
22
- break if response.status_code.to_i < STATUS_INTERNAL_SERVER_ERROR
23
18
 
24
- backoff(i)
19
+ break if STATUS_TO_RETRY.include?(response.status_code.to_i) == false
25
20
 
21
+ if response.status_code.to_i == STATUS_TOO_MANY_REQUESTS
22
+ seconds_to_backoff = 10
23
+ if response.header.nil? == false
24
+ if Integer(response.header["Retry-After"], exception: false)
25
+ seconds_to_backoff = response.header["Retry-After"].to_i
26
+ end
27
+ end
28
+ rate_limit_backoff(seconds_to_backoff)
29
+ else
30
+ backoff(i)
31
+ end
26
32
  response = @inner.send(request)
27
33
  end
28
34
 
@@ -35,5 +41,10 @@ module SmartyStreets
35
41
  @logger.log("There was an error processing the request. Retrying in #{backoff_duration} seconds...")
36
42
  @sleeper.sleep(backoff_duration)
37
43
  end
44
+
45
+ def rate_limit_backoff(backoff_duration)
46
+ @logger.log("Rate limit reached. Retrying in #{backoff_duration} seconds...")
47
+ @sleeper.sleep(backoff_duration)
48
+ end
38
49
  end
39
50
  end
@@ -10,11 +10,29 @@ module SmartyStreets
10
10
  def send(request)
11
11
  response = @inner.send(request)
12
12
 
13
+ if response.status_code == '429'
14
+ response.error = parse_rate_limit_response(response)
15
+ end
13
16
  assign_exception(response) if response.error == nil
14
17
 
15
18
  response
16
19
  end
17
20
 
21
+ def parse_rate_limit_response(response)
22
+ error_message = ""
23
+ if !response.payload.nil?
24
+ response_json = JSON.parse(response.payload)
25
+ response_json["errors"].each do |error|
26
+ error_message += (" " + error["message"])
27
+ end
28
+ error_message.strip!
29
+ end
30
+ if error_message == ""
31
+ error_message = TOO_MANY_REQUESTS
32
+ end
33
+ TooManyRequestsError.new(error_message)
34
+ end
35
+
18
36
  def assign_exception(response)
19
37
  response.error = case response.status_code
20
38
  when '401'
@@ -1,3 +1,3 @@
1
1
  module SmartyStreets
2
- VERSION = '5.14.13' # DO NOT EDIT (this is updated by a build job when a new release is published)
2
+ VERSION = '5.14.17' # DO NOT EDIT (this is updated by a build job when a new release is published)
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smartystreets_ruby_sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.14.13
4
+ version: 5.14.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - SmartyStreets SDK Team
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-08-09 00:00:00.000000000 Z
11
+ date: 2022-11-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler