master
 1require "csv"
 2
 3class Csv::Import
 4  attr_reader :user, :program
 5
 6  def initialize(user, program)
 7    @user = user
 8    @program = program
 9  end
10
11  def can_parse?(directory)
12    database_file(directory).present?
13  end
14
15  def import_from(directory)
16    ActiveRecord::Base.transaction do
17      csv_rows_from(database_file(directory)) do |row|
18        import(row)
19      end
20    end
21  end
22
23  def import(row)
24    workout_row = Csv::Workout.map_from(row, user)
25
26    routine = program.routines.find_by(name: workout_row.workout)
27    workout = user.begin_workout(routine, workout_row.date, workout_row.body_weight_lb)
28    routine.exercises.each do |exercise|
29      exercise_row = workout_row.find(exercise)
30      next if exercise_row.nil?
31      exercise_row.sets.compact.each_with_index do |completed_reps, index|
32        next if completed_reps.blank?
33        workout.train(exercise, exercise_row.weight_lb, repetitions: completed_reps, set: index)
34      end
35    end
36  end
37
38  private
39
40  def database_file(dir)
41    Dir.glob("#{dir}/*csv*").first
42  end
43
44  def csv_rows_from(file)
45    previous = nil
46    ::CSV.foreach(file).drop(1).each do |row|
47      duplicate = previous.present? && row == previous
48      next if duplicate
49      yield row
50      previous = row
51    end
52  end
53end