postrunner 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|