| @@ -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 | ||||