@@ -1,3 +1,4 @@ | |||||
require_relative 'kgrader/assignment' | |||||
require_relative 'kgrader/cli' | require_relative 'kgrader/cli' | ||||
require_relative 'kgrader/course' | require_relative 'kgrader/course' | ||||
require_relative 'kgrader/errors' | require_relative 'kgrader/errors' | ||||
@@ -0,0 +1,15 @@ | |||||
module KGrader | |||||
class Assignment | |||||
attr_reader :name | |||||
def initialize(filesystem, course, name) | |||||
@fs = filesystem | |||||
@course = course | |||||
@name = name | |||||
@config = @fs.load @fs.assignment(@course.name, @name) | |||||
rescue FilesystemError | |||||
raise AssignmentError, "unknown assignment: #{name}" | |||||
end | |||||
end | |||||
end |
@@ -1,6 +1,3 @@ | |||||
require_relative 'course' | |||||
require_relative 'filesystem' | |||||
module KGrader | module KGrader | ||||
class CLI | class CLI | ||||
@@ -65,7 +62,7 @@ module KGrader | |||||
puts "#{pad}assignments:" | puts "#{pad}assignments:" | ||||
course.assignments.each do |assignment| | course.assignments.each do |assignment| | ||||
puts "#{pad} - #{assignment}" | |||||
puts "#{pad} - #{assignment.name}" | |||||
end | end | ||||
end | end | ||||
@@ -1,6 +1,3 @@ | |||||
require_relative 'roster' | |||||
require_relative 'task' | |||||
module KGrader | module KGrader | ||||
class Course | class Course | ||||
attr_reader :name | attr_reader :name | ||||
@@ -11,6 +8,7 @@ module KGrader | |||||
@config = @fs.load @fs.course_config(@name) | @config = @fs.load @fs.course_config(@name) | ||||
@rosters = {} | @rosters = {} | ||||
@assignments = {} | |||||
rescue FilesystemError | rescue FilesystemError | ||||
raise CourseError, "unknown or invalid course: #{name}" | raise CourseError, "unknown or invalid course: #{name}" | ||||
end | end | ||||
@@ -19,6 +17,10 @@ module KGrader | |||||
@rosters[semester] ||= Roster.new @fs, self, semester | @rosters[semester] ||= Roster.new @fs, self, semester | ||||
end | end | ||||
def assignment(name) | |||||
@assignments[name] ||= Assignment.new @fs, self, name | |||||
end | |||||
def task(semester, assignment) | def task(semester, assignment) | ||||
Task.new @fs, self, semester, assignment | Task.new @fs, self, semester, assignment | ||||
end | end | ||||
@@ -28,7 +30,7 @@ module KGrader | |||||
end | end | ||||
def assignments | def assignments | ||||
@fs.assignments @name | |||||
@fs.assignments(@name).map! { |name| assignment name } | |||||
end | end | ||||
def current_semester | def current_semester | ||||
@@ -14,6 +14,9 @@ module KGrader | |||||
class CourseError < KGraderError | class CourseError < KGraderError | ||||
end | end | ||||
class AssignmentError < KGraderError | |||||
end | |||||
class RosterError < KGraderError | class RosterError < KGraderError | ||||
end | end | ||||
end | end |
@@ -19,6 +19,8 @@ module KGrader | |||||
File.join @root, 'spec' | File.join @root, 'spec' | ||||
end | end | ||||
# ------------------------------------------------------------------------- | |||||
def course(name) | def course(name) | ||||
File.join spec, name | File.join spec, name | ||||
end | end | ||||
@@ -27,24 +29,30 @@ module KGrader | |||||
File.join course(name), '_config.yml' | File.join course(name), '_config.yml' | ||||
end | end | ||||
def roster(course_name, semester) | |||||
File.join desk, course_name, semester, '_roster.csv' | |||||
def assignment(courseid, name) | |||||
File.join course(courseid), name, '_config.yml' | |||||
end | |||||
def roster(courseid, semester) | |||||
File.join desk, courseid, semester, '_roster.csv' | |||||
end | end | ||||
# ------------------------------------------------------------------------- | |||||
def courses | def courses | ||||
Dir[File.join spec, '*', ''].map! { |fn| File.basename fn } | Dir[File.join spec, '*', ''].map! { |fn| File.basename fn } | ||||
end | end | ||||
def assignments(course_name) | |||||
Dir[File.join course(course_name), '*', '_config.yml'].map! do |fn| | |||||
File.basename File.dirname fn | |||||
end | |||||
def assignments(courseid) | |||||
Dir[assignment courseid '*'].map! { |fn| File.basename File.dirname fn } | |||||
end | end | ||||
def semesters(course_name) | |||||
Dir[roster course_name, '*'].map! { |fn| File.basename File.dirname fn } | |||||
def semesters(courseid) | |||||
Dir[roster courseid, '*'].map! { |fn| File.basename File.dirname fn } | |||||
end | end | ||||
# ------------------------------------------------------------------------- | |||||
def load(path) | def load(path) | ||||
case File.extname path | case File.extname path | ||||
when '.yml', '.yaml' | when '.yml', '.yaml' | ||||
@@ -5,7 +5,8 @@ module KGrader | |||||
@fs = filesystem | @fs = filesystem | ||||
@course = course | @course = course | ||||
@semester = semester | @semester = semester | ||||
@assignment = assignment | |||||
@assignment = @course.assignment assignment | |||||
@students = @course.roster(@semester).students | @students = @course.roster(@semester).students | ||||
end | end | ||||
@@ -18,7 +19,7 @@ module KGrader | |||||
regrade = options.fetch(:regrade, false) | regrade = options.fetch(:regrade, false) | ||||
# TODO | # TODO | ||||
puts "Grading #{@course.name}:#{@semester} assignment #{@assignment}..." | |||||
puts "Grading #{@course.name}:#{@semester} assignment #{@assignment.name}..." | |||||
puts "- students: #{students.inspect}" | puts "- students: #{students.inspect}" | ||||
puts "- due: #{due}" | puts "- due: #{due}" | ||||
puts "- fetch: #{fetch}" | puts "- fetch: #{fetch}" | ||||
@@ -30,7 +31,7 @@ module KGrader | |||||
students &= options[:students] unless options[:students].nil? | students &= options[:students] unless options[:students].nil? | ||||
# TODO | # TODO | ||||
puts "Committing #{@course.name}:#{@semester} assignment #{@assignment}..." | |||||
puts "Committing #{@course.name}:#{@semester} assignment #{@assignment.name}..." | |||||
puts "- students: #{students.inspect}" | puts "- students: #{students.inspect}" | ||||
end | end | ||||
end | end | ||||