postrunner 0.0.4 → 0.0.5

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.
@@ -1,6 +1,19 @@
1
+ #!/usr/bin/env ruby -w
2
+ # encoding: UTF-8
3
+ #
4
+ # = PostRunner_spec.rb -- PostRunner - Manage the data from your Garmin sport devices.
5
+ #
6
+ # Copyright (c) 2014 by Chris Schlaeger <cs@taskjuggler.org>
7
+ #
8
+ # This program is free software; you can redistribute it and/or modify
9
+ # it under the terms of version 2 of the GNU General Public License as
10
+ # published by the Free Software Foundation.
11
+ #
12
+
1
13
  require 'fileutils'
2
14
 
3
15
  require 'postrunner/Main'
16
+ require 'spec_helper'
4
17
 
5
18
  describe PostRunner::Main do
6
19
 
@@ -13,25 +26,6 @@ describe PostRunner::Main do
13
26
  stdout.string
14
27
  end
15
28
 
16
- def create_fit_file(name, date)
17
- a = Fit4Ruby::Activity.new
18
- a.timestamp = Time.parse(date)
19
- a.total_timer_time = 30 * 60
20
- 0.upto(30) do |mins|
21
- r = a.new_record('record')
22
- r.timestamp = a.timestamp + mins * 60
23
- r.distance = 200.0 * mins
24
- r.cadence = 75
25
-
26
- if mins > 0 && mins % 5 == 0
27
- s = a.new_record('laps')
28
- end
29
- end
30
- a.new_record('session')
31
- a.aggregate
32
- Fit4Ruby.write(name, a)
33
- end
34
-
35
29
  before(:all) do
36
30
  @db_dir = File.join(File.dirname(__FILE__), '.postrunner')
37
31
  FileUtils.rm_rf(@db_dir)
@@ -82,11 +76,13 @@ describe PostRunner::Main do
82
76
  postrunner(%w( list )).index('FILE1.FIT').should be_a(Fixnum)
83
77
  end
84
78
 
85
- it 'should import another FIT file' do
86
- postrunner(%w( import FILE2.FIT ))
79
+ it 'should import the other FIT file' do
80
+ postrunner([ 'import', '.' ])
87
81
  list = postrunner(%w( list ))
88
82
  list.index('FILE1.FIT').should be_a(Fixnum)
89
83
  list.index('FILE2.FIT').should be_a(Fixnum)
84
+ rc = YAML::load_file(File.join(@db_dir, 'config.yml'))
85
+ rc[:import_dir].should == '.'
90
86
  end
91
87
 
92
88
  it 'should delete the first file' do
@@ -118,5 +114,13 @@ describe PostRunner::Main do
118
114
  postrunner(%w( dump FILE1.FIT ))
119
115
  end
120
116
 
117
+ it 'should switch to statute units' do
118
+ postrunner(%w( units statute ))
119
+ end
120
+
121
+ it 'should switch back to metric units' do
122
+ postrunner(%w( units metric ))
123
+ end
124
+
121
125
  end
122
126
 
@@ -0,0 +1,62 @@
1
+ def create_fit_file(name, date, duration_minutes = 30)
2
+ Fit4Ruby.write(name, create_fit_activity(date, duration_minutes))
3
+ end
4
+
5
+ def create_fit_activity(date, duration_minutes)
6
+ ts = Time.parse(date)
7
+ a = Fit4Ruby::Activity.new({ :timestamp => ts })
8
+ a.total_timer_time = duration_minutes * 60
9
+ a.new_user_profile({ :timestamp => ts,
10
+ :age => 33, :height => 1.78, :weight => 73.0,
11
+ :gender => 'male', :activity_class => 7.0,
12
+ :max_hr => 178 })
13
+
14
+ a.new_event({ :timestamp => ts, :event => 'timer',
15
+ :event_type => 'start_time' })
16
+ a.new_device_info({ :timestamp => ts, :device_index => 0 })
17
+ a.new_device_info({ :timestamp => ts, :device_index => 1,
18
+ :battery_status => 'ok' })
19
+ 0.upto((a.total_timer_time / 60) - 1) do |mins|
20
+ a.new_record({
21
+ :timestamp => ts,
22
+ :position_lat => 51.5512 - mins * 0.0008,
23
+ :position_long => 11.647 + mins * 0.002,
24
+ :distance => 200.0 * mins,
25
+ :altitude => 100 + mins * 3,
26
+ :speed => 3.1,
27
+ :vertical_oscillation => 90 + mins * 0.2,
28
+ :stance_time => 235.0 * mins * 0.01,
29
+ :stance_time_percent => 32.0,
30
+ :heart_rate => 140 + mins,
31
+ :cadence => 75,
32
+ :activity_type => 'running',
33
+ :fractional_cadence => (mins % 2) / 2.0
34
+ })
35
+
36
+ if mins > 0 && mins % 5 == 0
37
+ a.new_lap({ :timestamp => ts })
38
+ end
39
+ ts += 60
40
+ end
41
+ a.new_session({ :timestamp => ts })
42
+ a.new_event({ :timestamp => ts, :event => 'recovery_time',
43
+ :event_type => 'marker',
44
+ :data => 2160 })
45
+ a.new_event({ :timestamp => ts, :event => 'vo2max',
46
+ :event_type => 'marker', :data => 52 })
47
+ a.new_event({ :timestamp => ts, :event => 'timer',
48
+ :event_type => 'stop_all' })
49
+ a.new_device_info({ :timestamp => ts, :device_index => 0 })
50
+ ts += 1
51
+ a.new_device_info({ :timestamp => ts, :device_index => 1,
52
+ :battery_status => 'low' })
53
+ ts += 120
54
+ a.new_event({ :timestamp => ts, :event => 'recovery_hr',
55
+ :event_type => 'marker', :data => 132 })
56
+
57
+ a.aggregate
58
+
59
+ a
60
+ end
61
+
62
+
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: postrunner
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Schlaeger
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-12 00:00:00.000000000 Z
11
+ date: 2014-08-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fit4ruby
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 0.0.3
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
- version: '0'
26
+ version: 0.0.3
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: nokogiri
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -108,21 +108,24 @@ files:
108
108
  - .gitignore
