class Curricula::DegreePlan

Public Class Methods

new(spreadsheet) click to toggle source
# File lib/curricula.rb, line 26
def initialize spreadsheet
  @spreadsheet = spreadsheet
  @courses = {}
end

Public Instance Methods

course(name) click to toggle source
# File lib/curricula.rb, line 41
def course name
  process_first!
  @course_hours[name]
end
course_list() click to toggle source
# File lib/curricula.rb, line 36
def course_list
  process_first!
  @course_hours
end
cruciality() click to toggle source
# File lib/curricula.rb, line 55
def cruciality
  @courses.each_value.map { |course| [course.name,course.cruciality] }
end
efficiency() click to toggle source
# File lib/curricula.rb, line 31
def efficiency
  process_first!
  @efficiency
end
graph_edges() click to toggle source
# File lib/curricula.rb, line 50
def graph_edges
  process_first!
  @courses.each_value.map(&:graph_edges).flatten(1).reject &:empty?
end
graph_nodes() click to toggle source
# File lib/curricula.rb, line 46
def graph_nodes
  @courses.each_value.map &:name
end

Private Instance Methods

build_courses() click to toggle source
# File lib/curricula.rb, line 68
def build_courses
  Spreadsheet.open(@spreadsheet).worksheets.first.each do |row|
    if row[1]
      @courses[row.last].prereqs << row.first
      increase_cruciality row.first, row.last
    else
      @courses[row.first] = Course.new row.first, row.last
    end
  end rescue error :format
end
course_hours(course, visited = []) click to toggle source
# File lib/curricula.rb, line 79
def course_hours course, visited = []
  error :circular if visited.include? course.name
  visited << course.name
  course.hours + course.prereqs.map{ |prereq| course_hours(@courses[prereq], visited).to_i }.reduce(:+).to_i
end
error(name) click to toggle source
# File lib/curricula.rb, line 90
def error name
  case name
  when :format
    raise "Check your spreadsheet format"
  when :circular
    raise "Prerequisites are circular. This degree plan makes no sense."
  else
    raise "Error #{name}"
  end
end
increase_cruciality(prerequisite, course) click to toggle source
# File lib/curricula.rb, line 85
def increase_cruciality prerequisite, course
  @courses[prerequisite].cruciality += @courses[course].hours
  @courses[prerequisite].prereqs.each { |prereq| increase_cruciality prereq, course }
end
process() click to toggle source
# File lib/curricula.rb, line 61
def process
  build_courses
  all_hours = @courses.each_value.map &method(:course_hours)
  @course_hours = @courses.each_value.map(&:name).zip(all_hours).to_h
  @efficiency = all_hours.reduce :+
end
process_first!() click to toggle source
# File lib/curricula.rb, line 101
def process_first!
  @efficency ? true : process
end