traveltime-api-ruby 1.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.
Files changed (2) hide show
  1. data/lib/traveltime_api.rb +190 -0
  2. metadata +79 -0
@@ -0,0 +1,190 @@
1
+ require 'rest-client'
2
+ require 'json'
3
+
4
+ # Class for using TravelTime API service. Learn more about TravelTime at
5
+ # www.traveltimeapp.com
6
+ #
7
+ # ## Defined types ##
8
+ #
9
+ # * TransportationMode - string with one of following values:
10
+ # "walking", "driving", "walking_train", "walking_bus", "public_transport"
11
+ #
12
+ # * EdgeType - describes type of the edge. String with one of following values:
13
+ # "car", "walk", "train", "bus", "cable_car", "plane", "ship"
14
+ #
15
+ # ## Thrown errors ##
16
+ #
17
+ # Each method that does a call to the server can raise TravelTimeAPI::BadRequest
18
+ # or TravelTimeAPI::ServerError errors.
19
+ #
20
+ class TravelTimeAPI
21
+ DEFAULT_URL = "http://api.traveltimeapp.com"
22
+
23
+ # Raised if API user made bad request.
24
+ class BadRequest < RuntimeError
25
+ # Server provided String code for this error.
26
+ attr_reader :code
27
+ # Server provided String explanation of error.
28
+ attr_reader :details
29
+
30
+ def initialize(code, details)
31
+ @code = code
32
+ @details = details
33
+ end
34
+
35
+ def to_s
36
+ "TravelTimeAPI::BadRequest[#{@code}: #{details}]"
37
+ end
38
+ end
39
+
40
+ # Raised if API server has encountered an error.
41
+ class ServerError < RuntimeError
42
+ # Human readable error message.
43
+ attr_reader :error
44
+
45
+ def initialize(error)
46
+ @error = error
47
+ end
48
+
49
+ def to_s
50
+ "TravelTimeAPI::ServerError[#{@error}]"
51
+ end
52
+ end
53
+
54
+ # Represents that API does not have data for this point/region.
55
+ class NoData < RuntimeError; end
56
+
57
+ # Result of #time_filter method.
58
+ #
59
+ # @param points [Hash] {"id1" => time_in_seconds, ...}
60
+ # @param accuracy [Symbol] :exact or :approx. Decrease travel time to switch
61
+ # from approximate to exact accuracy.
62
+ class TimeFilterResult < Struct.new(:points, :accuracy); end
63
+
64
+ # Result of #time_map method.
65
+ #
66
+ # @param shape [Array] array of polylines that represent areas reachable by given time.
67
+ # [Cluster, Cluster, ...], where Cluster is [[lat, lon], [lat, lon], ...]
68
+ # @param accuracy [Symbol] :exact or :approx. Decrease travel time to switch
69
+ # from approximate to exact accuracy.
70
+ class TimeMapResult < Struct.new(:shape, :accuracy); end
71
+
72
+ # Result of #routes method.
73
+ #
74
+ # * RouteDescriptionPart is a structure describing one part of the route:
75
+ # {
76
+ # "mode": EdgeType,
77
+ # # Array of coordinates for this route part. Can be used to draw a polyline
78
+ # # on a map.
79
+ # "coords": [[lat, lon], [lat, lon], [lat, lon], ...],
80
+ # "directions: String, # textual description in english of this route part
81
+ # "distance": Int, # distance covered in metres for this route part
82
+ # "time": Int # time taken to travel through this route part in seconds
83
+ # }
84
+ #
85
+ # @param routes [Hash] {"id1" -> [RouteDescriptionPart, RouteDescriptionPart, ...], ...}
86
+ class RoutesResult < Struct.new(:routes); end
87
+
88
+ # Initializes API. You need to specify your API key here.
89
+ def initialize(api_key, url=DEFAULT_URL)
90
+ @api_key = api_key
91
+ @url = url
92
+ end
93
+
94
+ # Takes input parameters and returns how long does it take to reach each point
95
+ # in chosen mode of transportation (in seconds).
96
+ #
97
+ # Points whose travel times which exceed _travel_time_ are not included in the
98
+ # result.
99
+ #
100
+ # @param start_time [Time] Time moment when we start our search.
101
+ # @param travel_time [Int] Max time in seconds to the point.
102
+ # @param mode [String] Transportation mode. See class documentation for info.
103
+ # @param origin [Array] [latitude, longtitude]
104
+ # @param points [Hash] Points th{"id1" => [latitude, longtitude], ...}
105
+ # @return [TravelTimeAPI::TimeFilterResult]
106
+ def time_filter(start_time, travel_time, mode, origin, points)
107
+ request = {
108
+ :start_time => format_time(start_time),
109
+ :travel_time => travel_time,
110
+ :mode => mode,
111
+ :origin => origin,
112
+ :points => points
113
+ }
114
+
115
+ response = post("/v2/time_filter", request)
116
+ TimeFilterResult.new(response["times"], response["accuracy"].to_sym)
117
+ end
118
+
119
+ # Takes input parameters and returns polylines for each cluster that you can
120
+ # reach by given time.
121
+ #
122
+ # @param start_time [Time] Time moment when we start our search.
123
+ # @param travel_time [Int] Max time in seconds to the point.
124
+ # @param mode [String] Transportation mode. See class documentation for info.
125
+ # @param origin [Array] [latitude, longtitude]
126
+ # @param smooth [Boolean] Shall the returned shaped be smoothed?
127
+ # @return [TravelTimeAPI::TimeMapResult]
128
+ def time_map(start_time, travel_time, mode, origin, smooth)
129
+ request = {
130
+ :start_time => format_time(start_time),
131
+ :travel_time => travel_time,
132
+ :mode => mode,
133
+ :origin => origin,
134
+ :smooth => smooth
135
+ }
136
+
137
+ response = post("/v2/time_map", request)
138
+ TimeMapResult.new(response["shape"], response["accuracy"].to_sym)
139
+ end
140
+
141
+ # Takes input parameters and returns routes to each of the points within
142
+ # travel_time.
143
+ #
144
+ # Input parameters are the same as #travel_time.
145
+ # @return [TravelTimeAPI::RoutesResult]
146
+ def routes(start_time, travel_time, mode, origin, points)
147
+ request = {
148
+ :start_time => format_time(start_time),
149
+ :travel_time => travel_time,
150
+ :mode => mode,
151
+ :origin => origin,
152
+ :points => points
153
+ }
154
+
155
+ response = post("/v2/routes", request)
156
+ RoutesResult.new(response)
157
+ end
158
+
159
+ private
160
+
161
+ def format_time(time)
162
+ time.strftime("%FT%T%:z")
163
+ end
164
+
165
+ def post(action, request)
166
+ response = RestClient.post(
167
+ @url + action,
168
+ request.merge(:api_key => @api_key).to_json,
169
+ :content_type => :json
170
+ )
171
+ json = JSON.parse(response)
172
+ case json["code"]
173
+ when "no-data"
174
+ raise NoData
175
+ when nil
176
+ json
177
+ else
178
+ raise ServerError.new(
179
+ "code: #{json["code"]}, details: #{json["details"]}"
180
+ )
181
+ end
182
+ rescue RestClient::ExceptionWithResponse => e
183
+ raise ServerError.new(
184
+ "server error, http_status: #{e.http_code}, http_body: #{e.http_body}"
185
+ )
186
+ rescue JSON::ParserError => e
187
+ raise ServerError.new("Cannot parse server response as JSON", response)
188
+ end
189
+
190
+ end
metadata ADDED
@@ -0,0 +1,79 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: traveltime-api-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Artūras Šlajus
9
+ - IGeolise
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2013-01-25 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rest-client
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: 1.6.7
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: 1.6.7
31
+ - !ruby/object:Gem::Dependency
32
+ name: json
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: 1.7.0
39
+ type: :runtime
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: 1.7.0
47
+ description: ''
48
+ email:
49
+ - arturas@igeolise.com
50
+ executables: []
51
+ extensions: []
52
+ extra_rdoc_files: []
53
+ files:
54
+ - lib/traveltime_api.rb
55
+ homepage: http://traveltimeapp.com
56
+ licenses: []
57
+ post_install_message:
58
+ rdoc_options: []
59
+ require_paths:
60
+ - lib
61
+ required_ruby_version: !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
70
+ - - ! '>='
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ requirements: []
74
+ rubyforge_project:
75
+ rubygems_version: 1.8.24
76
+ signing_key:
77
+ specification_version: 3
78
+ summary: Simple wrapper for TravelTime REST API.
79
+ test_files: []