google-maps 2.2.0 → 3.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.
- 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
|
+
[](http://badge.fury.io/rb/google-maps)
|
2
|
+
[](https://travis-ci.org/zilverline/google-maps)
|
3
|
+
[](https://coveralls.io/r/zilverline/google-maps?branch=master)
|
4
|
+
[](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
|