109
109
  - COPYING
110
110
  - Gemfile
111
- - LICENSE.txt
112
111
  - README.md
113
112
  - Rakefile
114
113
  - bin/postrunner
115
114
  - lib/postrunner.rb
116
115
  - lib/postrunner/ActivitiesDB.rb
117
116
  - lib/postrunner/Activity.rb
118
- - lib/postrunner/ActivityReport.rb
117
+ - lib/postrunner/ActivityListView.rb
118
+ - lib/postrunner/ActivitySummary.rb
119
119
  - lib/postrunner/ActivityView.rb
120
120
  - lib/postrunner/ChartView.rb
121
+ - lib/postrunner/DeviceList.rb
121
122
  - lib/postrunner/FlexiTable.rb
122
123
  - lib/postrunner/HTMLBuilder.rb
123
124
  - lib/postrunner/Main.rb
124
125
  - lib/postrunner/PersonalRecords.rb
126
+ - lib/postrunner/RuntimeConfig.rb
125
127
  - lib/postrunner/TrackView.rb
128
+ - lib/postrunner/UserProfileView.rb
126
129
  - lib/postrunner/ViewWidgets.rb
127
130
  - lib/postrunner/version.rb
128
131
  - misc/flot/API.md
@@ -235,6 +238,17 @@ files:
235
238
  - misc/flot/jquery.flot.time.min.js
236
239
  - misc/flot/jquery.js
237
240
  - misc/flot/jquery.min.js
241
+ - misc/icons/back.png
242
+ - misc/icons/back.svg
243
+ - misc/icons/first.png
244
+ - misc/icons/first.svg
245
+ - misc/icons/forward.png
246
+ - misc/icons/forward.svg
247
+ - misc/icons/home.png
248
+ - misc/icons/home.svg
249
+ - misc/icons/last.png
250
+ - misc/icons/last.svg
251
+ - misc/icons/lgpl-3.0.txt
238
252
  - misc/jquery/jquery-2.1.1.min.js
239
253
  - misc/openlayers/.gitignore
240
254
  - misc/openlayers/OpenLayers.debug.js
@@ -1444,8 +1458,10 @@ files:
1444
1458
  - misc/openlayers/tools/uglify_js.py
1445
1459
  - misc/openlayers/tools/update_dev_dir.sh
1446
1460
  - postrunner.gemspec
1461
+ - spec/ActivitySummary_spec.rb
1447
1462
  - spec/FlexiTable_spec.rb
1448
1463
  - spec/PostRunner_spec.rb
1464
+ - spec/spec_helper.rb
1449
1465
  homepage: https://github.com/scrapper/postrunner
1450
1466
  licenses:
1451
1467
  - GNU GPL version 2
@@ -1471,6 +1487,8 @@ signing_key:
1471
1487
  specification_version: 4
1472
1488
  summary: Application to manage and analyze Garmin FIT files.
1473
1489
  test_files:
1490
+ - spec/ActivitySummary_spec.rb
1474
1491
  - spec/FlexiTable_spec.rb
1475
1492
  - spec/PostRunner_spec.rb
1493
+ - spec/spec_helper.rb
1476
1494
  has_rdoc:
