loqate 0.3.0 → 0.4.0

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: fff6b4e7b798fed1a00eb2acfa53ffd3997820f815e1ef780ab46d4e8efbb68b
4
- data.tar.gz: d442998133eaafc167db8a823b87703021bbf72c061237cac7a0dbb659d9a271
3
+ metadata.gz: 1480f53219de60b29e6137f502c3b5c09af4fc0b9f8737a8248d2e71704b391a
4
+ data.tar.gz: 7842ed023231d338d31ede50f77e87e3ddcfcf78131754539bb55e3d9744722f
5
5
  SHA512:
6
- metadata.gz: d57781e89b7743e9c315d97e821cb31d56b0a1b2458cf1d2a640908e9d6e9bd45f8d64f155b63ccd2b704fa1b1b9b71bf700acd7c10ac08afcdf3c1e99e62020
7
- data.tar.gz: 794e2d39014cc609fb708989785c74c551ad895bff4565b2f00cc67351353587b2bf3974c91fec54b53e02a7fb44668529c79058318444e8f5bbd00ba1985edd
6
+ metadata.gz: 8e65821f932b0e0c2c910e0e92c02c4ab68cbde159db6e50ae645931c0497d3b87f0f4b37ada680f56feadb6a1302b3ea6d118fd4fbfa7c828b8484ad68b1aaf
7
+ data.tar.gz: a56f36319aa424b4fb368defd2bb03b76770d66faec41ebe5ac6efe8f9ffaef5edee87595c437a6f85269a7841a083adfc3ff6872d59500996021d0452143bc3
data/.yardstick.yml CHANGED
@@ -41,6 +41,18 @@ rules:
41
41
  - Loqate::Gateway#config
42
42
  - Loqate::Gateway#initialize
43
43
  - Loqate::Gateway#address
44
+ - Loqate::Gateway#phone
45
+ - Loqate::PhoneGateway#initialize
46
+ - Loqate::PhoneNumberValidation#phone_number
47
+ - Loqate::PhoneNumberValidation#request_processed
48
+ - Loqate::PhoneNumberValidation#is_valid
49
+ - Loqate::PhoneNumberValidation#network_code
50
+ - Loqate::PhoneNumberValidation#network_name
51
+ - Loqate::PhoneNumberValidation#network_country
52
+ - Loqate::PhoneNumberValidation#national_format
53
+ - Loqate::PhoneNumberValidation#country_prefix
54
+ - Loqate::PhoneNumberValidation#number_type
55
+ - Loqate::PhoneNumberValidation#valid?
44
56
  - Loqate::Result::Success#success?
45
57
  - Loqate::Result::Success#failure?
46
58
  - Loqate::Result::Failure#success?
@@ -67,6 +79,7 @@ rules:
67
79
  - Loqate::Client#configuration
68
80
  - Loqate::Client#authenticate_params
69
81
  - Loqate::Client#format_params
82
+ - Loqate::Client#headers
70
83
  - Loqate::DetailedAddress#==
71
84
  - Loqate::Util.camelize
72
85
  - Loqate::Util#camelize
@@ -74,6 +87,11 @@ rules:
74
87
  - Loqate::Util#underscore
75
88
  - Loqate::Error#attributes
76
89
  - Loqate::Gateway#client
90
+ - Loqate::PhoneGateway#mapper
91
+ - Loqate::PhoneGateway#error_mapper
92
+ - Loqate::PhoneGateway#client
93
+ - Loqate::PhoneGateway#build_error_from
94
+ - Loqate::PhoneGateway#build_phone_validation_from
77
95
  - Loqate::Result::Failure#error
78
96
  Summary::Presence:
79
97
  enabled: true
@@ -94,10 +112,16 @@ rules:
94
112
  - Loqate::Client#configuration
95
113
  - Loqate::Client#authenticate_params
96
114
  - Loqate::Client#format_params
115
+ - Loqate::Client#headers
97
116
  - Loqate::DetailedAddress#initialize
98
117
  - Loqate::DetailedAddress#==
99
118
  - Loqate::Error#attributes
100
119
  - Loqate::Gateway#client
120
+ - Loqate::PhoneGateway#mapper
121
+ - Loqate::PhoneGateway#error_mapper
122
+ - Loqate::PhoneGateway#client
123
+ - Loqate::PhoneGateway#build_error_from
124
+ - Loqate::PhoneGateway#build_phone_validation_from
101
125
  - Loqate::Result::Failure#error
