fitreader 0.2.1 → 0.2.2
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/fitreader/fitfile.rb +13 -12
- data/lib/fitreader/message_type.rb +12 -0
- data/lib/fitreader/version.rb +1 -1
- data/lib/fitreader.rb +8 -8
- data/spec/1471568492.fit +0 -0
- data/spec/fitreader_interfaces_spec.rb +16 -4
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4b2be794be1509aea5735c90db8baa8069a6966f
|
4
|
+
data.tar.gz: d1021cb2f19661e464f82bec37de36681f3327df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b22df5efadc25fce079ff005e6deace58614534db24ca7ec760d153e73fa36634c3e9b94b4aa4bc692cddd9d2e9cd1013ab22e5a5405bd7f63e49e28c9c91e3b
|
7
|
+
data.tar.gz: 0d73b699bc61bc794abc593027b84d70c8bc50a7fcc4be1aff9883057de1df5abd4fc4f2d428839f6e66c1f86d86e070bdeb74230bfe09d4d72e50dd6d2d2ae9
|
data/lib/fitreader/fitfile.rb
CHANGED
@@ -11,42 +11,43 @@ module Fitreader
|
|
11
11
|
attr_reader :header, :messages, :file
|
12
12
|
|
13
13
|
def initialize(path)
|
14
|
-
|
14
|
+
if path.is_a? String
|
15
|
+
@file = File.open(path, 'rb')
|
16
|
+
elsif path.is_a? File
|
17
|
+
@file = path
|
18
|
+
end
|
15
19
|
@header = FileHeader.new(@file.read(14))
|
16
20
|
if valid?
|
17
21
|
@defs = {}
|
18
22
|
@messages = {}
|
19
|
-
while @file.pos < @header.num_records
|
20
|
-
process_next_record
|
21
|
-
end
|
22
|
-
# puts "number of bad records found: #{@error_records.length}"
|
23
|
+
process_next_record while @file.pos < @header.num_records
|
23
24
|
end
|
24
25
|
end
|
25
26
|
|
26
27
|
private
|
28
|
+
|
27
29
|
def valid?
|
28
30
|
@header.valid_file
|
29
31
|
end
|
30
32
|
|
31
33
|
def process_next_record
|
32
|
-
h = RecordHeader.new(@file.read(1).unpack(
|
34
|
+
h = RecordHeader.new(@file.read(1).unpack('C').first)
|
33
35
|
dr = @defs[h.local_num]
|
34
36
|
if h.header_type == :definition
|
35
37
|
dr = Definition.new(h.local_num, @file.read(5))
|
36
|
-
dr.add_fields(@file.read(dr.num_fields*3))
|
38
|
+
dr.add_fields(@file.read(dr.num_fields * 3))
|
37
39
|
@defs[h.local_num] = dr
|
38
|
-
|
39
40
|
m = MessageType.new(dr)
|
40
|
-
@messages[dr.global_num]
|
41
|
+
(@messages[dr.global_num] ||= []).push m
|
41
42
|
elsif h.header_type == :data
|
42
43
|
unless dr.nil?
|
43
44
|
begin
|
44
45
|
data = @file.read(dr.content_length)
|
45
46
|
datr = Record.new(dr, data)
|
46
|
-
@messages[dr.global_num].records.push datr
|
47
|
+
@messages[dr.global_num].last.records.push datr
|
47
48
|
rescue UnknownMessageTypeError
|
48
49
|
degraded = DegradedRecord.new(dr, data)
|
49
|
-
@messages[dr.global_num].undefined_records.push degraded
|
50
|
+
@messages[dr.global_num].last.undefined_records.push degraded
|
50
51
|
end
|
51
52
|
else
|
52
53
|
msg = "no record def found! #{h.local_msg_num}"
|
@@ -55,7 +56,7 @@ module Fitreader
|
|
55
56
|
elsif h.header_type == :timestamp
|
56
57
|
raise "timestamp :: msg_num: #{h.local_msg_num}, offset: #{h.timestamp_offset}"
|
57
58
|
else
|
58
|
-
raise
|
59
|
+
raise 'not a valid record'
|
59
60
|
end
|
60
61
|
end
|
61
62
|
end
|
@@ -8,5 +8,17 @@ module Fitreader
|
|
8
8
|
@records = []
|
9
9
|
@undefined_records = []
|
10
10
|
end
|
11
|
+
|
12
|
+
def record_values
|
13
|
+
records.flatten
|
14
|
+
.collect { |y|y.fields.values.collect { |z| [z.name, z.value] } }
|
15
|
+
.collect(&:to_h)
|
16
|
+
end
|
17
|
+
|
18
|
+
def error_fields
|
19
|
+
records.flatten
|
20
|
+
.select { |x| !x.error_fields.empty? }
|
21
|
+
.collect(&:error_fields)
|
22
|
+
end
|
11
23
|
end
|
12
24
|
end
|
data/lib/fitreader/version.rb
CHANGED
data/lib/fitreader.rb
CHANGED
@@ -14,35 +14,35 @@ module Fitreader
|
|
14
14
|
|
15
15
|
def self.available_records
|
16
16
|
@f.messages
|
17
|
-
.select { |
|
18
|
-
.select { |
|
19
|
-
.collect { |x| [x[0], x[1].definition.name, x[1].records.length] }
|
17
|
+
.select { |_,v| !v.any? { |z| z.definition.name.nil? } }
|
18
|
+
.select { |_,v| !v.any? { |z| z.records.length.zero? } }
|
19
|
+
.collect { |x| [x[0], x[1].first.definition.name, x[1].collect(&:records).flatten.length] }
|
20
20
|
.sort
|
21
21
|
end
|
22
22
|
|
23
23
|
def self.get_message_type(filter)
|
24
24
|
if filter.is_a?(Symbol)
|
25
|
-
res = @f.messages.find { |_,y| y.definition.name == filter}
|
25
|
+
res = @f.messages.find { |_,y| y.any? { |z| z.definition.name == filter } }
|
26
26
|
res[1] unless res.nil?
|
27
27
|
elsif filter.is_a?(Integer)
|
28
28
|
@f.messages[filter]
|
29
29
|
else
|
30
|
-
raise ArgumentError,
|
30
|
+
raise ArgumentError, 'needs a string or a symbol'
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
34
|
def self.record_values(filter)
|
35
35
|
message = get_message_type filter
|
36
|
-
message.
|
36
|
+
message.collect(&:record_values).flatten
|
37
37
|
end
|
38
38
|
|
39
39
|
def self.error_messages
|
40
|
-
@f.messages.select { |_,v| !v.undefined_records.empty? }
|
40
|
+
@f.messages.select { |_, v| !v.any? { |x| x.undefined_records.empty? } }
|
41
41
|
end
|
42
42
|
|
43
43
|
def self.error_fields(filter)
|
44
44
|
message = get_message_type filter
|
45
|
-
message.
|
45
|
+
message.collect(&:error_fields).flatten
|
46
46
|
end
|
47
47
|
|
48
48
|
# def self.filter_by_scope(filter)
|
data/spec/1471568492.fit
ADDED
Binary file
|
@@ -4,13 +4,14 @@ require 'fitreader'
|
|
4
4
|
describe Fitreader do
|
5
5
|
describe 'has functioning interfaces' do
|
6
6
|
before do
|
7
|
-
@path = File.join(File.dirname(__FILE__), '2016-04-09-13-19-18.fit')
|
7
|
+
# @path = File.join(File.dirname(__FILE__), '2016-04-09-13-19-18.fit')
|
8
|
+
@path = File.join(File.dirname(__FILE__), '1471568492.fit')
|
8
9
|
Fitreader.read(@path)
|
9
10
|
end
|
10
11
|
|
11
12
|
it 'has a valid header' do
|
12
13
|
expect(Fitreader.header).not_to be_nil
|
13
|
-
expect(Fitreader.header.num_records).to be(
|
14
|
+
expect(Fitreader.header.num_records).to be(191877)
|
14
15
|
end
|
15
16
|
|
16
17
|
it 'has valid records' do
|
@@ -19,10 +20,12 @@ describe Fitreader do
|
|
19
20
|
end
|
20
21
|
|
21
22
|
it 'can fetch an existing message by number' do
|
22
|
-
expect(Fitreader.get_message_type 18).to be_a(
|
23
|
+
expect(Fitreader.get_message_type 18).to be_a(Array)
|
24
|
+
expect(Fitreader.get_message_type(18).first).to be_a(Fitreader::MessageType)
|
23
25
|
end
|
24
26
|
it 'can fetch an existing message by name' do
|
25
|
-
expect(Fitreader.get_message_type :session).to be_a(
|
27
|
+
expect(Fitreader.get_message_type :session).to be_a(Array)
|
28
|
+
expect(Fitreader.get_message_type(:session).first).to be_a(Fitreader::MessageType)
|
26
29
|
end
|
27
30
|
it 'cannot fetch a non existing message by number' do
|
28
31
|
expect(Fitreader.get_message_type 1234).to be(nil)
|
@@ -31,6 +34,10 @@ describe Fitreader do
|
|
31
34
|
expect(Fitreader.get_message_type :non_existant).to be(nil)
|
32
35
|
end
|
33
36
|
|
37
|
+
it 'has the right number of records' do
|
38
|
+
expect(Fitreader.record_values(:record).length).to be(4988)
|
39
|
+
end
|
40
|
+
|
34
41
|
it 'can return name-value data' do
|
35
42
|
expect(Fitreader.record_values :session).to be_a(Array)
|
36
43
|
end
|
@@ -41,5 +48,10 @@ describe Fitreader do
|
|
41
48
|
it 'can return error-messages' do
|
42
49
|
expect(Fitreader.error_messages).to be_a(Hash)
|
43
50
|
end
|
51
|
+
|
52
|
+
it 'can test something' do
|
53
|
+
# expect(Fitreader.record_values :activity).to be_a(Array)
|
54
|
+
# expect(Fitreader.record_values :session).to be_a(Array)
|
55
|
+
end
|
44
56
|
end
|
45
57
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fitreader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Brodie
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -99,6 +99,7 @@ files:
|
|
99
99
|
- lib/fitreader/static.rb
|
100
100
|
- lib/fitreader/version.rb
|
101
101
|
- schema
|
102
|
+
- spec/1471568492.fit
|
102
103
|
- spec/2016-04-09-13-19-18.fit
|
103
104
|
- spec/fitreader_interfaces_spec.rb
|
104
105
|
- spec/fitreader_readfile_spec.rb
|
@@ -130,6 +131,7 @@ signing_key:
|
|
130
131
|
specification_version: 4
|
131
132
|
summary: Library for reading FIT files generated by Garmin devices.
|
132
133
|
test_files:
|
134
|
+
- spec/1471568492.fit
|
133
135
|
- spec/2016-04-09-13-19-18.fit
|
134
136
|
- spec/fitreader_interfaces_spec.rb
|
135
137
|
- spec/fitreader_readfile_spec.rb
|