Commit b6b7746

mo khan <mo@mokhan.ca>
2015-05-31 16:37:13
move create_workout_from from training_session to android_import.
1 parent 8bf55b8
app/models/android_import.rb
@@ -7,11 +7,50 @@ class AndroidImport
   end
 
   def import(row)
-    user.training_sessions.create_workout_from(map_from(row), program)
+    create_workout_from(map_from(row), program)
   end
 
   private
 
+  # refactor this to use the new api to add a workout
+  # training_session = user.begin(workout_a)
+  # training_session.train(squat, 200, [5,5,5,5,5])
+  def create_workout_from(workout_row, program)
+    ActiveRecord::Base.transaction do
+      workout = program.workouts.find_by(name: workout_row.workout)
+      matching_workouts = user.training_sessions.where(occurred_at: workout_row.date)
+      if matching_workouts.any?
+        session = matching_workouts.first
+      else
+        session = user.training_sessions.create!(
+          workout: workout,
+          occurred_at: workout_row.date,
+          body_weight: workout_row.body_weight.to_f
+        )
+      end
+
+      session.exercise_sessions.destroy_all
+      workout.exercise_workouts.each_with_index do |exercise_workout, index|
+        exercise_row = workout_row.exercises[index]
+        sets = []
+        1.upto(exercise_workout.sets).each do |n|
+          if exercise_row["set#{n}"].to_i > 0
+            sets << exercise_row["set#{n}"]
+          else
+            sets << 0
+          end
+        end
+
+        session.exercise_sessions.create!(
+          target_weight: exercise_row["warmup"]["targetWeight"],
+          exercise_workout: exercise_workout,
+          sets: sets
+        )
+      end
+      session
+    end
+  end
+
   def map_from(row)
     WorkoutRow.new(
       id: row[0],
app/models/training_session.rb
@@ -13,43 +13,4 @@ class TrainingSession < ActiveRecord::Base
       sets: completed_sets
     )
   end
-
-  # refactor this to use the new api to add a workout
-  # training_session = user.begin(workout_a)
-  # training_session.train(squat, 200, [5,5,5,5,5])
-  def self.create_workout_from(workout_row, program)
-    transaction do
-      workout = program.workouts.find_by(name: workout_row.workout)
-      matching_workouts = where(occurred_at: workout_row.date)
-      if matching_workouts.any?
-        session = matching_workouts.first
-      else
-        session = create!(
-          workout: workout,
-          occurred_at: workout_row.date,
-          body_weight: workout_row.body_weight.to_f
-        )
-      end
-
-      session.exercise_sessions.destroy_all
-      workout.exercise_workouts.each_with_index do |exercise_workout, index|
-        exercise_row = workout_row.exercises[index]
-        sets = []
-        1.upto(exercise_workout.sets).each do |n|
-          if exercise_row["set#{n}"].to_i > 0
-            sets << exercise_row["set#{n}"]
-          else
-            sets << 0
-          end
-        end
-
-        session.exercise_sessions.create!(
-          target_weight: exercise_row["warmup"]["targetWeight"],
-          exercise_workout: exercise_workout,
-          sets: sets
-        )
-      end
-      session
-    end
-  end
 end
spec/models/training_session_spec.rb
@@ -1,91 +1,6 @@
 require "rails_helper"
 
 describe TrainingSession, type: :model do
