loqate 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,84 @@
1
+ require 'loqate/client'
2
+ require 'loqate/result'
3
+ require 'loqate/mappers/error_mapper'
4
+ require 'loqate/mappers/generic_mapper'
5
+ require 'loqate/phone/phone_number_validation'
6
+
7
+ module Loqate
8
+ module Phone
9
+ # Starts a new phone number validation request.
10
+ #
11
+ class Gateway
12
+ VALIDATE_ENDPOINT = '/PhoneNumberValidation/Interactive/Validate/v2.20/json3.ws'.freeze
13
+
14
+ include Result::Mixin
15
+
16
+ # Creates a phone gateway
17
+ #
18
+ # @param [Client] client The client responsible for the HTTP interactions
19
+ #
20
+ def initialize(client)
21
+ @client = client
22
+ @mapper = Mappers::GenericMapper.new
23
+ @error_mapper = Mappers::ErrorMapper.new
24
+ end
25
+
26
+ # Validates phone numbers.
27
+ #
28
+ # @param [Hash] options The options to validate a phone number.
29
+ # @option options [String] :phone The mobile/cell phone number to verify. This must be in international format
30
+ # (+447528471411 or 447528471411) if no country code is provided or national format with a Country parameter
31
+ # provided (07528471411 and GB as the Country parameter).
32
+ # @option options [String] :country The ISO2 country code of the number you are trying to validate
33
+ # (if provided in national format).
34
+ #
35
+ # @example
36
+ # phone_validation = phone_gateway.validate(phone: '447440019210', country: 'GB')
37
+ #
38
+ # @return [Result] A result wrapping a phone number validation
39
+ #
40
+ def validate(options)
41
+ response = client.get(VALIDATE_ENDPOINT, options)
42
+
43
+ response.errors? && build_error_from(response.items.first) || build_phone_validation_from(response.items.first)
44
+ end
45
+
46
+ # Validates phone numbers.
47
+ #
48
+ # @param [Hash] options The options to validate a phone number.
49
+ # @option options [String] :phone The mobile/cell phone number to verify. This must be in international format
50
+ # (+447528471411 or 447528471411) if no country code is provided or national format with a Country parameter
51
+ # provided (07528471411 and GB as the Country parameter).
52
+ # @option options [String] :country The ISO2 country code of the number you are trying to validate
53
+ # (if provided in national format).
54
+ #
55
+ # @example
56
+ # phone_validation = phone_gateway.validate(phone: '447440019210', country: 'GB')
57
+ #
58
+ # @raise [Error] If the result is not a success
59
+ #
60
+ # @return [PhoneNumberValidation> A phone number validation
61
+ #
62
+ def validate!(options)
63
+ unwrap_result_or_raise { validate(options) }
64
+ end
65
+
66
+ private
67
+
68
+ # @api private
69
+ attr_reader :client, :mapper, :error_mapper
70
+
71
+ # @api private
72
+ def build_error_from(item)
73
+ error = error_mapper.map_one(item)
74
+ Failure(error)
75
+ end
76
+
77
+ # @api private
78
+ def build_phone_validation_from(item)
79
+ phone_number_validation = mapper.map_one(item, PhoneNumberValidation)
80
+ Success(phone_number_validation)
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,69 @@
1
+ module Loqate
2
+ module Phone
3
+ # Result of a phone number validation.
4
+ class PhoneNumberValidation < Dry::Struct::Value
5
+ IsValid = Types::Strict::String.enum('Yes', 'No', 'Unknown')
6
+ NumberType = Types::Strict::String.enum('Mobile', 'Landline', 'Voip', 'Unknown')
7
+
8
+ # The recipient phone number in international format.
9
+ #
10
+ # @return [String]
11
+ #
12
+ attribute :phone_number, Types::Strict::String
13
+
14
+ # Returns true if we managed to process the request on the network or false if the validation
15
+ # attempt was unsuccessful.
16
+ #
17
+ # @return [Boolean]
18
+ #
19
+ attribute :request_processed, Types::Strict::Bool
20
+
21
+ # Whether the number is valid or not (Unknown returned if validation wasn't possible).
22
+ #
23
+ # @return [String]
24
+ #
25
+ attribute :is_valid, IsValid
26
+
27
+ # The current operator serving the supplied number.
28
+ #
29
+ # @return [String]
30
+ #
31
+ attribute :network_code, Types::Strict::String
32
+
33
+ # The name of the current operator serving the supplied number.
34
+ #
35
+ # @return [String]
36
+ #
37
+ attribute :network_name, Types::Strict::String
38
+
39
+ # The country code of the operator.
40
+ #
41
+ # @return [String]
42
+ #
43
+ attribute :network_country, Types::Strict::String
44
+
45
+ # The domestic network format (useful for dialling from within the same country).
46
+ #
47
+ # @return [String]
48
+ #
49
+ attribute :national_format, Types::Strict::String
50
+
51
+ # The country prefix that must be prepended to the number when dialling internationally.
52
+ #
53
+ # @return [Integer]
54
+ #
55
+ attribute :country_prefix, Types::Coercible::Integer
56
+
57
+ # The type of number that was detected in the request (Mobile, Landline, VOIP or Unknown).
58
+ #
59
+ # @return [String]
60
+ #
61
+ attribute :number_type, NumberType
62
+
63
+ # Whether the validation was successful or not.
64
+ def valid?
65
+ is_valid == 'Yes'
66
+ end
67
+ end
68
+ end
69
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Loqate
4
- VERSION = '0.6.0'
4
+ VERSION = '0.7.0'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: loqate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wilson Silva
@@ -344,8 +344,9 @@ files:
344
344
  - bin/console
