@@ -1,13 +1,15 @@ | |||||
module KGrader | module KGrader | ||||
class Assignment | class Assignment | ||||
attr_reader :name | |||||
attr_reader :name, :manifest | |||||
def initialize(filesystem, course, name) | def initialize(filesystem, course, name) | ||||
@fs = filesystem | @fs = filesystem | ||||
@course = course | @course = course | ||||
@name = name | @name = name | ||||
@config = @fs.load @fs.assignment(@course.name, @name) | |||||
@root = @fs.assignment @course.name, @name | |||||
@config = @fs.load @fs.assignment_config(@course.name, @name) | |||||
@manifest = build_manifest | |||||
rescue FilesystemError | rescue FilesystemError | ||||
raise AssignmentError, "unknown assignment: #{name}" | raise AssignmentError, "unknown assignment: #{name}" | ||||
end | end | ||||
@@ -15,5 +17,21 @@ module KGrader | |||||
def id | def id | ||||
@config['id'] || @name | @config['id'] || @name | ||||
end | end | ||||
def build_manifest | |||||
unless @config.include? 'manifest' | |||||
raise AssignmentError, "missing manifest: #{@name}" | |||||
end | |||||
manifest = @config['manifest'] | |||||
provided = manifest['provided'].map do |glob| | |||||
Dir[File.join @root, 'provided', glob] | |||||
end.flatten | |||||
{ | |||||
:provided => provided, | |||||
:graded => manifest['graded'], | |||||
:report => manifest['report'] | |||||
} | |||||
end | |||||
end | end | ||||
end | end |
@@ -37,8 +37,8 @@ module KGrader | |||||
end | end | ||||
def clean | def clean | ||||
clear_jail | |||||
clean_desk | |||||
@fs.reset_jail | |||||
@fs.clean_desk | |||||
end | end | ||||
def clobber | def clobber | ||||
@@ -46,8 +46,8 @@ module KGrader | |||||
print "are you sure? [y/N] " | print "are you sure? [y/N] " | ||||
abort "aborted" unless ['y', 'yes'].include? STDIN.gets.strip.downcase | abort "aborted" unless ['y', 'yes'].include? STDIN.gets.strip.downcase | ||||
clear_jail | |||||
clear_desk | |||||
@fs.reset_jail | |||||
@fs.reset_desk | |||||
end | end | ||||
private | private | ||||
@@ -65,20 +65,5 @@ module KGrader | |||||
puts "#{pad} - #{assignment.name}" | puts "#{pad} - #{assignment.name}" | ||||
end | end | ||||
end | end | ||||
def clear_jail | |||||
FileUtils.rm_rf @fs.jail | |||||
end | |||||
def clear_desk | |||||
FileUtils.rm_rf Dir[File.join @fs.desk, '*', ''] | |||||
end | |||||
def clean_desk | |||||
Dir[File.join @fs.desk, '*', '*', '*', '*', 'status.txt'].each do |fn| | |||||
File.write fn, "ungraded" if File.read(fn) == "graded" | |||||
end | |||||
FileUtils.rm_rf Dir[File.join @fs.desk, '*', '*', '*', '*', 'pending'] | |||||
end | |||||
end | end | ||||
end | end |
@@ -31,7 +31,11 @@ module KGrader | |||||
end | end | ||||
def assignment(courseid, name) | def assignment(courseid, name) | ||||
File.join course(courseid), name, '_config.yml' | |||||
File.join course(courseid), name | |||||
end | |||||
def assignment_config(courseid, name) | |||||
File.join assignment(courseid, name), '_config.yml' | |||||
end | end | ||||
def roster(courseid, semester) | def roster(courseid, semester) | ||||
@@ -49,7 +53,7 @@ module KGrader | |||||
end | end | ||||
def assignments(courseid) | def assignments(courseid) | ||||
Dir[assignment courseid, '*'].map! { |fn| File.basename File.dirname fn } | |||||
Dir[File.join course(courseid), '*', ''].map! { |fn| File.basename fn } | |||||
end | end | ||||
def semesters(courseid) | def semesters(courseid) | ||||
@@ -74,5 +78,20 @@ module KGrader | |||||
rescue SystemCallError # Errno::ENOENT, etc. | rescue SystemCallError # Errno::ENOENT, etc. | ||||
raise FilesystemError, "can't read file: #{path}" | raise FilesystemError, "can't read file: #{path}" | ||||
end | end | ||||
def reset_jail | |||||
FileUtils.rm_rf jail | |||||
end | |||||
def reset_desk | |||||
FileUtils.rm_rf Dir[File.join desk, '*', ''] | |||||
end | |||||
def clean_desk | |||||
Dir[File.join desk, '*', '*', '*', '*', 'status.txt'].each do |fn| | |||||
File.write fn, "ungraded" if File.read(fn) == "graded" | |||||
end | |||||
FileUtils.rm_rf Dir[File.join desk, '*', '*', '*', '*', 'pending'] | |||||
end | |||||
end | end | ||||
end | end |
@@ -50,8 +50,10 @@ module KGrader | |||||
def grade | def grade | ||||
# TODO: | # TODO: | ||||
# self.status = :ungraded | # self.status = :ungraded | ||||
stage | |||||
# [grade the stuff] | # [grade the stuff] | ||||
# [save report to gradefile] | # [save report to gradefile] | ||||
# @fs.reset_jail | |||||
# FileUtils.touch pendingfile | # FileUtils.touch pendingfile | ||||
# self.status = :graded | # self.status = :graded | ||||
# return grade summary string | # return grade summary string | ||||
@@ -104,5 +106,19 @@ module KGrader | |||||
@course.backend.update repo, rev | @course.backend.update repo, rev | ||||
rev | rev | ||||
end | end | ||||
def stage | |||||
@fs.reset_jail | |||||
FileUtils.mkdir_p @fs.jail | |||||
# puts | |||||
# @assignment.manifest[:provided].each { |fn| p fn } | |||||
# abort | |||||
# p @assignment.manifest[:provided], @assignment.manifest[:graded], @assignment.manifest[:report] | |||||
# copytree files matching manifest from student submission | |||||
# use assignment.stage | |||||
end | |||||
end | end | ||||
end | end |