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