google_distance_matrix 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +10 -0
- data/README.md +19 -0
- data/lib/google_distance_matrix.rb +1 -0
- data/lib/google_distance_matrix/client.rb +6 -5
- data/lib/google_distance_matrix/client_cache.rb +20 -0
- data/lib/google_distance_matrix/configuration.rb +1 -0
- data/lib/google_distance_matrix/errors.rb +2 -2
- data/lib/google_distance_matrix/log_subscriber.rb +1 -1
- data/lib/google_distance_matrix/matrix.rb +19 -2
- data/lib/google_distance_matrix/routes_finder.rb +20 -0
- data/lib/google_distance_matrix/version.rb +1 -1
- data/spec/lib/google_distance_matrix/client_cache_spec.rb +25 -0
- data/spec/lib/google_distance_matrix/client_spec.rb +3 -3
- data/spec/lib/google_distance_matrix/configuration_spec.rb +1 -0
- data/spec/lib/google_distance_matrix/matrix_spec.rb +44 -0
- metadata +30 -32
data/CHANGELOG.md
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
## v.0.0.2
|
2
|
+
|
3
|
+
* Renamed RequestError to ServerError.
|
4
|
+
* Added ability to cache API responses using an ActiveSupport::Cache::Store. Simply using URL as cache key.
|
5
|
+
* Explicit instrumentation and logging how many elements requested from the API.
|
6
|
+
|
7
|
+
|
8
|
+
## v.0.0.1
|
9
|
+
|
10
|
+
* First release.
|
data/README.md
CHANGED
@@ -96,6 +96,25 @@ Or install it yourself as:
|
|
96
96
|
|
97
97
|
|
98
98
|
|
99
|
+
## Configuration
|
100
|
+
|
101
|
+
Configuration is done directly on a matrix or via GoogleDistanceMatrix.default_configuration.
|
102
|
+
Apart from configuration on requests it is also possible to provide your own logger class and
|
103
|
+
set a cache.
|
104
|
+
|
105
|
+
### Request cache
|
106
|
+
|
107
|
+
Given Google's limit to the service you may have the need to cache requests. This is done by simply
|
108
|
+
using URL as cache keys. Cache we'll accept should provide a default ActiveSupport::Chache::Store interface.
|
109
|
+
|
110
|
+
GoogleDistanceMatrix.default_configuration do |config|
|
111
|
+
config.cache = ActiveSupport::Cache.lookup_store :your_store, {
|
112
|
+
expires_in: 12.hours
|
113
|
+
# ..or other options you like for your store
|
114
|
+
}
|
115
|
+
end
|
116
|
+
|
117
|
+
|
99
118
|
|
100
119
|
## Contributing
|
101
120
|
|
@@ -11,6 +11,7 @@ require "google_distance_matrix/errors"
|
|
11
11
|
require "google_distance_matrix/configuration"
|
12
12
|
require "google_distance_matrix/url_builder"
|
13
13
|
require "google_distance_matrix/client"
|
14
|
+
require "google_distance_matrix/client_cache"
|
14
15
|
require "google_distance_matrix/routes_finder"
|
15
16
|
require "google_distance_matrix/matrix"
|
16
17
|
require "google_distance_matrix/places"
|
@@ -8,10 +8,11 @@ module GoogleDistanceMatrix
|
|
8
8
|
UNKNOWN_ERROR
|
9
9
|
]
|
10
10
|
|
11
|
-
def get(url)
|
11
|
+
def get(url, options = {})
|
12
12
|
uri = URI.parse url
|
13
|
+
instrumentation = {url: url}.merge(options[:instrumentation] || {})
|
13
14
|
|
14
|
-
response = ActiveSupport::Notifications.instrument "client_request_matrix_data.google_distance_matrix",
|
15
|
+
response = ActiveSupport::Notifications.instrument "client_request_matrix_data.google_distance_matrix", instrumentation do
|
15
16
|
Net::HTTP.get_response uri
|
16
17
|
end
|
17
18
|
|
@@ -23,12 +24,12 @@ module GoogleDistanceMatrix
|
|
23
24
|
when Net::HTTPClientError
|
24
25
|
fail ClientError.new response
|
25
26
|
when Net::HTTPServerError
|
26
|
-
fail
|
27
|
+
fail ServerError.new response
|
27
28
|
else # Handle this as a request error for now. Maybe fine tune this more later.
|
28
|
-
fail
|
29
|
+
fail ServerError.new response
|
29
30
|
end
|
30
31
|
rescue Timeout::Error => error
|
31
|
-
fail
|
32
|
+
fail ServerError.new error
|
32
33
|
end
|
33
34
|
|
34
35
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module GoogleDistanceMatrix
|
2
|
+
class ClientCache
|
3
|
+
attr_reader :client, :cache
|
4
|
+
|
5
|
+
def self.key(url)
|
6
|
+
url
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(client, cache)
|
10
|
+
@client = client
|
11
|
+
@cache = cache
|
12
|
+
end
|
13
|
+
|
14
|
+
def get(url, options = {})
|
15
|
+
cache.fetch self.class.key(url) do
|
16
|
+
client.get url, options
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -34,7 +34,7 @@ module GoogleDistanceMatrix
|
|
34
34
|
# This includes wire errors like timeouts etc, and server errors
|
35
35
|
# like 5xx. Inspect error_or_response for more information.
|
36
36
|
#
|
37
|
-
class
|
37
|
+
class ServerError < Error
|
38
38
|
attr_reader :error_or_response
|
39
39
|
|
40
40
|
def initialize(error_or_response)
|
@@ -42,7 +42,7 @@ module GoogleDistanceMatrix
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def to_s
|
45
|
-
"GoogleDistanceMatrix::
|
45
|
+
"GoogleDistanceMatrix::ServerError - #{error_or_response.inspect}."
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
@@ -5,7 +5,7 @@ module GoogleDistanceMatrix
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def client_request_matrix_data(event)
|
8
|
-
logger.info "(#{event.duration}ms) GET #{event.payload[:url]}", tag: :client
|
8
|
+
logger.info "(#{event.duration}ms) (elements: #{event.payload[:elements]}) GET #{event.payload[:url]}", tag: :client
|
9
9
|
end
|
10
10
|
end
|
11
11
|
end
|
@@ -68,10 +68,15 @@ module GoogleDistanceMatrix
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def reload
|
71
|
+
clear_from_cache!
|
71
72
|
@data = load_matrix
|
72
73
|
self
|
73
74
|
end
|
74
75
|
|
76
|
+
def reset!
|
77
|
+
@data = nil
|
78
|
+
end
|
79
|
+
|
75
80
|
def loaded?
|
76
81
|
@data.present?
|
77
82
|
end
|
@@ -103,7 +108,7 @@ module GoogleDistanceMatrix
|
|
103
108
|
end
|
104
109
|
|
105
110
|
def load_matrix
|
106
|
-
parsed = JSON.parse client.get(url).body
|
111
|
+
parsed = JSON.parse client.get(url, instrumentation: {elements: origins.length * destinations.length}).body
|
107
112
|
|
108
113
|
parsed["rows"].each_with_index.map do |row, origin_index|
|
109
114
|
origin = origins[origin_index]
|
@@ -116,7 +121,19 @@ module GoogleDistanceMatrix
|
|
116
121
|
end
|
117
122
|
|
118
123
|
def client
|
119
|
-
|
124
|
+
client = Client.new
|
125
|
+
|
126
|
+
if configuration.cache
|
127
|
+
ClientCache.new client, configuration.cache
|
128
|
+
else
|
129
|
+
client
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def clear_from_cache!
|
134
|
+
if configuration.cache
|
135
|
+
configuration.cache.delete ClientCache.key(url)
|
136
|
+
end
|
120
137
|
end
|
121
138
|
end
|
122
139
|
end
|
@@ -72,20 +72,40 @@ module GoogleDistanceMatrix
|
|
72
72
|
end
|
73
73
|
|
74
74
|
|
75
|
+
# Public: Finds shortes route by distance to a place.
|
76
|
+
#
|
77
|
+
# place - The place, or object place was built from, you want the shortest route to
|
78
|
+
#
|
79
|
+
# Returns shortest route, or nil if no routes had status ok
|
75
80
|
def shortest_route_by_distance_to(place_or_object_place_was_built_from)
|
76
81
|
routes = routes_for place_or_object_place_was_built_from
|
77
82
|
select_ok_routes(routes).min_by &:distance_in_meters
|
78
83
|
end
|
79
84
|
|
85
|
+
# Public: Finds shortes route by distance to a place.
|
86
|
+
#
|
87
|
+
# place - The place, or object place was built from, you want the shortest route to
|
88
|
+
#
|
89
|
+
# Returns shortest route, fails if any of the routes are not ok
|
80
90
|
def shortest_route_by_distance_to!(place_or_object_place_was_built_from)
|
81
91
|
routes_for!(place_or_object_place_was_built_from).min_by &:distance_in_meters
|
82
92
|
end
|
83
93
|
|
94
|
+
# Public: Finds shortes route by duration to a place.
|
95
|
+
#
|
96
|
+
# place - The place, or object place was built from, you want the shortest route to
|
97
|
+
#
|
98
|
+
# Returns shortest route, or nil if no routes had status ok
|
84
99
|
def shortest_route_by_duration_to(place_or_object_place_was_built_from)
|
85
100
|
routes = routes_for place_or_object_place_was_built_from
|
86
101
|
select_ok_routes(routes).min_by &:duration_in_seconds
|
87
102
|
end
|
88
103
|
|
104
|
+
# Public: Finds shortes route by duration to a place.
|
105
|
+
#
|
106
|
+
# place - The place, or object place was built from, you want the shortest route to
|
107
|
+
#
|
108
|
+
# Returns shortest route, fails if any of the routes are not ok
|
89
109
|
def shortest_route_by_duration_to!(place_or_object_place_was_built_from)
|
90
110
|
routes_for!(place_or_object_place_was_built_from).min_by &:duration_in_seconds
|
91
111
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe GoogleDistanceMatrix::ClientCache do
|
4
|
+
let(:url) { "http://www.example.com" }
|
5
|
+
let(:options) { {hello: :options} }
|
6
|
+
|
7
|
+
let(:client) { mock get: "data" }
|
8
|
+
let(:cache) { mock }
|
9
|
+
|
10
|
+
subject { described_class.new client, cache }
|
11
|
+
|
12
|
+
describe "#get" do
|
13
|
+
it "returns from cache if it hits" do
|
14
|
+
cache.should_receive(:fetch).with(url).and_return "cached-data"
|
15
|
+
expect(subject.get(url, options)).to eq "cached-data"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "asks client when cache miss" do
|
19
|
+
client.should_receive(:get).with(url, options).and_return "api-data"
|
20
|
+
cache.should_receive(:fetch) { |&block| block.call }
|
21
|
+
|
22
|
+
expect(subject.get(url, options)).to eq "api-data"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -44,7 +44,7 @@ describe GoogleDistanceMatrix::Client, :request_recordings do
|
|
44
44
|
before { stub_request(:get, url).to_return status: [500, "Internal Server Error"] }
|
45
45
|
|
46
46
|
it "wraps the error http response" do
|
47
|
-
expect { subject.get(url_builder.url) }.to raise_error GoogleDistanceMatrix::
|
47
|
+
expect { subject.get(url_builder.url) }.to raise_error GoogleDistanceMatrix::ServerError
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
@@ -52,7 +52,7 @@ describe GoogleDistanceMatrix::Client, :request_recordings do
|
|
52
52
|
before { stub_request(:get, url).to_timeout }
|
53
53
|
|
54
54
|
it "wraps the error from Net::HTTP" do
|
55
|
-
expect { subject.get(url_builder.url).body }.to raise_error GoogleDistanceMatrix::
|
55
|
+
expect { subject.get(url_builder.url).body }.to raise_error GoogleDistanceMatrix::ServerError
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
@@ -60,7 +60,7 @@ describe GoogleDistanceMatrix::Client, :request_recordings do
|
|
60
60
|
before { stub_request(:get, url).to_return status: [999, "Unknown"] }
|
61
61
|
|
62
62
|
it "wraps the error http response" do
|
63
|
-
expect { subject.get(url_builder.url) }.to raise_error GoogleDistanceMatrix::
|
63
|
+
expect { subject.get(url_builder.url) }.to raise_error GoogleDistanceMatrix::ServerError
|
64
64
|
end
|
65
65
|
end
|
66
66
|
end
|
@@ -93,6 +93,50 @@ describe GoogleDistanceMatrix::Matrix do
|
|
93
93
|
end
|
94
94
|
end
|
95
95
|
|
96
|
+
describe "making API requests", :request_recordings do
|
97
|
+
it "loads correctly" do
|
98
|
+
stub_request(:get, url).to_return body: recorded_request_for(:success)
|
99
|
+
expect(subject.data[0][0].distance_in_meters).to eq 2032
|
100
|
+
end
|
101
|
+
|
102
|
+
context "no cache" do
|
103
|
+
it "makes multiple requests to same url" do
|
104
|
+
stub = stub_request(:get, url).to_return body: recorded_request_for(:success)
|
105
|
+
subject.data
|
106
|
+
subject.reset!
|
107
|
+
subject.data
|
108
|
+
|
109
|
+
stub.should have_been_requested.twice
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
context "with cache" do
|
114
|
+
before do
|
115
|
+
subject.configure do |config|
|
116
|
+
config.cache = ActiveSupport::Cache.lookup_store :memory_store
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
it "makes one requests to same url" do
|
121
|
+
stub = stub_request(:get, url).to_return body: recorded_request_for(:success)
|
122
|
+
subject.data
|
123
|
+
subject.reset!
|
124
|
+
subject.data
|
125
|
+
|
126
|
+
stub.should have_been_requested.once
|
127
|
+
end
|
128
|
+
|
129
|
+
it "clears the cache key on reload" do
|
130
|
+
stub = stub_request(:get, url).to_return body: recorded_request_for(:success)
|
131
|
+
subject.data
|
132
|
+
subject.reload
|
133
|
+
subject.data
|
134
|
+
|
135
|
+
stub.should have_been_requested.twice
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
96
140
|
describe "#data", :request_recordings do
|
97
141
|
context "success" do
|
98
142
|
let!(:api_request_stub) { stub_request(:get, url).to_return body: recorded_request_for(:success) }
|
metadata
CHANGED
@@ -2,25 +2,25 @@
|
|
2
2
|
name: google_distance_matrix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Thorbjørn Hermansen
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-08-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
prerelease: false
|
16
|
-
name: activesupport
|
17
|
-
type: :runtime
|
18
15
|
version_requirements: !ruby/object:Gem::Requirement
|
19
16
|
requirements:
|
20
17
|
- - ~>
|
21
18
|
- !ruby/object:Gem::Version
|
22
19
|
version: 3.2.13
|
23
20
|
none: false
|
21
|
+
name: activesupport
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
24
|
requirement: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
26
|
- - ~>
|
@@ -28,15 +28,15 @@ dependencies:
|
|
28
28
|
version: 3.2.13
|
29
29
|
none: false
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
|
-
prerelease: false
|
32
|
-
name: activemodel
|
33
|
-
type: :runtime
|
34
31
|
version_requirements: !ruby/object:Gem::Requirement
|
35
32
|
requirements:
|
36
33
|
- - ~>
|
37
34
|
- !ruby/object:Gem::Version
|
38
35
|
version: 3.2.13
|
39
36
|
none: false
|
37
|
+
name: activemodel
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
40
|
requirement: !ruby/object:Gem::Requirement
|
41
41
|
requirements:
|
42
42
|
- - ~>
|
@@ -44,15 +44,15 @@ dependencies:
|
|
44
44
|
version: 3.2.13
|
45
45
|
none: false
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
|
-
prerelease: false
|
48
|
-
name: google_business_api_url_signer
|
49
|
-
type: :runtime
|
50
47
|
version_requirements: !ruby/object:Gem::Requirement
|
51
48
|
requirements:
|
52
49
|
- - ~>
|
53
50
|
- !ruby/object:Gem::Version
|
54
51
|
version: 0.0.1
|
55
52
|
none: false
|
53
|
+
name: google_business_api_url_signer
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
56
|
requirement: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
58
|
- - ~>
|
@@ -60,15 +60,15 @@ dependencies:
|
|
60
60
|
version: 0.0.1
|
61
61
|
none: false
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
|
-
prerelease: false
|
64
|
-
name: bundler
|
65
|
-
type: :development
|
66
63
|
version_requirements: !ruby/object:Gem::Requirement
|
67
64
|
requirements:
|
68
65
|
- - ~>
|
69
66
|
- !ruby/object:Gem::Version
|
70
67
|
version: '1.3'
|
71
68
|
none: false
|
69
|
+
name: bundler
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
74
|
- - ~>
|
@@ -76,15 +76,15 @@ dependencies:
|
|
76
76
|
version: '1.3'
|
77
77
|
none: false
|
78
78
|
- !ruby/object:Gem::Dependency
|
79
|
-
prerelease: false
|
80
|
-
name: rspec
|
81
|
-
type: :development
|
82
79
|
version_requirements: !ruby/object:Gem::Requirement
|
83
80
|
requirements:
|
84
81
|
- - ~>
|
85
82
|
- !ruby/object:Gem::Version
|
86
83
|
version: '2.13'
|
87
84
|
none: false
|
85
|
+
name: rspec
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
88
|
requirement: !ruby/object:Gem::Requirement
|
89
89
|
requirements:
|
90
90
|
- - ~>
|
@@ -92,15 +92,15 @@ dependencies:
|
|
92
92
|
version: '2.13'
|
93
93
|
none: false
|
94
94
|
- !ruby/object:Gem::Dependency
|
95
|
-
prerelease: false
|
96
|
-
name: shoulda-matchers
|
97
|
-
type: :development
|
98
95
|
version_requirements: !ruby/object:Gem::Requirement
|
99
96
|
requirements:
|
100
97
|
- - ~>
|
101
98
|
- !ruby/object:Gem::Version
|
102
99
|
version: 2.0.0
|
103
100
|
none: false
|
101
|
+
name: shoulda-matchers
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
104
|
requirement: !ruby/object:Gem::Requirement
|
105
105
|
requirements:
|
106
106
|
- - ~>
|
@@ -108,15 +108,15 @@ dependencies:
|
|
108
108
|
version: 2.0.0
|
109
109
|
none: false
|
110
110
|
- !ruby/object:Gem::Dependency
|
111
|
-
prerelease: false
|
112
|
-
name: webmock
|
113
|
-
type: :development
|
114
111
|
version_requirements: !ruby/object:Gem::Requirement
|
115
112
|
requirements:
|
116
113
|
- - ~>
|
117
114
|
- !ruby/object:Gem::Version
|
118
115
|
version: '1.11'
|
119
116
|
none: false
|
117
|
+
name: webmock
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
120
|
requirement: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - ~>
|
@@ -124,15 +124,15 @@ dependencies:
|
|
124
124
|
version: '1.11'
|
125
125
|
none: false
|
126
126
|
- !ruby/object:Gem::Dependency
|
127
|
-
prerelease: false
|
128
|
-
name: rake
|
129
|
-
type: :development
|
130
127
|
version_requirements: !ruby/object:Gem::Requirement
|
131
128
|
requirements:
|
132
129
|
- - ! '>='
|
133
130
|
- !ruby/object:Gem::Version
|
134
131
|
version: '0'
|
135
132
|
none: false
|
133
|
+
name: rake
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
136
|
requirement: !ruby/object:Gem::Requirement
|
137
137
|
requirements:
|
138
138
|
- - ! '>='
|
@@ -148,6 +148,7 @@ extra_rdoc_files: []
|
|
148
148
|
files:
|
149
149
|
- .gitignore
|
150
150
|
- .rbenv-version
|
151
|
+
- CHANGELOG.md
|
151
152
|
- Gemfile
|
152
153
|
- LICENSE.txt
|
153
154
|
- README.md
|
@@ -155,6 +156,7 @@ files:
|
|
155
156
|
- google_distance_matrix.gemspec
|
156
157
|
- lib/google_distance_matrix.rb
|
157
158
|
- lib/google_distance_matrix/client.rb
|
159
|
+
- lib/google_distance_matrix/client_cache.rb
|
158
160
|
- lib/google_distance_matrix/configuration.rb
|
159
161
|
- lib/google_distance_matrix/errors.rb
|
160
162
|
- lib/google_distance_matrix/log_subscriber.rb
|
@@ -167,6 +169,7 @@ files:
|
|
167
169
|
- lib/google_distance_matrix/routes_finder.rb
|
168
170
|
- lib/google_distance_matrix/url_builder.rb
|
169
171
|
- lib/google_distance_matrix/version.rb
|
172
|
+
- spec/lib/google_distance_matrix/client_cache_spec.rb
|
170
173
|
- spec/lib/google_distance_matrix/client_spec.rb
|
171
174
|
- spec/lib/google_distance_matrix/configuration_spec.rb
|
172
175
|
- spec/lib/google_distance_matrix/logger_spec.rb
|
@@ -190,18 +193,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
190
193
|
requirements:
|
191
194
|
- - ! '>='
|
192
195
|
- !ruby/object:Gem::Version
|
193
|
-
segments:
|
194
|
-
- 0
|
195
|
-
hash: -254032637546983924
|
196
196
|
version: '0'
|
197
197
|
none: false
|
198
198
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
199
199
|
requirements:
|
200
200
|
- - ! '>='
|
201
201
|
- !ruby/object:Gem::Version
|
202
|
-
segments:
|
203
|
-
- 0
|
204
|
-
hash: -254032637546983924
|
205
202
|
version: '0'
|
206
203
|
none: false
|
207
204
|
requirements: []
|
@@ -211,6 +208,7 @@ signing_key:
|
|
211
208
|
specification_version: 3
|
212
209
|
summary: Ruby client for The Google Distance Matrix API
|
213
210
|
test_files:
|
211
|
+
- spec/lib/google_distance_matrix/client_cache_spec.rb
|
214
212
|
- spec/lib/google_distance_matrix/client_spec.rb
|
215
213
|
- spec/lib/google_distance_matrix/configuration_spec.rb
|
216
214
|
- spec/lib/google_distance_matrix/logger_spec.rb
|