Show More
Commit Description:
MERGED changeset 380:381 from http://theory.cpe.ku.ac.th/grader/web/trunk/judge/scripts...
Commit Description:
MERGED changeset 380:381 from http://theory.cpe.ku.ac.th/grader/web/trunk/judge/scripts
git-svn-id: http://theory.cpe.ku.ac.th/grader/judge/trunk/scripts@382 6386c4cd-e34a-4fa8-8920-d93eb39b512e
References:
File last commit:
Show/Diff file:
Action:
lib/submission_helper.rb
| 123 lines
| 3.3 KiB
| text/x-ruby
| RubyLexer
|
|
r23 | 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" | ||||
|
r34 | 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 | ||||
|
r23 | |||
result_fname = "#{test_result_dir}/result" | ||||
comment_fname = "#{test_result_dir}/comment" | ||||
if FileTest.exist?(result_fname) | ||||
|
r30 | 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 | ||||
|
r23 | return {:points => result, | ||
:comment => comment, | ||||
:cmp_msg => cmp_msg} | ||||
else | ||||
|
r30 | if FileTest.exist?("#{test_result_dir}/a.out") | ||
return {:points => 0, | ||||
:comment => 'error during grading', | ||||
:cmp_msg => cmp_msg} | ||||
else | ||||
return {:points => 0, | ||||
|
r37 | :comment => 'compilation error', | ||
|
r30 | :cmp_msg => cmp_msg} | ||
end | ||||
|
r23 | end | ||
end | ||||
def save_result(submission,result) | ||||
problem = submission.problem | ||||
|
r56 | submission.graded_at = Time.now.gmtime | ||
|
r23 | points = result[:points] | ||
submission.points = points | ||||
comment = @config.report_comment(result[:comment]) | ||||
|
r58 | |||
# | ||||
# TODO: FIX THIS MESSAGE | ||||
# | ||||
|
r23 | if problem == nil | ||
submission.grader_comment = 'PASSED: ' + comment + '(problem is nil)' | ||||
elsif points == problem.full_score | ||||
|
r58 | #submission.grader_comment = 'PASSED: ' + comment | ||
submission.grader_comment = comment | ||||
|
r37 | elsif result[:comment].chomp =~ /^[\[\]P]+$/ | ||
submission.grader_comment = 'PASSED: ' + comment + '(inconsistent score)' | ||||
|
r23 | else | ||
|
r58 | #submission.grader_comment = 'FAILED: ' + comment | ||
submission.grader_comment = comment | ||||
|
r23 | end | ||
submission.compiler_message = result[:cmp_msg] or '' | ||||
submission.save | ||||
end | ||||
end | ||||
end | ||||