tcx_rb 0.1.0 → 0.2.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/Gemfile.lock +1 -1
- data/README.md +135 -6
- data/lib/tcx_rb/activity.rb +56 -0
- data/lib/tcx_rb/version.rb +1 -1
- data/lib/tcx_rb/workout.rb +62 -0
- data/lib/tcx_rb.rb +8 -3
- data/tcx_rb.gemspec +1 -3
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 57eac59c633ebe544e4fbb134a527121d261f66755575d9cdd966865a39a29fd
|
4
|
+
data.tar.gz: ec031953f8875c10db3cb3c866621bd0ee452ac0030e1d5f344e7c68f7d27212
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5c3ba59454afd34ea5e01b2066e0c731401d2b18f4ef61b4ec280918a849b5b6769cb07badeb3575cfb26e6fcb83e7d74c3b09483f456eb3a02c4409b3ae5369
|
7
|
+
data.tar.gz: 4c7083b701bbe4164a9a731356326caea924ff5b3047b12a58aa24754e12f82104009f9825dc18fc4ce27155e1ecac4586cc9d73dec3ab6e5c90ae25cc7b75ca
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
|
1
|
+
[](https://travis-ci.org/Kdoggett887/tcx_rb)
|
2
2
|
|
3
|
-
|
3
|
+
# TcxRb
|
4
4
|
|
5
|
-
|
5
|
+
TcxRb is a ruby library for parsing Garmin TCX files into sensible Ruby objects.
|
6
6
|
|
7
7
|
## Installation
|
8
8
|
|
@@ -22,7 +22,137 @@ Or install it yourself as:
|
|
22
22
|
|
23
23
|
## Usage
|
24
24
|
|
25
|
-
|
25
|
+
The simplest way to start using TcxRb is to create a workout from a file.
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
workout = TcxRb.workout_from_file('/path/to/file')
|
29
|
+
# => TcxRb::Workout
|
30
|
+
|
31
|
+
workout.max_heart_rate
|
32
|
+
# => 181
|
33
|
+
|
34
|
+
workout.min_altitude
|
35
|
+
# => -3.17
|
36
|
+
|
37
|
+
workout.avg_pace
|
38
|
+
# => 3.027
|
39
|
+
|
40
|
+
workout.activities
|
41
|
+
# => [TcxRb::Activity]
|
42
|
+
|
43
|
+
workout.activities[0].laps
|
44
|
+
# => [TcxRb::Lap]
|
45
|
+
|
46
|
+
workout.activities[0].laps[0].trackpoints.size
|
47
|
+
# => 3762
|
48
|
+
|
49
|
+
workout.activities[0].laps[0].trackpoints[0].lat
|
50
|
+
# => 39.965614
|
51
|
+
|
52
|
+
workout.activities[0].laps[0].trackpoints[0].lon
|
53
|
+
# => -75.180849
|
54
|
+
```
|
55
|
+
|
56
|
+
### Types
|
57
|
+
|
58
|
+
The main classes in TcxRb are `Workout`, `Activity`, `Lap`, and `Trackpoint`.
|
59
|
+
|
60
|
+
#### Workout
|
61
|
+
|
62
|
+
`Workout` is the highest level object and its only attribute is `activities` which is an array of `Activity` objects.
|
63
|
+
|
64
|
+
`Workout` also implements `+` and `-`.
|
65
|
+
|
66
|
+
#### Activity
|
67
|
+
|
68
|
+
`Activity` is the highest level object in the tcx schema. It has the following attributes:
|
69
|
+
|
70
|
+
- `sport` - Sport detailed by the tracker (ex. Running).
|
71
|
+
- `id` - ID given by the tracker.
|
72
|
+
- `creator` - Name of the tracker.
|
73
|
+
- `laps` - Array of `Lap` objects.
|
74
|
+
|
75
|
+
#### Lap
|
76
|
+
|
77
|
+
`Lap` represents one "session" in the schema. It has a collection of trackpoints and distance associated with it. It has the following attributes:
|
78
|
+
|
79
|
+
- `start_time` - Start time of lap (string).
|
80
|
+
- `total_time` - Total time of the lap (float).
|
81
|
+
- `distance` - Total distance traveled in meters.
|
82
|
+
- `calories` - Total calories burned.
|
83
|
+
- `intensity` - Classification of lap intensity.
|
84
|
+
- `trigger_method` - Method used to start the lap.
|
85
|
+
- `trackpoints` - Array of `Trackpoint` objects.
|
86
|
+
|
87
|
+
#### Trackpoint
|
88
|
+
|
89
|
+
`Trackpoint` reprsents a sample from the tracker. Lowest level object in the hierarchy that contains the data that the other objects use for computations. It has the following attributes:
|
90
|
+
|
91
|
+
- `time` - Time the trackpoint was sampled (string).
|
92
|
+
- `latitude` - Latitude of the trackpoint.
|
93
|
+
- `longitude` - Longitude of the trackpoint.
|
94
|
+
- `altitude` - Height from sea level, in meters.
|
95
|
+
- `distance` - Total distance since the beginning of the workout, in meters.
|
96
|
+
- `heart_rate` - Heart rate the tracker sampled.
|
97
|
+
- `lat` - alias for latitude.
|
98
|
+
- `lon` - alias for longitude.
|
99
|
+
|
100
|
+
#### Parser
|
101
|
+
|
102
|
+
`Parser` is the class used to parse the tcx file into a `Workout`. A `parser` can be instansiated by passing in tcx string. It exposes the `parse_trackpoints`, `parse_laps`, and `parse_activities` methods which will return an array of hashes of the corresponding object.
|
103
|
+
|
104
|
+
Ex:
|
105
|
+
|
106
|
+
```ruby
|
107
|
+
tcx_str = File.read('/path/to/data')
|
108
|
+
parser = TcxRb::Parser.new(tcx_str)
|
109
|
+
parser.parse_trackpoints
|
110
|
+
|
111
|
+
# => [{:time=>"2020-02-11T21:44:03.000-05:00", :latitude=>"39.965614", :longitude=>"-75.180849", :altitude=>"8.071420612508698", :distance=>"55.1", :heart_rate=>"146"}]
|
112
|
+
```
|
113
|
+
|
114
|
+
### Methods
|
115
|
+
|
116
|
+
Instances of `Workout`, `Activity`, and `Lap` all implement the following methods:
|
117
|
+
|
118
|
+
- `max_heart_rate` - Max heart rate of all trackpoints.
|
119
|
+
- `min_heart_rate` - Min heart rate of all trackpoints.
|
120
|
+
- `avg_heart_rate` - Avg heart rate of all trackpoints.
|
121
|
+
- `max_altitude` - Max altitude of all trackpoints.
|
122
|
+
- `min_altitude` - Min altitude of all trackpoints.
|
123
|
+
- `avg_altitude` - Avg altitude of all trackpoints.
|
124
|
+
- `max_pace` - Max pace of all pairs of trackpoints (m/s).
|
125
|
+
- `min_pace` - Min pace of all pairs of trackpoints (m/s).
|
126
|
+
- `avg_pace` - Avg pace of all pairs of trackpoitns (m/s).
|
127
|
+
|
128
|
+
Additionally, `Workout` and `Activity` implement the following:
|
129
|
+
|
130
|
+
- `total_tps` - The sum of the size of trackpoints contained in the child laps.
|
131
|
+
- `time` - The total "active" time of all the child laps (discounts time spent paused).
|
132
|
+
- `distance` - Total distance of all the child laps.
|
133
|
+
- `calories` - Sum of the calories burned in each child lap.
|
134
|
+
|
135
|
+
### Examples
|
136
|
+
|
137
|
+
Example using `+` and `-` with `Workout`:
|
138
|
+
|
139
|
+
```ruby
|
140
|
+
sat_workout = TcxRb.workout_from_file('saturday.tcx')
|
141
|
+
sun_workout = TcxRb.workout_from_file('sunday.tcx')
|
142
|
+
|
143
|
+
sat_workout.total_distance
|
144
|
+
# => 5000
|
145
|
+
|
146
|
+
sun_workout.total_distance
|
147
|
+
# => 10000
|
148
|
+
|
149
|
+
weekend_workouts = sat_workout + sun_workout
|
150
|
+
weekend_workouts.total_distance
|
151
|
+
# => 15000
|
152
|
+
|
153
|
+
(weekend_workouts - sat_workout).total_distance
|
154
|
+
# => 10000
|
155
|
+
```
|
26
156
|
|
27
157
|
## Development
|
28
158
|
|
@@ -32,8 +162,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
32
162
|
|
33
163
|
## Contributing
|
34
164
|
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
36
|
-
|
165
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/kdoggett887/tcx_rb.
|
37
166
|
|
38
167
|
## License
|
39
168
|
|
data/lib/tcx_rb/activity.rb
CHANGED
@@ -9,5 +9,61 @@ module TcxRb
|
|
9
9
|
@laps = args[:laps]
|
10
10
|
end
|
11
11
|
attr_accessor :sport, :id, :creator, :laps
|
12
|
+
|
13
|
+
def max_heart_rate
|
14
|
+
@laps.map(&:max_heart_rate).max
|
15
|
+
end
|
16
|
+
|
17
|
+
def min_heart_rate
|
18
|
+
@laps.map(&:min_heart_rate).min
|
19
|
+
end
|
20
|
+
|
21
|
+
def avg_heart_rate
|
22
|
+
# weighted average of each laps avg_heart_rate based on
|
23
|
+
# trackpoints size
|
24
|
+
total = total_tps.to_f
|
25
|
+
@laps.sum { |lap| (lap.trackpoints.size / total) * lap.avg_heart_rate }
|
26
|
+
end
|
27
|
+
|
28
|
+
def max_altitude
|
29
|
+
@laps.map(&:max_altitude).max
|
30
|
+
end
|
31
|
+
|
32
|
+
def min_altitude
|
33
|
+
@laps.map(&:min_altitude).min
|
34
|
+
end
|
35
|
+
|
36
|
+
def avg_altitude
|
37
|
+
total = total_tps.to_f
|
38
|
+
@laps.sum { |lap| (lap.trackpoints.size / total) * lap.avg_altitude }
|
39
|
+
end
|
40
|
+
|
41
|
+
def max_pace
|
42
|
+
@laps.map(&:max_pace).max
|
43
|
+
end
|
44
|
+
|
45
|
+
def min_pace
|
46
|
+
@laps.map(&:min_pace).min
|
47
|
+
end
|
48
|
+
|
49
|
+
def avg_pace
|
50
|
+
distance / time
|
51
|
+
end
|
52
|
+
|
53
|
+
def total_tps
|
54
|
+
@laps.sum { |lap| lap.trackpoints.size }
|
55
|
+
end
|
56
|
+
|
57
|
+
def time
|
58
|
+
@laps.sum(&:active_time)
|
59
|
+
end
|
60
|
+
|
61
|
+
def distance
|
62
|
+
@laps.sum(&:distance)
|
63
|
+
end
|
64
|
+
|
65
|
+
def calories
|
66
|
+
@laps.sum(&:calories)
|
67
|
+
end
|
12
68
|
end
|
13
69
|
end
|
data/lib/tcx_rb/version.rb
CHANGED
data/lib/tcx_rb/workout.rb
CHANGED
@@ -6,5 +6,67 @@ module TcxRb
|
|
6
6
|
@activities = activities
|
7
7
|
end
|
8
8
|
attr_accessor :activities
|
9
|
+
|
10
|
+
def +(other)
|
11
|
+
Workout.new(@activities + other.activities)
|
12
|
+
end
|
13
|
+
|
14
|
+
def -(other)
|
15
|
+
Workout.new(@activities - other.activities)
|
16
|
+
end
|
17
|
+
|
18
|
+
def max_heart_rate
|
19
|
+
@activities.map(&:max_heart_rate).max
|
20
|
+
end
|
21
|
+
|
22
|
+
def min_heart_rate
|
23
|
+
@activities.map(&:min_heart_rate).min
|
24
|
+
end
|
25
|
+
|
26
|
+
def avg_heart_rate
|
27
|
+
total = total_tps.to_f
|
28
|
+
@activities.sum { |act| (act.total_tps / total) * act.avg_heart_rate }
|
29
|
+
end
|
30
|
+
|
31
|
+
def max_altitude
|
32
|
+
@activities.map(&:max_altitude).max
|
33
|
+
end
|
34
|
+
|
35
|
+
def min_altitude
|
36
|
+
@activities.map(&:min_altitude).min
|
37
|
+
end
|
38
|
+
|
39
|
+
def avg_altitude
|
40
|
+
total = total_tps.to_f
|
41
|
+
@activities.sum { |act| (act.total_tps / total) * act.avg_altitude }
|
42
|
+
end
|
43
|
+
|
44
|
+
def max_pace
|
45
|
+
@activities.map(&:max_pace).max
|
46
|
+
end
|
47
|
+
|
48
|
+
def min_pace
|
49
|
+
@activities.map(&:min_pace).min
|
50
|
+
end
|
51
|
+
|
52
|
+
def avg_pace
|
53
|
+
distance / time
|
54
|
+
end
|
55
|
+
|
56
|
+
def total_tps
|
57
|
+
@activities.sum(&:total_tps)
|
58
|
+
end
|
59
|
+
|
60
|
+
def time
|
61
|
+
@activities.sum(&:time)
|
62
|
+
end
|
63
|
+
|
64
|
+
def distance
|
65
|
+
@activities.sum(&:distance)
|
66
|
+
end
|
67
|
+
|
68
|
+
def calories
|
69
|
+
@activities.sum(&:calories)
|
70
|
+
end
|
9
71
|
end
|
10
72
|
end
|
data/lib/tcx_rb.rb
CHANGED
@@ -11,17 +11,22 @@ module TcxRb
|
|
11
11
|
class Error < StandardError; end
|
12
12
|
# Your code goes here...
|
13
13
|
|
14
|
-
def self.
|
14
|
+
def self.workout_from_str(tcx_str)
|
15
15
|
parser = TcxRb::Parser.new(tcx_str)
|
16
|
-
|
16
|
+
workout = parser.parse_activities
|
17
17
|
|
18
|
-
activities =
|
18
|
+
activities = workout.map do |activity|
|
19
19
|
activity[:laps] = generate_laps(activity[:laps])
|
20
20
|
TcxRb::Activity.new(activity)
|
21
21
|
end
|
22
22
|
TcxRb::Workout.new(activities)
|
23
23
|
end
|
24
24
|
|
25
|
+
def self.workout_from_file(path)
|
26
|
+
str = File.read(path)
|
27
|
+
workout_from_str(str)
|
28
|
+
end
|
29
|
+
|
25
30
|
class << self
|
26
31
|
private
|
27
32
|
|
data/tcx_rb.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.authors = ['Keith Doggett']
|
9
9
|
spec.email = ['keith.doggett887@gmail.com']
|
10
10
|
|
11
|
-
spec.summary = 'TcxRB is a
|
11
|
+
spec.summary = 'TcxRB is a Garmin TCX parsing library for Ruby.'
|
12
12
|
spec.description =
|
13
13
|
'TcxRB is a Garmin TCX parsing library for Ruby. '\
|
14
14
|
'It gives access to raw data and has helpful aggregate '\
|
@@ -17,8 +17,6 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.license = 'MIT'
|
18
18
|
spec.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
|
19
19
|
|
20
|
-
# spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
|
21
|
-
|
22
20
|
spec.metadata['homepage_uri'] = spec.homepage
|
23
21
|
spec.metadata['source_code_uri'] = spec.homepage
|
24
22
|
# spec.metadata['changelog_uri'] = "TODO: Put your gem's CHANGELOG.md URL here."
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tcx_rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Keith Doggett
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-02-
|
11
|
+
date: 2020-02-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -101,5 +101,5 @@ requirements: []
|
|
101
101
|
rubygems_version: 3.0.3
|
102
102
|
signing_key:
|
103
103
|
specification_version: 4
|
104
|
-
summary: TcxRB is a
|
104
|
+
summary: TcxRB is a Garmin TCX parsing library for Ruby.
|
105
105
|
test_files: []
|