google-maps 2.2.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +20 -0
- data/.travis.yml +6 -1
- data/Gemfile +3 -1
- data/{LICENSE.mkd → LICENSE.md} +0 -0
- data/README.md +216 -0
- data/Rakefile +5 -3
- data/google-maps.gemspec +24 -21
- data/lib/google_maps.rb +48 -0
- data/lib/google_maps/api.rb +104 -0
- data/lib/google_maps/configuration.rb +90 -0
- data/lib/google_maps/location.rb +34 -0
- data/lib/{google-maps → google_maps}/logger.rb +5 -4
- data/lib/{google-maps → google_maps}/place.rb +21 -18
- data/lib/google_maps/result.rb +11 -0
- data/lib/google_maps/route.rb +45 -0
- data/lib/google_maps/version.rb +7 -0
- data/spec/google_maps/api_spec.rb +82 -0
- data/spec/google_maps/logger_spec.rb +17 -0
- data/spec/google_maps/place_details_spec.rb +40 -0
- data/spec/google_maps/place_spec.rb +47 -0
- data/spec/google_maps/route_spec.rb +53 -0
- data/spec/google_maps_spec.rb +174 -0
- data/spec/spec_helper.rb +5 -6
- metadata +97 -57
- data/README.mkd +0 -39
- data/lib/google-maps.rb +0 -44
- data/lib/google-maps/api.rb +0 -89
- data/lib/google-maps/configuration.rb +0 -70
- data/lib/google-maps/location.rb +0 -25
- data/lib/google-maps/route.rb +0 -38
- data/lib/google-maps/version.rb +0 -5
- data/spec/google-maps/api_spec.rb +0 -103
- data/spec/google-maps/logger_spec.rb +0 -15
- data/spec/google-maps/place_details_spec.rb +0 -32
- data/spec/google-maps/place_spec.rb +0 -45
- data/spec/google-maps/route_spec.rb +0 -52
- data/spec/google-maps_spec.rb +0 -103
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8c9ea7de658231206acfde4f02867362e4b43953
|
4
|
+
data.tar.gz: e09e76851c8d3d2f963ade490ebcbff26b44703e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 603662cd8f896c0145d0d390feac907b909be471848cfb72674717fad7d0d39f22bc57005cb63a19106e14ec3c1f9bf29824c54381f6a269a119179d9f4231e6
|
7
|
+
data.tar.gz: 8fdf84b4466a49a63ce26ef28f7a77ae79ad291843942534337d869269820ee6f7d29c8e367bf0bcd6f9a7d4d42604c72a3db2d784e32c6ae0080f108bfcf189
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
AllCops:
|
2
|
+
Exclude:
|
3
|
+
- ./google-maps.gemspec
|
4
|
+
|
5
|
+
Metrics/BlockLength:
|
6
|
+
Exclude:
|
7
|
+
- "spec/**/*.rb"
|
8
|
+
Max: 80
|
9
|
+
|
10
|
+
Metrics/LineLength:
|
11
|
+
Max: 130
|
12
|
+
|
13
|
+
Metrics/MethodLength:
|
14
|
+
Max: 15
|
15
|
+
|
16
|
+
Metrics/AbcSize:
|
17
|
+
Max: 20
|
18
|
+
|
19
|
+
Style/Documentation:
|
20
|
+
Enabled: false
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/{LICENSE.mkd → LICENSE.md}
RENAMED
File without changes
|
data/README.md
ADDED
@@ -0,0 +1,216 @@
|
|
1
|
+
[![Gem Version](https://badge.fury.io/rb/google-maps.svg)](http://badge.fury.io/rb/google-maps)
|
2
|
+
[![Build Status](https://travis-ci.org/zilverline/google-maps.svg?branch=master)](https://travis-ci.org/zilverline/google-maps)
|
3
|
+
[![Coverage Status](https://coveralls.io/repos/zilverline/google-maps/badge.svg?branch=master)](https://coveralls.io/r/zilverline/google-maps?branch=master)
|
4
|
+
[![Code Climate](https://codeclimate.com/repos/55671579695680044d01e0ac/badges/8f4d88f30585847e4fcf/gpa.svg)](https://codeclimate.com/repos/55671579695680044d01e0ac/feed)
|
5
|
+
|
6
|
+
# Google Maps
|
7
|
+
|
8
|
+
## Installation
|
9
|
+
|
10
|
+
`gem install google-maps`
|
11
|
+
|
12
|
+
Or add the following line to your Gemfile:
|
13
|
+
|
14
|
+
`gem 'google-maps'`
|
15
|
+
|
16
|
+
## Configuration
|
17
|
+
|
18
|
+
You can either authenticate with an API key or a digital signature.
|
19
|
+
|
20
|
+
API key:
|
21
|
+
|
22
|
+
```ruby
|
23
|
+
Google::Maps.configure do |config|
|
24
|
+
config.authentication_mode = Google::Maps::Authentication::API_KEY
|
25
|
+
config.api_key = 'xxxxxxxxxxx'
|
26
|
+
end
|
27
|
+
```
|
28
|
+
|
29
|
+
Digital signature:
|
30
|
+
|
31
|
+
```ruby
|
32
|
+
Google::Maps.configure do |config|
|
33
|
+
config.authentication_mode = Google::Maps::Authentication::DIGITAL_SIGNATURE
|
34
|
+
config.client_id = 'xxxxxxxxxxx'
|
35
|
+
config.client_secret = 'xxxxxxxxxxx'
|
36
|
+
end
|
37
|
+
```
|
38
|
+
|
39
|
+
### Default language
|
40
|
+
|
41
|
+
Set the default language.
|
42
|
+
|
43
|
+
```ruby
|
44
|
+
Google::Maps.configure do |config|
|
45
|
+
config.default_language = :nl #dutch
|
46
|
+
end
|
47
|
+
```
|
48
|
+
|
49
|
+
## Usage Examples
|
50
|
+
|
51
|
+
### Distance
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
Google::Maps.distance("Science Park, Amsterdam", "Deventer")
|
55
|
+
#=> "105 km"
|
56
|
+
Google::Maps.distance("52.3545543,4.9519029", "Deventer")
|
57
|
+
#=> "105 km"
|
58
|
+
```
|
59
|
+
|
60
|
+
### Duration
|
61
|
+
|
62
|
+
```ruby
|
63
|
+
Google::Maps.duration("Science Park, Amsterdam", "Deventer")
|
64
|
+
#=> "1 hour 12 mins"
|
65
|
+
Google::Maps.duration("52.3545543,4.9519029", "Deventer")
|
66
|
+
#=> "1 hour 12 mins"
|
67
|
+
```
|
68
|
+
|
69
|
+
### Route
|
70
|
+
|
71
|
+
```ruby
|
72
|
+
route = Google::Maps.route("Science Park, Amsterdam", "Deventer")
|
73
|
+
route = Google::Maps.route("52.3545543,4.9519029", "Deventer")
|
74
|
+
route.distance.text
|
75
|
+
#=> "104 km"
|
76
|
+
route.duration.text
|
77
|
+
#=> "1 hour 12 mins"
|
78
|
+
route.distance.value
|
79
|
+
#=> 103712
|
80
|
+
route.duration.value
|
81
|
+
#=> 4337
|
82
|
+
route.steps
|
83
|
+
#=> [
|
84
|
+
{
|
85
|
+
"distance" => {
|
86
|
+
"text" => "0,1 km",
|
87
|
+
"value" => 125
|
88
|
+
},
|
89
|
+
"duration" => {
|
90
|
+
"text" => "1 min.",
|
91
|
+
"value" => 35
|
92
|
+
},
|
93
|
+
"end_location" => {
|
94
|
+
"lat" => 52.3556768,
|
95
|
+
"lng" => 4.9545739
|
96
|
+
},
|
97
|
+
"html_instructions" => "Rijd <b>naar het noordwesten</b>, richting het <b>Science Park</b>",
|
98
|
+
"polyline" => {
|
99
|
+
"points" => "oqp~Hqpf]?@?@?@KNOVEHA@A?s@wAQ]Q_@We@?A?ADI"
|
100
|
+
},
|
101
|
+
"start_location" => {
|
102
|
+
"lat" => 52.3549602,
|
103
|
+
"lng" => 4.9538473
|
104
|
+
},
|
105
|
+
"travel_mode" => "DRIVING"
|
106
|
+
},
|
107
|
+
{
|
108
|
+
"distance" => {
|
109
|
+
"text" => "37 m",
|
110
|
+
........
|
111
|
+
|
112
|
+
```
|
113
|
+
|
114
|
+
### Options
|
115
|
+
|
116
|
+
The distance, duration and route methods allow you to pass an options hash to the Directions API.
|
117
|
+
All options can also be set as default_params for these services.
|
118
|
+
|
119
|
+
```ruby
|
120
|
+
Google::Maps.configure do |config|
|
121
|
+
...
|
122
|
+
config.default_params = {
|
123
|
+
directions_service: {
|
124
|
+
mode: 'transit',
|
125
|
+
transit_routing_preference: 'fewer_transfers'
|
126
|
+
}
|
127
|
+
}
|
128
|
+
...
|
129
|
+
end
|
130
|
+
|
131
|
+
```
|
132
|
+
|
133
|
+
The following options are permitted:
|
134
|
+
|
135
|
+
```ruby
|
136
|
+
{
|
137
|
+
mode: 'driving', #default
|
138
|
+
transit_mode: 'train', #only used when mode is set to 'transit'
|
139
|
+
transit_routing_preference: 'fewer_transfers',
|
140
|
+
avoid: 'tolls',
|
141
|
+
arrival_time: 1545397430, # In seconds since midnight, January 1, 1970 UTC.
|
142
|
+
departure_time: 1545397430, # Cannot be in the past.
|
143
|
+
}
|
144
|
+
|
145
|
+
# NB! You can specify either departure_time or arrival_time, but not both.
|
146
|
+
TRAVEL_MODES = [
|
147
|
+
'driving', #(Default) indicates standard driving directions using the road network.
|
148
|
+
'bicycling', #requests bicycling directions via bicycle paths & preferred streets.
|
149
|
+
'transit', #requests directions via public transit routes.
|
150
|
+
'walking'
|
151
|
+
]
|
152
|
+
|
153
|
+
TRANSIT_MODES = [
|
154
|
+
'bus',
|
155
|
+
'subway',
|
156
|
+
'train',
|
157
|
+
'tram',
|
158
|
+
'rail' # This is equivalent to transit_mode=train|tram|subway
|
159
|
+
]
|
160
|
+
|
161
|
+
TRANSIT_ROUTING_PREFERENCES = [
|
162
|
+
'less_walking', prefer limited amounts of walking.
|
163
|
+
'fewer_transfers' prefer a limited number of transfers.
|
164
|
+
]
|
165
|
+
|
166
|
+
AVOID = [
|
167
|
+
'tolls',
|
168
|
+
'highways',
|
169
|
+
'ferries',
|
170
|
+
'indoor', # Avoid indoor steps for walking and transit directions.
|
171
|
+
]
|
172
|
+
|
173
|
+
```
|
174
|
+
|
175
|
+
### Places
|
176
|
+
|
177
|
+
```ruby
|
178
|
+
places = Google::Maps.places('Amsterdam')
|
179
|
+
places.first.text
|
180
|
+
#=> "Amsterdam, Nederland"
|
181
|
+
places.first.place_id
|
182
|
+
#=> "ChIJVXealLU_xkcRja_At0z9AGY"
|
183
|
+
|
184
|
+
place = Google::Maps.place("ChIJVXealLU_xkcRja_At0z9AGY")
|
185
|
+
|
186
|
+
place.latitude
|
187
|
+
#=> "52.3679843"
|
188
|
+
|
189
|
+
place.longitude
|
190
|
+
#=> "4.9035614"
|
191
|
+
|
192
|
+
place.address
|
193
|
+
#=> "Amsterdam, Nederland"
|
194
|
+
```
|
195
|
+
|
196
|
+
### Geocode
|
197
|
+
|
198
|
+
```ruby
|
199
|
+
geocodes = Google::Maps.geocode("Science Park, Amsterdam")
|
200
|
+
geocodes.first.address = "Science Park, 1012 WX Amsterdam, Nederland"
|
201
|
+
geocodes.first.latitude = 52.3545543
|
202
|
+
geocodes.first.longitude = 4.9540916
|
203
|
+
```
|
204
|
+
|
205
|
+
## Testing
|
206
|
+
|
207
|
+
Run all tests:
|
208
|
+
|
209
|
+
```
|
210
|
+
rspec spec/
|
211
|
+
```
|
212
|
+
|
213
|
+
## Copyright
|
214
|
+
|
215
|
+
Copyright (c) 2011-2019 Zilverline.
|
216
|
+
See [LICENSE](https://github.com/zilverline/google-maps/blob/master/LICENSE.md) for details.
|
data/Rakefile
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'bundler'
|
2
4
|
Bundler::GemHelper.install_tasks
|
3
5
|
|
4
6
|
require 'rspec/core/rake_task'
|
5
7
|
RSpec::Core::RakeTask.new(:spec)
|
6
8
|
|
7
|
-
task :
|
9
|
+
task default: :spec
|
8
10
|
|
9
11
|
namespace :doc do
|
10
12
|
require 'yard'
|
@@ -13,7 +15,7 @@ namespace :doc do
|
|
13
15
|
task.options = [
|
14
16
|
'--protected',
|
15
17
|
'--output-dir', 'doc/yard',
|
16
|
-
'--markup', 'markdown'
|
18
|
+
'--markup', 'markdown'
|
17
19
|
]
|
18
20
|
end
|
19
|
-
end
|
21
|
+
end
|
data/google-maps.gemspec
CHANGED
@@ -1,34 +1,37 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
$LOAD_PATH.push File.expand_path('lib', __dir__)
|
4
|
+
require 'google_maps/version'
|
4
5
|
|
5
6
|
Gem::Specification.new do |s|
|
6
|
-
s.name =
|
7
|
+
s.name = 'google-maps'
|
8
|
+
s.license = 'MIT'
|
7
9
|
s.version = Google::Maps::VERSION
|
8
|
-
s.authors = [
|
9
|
-
s.email = [
|
10
|
-
s.homepage =
|
11
|
-
s.summary =
|
12
|
-
s.description =
|
10
|
+
s.authors = ['Daniel van Hoesel']
|
11
|
+
s.email = ['info@zilverline.com']
|
12
|
+
s.homepage = 'http://zilverline.com/'
|
13
|
+
s.summary = 'Ruby wrapper for the Google Maps API'
|
14
|
+
s.description = 'This is a ruby wrapper for the Google Maps api'
|
13
15
|
|
14
|
-
s.rubyforge_project =
|
16
|
+
s.rubyforge_project = 'google-maps'
|
15
17
|
|
16
18
|
s.files = `git ls-files`.split("\n")
|
17
19
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
-
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
-
s.require_paths = [
|
20
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
21
|
+
s.require_paths = ['lib']
|
20
22
|
|
21
23
|
s.add_development_dependency('bundler', '~> 1.0')
|
22
|
-
s.add_development_dependency('
|
23
|
-
s.add_development_dependency('
|
24
|
-
s.add_development_dependency('
|
24
|
+
s.add_development_dependency('coveralls', '~> 0.8')
|
25
|
+
s.add_development_dependency('mocha', '~> 1.7.0')
|
26
|
+
s.add_development_dependency('rake', '~> 12.3.2')
|
27
|
+
s.add_development_dependency('rspec', '~> 3.8.0')
|
25
28
|
s.add_development_dependency('rspec-collection_matchers', '~> 1.1')
|
26
|
-
s.add_development_dependency('
|
29
|
+
s.add_development_dependency('rspec-its', '~> 1.2')
|
30
|
+
s.add_development_dependency('rubocop', '~> 0.61.1')
|
27
31
|
s.add_development_dependency('simplecov', '~> 0.5')
|
28
|
-
s.add_development_dependency('
|
29
|
-
s.
|
30
|
-
s.add_dependency('
|
31
|
-
s.add_dependency('
|
32
|
-
s.add_dependency('httpclient', '~> 2.7.1')
|
32
|
+
s.add_development_dependency('yard', '~> 0.9', '>= 0.9.11')
|
33
|
+
s.add_dependency('hashie', '~> 3.6', '>= 3.6.0')
|
34
|
+
s.add_dependency('httpclient', '~> 2.7', '>= 2.7.1')
|
35
|
+
s.add_dependency('json', '~> 2.1', '>= 2.1.0')
|
33
36
|
s.add_dependency('ruby-hmac', '~> 0.4.0')
|
34
37
|
end
|
data/lib/google_maps.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require File.expand_path('google_maps/configuration', __dir__)
|
4
|
+
require File.expand_path('google_maps/logger', __dir__)
|
5
|
+
require File.expand_path('google_maps/route', __dir__)
|
6
|
+
require File.expand_path('google_maps/place', __dir__)
|
7
|
+
require File.expand_path('google_maps/location', __dir__)
|
8
|
+
|
9
|
+
module Google
|
10
|
+
module Maps
|
11
|
+
extend Configuration
|
12
|
+
extend Logger
|
13
|
+
|
14
|
+
def self.route(from, to, options = {})
|
15
|
+
Route.new(from, to, options_with_defaults(options))
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.distance(from, to, options = {})
|
19
|
+
Route.new(from, to, options_with_defaults(options)).distance.text
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.duration(from, to, options = {})
|
23
|
+
Route.new(from, to, options_with_defaults(options)).duration.text
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.places(keyword, language = default_language)
|
27
|
+
Place.find(keyword, language)
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.place(place_id, language = default_language)
|
31
|
+
PlaceDetails.find(place_id, language)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.geocode(address, language = default_language)
|
35
|
+
Location.find(address, language)
|
36
|
+
rescue ZeroResultsException
|
37
|
+
[]
|
38
|
+
end
|
39
|
+
|
40
|
+
class << self
|
41
|
+
protected
|
42
|
+
|
43
|
+
def options_with_defaults(options)
|
44
|
+
{ language: default_language }.merge(options)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# require 'net/http'
|
4
|
+
require 'httpclient'
|
5
|
+
require 'uri'
|
6
|
+
require 'json'
|
7
|
+
require 'base64'
|
8
|
+
require 'hmac'
|
9
|
+
require 'hmac-sha1'
|
10
|
+
|
11
|
+
require_relative 'result'
|
12
|
+
|
13
|
+
module Google
|
14
|
+
module Maps
|
15
|
+
class InvalidResponseException < StandardError; end
|
16
|
+
class InvalidPremierConfigurationException < StandardError; end
|
17
|
+
class ZeroResultsException < InvalidResponseException; end
|
18
|
+
|
19
|
+
class API
|
20
|
+
STATUS_OK = 'OK'.freeze
|
21
|
+
STATUS_ZERO_RESULTS = 'ZERO_RESULTS'.freeze
|
22
|
+
|
23
|
+
class << self
|
24
|
+
def query(service, args = {})
|
25
|
+
args = args.merge(Google::Maps.default_params[service]) if Google::Maps.default_params[service]
|
26
|
+
url = url(service, args)
|
27
|
+
response(url)
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def decode_url_safe_base_64(value)
|
33
|
+
Base64.decode64(value.tr('-_', '+/'))
|
34
|
+
end
|
35
|
+
|
36
|
+
def encode_url_safe_base_64(value)
|
37
|
+
Base64.encode64(value).tr('+/', '-_')
|
38
|
+
end
|
39
|
+
|
40
|
+
def add_digital_signature(url)
|
41
|
+
parsed_url = url.is_a?(URI) ? url : URI.parse(url)
|
42
|
+
url_to_sign = parsed_url.path + '?' + parsed_url.query
|
43
|
+
|
44
|
+
# Decode the private key
|
45
|
+
raw_key = decode_url_safe_base_64(Google::Maps.client_secret)
|
46
|
+
|
47
|
+
# create a signature using the private key and the URL
|
48
|
+
sha1 = HMAC::SHA1.new(raw_key)
|
49
|
+
sha1 << url_to_sign
|
50
|
+
raw_sig = sha1.digest
|
51
|
+
|
52
|
+
# encode the signature into base64 for url use form.
|
53
|
+
signature = encode_url_safe_base_64(raw_sig)
|
54
|
+
|
55
|
+
# prepend the server and append the signature.
|
56
|
+
"#{parsed_url.scheme}://#{parsed_url.host}#{url_to_sign}&signature=#{signature}".strip
|
57
|
+
end
|
58
|
+
|
59
|
+
def response(url)
|
60
|
+
begin
|
61
|
+
result = Google::Maps::Result.new JSON.parse(HTTPClient.new.get_content(url))
|
62
|
+
rescue StandardError => error
|
63
|
+
Google::Maps.logger.error error.message.to_s
|
64
|
+
raise InvalidResponseException, "unknown error: #{error.message}"
|
65
|
+
end
|
66
|
+
handle_result_status(result.status)
|
67
|
+
result
|
68
|
+
end
|
69
|
+
|
70
|
+
def handle_result_status(status)
|
71
|
+
raise ZeroResultsException, "Google did not return any results: #{status}" if status == STATUS_ZERO_RESULTS
|
72
|
+
raise InvalidResponseException, "Google returned an error status: #{status}" if status != STATUS_OK
|
73
|
+
end
|
74
|
+
|
75
|
+
def url_with_api_key(service, args = {})
|
76
|
+
base_url(service, args.merge(api_key: Google::Maps.api_key))
|
77
|
+
end
|
78
|
+
|
79
|
+
def url_with_digital_signature(service, args = {})
|
80
|
+
url = base_url(service, args.merge(client: Google::Maps.client_id))
|
81
|
+
add_digital_signature(url)
|
82
|
+
end
|
83
|
+
|
84
|
+
def url(service, args = {})
|
85
|
+
if Google::Maps.authentication_mode == Google::Maps::Configuration::API_KEY
|
86
|
+
url_with_api_key(service, args)
|
87
|
+
elsif Google::Maps.authentication_mode == Google::Maps::Configuration::DIGITAL_SIGNATURE
|
88
|
+
url_with_digital_signature(service, args)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def base_url(service, args = {})
|
93
|
+
url = URI.parse("#{Google::Maps.end_point}#{Google::Maps.send(service)}/#{Google::Maps.format}#{query_string(args)}")
|
94
|
+
Google::Maps.logger.debug("url before possible signing: #{url}")
|
95
|
+
url.to_s
|
96
|
+
end
|
97
|
+
|
98
|
+
def query_string(args = {})
|
99
|
+
'?' + URI.encode_www_form(args) unless args.empty?
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|