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
References:
File last commit:
Show/Diff file:
Action:
grader_id
| 110 lines
| 2.6 KiB
| text/plain
| TextLexer
|
|
r15 | #!/usr/bin/ruby | ||
def talk(str) | ||||
if TALKATIVE | ||||
puts str | ||||
end | ||||
end | ||||
def execute(command, error_message="") | ||||
if not system(command) | ||||
puts "ERROR: #{error_message}" | ||||
exit(127) | ||||
end | ||||
end | ||||
def save_source(submission,dir,fname) | ||||
f = File.open("#{dir}/#{fname}","w") | ||||
f.write(submission.source) | ||||
f.close | ||||
end | ||||
def call_judge(problem_home,language,problem_out_dir,fname) | ||||
ENV['PROBLEM_HOME'] = problem_home | ||||
Dir.chdir problem_out_dir | ||||
cmd = "#{problem_home}/script/judge #{language} #{fname}" | ||||
# puts "CMD: #{cmd}" | ||||
system(cmd) | ||||
end | ||||
def read_result(test_result_dir) | ||||
cmp_msg_fname = "#{test_result_dir}/compiler_message" | ||||
cmp_msg = File.open(cmp_msg_fname).read | ||||
result_fname = "#{test_result_dir}/result" | ||||
comment_fname = "#{test_result_dir}/comment" | ||||
if FileTest.exist?(result_fname) | ||||
result = File.open(result_fname).readline.to_i | ||||
comment = File.open(comment_fname).readline.chomp | ||||
return {:points => result, | ||||
:comment => comment, | ||||
:cmp_msg => cmp_msg} | ||||
else | ||||
return {:points => 0, | ||||
:comment => 'compile error', | ||||
:cmp_msg => cmp_msg} | ||||
end | ||||
end | ||||
def save_result(submission,result) | ||||
submission.graded_at = Time.now | ||||
submission.points = result[:points] | ||||
submission.grader_comment = report_comment(result[:comment]) | ||||
submission.compiler_message = result[:cmp_msg] | ||||
submission.save | ||||
end | ||||
def grade(submission_id) | ||||
sub = Submission.find(submission_id) | ||||
user = sub.user | ||||
problem = sub.problem | ||||
language = sub.language.name | ||||
lang_ext = sub.language.ext | ||||
# FIX THIS | ||||
talk 'some hack on language' | ||||
if language == 'cpp' | ||||
language = 'c++' | ||||
end | ||||
user_dir = "#{USER_RESULT_DIR}/#{user.login}" | ||||
Dir.mkdir(user_dir) if !FileTest.exist?(user_dir) | ||||
problem_out_dir = "#{user_dir}/#{problem.name}" | ||||
Dir.mkdir(problem_out_dir) if !FileTest.exist?(problem_out_dir) | ||||
problem_home = "#{PROBLEMS_DIR}/#{problem.name}" | ||||
source_name = "#{problem.name}.#{lang_ext}" | ||||
save_source(sub,problem_out_dir,source_name) | ||||
call_judge(problem_home,language,problem_out_dir,source_name) | ||||
save_result(sub,read_result("#{problem_out_dir}/test-result")) | ||||
end | ||||
def stop_grader | ||||
File.open(File.dirname(__FILE__) + '/stop','w') | ||||
end | ||||
def check_stopfile | ||||
FileTest.exist?(File.dirname(__FILE__) + '/stop') | ||||
end | ||||
def clear_stopfile | ||||
system("rm " + File.dirname(__FILE__) + '/stop') | ||||
end | ||||
# reading environment and options | ||||
GRADER_ENV = 'exam' | ||||
puts "environment: #{GRADER_ENV}" | ||||
require File.dirname(__FILE__) + "/environment.rb" | ||||
#main program | ||||
talk 'Reading rails environment' | ||||
RAILS_ENV = 'development' | ||||
require RAILS_APP_DIR + '/config/environment' | ||||
current_dir = `pwd` | ||||
grade(ARGV[0].to_i) | ||||