routing 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6f2365563b9f8bbdedbfc071a7617b1d0d5865d1
4
- data.tar.gz: f39f04367027d8d773ff8e9e98246fc29649f701
3
+ metadata.gz: 7a49e29dbffb57a00e02111ebb486d6ef57c48d9
4
+ data.tar.gz: 0a4104acf4545f919bee3a4c7b22cdc8eb14076b
5
5
  SHA512:
6
- metadata.gz: 3bc6220170518feca7a9ba21ae7a0c4af6ba7a3cbe51b8ee5996f53f2a9552747acee5d74a02bf79ca19cc471ae45ea30073ca8a40b0b0784495dffc43757ef1
7
- data.tar.gz: fe3dde7390ad12fbed60fa4647877f16a82adef21ad1dad3dcd68e60ed4fecbf14f9e850c2c4d5c757e4be8897eaf1afe1c25206cdeafc8ee567942479d2b22b
6
+ metadata.gz: 10aa9dc049fe739036ce6149ec156735179a51bb8a33cb72ea2902d5a55d530402e40e35011801bfd631e104690b1022a3c1a9ca28fbda23199e82f5b32b331d
7
+ data.tar.gz: 98ebd1ea41a04d78d9aa8712fd2503bead5fd27640387a5fd54640e5d68d016d188906d4b74e7e278f153f9de0cfe5e6c7ef1ad03800a0e2f60e90584e456424
data/lib/routing.rb CHANGED
@@ -16,16 +16,16 @@ class Routing
16
16
  attr_writer :default_adapter
17
17
 
18
18
  # The default adapter/routing service that is used, if no one is specified.
19
- # Currently this is {Routing::Adapter::Navteq}.
19
+ # Currently this is {Routing::Adapter::Here}.
20
20
  #
21
21
  # @return [Object] Current default adapter.
22
22
  def default_adapter
23
- @default_adapter ||= Routing::Adapter::Navteq.new
23
+ @default_adapter ||= Routing::Adapter::Here.new
24
24
  end
25
25
 
26
26
  end
27
27
 
28
- attr_accessor :middlewares
28
+ attr_reader :adapter
29
29
 
30
30
  # Creates a new instance of the routing class
31
31
  #
@@ -37,6 +37,14 @@ class Routing
37
37
  yield(self) if block_given?
38
38
  end
39
39
 
40
+ # Returns a copy of the current middleware stack.
41
+ #
42
+ # @return [Array<Routing::Middleware>]
43
+ # An array of all registered middlewares.
44
+ def middlewares
45
+ @middlewares.dup
46
+ end
47
+
40
48
  # Calculates a route for the passed {GeoPoint}s.
41
49
  # These will be passed through the middleware stack and will
42
50
  # finally be given to the configured adapter which calculates a route out of it.
@@ -17,6 +17,7 @@ class Routing
17
17
 
18
18
  autoload :Here, "routing/adapter/here"
19
19
  autoload :Navteq, "routing/adapter/navteq"
20
+ autoload :RestAdapter, "routing/adapter/rest_adapter"
20
21
  autoload :Test, "routing/adapter/test"
21
22
 
22
23
  end
@@ -1,39 +1,15 @@
1
1
  require 'time'
2
- require 'faraday'
3
2
 
4
3
  class Routing
5
4
  module Adapter
6
-
7
5
  # Adapter for a Nokia Here Routing Service v7 server.
8
6
  # It passes the {GeoPoint}s to the routing service and will return another
9
7
  # Array of {GeoPoint}s, representing the calculated route.
10
- class Here
11
-
12
- def initialize(options = {})
13
- @options = {
14
- :host => 'http://route.api.here.com',
15
- :service_path => '/routing/7.2/calculateroute.json',
16
- :parser => ::Routing::Parser::HereSimple
17
- }.merge(options)
18
- end
19
-
20
- def calculate(geo_points)
21
- response = connection.get do |request|
22
- request.url(options[:service_path])
23
- request.params = default_params.merge(geo_points_to_params(geo_points)).merge(options[:credentials])
24
- end
25
-
26
- parse(response.body)
27
- end
8
+ class Here < RestAdapter
9
+ property :credentials, accepts: Hash
28
10
 
