loqate 0.1.0 → 0.2.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/.gitignore +2 -0
- data/.rubocop.yml +5 -0
- data/.ruby-version +1 -0
- data/.travis.yml +1 -0
- data/.yardstick.yml +81 -6
- data/CHANGELOG.md +18 -0
- data/README.md +60 -7
- data/ROADMAP.md +8 -7
- data/bin/setup +2 -0
- data/lib/loqate.rb +1 -0
- data/lib/loqate/address.rb +71 -0
- data/lib/loqate/address_gateway.rb +101 -0
- data/lib/loqate/api_result.rb +26 -0
- data/lib/loqate/client.rb +60 -0
- data/lib/loqate/configuration.rb +34 -0
- data/lib/loqate/detailed_address.rb +83 -0
- data/lib/loqate/error.rb +54 -0
- data/lib/loqate/gateway.rb +39 -0
- data/lib/loqate/mappers/error_mapper.rb +26 -0
- data/lib/loqate/mappers/generic_mapper.rb +25 -0
- data/lib/loqate/result.rb +102 -0
- data/lib/loqate/util.rb +34 -0
- data/lib/loqate/version.rb +1 -1
- data/loqate.gemspec +4 -0
- metadata +57 -3
- data/Gemfile.lock +0 -147
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e1f1396b79c0115311d766dd1b8fb7f4b0325596d27293d1b1d4af7c0d3d4a29
|
|
4
|
+
data.tar.gz: e2a275316138017ec971b0a4412e8cc92a872983a523067c33c1ea2c88785de3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: abf8817900f777554ded8b558dd43e4f94ebead001fb53c9ac012e8d462f7b4c3926e86a00ea1ac3d5b9230376c19af03931d08c4a0c684bf137369dd8ce332b
|
|
7
|
+
data.tar.gz: 470d80e084b048173e3ae34d230227308c2855fbb2fa26be93897464ba9c9fd9a0490f0ee9062302107315f4ecb168db50c39e6799af009e492af223b2dad2b2
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
|
@@ -5,11 +5,16 @@ AllCops:
|
|
|
5
5
|
|
|
6
6
|
Metrics/BlockLength:
|
|
7
7
|
Exclude:
|
|
8
|
+
- spec/**/*_spec.rb
|
|
8
9
|
- loqate.gemspec
|
|
9
10
|
|
|
10
11
|
Metrics/LineLength:
|
|
11
12
|
Max: 120
|
|
12
13
|
|
|
14
|
+
Naming/MethodName:
|
|
15
|
+
Exclude:
|
|
16
|
+
- lib/loqate/result.rb
|
|
17
|
+
|
|
13
18
|
# ----------------------- Style -----------------------
|
|
14
19
|
|
|
15
20
|
Style/FrozenStringLiteralComment:
|
data/.ruby-version
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.5.1
|
data/.travis.yml
CHANGED
|
@@ -13,6 +13,7 @@ rvm:
|
|
|
13
13
|
before_install: gem install bundler -v 1.16.5
|
|
14
14
|
|
|
15
15
|
before_script:
|
|
16
|
+
- echo 'fake-key' > .api_key
|
|
16
17
|
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
|
17
18
|
- chmod +x ./cc-test-reporter
|
|
18
19
|
- ./cc-test-reporter before-build
|
data/.yardstick.yml
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
threshold: 100
|
|
2
2
|
rules:
|
|
3
3
|
ApiTag::Presence:
|
|
4
|
-
enabled:
|
|
4
|
+
enabled: false
|
|
5
5
|
exclude: []
|
|
6
6
|
ApiTag::Inclusion:
|
|
7
|
-
enabled:
|
|
7
|
+
enabled: false
|
|
8
8
|
exclude: []
|
|
9
9
|
ApiTag::ProtectedMethod:
|
|
10
10
|
enabled: true
|
|
@@ -14,18 +14,93 @@ rules:
|
|
|
14
14
|
exclude: []
|
|
15
15
|
ExampleTag:
|
|
16
16
|
enabled: true
|
|
17
|
-
exclude:
|
|
17
|
+
exclude:
|
|
18
|
+
- Loqate::Address#==
|
|
19
|
+
- Loqate::Address#attributes
|
|
20
|
+
- Loqate::Address#id
|
|
21
|
+
- Loqate::Address#initialize
|
|
22
|
+
- Loqate::Address#type
|
|
23
|
+
- Loqate::Address#text
|
|
24
|
+
- Loqate::Address#highlight
|
|
25
|
+
- Loqate::Address#description
|
|
26
|
+
- Loqate::AddressGateway#initialize
|
|
27
|
+
- Loqate::APIResult#errors?
|
|
28
|
+
- Loqate::APIResult#items
|
|
29
|
+
- Loqate::APIResult#initialize
|
|
30
|
+
- Loqate::Configuration#api_key
|
|
31
|
+
- Loqate::Configuration#host
|
|
32
|
+
- Loqate::Configuration#language
|
|
33
|
+
- Loqate::Configuration#initialize
|
|
34
|
+
- Loqate::DetailedAddress#initialize
|
|
35
|
+
- Loqate::DetailedAddress#==
|
|
36
|
+
- Loqate::Error#id
|
|
37
|
+
- Loqate::Error#description
|
|
38
|
+
- Loqate::Error#cause
|
|
39
|
+
- Loqate::Error#resolution
|
|
40
|
+
- Loqate::Error#initialize
|
|
41
|
+
- Loqate::Gateway#config
|
|
42
|
+
- Loqate::Gateway#initialize
|
|
43
|
+
- Loqate::Gateway#address
|
|
44
|
+
- Loqate::Result::Success#success?
|
|
45
|
+
- Loqate::Result::Success#failure?
|
|
46
|
+
- Loqate::Result::Failure#success?
|
|
47
|
+
- Loqate::Result::Failure#failure?
|
|
48
|
+
- Loqate::Result#code
|
|
49
|
+
- Loqate::Result#value
|
|
18
50
|
ReturnTag:
|
|
19
51
|
enabled: true
|
|
20
|
-
exclude:
|
|
52
|
+
exclude:
|
|
53
|
+
- Loqate::Address#==
|
|
54
|
+
- Loqate::Address#attributes
|
|
55
|
+
- Loqate::Address#id
|
|
56
|
+
- Loqate::Address#type
|
|
57
|
+
- Loqate::Address#text
|
|
58
|
+
- Loqate::Address#highlight
|
|
59
|
+
- Loqate::Address#description
|
|
60
|
+
- Loqate::AddressGateway#client
|
|
61
|
+
- Loqate::AddressGateway#mapper
|
|
62
|
+
- Loqate::AddressGateway#error_mapper
|
|
63
|
+
- Loqate::AddressGateway#build_errors_from
|
|
64
|
+
- Loqate::AddressGateway#build_address_from
|
|
65
|
+
- Loqate::AddressGateway#build_detailed_addresses_from
|
|
66
|
+
- Loqate::Client#configuration
|
|
67
|
+
- Loqate::Client#authenticate_params
|
|
68
|
+
- Loqate::Client#format_params
|
|
69
|
+
- Loqate::DetailedAddress#==
|
|
70
|
+
- Loqate::Util.camelize
|
|
71
|
+
- Loqate::Util#camelize
|
|
72
|
+
- Loqate::Util.underscore
|
|
73
|
+
- Loqate::Util#underscore
|
|
74
|
+
- Loqate::Error#attributes
|
|
75
|
+
- Loqate::Gateway#client
|
|
21
76
|
Summary::Presence:
|
|
22
77
|
enabled: true
|
|
23
|
-
exclude:
|
|
78
|
+
exclude:
|
|
79
|
+
- Loqate::Address#==
|
|
80
|
+
- Loqate::Address#attributes
|
|
81
|
+
- Loqate::Address#id
|
|
82
|
+
- Loqate::Address#type
|
|
83
|
+
- Loqate::Address#text
|
|
84
|
+
- Loqate::Address#highlight
|
|
85
|
+
- Loqate::Address#description
|
|
86
|
+
- Loqate::AddressGateway#client
|
|
87
|
+
- Loqate::AddressGateway#mapper
|
|
88
|
+
- Loqate::AddressGateway#error_mapper
|
|
89
|
+
- Loqate::AddressGateway#build_errors_from
|
|
90
|
+
- Loqate::AddressGateway#build_address_from
|
|
91
|
+
- Loqate::AddressGateway#build_detailed_addresses_from
|
|
92
|
+
- Loqate::Client#configuration
|
|
93
|
+
- Loqate::Client#authenticate_params
|
|
94
|
+
- Loqate::Client#format_params
|
|
95
|
+
- Loqate::DetailedAddress#initialize
|
|
96
|
+
- Loqate::DetailedAddress#==
|
|
97
|
+
- Loqate::Error#attributes
|
|
98
|
+
- Loqate::Gateway#client
|
|
24
99
|
Summary::Length:
|
|
25
100
|
enabled: false
|
|
26
101
|
Summary::Delimiter:
|
|
27
102
|
enabled: false
|
|
28
103
|
exclude: []
|
|
29
104
|
Summary::SingleLine:
|
|
30
|
-
enabled:
|
|
105
|
+
enabled: false
|
|
31
106
|
exclude: []
|
data/CHANGELOG.md
CHANGED
|
@@ -3,3 +3,21 @@ All notable changes to this project will be documented in this file.
|
|
|
3
3
|
|
|
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
|
+
|
|
7
|
+
## [0.2.0] - 2018-10-31
|
|
8
|
+
### Added
|
|
9
|
+
- VCR and WebMock to record HTTP interactions
|
|
10
|
+
- A file to hold a development API key (`.api_key`)
|
|
11
|
+
- A ruby version dotfile (`.ruby-version`)
|
|
12
|
+
- Core of the gem
|
|
13
|
+
- Address API
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
- Document the available code maintenance Rake tasks.
|
|
17
|
+
|
|
18
|
+
## [0.1.0] - 2018-09-29
|
|
19
|
+
### Added
|
|
20
|
+
- Initial core functionality
|
|
21
|
+
- Codebase maintenance tools
|
|
22
|
+
|
|
23
|
+
[0.2.0]: https://github.com/wilsonsilva/memoria/compare/v0.1.0...v0.2.0
|
data/README.md
CHANGED
|
@@ -7,9 +7,7 @@
|
|
|
7
7
|
[](https://hakiri.io/github/wilsonsilva/loqate/master)
|
|
8
8
|
[](http://inch-ci.org/github/wilsonsilva/loqate)
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
TODO: Delete this and the text above, and describe your gem
|
|
10
|
+
Client to address verification, postcode lookup, & data quality services from Loqate.
|
|
13
11
|
|
|
14
12
|
## Installation
|
|
15
13
|
|
|
@@ -29,12 +27,67 @@ Or install it yourself as:
|
|
|
29
27
|
|
|
30
28
|
## Usage
|
|
31
29
|
|
|
32
|
-
|
|
30
|
+
### Getting started
|
|
31
|
+
|
|
32
|
+
Loqate provides multiple APIs. And each API provides several services. This gem exposes these APIs through
|
|
33
|
+
an API gateway.
|
|
34
|
+
|
|
35
|
+
To get started, initialize an API gateway with [your API key](https://account.loqate.com/account#/):
|
|
36
|
+
|
|
37
|
+
```ruby
|
|
38
|
+
gateway = Loqate::Gateway.new(api_key: '<YOUR_API_KEY>')
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Every call to a gateway method will return a `Loqate::Result` object, which will respond to `success?` and `failure?`.
|
|
42
|
+
|
|
43
|
+
### Address API
|
|
44
|
+
|
|
45
|
+
The Address API consists of two main API requests:
|
|
46
|
+
[Find](https://www.loqate.com/resources/support/apis/Capture/Interactive/Find/1/) request is used to narrow down a
|
|
47
|
+
possible list of addresses;
|
|
48
|
+
and a [Retrieve](https://www.loqate.com/resources/support/apis/Capture/Interactive/Retrieve/1/) request is used to
|
|
49
|
+
retrieve a fully formatted address.
|
|
50
|
+
|
|
51
|
+
A typical address search is made up of a series of `find` requests, followed by a `retrieve` based on the user
|
|
52
|
+
selection.
|
|
53
|
+
|
|
54
|
+
#### Finding addresses
|
|
55
|
+
|
|
56
|
+
```ruby
|
|
57
|
+
result = gateway.address.find(text: 'EC1Y 8AF', country: 'GB', limit: 5)
|
|
58
|
+
|
|
59
|
+
result.success? # => true
|
|
60
|
+
result.failure? # => false
|
|
61
|
+
|
|
62
|
+
addresses = result.value
|
|
63
|
+
addresses.first.id # => 'GB|RM|B|8144611'
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
#### Retrieving the details of an address
|
|
67
|
+
|
|
68
|
+
```ruby
|
|
69
|
+
result = gateway.address.retrieve(id: 'GB|RM|B|8144611')
|
|
70
|
+
|
|
71
|
+
result.success? # => true
|
|
72
|
+
result.failure? # => false
|
|
73
|
+
|
|
74
|
+
addresses = result.value
|
|
75
|
+
address = addresses.first
|
|
76
|
+
|
|
77
|
+
address.city # 'London'
|
|
78
|
+
address.line1 # '148 Warner Road'
|
|
79
|
+
address.postal_code # 'E17 7EA'
|
|
80
|
+
```
|
|
33
81
|
|
|
34
82
|
## Development
|
|
35
83
|
|
|
36
|
-
After checking out the repo, run `bin/setup` to install dependencies
|
|
37
|
-
|
|
84
|
+
After checking out the repo, run `bin/setup` to install dependencies, configure git hooks and create support files.
|
|
85
|
+
|
|
86
|
+
You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
|
87
|
+
|
|
88
|
+
Then add your Loqate API key to `.api_key`. It will be used by RSpec and VCR, but not stored in the codebase.
|
|
89
|
+
|
|
90
|
+
The health and maintainability of the codebase is ensured through a set of
|
|
38
91
|
Rake tasks to test, lint and audit the gem for security vulnerabilities and documentation:
|
|
39
92
|
|
|
40
93
|
```
|
|
@@ -51,4 +104,4 @@ rake yardstick_measure # Measure docs in lib/**/*.rb with yardstick
|
|
|
51
104
|
|
|
52
105
|
## Contributing
|
|
53
106
|
|
|
54
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
|
107
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/wilsonsilva/loqate.
|
data/ROADMAP.md
CHANGED
|
@@ -2,17 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
## Core
|
|
4
4
|
|
|
5
|
-
- [
|
|
6
|
-
- [
|
|
5
|
+
- [x] HTTP Client
|
|
6
|
+
- [x] Core Client
|
|
7
7
|
- [ ] Logging
|
|
8
|
-
- [
|
|
9
|
-
- [
|
|
10
|
-
- [ ]
|
|
8
|
+
- [x] Domain error handling
|
|
9
|
+
- [x] Configuration
|
|
10
|
+
- [ ] Validate request parameters
|
|
11
|
+
- [ ] API/Service versioning
|
|
11
12
|
- [ ] Integration with RSpec
|
|
12
13
|
|
|
13
14
|
## APIs
|
|
14
15
|
|
|
15
|
-
- [
|
|
16
|
+
- [x] Address Verification
|
|
16
17
|
- [ ] Geocode
|
|
17
18
|
- [ ] Data Cleanse
|
|
18
19
|
- [ ] Email Verification
|
|
@@ -26,7 +27,7 @@
|
|
|
26
27
|
- [ ] File Renderer
|
|
27
28
|
- [ ] HTML Table
|
|
28
29
|
- [ ] Image Renderer
|
|
29
|
-
- [
|
|
30
|
+
- [x] JSON
|
|
30
31
|
- [ ] JSON (with extra)
|
|
31
32
|
- [ ] JSONP (JavaScript)
|
|
32
33
|
- [ ] PDF
|
data/bin/setup
CHANGED
data/lib/loqate.rb
CHANGED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
module Loqate
|
|
2
|
+
# A result from the address find service.
|
|
3
|
+
class Address
|
|
4
|
+
# An address ID or a container ID for further results
|
|
5
|
+
#
|
|
6
|
+
# @return [String]
|
|
7
|
+
#
|
|
8
|
+
attr_reader :id
|
|
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
|
+
attr_reader :type
|
|
16
|
+
|
|
17
|
+
# The name of the result
|
|
18
|
+
#
|
|
19
|
+
# @return [String]
|
|
20
|
+
#
|
|
21
|
+
attr_reader :text
|
|
22
|
+
|
|
23
|
+
# A list of number ranges identifying the matched characters in the Text and Description
|
|
24
|
+
#
|
|
25
|
+
# @return [String]
|
|
26
|
+
#
|
|
27
|
+
attr_reader :highlight
|
|
28
|
+
|
|
29
|
+
# Descriptive information about the result
|
|
30
|
+
#
|
|
31
|
+
# @return [String]
|
|
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
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,101 @@
|
|
|
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 [Array<Address>] A list of addresses
|
|
50
|
+
#
|
|
51
|
+
def find(options)
|
|
52
|
+
response = client.get(FIND_ENDPOINT, options)
|
|
53
|
+
|
|
54
|
+
response.errors? && build_errors_from(response.items) || build_address_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 a.
|
|
62
|
+
# @option options [String] :field_2_format b.
|
|
63
|
+
# @option options [String] :field_3_format c.
|
|
64
|
+
# @option options [String] :field_4_format d.
|
|
65
|
+
# @option options [String] :field_5_format e.
|
|
66
|
+
#
|
|
67
|
+
# @example Retrieving the details of an address
|
|
68
|
+
# detailed_address = gateway.retrieve(id: 'GB|RM|ENG|6RB-NW10')
|
|
69
|
+
#
|
|
70
|
+
# @return [Array<DetailedAddress>] A list of detailed addresses
|
|
71
|
+
#
|
|
72
|
+
def retrieve(options)
|
|
73
|
+
response = client.get(RETRIEVE_ENDPOINT, options)
|
|
74
|
+
|
|
75
|
+
response.errors? && build_errors_from(response.items) || build_detailed_addresses_from(response.items)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
private
|
|
79
|
+
|
|
80
|
+
# @api private
|
|
81
|
+
attr_reader :client, :mapper, :error_mapper
|
|
82
|
+
|
|
83
|
+
# @api private
|
|
84
|
+
def build_errors_from(items)
|
|
85
|
+
errors = error_mapper.map(items)
|
|
86
|
+
Failure(errors)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# @api private
|
|
90
|
+
def build_address_from(items)
|
|
91
|
+
address = mapper.map(items, Address)
|
|
92
|
+
Success(address)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# @api private
|
|
96
|
+
def build_detailed_addresses_from(items)
|
|
97
|
+
detailed_address = mapper.map(items, DetailedAddress)
|
|
98
|
+
Success(detailed_address)
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module Loqate
|
|
2
|
+
# Generic response of a request to Loqate's API
|
|
3
|
+
class APIResult
|
|
4
|
+
# Array of hashes representing each item in the response body
|
|
5
|
+
#
|
|
6
|
+
# @return [Array<Hash>]
|
|
7
|
+
#
|
|
8
|
+
attr_reader :items
|
|
9
|
+
|
|
10
|
+
# Instantiates a new API result
|
|
11
|
+
#
|
|
12
|
+
# @param [Array<Hash>] items Array of hashes representing each item in the response body
|
|
13
|
+
#
|
|
14
|
+
def initialize(items)
|
|
15
|
+
@items = items
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Whether the response contains errors
|
|
19
|
+
#
|
|
20
|
+
# @return [Boolean] true if the response has errors and false otherwise
|
|
21
|
+
#
|
|
22
|
+
def errors?
|
|
23
|
+
!items.dig(0, 'Error').nil?
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
require 'http'
|
|
2
|
+
require 'loqate/configuration'
|
|
3
|
+
require 'loqate/api_result'
|
|
4
|
+
|
|
5
|
+
module Loqate
|
|
6
|
+
# Responsible for the HTTP interactions. The only entity aware of HTTP concerns such as status codes and headers.
|
|
7
|
+
class Client
|
|
8
|
+
# Instantiates a new client
|
|
9
|
+
#
|
|
10
|
+
# @example
|
|
11
|
+
# configuration = Configuration.new(api_key: 'EA69-CD23-CV99-HL18')
|
|
12
|
+
# client = Client.new(configuration)
|
|
13
|
+
#
|
|
14
|
+
# @param [Configuration] configuration The configuration of the gem
|
|
15
|
+
#
|
|
16
|
+
def initialize(configuration)
|
|
17
|
+
@configuration = configuration
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Performs a GET request to Loqate's API. Every request returns the status code 200.
|
|
21
|
+
#
|
|
22
|
+
# @example Retrieving a resource
|
|
23
|
+
# client = Client.new
|
|
24
|
+
# result = client.get('/Capture/Interactive/Find/v1.00/json3.ws')
|
|
25
|
+
#
|
|
26
|
+
# @example Retrieving a resource using options
|
|
27
|
+
# client = Client.new
|
|
28
|
+
# result = client.get('/Capture/Interactive/Find/v1.00/json3.ws', countries: 'GB', text: 'Scrubs Lane')
|
|
29
|
+
#
|
|
30
|
+
# @param [String] endpoint URL of the API endpoint where the GET request
|
|
31
|
+
# @param [Hash] params Options for the GET request
|
|
32
|
+
#
|
|
33
|
+
# @return [APIResult] Generic response of a request to Loqate's API
|
|
34
|
+
#
|
|
35
|
+
def get(endpoint, params = {})
|
|
36
|
+
authenticated_params = authenticate_params(params)
|
|
37
|
+
formatted_params = format_params(authenticated_params)
|
|
38
|
+
|
|
39
|
+
response = HTTP.get(configuration.host + endpoint, params: formatted_params)
|
|
40
|
+
|
|
41
|
+
body = JSON.parse(response.body)
|
|
42
|
+
APIResult.new(body.fetch('Items'))
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
# @api private
|
|
48
|
+
attr_reader :configuration
|
|
49
|
+
|
|
50
|
+
# @api private
|
|
51
|
+
def authenticate_params(params)
|
|
52
|
+
params.merge(key: configuration.api_key)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# @api private
|
|
56
|
+
def format_params(params)
|
|
57
|
+
params.transform_keys { |key| Util.camelize(key) }
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module Loqate
|
|
2
|
+
# Configuration for the gem
|
|
3
|
+
class Configuration
|
|
4
|
+
DEFAULT_LANGUAGE = 'en-gb'.freeze
|
|
5
|
+
DEFAULT_HOST = 'https://api.addressy.com'.freeze
|
|
6
|
+
|
|
7
|
+
# API key that will give you access to all services.
|
|
8
|
+
#
|
|
9
|
+
# @return [String]
|
|
10
|
+
attr_reader :api_key
|
|
11
|
+
|
|
12
|
+
# Base URL for Loqate's services. Defaults to https://api.addressy.com
|
|
13
|
+
#
|
|
14
|
+
# @return [String]
|
|
15
|
+
attr_reader :host
|
|
16
|
+
|
|
17
|
+
# Preferred language for results. This should be a 2 or 4 character language code e.g. (en, fr, en-gb, etc).
|
|
18
|
+
#
|
|
19
|
+
# @return [String]
|
|
20
|
+
attr_reader :language
|
|
21
|
+
|
|
22
|
+
# Instantiates the gem configuration
|
|
23
|
+
#
|
|
24
|
+
# @param [String] api_key API key that will give you access to all services
|
|
25
|
+
# @param [String] host Base URL for Loqate's services
|
|
26
|
+
# @param [String] language Preferred language for results
|
|
27
|
+
#
|
|
28
|
+
def initialize(api_key:, host: DEFAULT_HOST, language: DEFAULT_LANGUAGE)
|
|
29
|
+
@api_key = api_key
|
|
30
|
+
@host = host
|
|
31
|
+
@language = language
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
module Loqate
|
|
2
|
+
# A result from the address retrieve service.
|
|
3
|
+
class DetailedAddress
|
|
4
|
+
# For the first version, this will be a flat structure, exactly as it is defined in Loqate's API.
|
|
5
|
+
# But this many attributes is too much for a single object to hold.
|
|
6
|
+
#
|
|
7
|
+
# @api private
|
|
8
|
+
#
|
|
9
|
+
ATTRIBUTES = %i[
|
|
10
|
+
admin_area_code
|
|
11
|
+
admin_area_name
|
|
12
|
+
barcode
|
|
13
|
+
block
|
|
14
|
+
building_name
|
|
15
|
+
building_number
|
|
16
|
+
city
|
|
17
|
+
company
|
|
18
|
+
country_iso2
|
|
19
|
+
country_iso3
|
|
20
|
+
country_iso_number
|
|
21
|
+
country_name
|
|
22
|
+
data_level
|
|
23
|
+
department
|
|
24
|
+
district
|
|
25
|
+
domestic_id
|
|
26
|
+
field1
|
|
27
|
+
field2
|
|
28
|
+
field3
|
|
29
|
+
field4
|
|
30
|
+
field5
|
|
31
|
+
field6
|
|
32
|
+
field7
|
|
33
|
+
field8
|
|
34
|
+
field9
|
|
35
|
+
field10
|
|
36
|
+
field11
|
|
37
|
+
field12
|
|
38
|
+
field13
|
|
39
|
+
field14
|
|
40
|
+
field15
|
|
41
|
+
field16
|
|
42
|
+
field17
|
|
43
|
+
field18
|
|
44
|
+
field19
|
|
45
|
+
field20
|
|
46
|
+
id
|
|
47
|
+
label
|
|
48
|
+
language
|
|
49
|
+
language_alternatives
|
|
50
|
+
line1
|
|
51
|
+
line2
|
|
52
|
+
line3
|
|
53
|
+
line4
|
|
54
|
+
line5
|
|
55
|
+
neighbourhood
|
|
56
|
+
po_box_number
|
|
57
|
+
postal_code
|
|
58
|
+
province
|
|
59
|
+
province_code
|
|
60
|
+
province_name
|
|
61
|
+
secondary_street
|
|
62
|
+
sorting_number1
|
|
63
|
+
sorting_number2
|
|
64
|
+
street
|
|
65
|
+
sub_building
|
|
66
|
+
type
|
|
67
|
+
].freeze
|
|
68
|
+
|
|
69
|
+
ATTRIBUTES.each do |attribute|
|
|
70
|
+
attr_reader attribute
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def initialize(options = {})
|
|
74
|
+
options.each_pair do |key, value|
|
|
75
|
+
instance_variable_set("@#{key}", value) if ATTRIBUTES.include?(key)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def ==(other)
|
|
80
|
+
other.is_a?(DetailedAddress) && id == other.id
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
data/lib/loqate/error.rb
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
module Loqate
|
|
2
|
+
# Generic error returned from an API call
|
|
3
|
+
class Error
|
|
4
|
+
# Unique identifier for the error
|
|
5
|
+
#
|
|
6
|
+
# @return [Integer]
|
|
7
|
+
#
|
|
8
|
+
attr_reader :id
|
|
9
|
+
|
|
10
|
+
# Descriptive information about the error
|
|
11
|
+
#
|
|
12
|
+
# @return [String]
|
|
13
|
+
#
|
|
14
|
+
attr_reader :description
|
|
15
|
+
|
|
16
|
+
# What caused the error
|
|
17
|
+
#
|
|
18
|
+
# @return [String]
|
|
19
|
+
#
|
|
20
|
+
attr_reader :cause
|
|
21
|
+
|
|
22
|
+
# How to solve the error
|
|
23
|
+
#
|
|
24
|
+
# @return [String]
|
|
25
|
+
#
|
|
26
|
+
attr_reader :resolution
|
|
27
|
+
|
|
28
|
+
# Instantiates an error
|
|
29
|
+
#
|
|
30
|
+
# @param [Integer] id Unique identifier for the error
|
|
31
|
+
# @param [String] description Descriptive information about the error
|
|
32
|
+
# @param [String] cause What caused the error
|
|
33
|
+
# @param [String] resolution How to solve the error
|
|
34
|
+
#
|
|
35
|
+
def initialize(id:, description:, cause:, resolution:)
|
|
36
|
+
@id = id
|
|
37
|
+
@cause = cause
|
|
38
|
+
@resolution = resolution
|
|
39
|
+
@description = description
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Compare the equality of this error with +other+. Two errors are considered equal if they have the same +id+.
|
|
43
|
+
#
|
|
44
|
+
# @param [Error] other Another error
|
|
45
|
+
#
|
|
46
|
+
# @return [Boolean]
|
|
47
|
+
#
|
|
48
|
+
# @api private
|
|
49
|
+
#
|
|
50
|
+
def ==(other)
|
|
51
|
+
other.is_a?(Error) && id == other.id
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require 'loqate/address_gateway'
|
|
2
|
+
|
|
3
|
+
module Loqate
|
|
4
|
+
# Acts as a single point of entry for a defined group of API's.
|
|
5
|
+
class Gateway
|
|
6
|
+
# The gem configuration.
|
|
7
|
+
#
|
|
8
|
+
# @return [Configuration]
|
|
9
|
+
#
|
|
10
|
+
attr_reader :config
|
|
11
|
+
|
|
12
|
+
# Creates a new gateway.
|
|
13
|
+
#
|
|
14
|
+
# @param [Hash] options Options to configure the gem.
|
|
15
|
+
# @option options [String] :api_key API key that will give you access to all services
|
|
16
|
+
# @option options [String] :host Base URL for Loqate's services
|
|
17
|
+
# @option options [String] :language Preferred language for results
|
|
18
|
+
#
|
|
19
|
+
# @see Configuration
|
|
20
|
+
#
|
|
21
|
+
def initialize(options)
|
|
22
|
+
@config = Configuration.new(options)
|
|
23
|
+
@client = Client.new(config)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Gateway to the Address APIs.
|
|
27
|
+
#
|
|
28
|
+
# @return [AddressGateway] An instance of an address gateway.
|
|
29
|
+
#
|
|
30
|
+
def address
|
|
31
|
+
@address ||= AddressGateway.new(client)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
# @api private
|
|
37
|
+
attr_reader :client
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'loqate/mappers/generic_mapper'
|
|
2
|
+
require 'loqate/error'
|
|
3
|
+
require 'loqate/util'
|
|
4
|
+
|
|
5
|
+
module Loqate
|
|
6
|
+
module Mappers
|
|
7
|
+
# Transforms erroneous responses into concrete error objects.
|
|
8
|
+
#
|
|
9
|
+
# @api private
|
|
10
|
+
#
|
|
11
|
+
class ErrorMapper
|
|
12
|
+
# Creates errors from an API response
|
|
13
|
+
#
|
|
14
|
+
# @return [Array<Error>] An array of errors
|
|
15
|
+
#
|
|
16
|
+
def map(items)
|
|
17
|
+
items.map do |item|
|
|
18
|
+
attributes = item.transform_keys { |attribute| Util.underscore(attribute) }
|
|
19
|
+
attributes[:id] = attributes.delete(:error).to_i
|
|
20
|
+
|
|
21
|
+
Loqate::Error.new(attributes)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require 'loqate/util'
|
|
2
|
+
|
|
3
|
+
module Loqate
|
|
4
|
+
module Mappers
|
|
5
|
+
# Transforms arrays of hashes into concrete instances of classes.
|
|
6
|
+
#
|
|
7
|
+
# @api private
|
|
8
|
+
#
|
|
9
|
+
class GenericMapper
|
|
10
|
+
# Creates objects from an API response. The objects will be an instance of +object_class+.
|
|
11
|
+
#
|
|
12
|
+
# @param [Class] object_class Class of the final objects
|
|
13
|
+
# @param [Array<Hash>] items Array of attributes to instantiate the final objects
|
|
14
|
+
#
|
|
15
|
+
# @return An array of objects of the given class
|
|
16
|
+
#
|
|
17
|
+
def map(items, object_class)
|
|
18
|
+
items.map do |item|
|
|
19
|
+
attributes = item.transform_keys { |attribute| Util.underscore(attribute) }
|
|
20
|
+
object_class.new(attributes)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
module Loqate
|
|
2
|
+
# Generic return value of an operation. Provides a consistent way to determine if an operation
|
|
3
|
+
# has succeeded or failed.
|
|
4
|
+
class Result
|
|
5
|
+
# Creates a new Result
|
|
6
|
+
#
|
|
7
|
+
# @param [Object] value The original return value of an operation.
|
|
8
|
+
# @param [Symbol] code A code to describe the kind of result.
|
|
9
|
+
#
|
|
10
|
+
# @example Creating a new +Result+
|
|
11
|
+
# Result.new(value: person.errors, code: :not_updated)
|
|
12
|
+
#
|
|
13
|
+
def initialize(value:, code: nil)
|
|
14
|
+
@value = value
|
|
15
|
+
@code = code
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# A code to describe the kind of result.
|
|
19
|
+
#
|
|
20
|
+
# @return [Symbol]
|
|
21
|
+
#
|
|
22
|
+
attr_reader :code
|
|
23
|
+
|
|
24
|
+
# The original return value of an operation.
|
|
25
|
+
#
|
|
26
|
+
# @return [Object]
|
|
27
|
+
#
|
|
28
|
+
attr_reader :value
|
|
29
|
+
|
|
30
|
+
# Wraps the result of a successful operation.
|
|
31
|
+
class Success < Result
|
|
32
|
+
# Always true
|
|
33
|
+
#
|
|
34
|
+
# @return [Boolean]
|
|
35
|
+
#
|
|
36
|
+
def success?
|
|
37
|
+
true
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Always false
|
|
41
|
+
#
|
|
42
|
+
# @return [Boolean]
|
|
43
|
+
#
|
|
44
|
+
def failure?
|
|
45
|
+
false
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Wraps the result of a failed operation.
|
|
50
|
+
class Failure < Result
|
|
51
|
+
# Always false
|
|
52
|
+
#
|
|
53
|
+
# @return [Boolean]
|
|
54
|
+
#
|
|
55
|
+
def success?
|
|
56
|
+
false
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Always true
|
|
60
|
+
#
|
|
61
|
+
# @return [Boolean]
|
|
62
|
+
#
|
|
63
|
+
def failure?
|
|
64
|
+
true
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Utility methods to conveniently return +Success+ or +Failure+ results.
|
|
69
|
+
module Mixin
|
|
70
|
+
Success = Success
|
|
71
|
+
Failure = Failure
|
|
72
|
+
|
|
73
|
+
# Wraps the result of an operation in a +Success+ result.
|
|
74
|
+
#
|
|
75
|
+
# @param [Object] value The original return value of an operation.
|
|
76
|
+
#
|
|
77
|
+
# @example Creating a success result
|
|
78
|
+
# Success(value: Person.new)
|
|
79
|
+
#
|
|
80
|
+
# @return [Success]
|
|
81
|
+
#
|
|
82
|
+
def Success(value)
|
|
83
|
+
Success.new(value: value)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Wraps the result of an operation in a +Failure+ result.
|
|
87
|
+
#
|
|
88
|
+
# @param [Object] value The original return value of an operation.
|
|
89
|
+
# @param [Symbol] code A unique
|
|
90
|
+
#
|
|
91
|
+
# @example Creating a failure result
|
|
92
|
+
# error = { message: 'Name cannot be blank' }
|
|
93
|
+
# Success(value: error, code: :not_persisted)
|
|
94
|
+
#
|
|
95
|
+
# @return [Success]
|
|
96
|
+
#
|
|
97
|
+
def Failure(value, code: nil)
|
|
98
|
+
Failure.new(value: value, code: code)
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
data/lib/loqate/util.rb
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module Loqate
|
|
2
|
+
# Provides methods for string manipulation
|
|
3
|
+
#
|
|
4
|
+
# @api private
|
|
5
|
+
module Util
|
|
6
|
+
module_function
|
|
7
|
+
|
|
8
|
+
# Converts a string to snake case
|
|
9
|
+
#
|
|
10
|
+
# @param [String|Symbol] term The term to be converted.
|
|
11
|
+
#
|
|
12
|
+
def underscore(term)
|
|
13
|
+
term
|
|
14
|
+
.to_s
|
|
15
|
+
.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
|
16
|
+
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
|
|
17
|
+
.tr('-', '_')
|
|
18
|
+
.downcase
|
|
19
|
+
.to_sym
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Converts a string to camel case
|
|
23
|
+
#
|
|
24
|
+
# @param [String|Symbol] term The term to be converted.
|
|
25
|
+
#
|
|
26
|
+
def camelize(term)
|
|
27
|
+
string = term.to_s
|
|
28
|
+
string = string.sub(/^[a-z\d]*/, &:capitalize)
|
|
29
|
+
string.gsub!(%r{(?:_|(\/))([a-z\d]*)}) { "#{Regexp.last_match(1)}#{Regexp.last_match(2).capitalize}" }
|
|
30
|
+
string.gsub!('/'.freeze, '::'.freeze)
|
|
31
|
+
string
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
data/lib/loqate/version.rb
CHANGED
data/loqate.gemspec
CHANGED
|
@@ -24,6 +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'
|
|
28
|
+
|
|
27
29
|
spec.add_development_dependency 'bundler', '~> 1.16'
|
|
28
30
|
spec.add_development_dependency 'bundler-audit', '~> 0.6'
|
|
29
31
|
spec.add_development_dependency 'guard', '~> 2.14'
|
|
@@ -39,6 +41,8 @@ Gem::Specification.new do |spec|
|
|
|
39
41
|
spec.add_development_dependency 'rubocop-rspec', '~> 1.29'
|
|
40
42
|
spec.add_development_dependency 'simplecov', '~> 0.16'
|
|
41
43
|
spec.add_development_dependency 'simplecov-console', '~> 0.4'
|
|
44
|
+
spec.add_development_dependency 'vcr', '~> 4.0'
|
|
45
|
+
spec.add_development_dependency 'webmock', '~> 3.4'
|
|
42
46
|
spec.add_development_dependency 'yard', '~> 0.9'
|
|
43
47
|
spec.add_development_dependency 'yard-junk', '~> 0.0.7'
|
|
44
48
|
spec.add_development_dependency 'yardstick', '~> 0.9'
|
metadata
CHANGED
|
@@ -1,15 +1,29 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: loqate
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.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
|
+
date: 2018-10-31 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: http
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: 3.3.0
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: 3.3.0
|
|
13
27
|
- !ruby/object:Gem::Dependency
|
|
14
28
|
name: bundler
|
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -220,6 +234,34 @@ dependencies:
|
|
|
220
234
|
- - "~>"
|
|
221
235
|
- !ruby/object:Gem::Version
|
|
222
236
|
version: '0.4'
|
|
237
|
+
- !ruby/object:Gem::Dependency
|
|
238
|
+
name: vcr
|
|
239
|
+
requirement: !ruby/object:Gem::Requirement
|
|
240
|
+
requirements:
|
|
241
|
+
- - "~>"
|
|
242
|
+
- !ruby/object:Gem::Version
|
|
243
|
+
version: '4.0'
|
|
244
|
+
type: :development
|
|
245
|
+
prerelease: false
|
|
246
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
247
|
+
requirements:
|
|
248
|
+
- - "~>"
|
|
249
|
+
- !ruby/object:Gem::Version
|
|
250
|
+
version: '4.0'
|
|
251
|
+
- !ruby/object:Gem::Dependency
|
|
252
|
+
name: webmock
|
|
253
|
+
requirement: !ruby/object:Gem::Requirement
|
|
254
|
+
requirements:
|
|
255
|
+
- - "~>"
|
|
256
|
+
- !ruby/object:Gem::Version
|
|
257
|
+
version: '3.4'
|
|
258
|
+
type: :development
|
|
259
|
+
prerelease: false
|
|
260
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
261
|
+
requirements:
|
|
262
|
+
- - "~>"
|
|
263
|
+
- !ruby/object:Gem::Version
|
|
264
|
+
version: '3.4'
|
|
223
265
|
- !ruby/object:Gem::Dependency
|
|
224
266
|
name: yard
|
|
225
267
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -274,12 +316,12 @@ files:
|
|
|
274
316
|
- ".overcommit.yml"
|
|
275
317
|
- ".rspec"
|
|
276
318
|
- ".rubocop.yml"
|
|
319
|
+
- ".ruby-version"
|
|
277
320
|
- ".travis.yml"
|
|
278
321
|
- ".yardopts"
|
|
279
322
|
- ".yardstick.yml"
|
|
280
323
|
- CHANGELOG.md
|
|
281
324
|
- Gemfile
|
|
282
|
-
- Gemfile.lock
|
|
283
325
|
- Guardfile
|
|
284
326
|
- README.md
|
|
285
327
|
- ROADMAP.md
|
|
@@ -287,6 +329,18 @@ files:
|
|
|
287
329
|
- bin/console
|
|
288
330
|
- bin/setup
|
|
289
331
|
- lib/loqate.rb
|
|
332
|
+
- lib/loqate/address.rb
|
|
333
|
+
- lib/loqate/address_gateway.rb
|
|
334
|
+
- lib/loqate/api_result.rb
|
|
335
|
+
- lib/loqate/client.rb
|
|
336
|
+
- lib/loqate/configuration.rb
|
|
337
|
+
- lib/loqate/detailed_address.rb
|
|
338
|
+
- lib/loqate/error.rb
|
|
339
|
+
- lib/loqate/gateway.rb
|
|
340
|
+
- lib/loqate/mappers/error_mapper.rb
|
|
341
|
+
- lib/loqate/mappers/generic_mapper.rb
|
|
342
|
+
- lib/loqate/result.rb
|
|
343
|
+
- lib/loqate/util.rb
|
|
290
344
|
- lib/loqate/version.rb
|
|
291
345
|
- loqate.gemspec
|
|
292
346
|
homepage: https://github.com/wilsonsilva/loqate
|
data/Gemfile.lock
DELETED
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
PATH
|
|
2
|
-
remote: .
|
|
3
|
-
specs:
|
|
4
|
-
loqate (0.1.0)
|
|
5
|
-
|
|
6
|
-
GEM
|
|
7
|
-
remote: https://rubygems.org/
|
|
8
|
-
specs:
|
|
9
|
-
ansi (1.5.0)
|
|
10
|
-
ast (2.4.0)
|
|
11
|
-
backports (3.11.4)
|
|
12
|
-
bundler-audit (0.6.0)
|
|
13
|
-
bundler (~> 1.2)
|
|
14
|
-
thor (~> 0.18)
|
|
15
|
-
childprocess (0.9.0)
|
|
16
|
-
ffi (~> 1.0, >= 1.0.11)
|
|
17
|
-
coderay (1.1.2)
|
|
18
|
-
diff-lcs (1.3)
|
|
19
|
-
docile (1.3.1)
|
|
20
|
-
ffi (1.9.25)
|
|
21
|
-
formatador (0.2.5)
|
|
22
|
-
guard (2.14.2)
|
|
23
|
-
formatador (>= 0.2.4)
|
|
24
|
-
listen (>= 2.7, < 4.0)
|
|
25
|
-
lumberjack (>= 1.0.12, < 2.0)
|
|
26
|
-
nenv (~> 0.1)
|
|
27
|
-
notiffany (~> 0.0)
|
|
28
|
-
pry (>= 0.9.12)
|
|
29
|
-
shellany (~> 0.0)
|
|
30
|
-
thor (>= 0.18.1)
|
|
31
|
-
guard-bundler (2.1.0)
|
|
32
|
-
bundler (~> 1.0)
|
|
33
|
-
guard (~> 2.2)
|
|
34
|
-
guard-compat (~> 1.1)
|
|
35
|
-
guard-bundler-audit (0.1.4)
|
|
36
|
-
bundler-audit (>= 0.3.1)
|
|
37
|
-
guard (~> 2.0)
|
|
38
|
-
guard-compat (1.2.1)
|
|
39
|
-
guard-rspec (4.7.3)
|
|
40
|
-
guard (~> 2.1)
|
|
41
|
-
guard-compat (~> 1.1)
|
|
42
|
-
rspec (>= 2.99.0, < 4.0)
|
|
43
|
-
guard-rubocop (1.3.0)
|
|
44
|
-
guard (~> 2.0)
|
|
45
|
-
rubocop (~> 0.20)
|
|
46
|
-
hirb (0.7.3)
|
|
47
|
-
iniparse (1.4.4)
|
|
48
|
-
jaro_winkler (1.5.1)
|
|
49
|
-
json (2.1.0)
|
|
50
|
-
listen (3.1.5)
|
|
51
|
-
rb-fsevent (~> 0.9, >= 0.9.4)
|
|
52
|
-
rb-inotify (~> 0.9, >= 0.9.7)
|
|
53
|
-
ruby_dep (~> 1.2)
|
|
54
|
-
lumberjack (1.0.13)
|
|
55
|
-
method_source (0.9.0)
|
|
56
|
-
nenv (0.3.0)
|
|
57
|
-
notiffany (0.1.1)
|
|
58
|
-
nenv (~> 0.1)
|
|
59
|
-
shellany (~> 0.0)
|
|
60
|
-
overcommit (0.46.0)
|
|
61
|
-
childprocess (~> 0.6, >= 0.6.3)
|
|
62
|
-
iniparse (~> 1.4)
|
|
63
|
-
parallel (1.12.1)
|
|
64
|
-
parser (2.5.1.2)
|
|
65
|
-
ast (~> 2.4.0)
|
|
66
|
-
powerpack (0.1.2)
|
|
67
|
-
pry (0.11.3)
|
|
68
|
-
coderay (~> 1.1.0)
|
|
69
|
-
method_source (~> 0.9.0)
|
|
70
|
-
rainbow (3.0.0)
|
|
71
|
-
rake (10.5.0)
|
|
72
|
-
rb-fsevent (0.10.3)
|
|
73
|
-
rb-inotify (0.9.10)
|
|
74
|
-
ffi (>= 0.5.0, < 2)
|
|
75
|
-
rspec (3.7.0)
|
|
76
|
-
rspec-core (~> 3.7.0)
|
|
77
|
-
rspec-expectations (~> 3.7.0)
|
|
78
|
-
rspec-mocks (~> 3.7.0)
|
|
79
|
-
rspec-core (3.7.1)
|
|
80
|
-
rspec-support (~> 3.7.0)
|
|
81
|
-
rspec-expectations (3.7.0)
|
|
82
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
|
83
|
-
rspec-support (~> 3.7.0)
|
|
84
|
-
rspec-mocks (3.7.0)
|
|
85
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
|
86
|
-
rspec-support (~> 3.7.0)
|
|
87
|
-
rspec-support (3.7.1)
|
|
88
|
-
rubocop (0.59.2)
|
|
89
|
-
jaro_winkler (~> 1.5.1)
|
|
90
|
-
parallel (~> 1.10)
|
|
91
|
-
parser (>= 2.5, != 2.5.1.1)
|
|
92
|
-
powerpack (~> 0.1)
|
|
93
|
-
rainbow (>= 2.2.2, < 4.0)
|
|
94
|
-
ruby-progressbar (~> 1.7)
|
|
95
|
-
unicode-display_width (~> 1.0, >= 1.0.1)
|
|
96
|
-
rubocop-rspec (1.29.1)
|
|
97
|
-
rubocop (>= 0.58.0)
|
|
98
|
-
ruby-progressbar (1.10.0)
|
|
99
|
-
ruby_dep (1.5.0)
|
|
100
|
-
shellany (0.0.1)
|
|
101
|
-
simplecov (0.16.1)
|
|
102
|
-
docile (~> 1.1)
|
|
103
|
-
json (>= 1.8, < 3)
|
|
104
|
-
simplecov-html (~> 0.10.0)
|
|
105
|
-
simplecov-console (0.4.2)
|
|
106
|
-
ansi
|
|
107
|
-
hirb
|
|
108
|
-
simplecov
|
|
109
|
-
simplecov-html (0.10.2)
|
|
110
|
-
thor (0.20.0)
|
|
111
|
-
tty-color (0.4.2)
|
|
112
|
-
unicode-display_width (1.4.0)
|
|
113
|
-
yard (0.9.16)
|
|
114
|
-
yard-junk (0.0.7)
|
|
115
|
-
backports
|
|
116
|
-
rainbow
|
|
117
|
-
tty-color
|
|
118
|
-
yard
|
|
119
|
-
yardstick (0.9.9)
|
|
120
|
-
yard (~> 0.8, >= 0.8.7.2)
|
|
121
|
-
|
|
122
|
-
PLATFORMS
|
|
123
|
-
ruby
|
|
124
|
-
|
|
125
|
-
DEPENDENCIES
|
|
126
|
-
bundler (~> 1.16)
|
|
127
|
-
bundler-audit (~> 0.6)
|
|
128
|
-
guard (~> 2.14)
|
|
129
|
-
guard-bundler (~> 2.1)
|
|
130
|
-
guard-bundler-audit (~> 0.1)
|
|
131
|
-
guard-rspec (~> 4.7)
|
|
132
|
-
guard-rubocop (~> 1.2)
|
|
133
|
-
loqate!
|
|
134
|
-
overcommit (~> 0.46)
|
|
135
|
-
pry (~> 0.11)
|
|
136
|
-
rake (~> 10.0)
|
|
137
|
-
rspec (~> 3.0)
|
|
138
|
-
rubocop (~> 0.59)
|
|
139
|
-
rubocop-rspec (~> 1.29)
|
|
140
|
-
simplecov (~> 0.16)
|
|
141
|
-
simplecov-console (~> 0.4)
|
|
142
|
-
yard (~> 0.9)
|
|
143
|
-
yard-junk (~> 0.0.7)
|
|
144
|
-
yardstick (~> 0.9)
|
|
145
|
-
|
|
146
|
-
BUNDLED WITH
|
|
147
|
-
1.16.5
|