-  describe ".create_workout_from" do
-    include_context "stronglifts_program"
-    let(:user) { create(:user) }
-
-    context "when extracting from an android backup" do
-      let(:row) do
-        [
-          31,
-          "2015-05-13 06:10:21",
-          "A",
-          "{\"weight\":{\"lastWeightKg\":90,\"lastWeightLb\":200},\"success\":false,\"set1\":-1,\"set2\":-1,\"set3\":-1,\"set4\":-1,\"set5\":-1,\"messageDismissed\":false,\"workoutType\":0,\"warmup\":{\"exerciseType\":1,\"targetWeight\":200,\"warmupSets\":[{\"completed\":false},{\"completed\":false},{\"completed\":false},{\"completed\":false},{\"completed\":false}]}}", 
-          "{\"weight\":{\"lastWeightKg\":65,\"lastWeightLb\":145},\"success\":true,\"set1\":5,\"set2\":5,\"set3\":5,\"set4\":5,\"set5\":5,\"messageDismissed\":false,\"workoutType\":0,\"warmup\":{\"exerciseType\":2,\"targetWeight\":145,\"warmupSets\":[{\"completed\":true},{\"completed\":true},{\"completed\":true},{\"completed\":true}]}}", 
-          "{\"weight\":{\"lastWeightKg\":60,\"lastWeightLb\":130},\"success\":false,\"set1\":5,\"set2\":4,\"set3\":4,\"set4\":4,\"set5\":4,\"messageDismissed\":false,\"workoutType\":0,\"warmup\":{\"exerciseType\":3,\"targetWeight\":130,\"warmupSets\":[{\"completed\":true}]}}", 
-          "",
-          "209LB",
-          "{\"set1\":8,\"set2\":4,\"set3\":4,\"messageDismissed\":false,\"exercise\":0,\"weight\":{\"lastWeightKg\":0,\"lastWeightLb\":0}}",
-          0
-        ]
-      end
-
-      let(:workout_row) do
-        WorkoutRow.new(
-          id: row[0],
-          date: DateTime.parse(row[1]),
-          workout: row[2],
-          exercise_1: JSON.parse(row[3]),
-          exercise_2: JSON.parse(row[4]),
-          exercise_3: JSON.parse(row[5]),
-          note: row[6],
-          body_weight: row[7],
-          arm_work: JSON.parse(row[8])
-        )
-      end
-
-      it "creates a new workout" do
-        training_session = user.training_sessions.
-          create_workout_from(workout_row, program)
-
-        expect(training_session).to be_persisted
-        expect(training_session.occurred_at).to eql(workout_row.date)
-        expect(training_session.workout).to eql(workout_a)
-        expect(training_session.body_weight).to eql(209.0)
-        expect(training_session.exercise_sessions.count).to eql(3)
-        expect(
-          training_session.exercise_sessions.map { |x| x.exercise.name }
-        ).to match_array(["Squat", "Bench Press", "Barbell Row"])
-
-        squat_session = training_session.exercise_sessions.
-          find_by(exercise_workout: squat_workout)
-        expect(squat_session.target_weight).to eql(200.0)
-        expect(squat_session.sets[0]).to eql("0")
-        expect(squat_session.sets[1]).to eql("0")
-        expect(squat_session.sets[2]).to eql("0")
-        expect(squat_session.sets[3]).to eql("0")
-        expect(squat_session.sets[4]).to eql("0")
-
-        bench_session = training_session.exercise_sessions.
-          find_by(exercise_workout: bench_workout)
-        expect(bench_session.target_weight).to eql(145.0)
-        expect(bench_session.sets[0]).to eql("5")
-        expect(bench_session.sets[1]).to eql("5")
-        expect(bench_session.sets[2]).to eql("5")
-        expect(bench_session.sets[3]).to eql("5")
-        expect(bench_session.sets[4]).to eql("5")
-
-        row_session = training_session.exercise_sessions.
-          find_by(exercise_workout: row_workout)
-        expect(row_session.target_weight).to eql(130.0)
-        expect(row_session.sets[0]).to eql("5")
-        expect(row_session.sets[1]).to eql("4")
-        expect(row_session.sets[2]).to eql("4")
-        expect(row_session.sets[3]).to eql("4")
-        expect(row_session.sets[4]).to eql("4")
-      end
-
-      it "excludes items that have already been imported" do
-        training_session = user.training_sessions.
-          create_workout_from(workout_row, program)
-        expect(
-          user.training_sessions.create_workout_from(workout_row, program)
-        ).to eql(training_session)
-      end
-    end
-  end
-
   describe "#train" do
     subject { create(:training_session) }
     let(:workout) { subject.workout }