postrunner 1.1.1 → 1.2.0

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