smartystreets_ruby_sdk 5.14.13 → 5.14.17

Sign up to get free protection for your applications and to get access to all the features.
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