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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6969d2ea60df958cfefb28c10893203969f1fb6264aadf0117d34578e4928fd3
4
- data.tar.gz: 4257fe33a6fa2566e5c9696084b86f59fa1dab4384baa3aca95fbad45d806554
3
+ metadata.gz: cf4ed8f4ab3233878268dd0a70537460e57321e5cd15cf6254d9753b4ef5b1c0
4
+ data.tar.gz: 50873923abbc887b282b335145bfd996f34223f5431a1f4965ef64af03dde953
5
5
  SHA512:
6
- metadata.gz: df229d964f1b540486051aaef3e55f1985a48740158178b7b4eb601c2ef81f122921623dc9f9578f2660f9f8842f7c5ee6520575a02a1ca0d039d73d61c9be02
7
- data.tar.gz: 5f830bd7093a4033eef67a2e0fb500260c7d4099add0871b88ad81175aecf858b9c3beba3f39efa1b0db6bd2218bc0fb576a2382afcdc37929d788a2beb22a56
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.exists?(@archive_file)
39
- @activities = YAML.load_file(@archive_file)
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.exists?(File.join(@fit_dir, base_fit_file_name))
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.exists?(misc_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.exists?(src_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
-
@@ -271,7 +271,7 @@ module PostRunner
271
271
  end
272
272
 
273
273
  def show
274
- generate_html_view #unless File.exists?(@html_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 { @view.doc.style(style) }
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 *= conversion_factor(from_unit, to_unit)
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
- "#{(2 * session.avg_cadence).round} rpm" : '-' ])
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.exists?(bak_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.exists?(filename)
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
-
@@ -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) > 10.0
334
- # We have a gap in the values that is longer than 5 seconds. We'll
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 {
@@ -17,7 +17,7 @@ module PostRunner
17
17
  module DirUtils
18
18
 
19
19
  def create_directory(dir, name)
20
- return if Dir.exists?(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.exists?(html_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.exists?(fq_fit_file_name) && !overwrite
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
-
@@ -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.exists?(misc_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.exists?(src_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.exists?(args[0])
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.exists?(epo_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.exists?(remotesw_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.exists?(file_name)
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.exists?(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
-
@@ -11,5 +11,5 @@
11
11
  #
12
12
 
13
13
  module PostRunner
14
- VERSION = '1.1.1'
14
+ VERSION = '1.2.0'
15
15
  end
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.10.0'
32
- spec.add_dependency 'perobs', '~> 4.4.0'
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.exists?(pf)
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.exists?(file)).to be true
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.exists?(dir_name)
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.1.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: 2022-08-31 00:00:00.000000000 Z
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.10.0
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.10.0
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.4.0
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.4.0
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.2.32
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: