insulin 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -15,3 +15,4 @@ test/tmp
15
15
  test/version_tmp
16
16
  tmp
17
17
  *swp
18
+ *swo
data/Gemfile CHANGED
@@ -2,3 +2,5 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in insulin.gemspec
4
4
  gemspec
5
+
6
+ gem "prawn", :git => "git://github.com/prawnpdf/prawn.git"
@@ -1,15 +1,26 @@
1
+ GIT
2
+ remote: git://github.com/prawnpdf/prawn.git
3
+ revision: baa6e80b1a11efac91a0160dfab257744bbf9bde
4
+ specs:
5
+ prawn (1.0.0.rc1)
6
+ pdf-reader (>= 0.9.0)
7
+ ttfunk (~> 1.0.3)
8
+
1
9
  PATH
2
10
  remote: .
3
11
  specs:
4
- insulin (0.1.1)
12
+ insulin (0.1.2)
5
13
  bson_ext
6
14
  ffi
7
15
  mongo
16
+ pony
17
+ prawn
8
18
  thor
9
19
 
10
20
  GEM
11
21
  remote: https://rubygems.org/
12
22
  specs:
23
+ Ascii85 (1.0.1)
13
24
  aruba (0.4.11)
14
25
  childprocess (>= 0.2.3)
15
26
  cucumber (>= 1.1.1)
@@ -31,9 +42,21 @@ GEM
31
42
  gem-release (0.3.1)
32
43
  gherkin (2.11.1)
33
44
  json (>= 1.4.6)
45
+ i18n (0.6.0)
34
46
  json (1.7.3)
47
+ mail (2.4.4)
48
+ i18n (>= 0.4.0)
49
+ mime-types (~> 1.16)
50
+ treetop (~> 1.4.8)
51
+ mime-types (1.19)
35
52
  mongo (1.6.4)
36
53
  bson (~> 1.6.4)
54
+ pdf-reader (1.1.1)
55
+ Ascii85 (~> 1.0.0)
56
+ ruby-rc4
57
+ polyglot (0.3.3)
58
+ pony (1.4)
59
+ mail (> 2.0)
37
60
  rspec (2.10.0)
38
61
  rspec-core (~> 2.10.0)
39
62
  rspec-expectations (~> 2.10.0)
@@ -42,7 +65,12 @@ GEM
42
65
  rspec-expectations (2.10.0)
43
66
  diff-lcs (~> 1.1.3)
44
67
  rspec-mocks (2.10.1)
45
- thor (0.15.3)
68
+ ruby-rc4 (0.1.5)
69
+ thor (0.15.4)
70
+ treetop (1.4.10)
71
+ polyglot
72
+ polyglot (>= 0.3.1)
73
+ ttfunk (1.0.3)
46
74
 
47
75
  PLATFORMS
48
76
  ruby
@@ -52,4 +80,5 @@ DEPENDENCIES
52
80
  cucumber
53
81
  gem-release
54
82
  insulin!
83
+ prawn!
55
84
  rspec (~> 2.6)
data/README.md CHANGED
@@ -51,6 +51,12 @@ Example:
51
51
 
52
52
  average glucose: 5.46 mmol/L
53
53
 
54
+ A weekly PDF summary can be generated and mailed out
55
+
56
+ insulin pdf you@yourdmomain.com
57
+
58
+ The PDF class is currently a bit hacky, I'm still learning the excellent (prawn gem)[https://github.com/prawnpdf/prawn]
59
+
54
60
  You can also run the tests, if you're into that sort of thing:
55
61
 
56
62
  bundle exec rspec
data/TODO.md CHANGED
@@ -9,8 +9,8 @@
9
9
  * Fully detailed output showing latest HbA1c, BP, etc
10
10
  * Work out Google Drive API
11
11
  * Write some proper rubydocs
12
- * Should not include HbA1c or BP in normal output. Also, these things need units. And BP is not really a number
13
12
  * Number of tests &c per time period
14
13
  * Somehow include cholesterol
15
14
  * Test the insulin executable
16
15
  * "Latest weight, change since last, overall trend" &c
16
+ * Colours for low/good/high BG
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- # needs to handle passing config. ~/.insulin or somrthing
2
+
3
3
  require 'insulin'
4
4
  require 'thor'
5
5
 
@@ -7,13 +7,15 @@ module Insulin
7
7
  class I < Thor
8
8
  @@mongo = Insulin::MongoHandle.new ({"database" => "insulin"})
9
9
 
10
- desc "ingest FILE", "ingest OnTrack CSV export FILE"
10
+ desc "ingest FILE",
11
+ "ingest OnTrack CSV export FILE"
11
12
  def ingest file
12
13
  csv = Insulin::OnTrack::CsvFile.new file
13
14
  csv.save_events @@mongo
