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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9490e28bdb44736bc5545aad4bc74158a8665d5a
4
- data.tar.gz: 2334e9c0bba34ebb3d73105988fea7f8bf88fb36
3
+ metadata.gz: 4b2be794be1509aea5735c90db8baa8069a6966f
4
+ data.tar.gz: d1021cb2f19661e464f82bec37de36681f3327df
5
5
  SHA512:
6
- metadata.gz: ac9a75e0e674ae408c2889badb53404ac435856e32f59d98e289d44f1861e0f554b199f058621926248a4738d598d68fb2daf33ec1d673ece4f99983bc299fef
7
- data.tar.gz: 0d3bed12f148a6ff80e458920883669b925df6ab79cf5c844ad1a290ece9df46f08a499dbe54183a87a2a89df3904372ba4fd3faf6e057c56d4a6574113a9e8d
6
+ metadata.gz: b22df5efadc25fce079ff005e6deace58614534db24ca7ec760d153e73fa36634c3e9b94b4aa4bc692cddd9d2e9cd1013ab22e5a5405bd7f63e49e28c9c91e3b
7
+ data.tar.gz: 0d73b699bc61bc794abc593027b84d70c8bc50a7fcc4be1aff9883057de1df5abd4fc4f2d428839f6e66c1f86d86e070bdeb74230bfe09d4d72e50dd6d2d2ae9
@@ -11,42 +11,43 @@ module Fitreader
11
11
  attr_reader :header, :messages, :file
12
12
 
13
13
  def initialize(path)
14
- @file = File.open(path, 'rb')
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 do
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("C").first)
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] = m
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 "not a valid record"
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
@@ -1,3 +1,3 @@
1
1
  module Fitreader
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.2"
3
3
  end
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 { |x,y| !y.definition.name.nil? }
18
- .select { |x,y| !y.records.length.zero? }
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, "needs a string or a symbol"
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.records.collect {|x| x.fields.values.collect{|z| [z.name, z.value]}}.collect{|y| y.to_h}
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.records.select{|x| !x.error_fields.empty?}.collect{|y| y.error_fields}
45
+ message.collect(&:error_fields).flatten
46
46
  end
47
47
 
48
48
  # def self.filter_by_scope(filter)
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(89139)
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(Fitreader::MessageType)
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(Fitreader::MessageType)
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.1
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: 2016-12-26 00:00:00.000000000 Z
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