broutes 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- NzQyYjM1NDdiMDY2Njk3ZmJiOGY0NGM5YmMwYjU3MGVlNGZmMmE4Mg==
5
- data.tar.gz: !binary |-
6
- YTJiZjQ3Nzk5NTA1YTE1NzYwODA2YTlkNjQzYmJiMDQxNTljYzM0Yg==
7
- !binary "U0hBNTEy":
8
- metadata.gz: !binary |-
9
- ZWRmMTYwMGY1OTQ1ODdhZWY2NjE1MzkyNmFjZDA5MzNlMjMxNmVkMzViMTA5
10
- MGI4Yjk0ZTI2YTRkMjgwMDkxZjE5ZWZkMzE3MTQxN2M2YWU2OTAzYTNlMmQ4
11
- YmYzM2JlOThiMTkxYzUzNmI2MjlmNDBmNmM5M2YzZWFkYmYzZjI=
12
- data.tar.gz: !binary |-
13
- Y2U5NmE5OWIyMzVhYzA3Y2FlMmNhN2M0MjA5YjdlYTU2NjVjMWQ2MmVkZGUw
14
- NzQ4NWY0MTFmMDQwYzNlMjNjZTZlNzVhNTU0ZmNlOTZkNTBlMjZlY2ZkMTM1
15
- Y2E5NjEzZWFiNGFmYmM5OTAzNDUxZDc0NDVkNGI4OGFhYTc5MDE=
2
+ SHA1:
3
+ metadata.gz: 515ec9b7e7515cda5606a8b506af2bf15ddc7d8d
4
+ data.tar.gz: e6d0da5f298f8ca13a41fc243cda655953365922
5
+ SHA512:
6
+ metadata.gz: f13a1665b145bb5f0013051e91b24c8399c579ed543e932ad710c9c45f4fdef08cb4fe164faa94324839f328696dab8693c715817a26f490d878b411622dd1fd
7
+ data.tar.gz: cc5c63cec6a7dabc3b3dba62bed7e3fec8b504cd2e8fa318eb364cb08b9b7f15359fc9b4a47fd4ab9a675c21cbc7c2cc82117601183141b90b0ff73d0ab2e45f
@@ -10,7 +10,7 @@ module Broutes
10
10
  end
11
11
 
12
12
  def initialize(args={})
13
- args.each_pair do |key, value|
13
+ args.each_pair do |key, value|
14
14
  if key.to_sym == :points
15
15
  value.each { |p| add_point(p) }
16
16
  else
@@ -100,10 +100,82 @@ module Broutes
100
100
  (total_distance > 0) ? (total_ascent * 1000 / total_distance) : 0
101
101
  end
102
102
 
103
+ # Public: Get average heart_rate for whole GeoRoute.
104
+ #
105
+ # Examples
106
+ # @route.average_heart_rate
107
+ # # => 12
108
+ #
109
+ # Returns Integer average, or 0 if no heart_rate on points.
110
+ def average_heart_rate
111
+ points = @_points
112
+ points.map { |p| p.heart_rate || 0 }.inject { |sum, hr| sum + hr } / points.count
113
+ end
114
+
115
+ # Public: Get average power for whole GeoRoute.
116
+ #
117
+ # Examples
118
+ # @route.average_power
119
+ # # => 250
120
+ #
121
+ # Returns Float average, or 0 if no power on points.
122
+ def average_power
123
+ points = @_points
124
+ points.map { |p| p.power || 0 }.inject { |sum, p| sum + p } / points.count
125
+ end
126
+
127
+ # Public: Get maximum heart rate for whole GeoRoute.
128
+ #
129
+ # Examples
130
+ # @route.maximum_heart_rate
131
+ # # => 180
132
+ #
133
+ # Returns Integer maximum, or 0 if no heart rate on points.
134
+ def maximum_heart_rate
135
+ points = @_points
136
+ points.map { |p| p.heart_rate }.compact.max || 0
137
+ end
138
+
139
+ # Public: Get minimum heart rate for whole GeoRoute.
140
+ #
141
+ # Examples
142
+ # @route.minimum_heart_rate
143
+ # # => 100
144
+ #
145
+ # Returns Integer minimum, or 0 if no heart rate on points.
146
+ def minimum_heart_rate
147
+ points = @_points
148
+ points.map { |p| p.heart_rate }.compact.min || 0
149
+ end
150
+
151
+ # Public: Get maximum elevation for whole GeoRoute.
152
+ #
153
+ # Examples
154
+ # @route.maximum_elevation
155
+ # # => 1000
156
+ #
157
+ # Returns Integer maximum, or 0 if no elevation on points.
158
+ def maximum_elevation
159
+ points = @_points
160
+ points.map { |p| p.elevation }.compact.max || 0
161
+ end
162
+
163
+ # Public: Get minimum elevation for whole GeoRoute.
164
+ #
165
+ # Examples
166
+ # @route.minimum_elevation
167
+ # # => 10
168
+ #
169
+ # Returns Integer minimum, or 0 if no elevation on points.
170
+ def minimum_elevation
171
+ points = @_points
172
+ points.map { |p| p.elevation }.compact.min || 0
173
+ end
174
+
103
175
  private