102
126
  Summary::Length:
103
127
  enabled: false
data/CHANGELOG.md CHANGED
@@ -4,6 +4,16 @@ 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.4.0] - 2018-11-14
8
+ ### Changed
9
+ - Updated the gem `HTTP` to version `4.0.0`
10
+ - Added the header `Accept: application/json` to every request
11
+ - Simplified the Value Objects with Dry-Struct
12
+
13
+ ## Added
14
+ - A License (MIT)
15
+ - Phone API
16
+
7
17
  ## [0.3.0] - 2018-11-10
8
18
  ### Changed
9
19
  - `address.retrieve` and `address.find` return a single error, not an array with a single item
@@ -35,5 +45,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
35
45
  - Initial core functionality
36
46
  - Codebase maintenance tools
37
47
 
48
+ [0.4.0]: https://github.com/wilsonsilva/loqate/compare/v0.3.0...v0.4.0
38
49
  [0.3.0]: https://github.com/wilsonsilva/loqate/compare/v0.2.0...v0.3.0
39
50
  [0.2.0]: https://github.com/wilsonsilva/loqate/compare/v0.1.0...v0.2.0
data/LICENSE.md ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2018 Wilson Silva
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md CHANGED
@@ -9,6 +9,22 @@
9
9
 
10
10
  Client to address verification, postcode lookup, & data quality services from Loqate.
11
11
 