345
345
  - bin/setup
346
346
  - lib/loqate.rb
347
- - lib/loqate/address.rb
348
- - lib/loqate/address_gateway.rb
347
+ - lib/loqate/address/address.rb
348
+ - lib/loqate/address/detailed_address.rb
349
+ - lib/loqate/address/gateway.rb
349
350
  - lib/loqate/api_result.rb
350
351
  - lib/loqate/bank/account_validation.rb
351
352
  - lib/loqate/bank/batch_account_validation.rb
@@ -353,18 +354,17 @@ files:
353
354
  - lib/loqate/bank/card_validation.rb
354
355
  - lib/loqate/bank/gateway.rb
355
356
  - lib/loqate/bank/international_account_validation.rb
356
- - lib/loqate/batch_email_validation.rb
357
357
  - lib/loqate/client.rb
358
358
  - lib/loqate/configuration.rb
359
- - lib/loqate/detailed_address.rb
360
- - lib/loqate/email_gateway.rb
361
- - lib/loqate/email_validation.rb
359
+ - lib/loqate/email/batch_email_validation.rb
360
+ - lib/loqate/email/email_validation.rb
361
+ - lib/loqate/email/gateway.rb
362
362
  - lib/loqate/error.rb
363
363
  - lib/loqate/gateway.rb
364
364
  - lib/loqate/mappers/error_mapper.rb
365
365
  - lib/loqate/mappers/generic_mapper.rb
366
- - lib/loqate/phone_gateway.rb
367
- - lib/loqate/phone_number_validation.rb
366
+ - lib/loqate/phone/gateway.rb
367
+ - lib/loqate/phone/phone_number_validation.rb
368
368
  - lib/loqate/result.rb
369
369
  - lib/loqate/types.rb
370
370
  - lib/loqate/util.rb