104
176
 
105
177
  def get_points
106
178
  @_points ||= []
107
179
  end
108
180
  end
109
- end
181
+ end
@@ -1,3 +1,3 @@
1
1
  module Broutes
2
- VERSION = "0.1.3".freeze
2
+ VERSION = "0.2.0".freeze
3
3
  end
@@ -44,11 +44,11 @@ describe Formats::FitFile do
44
44
  @route.total_time.round.should eq(13675)
45
45
  end
46
46
  it "sets the started_at" do
47
- @route.started_at.to_i.should eq(Time.new(2012, 5, 12, 7, 29, 45).to_i)
47
+ @route.started_at.to_i.should eq(Time.new(2012, 5, 11, 23, 29, 45, "-07:00").to_i)
48
48
  end
49
49
  it "sets the ended_at" do
50
- @route.ended_at.to_i.should eq(Time.new(2012, 5, 12, 11, 17, 40).to_i)
50
+ @route.ended_at.to_i.should eq(Time.new(2012, 5, 12, 3, 17, 40, "-07:00").to_i)
51
51
  end
52
52
 
53
53
  end
54
- end
54
+ end
@@ -29,10 +29,10 @@ describe Formats::GpxTrack do
29
29
  @route.total_time.round.should eq(1231)
30
30
  end
31
31
  it "sets the started_at" do
32
- @route.started_at.to_i.should eq(Time.new(2011, 5, 19, 17, 57, 21).to_i)
32
+ @route.started_at.to_i.should eq(Time.new(2011, 5, 19, 16, 57, 21, "+00:00").to_i)
33
33
  end
34
34
  it "sets the ended_at" do
35
- @route.ended_at.to_i.should eq(Time.new(2011, 5, 19, 18, 17, 52).to_i)
35
+ @route.ended_at.to_i.should eq(Time.new(2011, 5, 19, 17, 17, 52, "+00:00").to_i)
36
36
  end
37
37
  end
38
38
  describe "when file doesn't have elevation" do
@@ -29,10 +29,10 @@ describe Formats::Tcx do
29
29
  @route.total_time.round.should eq(10631)
30
30
  end
31
31
  it "sets the started_at" do
32
- @route.started_at.to_i.should eq(Time.new(2012, 3, 15, 21, 20, 38).to_i)
32
+ @route.started_at.to_i.should eq(Time.new(2012, 3, 15, 21, 20, 38, "+00:00").to_i)
33
33
  end
34
34
  it "sets the ended_at" do
35
- @route.ended_at.to_i.should eq(Time.new(2012, 3, 16, 00, 17, 49).to_i)
35
+ @route.ended_at.to_i.should eq(Time.new(2012, 3, 16, 00, 17, 49, "+00:00").to_i)
36
36
  end
37
37
  it "can create hash" do
38
38
  @route.to_hash
@@ -78,6 +78,27 @@ describe Formats::Tcx do
78
78
  it "sets the total time" do
79
79
  @route.total_time.round.should eq(6926)
80
80
  end
81
+ it "sets the hilliness" do
82
+ @route.hilliness.should eq(9.482364000273426)
83
+ end
84
+ it "sets the average heart rate" do
85
+ @route.average_heart_rate.should eq(139)
86
+ end
87
+ it "sets the average power" do
88
+ @route.average_power.should eq(174)
89
+ end
90
+ it "sets the maximum heart rate" do
91
+ @route.maximum_heart_rate.should eq(189)
92
+ end
93
+ it "sets the minimum heart rate" do
94
+ @route.minimum_heart_rate.should eq(59)
95
+ end
96
+ it "sets the maximum elevation" do
97
+ @route.maximum_elevation.should eq(85.0)
98
+ end
99
+ it "sets the minimum elevation" do
100
+ @route.minimum_elevation.should eq(0)
101
+ end
81
102
  it "can create hash" do
