insulin 0.0.18 → 0.1.0
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 +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
|