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