82
103
  @route.to_hash
83
104
  end
@@ -149,4 +170,4 @@ describe Formats::Tcx do
149
170
  @route.to_hash['started_at'].should_not be_nil
150
171
  end
151
172
  end
152
- end
173
+ end
@@ -166,9 +166,153 @@ describe GeoRoute do
166
166
  end
167
167
  end
168
168
 
169
+ describe "#average_heart_rate" do
170
+ before(:each) do
171
+ @route = GeoRoute.new
172
+ end
173
+
174
+ context 'when the route points have heart rates' do
175
+ before(:each) do
176
+ @route.add_point(lat: random_lat, lon: random_lon, elevation: random_elevation, heart_rate: 15)
177
+ @route.add_point(lat: random_lat, lon: random_lon, elevation: random_elevation, heart_rate: 10)
178
+ end
179
+ it 'should return average heart rate' do
180
+ @route.average_heart_rate.should eq(12)
181
+ end
182
+ end
183
+ context 'when the route points have no heart rate' do
184
+ before(:each) do
185
+ @route.add_point(lat: random_lat, lon: random_lon, elevation: random_elevation)
186
+ end
187
+ it 'should return 0' do
188
+ @route.average_heart_rate.should eq(0)
189
+ end
190
+ end
191
+ end
192
+
193
+ describe "#maximum_heart_rate" do
194
+ before(:each) do
195
+ @route = GeoRoute.new
196
+ end
197
+
198
+ context 'when the route points have heart rates' do
199
+ before(:each) do
200
+ @route.add_point(lat: random_lat, lon: random_lon, elevation: random_elevation, heart_rate: 15)
201
+ @route.add_point(lat: random_lat, lon: random_lon, elevation: random_elevation, heart_rate: 10)
202
+ end
203
+ it 'should return maximum heart rate' do
204
+ @route.maximum_heart_rate.should eq(15)
205
+ end
206
+ end
207
+ context 'when the route points have no heart rate' do
208
+ before(:each) do
209
+ @route.add_point(lat: random_lat, lon: random_lon, elevation: random_elevation)
210
+ end
211
+ it 'should return 0' do
212
+ @route.maximum_heart_rate.should eq(0)
213
+ end
214
+ end
215
+ end
216
+
217
+ describe "#minimum_heart_rate" do
218
+ before(:each) do
219
+ @route = GeoRoute.new
220
+ end
221
+
222
+ context 'when the route points have heart rates' do
223
+ before(:each) do
224
+ @route.add_point(lat: random_lat, lon: random_lon, elevation: random_elevation, heart_rate: 15)
225
+ @route.add_point(lat: random_lat, lon: random_lon, elevation: random_elevation, heart_rate: 10)
226
+ end
227
+ it 'should return minimum heart rate' do
228
+ @route.minimum_heart_rate.should eq(10)
229
+ end
230
+ end
231
+ context 'when the route points have no heart rate' do
232
+ before(:each) do
233
+ @route.add_point(lat: random_lat, lon: random_lon, elevation: random_elevation)
234
+ end
235
+ it 'should return 0' do
236
+ @route.minimum_heart_rate.should eq(0)
237
+ end
238
+ end
239
+ end
240
+
241
+ describe "#maximum_elevation" do
242
+ before(:each) do
243
+ @route = GeoRoute.new
244
+ end
245
+
246
+ context 'when the route points have elevations' do
247
+ before(:each) do
248
+ @route.add_point(lat: random_lat, lon: random_lon, elevation: 217)
249
+ @route.add_point(lat: random_lat, lon: random_lon, elevation: 212)
250
+ end
251
+ it 'should return maximum elevation' do
252
+ @route.maximum_elevation.should eq(217)
253
+ end
254
+ end
255
+ context 'when the route points have no elevations' do
256
+ before(:each) do
257
+ @route.add_point(lat: random_lat, lon: random_lon)
258
+ end
259
+ it 'should return 0' do
260
+ @route.maximum_elevation.should eq(0)
261
+ end
262
+ end
263
+ end
264
+
265
+ describe "#minimum_elevation" do
266
+ before(:each) do
267
+ @route = GeoRoute.new
268
+ end
269
+
270
+ context 'when the route points have elevations' do
271
+ before(:each) do
272
+ @route.add_point(lat: random_lat, lon: random_lon, elevation: 217)
273
+ @route.add_point(lat: random_lat, lon: random_lon, elevation: 212)
274
+ end
275
+ it 'should return minimum elevation' do
276
+ @route.minimum_elevation.should eq(212)
277
+ end
278
+ end
279
+ context 'when the route points have no elevations' do
280
+ before(:each) do
281
+ @route.add_point(lat: random_lat, lon: random_lon)
282
+ end
283
+ it 'should return 0' do
284
+ @route.maximum_elevation.should eq(0)
285
+ end
286
+ end
287
+ end
288
+
289
+ describe "#average_power" do
290
+ before(:each) do
291
+ @route = GeoRoute.new
292
+ end
293
+
294
+ context 'when the route points have power' do
295
+ before(:each) do
296
+ @route.add_point(lat: random_lat, lon: random_lon, elevation: random_elevation, power: 250)
297
+ @route.add_point(lat: random_lat, lon: random_lon, elevation: random_elevation, power: 233)
298
+ end
299
+ it 'should return average power' do
300
+ @route.average_power.should eq(241)
301
+ end
302
+ end
303
+ context 'when the route points have no power' do
304
+ before(:each) do
305
+ @route.add_point(lat: random_lat, lon: random_lon, elevation: random_elevation)
306
+ end
307
+ it 'should return 0' do
308
+ @route.average_power.should eq(0)
309
+ end
310
+ end
311
+ end
312
+
169
313
  describe ".from_hash" do
