gistance 1.0.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.
Files changed (29) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +4 -0
  3. data/CONTRIBUTING.md +32 -0
  4. data/LICENSE +20 -0
  5. data/README.md +102 -0
  6. data/Rakefile +42 -0
  7. data/gistance.gemspec +30 -0
  8. data/lib/gistance/client/distance_matrix.rb +52 -0
  9. data/lib/gistance/client.rb +26 -0
  10. data/lib/gistance/configuration.rb +49 -0
  11. data/lib/gistance/connection.rb +28 -0
  12. data/lib/gistance/error.rb +52 -0
  13. data/lib/gistance/request.rb +29 -0
  14. data/lib/gistance/response/raise_error.rb +18 -0
  15. data/lib/gistance/version.rb +5 -0
  16. data/lib/gistance.rb +25 -0
  17. data/spec/cassettes/Gistance_Client_DistanceMatrix/_distance_matrix/returns_an_array_of_destination_addresses.yml +66 -0
  18. data/spec/cassettes/Gistance_Client_DistanceMatrix/_distance_matrix/returns_an_array_of_origin_addresses.yml +66 -0
  19. data/spec/cassettes/Gistance_Client_DistanceMatrix/_distance_matrix/returns_the_destination_address.yml +66 -0
  20. data/spec/cassettes/Gistance_Client_DistanceMatrix/_distance_matrix/returns_the_distance_between_origin_and_destination.yml +66 -0
  21. data/spec/cassettes/Gistance_Client_DistanceMatrix/_distance_matrix/returns_the_origin_address.yml +66 -0
  22. data/spec/cassettes/Gistance_Client_DistanceMatrix/_distance_matrix/returns_the_travel_duration_between_origin_and_destination.yml +66 -0
  23. data/spec/lib/gistance/client/distance_matrix_spec.rb +40 -0
  24. data/spec/lib/gistance/client_spec.rb +83 -0
  25. data/spec/lib/gistance/request_spec.rb +11 -0
  26. data/spec/lib/gistance_spec.rb +32 -0
  27. data/spec/spec_helper.rb +40 -0
  28. data/spec/support/shared_examples/error.rb +16 -0
  29. metadata +154 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: be45454a9c540c04313d8a0b0c98859a193bc73e