@@ -1,35 +0,0 @@
1
- module Loqate
2
- # A result from the address find service.
3
- class Address < Dry::Struct::Value
4
- # An address ID or a container ID for further results
5
- #
6
- # @return [String]
7
- #
8
- attribute :id, Types::Strict::String
9
-
10
- # If the Type is 'Address' then the ID can be passed to the Retrieve service.
11
- # Any other ID should be passed as the Container to a further Find request to get more results.
12
- #
13
- # @return [String]
14
- #
15
- attribute :type, Types::Strict::String
16
-
17
- # The name of the result
18
- #
19
- # @return [String]
20
- #
21
- attribute :text, Types::Strict::String
22
-
23
- # A list of number ranges identifying the matched characters in the Text and Description
24
- #
25
- # @return [String]
26
- #
27
- attribute :highlight, Types::Strict::String
28
-
29
- # Descriptive information about the result
30
- #
31
- # @return [String]
32
- #
33
- attribute :description, Types::Strict::String
34
- end
35
- end
@@ -1,147 +0,0 @@
1
- require 'loqate/address'
2
- require 'loqate/detailed_address'
3
- require 'loqate/error'
4
- require 'loqate/client'
5
- require 'loqate/result'
6
- require 'loqate/mappers/error_mapper'
7
- require 'loqate/mappers/generic_mapper'
8
-
9
- module Loqate
10
- # Address Verification consists of two main API requests: a Find request is used to narrow down a possible
11
- # list of addresses; and a Retrieve request is used to retrieve a fully formatted address.
12
- #
13
- # A typical address search is made up of a series of Find requests, followed by a Retrieve based on the
14
- # user selection. Choose a service below to find out how to use each request.
15
- #
16
- class AddressGateway
17
- FIND_ENDPOINT = '/Capture/Interactive/Find/v1.00/json3.ws'.freeze
18
- RETRIEVE_ENDPOINT = '/Capture/Interactive/Retrieve/v1.00/json3.ws'.freeze
19
-
20
- include Result::Mixin
21
-
22
- # Creates an address gateway
23
- #
24
- # @param [Client] client The client responsible for the HTTP interactions
25
- #
26
- def initialize(client)
27
- @client = client
28
- @mapper = Mappers::GenericMapper.new
29
- @error_mapper = Mappers::ErrorMapper.new
30
- end
31
-
32
- # Find addresses and places.
33
- #
34
- # @param [Hash] options The options to find an address or a list of addresses.
35
- # @option options [String] :text The search text to find. Ideally a postcode or the start of the address.
36
- # @option options [String] countries A comma separated list of ISO 2 or 3 character country codes to limit
37
- # the search within.
38
- # @option options [String] origin A starting location for the search. This can be the name or ISO 2 or 3 character
39
- # code of a country, WGS84 coordinates (comma separated) or IP address to search from.
40
- # @option options [String] container A container for the search. This should only be another Id previously returned
41
- # from this service when the Type of the result was not 'Address'.
42
- # @option options [Integer] limit The maximum number of results to return.
43
- # @option options [String] language The preferred language for results. This should be a 2 or 4 character language
44
- # code e.g. (en, fr, en-gb, en-us etc).
45
- #
46
- # @example Retrieving an address in the UK
47
- # address = address_gateway.find(countries: 'GB', text: 'Scrubs Lane')
48
- #
49
- # @return [Result] A result wrapping a list of addresses
50
- #
51
- def find(options)
52
- response = client.get(FIND_ENDPOINT, options)
53
-
54
- response.errors? && build_error_from(response.items.first) || build_addresses_from(response.items)
55
- end
56
-
57
- # Returns the full address details based on the id.
58
- #
59
- # @param [Hash] options The options to retrieve the address.
60
- # @option options [String] :id The Id from a Find method to retrieve the details for.
61
- # @option options [String] :field_1_format Format of a custom address field.
62
- # @option options [String] :field_2_format Format of a custom address field.
63
- # @option options [String] :field_3_format Format of a custom address field.
64
- # @option options [String] :field_4_format Format of a custom address field.
65
- # @option options [String] :field_5_format Format of a custom address field.
66
- #
67
- # @example Retrieving the details of an address
68
- # detailed_address = gateway.retrieve(id: 'GB|RM|ENG|6RB-NW10')
69
- #
70
- # @return [Result] A result wrapping a detailed address
71
- #
72
- def retrieve(options)
73
- response = client.get(RETRIEVE_ENDPOINT, options)
74
-
75
- response.errors? && build_error_from(response.items.first) || build_detailed_address_from(response.items.first)
76
- end
77
-
78
- # Find addresses and places.
79
- #
80
- # @param [Hash] options The options to find an address or a list of addresses.
81
- # @option options [String] :text The search text to find. Ideally a postcode or the start of the address.
82
- # @option options [String] countries A comma separated list of ISO 2 or 3 character country codes to limit
83
- # the search within.
84
- # @option options [String] origin A starting location for the search. This can be the name or ISO 2 or 3 character
85
- # code of a country, WGS84 coordinates (comma separated) or IP address to search from.
86
- # @option options [String] container A container for the search. This should only be another Id previously returned
87
- # from this service when the Type of the result was not 'Address'.
88
- # @option options [Integer] limit The maximum number of results to return.
89
- # @option options [String] language The preferred language for results. This should be a 2 or 4 character language
90
- # code e.g. (en, fr, en-gb, en-us etc).
91
- #
92
- # @example Retrieving addresses in the UK
93
- # addresses = address_gateway.find!(countries: 'GB', text: 'Scrubs Lane')
94
- #
95
- # @raise [Error] If the result is not a success
96
- #
97
- # @return [Array<Address>] A list of addresses
98
- #
99
- def find!(options)
100
- unwrap_result_or_raise { find(options) }
101
- end
102
-
103
- # Returns the full address details based on the id.
104
- #
105
- # @param [Hash] options The options to retrieve the address.
106
- # @option options [String] :id The Id from a Find method to retrieve the details for.
107
- # @option options [String] :field_1_format Format of a custom address field.
108
- # @option options [String] :field_2_format Format of a custom address field.
109
- # @option options [String] :field_3_format Format of a custom address field.
110
- # @option options [String] :field_4_format Format of a custom address field.
111
- # @option options [String] :field_5_format Format of a custom address field.
112
- #
113
- # @example Retrieving the details of an address
114
- # detailed_address = gateway.retrieve!(id: 'GB|RM|ENG|6RB-NW10')
115
- #
116
- # @raise [Error] If the result is not a success
117
- #
118
- # @return [DetailedAddress] A detailed address
119
- #
120
- def retrieve!(options)
121
- unwrap_result_or_raise { retrieve(options) }
122
- end
123
-
124
- private
125
-
126
- # @api private
127
- attr_reader :client, :mapper, :error_mapper
128
-
129
- # @api private
130
- def build_error_from(item)
131
- error = error_mapper.map_one(item)
132
- Failure(error)
133
- end
134
-
135
- # @api private
136
- def build_addresses_from(items)
137
- address = mapper.map(items, Address)
138
- Success(address)
139
- end
140
-
141
- # @api private
142
- def build_detailed_address_from(item)
143
- detailed_address = mapper.map_one(item, DetailedAddress)
144
- Success(detailed_address)
145
- end
146
- end
147
- end
@@ -1,66 +0,0 @@
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