class DegreeParse::Requirements
Attributes
requirements[R]
Public Class Methods
new(filename)
click to toggle source
# File lib/degree_parse.rb, line 26 def initialize(filename) @requirements = YAML.load(import filename).merge YAML.load(import "courses.yml") end
Public Instance Methods
check(taken, requirements = @requirements, name = "main", checked = [])
click to toggle source
# File lib/degree_parse.rb, line 34 def check(taken, requirements = @requirements, name = "main", checked = []) requirements.each do |key, value| if key == "courses" courses = value.map { |name, attr| Course.new(name, hours: get_hours(name), grade: attr["grade"]) } take = requirements["take"] || (0 if requirements["hours"]) checked << { name => match(taken, courses, hours: requirements["hours"], take: take) } else check(taken, requirements[key], key, checked) unless key == "hours" || key == "take" end end checked end
get_hours(course)
click to toggle source
# File lib/degree_parse.rb, line 55 def get_hours(course) name = course.is_a?(Course) ? course.name : course @requirements["courses"][name]["hours"].to_i end
import(*files)
click to toggle source
# File lib/degree_parse.rb, line 30 def import *files files.map{ |file| { File.basename(file, File.extname(file)) => YAML.load(ERB.new(File.read file).result(binding)) } }.reduce(:concat).to_yaml end
match(taken, required, hours: nil, take: required.length)
click to toggle source
# File lib/degree_parse.rb, line 47 def match(taken, required, hours: nil, take: required.length) take ||= required.length courses_in_scope = taken.select { |course| required.map(&:name).include? course.name } passed = courses_in_scope.select { |course| required.find{ |r| r.name == course.name}.check(course.grade) } taken_hours = passed.map(&method(:get_hours)).reduce :+ taken_hours.to_i >= hours.to_i && (passed.map(&:name) & required.map(&:name)).length >= take end