fit4ruby 3.2.0 → 3.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -19,13 +19,24 @@ module Fit4Ruby
19
19
 
20
20
  include RecordAggregator
21
21
 
22
- attr_reader :records
22
+ attr_reader :records, :lengths
23
23
 
24
- def initialize(records, previous_lap, field_values)
24
+ # Create a new Lap object.
25
+ # @param records [Array of Records] Records to associate with the Lap.
26
+ # @param lengths [Array of Lengths] Lengths to associate with the Lap.
27
+ # @param first_length_index [Fixnum] Index of the first Length in this Lap.
28
+ # @param previous_lap [Lap] Previous Lap on same Session.
29
+ # @param field_values [Hash] Hash that provides initial values for certain
30
+ # fields.
31
+ def initialize(records, previous_lap, field_values, first_length_index, lengths)
25
32
  super('lap')
33
+ @lengths = lengths
26
34
  @meta_field_units['avg_stride_length'] = 'm'
27
35
  @records = records
28
36
  @previous_lap = previous_lap
37
+ @lengths.each { |length| @records += length.records }
38
+ @first_length_index = first_length_index
39
+ @num_lengths = @lengths.length
29
40
 
30
41
  if previous_lap && previous_lap.records && previous_lap.records.last
31
42
  # Set the start time of the new lap to the timestamp of the last record
@@ -43,10 +54,25 @@ module Fit4Ruby
43
54
  set_field_values(field_values)
44
55
  end
45
56
 
46
- def check(index)
57
+ def check(index, activity)
47
58
  unless @message_index == index
48
59
  Log.fatal "message_index must be #{index}, not #{@message_index}"
49
60
  end
61
+
62
+ return if @num_lengths.zero?
63
+
64
+ unless @first_length_index
65
+ Log.fatal 'first_length_index is not set'
66
+ end
67
+
68
+ @first_length_index.upto(@first_length_index - @num_lengths) do |i|
69
+ if (length = activity.lengths[i])
70
+ @lengths << length
71
+ else
72
+ Log.fatal "Lap references length #{i} which is not contained in "
73
+ "the FIT file."
74
+ end
75
+ end
50
76
  end
51
77
 
52
78
  # Compute the average stride length for this Session.
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env ruby -w
2
+ # encoding: UTF-8
3
+ #
4
+ # = Length.rb -- Fit4Ruby - FIT file processing library for Ruby
5
+ #
6
+ # Copyright (c) 2014, 2015 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
+
13
+ require 'fit4ruby/FitDataRecord'
14
+ require 'fit4ruby/RecordAggregator'
15
+
16
+ module Fit4Ruby
17
+
18
+ class Length < FitDataRecord
19
+
20
+ include RecordAggregator
21
+
22
+ attr_reader :records
23
+
24
+ def initialize(records, previous_length, field_values)
25
+ super('length')
26
+ @records = records
27
+ @previous_length = previous_length
28
+
29
+ if previous_length && previous_length.records && previous_length.records.last
30
+ # Set the start time of the new length to the timestamp of the last record
31
+ # of the previous length.
32
+ @start_time = previous_length.records.last.timestamp
33
+ elsif records.first
34
+ # Or to the timestamp of the first record.
35
+ @start_time = records.first.timestamp
36
+ end
37
+
38
+ if records.last
39
+ @total_elapsed_time = records.last.timestamp - @start_time
40
+ end
41
+
42
+ set_field_values(field_values)
43
+ end
44
+
45
+ def check(index)
46
+ unless @message_index == index
47
+ Log.fatal "message_index must be #{index}, not #{@message_index}"
48
+ end
49
+ end
50
+
51
+ end
52
+
53
+ end
@@ -38,14 +38,14 @@ module Fit4Ruby
38
38
  end
39
39
  end
40
40
 
41
- # Convert the 'speed' field into a running pace. The pace is measured in
42
- # minutes per Kilometer.
41
+ # Convert the 'speed' or 'enhanced_speed' field into a running pace. The
42
+ # pace is measured in minutes per Kilometer.
43
43
  # @return [Float or nil] pace for this Record in m/s or nil if not
44
44
  # available.
45
45
  def pace
46
- return nil unless @speed
46
+ return nil unless @speed || @enhanced_speed
47
47
 
48
- 1000.0 / (@speed * 60.0)
48
+ 1000.0 / ((@speed || @enhanced_speed) * 60.0)
49
49
  end
50
50
 
51
51
  end
@@ -1,4 +1,4 @@
1
1
  module Fit4Ruby
2
2
  # The version number of the library.
3
- VERSION = '3.2.0'
3
+ VERSION = '3.7.0'
4
4
  end
@@ -14,10 +14,13 @@ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
14
 
15
15
  require 'fit4ruby'
16
16
 
17
- describe Fit4Ruby do
17
+ ENV['TZ'] = 'UTC'
18
18
 
