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