Show More
Commit Description:
handle the case when problem id or submission id is null. Grader will simply skip such request. Add more report on console (for command line grading)...
Commit Description:
handle the case when problem id or submission id is null. Grader will simply skip such request. Add more report on console (for command line grading)
(mercurial grafted from d233105d3965c5368c9b33125f390e39b25f910e)
References:
File last commit:
Show/Diff file:
Action:
lib/submission_helper.rb
| 134 lines
| 3.7 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 | ||||
|
r92 | def initialize(options={}) | ||
options = {:dry_run => false, :result_collector => nil}.merge(options) | ||||
|
r23 | @config = Grader::Configuration.get_instance | ||
|
r92 | @dry_run = options[:dry_run] | ||
@result_collector = options[:result_collector] | ||||
|
r23 | end | ||
def report(sub,test_result_dir) | ||||
|
r92 | result = read_result(test_result_dir) | ||
if @result_collector | ||||
|
r123 | @result_collector.save(sub, | ||
|
r92 | result) | ||
end | ||||
save_result(sub,result) | ||||
|
r23 | 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 '' | ||||
|
r91 | |||
if not @dry_run | ||||
submission.save | ||||
end | ||||
|
r23 | end | ||
end | ||||
end | ||||