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