Show More
Commit Description:
add option -A <opt> to box. This options allow more argument to be explicitly passed to the program...
Commit Description:
add option -A <opt> to box. This options allow more argument to be explicitly passed to the program
We have to use this because if the argument we wish to pass to the program is option (in -? format),
box will intepret it as its option and failed accordingly.
be noted that, by the definition of getopt, these options will be put after original argument
(check the code for more info)
References:
File last commit:
Show/Diff file:
Action:
lib/submission_helper.rb
| 152 lines
| 4.2 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" | ||||
r160 | comment_fname = "#{test_result_dir}/comment" | |||
runstat_fname = "#{test_result_dir}/run_stat" | ||||
|
r23 | 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 | ||||
r160 | begin | |||
runstat_file = File.open(runstat_fname) | ||||
max_runtime = runstat_file.readline.to_f | ||||
peak_memory = runstat_file.readline.to_i | ||||
rescue | ||||
max_runtime = -1 | ||||
peak_memory = -1 | ||||
end | ||||
return {points: result, | ||||
comment: comment, | ||||
cmp_msg: cmp_msg, | ||||
max_runtime: max_runtime, | ||||
peak_memory: peak_memory | ||||
} | ||||
|
r23 | 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 | |||
r160 | submission.peak_memory = result[:peak_memory] | |||
submission.max_runtime = result[:max_runtime] | ||||
submission.effective_code_length =submission.source.length | ||||
|
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 | ||||