Show More
Commit Description:
[grader] import script now support raw with testruns...
Commit Description:
[grader] import script now support raw with testruns git-svn-id: http://theory.cpe.ku.ac.th/grader/judge/trunk/scripts@267 6386c4cd-e34a-4fa8-8920-d93eb39b512e
File last commit:
Show/Diff file:
Action:
lib/submission_helper.rb | 123 lines | 3.3 KiB | text/x-ruby | RubyLexer |
module Grader
class SubmissionRoomMaker
def initialize
@config = Grader::Configuration.get_instance
end
def produce_grading_room(submission)
user = submission.user
problem = submission.problem
grading_room = "#{@config.user_result_dir}/" +
"#{user.login}/#{problem.name}/#{submission.id}"
FileUtils.mkdir_p(grading_room)
grading_room
end
def find_problem_home(submission)
problem = submission.problem
"#{@config.problems_dir}/#{problem.name}"
end
def save_source(submission,source_name)
dir = self.produce_grading_room(submission)
f = File.open("#{dir}/#{source_name}","w")
f.write(submission.source)
f.close
end
def clean_up(submission)
end
end
class SubmissionReporter
def initialize
@config = Grader::Configuration.get_instance
end
def report(sub,test_result_dir)
save_result(sub,read_result(test_result_dir))
end
def report_error(sub,msg)
save_result(sub,{:points => 0,
:comment => "Grading error: #{msg}" })
end
protected
def read_result(test_result_dir)
cmp_msg_fname = "#{test_result_dir}/compiler_message"
if FileTest.exist?(cmp_msg_fname)
cmp_file = File.open(cmp_msg_fname)
cmp_msg = cmp_file.read
cmp_file.close
else
cmp_msg = ""
end
result_fname = "#{test_result_dir}/result"
comment_fname = "#{test_result_dir}/comment"
if FileTest.exist?(result_fname)
comment = ""
begin
result_file = File.open(result_fname)
result = result_file.readline.to_i
result_file.close
rescue
result = 0
comment = "error reading result file."
end
begin
comment_file = File.open(comment_fname)
comment += comment_file.readline.chomp
comment_file.close
rescue
comment += ""
end
return {:points => result,
:comment => comment,
:cmp_msg => cmp_msg}
else
if FileTest.exist?("#{test_result_dir}/a.out")
return {:points => 0,
:comment => 'error during grading',
:cmp_msg => cmp_msg}
else
return {:points => 0,
:comment => 'compilation error',
:cmp_msg => cmp_msg}
end
end
end
def save_result(submission,result)
problem = submission.problem
submission.graded_at = Time.now.gmtime
points = result[:points]
submission.points = points
comment = @config.report_comment(result[:comment])
#
# TODO: FIX THIS MESSAGE
#
if problem == nil
submission.grader_comment = 'PASSED: ' + comment + '(problem is nil)'
elsif points == problem.full_score
#submission.grader_comment = 'PASSED: ' + comment
submission.grader_comment = comment
elsif result[:comment].chomp =~ /^[\[\]P]+$/
submission.grader_comment = 'PASSED: ' + comment + '(inconsistent score)'
else
#submission.grader_comment = 'FAILED: ' + comment
submission.grader_comment = comment
end
submission.compiler_message = result[:cmp_msg] or ''
submission.save
end
end
end