12
+ ## Table of contents
13
+ - [Installation](#installation)
14
+ - [Usage](#usage)
15
+ - [Getting started](#getting-started)
16
+ - [Bang methods](#bang-methods)
17
+ - [Example of using non-bang method](#example-of-using-non-bang-method)
18
+ - [Example of using bang method](#example-of-using-bang-method)
19
+ - [Address API](#address-api)
20
+ - [Finding addresses](#finding-addresses)
21
+ - [Retrieving the details of an address](#retrieving-the-details-of-an-address)
22
+ - [Phone API](#phone-api)
23
+ - [Validating a phone number](#validating-a-phone-number)
24
+ - [Development](#development)
25
+ - [Contributing](#contributing)
26
+ - [License](#license)
27
+
12
28
  ## Installation
13
29
 
14
30
  Add this line to your application's Gemfile:
@@ -38,7 +54,7 @@ To get started, initialize an API gateway with [your API key](https://account.lo
38
54
  gateway = Loqate::Gateway.new(api_key: '<YOUR_API_KEY>')
39
55
  ```
40
56
 
41
- ### Bang Methods
57
+ ### Bang methods
42
58
 
43
59
  Most methods have a bang and a non-bang version (e.g. `gateway.address.find` and `gateway.address.find!`).
44
60
  The non-bang version will either return a `Loqate::Success` or an `Loqate::Failure`. The bang version will
@@ -88,21 +104,42 @@ selection.
88
104
  #### Finding addresses
89
105
 
90
106
  ```ruby
91
- result = gateway.address.find(text: 'EC1Y 8AF', country: 'GB', limit: 5)
107
+ addresses = gateway.address.find!(text: 'EC1Y 8AF', country: 'GB', limit: 5)
92
108
 
93
- addresses = result.value
94
109
  addresses.first.id # => 'GB|RM|B|8144611'
95
110
  ```
96
111
 
97
112
  #### Retrieving the details of an address
98
113
 
99
114
  ```ruby
100
- result = gateway.address.retrieve(id: 'GB|RM|B|8144611')
115
+ address = gateway.address.retrieve!(id: 'GB|RM|B|8144611')
116
+
117
+ address.city # 'London'
118
+ address.line1 # '148 Warner Road'
119
+ address.postal_code # 'E17 7EA'
120
+ ```
121
+
122
+ ### Phone API
101
123
 
102
- address = result.value
103
- address.city # 'London'
104
- address.line1 # '148 Warner Road'
105
- address.postal_code # 'E17 7EA'
124
+ The Phone API consists of a single API request:
125
+ [Validate](https://www.loqate.com/resources/support/apis/PhoneNumberValidation/Interactive/Validate/2.2/) which starts
126
+ a new phone number validation request.
127
+
128
+ #### Validating a phone number
129
+
130
+ ```ruby
131
+ phone_validation = gateway.phone.validate!(phone: '+447440029210', country: 'GB')
132
+
133
+ phone_validation.phone_number # => '+447440029210'
134
+ phone_validation.request_processed # => true
135
+ phone_validation.is_valid # => 'Yes' -> This is how Loqate defines validity
136
+ phone_validation.valid? # => true
137
+ phone_validation.network_code # => '26'
138
+ phone_validation.network_name # => 'Telefonica UK'
139
+ phone_validation.network_country # => 'GB'
140
+ phone_validation.national_format # => '07440 029210'
141
+ phone_validation.country_prefix # => 44
142
+ phone_validation.number_type # => 'Mobile'
106
143
  ```
107
144
 
108
145
  ## Development
@@ -131,3 +168,7 @@ rake yardstick_measure # Measure docs in lib/**/*.rb with yardstick
131
168
  ## Contributing
132
169
 
133
170
  Bug reports and pull requests are welcome on GitHub at https://github.com/wilsonsilva/loqate.
171
+
172
+ ## License
173
+
174
+ See [LICENSE](https://github.com/wilsonsilva/loqate/blob/master/LICENSE).
data/ROADMAP.md CHANGED
@@ -7,7 +7,7 @@
7
7
  - [ ] Logging
8
8
  - [x] Domain error handling
9
9
  - [x] Configuration
10
- - [ ] Unwrap request results
10
+ - [x] Unwrap request results
11
11
  - [ ] Validate request parameters
12
12
  - [ ] API/Service versioning
13
13
  - [ ] Integration with RSpec
@@ -18,7 +18,7 @@
18
18
  - [ ] Geocode
19
19
  - [ ] Data Cleanse
20
20
  - [ ] Email Verification
21
- - [ ] Phone Verification
21
+ - [x] Phone Verification
22
22
  - [ ] Bank Verification
23
23
 
24
24
  ## Formats
data/lib/loqate.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'loqate/types'
3
4
  require 'loqate/version'
4
5
  require 'loqate/gateway'
5
6
 
@@ -1,71 +1,35 @@
1
1
  module Loqate
2
2
  # A result from the address find service.
3
- class Address
3
+ class Address < Dry::Struct::Value
4
4
  # An address ID or a container ID for further results
5
5
  #
6
6
  # @return [String]
7
7
  #
8
- attr_reader :id
8
+ attribute :id, Types::Strict::String
9
9
 
10
10
  # If the Type is 'Address' then the ID can be passed to the Retrieve service.
11
11
  # Any other ID should be passed as the Container to a further Find request to get more results.
12
12
  #
13
13
  # @return [String]
14
14
  #
15
- attr_reader :type
15
+ attribute :type, Types::Strict::String
16
16
 
17
17
  # The name of the result
18
18
  #
19
19
  # @return [String]
20
20
  #
21
- attr_reader :text
21
+ attribute :text, Types::Strict::String
22
22
 
23
23
  # A list of number ranges identifying the matched characters in the Text and Description
24
24
  #
25
25
  # @return [String]
26
26
  #
27
- attr_reader :highlight
27
+ attribute :highlight, Types::Strict::String
28
28
 
29
29
  # Descriptive information about the result
30
30
  #
31
31
  # @return [String]
32
32
  #
33
- attr_reader :description
34
-
35
- # Creates an address
36
- #
37
- # @param [String] id An address ID or a container ID for further results
38
- # @param [String] type If the Type is 'Address' then the ID can be passed to the Retrieve service.
39
- # Any other ID should be passed as the Container to a further Find request to get more results.
40
- # @param [String] text The name of the result
41
- # @param [String] highlight A list of number ranges identifying the matched characters in the Text and Description
42
- # @param [String] description Descriptive information about the result
43
- #
44
- def initialize(id:, type:, text:, highlight:, description:)
45
- @id = id
46
- @type = type
47
- @text = text
48
- @highlight = highlight
49
- @description = description
50
- end
51
-
52
- # @!visibility private
53
- # @api private
54
- def ==(other)
55
- attributes == other.send(:attributes)
56
- end
57
-
58
- private
59
-
60
- # @api private
61
- def attributes
62
- @attributes ||= {
63
- id: id,
64
- type: type,
65
- text: text,
66
- highlight: highlight,
67
- description: description
68
- }
69
- end
33
+ attribute :description, Types::Strict::String
70
34
  end
71
35
  end
data/lib/loqate/client.rb CHANGED
@@ -36,7 +36,7 @@ module Loqate
36
36
  authenticated_params = authenticate_params(params)
37
37
  formatted_params = format_params(authenticated_params)
38
38
 
39
- response = HTTP.get(configuration.host + endpoint, params: formatted_params)
39
+ response = HTTP.headers(headers).get(configuration.host + endpoint, params: formatted_params)
40
40
 
41
41
  body = JSON.parse(response.body)
42
42
  APIResult.new(body.fetch('Items'))
@@ -56,5 +56,10 @@ module Loqate
56
56
  def format_params(params)
57
57
  params.transform_keys { |key| Util.camelize(key) }
58
58
  end
59
+
60
+ # @api private
61
+ def headers
62
+ { accept: 'application/json' }
63
+ end
59
64
  end
60
65
  end
@@ -1,4 +1,5 @@
1
1
  require 'loqate/address_gateway'
2
+ require 'loqate/phone_gateway'
2
3
 
3
4
  module Loqate
4
5
  # Acts as a single point of entry for a defined group of API's.
@@ -31,6 +32,14 @@ module Loqate
31
32
  @address ||= AddressGateway.new(client)
32
33
  end
33
34
 
35
+ # Gateway to the Phone number API.
36
+ #
37
+ # @return [PhoneGateway] An instance of a phone gateway.
38
+ #
39
+ def phone
40
+ @phone ||= PhoneGateway.new(client)
41
+ end
42
+
34
43
  private
35
44
 
36
45
  # @api private
@@ -0,0 +1,82 @@
1
+ require 'loqate/client'
2
+ require 'loqate/result'
3
+ require 'loqate/mappers/error_mapper'
4
+ require 'loqate/mappers/generic_mapper'
5
+ require 'loqate/phone_number_validation'
6
+
7
+ module Loqate
8
+ # Starts a new phone number validation request.
9
+ #
10
+ class PhoneGateway
11
+ VALIDATE_ENDPOINT = '/PhoneNumberValidation/Interactive/Validate/v2.20/json3.ws'.freeze
12
+
13
+ include Result::Mixin
14
+
15
+ # Creates a phone gateway
16
+ #
17
+ # @param [Client] client The client responsible for the HTTP interactions
18
+ #
19
+ def initialize(client)
20
+ @client = client
21
+ @mapper = Mappers::GenericMapper.new
22
+ @error_mapper = Mappers::ErrorMapper.new
23
+ end
24
+
25
+ # Validates phone numbers.
26
+ #
27
+ # @param [Hash] options The options to validate a phone number.
28
+ # @option options [String] :phone The mobile/cell phone number to verify. This must be in international format
29
+ # (+447528471411 or 447528471411) if no country code is provided or national format with a Country parameter
30
+ # provided (07528471411 and GB as the Country parameter).
31
+ # @option options [String] :country The ISO2 country code of the number you are trying to validate
32
+ # (if provided in national format).
33
+ #
34
+ # @example
35
+ # phone_validation = phone_gateway.validate(phone: '447440019210', country: 'GB')
36
+ #
37
+ # @return [Result] A result wrapping a phone number validation
38
+ #
39
+ def validate(options)
40
+ response = client.get(VALIDATE_ENDPOINT, options)
41
+
42
+ response.errors? && build_error_from(response.items.first) || build_phone_validation_from(response.items.first)
43
+ end
44
+
45
+ # Validates phone numbers.
46
+ #
47
+ # @param [Hash] options The options to validate a phone number.
48
+ # @option options [String] :phone The mobile/cell phone number to verify. This must be in international format
49
+ # (+447528471411 or 447528471411) if no country code is provided or national format with a Country parameter
50
+ # provided (07528471411 and GB as the Country parameter).
51
+ # @option options [String] :country The ISO2 country code of the number you are trying to validate
52
+ # (if provided in national format).
53
+ #
54
+ # @example
55
+ # phone_validation = phone_gateway.validate(phone: '447440019210', country: 'GB')
56
+ #
57
+ # @raise [Error] If the result is not a success
58
+ #
59
+ # @return [PhoneNumberValidation> A phone number validation
60
+ #
61
+ def validate!(options)
62
+ unwrap_result_or_raise { validate(options) }
63
+ end
64
+
65
+ private
66
+
67
+ # @api private
68
+ attr_reader :client, :mapper, :error_mapper
69
+
70
+ # @api private
71
+ def build_error_from(item)
72
+ error = error_mapper.map_one(item)
73
+ Failure(error)
74
+ end
75
+
76
+ # @api private
77
+ def build_phone_validation_from(item)
78
+ phone_number_validation = mapper.map_one(item, PhoneNumberValidation)
79
+ Success(phone_number_validation)
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,67 @@
1
+ module Loqate
2
+ # Result of a phone number validation.
3
+ class PhoneNumberValidation < Dry::Struct::Value
4
+ IsValid = Types::Strict::String.enum('Yes', 'No', 'Unknown')
5
+ NumberType = Types::Strict::String.enum('Mobile', 'Landline', 'Voip', 'Unknown')
6
+
7
+ # The recipient phone number in international format.
8
+ #
9
+ # @return [String]
10
+ #
11
+ attribute :phone_number, Types::Strict::String
12
+
13
+ # Returns true if we managed to process the request on the network or false if the validation
14
+ # attempt was unsuccessful.
15
+ #
16
+ # @return [Boolean]
17
+ #
18
+ attribute :request_processed, Types::Strict::Bool
19
+
20
+ # Whether the number is valid or not (Unknown returned if validation wasn't possible).
21
+ #
22
+ # @return [String]
23
+ #
24
+ attribute :is_valid, IsValid
25
+
26
+ # The current operator serving the supplied number.
27
+ #
28
+ # @return [String]
29
+ #
30
+ attribute :network_code, Types::Strict::String
31
+
32
+ # The name of the current operator serving the supplied number.
33
+ #
34
+ # @return [String]
35
+ #
36
+ attribute :network_name, Types::Strict::String
37
+
38
+ # The country code of the operator.
39
+ #
40
+ # @return [String]
41
+ #
42
+ attribute :network_country, Types::Strict::String
43
+
44
+ # The domestic network format (useful for dialling from within the same country).
45
+ #
46
+ # @return [String]
47
+ #
48
+ attribute :national_format, Types::Strict::String
49
+
50
+ # The country prefix that must be prepended to the number when dialling internationally.
51
+ #
52
+ # @return [Integer]
53
+ #
54
+ attribute :country_prefix, Types::Coercible::Integer
55
+
56
+ # The type of number that was detected in the request (Mobile, Landline, VOIP or Unknown).
57
+ #
58
+ # @return [String]
59
+ #
60
+ attribute :number_type, NumberType
61
+
62
+ # Whether the validation was successful or not.
63
+ def valid?
64
+ is_valid == 'Yes'
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,9 @@
1
+ require 'dry/types'
2
+ require 'dry/struct'
3
+
4
+ module Loqate
5
+ # Dry-types container.
6
+ module Types
7
+ include Dry::Types.module
8
+ end
9
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Loqate
4
- VERSION = '0.3.0'
4
+ VERSION = '0.4.0'
5
5
  end
data/loqate.gemspec CHANGED
@@ -24,7 +24,8 @@ Gem::Specification.new do |spec|
24
24
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
25
  spec.require_paths = ['lib']
26
26
 
27
- spec.add_runtime_dependency 'http', '~> 3.3.0'
27
+ spec.add_runtime_dependency 'dry-struct', '~> 0.6.0'
28
+ spec.add_runtime_dependency 'http', '~> 4.0.0'
28
29
 
29
30
  spec.add_development_dependency 'bundler', '~> 1.16'
30
31
  spec.add_development_dependency 'bundler-audit', '~> 0.6'
metadata CHANGED
@@ -1,29 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: loqate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.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-10 00:00:00.000000000 Z
11
+ date: 2018-11-14 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dry-struct
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.6.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.6.0
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: http
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - "~>"
18
32
  - !ruby/object:Gem::Version
19
- version: 3.3.0
33
+ version: 4.0.0
20
34
  type: :runtime
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
38
  - - "~>"
25
39
  - !ruby/object:Gem::Version
26
- version: 3.3.0
40
+ version: 4.0.0
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -323,6 +337,7 @@ files:
323
337
  - CHANGELOG.md
324
338
  - Gemfile
325
339
  - Guardfile
340
+ - LICENSE.md
326
341
  - README.md
327
342
  - ROADMAP.md
328
343
  - Rakefile
@@ -339,7 +354,10 @@ files:
339
354
  - lib/loqate/gateway.rb
340
355
  - lib/loqate/mappers/error_mapper.rb
341
356
  - lib/loqate/mappers/generic_mapper.rb
357
+ - lib/loqate/phone_gateway.rb
358
+ - lib/loqate/phone_number_validation.rb
342
359
  - lib/loqate/result.rb
360
+ - lib/loqate/types.rb
343
361
  - lib/loqate/util.rb
344
362
  - lib/loqate/version.rb
345
363
  - loqate.gemspec