Commit 6975b69

mo khan <mo@mokhan.ca>
2016-06-11 21:47:07
de-dupe the csv parsing.
1 parent 6b4c9ea
app/models/csv/import.rb
@@ -14,8 +14,11 @@ class Csv::Import
 
   def import_from(directory)
     ActiveRecord::Base.transaction do
+      previous = nil
       ::CSV.foreach(database_file(directory)).drop(1).each do |row|
+        next if previous.present? && row == previous
         import(row)
+        previous = row
       end
     end
   end
@@ -32,11 +35,14 @@ class Csv::Import
     workout.exercises.each do |exercise|
       exercise_row = workout_row.find(exercise)
       next if exercise_row.nil?
-      training_session.train(
-        exercise,
-        exercise_row.weight_lb,
-        exercise_row.sets
-      )
+      exercise_row.sets.compact.each_with_index do |completed_reps, index|
+        training_session.train(
+          exercise,
+          exercise_row.weight_lb,
+          repetitions: completed_reps,
+          set: index
+        )
+      end
     end
   end
 
app/models/training_session.rb
@@ -10,7 +10,7 @@ class TrainingSession < ActiveRecord::Base
     recommendation = workout.exercise_workouts.find_by(exercise: exercise)
 
     session = exercise_sessions.find_or_create_by(exercise_workout: recommendation)
-    exercise_set = set.present? ? session.sets.at(set-1) : session.sets.build
+    exercise_set = set.present? && session.sets.at(set).present? ? session.sets.at(set) : session.sets.build
     exercise_set.update!(
       actual_repetitions: repetitions,
       target_repetitions: recommendation.repetitions,
spec/models/csv/import_spec.rb
@@ -60,12 +60,7 @@ describe Csv::Import do
       training_session = user.training_sessions.order(:occurred_at).first
       squat_session = training_session.progress_for(squat)
 
-      expect(squat_session.target_weight).to eql(45.0)
-      expect(squat_session.actual_sets[0]).to eql("5")
-      expect(squat_session.actual_sets[1]).to eql("5")
-      expect(squat_session.actual_sets[2]).to eql("5")
-      expect(squat_session.actual_sets[3]).to eql("5")
-      expect(squat_session.actual_sets[4]).to eql("5")
+      expect(squat_session.to_sets).to eql([5, 5, 5, 5, 5])
     end
 
     it "imports the completed bench exercise" do
@@ -73,12 +68,8 @@ describe Csv::Import do
 
       training_session = user.training_sessions.order(:occurred_at).first
       bench_session = training_session.progress_for(bench_press)
-      expect(bench_session.target_weight).to eql(65.0)
-      expect(bench_session.actual_sets[0]).to eql("5")
-      expect(bench_session.actual_sets[1]).to eql("5")
-      expect(bench_session.actual_sets[2]).to eql("5")
-      expect(bench_session.actual_sets[3]).to eql("5")
-      expect(bench_session.actual_sets[4]).to eql("5")
+      expect(bench_session.sets.count).to eql(5)
+      expect(bench_session.to_sets).to eql([5, 5, 5, 5, 5])
     end
 
     it "imports the completed barbell row exercise" do
@@ -86,12 +77,17 @@ describe Csv::Import do
 
       training_session = user.training_sessions.order(:occurred_at).first
       row_session = training_session.progress_for(barbell_row)
-      expect(row_session.target_weight).to eql(65.0)
-      expect(row_session.actual_sets[0]).to eql("5")
-      expect(row_session.actual_sets[1]).to eql("5")
-      expect(row_session.actual_sets[2]).to eql("5")
-      expect(row_session.actual_sets[3]).to eql("5")
-      expect(row_session.actual_sets[4]).to eql("5")
+      expect(row_session.to_sets).to eql([5, 5, 5, 5, 5])
+      expect(row_session.sets.at(0).target_weight).to eql(65.0)
+      expect(row_session.sets.at(0).actual_repetitions).to eql(5)
+      expect(row_session.sets.at(1).target_weight).to eql(65.0)
+      expect(row_session.sets.at(1).actual_repetitions).to eql(5)
+      expect(row_session.sets.at(2).target_weight).to eql(65.0)
+      expect(row_session.sets.at(2).actual_repetitions).to eql(5)
+      expect(row_session.sets.at(3).target_weight).to eql(65.0)
+      expect(row_session.sets.at(3).actual_repetitions).to eql(5)
+      expect(row_session.sets.at(4).target_weight).to eql(65.0)
+      expect(row_session.sets.at(4).actual_repetitions).to eql(5)
     end
 
     it "excludes items that have already been imported" do
@@ -109,10 +105,7 @@ describe Csv::Import do
       training_session = user.training_sessions.first
       session = training_session.progress_for(dips)
       expect(session).to_not be_nil
-      expect(session.target_weight).to eql(12.5)
-      expect(session.actual_sets[0]).to eql("5")
-      expect(session.actual_sets[1]).to eql("5")
-      expect(session.actual_sets[2]).to eql("5")
+      expect(session.to_sets).to eql([5, 5, 5])
     end
 
     it "imports chinups" do
@@ -122,10 +115,16 @@ describe Csv::Import do
       training_session = user.training_sessions.first
       session = training_session.progress_for(chinups)
       expect(session).to_not be_nil
-      expect(session.target_weight).to eql(0.0)
-      expect(session.actual_sets[0]).to eql("5")
-      expect(session.actual_sets[1]).to eql("3")
-      expect(session.actual_sets[2]).to eql("2")
+      expect(session.to_sets).to eql([5, 3, 2])
+      expect(session.sets.at(0).target_weight).to eql(0.0)
+      expect(session.sets.at(0).target_repetitions).to eql(5)
+      expect(session.sets.at(0).actual_repetitions).to eql(5)
+      expect(session.sets.at(1).target_weight).to eql(0.0)
+      expect(session.sets.at(1).target_repetitions).to eql(5)
+      expect(session.sets.at(1).actual_repetitions).to eql(3)
+      expect(session.sets.at(2).target_weight).to eql(0.0)
+      expect(session.sets.at(2).target_repetitions).to eql(5)
+      expect(session.sets.at(2).actual_repetitions).to eql(2)
     end
   end
 end
spec/models/training_session_spec.rb
@@ -5,7 +5,6 @@ describe TrainingSession, type: :model do
 
   describe "#train" do
     let(:workout) { subject.workout }
-    #let(:sets) { [5, 5, 5, 5, 5] }
     let(:target_weight) { 200 }
     let(:squat) { create(:exercise) }
 
@@ -48,7 +47,7 @@ describe TrainingSession, type: :model do
       subject.train(squat, target_weight, repetitions: 5)
 
       new_weight = target_weight + 10
-      result = subject.train(squat, new_weight, repetitions: 3, set: 2)
+      result = subject.train(squat, new_weight, repetitions: 3, set: 1)
 
       expect(result).to be_persisted
       expect(result.exercise).to eql(squat)