170
314
  let(:started_at) { Time.now }
171
- let(:points) {[
315
+ let(:points) {[
172
316
  GeoPoint.new(lat: random_lat, lon: random_lon, time: started_at),
173
317
  GeoPoint.new(lat: random_lat, lon: random_lon, time: started_at + 1),
174
318
  GeoPoint.new(lat: random_lat, lon: random_lon, time: started_at + 2)
data/spec/spec_helper.rb CHANGED
@@ -29,6 +29,10 @@ def random_string
29
29
  (0...24).map{ ('a'..'z').to_a[rand(26)] }.join
30
30
  end
31
31
 
32
+ def random_heart_rate
33
+ rand
34
+ end
35
+
32
36
  def round_to(number, decimal_places)
33
37
  if number
34
38
  if decimal_places > 0
@@ -45,4 +49,4 @@ end
45
49
 
46
50
  def open_file(name)
47
51
  File.open("#{Rake.application.original_dir}/spec/support/#{name}")
48
- end
52
+ end
metadata CHANGED
@@ -1,41 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: broutes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Bird
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-04-16 00:00:00.000000000 Z
11
+ date: 2015-07-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.5'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.5'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: garmin-fit
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: 0.0.2
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.0.2
41
41
  description: Utilities for parsing and creating geo route files
@@ -44,17 +44,17 @@ executables: []
44
44
  extensions: []
45
45
  extra_rdoc_files: []
46
46
  files:
47
+ - lib/broutes.rb
48
+ - lib/broutes/formats.rb
47
49
  - lib/broutes/formats/factory.rb
48
50
  - lib/broutes/formats/fit_file.rb
49
51
  - lib/broutes/formats/gpx_route.rb
50
52
  - lib/broutes/formats/gpx_track.rb
51
53
  - lib/broutes/formats/tcx.rb
52
- - lib/broutes/formats.rb
53
54
  - lib/broutes/geo_point.rb
54
55
  - lib/broutes/geo_route.rb
55
56
  - lib/broutes/maths.rb
56
57
  - lib/broutes/version.rb
57
- - lib/broutes.rb
58
58
  - spec/broutes/formats/factory_spec.rb
59
59
  - spec/broutes/formats/fit_file_spec.rb
60
60
  - spec/broutes/formats/gpx_route_spec.rb
@@ -83,17 +83,17 @@ require_paths:
83
83
  - lib
84
84
  required_ruby_version: !ruby/object:Gem::Requirement
85
85
  requirements:
86
- - - ! '>='
86
+ - - ">="
87
87
  - !ruby/object:Gem::Version
88
88
  version: '0'
89
89
  required_rubygems_version: !ruby/object:Gem::Requirement
90
90
  requirements:
91
- - - ! '>='
91
+ - - ">="
92
92
  - !ruby/object:Gem::Version
93
93
  version: '0'
94
94
  requirements: []
95
95
  rubyforge_project:
96
- rubygems_version: 2.0.3
96
+ rubygems_version: 2.2.2
97
97
  signing_key:
98
98
  specification_version: 4
99
99
  summary: Utilities for parsing and creating geo route files