19
- before(:each) do
20
- ts = Time.now
19
+ describe Fit4Ruby do
20
+ let(:fit_file) { 'test.fit' }
21
+ let(:timestamp) { Time.now }
22
+ let(:activity) do
23
+ ts = timestamp
21
24
  a = Fit4Ruby::Activity.new
22
25
  a.total_timer_time = 30 * 60.0
23
26
  a.new_user_data({ :age => 33, :height => 1.78, :weight => 73.0,
@@ -97,20 +100,65 @@ describe Fit4Ruby do
97
100
  :event_type => 'marker', :recovery_hr => 132 })
98
101
 
99
102
  a.aggregate
103
+ a
104
+ end
100
105
 
101
- @activity = a
106
+ before do
107
+ File.delete(fit_file) if File.exist?(fit_file)
108
+ expect(File.exist?(fit_file)).to be false
102
109
  end
103
110
 
104
- it 'should write an Activity FIT file and read it back' do
105
- fit_file = 'test.fit'
111
+ after { File.delete(fit_file) }
106
112
 
107
- File.delete(fit_file) if File.exists?(fit_file)
108
- Fit4Ruby.write(fit_file, @activity)
109
- expect(File.exists?(fit_file)).to be true
113
+ it 'should write an Activity FIT file and read it back' do
114
+ Fit4Ruby.write(fit_file, activity)
115
+ expect(File.exist?(fit_file)).to be true
110
116
 
111
117
  b = Fit4Ruby.read(fit_file)
112
- expect(b).to eq(@activity)
113
- File.delete(fit_file)
118
+ expect(b.laps.count).to eq 6
119
+ expect(b.lengths.count).to eq 0
120
+ expect(b.inspect).to eq(activity.inspect)
121
+ end
122
+
123
+ context 'activity with Lengths' do
124
+ let(:activity) do
125
+ ts = timestamp
126
+ laps = 0
127
+ lengths = 0
128
+ a = Fit4Ruby::Activity.new
129
+
130
+ a.total_timer_time = 30 * 60.0
131
+ a.new_device_info({ :timestamp => ts,
132
+ :device_index => 0, :manufacturer => 'garmin',
133
+ :serial_number => 123456789 })
134
+
135
+ 0.upto(a.total_timer_time / 60) do |mins|
136
+ ts += 60
137
+ if mins > 0 && mins % 5 == 0
138
+ a.new_lap({ :timestamp => ts, :sport => 'swimming',
139
+ :message_index => laps, :total_cycles => 195 })
140
+ laps += 1
141
+
142
+ a.new_length({ :timestamp => ts, :event => 'length',
143
+ :message_index => lengths, :total_strokes => 45 })
144
+ lengths += 1
145
+ end
146
+ end
147
+ a
148
+ end
149
+
150
+ it 'should write an Activity FIT file and read it back' do
151
+ Fit4Ruby.write(fit_file, activity)
152
+ expect(File.exist?(fit_file)).to be true
153
+
154
+ b = Fit4Ruby.read(fit_file)
155
+ expect(b.laps.count).to eq 6
156
+ expect(b.lengths.count).to eq 6
157
+ expect(b.laps.select { |l| l.sport == 'swimming' }.count).to eq 6
158
+ expect(b.lengths.select { |l| l.total_strokes == 45 }.count).to eq 6
159
+ expect(b.inspect).to eq(activity.inspect)
160
+ end
161
+
114
162
  end
115
163
 
116
164
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fit4ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.0
4
+ version: 3.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Schlaeger
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-08 00:00:00.000000000 Z
11
+ date: 2020-09-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bindata
@@ -30,28 +30,28 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.9.12
33
+ version: 0.9.20
34
34
  type: :development
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: 0.9.12
40
+ version: 0.9.20
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 0.9.6
47
+ version: 12.0.0
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 0.9.6
54
+ version: 12.0.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: bundler
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +66,34 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: 1.6.4
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '3.8'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '3.8'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0.12'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0.12'
69
97
  description: |
70
98
  This library can read and write FIT files and convert them into a Ruby data
71
99
  structure for easy processing. This library was written for Garmin devices
@@ -118,6 +146,7 @@ files:
118
146
  - lib/fit4ruby/HRV.rb
119
147
  - lib/fit4ruby/HeartRateZones.rb
120
148
  - lib/fit4ruby/Lap.rb
149
+ - lib/fit4ruby/Length.rb
121
150
  - lib/fit4ruby/Log.rb
122
151
  - lib/fit4ruby/Metrics.rb
123
152
  - lib/fit4ruby/Monitoring.rb
@@ -161,7 +190,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
161
190
  version: '0'
162
191
  requirements: []
163
192
  rubyforge_project:
164
- rubygems_version: 2.2.5
193
+ rubygems_version: 2.7.6.2
165
194
  signing_key:
166
195
  specification_version: 4
167
196
  summary: Library to read and write GARMIN FIT files.