loqate 0.4.0 → 0.5.0
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/.yardstick.yml +32 -0
- data/CHANGELOG.md +5 -0
- data/README.md +47 -0
- data/ROADMAP.md +1 -1
- data/lib/loqate/batch_email_validation.rb +66 -0
- data/lib/loqate/email_gateway.rb +122 -0
- data/lib/loqate/email_validation.rb +81 -0
- data/lib/loqate/gateway.rb +9 -0
- data/lib/loqate/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f33980e922897d782156083e90517425569e09426cc653d5812e8df8618b42fa
|
4
|
+
data.tar.gz: b8aaca5b1a67c7c0ed9fafa14956a348bdea44f0480ba5f0c8d9a9e3ffb81e67
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29926eba63928015dd96214ea4e7fe987b91521afa10415b74b866756d6da202fed82da9829417293fcd9910ecc875b1f2247eae019d3d9d3151576bb961e7a0
|
7
|
+
data.tar.gz: 02a4def39549a2c69583b1528e401e3712576e2b3c9a98535675961fdfe89e7bfd656720e0140e874c496fd5fdee0dc738a7deab4944286aafa38cfed896863f
|
data/.yardstick.yml
CHANGED
@@ -27,12 +27,31 @@ rules:
|
|
27
27
|
- Loqate::APIResult#errors?
|
28
28
|
- Loqate::APIResult#items
|
29
29
|
- Loqate::APIResult#initialize
|
30
|
+
- Loqate::BatchEmailValidation#status
|
31
|
+
- Loqate::BatchEmailValidation#email_address
|
32
|
+
- Loqate::BatchEmailValidation#account
|
33
|
+
- Loqate::BatchEmailValidation#domain
|
34
|
+
- Loqate::BatchEmailValidation#is_disposible
|
35
|
+
- Loqate::BatchEmailValidation#is_system_mailbox
|
30
36
|
- Loqate::Configuration#api_key
|
31
37
|
- Loqate::Configuration#host
|
32
38
|
- Loqate::Configuration#language
|
33
39
|
- Loqate::Configuration#initialize
|
34
40
|
- Loqate::DetailedAddress#initialize
|
35
41
|
- Loqate::DetailedAddress#==
|
42
|
+
- Loqate::EmailGateway#initialize
|
43
|
+
- Loqate::EmailValidation#response_code
|
44
|
+
- Loqate::EmailValidation#response_message
|
45
|
+
- Loqate::EmailValidation#email_address
|
46
|
+
- Loqate::EmailValidation#user_account
|
47
|
+
- Loqate::EmailValidation#domain
|
48
|
+
- Loqate::EmailValidation#is_disposable_or_temporary
|
49
|
+
- Loqate::EmailValidation#is_complainer_or_fraud_risk
|
50
|
+
- Loqate::EmailValidation#duration
|
51
|
+
- Loqate::EmailValidation#valid?
|
52
|
+
- Loqate::EmailValidation#valid_domain?
|
53
|
+
- Loqate::EmailValidation#invalid?
|
54
|
+
- Loqate::EmailValidation#timeout?
|
36
55
|
- Loqate::Error#id
|
37
56
|
- Loqate::Error#description
|
38
57
|
- Loqate::Error#cause
|
@@ -41,6 +60,7 @@ rules:
|
|
41
60
|
- Loqate::Gateway#config
|
42
61
|
- Loqate::Gateway#initialize
|
43
62
|
- Loqate::Gateway#address
|
63
|
+
- Loqate::Gateway#email
|
44
64
|
- Loqate::Gateway#phone
|
45
65
|
- Loqate::PhoneGateway#initialize
|
46
66
|
- Loqate::PhoneNumberValidation#phone_number
|
@@ -81,6 +101,12 @@ rules:
|
|
81
101
|
- Loqate::Client#format_params
|
82
102
|
- Loqate::Client#headers
|
83
103
|
- Loqate::DetailedAddress#==
|
104
|
+
- Loqate::EmailGateway#error_mapper
|
105
|
+
- Loqate::EmailGateway#client
|
106
|
+
- Loqate::EmailGateway#mapper
|
107
|
+
- Loqate::EmailGateway#build_error_from
|
108
|
+
- Loqate::EmailGateway#build_email_validation_from
|
109
|
+
- Loqate::EmailGateway#build_email_validations_from
|
84
110
|
- Loqate::Util.camelize
|
85
111
|
- Loqate::Util#camelize
|
86
112
|
- Loqate::Util.underscore
|
@@ -115,6 +141,12 @@ rules:
|
|
115
141
|
- Loqate::Client#headers
|
116
142
|
- Loqate::DetailedAddress#initialize
|
117
143
|
- Loqate::DetailedAddress#==
|
144
|
+
- Loqate::EmailGateway#error_mapper
|
145
|
+
- Loqate::EmailGateway#client
|
146
|
+
- Loqate::EmailGateway#mapper
|
147
|
+
- Loqate::EmailGateway#build_error_from
|
148
|
+
- Loqate::EmailGateway#build_email_validation_from
|
149
|
+
- Loqate::EmailGateway#build_email_validations_from
|
118
150
|
- Loqate::Error#attributes
|
119
151
|
- Loqate::Gateway#client
|
120
152
|
- Loqate::PhoneGateway#mapper
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
5
5
|
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
6
6
|
|
7
|
+
## [0.5.0] - 2018-11-20
|
8
|
+
### Added
|
9
|
+
- Email API
|
10
|
+
|
7
11
|
## [0.4.0] - 2018-11-14
|
8
12
|
### Changed
|
9
13
|
- Updated the gem `HTTP` to version `4.0.0`
|
@@ -45,6 +49,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
45
49
|
- Initial core functionality
|
46
50
|
- Codebase maintenance tools
|
47
51
|
|
52
|
+
[0.4.0]: https://github.com/wilsonsilva/loqate/compare/v0.4.0...v0.5.0
|
48
53
|
[0.4.0]: https://github.com/wilsonsilva/loqate/compare/v0.3.0...v0.4.0
|
49
54
|
[0.3.0]: https://github.com/wilsonsilva/loqate/compare/v0.2.0...v0.3.0
|
50
55
|
[0.2.0]: https://github.com/wilsonsilva/loqate/compare/v0.1.0...v0.2.0
|
data/README.md
CHANGED
@@ -21,6 +21,9 @@ Client to address verification, postcode lookup, & data quality services from Lo
|
|
21
21
|
- [Retrieving the details of an address](#retrieving-the-details-of-an-address)
|
22
22
|
- [Phone API](#phone-api)
|
23
23
|
- [Validating a phone number](#validating-a-phone-number)
|
24
|
+
- [Email API](#phone-api)
|
25
|
+
- [Validating an email address](#validating-an-email-address)
|
26
|
+
- [Validating multiple email addresses](#validating-multiple-email-addresses)
|
24
27
|
- [Development](#development)
|
25
28
|
- [Contributing](#contributing)
|
26
29
|
- [License](#license)
|
@@ -142,6 +145,50 @@ phone_validation.country_prefix # => 44
|
|
142
145
|
phone_validation.number_type # => 'Mobile'
|
143
146
|
```
|
144
147
|
|
148
|
+
### Email API
|
149
|
+
|
150
|
+
The Email API consists of two main API requests:
|
151
|
+
[Validate](https://www.loqate.com/resources/support/apis/EmailValidation/Interactive/Validate/2/) request to validate
|
152
|
+
a single email adress; and a
|
153
|
+
[Batch Validate](https://www.loqate.com/resources/support/apis/EmailValidation/Batch/Validate/1.2/) request to
|
154
|
+
validate multiple emails at once.
|
155
|
+
|
156
|
+
#### Validating an email address
|
157
|
+
```ruby
|
158
|
+
email_validation = gateway.email.validate!(email: 'person@gmail.com')
|
159
|
+
|
160
|
+
email_validation.response_code # => 'Valid'
|
161
|
+
email_validation.response_message # => 'Email address was fully validated'
|
162
|
+
email_validation.email_address # => 'person@gmail.com'
|
163
|
+
email_validation.user_account # => 'person'
|
164
|
+
email_validation.domain # => 'gmail.com'
|
165
|
+
email_validation.is_disposable_or_temporary # => false
|
166
|
+
email_validation.is_complainer_or_fraud_risk # => false
|
167
|
+
email_validation.duration # => 0.007366261
|
168
|
+
email_validation.valid? # => true
|
169
|
+
email_validation.valid_domain? # => true
|
170
|
+
email_validation.invalid? # => false
|
171
|
+
email_validation.timeout? # => false
|
172
|
+
```
|
173
|
+
|
174
|
+
#### Validating multiple email addresses
|
175
|
+
|
176
|
+
```ruby
|
177
|
+
email_validations = gateway.email.batch_validate!(emails: %w[person@gmail.com])
|
178
|
+
email_validation = email_validations.first
|
179
|
+
|
180
|
+
email_validation.status # => 'Valid'
|
181
|
+
email_validation.email_address # => 'person@gmail.com'
|
182
|
+
email_validation.account # => 'person'
|
183
|
+
email_validation.domain # => 'gmail.com'
|
184
|
+
email_validation.is_disposible # => false
|
185
|
+
email_validation.is_system_mailbox # => false
|
186
|
+
email_validation.valid? # => true
|
187
|
+
email_validation.invalid? # => false
|
188
|
+
email_validation.unknown? # => false
|
189
|
+
email_validation.unverified? # => false
|
190
|
+
```
|
191
|
+
|
145
192
|
## Development
|
146
193
|
|
147
194
|
After checking out the repo, run `bin/setup` to install dependencies, configure git hooks and create support files.
|
data/ROADMAP.md
CHANGED
@@ -0,0 +1,66 @@
|
|
1
|
+
module Loqate
|
2
|
+
# Result of a batch email address validation.
|
3
|
+
class BatchEmailValidation < Dry::Struct::Value
|
4
|
+
Status = Types::Strict::String.enum('Valid', 'Invalid', 'Unknown', 'Accept_All')
|
5
|
+
|
6
|
+
# Valid - The email address is valid
|
7
|
+
# Invalid - The email address is invalid and shouldn't be accepted
|
8
|
+
# Unknown - Unable to complete the verification process (normally due to SMTP timeout)
|
9
|
+
# Accept_All - The mail server is set to accept all verification requests so full verification isn't possible
|
10
|
+
#
|
11
|
+
# @return ['Valid', 'Invalid', 'Unknown', 'Accept_All']
|
12
|
+
#
|
13
|
+
attribute :status, Status
|
14
|
+
|
15
|
+
# The email address that verification was attempted on.
|
16
|
+
#
|
17
|
+
# @return [String]
|
18
|
+
#
|
19
|
+
attribute :email_address, Types::Strict::String
|
20
|
+
|
21
|
+
# The account portion of the email address provided.
|
22
|
+
#
|
23
|
+
# @return [String
|
24
|
+
#
|
25
|
+
attribute :account, Types::Strict::String
|
26
|
+
|
27
|
+
# The domain portion of the email address provided.
|
28
|
+
#
|
29
|
+
# @return [String]
|
30
|
+
#
|
31
|
+
attribute :domain, Types::Strict::String
|
32
|
+
|
33
|
+
# Whether the email address provided is a disposable mailbox (some companies create temporary mailboxes
|
34
|
+
# which shouldn't be used for marketing communications).
|
35
|
+
#
|
36
|
+
# @return [Boolean]
|
37
|
+
#
|
38
|
+
attribute :is_disposible, Types::Strict::Bool
|
39
|
+
|
40
|
+
# Whether the email address provided is a system mailbox (e.g. sales@, support@, accounts@ etc).
|
41
|
+
#
|
42
|
+
# @return [Boolean]
|
43
|
+
#
|
44
|
+
attribute :is_system_mailbox, Types::Strict::Bool
|
45
|
+
|
46
|
+
# Whether the email was fully validated (including the account portion).
|
47
|
+
def valid?
|
48
|
+
status == 'Valid'
|
49
|
+
end
|
50
|
+
|
51
|
+
# Whether the email is invalid and shouldn't be accepted.
|
52
|
+
def invalid?
|
53
|
+
status == 'Invalid'
|
54
|
+
end
|
55
|
+
|
56
|
+
# Whether the email wasn't verified (normally due to SMTP timeout)
|
57
|
+
def unknown?
|
58
|
+
status == 'Unknown'
|
59
|
+
end
|
60
|
+
|
61
|
+
# Whether the email could be verified
|
62
|
+
def unverified?
|
63
|
+
status == 'Accept_All'
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
require 'loqate/client'
|
2
|
+
require 'loqate/result'
|
3
|
+
require 'loqate/email_validation'
|
4
|
+
require 'loqate/batch_email_validation'
|
5
|
+
require 'loqate/mappers/error_mapper'
|
6
|
+
require 'loqate/mappers/generic_mapper'
|
7
|
+
|
8
|
+
module Loqate
|
9
|
+
# Validates the existence of email addresses.
|
10
|
+
#
|
11
|
+
class EmailGateway
|
12
|
+
BATCH_VALIDATE_ENDPOINT = '/EmailValidation/Batch/Validate/v1.20/json3.ws'.freeze
|
13
|
+
VALIDATE_ENDPOINT = '/EmailValidation/Interactive/Validate/v2.00/json3.ws'.freeze
|
14
|
+
|
15
|
+
include Result::Mixin
|
16
|
+
|
17
|
+
# Creates an email gateway.
|
18
|
+
#
|
19
|
+
# @param [Client] client The client responsible for the HTTP interactions
|
20
|
+
#
|
21
|
+
def initialize(client)
|
22
|
+
@client = client
|
23
|
+
@mapper = Mappers::GenericMapper.new
|
24
|
+
@error_mapper = Mappers::ErrorMapper.new
|
25
|
+
end
|
26
|
+
|
27
|
+
# Verifies the existence of an email address.
|
28
|
+
#
|
29
|
+
# @param [Hash] options The options to validate an email address.
|
30
|
+
# @option options [String] :email The email address to verify.
|
31
|
+
# @option options [Integer] :timeout The time (in milliseconds) you want to give for the validation attempt to be
|
32
|
+
# executed within. Value must be between 1 and 15000 (values outside of these ranges will fallback to the
|
33
|
+
# default of 15000).
|
34
|
+
#
|
35
|
+
# @example
|
36
|
+
# email_validation = email_gateway.validate(email: 'spam@example.com')
|
37
|
+
#
|
38
|
+
# @return [Result] A result wrapping an email address validation
|
39
|
+
#
|
40
|
+
def validate(options)
|
41
|
+
response = client.get(VALIDATE_ENDPOINT, options)
|
42
|
+
|
43
|
+
response.errors? && build_error_from(response.items.first) || build_email_validation_from(response.items.first)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Verifies the existence of an email address.
|
47
|
+
#
|
48
|
+
# @param [Hash] options The options to validate an email address.
|
49
|
+
# @option options [String] :email The email address to verify.
|
50
|
+
# @option options [Integer] :timeout The time (in milliseconds) you want to give for the validation attempt to be
|
51
|
+
# executed within. Value must be between 1 and 15000 (values outside of these ranges will fallback to the
|
52
|
+
# default of 15000).
|
53
|
+
#
|
54
|
+
# @example
|
55
|
+
# email_validation = email_gateway.validate!(email: 'spam@example.com')
|
56
|
+
#
|
57
|
+
# @raise [Error] If the result is not a success
|
58
|
+
#
|
59
|
+
# @return [EmailValidation> An email address validation
|
60
|
+
#
|
61
|
+
def validate!(options)
|
62
|
+
unwrap_result_or_raise { validate(options) }
|
63
|
+
end
|
64
|
+
|
65
|
+
# Verifies up to 100 emails per batch.
|
66
|
+
#
|
67
|
+
# @param [Hash] options The options to validate an email address.
|
68
|
+
# @option options [Array<String>] :emails The email addresses to verify. Maximum 100 records.
|
69
|
+
#
|
70
|
+
# @example
|
71
|
+
# result = email_gateway.batch_validate(emails: %w[spam@example.com example@example.com])
|
72
|
+
# result.value # => [#<Loqate::BatchEmailValidation status="Invalid" ...]
|
73
|
+
#
|
74
|
+
# @return [Result] A result wrapping a list of email address validations
|
75
|
+
#
|
76
|
+
def batch_validate(options)
|
77
|
+
options[:emails] = options[:emails].join(',') if options[:emails]
|
78
|
+
response = client.get(BATCH_VALIDATE_ENDPOINT, options)
|
79
|
+
|
80
|
+
response.errors? && build_error_from(response.items.first) || build_email_validations_from(response.items)
|
81
|
+
end
|
82
|
+
|
83
|
+
# Verifies up to 100 emails per batch.
|
84
|
+
#
|
85
|
+
# @param [Hash] options The options to validate an email address.
|
86
|
+
# @option options [Array<String>] :emails The email addresses to verify. Maximum 100 records.
|
87
|
+
#
|
88
|
+
# @example
|
89
|
+
# email_validations = email_gateway.batch_validate!(emails: %w[spam@example.com example@example.com])
|
90
|
+
#
|
91
|
+
# @raise [Error] If the result is not a success
|
92
|
+
#
|
93
|
+
# @return [Array<BatchEmailValidation>] A list of email address validations
|
94
|
+
#
|
95
|
+
def batch_validate!(options)
|
96
|
+
unwrap_result_or_raise { batch_validate(options) }
|
97
|
+
end
|
98
|
+
|
99
|
+
private
|
100
|
+
|
101
|
+
# @api private
|
102
|
+
attr_reader :client, :mapper, :error_mapper
|
103
|
+
|
104
|
+
# @api private
|
105
|
+
def build_error_from(item)
|
106
|
+
error = error_mapper.map_one(item)
|
107
|
+
Failure(error)
|
108
|
+
end
|
109
|
+
|
110
|
+
# @api private
|
111
|
+
def build_email_validation_from(item)
|
112
|
+
email_validation = mapper.map_one(item, EmailValidation)
|
113
|
+
Success(email_validation)
|
114
|
+
end
|
115
|
+
|
116
|
+
# @api private
|
117
|
+
def build_email_validations_from(item)
|
118
|
+
email_validation = mapper.map(item, BatchEmailValidation)
|
119
|
+
Success(email_validation)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module Loqate
|
2
|
+
# Result of a email address validation.
|
3
|
+
class EmailValidation < Dry::Struct::Value
|
4
|
+
ResponseCode = Types::Strict::String.enum('Valid', 'Valid_CatchAll', 'Invalid', 'Timeout')
|
5
|
+
|
6
|
+
# Valid - The email address has been fully validated (including the account portion)
|
7
|
+
# Valid_CatchAll - The domain has been validated but the account could not be validated
|
8
|
+
# Invalid - The email address is invalid and shouldn't be accepted
|
9
|
+
# Timeout - The validation could not be completed within the timeout specified (try increasing the timeout value)
|
10
|
+
#
|
11
|
+
# @return ['Valid', 'Valid_CatchAll', 'Invalid', 'Timeout']
|
12
|
+
#
|
13
|
+
attribute :response_code, ResponseCode
|
14
|
+
|
15
|
+
# A textual description of the ResponseCode returned
|
16
|
+
#
|
17
|
+
# @return [String]
|
18
|
+
#
|
19
|
+
attribute :response_message, Types::Strict::String
|
20
|
+
|
21
|
+
# The email address that verification was attempted on.
|
22
|
+
#
|
23
|
+
# @return [String]
|
24
|
+
#
|
25
|
+
attribute :email_address, Types::Strict::String
|
26
|
+
|
27
|
+
# The account portion of the email address provided.
|
28
|
+
#
|
29
|
+
# @return [String
|
30
|
+
#
|
31
|
+
attribute :user_account, Types::Strict::String
|
32
|
+
|
33
|
+
# The domain portion of the email address provided.
|
34
|
+
#
|
35
|
+
# @return [String]
|
36
|
+
#
|
37
|
+
attribute :domain, Types::Strict::String
|
38
|
+
|
39
|
+
# Whether the email address provided is a disposable mailbox (some companies create temporary mailboxes
|
40
|
+
# which shouldn't be used for marketing communications).
|
41
|
+
#
|
42
|
+
# @return [Boolean]
|
43
|
+
#
|
44
|
+
attribute :is_disposable_or_temporary, Types::Strict::Bool
|
45
|
+
|
46
|
+
# True if we recognise the email address against known lists of complainers and/or the email address has been
|
47
|
+
# used to defraud.
|
48
|
+
#
|
49
|
+
# @return [Boolean]
|
50
|
+
#
|
51
|
+
attribute :is_complainer_or_fraud_risk, Types::Strict::Bool
|
52
|
+
|
53
|
+
# The duration (in seconds) that the email validation took (maximum timeout enforced at 15 seconds).
|
54
|
+
# We recommend a high timeout (at least 5 seconds) value as it will minimise the number of "Timeout"
|
55
|
+
# responses returned.
|
56
|
+
#
|
57
|
+
# @return [Float]
|
58
|
+
#
|
59
|
+
attribute :duration, Types::Strict::Float
|
60
|
+
|
61
|
+
# Whether the email was fully validated (including the account portion).
|
62
|
+
def valid?
|
63
|
+
response_code == 'Valid'
|
64
|
+
end
|
65
|
+
|
66
|
+
# Whether the domain has been validated but the account hasn't.
|
67
|
+
def valid_domain?
|
68
|
+
response_code == 'Valid' || response_code == 'Valid_CatchAll'
|
69
|
+
end
|
70
|
+
|
71
|
+
# Whether the email is invalid and shouldn't be accepted.
|
72
|
+
def invalid?
|
73
|
+
response_code == 'Invalid'
|
74
|
+
end
|
75
|
+
|
76
|
+
# Whether the validation could not be completed within the timeout specified.
|
77
|
+
def timeout?
|
78
|
+
response_code == 'Timeout'
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
data/lib/loqate/gateway.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'loqate/address_gateway'
|
2
|
+
require 'loqate/email_gateway'
|
2
3
|
require 'loqate/phone_gateway'
|
3
4
|
|
4
5
|
module Loqate
|
@@ -40,6 +41,14 @@ module Loqate
|
|
40
41
|
@phone ||= PhoneGateway.new(client)
|
41
42
|
end
|
42
43
|
|
44
|
+
# Gateway to the Email verification APIs.
|
45
|
+
#
|
46
|
+
# @return [EmailGateway] An instance of an email gateway.
|
47
|
+
#
|
48
|
+
def email
|
49
|
+
@email ||= EmailGateway.new(client)
|
50
|
+
end
|
51
|
+
|
43
52
|
private
|
44
53
|
|
45
54
|
# @api private
|
data/lib/loqate/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: loqate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wilson Silva
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-11-
|
11
|
+
date: 2018-11-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dry-struct
|
@@ -347,9 +347,12 @@ files:
|
|
347
347
|
- lib/loqate/address.rb
|
348
348
|
- lib/loqate/address_gateway.rb
|
349
349
|
- lib/loqate/api_result.rb
|
350
|
+
- lib/loqate/batch_email_validation.rb
|
350
351
|
- lib/loqate/client.rb
|
351
352
|
- lib/loqate/configuration.rb
|
352
353
|
- lib/loqate/detailed_address.rb
|
354
|
+
- lib/loqate/email_gateway.rb
|
355
|
+
- lib/loqate/email_validation.rb
|
353
356
|
- lib/loqate/error.rb
|
354
357
|
- lib/loqate/gateway.rb
|
355
358
|
- lib/loqate/mappers/error_mapper.rb
|