# HG changeset patch # User Jittat Fakcharoenphol # Date 2010-03-11 04:28:53 # Node ID 274af5f15b1fd8d98e6538f52f10a91e2fb5148d # Parent 5df0d71260f4b643a235b84f8097a587085a7230 added grading report diff --git a/grader b/grader --- a/grader +++ b/grader @@ -56,12 +56,6 @@ USAGE end -######################################### -# main program -######################################### - -# Reading environment and options. - def process_options_and_stop_file # The list of options are: # - stop [all|process ids] @@ -115,14 +109,65 @@ options[:dry_run] = (ARGV.delete('--dry') != nil) if options[:dry_run] and (not options[:mode] == 'prob') - puts "Dry run currently works for 'prob' mode." + puts "Dry run currently works only for 'prob' mode." + exit(0) + end + + options[:report] = (ARGV.delete('--report') != nil) + if options[:report] and (not options[:mode] == 'prob') + puts "Report currently works only for 'prob' mode." exit(0) end return options end -# ======= Main ======== +class ResultCollector + def initialize + @results = {} + @problems = {} + @users = {} + end + + def save(user, problem, grading_result) + if not @problems.has_key? problem.id + @problems[problem.id] = problem + end + if not @users.has_key? user.id + @users[user.id] = user + end + @results[[user.id, problem.id]] = grading_result + end + + def print_report_by_user + puts "---------------------" + puts " REPORT" + puts "---------------------" + + print "login" + @problems.each_value do |problem| + print ",#{problem.name}" + end + print "\n" + + @users.each_value do |user| + print "#{user.login}" + @problems.each_value do |problem| + if @results.has_key? [user.id, problem.id] + print ",#{@results[[user.id,problem.id]][:points]}" + else + print "," + end + end + print "\n" + end + end +end + +######################################### +# main program +######################################### + options = process_options_and_stop_file GRADER_ENV = options[:environment] grader_mode = options[:mode] @@ -174,8 +219,8 @@ if grader_mode=="queue" engine = Grader::Engine.new else - engine = Grader::Engine.new(Grader::TestRequestRoomMaker.new, - Grader::TestRequestReporter.new) + engine = Grader::Engine.new(:room_maker => Grader::TestRequestRoomMaker.new, + :reporter => Grader::TestRequestReporter.new) end runner = Grader::Runner.new(engine, grader_proc) @@ -198,11 +243,20 @@ end when "prob" - engine = Grader::Engine.new(nil, Grader::SubmissionReporter.new(dry_run)) + if options[:report] + result_collector = ResultCollector.new + else + result_collector = nil + end + + engine = (Grader::Engine. + new(:reporter => + Grader::SubmissionReporter.new(:dry_run => dry_run, + :result_collector => result_collector))) runner = Grader::Runner.new(engine, grader_proc) - + grader_proc.report_active if grader_proc!=nil - + ARGV.each do |prob_name| prob = Problem.find_by_name(prob_name) if prob==nil @@ -212,6 +266,10 @@ end end + if options[:report] + result_collector.print_report_by_user + end + when "sub" engine = Grader::Engine.new runner = Grader::Runner.new(engine, grader_proc) diff --git a/lib/engine.rb b/lib/engine.rb --- a/lib/engine.rb +++ b/lib/engine.rb @@ -14,11 +14,19 @@ attr_writer :room_maker attr_writer :reporter - def initialize(room_maker=nil, reporter=nil) + def initialize(options={}) + # default options + if not options.include? :room_maker + options[:room_maker] = Grader::SubmissionRoomMaker.new + end + if not options.include? :reporter + options[:reporter] = Grader::SubmissionReporter.new + end + @config = Grader::Configuration.get_instance - @room_maker = room_maker || Grader::SubmissionRoomMaker.new - @reporter = reporter || Grader::SubmissionReporter.new + @room_maker = options[:room_maker] + @reporter = options[:reporter] end # takes a submission, asks room_maker to produce grading directories, diff --git a/lib/submission_helper.rb b/lib/submission_helper.rb --- a/lib/submission_helper.rb +++ b/lib/submission_helper.rb @@ -32,13 +32,21 @@ end class SubmissionReporter - def initialize(dry_run=false) + def initialize(options={}) + options = {:dry_run => false, :result_collector => nil}.merge(options) @config = Grader::Configuration.get_instance - @dry_run = dry_run + @dry_run = options[:dry_run] + @result_collector = options[:result_collector] end def report(sub,test_result_dir) - save_result(sub,read_result(test_result_dir)) + result = read_result(test_result_dir) + if @result_collector + @result_collector.save(sub.user, + sub.problem, + result) + end + save_result(sub,result) end def report_error(sub,msg) diff --git a/test/engine_spec.rb b/test/engine_spec.rb --- a/test/engine_spec.rb +++ b/test/engine_spec.rb @@ -156,8 +156,8 @@ before(:each) do @config = Grader::Configuration.get_instance - @engine = Grader::Engine.new(Grader::TestRequestRoomMaker.new, - Grader::TestRequestReporter.new) + @engine = Grader::Engine.new(:room_maker => Grader::TestRequestRoomMaker.new, + :reporter => Grader::TestRequestReporter.new) init_sandbox end