diff --git a/rails_root/.rvmrc b/rails_root/.rvmrc
new file mode 100644
index 0000000..f73d5d7
--- /dev/null
+++ b/rails_root/.rvmrc
@@ -0,0 +1 @@
+rvm 1.9.2
diff --git a/rails_root/app/helpers/calendars_helper.rb b/rails_root/app/helpers/calendars_helper.rb
index c919e6d..e8f5c0c 100644
--- a/rails_root/app/helpers/calendars_helper.rb
+++ b/rails_root/app/helpers/calendars_helper.rb
@@ -11,7 +11,7 @@ def draw_plan(plan)
end
plan.executions.each do |execution|
- result << %(
#{execution.date.day}
)
+ result << %(
#{execution.date.day}
)
end
result += %()
diff --git a/rails_root/app/models/execution.rb b/rails_root/app/models/execution.rb
index 0b57a67..d60c531 100644
--- a/rails_root/app/models/execution.rb
+++ b/rails_root/app/models/execution.rb
@@ -1,4 +1,31 @@
class Execution < ActiveRecord::Base
belongs_to :plan
has_many :activities
+ has_many :habits, :through => :plan
+
+ def act!(habit_id)
+ self.activities.create!(:habit_id => habit_id)
+ end
+
+ class Status
+ GREAT = 'great'
+ GOOD = 'good'
+ BAD = 'bad'
+ UNKNOWN = 'unknown'
+ end
+
+ def status
+ return Status::UNKNOWN if self.date > Date.today
+ acted_habits = self.habits.select{|habit| acted?(habit) }
+ if acted_habits.blank?
+ return self.date == Date.today ? Status::UNKNOWN : Status::BAD
+ end
+ return Status::GREAT if acted_habits.size == self.habits.size
+ return Status::GOOD
+ end
+
+ private
+ def acted?(habit)
+ not self.activities.find_by_habit_id(habit).blank?
+ end
end
diff --git a/rails_root/app/models/habit.rb b/rails_root/app/models/habit.rb
index 88afb63..f14e5ca 100644
--- a/rails_root/app/models/habit.rb
+++ b/rails_root/app/models/habit.rb
@@ -1,4 +1,4 @@
class Habit < ActiveRecord::Base
belongs_to :plan
- has_many :activities
+ has_many :activities
end
diff --git a/rails_root/app/models/plan.rb b/rails_root/app/models/plan.rb
index 44a83a3..efb6707 100644
--- a/rails_root/app/models/plan.rb
+++ b/rails_root/app/models/plan.rb
@@ -5,6 +5,10 @@ class Plan < ActiveRecord::Base
after_create :create_executions
+ def execution_on(date)
+ executions.detect{|execution| execution.date == date}
+ end
+
class Status
ACTIVE = 'active'
ABANDONED = 'abandoned'
diff --git a/rails_root/db/migrate/20110124121153_insert_test_data.rb b/rails_root/db/migrate/20110124121153_insert_test_data.rb
index 0b3de67..ccc6a0f 100644
--- a/rails_root/db/migrate/20110124121153_insert_test_data.rb
+++ b/rails_root/db/migrate/20110124121153_insert_test_data.rb
@@ -3,7 +3,7 @@ def self.up
return unless RAILS_ENV == 'development'
user = User.create!(:email => 'user@test.com', :password => 'password')
- user.create_plan!(Date.today, ['Gym', 'Drawing', 'Djembe'])
+ user.create_plan!((Date.today - 10), ['Gym', 'Drawing', 'Djembe'])
User.create!(:email => 'empty.user@test.com', :password => 'password')
end
diff --git a/rails_root/doc/design.key b/rails_root/doc/design.key
new file mode 100644
index 0000000..3d32192
Binary files /dev/null and b/rails_root/doc/design.key differ
diff --git a/rails_root/public/images/grid-bad.png b/rails_root/public/images/grid-bad.png
new file mode 100644
index 0000000..69ccc1b
Binary files /dev/null and b/rails_root/public/images/grid-bad.png differ
diff --git a/rails_root/public/images/grid-good.png b/rails_root/public/images/grid-good.png
new file mode 100644
index 0000000..4f60973
Binary files /dev/null and b/rails_root/public/images/grid-good.png differ
diff --git a/rails_root/public/images/grid-great.png b/rails_root/public/images/grid-great.png
new file mode 100644
index 0000000..9fc0aaf
Binary files /dev/null and b/rails_root/public/images/grid-great.png differ
diff --git a/rails_root/public/stylesheets/ohfy.css b/rails_root/public/stylesheets/ohfy.css
index 7921719..082e6ce 100644
--- a/rails_root/public/stylesheets/ohfy.css
+++ b/rails_root/public/stylesheets/ohfy.css
@@ -63,6 +63,10 @@ a:hover {
background-image: url("/images/grid-unknown.png");
}
+.calendar .bad {
+ background-image: url("/images/grid-bad.png");
+}
+
.sticker {
margin: 0 auto;
overflow: hidden;
diff --git a/rails_root/spec/models/execution_spec.rb b/rails_root/spec/models/execution_spec.rb
index 118911b..04099c6 100644
--- a/rails_root/spec/models/execution_spec.rb
+++ b/rails_root/spec/models/execution_spec.rb
@@ -1,5 +1,43 @@
require 'spec_helper'
describe Execution do
-
+ before(:each) do
+ @user = create_test_user
+ @plan = @user.create_plan!((Date.today - 3), ['Drawing', 'Guitar', 'Gym'])
+ end
+
+ describe :status do
+ it "returns GREAT if all habits are acted" do
+ date = Date.today - 3
+ execution = @plan.execution_on(date)
+
+ lambda do
+ execution.habits.each{|habit| execution.act!(habit.id) }
+ end.should change(Activity, :count).by(3)
+
+ execution.status.should == Execution::Status::GREAT
+ end
+
+ it "returns GOOD if some habits are acted" do
+ execution = @plan.execution_on(Date.today - 2)
+ execution.act!(execution.habits.first)
+ execution.status.should == Execution::Status::GOOD
+ end
+
+ it "returns BAD if no habit is acted" do
+ @plan.execution_on(Date.today - 1).status.should == Execution::Status::BAD
+ end
+
+ it "returns UNKNOWN for future dates" do
+ @plan.execution_on(Date.tomorrow).status.should == Execution::Status::UNKNOWN
+ end
+
+ it "returns UNKNOWN if no habit is acted for today" do
+ execution = @plan.execution_on(Date.today)
+ execution.status.should == Execution::Status::UNKNOWN
+
+ execution.act!(execution.habits.first)
+ execution.status.should == Execution::Status::GOOD
+ end
+ end
end
diff --git a/rails_root/spec/models/plan_spec.rb b/rails_root/spec/models/plan_spec.rb
index 64188d1..8bef737 100644
--- a/rails_root/spec/models/plan_spec.rb
+++ b/rails_root/spec/models/plan_spec.rb
@@ -1,4 +1,18 @@
require 'spec_helper'
describe Plan do
+ describe :execution_on do
+ before(:each) do
+ @user = create_test_user
+ @plan = @user.create_plan!((Date.today - 3), ['Drawing', 'Guitar', 'Gym'])
+ end
+
+ it "returns execution on given date" do
+ @plan.execution_on(Date.today).date.should == Date.today
+ end
+
+ it "returns nil if given date is out of range" do
+ @plan.execution_on(Date.today - 10).should be_nil
+ end
+ end
end
diff --git a/rails_root/thoughtworkers-validator.pem b/rails_root/thoughtworkers-validator.pem
new file mode 100644
index 0000000..2031902
--- /dev/null
+++ b/rails_root/thoughtworkers-validator.pem
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+ Opscode Management
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Page not found.
+
+
+
+
+
+
+
+
+
+
+
+
+