insulin 0.0.13 → 0.0.14

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.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- insulin (0.0.12)
4
+ insulin (0.0.13)
5
5
  bson_ext
6
6
  ffi
7
7
  mongo
data/bin/insulin CHANGED
@@ -29,6 +29,16 @@ module Insulin
29
29
  end
30
30
  end
31
31
 
32
+ desc "week DATE", "show stats for week commencing DATE (defaults to previous 7 days)"
33
+ def week date = nil
34
+ if not date
35
+ require 'time'
36
+ date = (Time.new - (6 * 86400)).strftime "%F"
37
+ end
38
+ w = Insulin::Week.new date, @@mongo
39
+ puts w.to_s
40
+ end
41
+
32
42
  default_task :day
33
43
  end
34
44
  end
data/lib/insulin/day.rb CHANGED
@@ -14,7 +14,7 @@ module Insulin
14
14
  self["all"] = []
15
15
 
16
16
  @mongo.db.collection(date).find().each do |e|
17
- ev = Insulin::Event.new(e)
17
+ ev = Event.new(e)
18
18
  keys.each do |k|
19
19
  sub = ev[k]
20
20
  if self[sub]
@@ -31,10 +31,14 @@ module Insulin
31
31
  def average_glucose
32
32
  t = 0
33
33
  c = 0
34
- self["glucose"].each do |g|
35
- @glucose_units = g["units"]
36
- t += g["value"]
37
- c += 1
34
+ begin
35
+ self["glucose"].each do |g|
36
+ @glucose_units = g["units"]
37
+ t += g["value"]
38
+ c += 1
39
+ end
40
+ rescue NoMethodError
41
+ return 0
38
42
  end
39
43
 
40
44
  return t / c
@@ -46,11 +50,13 @@ module Insulin
46
50
  s << "\n"
47
51
 
48
52
  self["all"].each do |e|
53
+ s << " "
49
54
  s << e.simple
50
55
  s << "\n"
51
56
  end
52
57
 
