Commit e78fdb8

mo khan <mo@mokhan.ca>
2016-07-10 02:26:41
use custom quantity type.
1 parent dc349a9
app/models/exercise_set.rb
@@ -1,4 +1,5 @@
 class ExerciseSet < ApplicationRecord
+  attribute :target_weight, :quantity
   belongs_to :exercise
   belongs_to :workout
   scope :for, ->(exercise) { where(exercise: exercise).in_order }
@@ -15,7 +16,7 @@ class ExerciseSet < ApplicationRecord
   end
 
   def weight_per_side
-    remaining_weight = target_weight.lbs - 45.lbs
+    remaining_weight = target_weight - 45.lbs
     if remaining_weight > 0
       "#{remaining_weight / 2} lb/side"
     end
app/models/quantity.rb
@@ -49,6 +49,10 @@ class Quantity
     [self, other]
   end
 
+  def hash
+    amount.hash + unit.class.hash
+  end
+
   def eql?(other, delta = 0.1)
     (amount - amount_from(other)).abs <= delta
   end
app/models/quantity_type.rb
@@ -0,0 +1,19 @@
+class QuantityType < ActiveRecord::Type::Float
+  def cast(value)
+    return nil if value.nil?
+
+    if value.is_a? Quantity
+      value.to(:lbs)
+    else
+      Quantity.new(value.to_f, :lbs)
+    end
+  end
+
+  def serialize(value)
+    if value.is_a? Quantity
+      super(value.to(:lbs).to_f)
+    else
+      super(value)
+    end
+  end
+end
app/models/training_history.rb
@@ -23,7 +23,7 @@ class TrainingHistory
 
   def last_weight
     last_successful_set = sets.successful.last
-    last_successful_set.try(:target_weight).to_i
+    last_successful_set.try(:target_weight)
   end
 
   def to_line_chart
app/models/user_recommendation.rb
@@ -36,7 +36,7 @@ class UserRecommendation
 
   def next_weight
     last_weight = user.history_for(exercise).last_weight
-    if last_weight > 0
+    if last_weight.present? && last_weight > 0
       5.lbs + last_weight
     else
       45.lbs
config/initializers/extensions.rb
@@ -2,12 +2,20 @@ class Fixnum
   def lbs
     to_f.lbs
   end
+
+  def kg
+    to_f.kg
+  end
 end
 
 class Float
   def lbs
     Quantity.new(self, :lbs)
   end
+
+  def kg
+    Quantity.new(self, :kg)
+  end
 end
 
 class NilClass
config/initializers/types.rb
@@ -0,0 +1,1 @@
+ActiveRecord::Type.register(:quantity, QuantityType)
spec/models/exercise_set_spec.rb
@@ -1,7 +1,7 @@
 require "rails_helper"
 
 describe ExerciseSet do
-  subject { build(:exercise_set) }
+  subject { build(:work_set) }
 
   describe "#weight_per_side" do
     it "returns empty bar" do
@@ -30,4 +30,18 @@ describe ExerciseSet do
       expect(ExerciseSet.for(squat)).to be_empty
     end
   end
+
+  describe "#target_weight" do
+    it 'saves lbs' do
+      subject.target_weight = 45.lbs
+      subject.save!
+      expect(subject.reload.target_weight).to eql(45.lbs)
+    end
+
+    it 'saves kgs' do
+      subject.target_weight = 20.kg
+      subject.save!
+      expect(subject.reload.target_weight).to eql(20.kg)
+    end
+  end
 end
spec/models/program_spec.rb
@@ -81,9 +81,9 @@ describe Program do
             sets = subject.prepare_sets_for(user, squat)
             warmup_sets = sets.select(&:warm_up?)
             expect(warmup_sets.length).to eql(2)
-            expect(warmup_sets.at(0).target_weight.lbs).to eql(45.lbs)
+            expect(warmup_sets.at(0).target_weight.to(:lbs)).to eql(45.lbs)
             expect(warmup_sets.at(0).target_repetitions).to eql(5)
-            expect(warmup_sets.at(1).target_weight.lbs).to eql(45.lbs)
+            expect(warmup_sets.at(1).target_weight.to(:lbs)).to eql(45.lbs)
             expect(warmup_sets.at(1).target_repetitions).to eql(5)
           end
         end
@@ -96,7 +96,7 @@ describe Program do
             sets = subject.prepare_sets_for(user, squat)
             warmup_sets = sets.select(&:warm_up?)
             expect(warmup_sets.length).to eql(3)
-            expect(warmup_sets.at(2).target_weight.lbs).to eql(65.lbs)
+            expect(warmup_sets.at(2).target_weight.to(:lbs)).to eql(65.lbs)
             expect(warmup_sets.at(2).target_repetitions).to eql(3)
           end
         end
@@ -108,7 +108,7 @@ describe Program do
 
             warmup_sets = subject.prepare_sets_for(user, squat).select(&:warm_up?)
             expect(warmup_sets.length).to eql(3)
-            expect(warmup_sets.last.target_weight.lbs).to eql(75.lbs)
+            expect(warmup_sets.last.target_weight.to(:lbs)).to eql(75.lbs)
             expect(warmup_sets.last.target_repetitions).to eql(3)
           end
         end
@@ -120,7 +120,7 @@ describe Program do
 
             warmup_sets = subject.prepare_sets_for(user, squat).select(&:warm_up?)
             expect(warmup_sets.length).to eql(3)
-            expect(warmup_sets.last.target_weight.lbs).to eql(85.lbs)
+            expect(warmup_sets.last.target_weight.to(:lbs)).to eql(85.lbs)
             expect(warmup_sets.last.target_repetitions).to eql(3)
           end
         end
@@ -132,7 +132,7 @@ describe Program do
 
             warmup_sets = subject.prepare_sets_for(user, squat).select(&:warm_up?)
             expect(warmup_sets.length).to eql(4)
-            expect(warmup_sets.last.target_weight.lbs).to eql(115.lbs)
+            expect(warmup_sets.last.target_weight.to(:lbs)).to eql(115.lbs)
             expect(warmup_sets.last.target_repetitions).to eql(3)
           end
         end