routing 0.0.2 → 0.0.3
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.
- data/.gitignore +2 -1
- data/lib/routing/adapter/navteq.rb +15 -38
- data/lib/routing/parser/navteq_simple.rb +0 -2
- data/lib/routing/version.rb +1 -1
- data/routing.gemspec +2 -2
- data/spec/routing/adapter/navteq_spec.rb +58 -32
- metadata +10 -8
data/.gitignore
CHANGED
@@ -9,43 +9,29 @@ class Routing
|
|
9
9
|
# Array of {GeoPoint}s, representing the calculated route.
|
10
10
|
class Navteq
|
11
11
|
|
12
|
-
ATTR_ACCESSIBLE = [ :host, :default_params ]
|
13
|
-
|
14
12
|
def initialize(options = {})
|
15
|
-
options
|
16
|
-
|
17
|
-
|
13
|
+
@options = {
|
14
|
+
:service_path => '/routing/6.2/calculateroute.json',
|
15
|
+
:parser => ::Routing::Parser::NavteqSimple
|
16
|
+
}.merge(options)
|
18
17
|
end
|
19
18
|
|
20
19
|
def calculate(geo_points)
|
21
|
-
parse get(geo_points)
|
22
|
-
end
|
23
|
-
|
24
|
-
def get(geo_points)
|
25
|
-
params = default_params.merge geo_points_to_params(geo_points)
|
26
|
-
|
27
20
|
response = connection.get do |request|
|
28
|
-
request.url(service_path)
|
29
|
-
request.params =
|
21
|
+
request.url(options[:service_path])
|
22
|
+
request.params = default_params.merge(geo_points_to_params(geo_points))
|
30
23
|
end
|
31
|
-
|
32
|
-
response.body
|
24
|
+
parse(response.body)
|
33
25
|
end
|
34
26
|
|
35
|
-
|
36
|
-
|
37
|
-
def host
|
38
|
-
@host
|
39
|
-
end
|
27
|
+
private
|
40
28
|
|
41
29
|
def parse(response)
|
42
|
-
|
30
|
+
options[:parser].new(response).to_geo_points
|
43
31
|
end
|
44
32
|
|
45
|
-
attr_writer :default_params
|
46
|
-
|
47
33
|
def default_params
|
48
|
-
|
34
|
+
options[:default_params] || {
|
49
35
|
departure: Time.now.utc.iso8601,
|
50
36
|
mode0: "fastest;car",
|
51
37
|
language: "de_DE",
|
@@ -54,30 +40,21 @@ class Routing
|
|
54
40
|
}
|
55
41
|
end
|
56
42
|
|
57
|
-
protected
|
58
|
-
|
59
|
-
# The path on the server to the routing service.
|
60
|
-
# This is determined by the server and should not be changed.
|
61
|
-
#
|
62
|
-
# @returns [String]
|
63
|
-
# Path to the routing service.
|
64
|
-
def service_path
|
65
|
-
"/routing/6.2/calculateroute.json"
|
66
|
-
end
|
67
|
-
|
68
43
|
def geo_points_to_params(geo_points)
|
69
44
|
Hash[geo_points.each_with_index.map { |point, i| [ "waypoint#{i}", "geo!#{point.lat},#{point.lng}" ] }]
|
70
45
|
end
|
71
46
|
|
72
47
|
def connection
|
73
|
-
@connection ||= Faraday.new(:url => host) do |builder|
|
48
|
+
@connection ||= Faraday.new(:url => options[:host]) do |builder|
|
74
49
|
builder.request :url_encoded
|
75
|
-
builder.response :logger
|
76
50
|
builder.adapter :net_http
|
77
51
|
end
|
78
52
|
end
|
79
53
|
|
80
|
-
|
54
|
+
def options
|
55
|
+
@options || {}
|
56
|
+
end
|
81
57
|
|
58
|
+
end
|
82
59
|
end
|
83
60
|
end
|
data/lib/routing/version.rb
CHANGED
data/routing.gemspec
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
require File.expand_path('../lib/routing/version', __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
|
-
gem.authors = ["Christian Bäuerlein"]
|
6
|
-
gem.email = ["christian@ffwdme.com"]
|
5
|
+
gem.authors = ["Christian Bäuerlein", "Benedikt Deicke"]
|
6
|
+
gem.email = ["christian@ffwdme.com", "benedikt@synatic.net"]
|
7
7
|
gem.summary = %q{A ruby interface for route calculation services}
|
8
8
|
gem.description = %q{
|
9
9
|
Provides a generic interface for routing services that can by used to calculate directions between geolocations.
|
@@ -2,58 +2,84 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Routing::Adapter::Navteq do
|
4
4
|
|
5
|
-
|
5
|
+
let(:response) { mock(:response).as_null_object }
|
6
|
+
let(:request) { mock(:request).as_null_object }
|
7
|
+
let(:connection) { mock(:connection).as_null_object }
|
8
|
+
let(:parser_class) { mock(:parser_class, :new => parser) }
|
9
|
+
let(:parser) { mock(:parser).as_null_object }
|
10
|
+
|
11
|
+
let(:options) { { :host => 'http://example.com', :parser => parser_class } }
|
12
|
+
|
13
|
+
let(:geo_points) { [stub(:lat => 1, :lng => 2), stub(:lat => 3, :lng => 4), stub(:lat => 5, :lng => 6)] }
|
14
|
+
|
15
|
+
|
16
|
+
subject { described_class.new(options) }
|
17
|
+
|
18
|
+
before do
|
19
|
+
connection.stub(:get).and_yield(request).and_return(response)
|
20
|
+
Faraday.stub(:new).and_return(connection)
|
21
|
+
end
|
6
22
|
|
23
|
+
after { subject.calculate(geo_points) }
|
24
|
+
|
25
|
+
context 'creating a new instance' do
|
7
26
|
it 'can be instantiated without arguments' do
|
8
|
-
expect {
|
27
|
+
expect { described_class.new }.to_not raise_error
|
9
28
|
end
|
10
29
|
|
11
|
-
it '
|
12
|
-
|
30
|
+
it 'allows setting the host' do
|
31
|
+
Faraday.should_receive(:new).with(:url => 'http://other.com')
|
32
|
+
options.merge!(:host => 'http://other.com')
|
13
33
|
end
|
14
34
|
|
15
|
-
it '
|
35
|
+
it 'allows setting the default params' do
|
16
36
|
params = { :hello => "world" }
|
17
|
-
|
37
|
+
options.merge!(:default_params => params)
|
38
|
+
request.should_receive(:params=).with(hash_including(params))
|
18
39
|
end
|
19
40
|
|
20
|
-
it '
|
21
|
-
|
41
|
+
it 'should allow setting the service path' do
|
42
|
+
options.merge!(:service_path => '/some/path.json')
|
43
|
+
request.should_receive(:url).with('/some/path.json')
|
22
44
|
end
|
23
45
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
its(:default_params){ should be_a Hash }
|
46
|
+
it 'should use a default service path when none is given' do
|
47
|
+
request.should_receive(:url).with('/routing/6.2/calculateroute.json')
|
48
|
+
end
|
29
49
|
|
30
|
-
|
50
|
+
it 'should allow setting the parser' do
|
51
|
+
options.merge!(:parser => parser_class)
|
52
|
+
parser_class.should_receive(:new)
|
53
|
+
end
|
31
54
|
|
32
|
-
it '
|
33
|
-
|
55
|
+
it 'should use a default parser when none is given' do
|
56
|
+
options.delete(:parser)
|
57
|
+
Routing::Parser::NavteqSimple.should_receive(:new).and_return(parser)
|
34
58
|
end
|
35
59
|
|
60
|
+
it 'ignores unknown options' do
|
61
|
+
expect { described_class.new(:hello => "world") }.to_not raise_error
|
62
|
+
end
|
36
63
|
end
|
37
64
|
|
38
65
|
describe '#calculate' do
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
pending
|
44
|
-
end
|
45
|
-
|
46
|
-
describe '#geo_points_to_params' do
|
47
|
-
|
48
|
-
let(:geo_points) { [stub(:lat => 1, :lng => 2), stub(:lat => 3, :lng => 4), stub(:lat => 5, :lng => 6)] }
|
49
|
-
let(:params){ subject.send(:geo_points_to_params, geo_points) }
|
66
|
+
it 'passes the response body to the parser' do
|
67
|
+
response.stub(:body => '...')
|
68
|
+
parser_class.should_receive(:new).with('...')
|
69
|
+
end
|
50
70
|
|
51
|
-
it '
|
52
|
-
|
53
|
-
|
54
|
-
|
71
|
+
it 'should return the parser\'s result' do
|
72
|
+
result = [double, double, double]
|
73
|
+
parser.stub(:to_geo_points => result)
|
74
|
+
subject.calculate(geo_points).should be(result)
|
55
75
|
end
|
56
76
|
|
77
|
+
it 'should convert the geo points into a compatible format' do
|
78
|
+
request.should_receive(:params=).with hash_including({
|
79
|
+
'waypoint0' => 'geo!1,2',
|
80
|
+
'waypoint1' => 'geo!3,4',
|
81
|
+
'waypoint2' => 'geo!5,6'
|
82
|
+
})
|
83
|
+
end
|
57
84
|
end
|
58
|
-
|
59
85
|
end
|
metadata
CHANGED
@@ -1,19 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: routing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Christian Bäuerlein
|
9
|
+
- Benedikt Deicke
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date: 2012-
|
13
|
+
date: 2012-07-25 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: faraday
|
16
|
-
requirement: &
|
17
|
+
requirement: &70283743036520 !ruby/object:Gem::Requirement
|
17
18
|
none: false
|
18
19
|
requirements:
|
19
20
|
- - ! '>='
|
@@ -21,10 +22,10 @@ dependencies:
|
|
21
22
|
version: 0.7.0
|
22
23
|
type: :runtime
|
23
24
|
prerelease: false
|
24
|
-
version_requirements: *
|
25
|
+
version_requirements: *70283743036520
|
25
26
|
- !ruby/object:Gem::Dependency
|
26
27
|
name: json
|
27
|
-
requirement: &
|
28
|
+
requirement: &70283743036060 !ruby/object:Gem::Requirement
|
28
29
|
none: false
|
29
30
|
requirements:
|
30
31
|
- - ! '>='
|
@@ -32,10 +33,10 @@ dependencies:
|
|
32
33
|
version: '0'
|
33
34
|
type: :runtime
|
34
35
|
prerelease: false
|
35
|
-
version_requirements: *
|
36
|
+
version_requirements: *70283743036060
|
36
37
|
- !ruby/object:Gem::Dependency
|
37
38
|
name: rspec
|
38
|
-
requirement: &
|
39
|
+
requirement: &70283743035460 !ruby/object:Gem::Requirement
|
39
40
|
none: false
|
40
41
|
requirements:
|
41
42
|
- - ! '>='
|
@@ -43,12 +44,13 @@ dependencies:
|
|
43
44
|
version: 2.9.0
|
44
45
|
type: :development
|
45
46
|
prerelease: false
|
46
|
-
version_requirements: *
|
47
|
+
version_requirements: *70283743035460
|
47
48
|
description: ! "\n Provides a generic interface for routing services that can by
|
48
49
|
used to calculate directions between geolocations.\n Makes parsing and use-case
|
49
50
|
specific data handling easy trough an extendable middleware stack.\n "
|
50
51
|
email:
|
51
52
|
- christian@ffwdme.com
|
53
|
+
- benedikt@synatic.net
|
52
54
|
executables: []
|
53
55
|
extensions: []
|
54
56
|
extra_rdoc_files: []
|