14
15
  end
15
16
 
16
- desc "day DATE", "show stats for day DATE (default is today)"
17
+ desc "day DATE",
18
+ "show stats for day DATE (default is today)"
17
19
  def day date = nil
18
20
  if not date
19
21
  require 'time'
@@ -27,17 +29,19 @@ module Insulin
27
29
  end
28
30
  end
29
31
 
30
- desc "week DATE", "show stats for week commencing DATE (defaults to previous 7 days)"
32
+ desc "week DATE",
33
+ "show stats for week commencing DATE (defaults to previous 7 days)"
31
34
  def week date = nil
32
35
  if not date
33
36
  require 'time'
34
- date = (Time.new - (6 * 86400)).strftime "%F"
37
+ date = (Time.new - (7 * 86400)).strftime "%F"
35
38
  end
36
39
  w = Insulin::Week.new date, @@mongo
37
40
  puts w.to_s
38
41
  end
39
42
 
40
- desc "month DATE", "show stats for 30-day period commencing DATE (defaults to previous 30 days)"
43
+ desc "month DATE",
44
+ "show stats for 30-day period commencing DATE (defaults to previous 30 days)"
41
45
  def month date = nil
42
46
  if not date
43
47
  require 'time'
@@ -46,6 +50,27 @@ module Insulin
46
50
  m = Insulin::Month.new date, @@mongo
47
51
  puts m.to_s
48
52
  end
53
+
54
+ desc "pdf RECIPIENT",
55
+ "generate a PDF for the last week and mail to RECIPIENT"
56
+ def pdf recipient = nil
57
+ date = (Time.new - (7 * 86400)).strftime "%F"
58
+ outfile = "/vagrant_data/insulin.pdf"
59
+ p = Insulin::Pdf.new Insulin::Week.new(date, @@mongo), outfile
60
+ p.render
61
+
62
+ # require 'pony'
63
+ # Pony.mail(
64
+ # :to => recipient,
65
+ # :from => "insulin@cruft.co",
66
+ # :subject => "insulin report",
67
+ # :body => "Attached",
68
+ # :attachments => {
69
+ # "insulin.pdf" => File.read(outfile)
70
+ # },
71
+ # :charset => 'utf-8'
72
+ # )
73
+ end
49
74
  end
50
75
  end
51
76
 
@@ -2,7 +2,10 @@ mongo:
2
2
  host: localhost
3
3
  database: insulin_dev
4
4
 
5
- note_keys:
6
- F: food
7
- B: booze
8
- N: note
5
+ #note_keys:
6
+ # F: food
7
+ # B: booze
8
+ # N: note
9
+
10
+ outputs:
11
+ pdf_file: /vagrant_data/insulin.pdf
@@ -21,6 +21,8 @@ Gem::Specification.new do |gem|
21
21
  gem.add_dependency "mongo"
22
22
  gem.add_dependency "bson_ext"
23
23
  gem.add_dependency "ffi"
24
+ gem.add_dependency "prawn"
25
+ gem.add_dependency "pony"
24
26
 
25
27
  gem.add_development_dependency "rspec", "~> 2.6"
26
28
  gem.add_development_dependency "cucumber"
@@ -6,6 +6,7 @@ require "insulin/day"
6
6
  require "insulin/n_day_period"
7
7
  require "insulin/week"
8
8
  require "insulin/month"
9
+ require "insulin/pdf"
9
10
  require "insulin/on_track/date"
10
11
  require "insulin/on_track/note"
11
12
  require "insulin/on_track/note_set"
@@ -2,7 +2,7 @@ require 'insulin'
2
2
 
3
3
  module Insulin
4
4
  class Day < Hash
5
- attr_reader :glucose_units
5
+ attr_reader :glucose_units, :date, :day
6
6
 
7
7
  def initialize date, mongo
8
8
  @date = date
@@ -27,6 +27,7 @@ module Insulin
27
27
  end
28
28
 
29
29
  self["all"] << ev
30
+ @day = self["all"][0]["day"]
30
31
  end
31
32
  end
32
33
 
@@ -80,8 +81,9 @@ module Insulin
80
81
  s << "\n"
81
82
 
82
83
  self["all"].each do |e|
83
- if ["breakfast", "lunch", "dinner", "bedtime"].include? e["tag"] and
84
- ["medication", "glucose"].include? e["type"]
84
+ # if ["breakfast", "lunch", "dinner", "bedtime"].include? e["tag"] and
85
+ # ["medication", "glucose"].include? e["type"]
86
+ if e.simple?
85
87
  s << " "
86
88
  s << e.simple
87
89
  s << "\n"
@@ -8,14 +8,23 @@ module Insulin
8
8
  class Event < Hash
9
9
 
