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