postrunner 1.1.1 → 1.2.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.
- checksums.yaml +4 -4
- data/lib/postrunner/ActivitiesDB.rb +26 -6
- data/lib/postrunner/Activity.rb +1 -2
- data/lib/postrunner/ActivityListView.rb +6 -2
- data/lib/postrunner/ActivitySummary.rb +1 -1
- data/lib/postrunner/ActivityView.rb +2 -4
- data/lib/postrunner/BackedUpFile.rb +2 -3
- data/lib/postrunner/ChartView.rb +4 -4
- data/lib/postrunner/DailyMonitoringView.rb +2 -4
- data/lib/postrunner/DirUtils.rb +1 -2
- data/lib/postrunner/FFS_Activity.rb +9 -65
- data/lib/postrunner/FFS_Device.rb +1 -2
- data/lib/postrunner/Main.rb +38 -9
- data/lib/postrunner/RuntimeConfig.rb +1 -2
- data/lib/postrunner/version.rb +1 -1
- data/postrunner.gemspec +2 -2
- data/spec/View_spec.rb +2 -2
- data/spec/spec_helper.rb +1 -2
- metadata +10 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf4ed8f4ab3233878268dd0a70537460e57321e5cd15cf6254d9753b4ef5b1c0
|
4
|
+
data.tar.gz: 50873923abbc887b282b335145bfd996f34223f5431a1f4965ef64af03dde953
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8e46f9b6c0f5c33652d11cf2f6b1625857ec9c44d1a076b1f8c837a21ada490b610a0e776287e3bc58eb29c7a9e73551caab7fa6e0d9988b947962d5e3022dc
|
7
|
+
data.tar.gz: d6777bb23494f92fdf7c193964da13149720179af515775ee1724602c4d9ed6369b01d1d83f1b3530eaed3ad6a309d39da8a8e312c9a62f2de329285f5763108
|
@@ -35,8 +35,15 @@ module PostRunner
|
|
35
35
|
|
36
36
|
create_directories
|
37
37
|
begin
|
38
|
-
if File.
|
39
|
-
|
38
|
+
if File.exist?(@archive_file)
|
39
|
+
if RUBY_VERSION >= '3.1.0'
|
40
|
+
# Since Ruby 3.1.0 YAML does not load unknown classes unless
|
41
|
+
# explicitely listed.
|
42
|
+
@activities = YAML.load_file(
|
43
|
+
@archive_file, permitted_classes: [ PostRunner::Activity, Time ])
|
44
|
+
else
|
45
|
+
@activities = YAML.load_file(@archive_file)
|
46
|
+
end
|
40
47
|
else
|
41
48
|
@activities = []
|
42
49
|
end
|
@@ -84,6 +91,20 @@ module PostRunner
|
|
84
91
|
end
|
85
92
|
end
|
86
93
|
|
94
|
+
def backup_archive
|
95
|
+
begin
|
96
|
+
if File.exist?(@archive_file)
|
97
|
+
backup_file = @archive_file + '.bak'
|
98
|
+
if File.exist?(backup_file)
|
99
|
+
File.delete(backup_file)
|
100
|
+
end
|
101
|
+
File.rename(@archive_file, backup_file)
|
102
|
+
end
|
103
|
+
rescue IOError
|
104
|
+
Log.error "Cannot backup #{@archive_file}: #{$!}"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
87
108
|
# Add a new FIT file to the database.
|
88
109
|
# @param fit_file_name [String] Name of the FIT file.
|
89
110
|
# @param fit_activity [Activity] Activity to add
|
@@ -97,7 +118,7 @@ module PostRunner
|
|
97
118
|
return false
|
98
119
|
end
|
99
120
|
|
100
|
-
if File.
|
121
|
+
if File.exist?(File.join(@fit_dir, base_fit_file_name))
|
101
122
|
Log.debug "Activity #{fit_file_name} has been deleted before"
|
102
123
|
return false
|
103
124
|
end
|
@@ -325,11 +346,11 @@ module PostRunner
|
|
325
346
|
# found in '../../misc'.
|
326
347
|
misc_dir = File.realpath(File.join(File.dirname(__FILE__),
|
327
348
|
'..', '..', 'misc'))
|
328
|
-
unless Dir.
|
349
|
+
unless Dir.exist?(misc_dir)
|
329
350
|
Log.fatal "Cannot find 'misc' directory under '#{misc_dir}': #{$!}"
|
330
351
|
end
|
331
352
|
src_dir = File.join(misc_dir, dir)
|
332
|
-
unless Dir.
|
353
|
+
unless Dir.exist?(src_dir)
|
333
354
|
Log.fatal "Cannot find '#{src_dir}': #{$!}"
|
334
355
|
end
|
335
356
|
dst_dir = @cfg[:html_dir]
|
@@ -345,4 +366,3 @@ module PostRunner
|
|
345
366
|
end
|
346
367
|
|
347
368
|
end
|
348
|
-
|
data/lib/postrunner/Activity.rb
CHANGED
@@ -271,7 +271,7 @@ module PostRunner
|
|
271
271
|
end
|
272
272
|
|
273
273
|
def show
|
274
|
-
generate_html_view #unless File.
|
274
|
+
generate_html_view #unless File.exist?(@html_file)
|
275
275
|
|
276
276
|
@db.show_in_browser(@html_file)
|
277
277
|
end
|
@@ -485,4 +485,3 @@ module PostRunner
|
|
485
485
|
end
|
486
486
|
|
487
487
|
end
|
488
|
-
|
@@ -56,7 +56,11 @@ module PostRunner
|
|
56
56
|
"index#{page_index == 0 ? '' : "-#{page_index}"}.html"
|
57
57
|
@view = View.new("PostRunner Activities", views, pages)
|
58
58
|
|
59
|
-
@view.doc.head {
|
59
|
+
@view.doc.head {
|
60
|
+
@view.doc.style(style)
|
61
|
+
@view.doc.meta({ 'name' => 'viewport',
|
62
|
+
'content' => 'width=device-width, initial-scale=1.0' })
|
63
|
+
}
|
60
64
|
body(@view.doc)
|
61
65
|
|
62
66
|
output_file = File.join(@ffs.store['config']['html_dir'],
|
@@ -125,7 +129,7 @@ EOT
|
|
125
129
|
def local_value(value, from_unit, format, units)
|
126
130
|
to_unit = units[@unit_system]
|
127
131
|
return '-' unless value
|
128
|
-
value
|
132
|
+
value = conversion_offset(from_unit, to_unit) + value * conversion_factor(from_unit, to_unit)
|
129
133
|
"#{format % [value, to_unit]}"
|
130
134
|
end
|
131
135
|
|
@@ -116,7 +116,7 @@ module PostRunner
|
|
116
116
|
if @activity.sport == 'cycling'
|
117
117
|
t.row([ 'Avg. Cadence:',
|
118
118
|
session.avg_cadence ?
|
119
|
-
"#{(
|
119
|
+
"#{(session.avg_cadence).round} rpm" : '-' ])
|
120
120
|
end
|
121
121
|
t.row([ 'Total Ascent:',
|
122
122
|
local_value(session, 'total_ascent', '%.0f %s',
|
@@ -60,12 +60,10 @@ module PostRunner
|
|
60
60
|
'type' => 'text/javascript', 'src' => js })
|
61
61
|
end
|
62
62
|
doc.style(style)
|
63
|
+
doc.meta({ 'name' => 'viewport',
|
64
|
+
'content' => 'width=device-width, initial-scale=1.0' })
|
63
65
|
}
|
64
66
|
}
|
65
|
-
#doc.meta({ 'name' => 'viewport',
|
66
|
-
# 'content' => 'width=device-width, ' +
|
67
|
-
# 'initial-scale=1.0, maximum-scale=1.0, ' +
|
68
|
-
# 'user-scalable=0' })
|
69
67
|
|
70
68
|
body {
|
71
69
|
doc.body {
|
@@ -32,7 +32,7 @@ module PostRunner
|
|
32
32
|
bak_file = filename + '.bak'
|
33
33
|
|
34
34
|
# Delete the backup file if it exists.
|
35
|
-
if File.
|
35
|
+
if File.exist?(bak_file)
|
36
36
|
begin
|
37
37
|
File.delete(bak_file)
|
38
38
|
rescue SystemCallError
|
@@ -41,7 +41,7 @@ module PostRunner
|
|
41
41
|
end
|
42
42
|
|
43
43
|
# Rename the old file to <filename>.bak
|
44
|
-
if File.
|
44
|
+
if File.exist?(filename)
|
45
45
|
begin
|
46
46
|
File.rename(filename, bak_file)
|
47
47
|
rescue SystemCallError
|
@@ -53,4 +53,3 @@ module PostRunner
|
|
53
53
|
end
|
54
54
|
|
55
55
|
end
|
56
|
-
|
data/lib/postrunner/ChartView.rb
CHANGED
@@ -193,7 +193,7 @@ module PostRunner
|
|
193
193
|
:id => 'temperature',
|
194
194
|
:label => 'Temperature',
|
195
195
|
:short_label => 'Temp.',
|
196
|
-
:unit => 'C',
|
196
|
+
:unit => select_unit('C'),
|
197
197
|
:graph => :line_graph,
|
198
198
|
:colors => '#444444',
|
199
199
|
:show => true
|
@@ -224,7 +224,7 @@ module PostRunner
|
|
224
224
|
{ 'min/km' => 'min/mi', 'km/h' => 'mph',
|
225
225
|
'mm' => 'in', 'cm' => 'in', 'm' => 'ft',
|
226
226
|
'bpm' => 'bpm', 'rpm' => 'rpm', 'spm' => 'spm', '%' => '%',
|
227
|
-
'ms' => 'ms' }[metric_unit]
|
227
|
+
'ms' => 'ms', 'C' => 'F' }[metric_unit]
|
228
228
|
else
|
229
229
|
Log.fatal "Unknown unit system #{@unit_system}"
|
230
230
|
end
|
@@ -330,8 +330,8 @@ EOT
|
|
330
330
|
last_value = nil
|
331
331
|
last_timestamp = nil
|
332
332
|
@activity.fit_activity.records.each do |r|
|
333
|
-
if last_timestamp && (r.timestamp - last_timestamp) >
|
334
|
-
# We have a gap in the values that is longer than
|
333
|
+
if last_timestamp && (r.timestamp - last_timestamp) > 20.0
|
334
|
+
# We have a gap in the values that is longer than 10 seconds. We'll
|
335
335
|
# finish the line and start a new one later.
|
336
336
|
data_set << [ (last_timestamp - start_time + 1).to_i * 1000, nil ]
|
337
337
|
end
|
@@ -50,12 +50,10 @@ module PostRunner
|
|
50
50
|
'type' => 'text/javascript', 'src' => js })
|
51
51
|
end
|
52
52
|
doc.style(style)
|
53
|
+
doc.meta({ 'name' => 'viewport',
|
54
|
+
'content' => 'width=device-width, initial-scale=1.0' })
|
53
55
|
}
|
54
56
|
}
|
55
|
-
#doc.meta({ 'name' => 'viewport',
|
56
|
-
# 'content' => 'width=device-width, ' +
|
57
|
-
# 'initial-scale=1.0, maximum-scale=1.0, ' +
|
58
|
-
# 'user-scalable=0' })
|
59
57
|
|
60
58
|
body {
|
61
59
|
doc.body {
|
data/lib/postrunner/DirUtils.rb
CHANGED
@@ -17,7 +17,7 @@ module PostRunner
|
|
17
17
|
module DirUtils
|
18
18
|
|
19
19
|
def create_directory(dir, name)
|
20
|
-
return if Dir.
|
20
|
+
return if Dir.exist?(dir)
|
21
21
|
|
22
22
|
Log.info "Creating #{name} directory #{dir}"
|
23
23
|
begin
|
@@ -30,4 +30,3 @@ module PostRunner
|
|
30
30
|
end
|
31
31
|
|
32
32
|
end
|
33
|
-
|
@@ -43,61 +43,6 @@ module PostRunner
|
|
43
43
|
:column_alignment => :left })
|
44
44
|
}
|
45
45
|
|
46
|
-
ActivityTypes = {
|
47
|
-
'generic' => 'Generic',
|
48
|
-
'running' => 'Running',
|
49
|
-
'cycling' => 'Cycling',
|
50
|
-
'transition' => 'Transition',
|
51
|
-
'fitness_equipment' => 'Fitness Equipment',
|
52
|
-
'swimming' => 'Swimming',
|
53
|
-
'basketball' => 'Basketball',
|
54
|
-
'soccer' => 'Soccer',
|
55
|
-
'tennis' => 'Tennis',
|
56
|
-
'american_football' => 'American Football',
|
57
|
-
'walking' => 'Walking',
|
58
|
-
'cross_country_skiing' => 'Cross Country Skiing',
|
59
|
-
'alpine_skiing' => 'Alpine Skiing',
|
60
|
-
'snowboarding' => 'Snowboarding',
|
61
|
-
'rowing' => 'Rowing',
|
62
|
-
'mountaineering' => 'Mountaneering',
|
63
|
-
'hiking' => 'Hiking',
|
64
|
-
'multisport' => 'Multisport',
|
65
|
-
'paddling' => 'Paddling',
|
66
|
-
'commuting' => 'Commuting',
|
67
|
-
'all' => 'All'
|
68
|
-
}
|
69
|
-
ActivitySubTypes = {
|
70
|
-
'generic' => 'Generic',
|
71
|
-
'treadmill' => 'Treadmill',
|
72
|
-
'street' => 'Street',
|
73
|
-
'trail' => 'Trail',
|
74
|
-
'track' => 'Track',
|
75
|
-
'spin' => 'Spin',
|
76
|
-
'indoor_cycling' => 'Indoor Cycling',
|
77
|
-
'road' => 'Road',
|
78
|
-
'mountain' => 'Mountain',
|
79
|
-
'downhill' => 'Downhill',
|
80
|
-
'recumbent' => 'Recumbent',
|
81
|
-
'cyclocross' => 'Cyclocross',
|
82
|
-
'hand_cycling' => 'Hand Cycling',
|
83
|
-
'track_cycling' => 'Track Cycling',
|
84
|
-
'indoor_rowing' => 'Indoor Rowing',
|
85
|
-
'elliptical' => 'Elliptical',
|
86
|
-
'stair_climbing' => 'Stair Climbing',
|
87
|
-
'lap_swimming' => 'Lap Swimming',
|
88
|
-
'open_water' => 'Open Water',
|
89
|
-
'flexibility_training' => 'Flexibility Training',
|
90
|
-
'strength_training' => 'Strength Training',
|
91
|
-
'warm_up' => 'Warm up',
|
92
|
-
'match' => 'Match',
|
93
|
-
'exercise' => 'Excersize',
|
94
|
-
'challenge' => 'Challenge',
|
95
|
-
'indoor_skiing' => 'Indoor Skiing',
|
96
|
-
'cardio_training' => 'Cardio Training',
|
97
|
-
'virtual_activity' => 'Virtual Activity',
|
98
|
-
'all' => 'All'
|
99
|
-
}
|
100
|
-
|
101
46
|
attr_persist :device, :fit_file_name, :norecord, :name, :note, :sport,
|
102
47
|
:sub_sport, :timestamp, :total_distance, :total_timer_time, :avg_speed
|
103
48
|
attr_reader :fit_activity
|
@@ -185,7 +130,7 @@ module PostRunner
|
|
185
130
|
def show
|
186
131
|
html_file = html_file_name
|
187
132
|
|
188
|
-
generate_html_report #unless File.
|
133
|
+
generate_html_report #unless File.exist?(html_file)
|
189
134
|
|
190
135
|
@store['file_store'].show_in_browser(html_file)
|
191
136
|
end
|
@@ -211,17 +156,17 @@ module PostRunner
|
|
211
156
|
self.note = value
|
212
157
|
when 'type'
|
213
158
|
load_fit_file
|
214
|
-
unless ActivityTypes.values.include?(value)
|
159
|
+
unless Activity::ActivityTypes.values.include?(value)
|
215
160
|
Log.fatal "Unknown activity type '#{value}'. Must be one of " +
|
216
|
-
ActivityTypes.values.join(', ')
|
161
|
+
Activity::ActivityTypes.values.join(', ')
|
217
162
|
end
|
218
|
-
self.sport = ActivityTypes.invert[value]
|
163
|
+
self.sport = Activity::ActivityTypes.invert[value]
|
219
164
|
when 'subtype'
|
220
|
-
unless ActivitySubTypes.values.include?(value)
|
165
|
+
unless Activity::ActivitySubTypes.values.include?(value)
|
221
166
|
Log.fatal "Unknown activity subtype '#{value}'. Must be one of " +
|
222
|
-
ActivitySubTypes.values.join(', ')
|
167
|
+
Activity::ActivitySubTypes.values.join(', ')
|
223
168
|
end
|
224
|
-
self.sub_sport = ActivitySubTypes.invert[value]
|
169
|
+
self.sub_sport = Activity::ActivitySubTypes.invert[value]
|
225
170
|
when 'norecord'
|
226
171
|
unless %w( true false).include?(value)
|
227
172
|
Log.fatal "norecord must either be 'true' or 'false'"
|
@@ -250,11 +195,11 @@ module PostRunner
|
|
250
195
|
end
|
251
196
|
|
252
197
|
def activity_type
|
253
|
-
ActivityTypes[@sport] || 'Undefined'
|
198
|
+
Activity::ActivityTypes[@sport] || 'Undefined'
|
254
199
|
end
|
255
200
|
|
256
201
|
def activity_sub_type
|
257
|
-
ActivitySubTypes[@sub_sport] || "Undefined #{@sub_sport}"
|
202
|
+
Activity::ActivitySubTypes[@sub_sport] || "Undefined #{@sub_sport}"
|
258
203
|
end
|
259
204
|
|
260
205
|
def distance(timestamp, unit_system)
|
@@ -296,4 +241,3 @@ module PostRunner
|
|
296
241
|
end
|
297
242
|
|
298
243
|
end
|
299
|
-
|
@@ -88,7 +88,7 @@ module PostRunner
|
|
88
88
|
path = @store['file_store'].fit_file_dir(File.basename(fit_file_name),
|
89
89
|
long_uid, type)
|
90
90
|
fq_fit_file_name = File.join(path, File.basename(fit_file_name))
|
91
|
-
if File.
|
91
|
+
if File.exist?(fq_fit_file_name) && !overwrite
|
92
92
|
Log.debug "FIT file #{fq_fit_file_name} has already been imported " +
|
93
93
|
"and deleted"
|
94
94
|
return nil
|
@@ -159,4 +159,3 @@ module PostRunner
|
|
159
159
|
end
|
160
160
|
|
161
161
|
end
|
162
|
-
|
data/lib/postrunner/Main.rb
CHANGED
@@ -34,6 +34,8 @@ module PostRunner
|
|
34
34
|
def initialize
|
35
35
|
@filter = nil
|
36
36
|
@name = nil
|
37
|
+
@sport = nil
|
38
|
+
@sub_sport = nil
|
37
39
|
@force = false
|
38
40
|
@attribute = nil
|
39
41
|
@value = nil
|
@@ -151,6 +153,22 @@ EOT
|
|
151
153
|
'Name the activity to the specified name') do |n|
|
152
154
|
@name = n
|
153
155
|
end
|
156
|
+
opts.on('--sport sport', String,
|
157
|
+
'Set the activity to the specified sport') do |value|
|
158
|
+
unless Activity::ActivityTypes.values.include?(value)
|
159
|
+
Log.fatal "Unknown activity type '#{value}'. Must be one of " +
|
160
|
+
Activity::ActivityTypes.values.join(', ')
|
161
|
+
end
|
162
|
+
@sport = Activity::ActivityTypes.invert[value]
|
163
|
+
end
|
164
|
+
opts.on('--sub_sport sub_sport', String,
|
165
|
+
'Set the activity to the specified sub_sport') do |value|
|
166
|
+
unless Activity::ActivitySubTypes.values.include?(value)
|
167
|
+
Log.fatal "Unknown activity sub type '#{value}'. Must be one of " +
|
168
|
+
Activity::ActivitySubTypes.values.join(', ')
|
169
|
+
end
|
170
|
+
@sub_sport = Activity::ActivitySubTypes.invert[value]
|
171
|
+
end
|
154
172
|
|
155
173
|
opts.separator ""
|
156
174
|
opts.separator "General options:"
|
@@ -281,11 +299,11 @@ EOT
|
|
281
299
|
# found in '../../misc'.
|
282
300
|
misc_dir = File.realpath(File.join(File.dirname(__FILE__),
|
283
301
|
'..', '..', 'misc'))
|
284
|
-
unless Dir.
|
302
|
+
unless Dir.exist?(misc_dir)
|
285
303
|
Log.abort "Cannot find 'misc' directory under '#{misc_dir}': #{$!}"
|
286
304
|
end
|
287
305
|
src_dir = File.join(misc_dir, dir)
|
288
|
-
unless Dir.
|
306
|
+
unless Dir.exist?(src_dir)
|
289
307
|
Log.abort "Cannot find '#{src_dir}': #{$!}"
|
290
308
|
end
|
291
309
|
dst_dir = @db['config']['html_dir']
|
@@ -354,7 +372,7 @@ EOT
|
|
354
372
|
unless process_files(args, :import)
|
355
373
|
retval = 1
|
356
374
|
end
|
357
|
-
if args.length == 1 && Dir.
|
375
|
+
if args.length == 1 && Dir.exist?(args[0])
|
358
376
|
# If only one directory was specified as argument we store the
|
359
377
|
# directory for future use.
|
360
378
|
@db['config']['import_dir'] = args[0]
|
@@ -507,6 +525,14 @@ EOT
|
|
507
525
|
|
508
526
|
begin
|
509
527
|
fit_entity = Fit4Ruby.read(fit_file_name)
|
528
|
+
if fit_entity.is_a?(Fit4Ruby::Activity)
|
529
|
+
if @sport
|
530
|
+
fit_entity.sport = @sport
|
531
|
+
end
|
532
|
+
if @sub_sport
|
533
|
+
fit_entity.sub_sport = @sub_sport
|
534
|
+
end
|
535
|
+
end
|
510
536
|
rescue Fit4Ruby::Error
|
511
537
|
Log.error $!
|
512
538
|
return false
|
@@ -584,7 +610,7 @@ EOT
|
|
584
610
|
create_directory(epo_dir, 'GPS Data Cache')
|
585
611
|
epo_file = File.join(epo_dir, 'EPO.BIN')
|
586
612
|
|
587
|
-
if !File.
|
613
|
+
if !File.exist?(epo_file) ||
|
588
614
|
(File.mtime(epo_file) < Time.now - (6 * 60 * 60))
|
589
615
|
# The EPO file only changes every 6 hours. No need to download it more
|
590
616
|
# frequently if it already exists.
|
@@ -595,7 +621,7 @@ EOT
|
|
595
621
|
return
|
596
622
|
end
|
597
623
|
remotesw_dir = File.join(remotesw_dir, '..', 'REMOTESW')
|
598
|
-
unless Dir.
|
624
|
+
unless Dir.exist?(remotesw_dir)
|
599
625
|
Log.error "Cannot find '#{remotesw_dir}'. Please connect and " +
|
600
626
|
"mount your Garmin device."
|
601
627
|
return
|
@@ -639,17 +665,20 @@ EOT
|
|
639
665
|
# data. This method transfers the data from the old storage to the new
|
640
666
|
# FitFileStore based database.
|
641
667
|
def import_legacy_archive
|
668
|
+
cfg = RuntimeConfig.new(@db_dir)
|
669
|
+
activities_db = ActivitiesDB.new(@db_dir, cfg)
|
670
|
+
activities = activities_db.activities
|
671
|
+
return if activities.empty?
|
672
|
+
|
642
673
|
old_fit_dir = File.join(@db_dir, 'old_fit_dir')
|
643
674
|
create_directory(old_fit_dir, 'Old Fit')
|
644
675
|
|
645
|
-
cfg = RuntimeConfig.new(@db_dir)
|
646
|
-
activities = ActivitiesDB.new(@db_dir, cfg).activities
|
647
676
|
# Ensure that activities are sorted from earliest to last to properly
|
648
677
|
# recognize the personal records during import.
|
649
678
|
activities.sort! { |a1, a2| a1.timestamp <=> a2.timestamp }
|
650
679
|
activities.each do |activity|
|
651
680
|
file_name = File.join(@db_dir, 'fit', activity.fit_file)
|
652
|
-
next unless File.
|
681
|
+
next unless File.exist?(file_name)
|
653
682
|
|
654
683
|
Log.info "Converting #{activity.fit_file} to new DB format"
|
655
684
|
@db.transaction do
|
@@ -664,6 +693,7 @@ EOT
|
|
664
693
|
FileUtils.move(file_name, File.join(old_fit_dir, activity.fit_file))
|
665
694
|
end
|
666
695
|
end
|
696
|
+
activities_db.backup_archive
|
667
697
|
end
|
668
698
|
|
669
699
|
def ensure_flat_file_db
|
@@ -696,4 +726,3 @@ EOT
|
|
696
726
|
end
|
697
727
|
|
698
728
|
end
|
699
|
-
|
@@ -60,7 +60,7 @@ module PostRunner
|
|
60
60
|
|
61
61
|
# Ensure that the requested directory exists.
|
62
62
|
def create_directory(dir, name)
|
63
|
-
return if Dir.
|
63
|
+
return if Dir.exist?(dir)
|
64
64
|
|
65
65
|
Log.info "Creating #{name} directory #{dir}"
|
66
66
|
begin
|
@@ -94,4 +94,3 @@ module PostRunner
|
|
94
94
|
end
|
95
95
|
|
96
96
|
end
|
97
|
-
|
data/lib/postrunner/version.rb
CHANGED
data/postrunner.gemspec
CHANGED
@@ -28,8 +28,8 @@ operating systems as well.}
|
|
28
28
|
spec.require_paths = ["lib"]
|
29
29
|
spec.required_ruby_version = '>=2.4'
|
30
30
|
|
31
|
-
spec.add_dependency 'fit4ruby', '~> 3.
|
32
|
-
spec.add_dependency 'perobs', '~> 4.
|
31
|
+
spec.add_dependency 'fit4ruby', '~> 3.11.0'
|
32
|
+
spec.add_dependency 'perobs', '~> 4.5.0'
|
33
33
|
spec.add_dependency 'nokogiri'
|
34
34
|
|
35
35
|
spec.add_development_dependency 'bundler'
|
data/spec/View_spec.rb
CHANGED
@@ -31,7 +31,7 @@ module PostRunner
|
|
31
31
|
def delete_files
|
32
32
|
@view_names.each do |vn|
|
33
33
|
page_files(vn).each do |pf|
|
34
|
-
File.delete(pf) if File.
|
34
|
+
File.delete(pf) if File.exist?(pf)
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
@@ -52,7 +52,7 @@ module PostRunner
|
|
52
52
|
pages.current_page = file
|
53
53
|
PostRunner::View.new("Test File: #{file}", views, pages).body.
|
54
54
|
write(file)
|
55
|
-
expect(File.
|
55
|
+
expect(File.exist?(file)).to be true
|
56
56
|
end
|
57
57
|
end
|
58
58
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -33,7 +33,7 @@ def tmp_dir_name(caller_file)
|
|
33
33
|
begin
|
34
34
|
dir_name = File.join(Dir.tmpdir,
|
35
35
|
"#{File.basename(caller_file)}.#{rand(2**32)}")
|
36
|
-
end while File.
|
36
|
+
end while File.exist?(dir_name)
|
37
37
|
|
38
38
|
dir_name
|
39
39
|
end
|
@@ -190,4 +190,3 @@ def tables_to_arrays(str)
|
|
190
190
|
|
191
191
|
arrays
|
192
192
|
end
|
193
|
-
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: postrunner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Schlaeger
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-06-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fit4ruby
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 3.
|
19
|
+
version: 3.11.0
|
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: 3.
|
26
|
+
version: 3.11.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: perobs
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 4.
|
33
|
+
version: 4.5.0
|
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
|
-
version: 4.
|
40
|
+
version: 4.5.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: nokogiri
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -325,7 +325,7 @@ homepage: https://github.com/scrapper/postrunner
|
|
325
325
|
licenses:
|
326
326
|
- GNU GPL version 2
|
327
327
|
metadata: {}
|
328
|
-
post_install_message:
|
328
|
+
post_install_message:
|
329
329
|
rdoc_options: []
|
330
330
|
require_paths:
|
331
331
|
- lib
|
@@ -340,8 +340,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
340
340
|
- !ruby/object:Gem::Version
|
341
341
|
version: '0'
|
342
342
|
requirements: []
|
343
|
-
rubygems_version: 3.
|
344
|
-
signing_key:
|
343
|
+
rubygems_version: 3.4.1
|
344
|
+
signing_key:
|
345
345
|
specification_version: 4
|
346
346
|
summary: Application to manage and analyze Garmin FIT files.
|
347
347
|
test_files:
|