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 +4 -4
- data/.github/workflows/gem-publish.yml +4 -36
- data/Makefile +9 -14
- data/examples/us_street_single_address_example.rb +9 -5
- data/lib/smartystreets_ruby_sdk/client_builder.rb +4 -4
- data/lib/smartystreets_ruby_sdk/custom_header_sender.rb +3 -3
- data/lib/smartystreets_ruby_sdk/errors.rb +1 -2
- data/lib/smartystreets_ruby_sdk/international_street/components.rb +8 -2
- data/lib/smartystreets_ruby_sdk/native_sender.rb +13 -5
- data/lib/smartystreets_ruby_sdk/request.rb +2 -2
- data/lib/smartystreets_ruby_sdk/response.rb +3 -2
- data/lib/smartystreets_ruby_sdk/retry_sender.rb +18 -7
- data/lib/smartystreets_ruby_sdk/status_code_sender.rb +18 -0
- data/lib/smartystreets_ruby_sdk/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f3b53c497e2b878f2e38640936f0506d2e5261a667ce32d01858c09f630a9d9f
|
4
|
+
data.tar.gz: 1b14bbb12896b4c35477039085b3fb4979956a019dcbf88d1fd51a130be625c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
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:
|
23
|
+
- name: Publish
|
51
24
|
run: |
|
52
|
-
|
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
|
-
|
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/$
|
18
|
-
|
19
|
-
|
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
|
-
|
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
|
-
|
20
|
-
|
21
|
-
|
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 =
|
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
|
-
@
|
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(
|
102
|
-
@
|
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, @
|
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,
|
3
|
+
def initialize(inner, header)
|
4
4
|
@inner = inner
|
5
|
-
@
|
5
|
+
@header = header
|
6
6
|
end
|
7
7
|
|
8
8
|
def send(request)
|
9
|
-
request.
|
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 = '
|
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, :
|
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, :
|
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
|
-
|
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.
|
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
|
-
|
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(
|
74
|
-
|
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, :
|
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
|
-
@
|
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
|
-
|
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'
|
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.
|
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-
|
11
|
+
date: 2022-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|