Commit e78fdb8
Changed files (9)
config
initializers
spec
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