10
10
  @@units = {
11
- "glucose" => "mmol/L",
11
+ "glucose" => " mmol/L",
12
12
  "medication" => "x10^-5 L",
13
13
  "weight" => "kg",
14
- "exercise" => "minutes",
15
- "blood pressure" => "sp/df",
14
+ "exercise" => " minutes",
15
+ "blood pressure" => " sp/df",
16
16
  "hba1c" => "%"
17
17
  }
18
18
 
19
+ @@formats = {
20
+ "glucose" => "%0.1f",
21
+ "medication" => "%d",
22
+ "weight" => "%0.1f",
23
+ "exercise" => "%d",
24
+ "blood pressure" => "%s",
25
+ "hba1c" => "%0.1f",
26
+ }
27
+
19
28
  # An event before this time is considered part of the previous day. Because
20
29
  # sometimes, we stay up late
21
30
  @@cut_off_time = "04:00"
@@ -25,6 +34,15 @@ module Insulin
25
34
  self.update h
26
35
 
27
36
  self["units"] = @@units[self["type"]]
37
+ self["formatted_value_with_units"] = "#{@@formats[self['type']]}%s" % [
38
+ self["value"],
39
+ self["units"]
40
+ ]
41
+ end
42
+
43
+ def simple?
44
+ ["breakfast", "lunch", "dinner", "bedtime"].include? self["tag"] and
45
+ ["medication", "glucose"].include? self["type"]
28
46
  end
29
47
 
30
48
  # Save the event to Mongo via mongo_handle
@@ -61,17 +79,12 @@ module Insulin
61
79
  end
62
80
 
63
81
  def simple
