google-directions 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/google/directions.rb +1 -0
- data/lib/google/directions/config.rb +6 -1
- data/lib/google/directions/encoder.rb +24 -0
- data/lib/google/directions/request.rb +35 -4
- data/lib/google/directions/version.rb +1 -1
- data/spec/google/directions/encoder_spec.rb +14 -0
- data/spec/google/directions/request_spec.rb +55 -0
- data/wercker.yml +10 -2
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 18eefda36b4175718d1978a0fe2e8da85ae7e2d3
|
4
|
+
data.tar.gz: c8cd1c3f39ac23a0e1df27166481538288a887c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 38936c2b87b7c041f1166b42685ef48544d443e2aa855c29e4c23a2a509a2c1de9ad70861961784a3b4f1f63f0a88313ead5b4a6b8cd149185777d1d291fde48
|
7
|
+
data.tar.gz: 0bf13f927f97ea077b349b4e6233b1abd96a96236ee752c77b963b7dc6e54ce98ba95ca580fa89a7df4190e7ba751e8f3a52fbeccc2b561c79f0df9a6fa3f47c
|
data/lib/google/directions.rb
CHANGED
@@ -16,6 +16,7 @@ module Google
|
|
16
16
|
|
17
17
|
autoload :Config , 'google/directions/config'
|
18
18
|
autoload :Error , 'google/directions/error'
|
19
|
+
autoload :Encoder , 'google/directions/encoder'
|
19
20
|
autoload :Request , 'google/directions/request'
|
20
21
|
autoload :Version , 'google/directions/version'
|
21
22
|
end
|
@@ -3,7 +3,8 @@ module Google
|
|
3
3
|
class Config
|
4
4
|
include Singleton
|
5
5
|
|
6
|
-
attr_accessor :client_id, :private_key, :
|
6
|
+
attr_accessor :client_id, :private_key, :sign,
|
7
|
+
:timeout, :connect_timeout
|
7
8
|
|
8
9
|
def timeout
|
9
10
|
@timeout || 10
|
@@ -12,6 +13,10 @@ module Google
|
|
12
13
|
def connect_timeout
|
13
14
|
@connect_timeout || 5
|
14
15
|
end
|
16
|
+
|
17
|
+
def sign
|
18
|
+
@sign || false
|
19
|
+
end
|
15
20
|
end
|
16
21
|
end
|
17
22
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'base64'
|
2
|
+
require 'digest/sha1'
|
3
|
+
|
4
|
+
module Google
|
5
|
+
module Directions
|
6
|
+
class Encoder
|
7
|
+
attr_reader :uri_with_params, :private_key
|
8
|
+
|
9
|
+
def initialize(uri_with_params, private_key)
|
10
|
+
@uri_with_params = uri_with_params
|
11
|
+
@private_key = private_key
|
12
|
+
end
|
13
|
+
|
14
|
+
def encode
|
15
|
+
binary_key = Base64.decode64(private_key.tr('-_','+/'))
|
16
|
+
digest = OpenSSL::Digest.new('sha1')
|
17
|
+
signature = OpenSSL::HMAC.digest(digest, binary_key, uri_with_params)
|
18
|
+
signature = Base64.encode64(signature.tr('+/','-_')).tr("\n", '')
|
19
|
+
|
20
|
+
"#{uri_with_params}&signature=#{signature}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Google
|
2
2
|
module Directions
|
3
3
|
class Request
|
4
|
-
BASE_URL = '
|
4
|
+
BASE_URL = 'maps.googleapis.com'
|
5
5
|
GET_PATH = '/maps/api/directions/json'
|
6
6
|
|
7
7
|
DRIVING_MODE = 'driving'
|
@@ -9,16 +9,18 @@ module Google
|
|
9
9
|
attr_reader :params, :response
|
10
10
|
|
11
11
|
def initialize
|
12
|
-
session.base_url = BASE_URL
|
12
|
+
session.base_url = ((sign? || private_key) ? 'https://' : 'http://') + BASE_URL
|
13
13
|
session.timeout = Google::Directions.config.timeout
|
14
14
|
session.connect_timeout = Google::Directions.config.connect_timeout
|
15
15
|
end
|
16
16
|
|
17
17
|
def get(params)
|
18
18
|
@params = params.with_indifferent_access
|
19
|
-
@response = session.get GET_PATH + '?' + parse_params.to_query
|
20
19
|
|
21
|
-
|
20
|
+
url = sign_url_if_needed(GET_PATH + '?' + parse_params.to_query)
|
21
|
+
@response = session.get url
|
22
|
+
|
23
|
+
response ? ::JSON.parse(response.body) : nil
|
22
24
|
end
|
23
25
|
|
24
26
|
private
|
@@ -33,9 +35,15 @@ module Google
|
|
33
35
|
parsed_params[:waypoints] = parse_waypoints if params[:waypoints]
|
34
36
|
parsed_params[:mode] = params[:mode] || DRIVING_MODE
|
35
37
|
|
38
|
+
set_auth_params!(parsed_params)
|
39
|
+
|
36
40
|
parsed_params
|
37
41
|
end
|
38
42
|
|
43
|
+
def sign_url_if_needed(uri_with_params)
|
44
|
+
sign? ? Encoder.new(uri_with_params, private_key).encode : uri_with_params
|
45
|
+
end
|
46
|
+
|
39
47
|
def parse_waypoints
|
40
48
|
optimize = !!params[:optimize] || false
|
41
49
|
waypoints = params[:waypoints].join('|')
|
@@ -43,6 +51,17 @@ module Google
|
|
43
51
|
"optimize:#{optimize}|#{waypoints}"
|
44
52
|
end
|
45
53
|
|
54
|
+
def set_auth_params!(parsed_params)
|
55
|
+
if sign?
|
56
|
+
missing('client_id') unless client_id
|
57
|
+
missing('private_key') unless private_key
|
58
|
+
|
59
|
+
parsed_params[:client] = client_id
|
60
|
+
elsif private_key
|
61
|
+
parsed_params[:key] = private_key
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
46
65
|
def session
|
47
66
|
@session ||= Patron::Session.new
|
48
67
|
end
|
@@ -50,6 +69,18 @@ module Google
|
|
50
69
|
def missing(name)
|
51
70
|
raise Error, "Missing parameter: #{name}"
|
52
71
|
end
|
72
|
+
|
73
|
+
def private_key
|
74
|
+
Google::Directions.config.private_key
|
75
|
+
end
|
76
|
+
|
77
|
+
def client_id
|
78
|
+
Google::Directions.config.client_id
|
79
|
+
end
|
80
|
+
|
81
|
+
def sign?
|
82
|
+
Google::Directions.config.sign
|
83
|
+
end
|
53
84
|
end
|
54
85
|
end
|
55
86
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Google::Directions::Encoder do
|
4
|
+
describe '#encode' do
|
5
|
+
let(:uri_with_params) { '/maps/api/geocode/json?address=Florianopolis&client=123' }
|
6
|
+
let(:private_key) { 'vNIXE0xscrmjlyV-12Nj_BvUPaw=' }
|
7
|
+
|
8
|
+
subject { described_class.new(uri_with_params, private_key).encode }
|
9
|
+
|
10
|
+
it 'creates signature from path and query' do
|
11
|
+
expect(subject).to eq("#{uri_with_params}&signature=VqUOoDBw//HLG5g76wWQLSg0/mw=")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -17,6 +17,61 @@ describe Google::Directions::Request do
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
+
context 'when private key is set' do
|
21
|
+
let(:url_with_key) { /^\S+key=\S+$/ }
|
22
|
+
|
23
|
+
before do
|
24
|
+
allow(Google::Directions.config).to receive(:private_key).and_return('MY_PRIVATE_KEY')
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should use key over HTTPS in request' do
|
28
|
+
expect_any_instance_of(Patron::Session).to receive(:base_url=).with(/https/)
|
29
|
+
expect_any_instance_of(Patron::Session).to receive(:get).with(url_with_key).once
|
30
|
+
|
31
|
+
subject.get(params)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'when is set to sign request' do
|
36
|
+
let(:client_id) { 'my_client_id' }
|
37
|
+
let(:private_key) { 'vNIXE0xscrmjlyV-12Nj_BvUPaw=' }
|
38
|
+
let(:url_with_key) { /^\S+client=\S+\&signature=\S+$/ }
|
39
|
+
|
40
|
+
before do
|
41
|
+
allow(Google::Directions.config).to receive(:sign).and_return(true)
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'when client_id and private_key are present' do
|
45
|
+
before do
|
46
|
+
allow(Google::Directions.config).to receive(:client_id).and_return(client_id)
|
47
|
+
allow(Google::Directions.config).to receive(:private_key).and_return(private_key)
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should add signature to query string over HTTPS' do
|
51
|
+
expect_any_instance_of(Patron::Session).to receive(:base_url=).with(/https/)
|
52
|
+
expect_any_instance_of(Patron::Session).to receive(:get).with(url_with_key).once
|
53
|
+
|
54
|
+
subject.get(params)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'when client_id is missing' do
|
59
|
+
it 'should raise an exception' do
|
60
|
+
expect{subject.get(params)}.to raise_error Google::Directions::Error, 'Missing parameter: client_id'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'when private_key is missing' do
|
65
|
+
before do
|
66
|
+
allow(Google::Directions.config).to receive(:client_id).and_return(client_id)
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'should raise an exception' do
|
70
|
+
expect{subject.get(params)}.to raise_error Google::Directions::Error, 'Missing parameter: private_key'
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
20
75
|
context 'when origin is missing' do
|
21
76
|
let(:params) { { destination: 'Rua Frei Galvão, 69, São Paulo' } }
|
22
77
|
|
data/wercker.yml
CHANGED
@@ -1,13 +1,21 @@
|
|
1
|
-
box:
|
1
|
+
box: wercker/rvm
|
2
2
|
build:
|
3
3
|
steps:
|
4
|
+
- script:
|
5
|
+
name: install ruby
|
6
|
+
code: |
|
7
|
+
rvm get latest
|
8
|
+
rvm reload
|
9
|
+
rvm install ruby-2.2.5
|
10
|
+
rvm --default use 2.2.5
|
11
|
+
gem install bundler
|
4
12
|
- bundle-install
|
5
13
|
- script:
|
6
14
|
name: echo ruby information
|
7
15
|
code: |
|
8
16
|
echo "RUBY version $(ruby --version) running"
|
9
17
|
echo "FROM location $(which ruby)"
|
10
|
-
|
18
|
+
echo -p "Gem list: $(gem list)"
|
11
19
|
- script:
|
12
20
|
name: rspec
|
13
21
|
code: bundle exec rspec
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: google-directions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Parafuzo Core Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -115,12 +115,14 @@ files:
|
|
115
115
|
- google-directions.gemspec
|
116
116
|
- lib/google/directions.rb
|
117
117
|
- lib/google/directions/config.rb
|
118
|
+
- lib/google/directions/encoder.rb
|
118
119
|
- lib/google/directions/error.rb
|
119
120
|
- lib/google/directions/request.rb
|
120
121
|
- lib/google/directions/version.rb
|
121
122
|
- spec/fixtures/vcr_cassettes/get_directions_simple.yml
|
122
123
|
- spec/fixtures/vcr_cassettes/get_directions_with_waypoints.yml
|
123
124
|
- spec/fixtures/vcr_cassettes/get_geocoded_directions_with_waypoints.yml
|
125
|
+
- spec/google/directions/encoder_spec.rb
|
124
126
|
- spec/google/directions/request_spec.rb
|
125
127
|
- spec/spec_helper.rb
|
126
128
|
- wercker.yml
|
@@ -152,5 +154,6 @@ test_files:
|
|
152
154
|
- spec/fixtures/vcr_cassettes/get_directions_simple.yml
|
153
155
|
- spec/fixtures/vcr_cassettes/get_directions_with_waypoints.yml
|
154
156
|
- spec/fixtures/vcr_cassettes/get_geocoded_directions_with_waypoints.yml
|
157
|
+
- spec/google/directions/encoder_spec.rb
|
155
158
|
- spec/google/directions/request_spec.rb
|
156
159
|
- spec/spec_helper.rb
|