data/LICENSE.txt DELETED
@@ -1,22 +0,0 @@
1
- Copyright (c) 2014 Chris Schlaeger
2
-
3
- MIT License
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining
6
- a copy of this software and associated documentation files (the
7
- "Software"), to deal in the Software without restriction, including
8
- without limitation the rights to use, copy, modify, merge, publish,
9
- distribute, sublicense, and/or sell copies of the Software, and to
10
- permit persons to whom the Software is furnished to do so, subject to
11
- the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be
14
- included in all copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -1,102 +0,0 @@
1
- require 'fit4ruby'
2
-
3
- require 'postrunner/FlexiTable'
4
- require 'postrunner/ViewWidgets'
5
-
6
- module PostRunner
7
-
8
- class ActivityReport
9
-
10
- include Fit4Ruby::Converters
11
- include ViewWidgets
12
-
13
- def initialize(activity)
14
- @activity = activity
15
- end
16
-
17
- def to_s
18
- session = @activity.sessions[0]
19
-
20
- summary(session).to_s + "\n" + laps.to_s
21
- end
22
-
23
- def to_html(doc)
24
- session = @activity.sessions[0]
25
-
26
- frame(doc, 'Summary') {
27
- summary(session).to_html(doc)
28
- }
29
- frame(doc, 'Laps') {
30
- laps.to_html(doc)
31
- }
32
- end
33
-
34
- private
35
-
36
- def summary(session)
37
- t = FlexiTable.new
38
- t.enable_frame(false)
39
- t.body
40
- t.row([ 'Date:', session.timestamp])
41
- t.row([ 'Distance:', "#{'%.2f' % (session.total_distance / 1000.0)} km" ])
42
- t.row([ 'Time:', secsToHMS(session.total_timer_time) ])
43
- t.row([ 'Avg. Pace:',
44
- "#{speedToPace(session.avg_speed)} min/km" ])
45
- t.row([ 'Total Ascend:', "#{session.total_ascend} m" ])
46
- t.row([ 'Total Descend:', "#{session.total_descent} m" ])
47
- t.row([ 'Calories:', "#{session.total_calories} kCal" ])
48
- t.row([ 'Avg. HR:', session.avg_heart_rate ?
49
- "#{session.avg_heart_rate} bpm" : '-' ])
50
- t.row([ 'Max. HR:', session.max_heart_rate ?
51
- "#{session.max_heart_rate} bpm" : '-' ])
52
- t.row([ 'Training Effect:', session.total_training_effect ?
53
- session.total_training_effect : '-' ])
54
- t.row([ 'Avg. Run Cadence:',
55
- session.avg_running_cadence ?
56
- "#{session.avg_running_cadence.round} spm" : '-' ])
57
- t.row([ 'Avg. Vertical Oscillation:',
58
- session.avg_vertical_oscillation ?
59
- "#{'%.1f' % (session.avg_vertical_oscillation / 10)} cm" : '-' ])
60
- t.row([ 'Avg. Ground Contact Time:',
61
- session.avg_stance_time ?
62
- "#{session.avg_stance_time.round} ms" : '-' ])
63
- t.row([ 'Avg. Stride Length:',
64
- session.avg_stride_length ?
65
- "#{'%.2f' % (session.avg_stride_length / 2)} m" : '-' ])
66
- rec_time = @activity.recovery_time
67
- t.row([ 'Recovery Time:', rec_time ? secsToHMS(rec_time * 60) : '-' ])
68
- vo2max = @activity.vo2max
69
- t.row([ 'VO2max:', vo2max ? vo2max : '-' ])
70
-
71
- t
72
- end
73
-
74
- def laps
75
- t = FlexiTable.new
76
- t.head
77
- t.row([ 'Lap', 'Duration', 'Distance', 'Avg. Pace', 'Stride', 'Cadence',
78
- 'Avg. HR', 'Max. HR' ])
79
- t.set_column_attributes(Array.new(8, { :halign => :right }))
80
- t.body
81
- @activity.sessions[0].laps.each.with_index do |lap, index|
82
- t.cell(index + 1)
83
- t.cell(secsToHMS(lap.total_timer_time))
84
- t.cell('%.2f' % (lap.total_distance / 1000.0))
85
- t.cell(speedToPace(lap.avg_speed))
86
- t.cell(lap.total_strides ?
87
- '%.2f' % (lap.total_distance / (2 * lap.total_strides)) : '')
88
- t.cell(lap.avg_running_cadence && lap.avg_fractional_cadence ?
89
- '%.1f' % (2 * lap.avg_running_cadence +
90
- (2 * lap.avg_fractional_cadence) / 100.0) : '')
91
- t.cell(lap.avg_heart_rate.to_s)
92
- t.cell(lap.max_heart_rate.to_s)
93
- t.new_row
94
- end
95
-
96
- t
97
- end
98
-
99
- end
100
-
101
- end
102
-