64
- value_format = "%6.1f"
65
- if self["value"].is_a? String
66
- value_format = "%6s"
67
- end
68
- s = "%s | %-15s | %-14s | %-13s | #{value_format} %s" % [
82
+ s = "%s | %-15s | %-14s | %-13s | %s" % [
69
83
  self["short_time"],
70
84
  self["tag"],
71
85
  self["type"],
72
86
  self["subtype"],
73
- self["value"],
74
- self["units"]
87
+ self["formatted_value_with_units"]
75
88
  ]
76
89
 
77
90
  s
@@ -3,6 +3,8 @@ require 'time'
3
3
 
4
4
  module Insulin
5
5
  class NDayPeriod < Array
6
+ attr_reader :descriptor, :start_date, :hba1c
7
+
6
8
  def initialize hash
7
9
  @start_date = hash["start_date"]
8
10
  @days = hash["days"]
@@ -0,0 +1,141 @@
1
+ require 'insulin'
2
+ require 'prawn'
3
+
4
+ module Insulin
5
+ class Pdf
6
+ def initialize period, outfile
7
+ @period = period
8
+ @outfile = outfile
9
+
10
+ @pdf = Prawn::Document.new
11
+ @pdf.font "Courier"
12
+ @pdf.font_size 12
13
+
14
+ @pdf.formatted_text [{
15
+ :text => "insulin",
16
+ :styles => [
17
+ :bold
18
+ ],
19
+ :color => "AA0000",
20
+ :size => 16
21
+ },
22
+ {
23
+ :text => " report for %s beginning %s" % [
24
+ @period.descriptor,
25
+ @period.start_date
26
+ ]
27
+ }]
28
+
29
+ s = " report for %s beginning %s" % [
30
+ @period.descriptor,
31
+ @period.start_date
32
+ ]
33
+ @pdf.text "\n"
34
+ @pdf.text "\n"
35
+
36
+ @pdf.font_size 8
37
+
38
+ @pdf.table [
39
+ [
40
+ "latest hba1c (from %s)" % [
41
+ @period.hba1c["date"],
42
+ ],
43
+ "%0.1f%s" % [
44
+ @period.hba1c["value"],
45
+ @period.hba1c["units"]
46
+ ]
47
+ ],
48
+ [
49
+ "average blood glucose for %s commencing %s" % [
50
+ @period.descriptor,
51
+ @period.start_date
52
+ ],
53
+ "%0.2f%s" % [
54
+ @period.average_glucose,
55
+ @period[0].glucose_units
56
+ ]
57
+ ]
58
+ ],
59
+ :position => :center,
60
+ :column_widths => [
61
+ 300,
62
+ 200
63
+ ],
64
+ :row_colors =>
65
+ [
66
+ "F0F0F0",
67
+ "D0D0D0"
68
+ ],
69
+ :cell_style => {
70
+ :border_color => "333333",
71
+ :border_width => 1
72
+ }
73
+ @pdf.text "\n"
74
+ @pdf.text "\n"
75
+ @pdf.text "\n"
76
+
77
+ @period.each do |d|
78
+ @grid = []
79
+ @grid << [{
80
+ :content => "%s (%s)" % [
81
+ d.date,
82
+ d.day
83
+ ],
84
+ :colspan => 5
85
+ }]
86
+
87
+ d["all"].each do |e|
88
+ if e.simple?
89
+ @grid << [
90
+ e["short_time"],
91
+ e["tag"],
92
+ e["type"],
93
+ e["subtype"],
94
+ e["formatted_value_with_units"]
95
+ ]
96
+ end
97
+ end
98
+ @pdf.table @grid,
99
+ :position => :center,
100
+ :column_widths => [
101
+ 100,
102
+ 100,
103
+ 100,
104
+ 100,
105
+ 100
106
+ ],
107
+ :row_colors =>
108
+ [
109
+ "F0F0F0",
110
+ "D0D0D0"
111
+ ],
112
+ :cell_style => {
113
+ :border_color => "333333",
114
+ :border_width => 1
115
+ },
116
+ :header => :true
117
+ @pdf.text "\n"
118
+ @pdf.text "\n"
119
+ @pdf.text "\n"
120
+ end
121
+
122
+ @pdf.stroke_horizontal_rule
123
+ @pdf.text "\n"
124
+ @pdf.text "\n"
125
+ @pdf.text "\n"
126
+ @pdf.formatted_text [{
127
+ :text => "insulin",
128
+ :color => "007700",
129
+ :link => "http://pikesley.github.com/insulin/"
130
+
131
+ },
132
+ {
133
+ :text => " written and maintained by Sam Pikesley"
134
+ }]
135
+ end
136
+
137
+ def render
138
+ @pdf.render_file @outfile
139
+ end
140
+ end
141
+ end
@@ -1,5 +1,5 @@
1
1
  module Insulin
2
2
 
3
3
  # Current version
4
- VERSION = "0.1.2"
4
+ VERSION = "0.1.3"
5
5
  end
@@ -29,9 +29,9 @@ describe Insulin::Day do
29
29
  end
30
30
 
31
31
  it "should display correctly" do
32
- d.to_s.should include "19:07 | dinner | medication | humalog | 6.0 x10^-5 L"
32
+ d.to_s.should include "19:07 | dinner | medication | humalog | 6x10^-5 L"
33
33
  d.to_s.should include "15:46 | after lunch | blood pressure | | 118/75 sp/df"
34
- d.to_s.should include "15:46 | | hba1c | | 8.8 %"
34
+ d.to_s.should include "15:46 | | hba1c | | 8.8%"
35
35
  end
36
36
 
37
37
  it "minimal display should be correct" do
@@ -0,0 +1,18 @@
1
+ require 'insulin'
2
+ require 'spec_helper.rb'
3
+
4
+ describe Insulin::Pdf do
5
+ config = Insulin::Config.new "conf/insulin_dev.yaml"
6
+ o = config.get_section "outputs"
7
+
8
+ load_test_db
9
+
10
+ p = Insulin::Pdf.new Insulin::Week.new("2012-06-29", @mongo), o["pdf_file"]
11
+
12
+ it "should generate a pdf" do
13
+ p.render
14
+ File.should exist o["pdf_file"]
15
+ end
16
+
17
+ drop_test_db
18
+ end
@@ -14,3 +14,4 @@ end
14
14
  def drop_test_db
15
15
  @mongo.drop_db
16
16
  end
17
+
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.1.2
4
+ version: 0.1.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -75,6 +75,38 @@ dependencies:
75
75
  - - ! '>='
76
76
  - !ruby/object:Gem::Version
77
77
  version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: prawn
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: pony
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
78
110
  - !ruby/object:Gem::Dependency
79
111
  name: rspec
80
112
  requirement: !ruby/object:Gem::Requirement
@@ -175,6 +207,7 @@ files:
175
207
  - lib/insulin/on_track/date.rb
176
208
  - lib/insulin/on_track/note.rb
177
209
  - lib/insulin/on_track/note_set.rb
210
+ - lib/insulin/pdf.rb
178
211
  - lib/insulin/version.rb
179
212
  - lib/insulin/week.rb
180
213
  - scripts/build.sh
@@ -189,6 +222,7 @@ files:
189
222
  - spec/on_track/date_spec.rb
190
223
  - spec/on_track/note_set_spec.rb
191
224
  - spec/on_track/note_spec.rb
225
+ - spec/pdf_spec.rb
192
226
  - spec/spec_helper.rb
193
227
  - spec/week_spec.rb
194
228
  homepage: http://pikesley.github.com/insulin/
@@ -227,5 +261,6 @@ test_files:
227
261
  - spec/on_track/date_spec.rb
228
262
  - spec/on_track/note_set_spec.rb
229
263
  - spec/on_track/note_spec.rb
264
+ - spec/pdf_spec.rb
230
265
  - spec/spec_helper.rb
231
266
  - spec/week_spec.rb