53
- s << " Average glucose: %4.2f %s" % [
58
+ s << " "
59
+ s << "Average glucose: %4.2f %s" % [
54
60
  self.average_glucose,
55
61
  @glucose_units
56
62
  ]
@@ -64,6 +70,7 @@ module Insulin
64
70
 
65
71
  self["all"].each do |e|
66
72
  if ["breakfast", "lunch", "dinner", "bedtime"].include? e["tag"]
73
+ s << " "
67
74
  s << e.simple
68
75
  s << "\n"
69
76
  end
data/lib/insulin/event.rb CHANGED
@@ -59,7 +59,7 @@ module Insulin
59
59
  end
60
60
 
61
61
  def simple
62
- s = " %s %-10s %-10s %-10s %4.1f %s" % [
62
+ s = "%s | %-15s | %-10s | %-13s | %4.1f %s" % [
63
63
  self["time"],
64
64
  self["tag"],
65
65
  self["type"],
@@ -0,0 +1,64 @@
1
+ module Insulin
2
+ # Author:: Sam (mailto:sam@cruft.co)
3
+ # License:: MIT
4
+
5
+ module OnTrack
6
+
7
+ # This class represents a CSV file as exported by OnTrack
8
+ class CsvFile
9
+ attr_reader :file, :lines, :events
10
+
11
+ # Take the path to the CSV, open it, process it
12
+ def initialize csv_path
13
+ @csv_path = csv_path
14
+ @file = File.new @csv_path
15
+ self.read_lines
16
+ self.create_events
17
+ end
18
+
19
+ # Read the lines
20
+ def read_lines
21
+ @lines = []
22
+
23
+ # Where an event has more than one note, a 'line' will contain '\n's
24
+ l = ""
25
+ while line = @file.gets
26
+ # Stuff the line in to 'l'
27
+ l << line
28
+
29
+ # A '"' at the end of the line closes the event
30
+ if line[-2] == '"'
31
+
32
+ # Create a CsvLine, stripping the final '\n'
33
+ o = CsvLine.new l[0..-2]
34
+ @lines << o
35
+
36
+ # Reset the placeholder
37
+ l = ""
38
+ end
39
+ end
40
+
41
+ # Sort the list by the serial numbers (required for a future feature)
42
+ @lines.sort_by! {|o| o["serial"]}
43
+ end
44
+
45
+ # Turn the lines into Events
46
+ def create_events
47
+ @events = []
48
+ @lines.each do |l|
49
+ e = Event.new l
50
+ @events << e
51
+ end
52
+ end
53
+
54
+ # Save the events to Mongo
55
+ def save_events mongo
56
+ # print "saving %d events to mongo... " % @events.count
57
+ @events.each do |e|
58
+ e.save mongo
59
+ end
60
+ # puts "done"
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,42 @@
1
+ module Insulin
2
+ # Author:: Sam (mailto:sam@cruft.co)
3
+ # License:: MIT
4
+
5
+ module OnTrack
6
+
7
+ # This class represents a single OnTrack CSV line
8
+ class CsvLine < Hash
9
+
10
+ # Parse the passed-in CSV line
11
+ def initialize line
12
+
13
+ # Split on commas
14
+ bits = line.split ","
15
+ self["serial"] = bits[0].to_i
16
+
17
+ # OnTrack embeds commas in the dates of its CSVs. Duh
18
+ self.update Date.new "%s%s" % [
19
+ bits[1],
20
+ bits[2]
21
+ ]
22
+ self["type"] = bits[3].downcase
23
+ self["subtype"] = bits[4].downcase if not bits[4] == ""
24
+ self["tag"] = bits[5].downcase
25
+ self["value"] = bits[6].to_f
26
+
27
+ # Notes get complicated. Everything from field 7 to the end will be part
28
+ # of the notes
29
+ notes = bits[7..-1]
30
+
31
+ # We may have embedded commas
32
+ notes = notes.join ","
33
+
34
+ # Strip the trailing '\n'
35
+ notes = notes[1..-2]
36
+
37
+ # See Insulin::OnTrack::NoteSet
38
+ self["notes"] = NoteSet.new notes if not notes == ""
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,27 @@
1
+ require "time"
2
+
3
+ module Insulin
4
+ # Author:: Sam (mailto:sam@cruft.co)
5
+ # License:: MIT
6
+ module OnTrack
7
+
8
+ # OnTrack uses really shitty date formats, including embedding a comma in
9
+ # the CSV export file. Christ on a crutch
10
+ class Date < Hash
11
+
12
+ # Parse the string 'd', looking for datetime information
13
+ def initialize d
14
+ t = Time.parse d
15
+
16
+ # We extract loads of stuff. Might be useful one day
17
+ self["timestamp"] = t
18
+ self["tzoffset"] = t.strftime "%z"
19
+ self["timezone"] = t.zone
20
+ self["unixtime"] = t.to_i
21
+ self["day"] = t.strftime("%A").downcase
22
+ self["date"] = t.strftime "%F"
23
+ self["time"] = t.strftime "%T #{self['timezone']}"
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,49 @@
1
+ module Insulin
2
+ # Author:: Sam (mailto:sam@cruft.co)
3
+ # License:: MIT
4
+
5
+ module OnTrack
6
+
7
+ # Class representing a single OnTrack note
8
+ class Note
9
+
10
+ # Lookups. We will only deal with notes of these types
11
+ @@keys = {
12
+ "F" => 'food',
13
+ "B" => 'booze',
14
+ "N" => 'note'
15
+ }
16
+
17
+ attr_reader :type, :content
18
+
19
+ # Parse the raw note 'n'
20
+ def initialize n
21
+
22
+ # Key/value splits on ':'
23
+ bits = n.split ":"
24
+
25
+ # Remove leading/trailing cruft from key part
26
+ t = bits[0].strip
27
+
28
+ # We only deal with the keys we know about
29
+ if @@keys.keys.include? t
30
+
31
+ # Remove cruft from content, downcase
32
+ @content = bits[1].strip.downcase
33
+
34
+ # These keys mean we turn the content into a list
35
+ if ["F", "B"].include? t
36
+ a = []
37
+ @content.split(",").each do |v|
38
+ a << v.strip
39
+ end
40
+ @content = a
41
+ end
42
+
43
+ # Set key from lookup list
44
+ @type = @@keys[t]
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,48 @@
1
+ module Insulin
2
+ # Author:: Sam (mailto:sam@cruft.co)
3
+ # License:: MIT
4
+
5
+ module OnTrack
6
+
7
+ # This class represents a set of notes
8
+ class NoteSet < Hash
9
+
10
+ # Parse the string 's'
11
+ def initialize s
12
+
13
+ # Notes separated by newlines
14
+ l = s.split"\n"
15
+
16
+ # For each line
17
+ l.each do |n|
18
+
19
+ # Make a note
20
+ x = Note.new n
21
+
22
+ # This field will only exists for notes of a valid type
23
+ if x.type
24
+
25
+ # If we don't yet have this key
26
+ if not self[x.type]
27
+
28
+ # If the content is a list
29
+ if x.content.class.name == "Array"
30
+
31
+ # This becomes our value
32
+ self[x.type] = x.content
33
+ else
34
+
35
+ # Otherwise make it onto a list
36
+ self[x.type] = [x.content]
37
+ end
38
+ else
39
+
40
+ # This key exists, so we append this value
41
+ self[x.type] << x.content
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -1,5 +1,5 @@
1
1
  module Insulin
2
2
 
3
3
  # Current version
4
- VERSION = "0.0.13"
4
+ VERSION = "0.0.14"
5
5
  end
data/lib/insulin.rb CHANGED
@@ -1,13 +1,14 @@
1
1
  require "insulin/version"
2
2
  require "insulin/config"
3
3
  require "insulin/mongo_handle"
4
- require "insulin/on_track_date"
5
- require "insulin/on_track_note"
6
- require "insulin/on_track_note_set"
7
- require "insulin/on_track_csv_line"
8
- require "insulin/on_track_csv_file"
9
4
  require "insulin/event"
10
5
  require "insulin/day"
6
+ require "insulin/week"
7
+ require "insulin/on_track/date"
8
+ require "insulin/on_track/note"
9
+ require "insulin/on_track/note_set"
10
+ require "insulin/on_track/csv_line"
11
+ require "insulin/on_track/csv_file"
11
12
 
12
13
  # Author:: Sam (mailto:sam@cruft.co)
13
14
  # License:: MIT
File without changes
@@ -29,14 +29,12 @@ describe Insulin::Day do
29
29
  end
30
30
 
31
31
  it "should display correctly" do
32
- d.to_s.should include "19:07:42 BST dinner medication humalog 6.0 x10^-5 L"
32
+ d.to_s.should include "19:07:42 BST | dinner | medication | humalog | 6.0 x10^-5 L"
33
33
  end
34
34
 
35
35
  it "minimal display should be correct" do
36
36
  d.minimal.should_not include "exercise"
37
37
  end
38
38
 
39
- puts d.minimal
40
-
41
39
  drop_test_db
42
40
  end
@@ -1,7 +1,7 @@
1
1
  require 'insulin'
2
2
 
3
3
  describe Insulin::Event do
4
- event = Insulin::Event.new Insulin::OnTrackCsvLine.new %q{266,"Jun 28, 2012 10:21:05 AM",Medication,Humalog,After Breakfast,4.0,"F:2 bacon, 2 toast
4
+ event = Insulin::Event.new Insulin::OnTrack::CsvLine.new %q{266,"Jun 28, 2012 10:21:05 AM",Medication,Humalog,After Breakfast,4.0,"F:2 bacon, 2 toast
5
5
  N:test note
6
6
  X:fail note
7
7
  N:other note"}
@@ -1,14 +1,14 @@
1
1
  require 'insulin'
2
2
 
3
- describe Insulin::OnTrackCsvFile do
4
- csv_file = Insulin::OnTrackCsvFile.new 'files/on_track.csv'
3
+ describe Insulin::OnTrack::CsvFile do
4
+ csv_file = Insulin::OnTrack::CsvFile.new 'files/on_track.csv'
5
5
 
6
6
  it "should open the file" do
7
7
  csv_file.file.path.should == 'files/on_track.csv'
8
8
  end
9
9
 
10
10
  it "should create csv lines" do
11
- csv_file.lines[0].class.name.should == "Insulin::OnTrackCsvLine"
11
+ csv_file.lines[0].class.name.should == "Insulin::OnTrack::CsvLine"
12
12
  end
13
13
 
14
14
  it "line with serial 342 should have proper noteset" do
@@ -1,7 +1,7 @@
1
1
  require 'insulin'
2
2
 
3
- describe Insulin::OnTrackCsvLine do
4
- csv = Insulin::OnTrackCsvLine.new %q{199,"Jun 22, 2012 8:01:39 AM",Glucose,,Breakfast,5.7,""}
3
+ describe Insulin::OnTrack::CsvLine do
4
+ csv = Insulin::OnTrack::CsvLine.new %q{199,"Jun 22, 2012 8:01:39 AM",Glucose,,Breakfast,5.7,""}
5
5
 
6
6
  it "should have the correct serial" do
7
7
  csv["serial"].should == 199
@@ -35,7 +35,7 @@ describe Insulin::OnTrackCsvLine do
35
35
  csv["notes"].should == nil
36
36
  end
37
37
 
38
- csv_with_note = Insulin::OnTrackCsvLine.new %q{266,"Jun 28, 2012 10:21:05 AM",Medication,Humalog,After Breakfast,4.0,"F:2 bacon, 2 toast
38
+ csv_with_note = Insulin::OnTrack::CsvLine.new %q{266,"Jun 28, 2012 10:21:05 AM",Medication,Humalog,After Breakfast,4.0,"F:2 bacon, 2 toast
39
39
  N:test note
40
40
  X:fail note
41
41
  N:other note"}
@@ -1,7 +1,7 @@
1
1
  require 'insulin'
2
2
 
3
- describe Insulin::OnTrackDate do
4
- otd = Insulin::OnTrackDate.new "Jun 22 2012 9:00:12 AM"
3
+ describe Insulin::OnTrack::Date do
4
+ otd = Insulin::OnTrack::Date.new "Jun 22 2012 9:00:12 AM"
5
5
 
6
6
  it "should have the correct timestamp" do
7
7
  otd["timestamp"].to_s.should == "2012-06-22 09:00:12 +0100"
@@ -19,7 +19,7 @@ describe Insulin::OnTrackDate do
19
19
  otd["day"].should == "friday"
20
20
  end
21
21
 
22
- otd_gmt = Insulin::OnTrackDate.new "Jan 22 2012 9:00:12 PM"
22
+ otd_gmt = Insulin::OnTrack::Date.new "Jan 22 2012 9:00:12 PM"
23
23
 
24
24
  it "should have the correct timestamp" do
25
25
  otd_gmt["timestamp"].to_s.should == "2012-01-22 21:00:12 +0000"
@@ -1,7 +1,7 @@
1
1
  require 'insulin'
2
2
 
3
- describe Insulin::OnTrackNoteSet do
4
- simple_note_set = Insulin::OnTrackNoteSet.new "F: turkey breast, salad"
3
+ describe Insulin::OnTrack::NoteSet do
4
+ simple_note_set = Insulin::OnTrack::NoteSet.new "F: turkey breast, salad"
5
5
 
6
6
  it "should have the correct notes" do
7
7
  simple_note_set.should == {
@@ -12,7 +12,7 @@ describe Insulin::OnTrackNoteSet do
12
12
  }
13
13
  end
14
14
 
15
- multiple_note_set = Insulin::OnTrackNoteSet.new "F: turkey breast, salad
15
+ multiple_note_set = Insulin::OnTrack::NoteSet.new "F: turkey breast, salad
16
16
  N:After wine. No overnight hypo.
17
17
  N:some other note
18
18
  B: glass of wine"
@@ -33,7 +33,7 @@ describe Insulin::OnTrackNoteSet do
33
33
  }
34
34
  end
35
35
 
36
- failing_note_set = Insulin::OnTrackNoteSet.new "F: turkey breast, salad
36
+ failing_note_set = Insulin::OnTrack::NoteSet.new "F: turkey breast, salad
37
37
  X:This should fail"
38
38
 
39
39
  it "should have the correct notes" do
@@ -1,21 +1,21 @@
1
1
  require 'insulin'
2
2
 
3
- describe Insulin::OnTrackNote do
4
- note = Insulin::OnTrackNote.new "N:After wine. No overnight hypo."
3
+ describe Insulin::OnTrack::Note do
4
+ note = Insulin::OnTrack::Note.new "N:After wine. No overnight hypo."
5
5
 
6
6
  it "should have the correct note" do
7
7
  note.type.should == "note"
8
8
  note.content.should == "after wine. no overnight hypo."
9
9
  end
10
10
 
11
- list_note = Insulin::OnTrackNote.new "F: turkey breast, salad"
11
+ list_note = Insulin::OnTrack::Note.new "F: turkey breast, salad"
12
12
 
13
13
  it "should have the correct list-type note" do
14
14
  list_note.type.should == "food"
15
15
  list_note.content.should == ["turkey breast", "salad"]
16
16
  end
17
17
 
18
- fail_note = Insulin::OnTrackNote.new "X: this one should fail"
18
+ fail_note = Insulin::OnTrack::Note.new "X: this one should fail"
19
19
 
20
20
  it "should handle the fail note correctly" do
21
21
  fail_note.type.should == nil
data/spec/spec_helper.rb CHANGED
@@ -7,7 +7,7 @@ def load_test_db
7
7
  mconf = config.get_section "mongo"
8
8
  @mongo = Insulin::MongoHandle.new mconf
9
9
 
10
- csv = Insulin::OnTrackCsvFile.new "files/on_track.csv"
10
+ csv = Insulin::OnTrack::CsvFile.new "files/on_track.csv"
11
11
  csv.save_events @mongo
12
12
  end
13
13
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: insulin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13
4
+ version: 0.0.14
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -168,22 +168,22 @@ files:
168
168
  - lib/insulin/day.rb
169
169
  - lib/insulin/event.rb
170
170
  - lib/insulin/mongo_handle.rb
171
- - lib/insulin/on_track_csv_file.rb
172
- - lib/insulin/on_track_csv_line.rb
173
- - lib/insulin/on_track_date.rb
174
- - lib/insulin/on_track_note.rb
175
- - lib/insulin/on_track_note_set.rb
171
+ - lib/insulin/on_track/csv_file.rb
172
+ - lib/insulin/on_track/csv_line.rb
173
+ - lib/insulin/on_track/date.rb
174
+ - lib/insulin/on_track/note.rb
175
+ - lib/insulin/on_track/note_set.rb
176
176
  - lib/insulin/version.rb
177
177
  - scripts/build.sh
178
- - spec/insulin_config_spec.rb
179
- - spec/insulin_day_spec.rb
180
- - spec/insulin_event_spec.rb
181
- - spec/insulin_mongo_handle_spec.rb
182
- - spec/insulin_on_track_csv_file_spec.rb
183
- - spec/insulin_on_track_csv_line_spec.rb
184
- - spec/insulin_on_track_date_spec.rb
185
- - spec/insulin_on_track_note_set_spec.rb
186
- - spec/insulin_on_track_note_spec.rb
178
+ - spec/config_spec.rb
179
+ - spec/day_spec.rb
180
+ - spec/event_spec.rb
181
+ - spec/mongo_handle_spec.rb
182
+ - spec/on_track/csv_file_spec.rb
183
+ - spec/on_track/csv_line_spec.rb
184
+ - spec/on_track/date_spec.rb
185
+ - spec/on_track/note_set_spec.rb
186
+ - spec/on_track/note_spec.rb
187
187
  - spec/spec_helper.rb
188
188
  homepage: http://pikesley.github.com/insulin/
189
189
  licenses: []
@@ -210,13 +210,13 @@ signing_key:
210
210
  specification_version: 3
211
211
  summary: Doing stuff with my diabetes data
212
212
  test_files:
213
- - spec/insulin_config_spec.rb
214
- - spec/insulin_day_spec.rb
215
- - spec/insulin_event_spec.rb
216
- - spec/insulin_mongo_handle_spec.rb
217
- - spec/insulin_on_track_csv_file_spec.rb
218
- - spec/insulin_on_track_csv_line_spec.rb
219
- - spec/insulin_on_track_date_spec.rb
220
- - spec/insulin_on_track_note_set_spec.rb
221
- - spec/insulin_on_track_note_spec.rb
213
+ - spec/config_spec.rb
214
+ - spec/day_spec.rb
215
+ - spec/event_spec.rb
216
+ - spec/mongo_handle_spec.rb
217
+ - spec/on_track/csv_file_spec.rb
218
+ - spec/on_track/csv_line_spec.rb
219
+ - spec/on_track/date_spec.rb
220
+ - spec/on_track/note_set_spec.rb
221
+ - spec/on_track/note_spec.rb
222
222
  - spec/spec_helper.rb
@@ -1,61 +0,0 @@
1
- module Insulin
2
- # Author:: Sam (mailto:sam@cruft.co)
3
- # License:: MIT
4
-
5
- # This class represents a CSV file as exported by OnTrack
6
- class OnTrackCsvFile
7
- attr_reader :file, :lines, :events
8
-
9
- # Take the path to the CSV, open it, process it
10
- def initialize csv_path
11
- @csv_path = csv_path
12
- @file = File.new @csv_path
13
- self.read_lines
14
- self.create_events
15
- end
16
-
17
- # Read the lines
18
- def read_lines
19
- @lines = []
20
-
21
- # Where an event has more than one note, a 'line' will contain '\n's
22
- l = ""
23
- while line = @file.gets
24
- # Stuff the line in to 'l'
25
- l << line
26
-
27
- # A '"' at the end of the line closes the event
28
- if line[-2] == '"'
29
-
30
- # Create a CsvLine, stripping the final '\n'
31
- o = Insulin::OnTrackCsvLine.new l[0..-2]
32
- @lines << o
33
-
34
- # Reset the placeholder
35
- l = ""
36
- end
37
- end
38
-
39
- # Sort the list by the serial numbers (required for a future feature)
40
- @lines.sort_by! {|o| o["serial"]}
41
- end
42
-
43
- # Turn the lines into Events
44
- def create_events
45
- @events = []
46
- @lines.each do |l|
47
- e = Insulin::Event.new l
48
- @events << e
49
- end
50
- end
51
-
52
- # Save the events to Mongo
53
- def save_events mongo
54
- # print "saving %d events to mongo... " % @events.count
55
- @events.each do |e|
56
- e.save mongo
57
- end
58
- # puts "done"
59
- end
60
- end
61
- end
@@ -1,39 +0,0 @@
1
- module Insulin
2
- # Author:: Sam (mailto:sam@cruft.co)
3
- # License:: MIT
4
-
5
- # This class represents a single OnTrack CSV line
6
- class OnTrackCsvLine < Hash
7
-
8
- # Parse the passed-in CSV line
9
- def initialize line
10
-
11
- # Split on commas
12
- bits = line.split ","
13
- self["serial"] = bits[0].to_i
14
-
15
- # OnTrack embeds commas in the dates of its CSVs. Duh
16
- self.update OnTrackDate.new "%s%s" % [
17
- bits[1],
18
- bits[2]
19
- ]
20
- self["type"] = bits[3].downcase
21
- self["subtype"] = bits[4].downcase if not bits[4] == ""
22
- self["tag"] = bits[5].downcase
23
- self["value"] = bits[6].to_f
24
-
25
- # Notes get complicated. Everything from field 7 to the end will be part
26
- # of the notes
27
- notes = bits[7..-1]
28
-
29
- # We may have embedded commas
30
- notes = notes.join ","
31
-
32
- # Strip the trailing '\n'
33
- notes = notes[1..-2]
34
-
35
- # See Insulin::OnTrackNoteSet
36
- self["notes"] = OnTrackNoteSet.new notes if not notes == ""
37
- end
38
- end
39
- end
@@ -1,25 +0,0 @@
1
- require "time"
2
-
3
- module Insulin
4
- # Author:: Sam (mailto:sam@cruft.co)
5
- # License:: MIT
6
-
7
- # OnTrack uses really shitty date formats, including embedding a comma in the
8
- # CSV export file. Christ on a crutch
9
- class OnTrackDate < Hash
10
-
11
- # Parse the strind 'd', looking for datetime information
12
- def initialize d
13
- t = Time.parse d
14
-
15
- # We extract loads of stuff. Might be useful one day
16
- self["timestamp"] = t
17
- self["tzoffset"] = t.strftime "%z"
18
- self["timezone"] = t.zone
19
- self["unixtime"] = t.to_i
20
- self["day"] = t.strftime("%A").downcase
21
- self["date"] = t.strftime "%F"
22
- self["time"] = t.strftime "%T #{self['timezone']}"
23
- end
24
- end
25
- end
@@ -1,46 +0,0 @@
1
- module Insulin
2
- # Author:: Sam (mailto:sam@cruft.co)
3
- # License:: MIT
4
-
5
- # Class representing a single OnTrack note
6
- class OnTrackNote
7
-
8
- # Lookups. We will only deal with notes of these types
9
- @@keys = {
10
- "F" => 'food',
11
- "B" => 'booze',
12
- "N" => 'note'
13
- }
14
-
15
- attr_reader :type, :content
16
-
17
- # Parse the raw note 'n'
18
- def initialize n
19
-
20
- # Key/value splits on ':'
21
- bits = n.split ":"
22
-
23
- # Remove leading/trailing cruft from key part
24
- t = bits[0].strip
25
-
26
- # We only deal with the keys we know about
27
- if @@keys.keys.include? t
28
-
29
- # Remove cruft from content, downcase
30
- @content = bits[1].strip.downcase
31
-
32
- # These keys mean we turn the content into a list
33
- if ["F", "B"].include? t
34
- a = []
35
- @content.split(",").each do |v|
36
- a << v.strip
37
- end
38
- @content = a
39
- end
40
-
41
- # Set key from lookup list
42
- @type = @@keys[t]
43
- end
44
- end
45
- end
46
- end
@@ -1,45 +0,0 @@
1
- module Insulin
2
- # Author:: Sam (mailto:sam@cruft.co)
3
- # License:: MIT
4
-
5
- # This class represents a set of notes
6
- class OnTrackNoteSet < Hash
7
-
8
- # Parse the string 's'
9
- def initialize s
10
-
11
- # Notes separated by newlines
12
- l = s.split"\n"
13
-
14
- # For each line
15
- l.each do |n|
16
-
17
- # Make a note
18
- x = OnTrackNote.new n
19
-
20
- # This field will only exists for notes of a valid type
21
- if x.type
22
-
23
- # If we don't yet have this key
24
- if not self[x.type]
25
-
26
- # If the content is a list
27
- if x.content.class.name == "Array"
28
-
29
- # This becomes our value
30
- self[x.type] = x.content
31
- else
32
-
33
- # Otherwise make it onto a list
34
- self[x.type] = [x.content]
35
- end
36
- else
37
-
38
- # This key exists, so we append this value
39
- self[x.type] << x.content
40
- end
41
- end
42
- end
43
- end
44
- end
45
- end