4
+ data.tar.gz: 45714fb08ea043676b2b2ac69239f99095de65ee
5
+ SHA512:
6
+ metadata.gz: 3ad1aff0b8d2b1695aab6e9460512c83aea526eb298a6f1a9a2ec8ce10c65f9ba7beebb1fc4280570c86582207d3c94fa292d2a27fba16693e4146f02e088a86
7
+ data.tar.gz: 8af510bab65b26500fd37630cca0f145a11ff369a3f0dac7b04cfb2fe8b982b20a4f372faaca815ebab520e4fb29779feaf11366c998634d40af6e3aa942dfd5
data/.yardopts ADDED
@@ -0,0 +1,4 @@
1
+ --no-private
2
+ --quiet
3
+ --markup=markdown
4
+ --exclude lib/lieu/response
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,32 @@
1
+ # Contributing
2
+
3
+ ## Running the test suite
4
+
5
+ bundle exec rake spec
6
+
7
+ ### Code quality
8
+
9
+ Code quality is checked with [cane](https://github.com/square/cane) configured in `Rakefile`.
10
+
11
+ Build fails if code quality thresholds **are not met**.
12
+
13
+ ### Code coverage
14
+
15
+ When running the test suite a test coverage report is generated with [SimpleCov](https://github.com/colszowka/simplecov) in `coverage/index.html`.
16
+
17
+ Build fails if coverage is below **99%**.
18
+
19
+ ## Writing new tests
20
+ Gistance uses [VCR](https://github.com/vcr/vcr) for recording and playing back API fixtures (in `spec/cassettes`) during test runs.
21
+
22
+ ## Documentation
23
+
24
+ Documentation is generated with [YARD](http://yardoc.org/).
25
+
26
+ ## Workflow
27
+
28
+ 1. Fork [Gistance](https://github.com/sush/gistance)
29
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
30
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
31
+ 4. Push to the branch (`git push origin my-new-feature`)
32
+ 5. Create a new Pull Request
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) [2014] [Aylic Petit]
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ 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, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,102 @@
1
+ Simple Ruby wrapper for the [Google Distance Matrix API](https://developers.google.com/places/documentation).
2
+
3
+ **Current version**: [![Gem Version](https://badge.fury.io/rb/gistance.png)](http://badge.fury.io/rb/gistance)
4
+
5
+ **Build status**:        [![Build Status](https://secure.travis-ci.org/sush/gistance.png?branch=master)](http://travis-ci.org/sush/gistance)
6
+
7
+ **Code metrics**:
8
+      [![Code Climate](https://codeclimate.com/github/sush/gistance.png)](https://codeclimate.com/github/sush/gistance)
9
+ [![Coverage Status](https://coveralls.io/repos/sush/gistance/badge.png?branch=master)](https://coveralls.io/r/sush/gistance?branch=master)
10
+
11
+ **Ruby support**:
12
+
13
+ - 1.9.2
14
+ - 1.9.3
15
+ - 2.0.0
16
+ - 2.1.1
17
+
18
+ ## Installation
19
+
20
+ Install via Rubygems
21
+
22
+ gem install gistance
23
+
24
+ or add to your Gemfile
25
+
26
+ gem 'gistance'
27
+
28
+ ### Configuration
29
+
30
+ API methods are available as module methods
31
+
32
+ ```ruby
33
+ Gistance.configure do |c|
34
+ c.api_key = 'YOUR_API_KEY'
35
+ c.unit = 'imperial' # default to metric
36
+ c.language = 'fr' # default to en
37
+ c.sensor = true # default to false
38
+ end
39
+ ```
40
+
41
+ or as client instance methods
42
+
43
+ ```ruby
44
+ Gistance::Client.new(
45
+ api_key: 'YOUR_API_KEY',
46
+ unit: 'imperial',
47
+ language: 'fr',
48
+ sensor: true
49
+ )
50
+ ```
51
+
52
+ The `unit`, `language` and `sensor` parameters can be set globally or can be provided for every request if passed as parameters.
53
+
54
+ ## Authentication
55
+
56
+ Gistance only supports authentication via an API key.
57
+
58
+ You can request one following these [steps](https://developers.google.com/maps/documentation/distancematrix/#api_key).
59
+
60
+ ## Usage
61
+
62
+ ```ruby
63
+ distances = Gistance.distance_matrix(
64
+ origins: ["37.769541, -122.486747"],
65
+ destinations: ["37.740497, -122.442887"]
66
+ )
67
+
68
+ distances.origin_addresses
69
+ # => ["Golden Gate Park"]
70
+
71
+ # etc…
72
+ ```
73
+
74
+ ## Features
75
+
76
+ Gistance supports all the [Google Distance Matrix parameters](https://developers.google.com/maps/documentation/distancematrix/#RequestParameters)
77
+
78
+ Complete Gistance public API's documentation [here](http://rubydoc.info/gems/gistance/frames).
79
+
80
+ ## Similar libraries
81
+
82
+ - [google_distance_matrix](https://github.com/Skalar/google_distance_matrix)
83
+
84
+ ## Versioning
85
+ Gistance follows the principles of [semantic versioning](http://semver.org).
86
+
87
+ 1. Patch level releases contain only bug fixes.
88
+ 2. Minor releases contain backward-compatible new features.
89
+ 3. Major new releases contain backwards-incompatible changes to the public API.
90
+
91
+ ## Contributing
92
+
93
+ Pull Requests are welcome !
94
+
95
+ Please refer to the [Contributing guide](https://github.com/sush/gistance/blob/master/CONTRIBUTING.md) for more details on how to run the test suite and to contribute.
96
+
97
+
98
+ ## Copyright
99
+
100
+ Copyright © 2014 Aylic Petit
101
+
102
+ Released under the terms of the MIT licence. See the [LICENSE](https://github.com/sush/gistance/blob/master/LICENSE) file for more details.
data/Rakefile ADDED
@@ -0,0 +1,42 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rspec/core/rake_task'
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ begin
8
+ require 'cane/rake_task'
9
+
10
+ desc 'Run cane to check quality metrics'
11
+ Cane::RakeTask.new(:quality) do |cane|
12
+ cane.add_threshold 'coverage/.last_run.json', :>=, 99
13
+ cane.abc_glob = '{lib}/**/*.rb'
14
+ cane.abc_max = 15
15
+ cane.style_measure = 100
16
+ cane.style_exclude = %w[spec/spec_helper.rb]
17
+ cane.canefile = '.cane'
18
+ end
19
+ rescue LoadError
20
+ end
21
+
22
+ namespace :doc do
23
+ begin
24
+ require 'yard'
25
+
26
+ YARD::Rake::YardocTask.new do |task|
27
+ task.files = ['README.md', 'LICENSE.md', 'lib/**/*.rb']
28
+ task.options = [
29
+ '--output-dir', 'doc/yard',
30
+ '--markup', 'markdown'
31
+ ]
32
+ end
33
+ rescue LoadError
34
+ end
35
+ end
36
+
37
+ Rake::Task[:spec].enhance do
38
+ Rake::Task[:quality].invoke
39
+ end
40
+
41
+ task :test => :spec
42
+ task :default => :spec
data/gistance.gemspec ADDED
@@ -0,0 +1,30 @@
1
+ # encoding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'gistance/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = 'gistance'
8
+ gem.version = Gistance::VERSION.dup
9
+ gem.license = 'MIT'
10
+
11
+ gem.summary = %q{Google Distance Matrix API Ruby wrapper}
12
+ gem.description = %q{Simple Ruby wrapper for the Google Distance Matrix API.}
13
+ gem.homepage = 'https://github.com/sush/gistance'
14
+
15
+ gem.authors = ['Aylic Petit']
16
+ gem.email = ['sush@users.noreply.github.com']
17
+
18
+ gem.required_ruby_version = '>= 1.9.2'
19
+
20
+ gem.files = %w[.yardopts LICENSE README.md CONTRIBUTING.md Rakefile gistance.gemspec]
21
+ gem.files += Dir.glob('{spec,lib}/**/*.rb')
22
+ gem.require_paths = ['lib']
23
+ gem.test_files = Dir.glob('spec/**/*')
24
+
25
+ gem.add_dependency 'faraday', '~> 0.8.9'
26
+ gem.add_dependency 'faraday_middleware', '~> 0.9.0'
27
+ gem.add_dependency 'hashie', '~>2.0.5'
28
+ gem.add_dependency 'json', '~>1.8.1'
29
+ gem.add_dependency 'multi_json', '~>1.9.2'
30
+ end
@@ -0,0 +1,52 @@
1
+ module Gistance
2
+ class Client
3
+ # Methods for the Distance Matrix API
4
+ #
5
+ # @see https://developers.google.com/maps/documentation/distancematrix
6
+ module DistanceMatrix
7
+ # Calculate distances for a matrix of origins and destinations.
8
+ # @param options [Hash] a customizable set of options
9
+ # @option options [Hash] :origins an array of origins
10
+ # @option options [Hash] :destinations an array of destination
11
+ # @return [Hashie::Mash] the distance between origins and destinations
12
+ # @see https://developers.google.com/maps/documentation/distancematrix/#DistanceMatrixRequests
13
+ # @example
14
+ # Gistance.distance_matrix(
15
+ # origins: ["48.92088132,2.210950607"],
16
+ # destinations: ["48.922024,2.206292"]
17
+ # )
18
+ def distance_matrix(options={})
19
+ options[:origins] = format_locations_array(options[:origins])
20
+ options[:destinations] = format_locations_array(options[:destinations])
21
+
22
+ delete_status_from_response(get(options))
23
+ end
24
+
25
+ private
26
+
27
+ def format_locations_array(locations)
28
+ locations.map { |location| format_location(location) }.join('|')
29
+ end
30
+
31
+ def format_location(location)
32
+ return location if location_is_coordinates?(location)
33
+
34
+ location.split(' ').join('+')
35
+ end
36
+
37
+ def location_is_coordinates?(location)
38
+ location.to_s =~ /^\s*-?\d+\.\d+\,\s?-?\d+\.\d+\s*$/
39
+ end
40
+
41
+ def delete_status_from_response(response)
42
+ response.delete(:status)
43
+
44
+ response.rows.each do |row|
45
+ row['elements'].each { |el| el.delete(:status) }
46
+ end
47
+
48
+ response
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,26 @@
1
+ require 'gistance/connection'
2
+ require 'gistance/request'
3
+
4
+ require 'gistance/client/distance_matrix'
5
+
6
+ module Gistance
7
+ # Client for the Google Distance Matrix API
8
+ #
9
+ # @see https://developers.google.com/maps/documentation/distancematrix
10
+ class Client
11
+ attr_accessor(*Configuration::VALID_OPTIONS)
12
+
13
+ def initialize(options={})
14
+ options = Gistance.options.merge(options)
15
+
16
+ Configuration::VALID_OPTIONS.each do |key|
17
+ send("#{key}=", options[key])
18
+ end
19
+ end
20
+
21
+ include Gistance::Connection
22
+ include Gistance::Request
23
+
24
+ include Gistance::Client::DistanceMatrix
25
+ end
26
+ end
@@ -0,0 +1,49 @@
1
+ module Gistance
2
+ # Methods for Gistance configuration
3
+ module Configuration
4
+ # Configurable options
5
+ VALID_OPTIONS = [
6
+ :api_endpoint,
7
+ :api_key,
8
+ :language,
9
+ :unit,
10
+ :sensor
11
+ ].freeze
12
+
13
+ # Default Google Distance Matrix API endpoint
14
+ DEFAULT_API_ENDPOINT = 'https://maps.googleapis.com/maps/api/distancematrix/json'
15
+
16
+ attr_accessor(*VALID_OPTIONS)
17
+
18
+ # @private
19
+ def self.extended(base_obj)
20
+ base_obj.initialize_default_options
21
+ end
22
+
23
+ # Set configuration options using a block
24
+ def configure
25
+ yield self
26
+ end
27
+
28
+ # Default options
29
+ def options
30
+ VALID_OPTIONS.inject({}){ |o, k| o.merge!(k => send(k)) }
31
+ end
32
+
33
+ # Initialize default options
34
+ def initialize_default_options
35
+ self.api_endpoint = DEFAULT_API_ENDPOINT
36
+ self.api_key = nil
37
+ self.language = 'en'
38
+ self.unit = 'metric'
39
+ self.sensor = false
40
+ end
41
+
42
+ # Reset configuration options to default values
43
+ def reset!
44
+ initialize_default_options
45
+
46
+ self
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,28 @@
1
+ require 'faraday_middleware'
2
+ require 'gistance/response/raise_error'
3
+
4
+ module Gistance
5
+ # Faraday connection methods
6
+ module Connection
7
+ private
8
+
9
+ def connection
10
+ options = {
11
+ ssl: { verify: false },
12
+ url: self.api_endpoint
13
+ }
14
+
15
+ connection = Faraday.new(options) do |conn|
16
+ conn.response(:mashify)
17
+ conn.response(:json, content_type: /\bjson$/)
18
+
19
+ conn.use(Gistance::Response::RaiseError)
20
+ conn.use(FaradayMiddleware::FollowRedirects, limit: 3)
21
+
22
+ conn.adapter(Faraday.default_adapter)
23
+ end
24
+
25
+ connection
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,52 @@
1
+ require 'multi_json'
2
+
3
+ module Gistance
4
+ # Custom error class
5
+ class Error < StandardError
6
+ # Returns the Error based on status and response message.
7
+ #
8
+ # @param [Hash] response HTTP response
9
+ # @return [Gistance::Error]
10
+ def self.from_response(response)
11
+ status = ::MultiJson.load(response[:body])['status']
12
+
13
+ case status
14
+ when 'INVALID_REQUEST'
15
+ raise Gistance::InvalidRequest, status
16
+ when 'MAX_ELEMENTS_EXCEEDED'
17
+ raise Gistance::MaxElementsExceeded, status
18
+ when 'OVER_QUERY_LIMIT'
19
+ raise Gistance::OverQueryLimit, status
20
+ when 'REQUEST_DENIED'
21
+ raise Gistance::RequestDenied, status
22
+ when 'UNKNOWN_ERROR'
23
+ raise Gistance::UnknownError, status
24
+ when 'NOT_FOUND'
25
+ raise Gistance::NotFound, status
26
+ when 'ZERO_RESULTS'
27
+ raise Gistance::ZeroResults, status
28
+ end
29
+ end
30
+ end
31
+
32
+ # Raised when API returns INVALID_REQUEST
33
+ class InvalidRequest < Error; end
34
+ #
35
+ # Raised when API returns MAX_ELEMENTS_EXCEEDED
36
+ class MaxElementsExceeded < Error; end
37
+
38
+ # Raised when API returns OVER_QUERY_LIMIT
39
+ class OverQueryLimit < Error; end
40
+
41
+ # Raised when API returns REQUEST_DENIED
42
+ class RequestDenied < Error; end
43
+
44
+ # Raised when API returns UNKNOWN_ERROR
45
+ class UnknownError < Error; end
46
+
47
+ # Raised when API returns NOT_FOUND
48
+ class NotFound < Error; end
49
+
50
+ # Raised when API returns ZERO_RESULTS
51
+ class ZeroResults < Error; end
52
+ end
@@ -0,0 +1,29 @@
1
+ module Gistance
2
+ # Methods for HTTP requests
3
+ module Request
4
+ # Make a HTTP GET request.
5
+ #
6
+ # @param path [String] The path, relative to api_endpoint
7
+ # @param options [Hash] query params for request
8
+ # @return [Hashie::Mash]
9
+ def get(options={})
10
+ request(:get, options)
11
+ end
12
+
13
+ private
14
+
15
+ def request(method, options)
16
+ response = connection.send(method) do |request|
17
+ request.params[:key] = self.api_key if self.api_key
18
+
19
+ [:language, :unit, :sensor].each do |option|
20
+ request.params[option] = options.delete(option) || self.public_send(option)
21
+ end
22
+
23
+ request.url(self.api_endpoint, options)
24
+ end
25
+
26
+ response.body
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,18 @@
1
+ require 'faraday'
2
+ require 'gistance/error'
3
+
4
+ module Gistance
5
+ # Faraday response middleware
6
+ module Response
7
+ # Raises a Gistance exception based on status response or HTTP status codes returned by the API
8
+ class RaiseError < Faraday::Response::Middleware
9
+ private
10
+
11
+ def on_complete(response)
12
+ if error = Gistance::Error.from_response(response)
13
+ raise error
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,5 @@
1
+ module Gistance
2
+ # Current version
3
+ # @return [String]
4
+ VERSION = '1.0.0'.freeze
5
+ end
data/lib/gistance.rb ADDED
@@ -0,0 +1,25 @@
1
+ require 'gistance/configuration'
2
+ require 'gistance/client'
3
+
4
+ # Ruby wrapper for Google Distance Matrix API
5
+ module Gistance
6
+ extend Configuration
7
+
8
+ class << self
9
+ # Delegates to Gistance::Client#new
10
+ def new(options={})
11
+ Gistance::Client.new(options)
12
+ end
13
+
14
+ # @private
15
+ def method_missing(method, *args, &block)
16
+ return super unless new.respond_to?(method)
17
+ new.send(method, *args, &block)
18
+ end
19
+
20
+ # @private
21
+ def respond_to?(method, include_private=false)
22
+ new.respond_to?(method, include_private) || super(method, include_private)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,66 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://maps.googleapis.com/maps/api/distancematrix/json?destinations=48.857066,%202.341138&language=en&origins=10%2BPlace%2Bde%2Bla%2BConcorde,%2B75008%2BParis,%2BFrance&sensor=false&unit=metric
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.8.9
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - "*/*"
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Content-Type:
22
+ - application/json; charset=UTF-8
23
+ Date:
24
+ - Wed, 02 Apr 2014 22:24:09 GMT
25
+ Expires:
26
+ - Thu, 03 Apr 2014 22:24:09 GMT
27
+ Cache-Control:
28
+ - public, max-age=86400
29
+ Server:
30
+ - mafe
31
+ X-Xss-Protection:
32
+ - 1; mode=block
33
+ X-Frame-Options:
34
+ - SAMEORIGIN
35
+ Alternate-Protocol:
36
+ - 443:quic
37
+ Transfer-Encoding:
38
+ - chunked
39
+ body:
40
+ encoding: UTF-8
41
+ string: |
42
+ {
43
+ "destination_addresses" : [ "1561 Place du Pont Neuf, 75001 Paris, France" ],
44
+ "origin_addresses" : [ "10 Place de la Concorde, 75008 Paris, France" ],
45
+ "rows" : [
46
+ {
47
+ "elements" : [
48
+ {
49
+ "distance" : {
50
+ "text" : "2.3 km",
51
+ "value" : 2335
52
+ },
53
+ "duration" : {
54
+ "text" : "5 mins",
55
+ "value" : 293
56
+ },
57
+ "status" : "OK"
58
+ }
59
+ ]
60
+ }
61
+ ],
62
+ "status" : "OK"
63
+ }
64
+ http_version:
65
+ recorded_at: Wed, 02 Apr 2014 22:24:10 GMT
66
+ recorded_with: VCR 2.9.0
@@ -0,0 +1,66 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://maps.googleapis.com/maps/api/distancematrix/json?destinations=48.857066,%202.341138&language=en&origins=10%2BPlace%2Bde%2Bla%2BConcorde,%2B75008%2BParis,%2BFrance&sensor=false&unit=metric
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.8.9
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - "*/*"
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Content-Type:
22
+ - application/json; charset=UTF-8
23
+ Date:
24
+ - Wed, 02 Apr 2014 22:24:09 GMT
25
+ Expires:
26
+ - Thu, 03 Apr 2014 22:24:09 GMT
27
+ Cache-Control:
28
+ - public, max-age=86400
29
+ Server:
30
+ - mafe
31
+ X-Xss-Protection:
32
+ - 1; mode=block
33
+ X-Frame-Options:
34
+ - SAMEORIGIN
35
+ Alternate-Protocol:
36
+ - 443:quic
37
+ Transfer-Encoding:
38
+ - chunked
39
+ body:
40
+ encoding: UTF-8
41
+ string: |
42
+ {
43
+ "destination_addresses" : [ "1561 Place du Pont Neuf, 75001 Paris, France" ],
44
+ "origin_addresses" : [ "10 Place de la Concorde, 75008 Paris, France" ],
45
+ "rows" : [
46
+ {
47
+ "elements" : [
48
+ {
49
+ "distance" : {
50
+ "text" : "2.3 km",
51
+ "value" : 2335
52
+ },
53
+ "duration" : {
54
+ "text" : "5 mins",
55
+ "value" : 293
56
+ },
57
+ "status" : "OK"
58
+ }
59
+ ]
60
+ }
61
+ ],
62
+ "status" : "OK"
63
+ }
64
+ http_version:
65
+ recorded_at: Wed, 02 Apr 2014 22:24:10 GMT
66
+ recorded_with: VCR 2.9.0
@@ -0,0 +1,66 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://maps.googleapis.com/maps/api/distancematrix/json?destinations=48.857066,%202.341138&language=en&origins=10%2BPlace%2Bde%2Bla%2BConcorde,%2B75008%2BParis,%2BFrance&sensor=false&unit=metric
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.8.9
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - "*/*"
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Content-Type:
22
+ - application/json; charset=UTF-8
23
+ Date:
24
+ - Wed, 02 Apr 2014 22:24:10 GMT
25
+ Expires:
26
+ - Thu, 03 Apr 2014 22:24:10 GMT
27
+ Cache-Control:
28
+ - public, max-age=86400
29
+ Server:
30
+ - mafe
31
+ X-Xss-Protection:
32
+ - 1; mode=block
33
+ X-Frame-Options:
34
+ - SAMEORIGIN
35
+ Alternate-Protocol:
36
+ - 443:quic
37
+ Transfer-Encoding:
38
+ - chunked
39
+ body:
40
+ encoding: UTF-8
41
+ string: |
42
+ {
43
+ "destination_addresses" : [ "1561 Place du Pont Neuf, 75001 Paris, France" ],
44
+ "origin_addresses" : [ "10 Place de la Concorde, 75008 Paris, France" ],
45
+ "rows" : [
46
+ {
47
+ "elements" : [
48
+ {
49
+ "distance" : {
50
+ "text" : "2.3 km",
51
+ "value" : 2335
52
+ },
53
+ "duration" : {
54
+ "text" : "5 mins",
55
+ "value" : 293
56
+ },
57
+ "status" : "OK"
58
+ }
59
+ ]
60
+ }
61
+ ],
62
+ "status" : "OK"
63
+ }
64
+ http_version:
65
+ recorded_at: Wed, 02 Apr 2014 22:24:11 GMT
66
+ recorded_with: VCR 2.9.0
@@ -0,0 +1,66 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://maps.googleapis.com/maps/api/distancematrix/json?destinations=48.857066,%202.341138&language=en&origins=10%2BPlace%2Bde%2Bla%2BConcorde,%2B75008%2BParis,%2BFrance&sensor=false&unit=metric
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.8.9
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - "*/*"
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Content-Type:
22
+ - application/json; charset=UTF-8
23
+ Date:
24
+ - Wed, 02 Apr 2014 22:24:10 GMT
25
+ Expires:
26
+ - Thu, 03 Apr 2014 22:24:10 GMT
27
+ Cache-Control:
28
+ - public, max-age=86400
29
+ Server:
30
+ - mafe
31
+ X-Xss-Protection:
32
+ - 1; mode=block
33
+ X-Frame-Options:
34
+ - SAMEORIGIN
35
+ Alternate-Protocol:
36
+ - 443:quic
37
+ Transfer-Encoding:
38
+ - chunked
39
+ body:
40
+ encoding: UTF-8
41
+ string: |
42
+ {
43
+ "destination_addresses" : [ "1561 Place du Pont Neuf, 75001 Paris, France" ],
44
+ "origin_addresses" : [ "10 Place de la Concorde, 75008 Paris, France" ],
45
+ "rows" : [
46
+ {
47
+ "elements" : [
48
+ {
49
+ "distance" : {
50
+ "text" : "2.3 km",
51
+ "value" : 2335
52
+ },
53
+ "duration" : {
54
+ "text" : "5 mins",
55
+ "value" : 293
56
+ },
57
+ "status" : "OK"
58
+ }
59
+ ]
60
+ }
61
+ ],
62
+ "status" : "OK"
63
+ }
64
+ http_version:
65
+ recorded_at: Wed, 02 Apr 2014 22:24:10 GMT
66
+ recorded_with: VCR 2.9.0
@@ -0,0 +1,66 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://maps.googleapis.com/maps/api/distancematrix/json?destinations=48.857066,%202.341138&language=en&origins=10%2BPlace%2Bde%2Bla%2BConcorde,%2B75008%2BParis,%2BFrance&sensor=false&unit=metric
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.8.9
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - "*/*"
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Content-Type:
22
+ - application/json; charset=UTF-8
23
+ Date:
24
+ - Wed, 02 Apr 2014 22:24:08 GMT
25
+ Expires:
26
+ - Thu, 03 Apr 2014 22:24:08 GMT
27
+ Cache-Control:
28
+ - public, max-age=86400
29
+ Server:
30
+ - mafe
31
+ X-Xss-Protection:
32
+ - 1; mode=block
33
+ X-Frame-Options:
34
+ - SAMEORIGIN
35
+ Alternate-Protocol:
36
+ - 443:quic
37
+ Transfer-Encoding:
38
+ - chunked
39
+ body:
40
+ encoding: UTF-8
41
+ string: |
42
+ {
43
+ "destination_addresses" : [ "1561 Place du Pont Neuf, 75001 Paris, France" ],
44
+ "origin_addresses" : [ "10 Place de la Concorde, 75008 Paris, France" ],
45
+ "rows" : [
46
+ {
47
+ "elements" : [
48
+ {
49
+ "distance" : {
50
+ "text" : "2.3 km",
51
+ "value" : 2335
52
+ },
53
+ "duration" : {
54
+ "text" : "5 mins",
55
+ "value" : 293
56
+ },
57
+ "status" : "OK"
58
+ }
59
+ ]
60
+ }
61
+ ],
62
+ "status" : "OK"
63
+ }
64
+ http_version:
65
+ recorded_at: Wed, 02 Apr 2014 22:24:09 GMT
66
+ recorded_with: VCR 2.9.0
@@ -0,0 +1,66 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://maps.googleapis.com/maps/api/distancematrix/json?destinations=48.857066,%202.341138&language=en&origins=10%2BPlace%2Bde%2Bla%2BConcorde,%2B75008%2BParis,%2BFrance&sensor=false&unit=metric
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.8.9
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - "*/*"
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Content-Type:
22
+ - application/json; charset=UTF-8
23
+ Date:
24
+ - Wed, 02 Apr 2014 22:24:10 GMT
25
+ Expires:
26
+ - Thu, 03 Apr 2014 22:24:10 GMT
27
+ Cache-Control:
28
+ - public, max-age=86400
29
+ Server:
30
+ - mafe
31
+ X-Xss-Protection:
32
+ - 1; mode=block
33
+ X-Frame-Options:
34
+ - SAMEORIGIN
35
+ Alternate-Protocol:
36
+ - 443:quic
37
+ Transfer-Encoding:
38
+ - chunked
39
+ body:
40
+ encoding: UTF-8
41
+ string: |
42
+ {
43
+ "destination_addresses" : [ "1561 Place du Pont Neuf, 75001 Paris, France" ],
44
+ "origin_addresses" : [ "10 Place de la Concorde, 75008 Paris, France" ],
45
+ "rows" : [
46
+ {
47
+ "elements" : [
48
+ {
49
+ "distance" : {
50
+ "text" : "2.3 km",
51
+ "value" : 2335
52
+ },
53
+ "duration" : {
54
+ "text" : "5 mins",
55
+ "value" : 293
56
+ },
57
+ "status" : "OK"
58
+ }
59
+ ]
60
+ }
61
+ ],
62
+ "status" : "OK"
63
+ }
64
+ http_version:
65
+ recorded_at: Wed, 02 Apr 2014 22:24:11 GMT
66
+ recorded_with: VCR 2.9.0
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe Gistance::Client::DistanceMatrix do
4
+ describe '.distance_matrix', :vcr do
5
+ let(:options) do
6
+ {
7
+ origins: ['10 Place de la Concorde, 75008 Paris, France'],
8
+ destinations: ['48.857066, 2.341138']
9
+ }
10
+ end
11
+
12
+ subject { client.distance_matrix(options) }
13
+
14
+ it 'returns an array of origin addresses' do
15
+ expect(subject.origin_addresses).to be_a Array
16
+ end
17
+
18
+ it 'returns the origin address' do
19
+ expect(subject.origin_addresses.first).to include 'Concorde'
20
+ end
21
+
22
+ it 'returns an array of destination addresses' do
23
+ expect(subject.destination_addresses).to be_a Array
24
+ end
25
+
26
+ it 'returns the destination address' do
27
+ expect(subject.destination_addresses.first).to include 'Pont Neuf'
28
+ end
29
+
30
+ it 'returns the distance between origin and destination' do
31
+ expect(subject.rows.first['elements'].first.distance.text).to eql('2.3 km')
32
+ expect(subject.rows.first['elements'].first.distance.value).to eql(2335)
33
+ end
34
+
35
+ it 'returns the travel duration between origin and destination' do
36
+ expect(subject.rows.first['elements'].first.duration.text).to eql('5 mins')
37
+ expect(subject.rows.first['elements'].first.duration.value).to eql(293)
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,83 @@
1
+ require 'spec_helper'
2
+
3
+ describe Gistance::Client do
4
+ describe 'module configuration' do
5
+ before do
6
+ Gistance.reset!
7
+
8
+ Gistance.configure do |config|
9
+ Gistance::Configuration::VALID_OPTIONS.each do |key|
10
+ config.send("#{key}=", "Some #{key}")
11
+ end
12
+ end
13
+ end
14
+
15
+ after { Gistance.reset! }
16
+
17
+ it "inherits the module configuration" do
18
+ client = Gistance::Client.new
19
+
20
+ Gistance::Configuration::VALID_OPTIONS.each do |key|
21
+ expect(client.instance_variable_get(:"@#{key}")).to eq "Some #{key}"
22
+ end
23
+ end
24
+ end
25
+
26
+ context 'with class level configuration' do
27
+ describe 'api_key' do
28
+ it 'sets api_key' do
29
+ client = Gistance::Client.new
30
+
31
+ expect(client.api_key).to be_nil
32
+ end
33
+
34
+ it 'overrides module configuration' do
35
+ client = Gistance::Client.new(api_key: 'randomkey')
36
+
37
+ expect(client.api_key).to eql 'randomkey'
38
+ end
39
+ end
40
+
41
+ describe 'language' do
42
+ it 'sets language' do
43
+ client = Gistance::Client.new
44
+
45
+ expect(client.language).to eql 'en'
46
+ end
47
+
48
+ it 'overrides module configuration' do
49
+ client = Gistance::Client.new(language: 'fr')
50
+
51
+ expect(client.language).to eql 'fr'
52
+ end
53
+ end
54
+
55
+ describe 'unit' do
56
+ it 'sets unit' do
57
+ client = Gistance::Client.new
58
+
59
+ expect(client.unit).to eql 'metric'
60
+ end
61
+
62
+ it 'overrides module configuration' do
63
+ client = Gistance::Client.new(unit: 'imperial')
64
+
65
+ expect(client.unit).to eql 'imperial'
66
+ end
67
+ end
68
+
69
+ describe 'sensor' do
70
+ it 'sets sensor' do
71
+ client = Gistance::Client.new
72
+
73
+ expect(client.sensor).to be_false
74
+ end
75
+
76
+ it 'overrides module configuration' do
77
+ client = Gistance::Client.new(sensor: true)
78
+
79
+ expect(client.sensor).to be_true
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe Gistance::Request do
4
+ it_behaves_like 'an error', 'INVALID_REQUEST'
5
+ it_behaves_like 'an error', 'MAX_ELEMENTS_EXCEEDED'
6
+ it_behaves_like 'an error', 'OVER_QUERY_LIMIT'
7
+ it_behaves_like 'an error', 'REQUEST_DENIED'
8
+ it_behaves_like 'an error', 'UNKNOWN_ERROR'
9
+ it_behaves_like 'an error', 'NOT_FOUND'
10
+ it_behaves_like 'an error', 'ZERO_RESULTS'
11
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe Gistance do
4
+ describe '.respond_to?' do
5
+ context 'with an existing Gistance method' do
6
+ it 'responds to method' do
7
+ expect(Gistance.respond_to?(:new, true)).to be_true
8
+ end
9
+ end
10
+
11
+ context 'with an existing Gistance::Client method' do
12
+ it 'responds to method' do
13
+ expect(Gistance.respond_to?(:request, true)).to be_true
14
+ end
15
+
16
+ it 'delegates to Gistance::Client' do
17
+ Gistance::Client.stub_chain(:new, :get).and_return(true)
18
+
19
+ expect(Gistance::Client).to receive(:new).ordered
20
+ expect(Gistance::Client).to receive(:new).ordered
21
+
22
+ Gistance.get('fuubar')
23
+ end
24
+ end
25
+ end
26
+
27
+ describe '.new' do
28
+ it 'returns a Gistance::Client' do
29
+ expect(Gistance.new).to be_a Gistance::Client
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,40 @@
1
+ require 'simplecov'
2
+ require 'coveralls'
3
+
4
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
5
+ SimpleCov::Formatter::HTMLFormatter,
6
+ Coveralls::SimpleCov::Formatter
7
+ ]
8
+
9
+ SimpleCov.start do
10
+ add_filter 'spec'
11
+ add_filter 'lib/gistance/response'
12
+ end
13
+
14
+ require 'rspec'
15
+ require 'vcr'
16
+ require 'json'
17
+ require 'webmock/rspec'
18
+ require 'gistance'
19
+
20
+ Dir['./spec/support/**/*.rb'].each { |f| require f }
21
+
22
+ WebMock.disable_net_connect!(allow: 'coveralls.io')
23
+
24
+ VCR.configure do |c|
25
+ c.cassette_library_dir = 'spec/cassettes'
26
+ c.hook_into :webmock
27
+ c.configure_rspec_metadata!
28
+ end
29
+
30
+ RSpec.configure do |c|
31
+ c.treat_symbols_as_metadata_keys_with_true_values = true
32
+ end
33
+
34
+ def google_distance_matrix_url
35
+ "#{Gistance.api_endpoint}?language=en&sensor=false&unit=metric"
36
+ end
37
+
38
+ def client
39
+ Gistance.new
40
+ end
@@ -0,0 +1,16 @@
1
+ shared_examples 'an error' do |error|
2
+ error_class_name = error.split(/_/).map{ |word| word.capitalize }.join('')
3
+ exception = Gistance.const_get(error_class_name)
4
+
5
+ it "raising #{exception.name} when status is #{error}" do
6
+ VCR.turn_off!
7
+
8
+ stub_request(:get, google_distance_matrix_url).to_return(
9
+ body: { status: error }.to_json
10
+ )
11
+
12
+ expect { client.get }.to raise_error exception
13
+
14
+ VCR.turn_on!
15
+ end
16
+ end
metadata ADDED
@@ -0,0 +1,154 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gistance
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Aylic Petit
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-04-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.8.9
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.8.9
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday_middleware
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.9.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: hashie
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 2.0.5
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 2.0.5
55
+ - !ruby/object:Gem::Dependency
56
+ name: json
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 1.8.1
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.8.1
69
+ - !ruby/object:Gem::Dependency
70
+ name: multi_json
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 1.9.2
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 1.9.2
83
+ description: Simple Ruby wrapper for the Google Distance Matrix API.
84
+ email:
85
+ - sush@users.noreply.github.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".yardopts"
91
+ - CONTRIBUTING.md
92
+ - LICENSE
93
+ - README.md
94
+ - Rakefile
95
+ - gistance.gemspec
96
+ - lib/gistance.rb
97
+ - lib/gistance/client.rb
98
+ - lib/gistance/client/distance_matrix.rb
99
+ - lib/gistance/configuration.rb
100
+ - lib/gistance/connection.rb
101
+ - lib/gistance/error.rb
102
+ - lib/gistance/request.rb
103
+ - lib/gistance/response/raise_error.rb
104
+ - lib/gistance/version.rb
105
+ - spec/cassettes/Gistance_Client_DistanceMatrix/_distance_matrix/returns_an_array_of_destination_addresses.yml
106
+ - spec/cassettes/Gistance_Client_DistanceMatrix/_distance_matrix/returns_an_array_of_origin_addresses.yml
107
+ - spec/cassettes/Gistance_Client_DistanceMatrix/_distance_matrix/returns_the_destination_address.yml
108
+ - spec/cassettes/Gistance_Client_DistanceMatrix/_distance_matrix/returns_the_distance_between_origin_and_destination.yml
109
+ - spec/cassettes/Gistance_Client_DistanceMatrix/_distance_matrix/returns_the_origin_address.yml
110
+ - spec/cassettes/Gistance_Client_DistanceMatrix/_distance_matrix/returns_the_travel_duration_between_origin_and_destination.yml
111
+ - spec/lib/gistance/client/distance_matrix_spec.rb
112
+ - spec/lib/gistance/client_spec.rb
113
+ - spec/lib/gistance/request_spec.rb
114
+ - spec/lib/gistance_spec.rb
115
+ - spec/spec_helper.rb
116
+ - spec/support/shared_examples/error.rb
117
+ homepage: https://github.com/sush/gistance
118
+ licenses:
119
+ - MIT
120
+ metadata: {}
121
+ post_install_message:
122
+ rdoc_options: []
123
+ require_paths:
124
+ - lib
125
+ required_ruby_version: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: 1.9.2
130
+ required_rubygems_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ requirements: []
136
+ rubyforge_project:
137
+ rubygems_version: 2.2.2
138
+ signing_key:
139
+ specification_version: 4
140
+ summary: Google Distance Matrix API Ruby wrapper
141
+ test_files:
142
+ - spec/cassettes/Gistance_Client_DistanceMatrix/_distance_matrix/returns_an_array_of_destination_addresses.yml
143
+ - spec/cassettes/Gistance_Client_DistanceMatrix/_distance_matrix/returns_an_array_of_origin_addresses.yml
144
+ - spec/cassettes/Gistance_Client_DistanceMatrix/_distance_matrix/returns_the_destination_address.yml
145
+ - spec/cassettes/Gistance_Client_DistanceMatrix/_distance_matrix/returns_the_distance_between_origin_and_destination.yml
146
+ - spec/cassettes/Gistance_Client_DistanceMatrix/_distance_matrix/returns_the_origin_address.yml
147
+ - spec/cassettes/Gistance_Client_DistanceMatrix/_distance_matrix/returns_the_travel_duration_between_origin_and_destination.yml
148
+ - spec/lib/gistance/client/distance_matrix_spec.rb
149
+ - spec/lib/gistance/client_spec.rb
150
+ - spec/lib/gistance/request_spec.rb
151
+ - spec/lib/gistance_spec.rb
152
+ - spec/spec_helper.rb
153
+ - spec/support/shared_examples/error.rb
154
+ has_rdoc: