tcxread 0.1.0 → 0.1.1
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/tcxread.rb +43 -6
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 209745c7c980f590adf7944373f33951373b2c000d3a6a1bcfaed33b63cd59ad
|
4
|
+
data.tar.gz: 8abbe15da4a5a3ef688d531fa2d00c32dbfc19066a3c1baabe9de825202d6041
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c135f57bc1f24d640afdb59550301e491595652acafa18884d1df0b9f67547780aaffefd8f42cefec74ebb610aeeb8199b70697deff2f596fce1f4e601c3b92
|
7
|
+
data.tar.gz: de5960e78c0ba9a569778a17a066410fed531a07d359cbe1a7c5e85eea9edae8f3826ef721b410ce0223fd1f9cd32e1a327871f92bbe5c20b7d48e57d08881ab
|
data/lib/tcxread.rb
CHANGED
@@ -4,16 +4,14 @@ require "nokogiri"
|
|
4
4
|
# workout data such as activities, laps, tracks, trackpoints, and integral metrics.
|
5
5
|
class TCXRead
|
6
6
|
attr_reader :total_distance_meters, :total_time_seconds, :total_calories,
|
7
|
-
:total_ascent, :total_descent, :max_altitude, :average_heart_rate
|
7
|
+
:total_ascent, :total_descent, :max_altitude, :average_heart_rate,
|
8
|
+
:max_watts, :average_watts
|
8
9
|
|
9
|
-
# Initializes the TCXRead with the path to the TCX file.
|
10
|
-
#
|
11
|
-
# @param file_path [String] the path to the TCX file.
|
12
10
|
def initialize(file_path)
|
13
11
|
@file_path = file_path
|
14
12
|
@doc = Nokogiri::XML(File.open(file_path))
|
13
|
+
@doc.root.add_namespace_definition('ns3', 'http://www.garmin.com/xmlschemas/ActivityExtension/v2')
|
15
14
|
|
16
|
-
# Init the properties
|
17
15
|
@total_distance_meters = 0
|
18
16
|
@total_time_seconds = 0
|
19
17
|
@total_calories = 0
|
@@ -21,6 +19,9 @@ class TCXRead
|
|
21
19
|
@total_descent = 0
|
22
20
|
@max_altitude = 0
|
23
21
|
@average_heart_rate = 0
|
22
|
+
# use NA if no watts exist in the TCX file
|
23
|
+
@max_watts = 'NA'
|
24
|
+
@average_watts = 'NA'
|
24
25
|
|
25
26
|
parse
|
26
27
|
end
|
@@ -36,6 +37,7 @@ class TCXRead
|
|
36
37
|
@total_calories = activities.sum { |activity| activity[:total_calories] }
|
37
38
|
@total_ascent, @total_descent, @max_altitude = calculate_ascent_descent_and_max_altitude_from_activities(activities)
|
38
39
|
@average_heart_rate = calculate_average_heart_rate_from_activities(activities)
|
40
|
+
@max_watts, @average_watts = calculate_watts_from_activities(activities)
|
39
41
|
end
|
40
42
|
|
41
43
|
{ activities: activities }
|
@@ -112,7 +114,8 @@ class TCXRead
|
|
112
114
|
distance_meters: trackpoint.xpath('xmlns:DistanceMeters').text.to_f,
|
113
115
|
heart_rate: trackpoint.xpath('xmlns:HeartRateBpm/xmlns:Value').text.to_i,
|
114
116
|
cadence: trackpoint.xpath('xmlns:Cadence').text.to_i,
|
115
|
-
sensor_state: trackpoint.xpath('xmlns:SensorState').text
|
117
|
+
sensor_state: trackpoint.xpath('xmlns:SensorState').text,
|
118
|
+
watts: trackpoint.xpath('xmlns:Extensions/ns3:TPX/ns3:Watts').text.to_f
|
116
119
|
}
|
117
120
|
end
|
118
121
|
tracks << trackpoints
|
@@ -165,6 +168,7 @@ class TCXRead
|
|
165
168
|
[total_ascent, total_descent, max_altitude]
|
166
169
|
end
|
167
170
|
|
171
|
+
|
168
172
|
# Calculates the total ascent, total descent, and maximum altitude from the activities.
|
169
173
|
#
|
170
174
|
# @param activities [Array<Hash>] an array of activity hashes.
|
@@ -226,4 +230,37 @@ class TCXRead
|
|
226
230
|
|
227
231
|
heart_rate_count > 0 ? total_heart_rate.to_f / heart_rate_count : 0.0
|
228
232
|
end
|
233
|
+
|
234
|
+
# Calculates the maximum and average watts from the activities.
|
235
|
+
#
|
236
|
+
# @param activities [Array<Hash>] an array of activity hashes.
|
237
|
+
# @return [Array<Float, Float>] an array containing maximum watts and average watts. Returns 'NA' for both if no watts data is available.
|
238
|
+
def calculate_watts_from_activities(activities)
|
239
|
+
max_watts = 0
|
240
|
+
total_watts = 0
|
241
|
+
watts_count = 0
|
242
|
+
|
243
|
+
activities.each do |activity|
|
244
|
+
activity[:laps].each do |lap|
|
245
|
+
lap[:tracks].flatten.each do |trackpoint|
|
246
|
+
watts = trackpoint[:watts]
|
247
|
+
if watts > 0
|
248
|
+
total_watts += watts
|
249
|
+
watts_count += 1
|
250
|
+
max_watts = watts if watts > max_watts
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
if watts_count > 0
|
257
|
+
average_watts = total_watts.to_f / watts_count
|
258
|
+
max_watts = max_watts
|
259
|
+
else
|
260
|
+
average_watts = 'NA'
|
261
|
+
max_watts = 'NA'
|
262
|
+
end
|
263
|
+
|
264
|
+
[max_watts, average_watts]
|
265
|
+
end
|
229
266
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tcxread
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- firefly-cpp
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-07-
|
11
|
+
date: 2024-07-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|