insulin 0.0.18 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +1 -1
- data/README.md +21 -18
- data/TODO.md +5 -3
- data/bin/insulin +9 -3
- data/lib/insulin.rb +4 -2
- data/lib/insulin/day.rb +4 -2
- data/lib/insulin/month.rb +13 -0
- data/lib/insulin/n_day_period.rb +62 -0
- data/lib/insulin/version.rb +1 -1
- data/lib/insulin/week.rb +7 -37
- data/spec/day_spec.rb +1 -0
- data/spec/month_spec.rb +28 -0
- data/spec/n_day_period_spec.rb +51 -0
- data/spec/week_spec.rb +4 -0
- metadata +8 -2
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -28,26 +28,28 @@ This will take that file, parse it, and push the JSON into a number of collectio
|
|
28
28
|
{ "_id" : ObjectId("4ff07b371508cc259c8a8f0c"), "serial" : 266, "timestamp" : ISODate("2012-06-28T09:21:05Z"), "tzoffset" : "+0100", "timezone" : "BST", "unixtime" : 1340875265, "day" : "thursday", "date" : "2012-06-28", "time" : "10:21:05 BST", "type" : "medication", "subtype" : "humalog", "tag" : "breakfast", "value" : 4, "notes" : { "food" : [ "2 bacon", "2 toast" ], "note" : [ "test note" ] } }
|
29
29
|
>
|
30
30
|
|
31
|
-
|
31
|
+
Current output options are
|
32
32
|
|
33
33
|
insulin day DATE
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
34
|
+
insulin month DATE
|
35
|
+
insulin week DATE
|
36
|
+
|
37
|
+
Example:
|
38
|
+
|
39
|
+
$ insulin day 2012-07-01
|
40
|
+
2012-07-01
|
41
|
+
09:41:47 BST | breakfast | glucose | | 6.4 mmol/L
|
42
|
+
09:57:09 BST | breakfast | medication | humalog | 4.0 x10^-5 L
|
43
|
+
12:40:43 BST | lunch | weight | | 59.0 kg
|
44
|
+
13:54:04 BST | lunch | glucose | | 5.0 mmol/L
|
45
|
+
14:03:05 BST | lunch | medication | humalog | 4.0 x10^-5 L
|
46
|
+
18:56:25 BST | dinner | glucose | | 4.9 mmol/L
|
47
|
+
19:03:37 BST | dinner | medication | humalog | 6.0 x10^-5 L
|
48
|
+
21:06:01 BST | after dinner | glucose | | 3.5 mmol/L
|
49
|
+
22:32:32 BST | bedtime | glucose | | 7.5 mmol/L
|
50
|
+
22:46:12 BST | bedtime | medication | lantus | 14.0 x10^-5 L
|
51
|
+
|
52
|
+
average glucose: 5.46 mmol/L
|
51
53
|
|
52
54
|
You can also run the tests, if you're into that sort of thing:
|
53
55
|
|
@@ -63,6 +65,7 @@ Next steps
|
|
63
65
|
|
64
66
|
* Get it generating custom CSVs for Spreadsheeting
|
65
67
|
* Get it doing some analysis
|
68
|
+
* Generate some more detailed output (latest HbA1c, BP, etc)
|
66
69
|
* Give it a [meteor](http://meteor.com/) front-end (might require some help from [Chris](https://github.com/mrchrisadams)). Graphs, yo
|
67
70
|
* Possibly connect to [this API](http://platform.fatsecret.com/api/) to extract carb values from plain-text food descriptions (this may be a little ambitious, we'll see)
|
68
71
|
|
data/TODO.md
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
-
*
|
1
|
+
* Default 'day' for executable doesn't make much sense
|
2
2
|
* Indexes
|
3
3
|
* Map/reduce somewhere?
|
4
4
|
* Jenkins?
|
5
5
|
* Food - combine available carbs data with meds object? or other way around?
|
6
6
|
* Estimated HbA1c?
|
7
|
-
*
|
8
|
-
*
|
7
|
+
* https://github.com/svenfuchs/gem-release - put these into rake tasks?
|
8
|
+
* empty time periods should return "nothing known"
|
9
|
+
* https://github.com/prawnpdf/prawn
|
10
|
+
* Fully detailed output showing latest HbA1c, BP, etc
|
data/bin/insulin
CHANGED
@@ -7,8 +7,6 @@ module Insulin
|
|
7
7
|
class I < Thor
|
8
8
|
@@mongo = Insulin::MongoHandle.new ({"database" => "insulin"})
|
9
9
|
|
10
|
-
# map "-i" => :ingest
|
11
|
-
|
12
10
|
desc "ingest FILE", "ingest OnTrack CSV export FILE"
|
13
11
|
def ingest file
|
14
12
|
csv = Insulin::OnTrack::CsvFile.new file
|
@@ -39,7 +37,15 @@ module Insulin
|
|
39
37
|
puts w.to_s
|
40
38
|
end
|
41
39
|
|
42
|
-
|
40
|
+
desc "month DATE", "show stats for 30-day period commencing DATE (defaults to previous 30 days)"
|
41
|
+
def month date = nil
|
42
|
+
if not date
|
43
|
+
require 'time'
|
44
|
+
date = (Time.new - (30 * 86400)).strftime "%F"
|
45
|
+
end
|
46
|
+
m = Insulin::Month.new date, @@mongo
|
47
|
+
puts m.to_s
|
48
|
+
end
|
43
49
|
end
|
44
50
|
end
|
45
51
|
|
data/lib/insulin.rb
CHANGED
@@ -3,7 +3,9 @@ require "insulin/config"
|
|
3
3
|
require "insulin/mongo_handle"
|
4
4
|
require "insulin/event"
|
5
5
|
require "insulin/day"
|
6
|
+
require "insulin/n_day_period"
|
6
7
|
require "insulin/week"
|
8
|
+
require "insulin/month"
|
7
9
|
require "insulin/on_track/date"
|
8
10
|
require "insulin/on_track/note"
|
9
11
|
require "insulin/on_track/note_set"
|
@@ -16,5 +18,5 @@ require "insulin/on_track/csv_file"
|
|
16
18
|
# OnTrack[https://play.google.com/store/apps/details?id=com.gexperts.ontrack&hl=en]
|
17
19
|
# can export its data as a CSV. Insulin takes this data, parses it into
|
18
20
|
# (possibly) useful formats, and stuffs it into MongoDB
|
19
|
-
module Insulin
|
20
|
-
end
|
21
|
+
#module Insulin
|
22
|
+
#end
|
data/lib/insulin/day.rb
CHANGED
@@ -2,6 +2,8 @@ require 'insulin'
|
|
2
2
|
|
3
3
|
module Insulin
|
4
4
|
class Day < Hash
|
5
|
+
attr_reader :glucose_units
|
6
|
+
|
5
7
|
def initialize date, mongo
|
6
8
|
@date = date
|
7
9
|
@mongo = mongo
|
@@ -55,8 +57,9 @@ module Insulin
|
|
55
57
|
s << "\n"
|
56
58
|
end
|
57
59
|
|
60
|
+
s << "\n"
|
58
61
|
s << " "
|
59
|
-
s << "
|
62
|
+
s << "average glucose: %4.2f %s" % [
|
60
63
|
self.average_glucose,
|
61
64
|
@glucose_units
|
62
65
|
]
|
@@ -68,7 +71,6 @@ module Insulin
|
|
68
71
|
s << @date
|
69
72
|
s << "\n"
|
70
73
|
|
71
|
-
# This needs a test!
|
72
74
|
self["all"].each do |e|
|
73
75
|
if ["breakfast", "lunch", "dinner", "bedtime"].include? e["tag"] and
|
74
76
|
["medication", "glucose"].include? e["type"]
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'insulin'
|
2
|
+
require 'time'
|
3
|
+
|
4
|
+
module Insulin
|
5
|
+
class NDayPeriod < Array
|
6
|
+
def initialize hash
|
7
|
+
@start_date = hash["start_date"]
|
8
|
+
@days = hash["days"]
|
9
|
+
@mongo = hash["mongo"]
|
10
|
+
|
11
|
+
t = Time.parse @start_date
|
12
|
+
today = Time.new
|
13
|
+
@count = 0
|
14
|
+
@days.times do |i|
|
15
|
+
d = (t + (i * 86400))
|
16
|
+
if d <= today
|
17
|
+
day = Day.new d.strftime("%F"), @mongo
|
18
|
+
self << day
|
19
|
+
@count += 1
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
@descriptor = "%d-day period" % [
|
24
|
+
@count
|
25
|
+
]
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
def average_glucose
|
30
|
+
total = 0
|
31
|
+
self.each do |d|
|
32
|
+
total += d.average_glucose
|
33
|
+
end
|
34
|
+
|
35
|
+
return total / self.size
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_s
|
39
|
+
s = "%s commencing %s" % [
|
40
|
+
@descriptor,
|
41
|
+
@start_date
|
42
|
+
]
|
43
|
+
s << "\n"
|
44
|
+
s << "\n"
|
45
|
+
|
46
|
+
self.each do |d|
|
47
|
+
s << d.minimal
|
48
|
+
s << "\n"
|
49
|
+
end
|
50
|
+
|
51
|
+
s << " "
|
52
|
+
s << "average glucose for %s commencing %s: %0.2f %s" % [
|
53
|
+
@descriptor,
|
54
|
+
@start_date,
|
55
|
+
self.average_glucose,
|
56
|
+
self[0].glucose_units
|
57
|
+
]
|
58
|
+
|
59
|
+
s
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/lib/insulin/version.rb
CHANGED
data/lib/insulin/week.rb
CHANGED
@@ -1,45 +1,15 @@
|
|
1
1
|
require 'insulin'
|
2
|
-
require 'time'
|
3
2
|
|
4
3
|
module Insulin
|
5
|
-
class Week <
|
4
|
+
class Week < NDayPeriod
|
6
5
|
def initialize date, mongo
|
7
|
-
|
8
|
-
|
6
|
+
super({
|
7
|
+
"start_date" => date,
|
8
|
+
"days" => 7,
|
9
|
+
"mongo" => mongo
|
10
|
+
})
|
9
11
|
|
10
|
-
|
11
|
-
6.times do |i|
|
12
|
-
d = (t + (i * 86400)).strftime "%F"
|
13
|
-
day = Day.new d, @mongo
|
14
|
-
self << day
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def average_glucose
|
19
|
-
total = 0
|
20
|
-
self.each do |d|
|
21
|
-
total += d.average_glucose
|
22
|
-
end
|
23
|
-
|
24
|
-
return total / self.size
|
25
|
-
end
|
26
|
-
|
27
|
-
def to_s
|
28
|
-
s = "Week commencing %s" % @date
|
29
|
-
s << "\n"
|
30
|
-
s << "\n"
|
31
|
-
|
32
|
-
self.each do |d|
|
33
|
-
s << d.minimal
|
34
|
-
s << "\n"
|
35
|
-
end
|
36
|
-
|
37
|
-
s << " "
|
38
|
-
s << "Average glucose for week commencing %s: %4.1f" % [
|
39
|
-
@date,
|
40
|
-
self.average_glucose
|
41
|
-
]
|
42
|
-
s
|
12
|
+
@descriptor = "week"
|
43
13
|
end
|
44
14
|
end
|
45
15
|
end
|
data/spec/day_spec.rb
CHANGED
data/spec/month_spec.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'insulin'
|
2
|
+
require "spec_helper.rb"
|
3
|
+
|
4
|
+
describe Insulin::Month do
|
5
|
+
load_test_db
|
6
|
+
|
7
|
+
m = Insulin::Month.new "2012-06-29", @mongo
|
8
|
+
|
9
|
+
it "should contain something" do
|
10
|
+
m.size.should > 0
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should have days" do
|
14
|
+
m.each do |d|
|
15
|
+
d.class.name.should == "Insulin::Day"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should have average glucose" do
|
20
|
+
m.average_glucose.should_not == nil
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should say '15-day period'" do
|
24
|
+
m.to_s.should include "15-day period"
|
25
|
+
end
|
26
|
+
|
27
|
+
drop_test_db
|
28
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'insulin'
|
2
|
+
require 'spec_helper.rb'
|
3
|
+
|
4
|
+
describe Insulin::NDayPeriod do
|
5
|
+
load_test_db
|
6
|
+
|
7
|
+
b = Insulin::NDayPeriod.new({
|
8
|
+
"start_date" => "2012-06-29",
|
9
|
+
"days" => 3,
|
10
|
+
"mongo" => @mongo
|
11
|
+
})
|
12
|
+
|
13
|
+
it "should contain 3 items" do
|
14
|
+
b.size.should == 3
|
15
|
+
end
|
16
|
+
|
17
|
+
it "items should be days" do
|
18
|
+
b.each do |d|
|
19
|
+
d.class.name.should == "Insulin::Day"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should have average glucose of 7.16" do
|
24
|
+
("%0.2f" % b.average_glucose).to_f.should == 7.16
|
25
|
+
end
|
26
|
+
|
27
|
+
c = Insulin::NDayPeriod.new(
|
28
|
+
"start_date" => Time.new.strftime("%F"),
|
29
|
+
"days" => 7,
|
30
|
+
"mongo" => @mongo
|
31
|
+
)
|
32
|
+
|
33
|
+
it "should not go storming off into the future" do
|
34
|
+
c.size.should == 1
|
35
|
+
end
|
36
|
+
|
37
|
+
t = Time.new
|
38
|
+
t = t + 86400
|
39
|
+
d = Insulin::NDayPeriod.new(
|
40
|
+
"start_date" => t.strftime("%F"),
|
41
|
+
"days" => 7,
|
42
|
+
"mongo" => @mongo
|
43
|
+
)
|
44
|
+
|
45
|
+
it "should have nothing if start_date is in the future" do
|
46
|
+
d.size.should == 0
|
47
|
+
end
|
48
|
+
|
49
|
+
drop_test_db
|
50
|
+
|
51
|
+
end
|
data/spec/week_spec.rb
CHANGED
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
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-07-
|
12
|
+
date: 2012-07-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|
@@ -168,6 +168,8 @@ files:
|
|
168
168
|
- lib/insulin/day.rb
|
169
169
|
- lib/insulin/event.rb
|
170
170
|
- lib/insulin/mongo_handle.rb
|
171
|
+
- lib/insulin/month.rb
|
172
|
+
- lib/insulin/n_day_period.rb
|
171
173
|
- lib/insulin/on_track/csv_file.rb
|
172
174
|
- lib/insulin/on_track/csv_line.rb
|
173
175
|
- lib/insulin/on_track/date.rb
|
@@ -180,6 +182,8 @@ files:
|
|
180
182
|
- spec/day_spec.rb
|
181
183
|
- spec/event_spec.rb
|
182
184
|
- spec/mongo_handle_spec.rb
|
185
|
+
- spec/month_spec.rb
|
186
|
+
- spec/n_day_period_spec.rb
|
183
187
|
- spec/on_track/csv_file_spec.rb
|
184
188
|
- spec/on_track/csv_line_spec.rb
|
185
189
|
- spec/on_track/date_spec.rb
|
@@ -216,6 +220,8 @@ test_files:
|
|
216
220
|
- spec/day_spec.rb
|
217
221
|
- spec/event_spec.rb
|
218
222
|
- spec/mongo_handle_spec.rb
|
223
|
+
- spec/month_spec.rb
|
224
|
+
- spec/n_day_period_spec.rb
|
219
225
|
- spec/on_track/csv_file_spec.rb
|
220
226
|
- spec/on_track/csv_line_spec.rb
|
221
227
|
- spec/on_track/date_spec.rb
|