framingham 0.1.20130712221655 → 0.1.20130719170918

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -9,7 +9,17 @@ task :deploy do
9
9
  sh "gem push framingham.gem"
10
10
  end
11
11
 
12
+ task :upgrade do
13
+ Rake::Task[:build].execute
14
+ Rake::Task[:test].execute
15
+ begin
16
+ sh "gem uninstall framingham && gem install ./framingham.gem"
17
+ rescue => exception
18
+ abort "\033[31merror: did you not sudo? \033[0m"
19
+ end
20
+ end
21
+
12
22
  Rake::TestTask.new { |_|
13
- _.test_files = FileList['framingham/*_tests.rb']
23
+ _.test_files = FileList['framingham/tests/*.rb']
14
24
  _.verbose = true
15
25
  }
data/framingham.gemspec CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new{ |_|
22
22
  _.homepage = "https://github.com/3poundhealth/framingham#framingham"
23
23
  _.summary = "Gem to implement Framingham Heart Study calculators"
24
24
  _.license = "MIT"
25
- _.files = `git ls-files`.split($/)
25
+ _.files = `git ls-files`.split($/).push("framingham/version.rb")
26
26
  _.executables = _.files.grep(%r{^/}) { |f| File.basename(f) }
27
27
  _.test_files = _.files.grep(%r{^(test|spec|features)/})
28
28
  _.require_path = "."
data/framingham.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  #!/usr/bin/ruby
2
- load 'framingham/version.rb'
3
- load 'framingham/heartdisease.rb'
2
+ require './framingham/version'
4
3
 
5
4
  module Framingham extend self
6
5
 
@@ -10,11 +9,21 @@ end
10
9
 
11
10
  protected
12
11
 
12
+ $, = ", " #default join
13
+
14
+ GENDERS = [
15
+ :male,
16
+ :female
17
+ ] unless defined? GENDERS
18
+
13
19
  def to_i value
14
20
  (value.eql? true or value.to_s == "true" or (
15
21
  value.to_f != 0 if value.respond_to? 'to_f'
16
22
  )) ? 1 : 0
17
23
  end
18
24
 
25
+ load './framingham/heartdisease.rb'
26
+ load './framingham/diabetes.rb'
27
+
19
28
  end
20
29
 
@@ -0,0 +1,76 @@
1
+ module Framingham::Diabetes extend Framingham, self
2
+ include Framingham
3
+
4
+ def eval options = {}
5
+ begin
6
+ #initialize
7
+ options = NORMAL.merge options
8
+ @age = options[:age].to_f
9
+ @blood_pressure = options[:blood_pressure].to_f
10
+ @body_mass_index = options[:body_mass_index].to_f
11
+ @diabetes_relative = options[:diabetes_relative].to_s.to_sym
12
+ @fasting_glucose = options[:fasting_glucose].to_f
13
+ @gender = options[:gender].to_sym
14
+ @hdl = options[:hdl].to_f
15
+ @triglyceride = options[:triglyceride].to_f
16
+ #validate
17
+ raise ERRORS[:gender] unless GENDERS.include? @gender
18
+ rescue => exception
19
+ abort "\033[31merror: " + exception.message + "\033[0m"
20
+ else
21
+ #calculate
22
+ =begin debug stuff
23
+ puts options.to_s
24
+ puts "50-65: " + (50...65).include?(@age).to_s
25
+ puts "65+: " + (@age >= 65).to_s
26
+ puts "blood_pressure >130: " + (@blood_pressure > 130).to_s
27
+ puts "bmi 25-30: " + (25...30).include?(@body_mass_index).to_s
28
+ puts "bmi >=30: " + (@body_mass_index >= 30).to_s
29
+ puts "diabetes_relative: " + @diabetes_relative.eql?(:true).to_s
30
+ puts "fasting_glucose: " + (100..126).include?(@fasting_glucose).to_s
31
+ puts "gender: " + @gender.to_s
32
+ puts "hdl: " + (@gender.eql?(:female) and @hdl < 50 or @hdl < 40).to_s
33
+ puts "triglyceride >= 150: " + (@triglyceride >= 150).to_s
34
+ =end
35
+ risk_factor = BETA_ZERO[@gender]
36
+ risk_factor += 0.018 if (50...65).include? @age
37
+ risk_factor += 0.081 if @age >= 65
38
+ risk_factor -= 0.565 if @diabetes_relative.eql? :true
39
+ risk_factor -= 0.301 if (25...30).include? @body_mass_index
40
+ risk_factor -= 0.920 if @body_mass_index >= 30
41
+ risk_factor -= 0.498 if @blood_pressure > 130
42
+ risk_factor -= 0.944 if @gender.eql? :female and @hdl < 50 or @hdl < 40
43
+ risk_factor -= 0.575 if @triglyceride >= 150
44
+ risk_factor -= 1.980 if (100..126).include? @fasting_glucose
45
+ 1 / (1 + Math.exp(risk_factor))
46
+ end
47
+ end
48
+
49
+ def help
50
+ "Evaluate 8 year diabetes risk"
51
+ end
52
+
53
+ protected
54
+
55
+ NORMAL = { #default options
56
+ age: 30,
57
+ blood_pressure: 125,
58
+ body_mass_index: 22.5,
59
+ diabetes_relative: false,
60
+ fasting_glucose: 85,
61
+ gender: :female,
62
+ hdl: 60,
63
+ triglyceride: 130
64
+ } unless defined? NORMAL
65
+
66
+ ERRORS = {
67
+ gender: "invalid gender, options: " + GENDERS.join
68
+ } unless defined? ERRORS
69
+
70
+ BETA_ZERO = {
71
+ male: 5.517 + 0.010,
72
+ female: 5.517
73
+ }
74
+
75
+ end
76
+
@@ -9,9 +9,11 @@ def eval options = {}
9
9
  @blood_pressure = options[:blood_pressure].to_f
10
10
  @blood_pressure_treatment = options[:blood_pressure_treatment] ? :treated : :untreated
11
11
  @body_mass_index = options[:body_mass_index].to_f
12
- @gender = options[:gender]
12
+ @gender = options[:gender].to_sym
13
13
  @diabetes = to_i options[:diabetes]
14
14
  @smoker = to_i options[:smoker]
15
+ #validate
16
+ raise ERRORS[:gender] unless GENDERS.include? @gender
15
17
  rescue => exception
16
18
  abort "\033[31merror: " + exception.message + "\033[0m"
17
19
  else
@@ -79,8 +81,6 @@ def internal_debug _ = {}
79
81
  '%5.1f' % ((1000 * _[:optimal]).round / 10.0)
80
82
  end
81
83
 
82
- $, = ", " #default join
83
-
84
84
  NORMAL = { #default options
85
85
  age: 30,
86
86
  blood_pressure: 125,
@@ -102,16 +102,11 @@ BLOOD_PRESSURE_RANGE = (90..200) unless defined? BLOOD_PRESSURE_RANGE
102
102
 
103
103
  BMI_RANGE = (15..50) unless defined? BMI_RANGE
104
104
 
105
- GENDERS = [
106
- :male,
107
- :female
108
- ] unless defined? GENDERS
109
-
110
105
  ERRORS = {
111
106
  age: "age must be in range: " + AGE_RANGE.to_s,
112
107
  blood_pressure: "blood pressure must be in range: " + BLOOD_PRESSURE_RANGE.to_s,
113
108
  bmi: "bmi must be in range: " + BMI_RANGE.to_s,
114
- gender: "invalid gender, options: " + GENDERS.join,
109
+ gender: "invalid gender, options: " + GENDERS.join
115
110
  } unless defined? ERRORS
116
111
 
117
112
  BETA_ZERO = {
@@ -0,0 +1,16 @@
1
+ require 'test/unit'
2
+ require './framingham'
3
+
4
+ class DiabetesTests < Test::Unit::TestCase
5
+ include Framingham::Diabetes
6
+
7
+ def yellow _
8
+ "\e[1;7;41;33mFailed:\e[1;3;40m " + _ + " \e[0m"
9
+ end
10
+
11
+ def test_normal
12
+ assert_equal 0.004001804744896386, eval, (yellow "Normal test")
13
+ end
14
+
15
+ end
16
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: framingham
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.20130712221655
4
+ version: 0.1.20130719170918
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: 2013-07-12 00:00:00.000000000 Z
12
+ date: 2013-07-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -57,8 +57,11 @@ files:
57
57
  - bin/rake
58
58
  - framingham.gemspec
59
59
  - framingham.rb
60
+ - framingham/diabetes.rb
60
61
  - framingham/heartdisease.rb
61
- - framingham/heartdisease_tests.rb
62
+ - framingham/tests/diabetes_tests.rb
63
+ - framingham/tests/heartdisease_tests.rb
64
+ - framingham/version.rb
62
65
  homepage: https://github.com/3poundhealth/framingham#framingham
63
66
  licenses:
64
67
  - MIT