29
- private
30
-
31
- def parse(response)
32
- options[:parser].new(response).to_geo_points
33
- end
34
-
35
- def default_params
36
- options[:default_params] || {
11
+ def self.default_params
12
+ {
37
13
  departure: Time.now.utc.iso8601,
38
14
  mode: "fastest;car",
39
15
  language: "de_DE",
@@ -42,21 +18,17 @@ class Routing
42
18
  }
43
19
  end
44
20
 
45
- def geo_points_to_params(geo_points)
46
- Hash[geo_points.each_with_index.map { |point, i| [ "waypoint#{i}", "geo!#{point.lat},#{point.lng}" ] }]
47
- end
48
-
49
- def connection
50
- @connection ||= Faraday.new(:url => options[:host]) do |builder|
51
- builder.request :url_encoded
52
- builder.adapter :net_http
53
- end
21
+ def initialize(attrs = {})
22
+ attrs[:host] ||= 'route.api.here.com'
23
+ attrs[:path] ||= '/routing/7.2/calculateroute.json'
24
+ attrs[:parser] ||= ::Routing::Parser::HereSimple
25
+ super(attrs)
54
26
  end
55
27
 
56
- def options
57
- @options || {}
28
+ def calculate(geo_points)
29
+ response = request(params.merge(convert_geo_points_to_params(geo_points)).merge(credentials))
30
+ parse(response.body)
58
31
  end
59
-
60
32
  end
61
33
  end
62
34
  end
@@ -1,37 +1,13 @@
1
1
  require 'time'
2
- require 'faraday'
3
2
 
4
3
  class Routing
5
4
  module Adapter
6
-
7
5
  # Adapter for a NAVTEQ LBSP Routing Service v6 server.
8
6
  # It passes the {GeoPoint}s to the routing service and will return another
9
7
  # Array of {GeoPoint}s, representing the calculated route.
10
- class Navteq
11
-
12
- def initialize(options = {})
13
- @options = {
14
- :service_path => '/routing/6.2/calculateroute.json',
15
- :parser => ::Routing::Parser::NavteqSimple
16
- }.merge(options)
17
- end
18
-
19
- def calculate(geo_points)
20
- response = connection.get do |request|
21
- request.url(options[:service_path])
22
- request.params = default_params.merge(geo_points_to_params(geo_points))
23
- end
24
- parse(response.body)
25
- end
26
-
27
- private
28
-
29
- def parse(response)
30
- options[:parser].new(response).to_geo_points
31
- end
32
-
33
- def default_params
34
- options[:default_params] || {
8
+ class Navteq < RestAdapter
9
+ def self.default_params
10
+ {
35
11
  departure: Time.now.utc.iso8601,
36
12
  mode0: "fastest;car",
37
13
  language: "de_DE",
@@ -40,21 +16,11 @@ class Routing
40
16
  }
41
17
  end
42
18
 
43
- def geo_points_to_params(geo_points)
44
- Hash[geo_points.each_with_index.map { |point, i| [ "waypoint#{i}", "geo!#{point.lat},#{point.lng}" ] }]
45
- end
46
-
47
- def connection
48
- @connection ||= Faraday.new(:url => options[:host]) do |builder|
49
- builder.request :url_encoded
50
- builder.adapter :net_http
51
- end
19
+ def initialize(attrs = {})
20
+ attrs[:path] ||= '/routing/6.2/calculateroute.json'
21
+ attrs[:parser] ||= ::Routing::Parser::NavteqSimple
22
+ super(attrs)
52
23
  end
53
-
54
- def options
55
- @options || {}
56
- end
57
-
58
24
  end
59
25
  end
60
- end
26
+ end
@@ -0,0 +1,60 @@
1
+ require 'time'
2
+ require 'faraday'
3
+ require 'smart_properties'
4
+
5
+ class Routing
6
+ module Adapter
7
+ class RestAdapter
8
+ include SmartProperties
9
+
10
+ property :scheme, converts: :to_str, accepts: ['http', 'https'], default: 'http', required: true
11
+ property :host, converts: :to_str, required: true
12
+ property :path, converts: :to_str, required: true
13
+ property :parser, accepts: Class
14
+ property :params, accepts: Hash
15
+
16
+ def self.default_params
17
+ {}
18
+ end
19
+
20
+ def calculate(geo_points)
21
+ response = request(params.merge(convert_geo_points_to_params(geo_points)))
22
+ parse(response.body)
23
+ end
24
+
25
+ def params
26
+ super || self.class.default_params
27
+ end
28
+
29
+ private
30
+
31
+ def base_url
32
+ "%s://%s" % [scheme, host]
33
+ end
34
+
35
+ def request(params = nil)
36
+ connection.get do |request|
37
+ request.url(path)
38
+ request.params = params if params
39
+ yield request if block_given?
40
+ end
41
+ end
42
+
43
+ def connection
44
+ @connection ||= Faraday.new(url: base_url) do |builder|
45
+ builder.request :url_encoded
46
+ builder.adapter :net_http
47
+ end
48
+ end
49
+
50
+ def parse(response)
51
+ parser.new(response).to_geo_points
52
+ end
53
+
54
+ def convert_geo_points_to_params(geo_points)
55
+ Hash[geo_points.each_with_index.map { |point, i| [ "waypoint#{i}", "geo!#{point.lat},#{point.lng}" ] }]
56
+ end
57
+ end
58
+ end
59
+ end
60
+
@@ -46,7 +46,7 @@ class Routing
46
46
  # For the last leg we parse the last maneuver right at the end
47
47
  maneuvers = leg["maneuver"][0...-1]
48
48
  maneuvers.map do |maneuver|
49
- parse_maneuver(maneuver, :waypoint => (maneuver == maneuvers.first))
49
+ parse_maneuver(maneuver, waypoint: (maneuver == maneuvers.first))
50
50
  end
51
51
  end
52
52
 
@@ -89,7 +89,7 @@ class Routing
89
89
  # @raise [NoMatchingMappedPositionFound] If no matching original position is found.
90
90
  def search_original_position(geo_point)
91
91
  matching_waypoint = @route["waypoint"].detect do |waypoint|
92
- waypoint["mappedPosition"]["latitude"] == geo_point.lat &&
92
+ waypoint["mappedPosition"]["latitude"] == geo_point.lat &&
93
93
  waypoint["mappedPosition"]["longitude"] == geo_point.lng
94
94
  end or raise NoMatchingMappedPositionFound
95
95
 
@@ -46,7 +46,7 @@ class Routing
46
46
  # For the last leg we parse the last maneuver right at the end
47
47
  maneuvers = leg["Maneuver"][0...-1]
48
48
  maneuvers.map do |maneuver|
49
- parse_maneuver(maneuver, :waypoint => (maneuver == maneuvers.first))
49
+ parse_maneuver(maneuver, waypoint: (maneuver == maneuvers.first))
50
50
  end
51
51
  end
52
52
 
@@ -89,7 +89,7 @@ class Routing
89
89
  # @raise [NoMatchingMappedPositionFound] If no matching original position is found.
90
90
  def search_original_position(geo_point)
91
91
  matching_waypoint = @route["Waypoint"].detect do |waypoint|
92
- waypoint["MappedPosition"]["Latitude"] == geo_point.lat &&
92
+ waypoint["MappedPosition"]["Latitude"] == geo_point.lat &&
93
93
  waypoint["MappedPosition"]["Longitude"] == geo_point.lng
94
94
  end or raise NoMatchingMappedPositionFound
95
95
 
@@ -107,4 +107,4 @@ class Routing
107
107
 
108
108
  end
109
109
  end
110
- end
110
+ end
@@ -1,3 +1,3 @@
1
1
  class Routing
2
- VERSION = "0.0.4"
2
+ VERSION = "0.1.0"
3
3
  end
data/routing.gemspec CHANGED
@@ -13,7 +13,9 @@ Gem::Specification.new do |gem|
13
13
 
14
14
  gem.add_dependency "faraday", ">= 0.7.0"
15
15
  gem.add_dependency "json"
16
- gem.add_development_dependency "rspec", ">= 2.9.0"
16
+ gem.add_dependency "smart_properties", "~> 1.0"
17
+ gem.add_development_dependency "rspec", ">= 2.11"
18
+ gem.add_development_dependency "rake"
17
19
 
18
20
  gem.files = `git ls-files`.split($\)
19
21
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
@@ -21,4 +23,4 @@ Gem::Specification.new do |gem|
21
23
  gem.name = "routing"
22
24
  gem.require_paths = ["lib"]
23
25
  gem.version = Routing::VERSION
24
- end
26
+ end
@@ -2,23 +2,27 @@ require 'spec_helper'
2
2
 
3
3
  describe Routing::Adapter::Here do
4
4
 
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
-
5
+ let(:response) { double(:response).as_null_object }
6
+ let(:request) { double(:request).as_null_object }
7
+ let(:connection) { double(:connection).as_null_object }
8
+ let(:parser_class) do
9
+ Class.new.tap do |klass|
10
+ klass.stub(:new => parser)
11
+ end
12
+ end
13
+ let(:parser) { double(:parser).as_null_object }
14
+ let(:credentials) { {:app_id => "123", :app_code => "456"} }
11
15
  let(:options) do
12
- { :parser => parser_class, :credentials => { :app_id => "123", :app_code => "456" } }
16
+ { :parser => parser_class, :credentials => credentials}
13
17
  end
14
18
 
15
- let(:geo_points) { [stub(:lat => 1, :lng => 2), stub(:lat => 3, :lng => 4), stub(:lat => 5, :lng => 6)] }
19
+ let(:geo_points) { [double(:lat => 1, :lng => 2), double(:lat => 3, :lng => 4), double(:lat => 5, :lng => 6)] }
16
20
 
17
- subject { described_class.new(options) }
21
+ subject(:adapter) { described_class.new(options) }
18
22
 
19
23
  before do
20
- connection.stub(:get).and_yield(request).and_return(response)
21
- Faraday.stub(:new).and_return(connection)
24
+ allow(connection).to receive(:get).and_yield(request).and_return(response)
25
+ allow(Faraday).to receive(:new).and_return(connection)
22
26
  end
23
27
 
24
28
  context 'creating a new instance' do
@@ -27,37 +31,51 @@ describe Routing::Adapter::Here do
27
31
  end
28
32
 
29
33
  it 'allows setting the host' do
30
- Faraday.should_receive(:new).with(:url => 'http://other.com')
31
- options.merge!(:host => 'http://other.com')
34
+ expect(Faraday).to receive(:new).with(:url => 'http://other.com')
35
+
36
+ adapter = described_class.new(options.merge!(:host => 'other.com'))
37
+ adapter.calculate(geo_points)
32
38
  end
33
39
 
34
40
  it 'allows setting the default params' do
35
41
  params = { :hello => "world" }
36
- options.merge!(:default_params => params)
37
- request.should_receive(:params=).with(hash_including(params))
42
+ expect(request).to receive(:params=).with(hash_including(params))
43
+
44
+ adapter = described_class.new(options.merge(:params => params))
45
+ adapter.calculate(geo_points)
38
46
  end
39
47
 
40
48
  it 'sets the api credentials' do
41
- request.should_receive(:params=).with(hash_including({ :app_id => "123", :app_code => "456" }))
49
+ expect(request).to receive(:params=).with(hash_including({ :app_id => "123", :app_code => "456" }))
50
+ adapter.calculate(geo_points)
42
51
  end
43
52
 
44
53
  it 'should allow setting the service path' do
45
- options.merge!(:service_path => '/some/path.json')
46
- request.should_receive(:url).with('/some/path.json')
54
+ expect(request).to receive(:url).with('/some/path.json')
55
+
56
+ adapter = described_class.new(options.merge(:path => '/some/path.json'))
57
+ adapter.calculate(geo_points)
47
58
  end
48
59
 
49
60
  it 'should use a default service path when none is given' do
50
- request.should_receive(:url).with('/routing/7.2/calculateroute.json')
61
+ expect(request).to receive(:url).with('/routing/7.2/calculateroute.json')
62
+
63
+ adapter = described_class.new(options)
64
+ adapter.calculate(geo_points)
51
65
  end
52
66
 
53
67
  it 'should allow setting the parser' do
54
- options.merge!(:parser => parser_class)
55
- parser_class.should_receive(:new)
68
+ expect(parser_class).to receive(:new)
69
+
70
+ adapter = described_class.new(options.merge(:parser => parser_class))
71
+ adapter.calculate(geo_points)
56
72
  end
57
73
 
58
74
  it 'should use a default parser when none is given' do
59
- options.delete(:parser)
60
- Routing::Parser::HereSimple.should_receive(:new).and_return(parser)
75
+ expect(Routing::Parser::HereSimple).to receive(:new).and_return(parser)
76
+
77
+ adapter = described_class.new(credentials: credentials)
78
+ adapter.calculate(geo_points)
61
79
  end
62
80
 
63
81
  it 'ignores unknown options' do
@@ -68,21 +86,23 @@ describe Routing::Adapter::Here do
68
86
  describe '#calculate' do
69
87
  it 'passes the response to the parser' do
70
88
  response.stub(:body => '...')
71
- parser_class.should_receive(:new).with('...')
89
+ expect(parser_class).to receive(:new).with('...')
90
+ adapter.calculate(geo_points)
72
91
  end
73
92
 
74
93
  it 'should return the parser\'s result' do
75
94
  result = [double, double, double]
76
95
  parser.stub(:to_geo_points => result)
77
- subject.calculate(geo_points).should be(result)
96
+ expect(adapter.calculate(geo_points)).to be(result)
78
97
  end
79
98
 
80
99
  it 'should convert the geo points into a compatible format' do
81
- request.should_receive(:params=).with hash_including({
100
+ expect(request).to receive(:params=).with hash_including({
82
101
  'waypoint0' => 'geo!1,2',
83
102
  'waypoint1' => 'geo!3,4',
84
103
  'waypoint2' => 'geo!5,6'
85
104
  })
105
+ adapter.calculate(geo_points)
86
106
  end
87
107
  end
88
108
  end
@@ -1,85 +1,93 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Routing::Adapter::Navteq do
4
+ let(:response) { double(:response).as_null_object }
5
+ let(:request) { double(:request).as_null_object }
6
+ let(:connection) { double(:connection).as_null_object }
7
+ let(:parser_class) do
8
+ Class.new.tap do |klass|
9
+ klass.stub(new: parser)
10
+ end
11
+ end
12
+ let(:parser) { double(:parser).as_null_object }
13
+ let(:options) { { host: 'example.com', parser: parser_class } }
14
+ let(:geo_points) { [double(lat: 1, lng: 2), double(lat: 3, lng: 4), double(lat: 5, lng: 6)] }
4
15
 
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) }
16
+ subject(:adapter) { described_class.new(options) }
17
17
 
18
18
  before do
19
- connection.stub(:get).and_yield(request).and_return(response)
20
- Faraday.stub(:new).and_return(connection)
19
+ allow(connection).to receive(:get).and_yield(request).and_return(response)
20
+ allow(Faraday).to receive(:new).and_return(connection)
21
21
  end
22
22
 
23
23
  after { subject.calculate(geo_points) }
24
24
 
25
25
  context 'creating a new instance' do
26
- it 'can be instantiated without arguments' do
27
- expect { described_class.new }.to_not raise_error
28
- end
29
-
30
26
  it 'allows setting the host' do
31
- Faraday.should_receive(:new).with(:url => 'http://other.com')
32
- options.merge!(:host => 'http://other.com')
27
+ expect(Faraday).to receive(:new).with(url: 'http://other.com')
28
+
29
+ adapter = described_class.new(options.merge(host: 'other.com'))
30
+ adapter.calculate(geo_points)
33
31
  end
34
32
 
35
33
  it 'allows setting the default params' do
36
- params = { :hello => "world" }
37
- options.merge!(:default_params => params)
38
- request.should_receive(:params=).with(hash_including(params))
34
+ params = {hello: "world"}
35
+ expect(request).to receive(:params=).with(hash_including(params))
36
+
37
+ adapter = described_class.new(options.merge(params: params))
38
+ adapter.calculate(geo_points)
39
39
  end
40
40
 
41
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')
42
+ expect(request).to receive(:url).with('/some/path.json')
43
+
44
+ adapter = described_class.new(options.merge(path: '/some/path.json'))
45
+ adapter.calculate(geo_points)
44
46
  end
45
47
 
46
48
  it 'should use a default service path when none is given' do
47
- request.should_receive(:url).with('/routing/6.2/calculateroute.json')
49
+ expect(request).to receive(:url).with('/routing/6.2/calculateroute.json')
50
+ adapter.calculate(geo_points)
48
51
  end
49
52
 
50
53
  it 'should allow setting the parser' do
51
- options.merge!(:parser => parser_class)
52
- parser_class.should_receive(:new)
54
+ expect(parser_class).to receive(:new)
55
+
56
+ adapter = described_class.new(options.merge(parser: parser_class))
57
+ adapter.calculate(geo_points)
53
58
  end
54
59
 
55
60
  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)
61
+ expect(Routing::Parser::NavteqSimple).to receive(:new).and_return(parser)
62
+
63
+ adapter = described_class.new(host: 'example.com')
64
+ adapter.calculate(geo_points)
58
65
  end
59
66
 
60
67
  it 'ignores unknown options' do
61
- expect { described_class.new(:hello => "world") }.to_not raise_error
68
+ expect { described_class.new(options.merge(hello: "world")) }.to_not raise_error
62
69
  end
63
70
  end
64
71
 
65
72
  describe '#calculate' do
66
73
  it 'passes the response body to the parser' do
67
- response.stub(:body => '...')
68
- parser_class.should_receive(:new).with('...')
74
+ response.stub(body: '...')
75
+ expect(parser_class).to receive(:new).with('...')
76
+ adapter.calculate(geo_points)
69
77
  end
70
78
 
71
79
  it 'should return the parser\'s result' do
72
80
  result = [double, double, double]
73
- parser.stub(:to_geo_points => result)
74
- subject.calculate(geo_points).should be(result)
81
+ parser.stub(to_geo_points: result)
82
+ expect(subject.calculate(geo_points)).to be(result)
75
83
  end
76
84
 
77
85
  it 'should convert the geo points into a compatible format' do
78
- request.should_receive(:params=).with hash_including({
86
+ expect(request).to receive(:params=).with hash_including({
79
87
  'waypoint0' => 'geo!1,2',
80
88
  'waypoint1' => 'geo!3,4',
81
89
  'waypoint2' => 'geo!5,6'
82
90
  })
83
91
  end
84
92
  end
85
- end
93
+ end
@@ -1,29 +1,23 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Routing::Adapter::Test do
4
-
5
4
  context 'creating a new instance' do
6
-
7
5
  it 'can be instantiated without arguments' do
8
6
  expect { Routing::Adapter::Test.new }.to_not raise_error
9
7
  end
10
-
11
8
  end
12
9
 
13
10
  describe '#calculate' do
14
-
15
- let(:geo_points) { [stub(:lat => 1, :lng => 2), stub(:lat => 3, :lng => 4), stub(:lat => 5, :lng => 6)] }
11
+ let(:geo_points) { [double(lat: 1, lng: 2), double(lat: 3, lng: 4), double(lat: 5, lng: 6)] }
16
12
 
17
13
  it 'returns an array of geopoints with values that are passed to the method' do
18
14
  subject.calculate(geo_points).each_with_index do |new_geo_point, index|
19
- new_geo_point.lat.should eql(geo_points[index].lat)
20
- new_geo_point.lng.should eql(geo_points[index].lng)
21
- new_geo_point.original_lng.should eql(geo_points[index].lng)
22
- new_geo_point.original_lng.should eql(geo_points[index].lng)
23
- new_geo_point.should be_waypoint
15
+ expect(new_geo_point.lat).to eql(geo_points[index].lat)
16
+ expect(new_geo_point.lng).to eql(geo_points[index].lng)
17
+ expect(new_geo_point.original_lng).to eql(geo_points[index].lng)
18
+ expect(new_geo_point.original_lng).to eql(geo_points[index].lng)
19
+ expect(new_geo_point).to be_waypoint
24
20
  end
25
21
  end
26
-
27
22
  end
28
-
29
- end
23
+ end
@@ -10,8 +10,15 @@ describe Routing::GeoPoint do
10
10
  context 'initialized with attributes' do
11
11
  subject { described_class.new(:lat => 1, :lng => 2) }
12
12
 
13
- its(:lat) { should be(1) }
14
- its(:lng) { should be(2) }
13
+ describe '#lat' do
14
+ subject { super().lat }
15
+ it { should be(1) }
16
+ end
17
+
18
+ describe '#lng' do
19
+ subject { super().lng }
20
+ it { should be(2) }
21
+ end
15
22
 
16
23
  it 'ignores passed attributes that dont exist' do
17
24
  expect { described_class.new(:hello => :world) }.to_not raise_error
@@ -2,12 +2,11 @@ require 'spec_helper'
2
2
  require 'json'
3
3
 
4
4
  describe Routing::Parser::HereSimple do
5
-
6
5
  context 'with a error response' do
7
6
  let(:error_response) { fixture('here/error_response.json') }
8
7
 
9
8
  it 'should throw an RoutingFailed error' do
10
- lambda{ described_class.new(error_response) }.should raise_error(Routing::Parser::RoutingFailed)
9
+ expect{ described_class.new(error_response) }.to raise_error(Routing::Parser::RoutingFailed)
11
10
  end
12
11
  end
13
12
 
@@ -16,7 +15,7 @@ describe Routing::Parser::HereSimple do
16
15
  let(:json_response) { JSON.parse(response) }
17
16
  let(:original_geo_points) do
18
17
  json_response['response']['route'].first['waypoint'].collect do |waypoint|
19
- mock({
18
+ double({
20
19
  lat: waypoint['originalPosition']['latitude'],
21
20
  lng: waypoint['originalPosition']['longitude']
22
21
  })
@@ -27,7 +26,7 @@ describe Routing::Parser::HereSimple do
27
26
  subject { described_class.new(response).to_geo_points }
28
27
 
29
28
  it 'returns geopoints' do
30
- subject.each { |point| point.should be_a(::Routing::GeoPoint) }
29
+ subject.each { |point| expect(point).to be_a(::Routing::GeoPoint) }
31
30
  end
32
31
 
33
32
  describe 'number of geo points' do
@@ -36,15 +35,15 @@ describe Routing::Parser::HereSimple do
36
35
  let(:maneuver_size) { json_response["response"]["route"].first["leg"].inject(0) { |sum, leg| sum + leg["maneuver"].size } }
37
36
 
38
37
  it 'has the length of all maneuvers minus the duplicate ones at the touching points' do
39
- should have(maneuver_size - leg_touching_point_size).geo_points
38
+ expect(subject.size).to eq(maneuver_size - leg_touching_point_size)
40
39
  end
41
40
  end
42
41
 
43
42
  describe 'coordinates' do
44
43
  it 'sets the calculated latitude and longitude for each geo point' do
45
44
  subject.each do |geo_point|
46
- geo_point.lat.should be
47
- geo_point.lng.should be
45
+ expect(geo_point.lat).to be
46
+ expect(geo_point.lng).to be
48
47
  end
49
48
  end
50
49
  end
@@ -53,13 +52,13 @@ describe Routing::Parser::HereSimple do
53
52
  subject { described_class.new(response).to_geo_points.select(&:waypoint?) }
54
53
 
55
54
  it 'includes the same number of waypoints as passed in' do
56
- should have(original_geo_points.size).geo_points
55
+ expect(subject.size).to eq(original_geo_points.size)
57
56
  end
58
57
 
59
58
  it 'sets original_lat and original_lng on the waypoints' do
60
59
  subject.each_with_index do |geo_point, index|
61
- geo_point.original_lat.should eq(original_geo_points[index].lat)
62
- geo_point.original_lng.should eq(original_geo_points[index].lng)
60
+ expect(geo_point.original_lat).to eq(original_geo_points[index].lat)
61
+ expect(geo_point.original_lng).to eq(original_geo_points[index].lng)
63
62
  end
64
63
  end
65
64
 
@@ -2,12 +2,11 @@ require 'spec_helper'
2
2
  require 'json'
3
3
 
4
4
  describe Routing::Parser::NavteqSimple do
5
-
6
5
  context 'with a error response' do
7
6
  let(:error_response) { fixture('navteq/error_response.json') }
8
7
 
9
8
  it 'should throw an RoutingFailed error' do
10
- lambda{ described_class.new(error_response) }.should raise_error(Routing::Parser::RoutingFailed)
9
+ expect{ described_class.new(error_response) }.to raise_error(Routing::Parser::RoutingFailed)
11
10
  end
12
11
  end
13
12
 
@@ -16,7 +15,7 @@ describe Routing::Parser::NavteqSimple do
16
15
  let(:json_response) { JSON.parse(response) }
17
16
  let(:original_geo_points) do
18
17
  json_response['Response']['Route'].first['Waypoint'].collect do |waypoint|
19
- mock({
18
+ double({
20
19
  lat: waypoint['OriginalPosition']['Latitude'],
21
20
  lng: waypoint['OriginalPosition']['Longitude']
22
21
  })
@@ -27,7 +26,7 @@ describe Routing::Parser::NavteqSimple do
27
26
  subject { described_class.new(response).to_geo_points }
28
27
 
29
28
  it 'returns geopoints' do
30
- subject.each { |point| point.should be_a(::Routing::GeoPoint) }
29
+ subject.each { |point| expect(point).to be_a(::Routing::GeoPoint) }
31
30
  end
32
31
 
33
32
  describe 'number of geo points' do
@@ -36,15 +35,15 @@ describe Routing::Parser::NavteqSimple do
36
35
  let(:maneuver_size) { json_response["Response"]["Route"].first["Leg"].inject(0) { |sum, leg| sum + leg["Maneuver"].size } }
37
36
 
38
37
  it 'has the length of all maneuvers minus the duplicate ones at the touching points' do
39
- should have(maneuver_size - leg_touching_point_size).geo_points
38
+ expect(subject.size).to eq(maneuver_size - leg_touching_point_size)
40
39
  end
41
40
  end
42
41
 
43
42
  describe 'coordinates' do
44
43
  it 'sets the calculated latitude and longitude for each geo point' do
45
44
  subject.each do |geo_point|
46
- geo_point.lat.should be
47
- geo_point.lng.should be
45
+ expect(geo_point.lat).to be
46
+ expect(geo_point.lng).to be
48
47
  end
49
48
  end
50
49
  end
@@ -53,13 +52,13 @@ describe Routing::Parser::NavteqSimple do
53
52
  subject { described_class.new(response).to_geo_points.select(&:waypoint?) }
54
53
 
55
54
  it 'includes the same number of waypoints as passed in' do
56
- should have(original_geo_points.size).geo_points
55
+ expect(subject.size).to eq(original_geo_points.size)
57
56
  end
58
57
 
59
58
  it 'sets original_lat and original_lng on the waypoints' do
60
59
  subject.each_with_index do |geo_point, index|
61
- geo_point.original_lat.should eq(original_geo_points[index].lat)
62
- geo_point.original_lng.should eq(original_geo_points[index].lng)
60
+ expect(geo_point.original_lat).to eq(original_geo_points[index].lat)
61
+ expect(geo_point.original_lng).to eq(original_geo_points[index].lng)
63
62
  end
64
63
  end
65
64
 
@@ -78,4 +77,4 @@ describe Routing::Parser::NavteqSimple do
78
77
  end
79
78
  end
80
79
  end
81
- end
80
+ end
data/spec/routing_spec.rb CHANGED
@@ -1,23 +1,21 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Routing do
4
-
5
4
  context 'creating a new instance' do
6
-
7
- let(:adapter) { mock }
5
+ let(:adapter) { double }
8
6
 
9
7
  it 'can be called without arguments' do
10
8
  expect { Routing.new }.to_not raise_error
11
9
  end
12
10
 
13
11
  it 'uses the default adapter, if no adapter is passed' do
14
- described_class.default_adapter.should_receive(:calculate)
15
- subject.calculate(stub, stub)
12
+ expect(described_class.default_adapter).to receive(:calculate)
13
+ subject.calculate(double, double)
16
14
  end
17
15
 
18
16
  it 'takes the passed adapter, if given' do
19
- adapter.should_receive(:calculate)
20
- described_class.new(adapter).calculate(stub, stub)
17
+ expect(adapter).to receive(:calculate)
18
+ described_class.new(adapter).calculate(double, double)
21
19
  end
22
20
 
23
21
  it 'takes a configuration block' do
@@ -25,58 +23,48 @@ describe Routing do
25
23
  end
26
24
 
27
25
  it 'passes itself to the configuration block' do
28
- described_class.new { |r| r.should be_instance_of(described_class) }
26
+ described_class.new { |r| expect(r).to be_instance_of(described_class) }
29
27
  end
30
-
31
28
  end
32
29
 
33
30
  describe '#calculate' do
34
- let(:geo_points) { [stub(:lat => 1, :lng => 2), stub(:lat => 3, :lng => 4), stub(:lat => 5, :lng => 6)] }
35
- let(:adapter) { mock(:calculate => geo_points) }
31
+ let(:geo_points) { [double(lat: 1, lng: 2), double(lat: 3, lng: 4), double(lat: 5, lng: 6)] }
32
+ let(:adapter) { double(calculate: geo_points) }
36
33
 
37
34
  subject { described_class.new(adapter) }
38
35
 
39
36
  it 'should call the adapter' do
40
- adapter.should_receive(:calculate).with(geo_points)
37
+ expect(adapter).to receive(:calculate).with(geo_points)
41
38
  subject.calculate(geo_points)
42
39
  end
43
40
 
44
41
  it 'should call each middleware in the given order' do
45
42
  first_middleware = double(Routing::Middleware)
46
- first_middleware.should_receive(:calculate).
43
+ expect(first_middleware).to receive(:calculate).
47
44
  with(geo_points).and_yield(geo_points)
48
45
 
49
46
  second_middleware = double(Routing::Middleware)
50
- second_middleware.should_receive(:calculate).
47
+ expect(second_middleware).to receive(:calculate).
51
48
  with(geo_points)
52
49
 
53
- subject.stub(:middlewares).and_return([first_middleware, second_middleware])
50
+ allow(subject).to receive(:middlewares).and_return([first_middleware, second_middleware])
54
51
 
55
52
  subject.calculate(geo_points)
56
53
  end
57
54
  end
58
55
 
59
56
  context 'using the middleware' do
60
-
61
57
  it 'has an empty array of middlewares by default' do
62
- subject.middlewares.should be_an(Array)
63
- subject.should have(0).middlewares
58
+ expect(subject.middlewares).to be_an(Array)
59
+ expect(subject.middlewares.size).to eq(0)
64
60
  end
65
61
 
66
62
  describe '#use' do
67
63
  it 'appends the new middleware to the stack' do
68
64
  subject.use(:hello)
69
65
  subject.use(:world)
70
- subject.middlewares.should == [:hello, :world]
71
- end
72
- end
73
-
74
- describe '#middlewares' do
75
- it 'replaces all middlewares' do
76
- subject.use(:original)
77
- subject.middlewares = :first, :second
78
- subject.middlewares.should == [:first, :second]
66
+ expect(subject.middlewares).to eq([:hello, :world])
79
67
  end
80
68
  end
81
69
  end
82
- end
70
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: routing
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christian Bäuerlein
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-02-20 00:00:00.000000000 Z
12
+ date: 2014-07-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: faraday
@@ -39,20 +39,48 @@ dependencies:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: smart_properties
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '1.0'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '1.0'
42
56
  - !ruby/object:Gem::Dependency
43
57
  name: rspec
44
58
  requirement: !ruby/object:Gem::Requirement
45
59
  requirements:
46
60
  - - ">="
47
61
  - !ruby/object:Gem::Version
48
- version: 2.9.0
62
+ version: '2.11'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '2.11'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rake
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
49
77
  type: :development
50
78
  prerelease: false
51
79
  version_requirements: !ruby/object:Gem::Requirement
52
80
  requirements:
53
81
  - - ">="
54
82
  - !ruby/object:Gem::Version
55
- version: 2.9.0
83
+ version: '0'
56
84
  description: "\n Provides a generic interface for routing services that can by
57
85
  used to calculate directions between geolocations.\n Makes parsing and use-case
58
86
  specific data handling easy trough an extendable middleware stack.\n "
@@ -73,6 +101,7 @@ files:
73
101
  - lib/routing/adapter.rb
74
102
  - lib/routing/adapter/here.rb
75
103
  - lib/routing/adapter/navteq.rb
104
+ - lib/routing/adapter/rest_adapter.rb
76
105
  - lib/routing/adapter/test.rb
77
106
  - lib/routing/geo_point.rb
78
107
  - lib/routing/middleware.rb
@@ -112,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
112
141
  version: '0'
113
142
  requirements: []
114
143
  rubyforge_project:
115
- rubygems_version: 2.2.0
144
+ rubygems_version: 2.2.2
116
145
  signing_key:
117
146
  specification_version: 4
118
147
  summary: A ruby interface for route calculation services