smartystreets_ruby_sdk 0.0.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +0 -1
- data/{LICENSE.md → LICENSE.txt} +1 -1
- data/Makefile +17 -31
- data/README.md +6 -9
- data/Rakefile +2 -5
- data/examples/us_street_multiple_address_example.rb +15 -40
- data/examples/us_street_single_address_example.rb +8 -32
- data/examples/us_zipcode_multiple_lookup_example.rb +9 -21
- data/examples/us_zipcode_single_lookup_example.rb +6 -18
- data/lib/smartystreets_ruby_sdk/batch.rb +38 -45
- data/lib/smartystreets_ruby_sdk/core_client_builder.rb +56 -0
- data/lib/smartystreets_ruby_sdk/custom_header_sender.rb +8 -10
- data/lib/smartystreets_ruby_sdk/errors.rb +11 -21
- data/lib/smartystreets_ruby_sdk/exceptions.rb +16 -27
- data/lib/smartystreets_ruby_sdk/json_able.rb +11 -13
- data/lib/smartystreets_ruby_sdk/match_type.rb +5 -0
- data/lib/smartystreets_ruby_sdk/native_sender.rb +43 -65
- data/lib/smartystreets_ruby_sdk/native_serializer.rb +7 -9
- data/lib/smartystreets_ruby_sdk/request.rb +8 -11
- data/lib/smartystreets_ruby_sdk/response.rb +7 -9
- data/lib/smartystreets_ruby_sdk/retry_sender.rb +26 -32
- data/lib/smartystreets_ruby_sdk/shared_credentials.rb +9 -11
- data/lib/smartystreets_ruby_sdk/signing_sender.rb +9 -11
- data/lib/smartystreets_ruby_sdk/sleeper.rb +3 -5
- data/lib/smartystreets_ruby_sdk/static_credentials.rb +9 -11
- data/lib/smartystreets_ruby_sdk/status_code_sender.rb +29 -33
- data/lib/smartystreets_ruby_sdk/url_prefix_sender.rb +9 -11
- data/lib/smartystreets_ruby_sdk/us_street/analysis.rb +16 -21
- data/lib/smartystreets_ruby_sdk/us_street/candidate.rb +19 -23
- data/lib/smartystreets_ruby_sdk/us_street/client.rb +47 -60
- data/lib/smartystreets_ruby_sdk/us_street/client_builder.rb +15 -0
- data/lib/smartystreets_ruby_sdk/us_street/components.rb +27 -32
- data/lib/smartystreets_ruby_sdk/us_street/lookup.rb +20 -27
- data/lib/smartystreets_ruby_sdk/us_street/metadata.rb +23 -27
- data/lib/smartystreets_ruby_sdk/us_street.rb +3 -5
- data/lib/smartystreets_ruby_sdk/us_zipcode/city.rb +8 -14
- data/lib/smartystreets_ruby_sdk/us_zipcode/client.rb +36 -51
- data/lib/smartystreets_ruby_sdk/us_zipcode/client_builder.rb +15 -0
- data/lib/smartystreets_ruby_sdk/us_zipcode/lookup.rb +9 -16
- data/lib/smartystreets_ruby_sdk/us_zipcode/result.rb +30 -34
- data/lib/smartystreets_ruby_sdk/us_zipcode/zip_code.rb +14 -32
- data/lib/smartystreets_ruby_sdk/us_zipcode.rb +3 -5
- data/lib/smartystreets_ruby_sdk/version.rb +2 -2
- data/lib/smartystreets_ruby_sdk.rb +1 -30
- data/smartystreets_ruby_sdk.gemspec +12 -3
- metadata +15 -61
- data/.github/workflows/gem-publish.yml +0 -58
- data/CHANGELOG.md +0 -5
- data/Dockerfile +0 -10
- data/docker-compose.yml +0 -12
- data/examples/international_autocomplete_example.rb +0 -47
- data/examples/international_example.rb +0 -53
- data/examples/us_autocomplete_pro_example.rb +0 -56
- data/examples/us_extract_example.rb +0 -63
- data/examples/us_reverse_geo_example.rb +0 -47
- data/lib/smartystreets_ruby_sdk/client_builder.rb +0 -188
- data/lib/smartystreets_ruby_sdk/international_autocomplete/client.rb +0 -61
- data/lib/smartystreets_ruby_sdk/international_autocomplete/lookup.rb +0 -21
- data/lib/smartystreets_ruby_sdk/international_autocomplete/suggestion.rb +0 -16
- data/lib/smartystreets_ruby_sdk/international_street/analysis.rb +0 -17
- data/lib/smartystreets_ruby_sdk/international_street/candidate.rb +0 -23
- data/lib/smartystreets_ruby_sdk/international_street/changes.rb +0 -15
- data/lib/smartystreets_ruby_sdk/international_street/client.rb +0 -63
- data/lib/smartystreets_ruby_sdk/international_street/components.rb +0 -58
- data/lib/smartystreets_ruby_sdk/international_street/language_mode.rb +0 -9
- data/lib/smartystreets_ruby_sdk/international_street/lookup.rb +0 -82
- data/lib/smartystreets_ruby_sdk/international_street/metadata.rb +0 -17
- data/lib/smartystreets_ruby_sdk/international_street/rootlevel.rb +0 -25
- data/lib/smartystreets_ruby_sdk/international_street.rb +0 -12
- data/lib/smartystreets_ruby_sdk/license_sender.rb +0 -15
- data/lib/smartystreets_ruby_sdk/logger.rb +0 -7
- data/lib/smartystreets_ruby_sdk/proxy.rb +0 -16
- data/lib/smartystreets_ruby_sdk/us_autocomplete/client.rb +0 -72
- data/lib/smartystreets_ruby_sdk/us_autocomplete/geolocation_type.rb +0 -9
- data/lib/smartystreets_ruby_sdk/us_autocomplete/lookup.rb +0 -38
- data/lib/smartystreets_ruby_sdk/us_autocomplete/suggestion.rb +0 -16
- data/lib/smartystreets_ruby_sdk/us_autocomplete.rb +0 -9
- data/lib/smartystreets_ruby_sdk/us_autocomplete_pro/client.rb +0 -78
- data/lib/smartystreets_ruby_sdk/us_autocomplete_pro/geolocation_type.rb +0 -8
- data/lib/smartystreets_ruby_sdk/us_autocomplete_pro/lookup.rb +0 -63
- data/lib/smartystreets_ruby_sdk/us_autocomplete_pro/suggestion.rb +0 -18
- data/lib/smartystreets_ruby_sdk/us_autocomplete_pro.rb +0 -10
- data/lib/smartystreets_ruby_sdk/us_extract/address.rb +0 -24
- data/lib/smartystreets_ruby_sdk/us_extract/client.rb +0 -49
- data/lib/smartystreets_ruby_sdk/us_extract/lookup.rb +0 -22
- data/lib/smartystreets_ruby_sdk/us_extract/metadata.rb +0 -17
- data/lib/smartystreets_ruby_sdk/us_extract/result.rb +0 -21
- data/lib/smartystreets_ruby_sdk/us_extract.rb +0 -10
- data/lib/smartystreets_ruby_sdk/us_reverse_geo/address.rb +0 -16
- data/lib/smartystreets_ruby_sdk/us_reverse_geo/client.rb +0 -38
- data/lib/smartystreets_ruby_sdk/us_reverse_geo/coordinate.rb +0 -25
- data/lib/smartystreets_ruby_sdk/us_reverse_geo/lookup.rb +0 -21
- data/lib/smartystreets_ruby_sdk/us_reverse_geo/result.rb +0 -20
- data/lib/smartystreets_ruby_sdk/us_reverse_geo/us_reverse_geo_response.rb +0 -17
- data/lib/smartystreets_ruby_sdk/us_reverse_geo.rb +0 -12
- data/lib/smartystreets_ruby_sdk/us_street/match_type.rb +0 -10
- data/lib/smartystreets_ruby_sdk/us_zipcode/alternate_county.rb +0 -15
- data/ruby-sdk-demo.json +0 -354
@@ -1,188 +0,0 @@
|
|
1
|
-
require_relative 'native_serializer'
|
2
|
-
require_relative 'native_sender'
|
3
|
-
require_relative 'status_code_sender'
|
4
|
-
require_relative 'signing_sender'
|
5
|
-
require_relative 'retry_sender'
|
6
|
-
require_relative 'url_prefix_sender'
|
7
|
-
require_relative 'license_sender'
|
8
|
-
require_relative 'sleeper'
|
9
|
-
require_relative 'logger'
|
10
|
-
require_relative 'proxy'
|
11
|
-
require_relative 'custom_header_sender'
|
12
|
-
require_relative 'us_street/client'
|
13
|
-
require_relative 'us_zipcode/client'
|
14
|
-
require_relative 'us_extract/client'
|
15
|
-
require_relative 'us_autocomplete/client'
|
16
|
-
require_relative 'international_street/client'
|
17
|
-
require_relative 'us_reverse_geo/client'
|
18
|
-
require_relative 'us_autocomplete_pro/client'
|
19
|
-
|
20
|
-
module SmartyStreets
|
21
|
-
# The ClientBuilder class helps you build a client object for one of the supported SmartyStreets APIs.
|
22
|
-
# You can use ClientBuilder's methods to customize settings like maximum retries or timeout duration.
|
23
|
-
# These methods are chainable, so you can usually get set up with one line of code.
|
24
|
-
class ClientBuilder
|
25
|
-
INTERNATIONAL_STREET_API_URL = 'https://international-street.api.smartystreets.com/verify'.freeze
|
26
|
-
INTERNATIONAL_AUTOCOMPLETE_API_URL = "https://international-autocomplete.api.smartystreets.com/lookup".freeze
|
27
|
-
US_AUTOCOMPLETE_API_URL = 'https://us-autocomplete.api.smartystreets.com/suggest'.freeze
|
28
|
-
US_AUTOCOMPLETE_PRO_API_URL = 'https://us-autocomplete-pro.api.smartystreets.com/lookup'.freeze
|
29
|
-
US_EXTRACT_API_URL = 'https://us-extract.api.smartystreets.com/'.freeze
|
30
|
-
US_STREET_API_URL = 'https://us-street.api.smartystreets.com/street-address'.freeze
|
31
|
-
US_ZIP_CODE_API_URL = 'https://us-zipcode.api.smartystreets.com/lookup'.freeze
|
32
|
-
US_REVERSE_GEO_API_URL = 'https://us-reverse-geo.api.smartystreets.com/lookup'.freeze
|
33
|
-
|
34
|
-
def initialize(signer)
|
35
|
-
@signer = signer
|
36
|
-
@serializer = NativeSerializer.new
|
37
|
-
@http_sender = nil
|
38
|
-
@max_retries = 5
|
39
|
-
@max_timeout = 10
|
40
|
-
@url_prefix = nil
|
41
|
-
@proxy = nil
|
42
|
-
@headers = nil
|
43
|
-
@licenses = %w()
|
44
|
-
@debug = nil
|
45
|
-
end
|
46
|
-
|
47
|
-
# Sets the maximum number of times to retry sending the request to the API. (Default is 5)
|
48
|
-
#
|
49
|
-
# Returns self to accommodate method chaining.
|
50
|
-
def retry_at_most(max_retries)
|
51
|
-
@max_retries = max_retries
|
52
|
-
self
|
53
|
-
end
|
54
|
-
|
55
|
-
# The maximum time (in seconds) to wait for the response to be read. (Default is 10)
|
56
|
-
#
|
57
|
-
# Returns self to accommodate method chaining.
|
58
|
-
def with_max_timeout(max_timeout)
|
59
|
-
@max_timeout = max_timeout
|
60
|
-
self
|
61
|
-
end
|
62
|
-
|
63
|
-
# Default is a series of nested senders. (See build_sender()
|
64
|
-
#
|
65
|
-
# Returns self to accommodate method chaining.
|
66
|
-
def with_sender(sender)
|
67
|
-
@http_sender = sender
|
68
|
-
self
|
69
|
-
end
|
70
|
-
|
71
|
-
# Changes the Serializer from the default.
|
72
|
-
#
|
73
|
-
# Returns self to accommodate method chaining.
|
74
|
-
def with_serializer(serializer)
|
75
|
-
@serializer = serializer
|
76
|
-
self
|
77
|
-
end
|
78
|
-
|
79
|
-
# This may be useful when using a local installation of the SmartyStreets APIs.
|
80
|
-
# base_url is a string that defaults to the URL for the API corresponding to the Client object being built.
|
81
|
-
#
|
82
|
-
# Returns self to accommodate method chaining.
|
83
|
-
def with_base_url(base_url)
|
84
|
-
@url_prefix = base_url
|
85
|
-
self
|
86
|
-
end
|
87
|
-
|
88
|
-
# Assigns a proxy through which all requests will be sent.
|
89
|
-
# proxy is a Proxy object from this module.
|
90
|
-
#
|
91
|
-
# Returns self to accommodate method chaining.
|
92
|
-
def with_proxy(host, port, username, password)
|
93
|
-
@proxy = SmartyStreets::Proxy.new(host, port, username, password)
|
94
|
-
self
|
95
|
-
end
|
96
|
-
|
97
|
-
# Allows you to submit custom headers using a Hash.
|
98
|
-
# headers is a Hash object.
|
99
|
-
#
|
100
|
-
# Returns self to accommodate method chaining.
|
101
|
-
def with_custom_headers(headers)
|
102
|
-
@headers = headers
|
103
|
-
self
|
104
|
-
end
|
105
|
-
|
106
|
-
# Allows the caller to specify the subscription license (aka "track") they wish to use.
|
107
|
-
#
|
108
|
-
# Returns self to accommodate method chaining.
|
109
|
-
def with_licenses(licenses)
|
110
|
-
@licenses.concat licenses
|
111
|
-
self
|
112
|
-
end
|
113
|
-
|
114
|
-
# Enables debug mode, which will print information about the HTTP request and response to $stdout.
|
115
|
-
#
|
116
|
-
# Returns self to accommodate method chaining.
|
117
|
-
def with_debug
|
118
|
-
@debug = true
|
119
|
-
self
|
120
|
-
end
|
121
|
-
|
122
|
-
# <editor-fold desc="Build methods">
|
123
|
-
|
124
|
-
def build_international_street_api_client
|
125
|
-
ensure_url_prefix_not_null(INTERNATIONAL_STREET_API_URL)
|
126
|
-
InternationalStreet::Client.new(build_sender, @serializer)
|
127
|
-
end
|
128
|
-
|
129
|
-
def build_international_autocomplete_api_client
|
130
|
-
ensure_url_prefix_not_null(INTERNATIONAL_AUTOCOMPLETE_API_URL)
|
131
|
-
InternationalAutocomplete::Client.new(build_sender, @serializer)
|
132
|
-
end
|
133
|
-
|
134
|
-
def build_us_autocomplete_api_client # Deprecated
|
135
|
-
ensure_url_prefix_not_null(US_AUTOCOMPLETE_API_URL)
|
136
|
-
USAutocomplete::Client.new(build_sender, @serializer)
|
137
|
-
end
|
138
|
-
|
139
|
-
def build_us_autocomplete_pro_api_client
|
140
|
-
ensure_url_prefix_not_null(US_AUTOCOMPLETE_PRO_API_URL)
|
141
|
-
USAutocompletePro::Client.new(build_sender, @serializer)
|
142
|
-
end
|
143
|
-
|
144
|
-
def build_us_extract_api_client
|
145
|
-
ensure_url_prefix_not_null(US_EXTRACT_API_URL)
|
146
|
-
USExtract::Client.new(build_sender, @serializer)
|
147
|
-
end
|
148
|
-
|
149
|
-
def build_us_street_api_client
|
150
|
-
ensure_url_prefix_not_null(US_STREET_API_URL)
|
151
|
-
USStreet::Client.new(build_sender, @serializer)
|
152
|
-
end
|
153
|
-
|
154
|
-
def build_us_zipcode_api_client
|
155
|
-
ensure_url_prefix_not_null(US_ZIP_CODE_API_URL)
|
156
|
-
USZipcode::Client.new(build_sender, @serializer)
|
157
|
-
end
|
158
|
-
|
159
|
-
def build_us_reverse_geo_api_client
|
160
|
-
ensure_url_prefix_not_null(US_REVERSE_GEO_API_URL)
|
161
|
-
USReverseGeo::Client.new(build_sender, @serializer)
|
162
|
-
end
|
163
|
-
|
164
|
-
# </editor-fold>
|
165
|
-
|
166
|
-
def build_sender
|
167
|
-
return @http_sender unless @http_sender.nil?
|
168
|
-
|
169
|
-
sender = NativeSender.new(@max_timeout, @proxy, @debug)
|
170
|
-
|
171
|
-
sender = StatusCodeSender.new(sender)
|
172
|
-
|
173
|
-
sender = CustomHeaderSender.new(sender, @headers) unless @headers.nil?
|
174
|
-
|
175
|
-
sender = SigningSender.new(@signer, sender) unless @signer.nil?
|
176
|
-
|
177
|
-
sender = RetrySender.new(@max_retries, sender, SmartyStreets::Sleeper.new,SmartyStreets::Logger.new) if @max_retries > 0
|
178
|
-
|
179
|
-
sender = LicenseSender.new(sender, @licenses)
|
180
|
-
|
181
|
-
URLPrefixSender.new(@url_prefix, sender)
|
182
|
-
end
|
183
|
-
|
184
|
-
def ensure_url_prefix_not_null(url)
|
185
|
-
@url_prefix = url if @url_prefix.nil?
|
186
|
-
end
|
187
|
-
end
|
188
|
-
end
|
@@ -1,61 +0,0 @@
|
|
1
|
-
require_relative '../request'
|
2
|
-
require_relative '../exceptions'
|
3
|
-
require_relative 'suggestion'
|
4
|
-
|
5
|
-
module SmartyStreets
|
6
|
-
module InternationalAutocomplete
|
7
|
-
# It is recommended to instantiate this class using ClientBuilder.build_international_autocomplete_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 International Autocomplete API and stores the result in the Lookup's result field.
|
15
|
-
def send(lookup)
|
16
|
-
if not lookup or not lookup.search
|
17
|
-
raise SmartyStreets::SmartyError, 'Send() must be passed a Lookup with the prefix field set.'
|
18
|
-
end
|
19
|
-
|
20
|
-
request = build_request(lookup)
|
21
|
-
|
22
|
-
response = @sender.send(request)
|
23
|
-
|
24
|
-
raise response.error if response.error
|
25
|
-
|
26
|
-
result = @serializer.deserialize(response.payload)
|
27
|
-
suggestions = convert_suggestions(result.fetch('candidates', []))
|
28
|
-
lookup.result = suggestions
|
29
|
-
end
|
30
|
-
|
31
|
-
|
32
|
-
def build_request(lookup)
|
33
|
-
request = Request.new
|
34
|
-
|
35
|
-
add_parameter(request, 'search', lookup.search)
|
36
|
-
add_parameter(request, 'country', lookup.country)
|
37
|
-
add_parameter(request, 'include_only_administrative_area', lookup.administrative_area)
|
38
|
-
add_parameter(request, 'include_only_locality', lookup.locality)
|
39
|
-
add_parameter(request, 'include_only_postal_code', lookup.postal_code)
|
40
|
-
|
41
|
-
request
|
42
|
-
end
|
43
|
-
|
44
|
-
def convert_suggestions(suggestion_hashes)
|
45
|
-
converted_suggestions = []
|
46
|
-
return converted_suggestions if suggestion_hashes.nil?
|
47
|
-
|
48
|
-
suggestion_hashes.each do |suggestion|
|
49
|
-
converted_suggestions.push(InternationalAutocomplete::Suggestion.new(suggestion))
|
50
|
-
end
|
51
|
-
|
52
|
-
converted_suggestions
|
53
|
-
end
|
54
|
-
|
55
|
-
def add_parameter(request, key, value)
|
56
|
-
request.parameters[key] = value unless value.nil? or value.empty?
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
@@ -1,21 +0,0 @@
|
|
1
|
-
require_relative '../json_able'
|
2
|
-
|
3
|
-
module SmartyStreets
|
4
|
-
module InternationalAutocomplete
|
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
|
-
class Lookup < JSONAble
|
8
|
-
|
9
|
-
attr_accessor :result, :search, :country, :administrative_area, :locality, :postal_code
|
10
|
-
|
11
|
-
def initialize(search=nil, country=nil, administrative_area=nil, locality=nil, postal_code=nil)
|
12
|
-
@result = []
|
13
|
-
@search = search
|
14
|
-
@country = country
|
15
|
-
@administrative_area = administrative_area
|
16
|
-
@locality = locality
|
17
|
-
@postal_code = postal_code
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module SmartyStreets
|
2
|
-
module InternationalAutocomplete
|
3
|
-
class Suggestion
|
4
|
-
|
5
|
-
attr_reader :street, :locality, :administrative_area, :postal_code, :country_iso3
|
6
|
-
|
7
|
-
def initialize(obj)
|
8
|
-
@street = obj.fetch('street', nil)
|
9
|
-
@locality = obj.fetch('locality', nil)
|
10
|
-
@administrative_area = obj.fetch('administrative_area', nil)
|
11
|
-
@postal_code = obj.fetch('postal_code', nil)
|
12
|
-
@country_iso3 = obj.fetch('country_iso3', nil)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require_relative 'changes'
|
2
|
-
module SmartyStreets
|
3
|
-
module InternationalStreet
|
4
|
-
# See "https://smartystreets.com/docs/cloud/international-street-api#analysis"
|
5
|
-
class Analysis
|
6
|
-
|
7
|
-
attr_reader :max_address_precision, :verification_status, :address_precision, :changes
|
8
|
-
|
9
|
-
def initialize(obj)
|
10
|
-
@verification_status = obj.fetch('verification_status', nil)
|
11
|
-
@address_precision = obj.fetch('address_precision', nil)
|
12
|
-
@max_address_precision = obj.fetch('max_address_precision', nil)
|
13
|
-
@changes = Changes.new(obj.fetch('changes', {}))
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
require_relative 'components'
|
2
|
-
require_relative 'metadata'
|
3
|
-
require_relative 'analysis'
|
4
|
-
require_relative 'rootlevel'
|
5
|
-
|
6
|
-
module SmartyStreets
|
7
|
-
module InternationalStreet
|
8
|
-
# A candidate is a possible match for an address that was submitted. A lookup can have multiple
|
9
|
-
# candidates if the address was ambiguous.
|
10
|
-
#
|
11
|
-
# See "https://smartystreets.com/docs/cloud/international-street-api#root"
|
12
|
-
class Candidate < RootLevel
|
13
|
-
attr_reader :metadata, :components, :analysis
|
14
|
-
|
15
|
-
def initialize(obj)
|
16
|
-
@components = Components.new(obj.fetch('components', {}))
|
17
|
-
@metadata = Metadata.new(obj.fetch('metadata', {}))
|
18
|
-
@analysis = Analysis.new(obj.fetch('analysis', {}))
|
19
|
-
super(obj)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require_relative 'rootlevel'
|
2
|
-
require_relative 'components'
|
3
|
-
|
4
|
-
module SmartyStreets
|
5
|
-
module InternationalStreet
|
6
|
-
class Changes < RootLevel
|
7
|
-
attr_reader :components
|
8
|
-
|
9
|
-
def initialize(obj)
|
10
|
-
@components = Components.new(obj.fetch('components', {}))
|
11
|
-
super(obj)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
require_relative '../request'
|
2
|
-
require_relative 'candidate'
|
3
|
-
|
4
|
-
module SmartyStreets
|
5
|
-
module InternationalStreet
|
6
|
-
# It is recommended to instantiate this class using ClientBuilder.build_international_street_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 International Street API and stores the result in the Lookup's result field.
|
14
|
-
def send(lookup)
|
15
|
-
lookup.ensure_enough_info
|
16
|
-
request = build_request(lookup)
|
17
|
-
|
18
|
-
response = @sender.send(request)
|
19
|
-
|
20
|
-
raise response.error if response.error
|
21
|
-
|
22
|
-
candidates = convert_candidates(@serializer.deserialize(response.payload))
|
23
|
-
lookup.result = candidates
|
24
|
-
end
|
25
|
-
|
26
|
-
def build_request(lookup)
|
27
|
-
request = SmartyStreets::Request.new
|
28
|
-
|
29
|
-
add_parameter(request, 'input_id', lookup.input_id)
|
30
|
-
add_parameter(request, 'country', lookup.country)
|
31
|
-
add_parameter(request, 'geocode', lookup.geocode.to_s)
|
32
|
-
add_parameter(request, 'language', lookup.language)
|
33
|
-
add_parameter(request, 'freeform', lookup.freeform)
|
34
|
-
add_parameter(request, 'address1', lookup.address1)
|
35
|
-
add_parameter(request, 'address2', lookup.address2)
|
36
|
-
add_parameter(request, 'address3', lookup.address3)
|
37
|
-
add_parameter(request, 'address4', lookup.address4)
|
38
|
-
add_parameter(request, 'organization', lookup.organization)
|
39
|
-
add_parameter(request, 'locality', lookup.locality)
|
40
|
-
add_parameter(request, 'administrative_area', lookup.administrative_area)
|
41
|
-
add_parameter(request, 'postal_code', lookup.postal_code)
|
42
|
-
|
43
|
-
request
|
44
|
-
end
|
45
|
-
|
46
|
-
def add_parameter(request, key, value)
|
47
|
-
request.parameters[key] = value unless value.nil? or value.empty?
|
48
|
-
end
|
49
|
-
|
50
|
-
def convert_candidates(raw_candidates)
|
51
|
-
candidates = []
|
52
|
-
|
53
|
-
unless raw_candidates.nil?
|
54
|
-
raw_candidates.each do |candidate|
|
55
|
-
candidates.push(Candidate.new(candidate))
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
candidates
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
@@ -1,58 +0,0 @@
|
|
1
|
-
module SmartyStreets
|
2
|
-
module InternationalStreet
|
3
|
-
# See "https://smartystreets.com/docs/cloud/international-street-api#components"
|
4
|
-
class Components
|
5
|
-
attr_reader :premise, :thoroughfare_trailing_type, :sub_building, :locality, :post_box_number,
|
6
|
-
:thoroughfare_name, :thoroughfare_postdirection, :dependent_thoroughfare, :premise_prefix_number,
|
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,
|
9
|
-
:dependent_thoroughfare_postdirection, :double_dependent_locality, :premise_number,
|
10
|
-
:dependent_thoroughfare_type, :post_box_type, :building, :sub_administrative_area, :postal_code_extra,
|
11
|
-
:sub_building_name, :postal_code, :dependent_locality, :premise_type, :sub_building_number,
|
12
|
-
:super_administrative_area, :premise_extra, :dependent_thoroughfare_predirection,
|
13
|
-
:building_trailing_type, :thoroughfare_predirection, :building_name, :country_iso_3, :sub_building_type
|
14
|
-
|
15
|
-
def initialize(obj)
|
16
|
-
@country_iso_3 = obj.fetch('country_iso_3', nil)
|
17
|
-
@super_administrative_area = obj.fetch('super_administrative_area', nil)
|
18
|
-
@administrative_area = obj.fetch('administrative_area', nil)
|
19
|
-
@sub_administrative_area = obj.fetch('sub_administrative_area', nil)
|
20
|
-
@dependent_locality= obj.fetch('dependent_locality', nil)
|
21
|
-
@dependent_locality_name = obj.fetch('dependent_locality_name', nil)
|
22
|
-
@double_dependent_locality = obj.fetch('double_dependent_locality', nil)
|
23
|
-
@locality = obj.fetch('locality', nil)
|
24
|
-
@postal_code = obj.fetch('postal_code', nil)
|
25
|
-
@postal_code_short = obj.fetch('postal_code_short', nil)
|
26
|
-
@postal_code_extra = obj.fetch('postal_code_extra', nil)
|
27
|
-
@premise = obj.fetch('premise', nil)
|
28
|
-
@premise_extra = obj.fetch('premise_extra', nil)
|
29
|
-
@premise_number = obj.fetch('premise_number', nil)
|
30
|
-
@premise_prefix_number = obj.fetch('premise_prefix_number', nil)
|
31
|
-
@premise_type = obj.fetch('premise_type', nil)
|
32
|
-
@thoroughfare = obj.fetch('thoroughfare', nil)
|
33
|
-
@thoroughfare_predirection = obj.fetch('thoroughfare_predirection', nil)
|
34
|
-
@thoroughfare_postdirection = obj.fetch('thoroughfare_postdirection', nil)
|
35
|
-
@thoroughfare_name = obj.fetch('thoroughfare_name', nil)
|
36
|
-
@thoroughfare_trailing_type = obj.fetch('thoroughfare_trailing_type', nil)
|
37
|
-
@thoroughfare_type = obj.fetch('thoroughfare_type', nil)
|
38
|
-
@dependent_thoroughfare = obj.fetch('dependent_thoroughfare', nil)
|
39
|
-
@dependent_thoroughfare_predirection = obj.fetch('dependent_thoroughfare_predirection', nil)
|
40
|
-
@dependent_thoroughfare_postdirection = obj.fetch('dependent_thoroughfare_postdirection', nil)
|
41
|
-
@dependent_thoroughfare_name = obj.fetch('dependent_thoroughfare_name', nil)
|
42
|
-
@dependent_thoroughfare_trailing_type = obj.fetch('dependent_thoroughfare_trailing_type', nil)
|
43
|
-
@dependent_thoroughfare_type = obj.fetch('dependent_thoroughfare_type', nil)
|
44
|
-
@building = obj.fetch('building', nil)
|
45
|
-
@building_leading_type = obj.fetch('building_leading_type', nil)
|
46
|
-
@building_name = obj.fetch('building_name', nil)
|
47
|
-
@building_trailing_type = obj.fetch('building_trailing_type', nil)
|
48
|
-
@sub_building_type = obj.fetch('sub_building_type', nil)
|
49
|
-
@sub_building_number = obj.fetch('sub_building_number', nil)
|
50
|
-
@sub_building_name = obj.fetch('sub_building_name', nil)
|
51
|
-
@sub_building = obj.fetch('sub_building', nil)
|
52
|
-
@post_box = obj.fetch('post_box', nil)
|
53
|
-
@post_box_type = obj.fetch('post_box_type', nil)
|
54
|
-
@post_box_number = obj.fetch('post_box_number', nil)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
@@ -1,82 +0,0 @@
|
|
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
|
16
|
-
|
17
|
-
attr_accessor :input_id, :freeform, :locality, :postal_code, :address3, :address2, :inputId, :address1,
|
18
|
-
:geocode, :administrative_area, :country, :organization, :language, :address4, :result
|
19
|
-
|
20
|
-
def initialize(freeform=nil, country=nil)
|
21
|
-
@result = []
|
22
|
-
|
23
|
-
@input_id = 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
|
37
|
-
|
38
|
-
def missing_country
|
39
|
-
field_is_missing(@country)
|
40
|
-
end
|
41
|
-
|
42
|
-
def has_freeform
|
43
|
-
field_is_set(@freeform)
|
44
|
-
end
|
45
|
-
|
46
|
-
def missing_address1
|
47
|
-
field_is_missing(@address1)
|
48
|
-
end
|
49
|
-
|
50
|
-
def has_postal_code
|
51
|
-
field_is_set(@postal_code)
|
52
|
-
end
|
53
|
-
|
54
|
-
def missing_locality_or_administrative_area
|
55
|
-
field_is_missing(@locality) or field_is_missing(@administrative_area)
|
56
|
-
end
|
57
|
-
|
58
|
-
def field_is_missing(field)
|
59
|
-
field.nil? or field.empty?
|
60
|
-
end
|
61
|
-
|
62
|
-
def field_is_set(field)
|
63
|
-
not field_is_missing(field)
|
64
|
-
end
|
65
|
-
|
66
|
-
def ensure_enough_info
|
67
|
-
raise UnprocessableEntityError, 'Country field is required.' if missing_country
|
68
|
-
|
69
|
-
return true if has_freeform
|
70
|
-
|
71
|
-
raise UnprocessableEntityError, 'Either freeform or address1 is required.' if missing_address1
|
72
|
-
|
73
|
-
return true if has_postal_code
|
74
|
-
|
75
|
-
if missing_locality_or_administrative_area
|
76
|
-
raise UnprocessableEntityError, 'Insufficient information:'\
|
77
|
-
'One or more required fields were not set on the lookup.'
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module SmartyStreets
|
2
|
-
module InternationalStreet
|
3
|
-
# See "https://smartystreets.com/docs/cloud/international-street-api#metadata"
|
4
|
-
class Metadata
|
5
|
-
|
6
|
-
attr_reader :longitude, :geocode_precision, :max_geocode_precision, :latitude, :address_format
|
7
|
-
|
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
|
-
@address_format = obj.fetch('address_format', nil)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
module SmartyStreets
|
2
|
-
module InternationalStreet
|
3
|
-
class RootLevel
|
4
|
-
attr_reader :input_id, :organization, :address1, :address2, :address3, :address4, :address5, :address6, :address7,
|
5
|
-
:address8, :address9, :address10, :address11, :address12
|
6
|
-
|
7
|
-
def initialize(obj)
|
8
|
-
@input_id = obj.fetch('input_id', nil)
|
9
|
-
@organization = obj.fetch('organization', nil)
|
10
|
-
@address1 = obj.fetch('address1', nil)
|
11
|
-
@address2 = obj.fetch('address2', nil)
|
12
|
-
@address3 = obj.fetch('address3', nil)
|
13
|
-
@address4 = obj.fetch('address4', nil)
|
14
|
-
@address5 = obj.fetch('address5', nil)
|
15
|
-
@address6 = obj.fetch('address6', nil)
|
16
|
-
@address7 = obj.fetch('address7', nil)
|
17
|
-
@address8 = obj.fetch('address8', nil)
|
18
|
-
@address9 = obj.fetch('address9', nil)
|
19
|
-
@address10 = obj.fetch('address10', nil)
|
20
|
-
@address11 = obj.fetch('address11', nil)
|
21
|
-
@address12 = obj.fetch('address12', nil)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
require_relative './international_street/lookup'
|
2
|
-
require_relative './international_street/metadata'
|
3
|
-
require_relative './international_street/analysis'
|
4
|
-
require_relative './international_street/components'
|
5
|
-
require_relative './international_street/candidate'
|
6
|
-
require_relative './international_street/client'
|
7
|
-
require_relative './international_street/language_mode'
|
8
|
-
|
9
|
-
module SmartyStreets
|
10
|
-
module InternationalStreet
|
11
|
-
end
|
12
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
module SmartyStreets
|
2
|
-
class LicenseSender
|
3
|
-
def initialize(inner, licenses)
|
4
|
-
@inner = inner
|
5
|
-
@licenses = licenses
|
6
|
-
end
|
7
|
-
|
8
|
-
def send(request)
|
9
|
-
if @licenses.length > 0
|
10
|
-
request.parameters['license'] = @licenses.join(',')
|
11
|
-
end
|
12
|
-
@inner.send(request)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module SmartyStreets
|
2
|
-
# Contains information about the proxy through which all requests will be sent.
|
3
|
-
#
|
4
|
-
# host should not include a scheme
|
5
|
-
class Proxy
|
6
|
-
|
7
|
-
attr_accessor :port, :host, :username, :password
|
8
|
-
|
9
|
-
def initialize(host, port, username = nil, password = nil)
|
10
|
-
@host = host
|
11
|
-
@port = port
|
12
|
-
@username = username
|
13
|
-
@password = password
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|