Description:
[grader] change test_request_helper so that it copies additional submitted file git-svn-id: http://theory.cpe.ku.ac.th/grader/judge/trunk/scripts@231 6386c4cd-e34a-4fa8-8920-d93eb39b512e
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r55:7137557e8134 - - 2 files changed: 14 inserted, 1 deleted

@@ -1,54 +1,57
1 #
1 #
2 # A runner drives the engine into various tasks.
2 # A runner drives the engine into various tasks.
3 #
3 #
4
4
5 module Grader
5 module Grader
6
6
7 class Runner
7 class Runner
8
8
9 def initialize(engine, grader_process=nil)
9 def initialize(engine, grader_process=nil)
10 @engine = engine
10 @engine = engine
11 @grader_process = grader_process
11 @grader_process = grader_process
12 end
12 end
13
13
14 def grade_oldest_task
14 def grade_oldest_task
15 task = Task.get_inqueue_and_change_status(Task::STATUS_GRADING)
15 task = Task.get_inqueue_and_change_status(Task::STATUS_GRADING)
16 if task!=nil
16 if task!=nil
17 @grader_process.report_active(task) if @grader_process!=nil
17 @grader_process.report_active(task) if @grader_process!=nil
18
18
19 submission = Submission.find(task.submission_id)
19 submission = Submission.find(task.submission_id)
20 @engine.grade(submission)
20 @engine.grade(submission)
21 task.status_complete!
21 task.status_complete!
22 end
22 end
23 + # @grader_process.report_inactive if @grader_process!=nil
23 return task
24 return task
24 end
25 end
25
26
26 def grade_problem(problem)
27 def grade_problem(problem)
27 users = User.find(:all)
28 users = User.find(:all)
28 users.each do |u|
29 users.each do |u|
29 puts "user: #{u.login}"
30 puts "user: #{u.login}"
30 last_sub = Submission.find(:first,
31 last_sub = Submission.find(:first,
31 :conditions => "user_id = #{u.id} and " +
32 :conditions => "user_id = #{u.id} and " +
32 "problem_id = #{problem.id}",
33 "problem_id = #{problem.id}",
33 :order => 'submitted_at DESC')
34 :order => 'submitted_at DESC')
34 if last_sub!=nil
35 if last_sub!=nil
35 @engine.grade(last_sub)
36 @engine.grade(last_sub)
36 end
37 end
37 end
38 end
38 end
39 end
39
40
40 def grade_oldest_test_request
41 def grade_oldest_test_request
41 test_request = TestRequest.get_inqueue_and_change_status(Task::STATUS_GRADING)
42 test_request = TestRequest.get_inqueue_and_change_status(Task::STATUS_GRADING)
42 if test_request!=nil
43 if test_request!=nil
43 @grader_process.report_active(test_request) if @grader_process!=nil
44 @grader_process.report_active(test_request) if @grader_process!=nil
44
45
45 @engine.grade(test_request)
46 @engine.grade(test_request)
46 test_request.status_complete!
47 test_request.status_complete!
47 end
48 end
49 +
50 + # @grader_process.report_inactive if @grader_process!=nil
48 return test_request
51 return test_request
49 end
52 end
50
53
51 end
54 end
52
55
53 end
56 end
54
57
@@ -1,86 +1,96
1 #
1 #
2 # This part contains various test_request helpers for interfacing
2 # This part contains various test_request helpers for interfacing
3 # with Grader::Engine. There are TestRequestRoomMaker and
3 # with Grader::Engine. There are TestRequestRoomMaker and
4 # TestRequestReporter.
4 # TestRequestReporter.
5
5
6 module Grader
6 module Grader
7
7
8 #
8 #
9 # A TestRequestRoomMaker is a helper object for Engine
9 # A TestRequestRoomMaker is a helper object for Engine
10 # - finds grading room: in user_result_dir/(user)/test_request/ ...
10 # - finds grading room: in user_result_dir/(user)/test_request/ ...
11 # - prepare problem configuration for grading --- basically it copy
11 # - prepare problem configuration for grading --- basically it copy
12 # all config files, and copy user's input into the testcase
12 # all config files, and copy user's input into the testcase
13 # directory. First, it finds the template from problem template
13 # directory. First, it finds the template from problem template
14 # directory; if it can't find a template, it'll use the template
14 # directory; if it can't find a template, it'll use the template
15 # from default template.
15 # from default template.
16 class TestRequestRoomMaker
16 class TestRequestRoomMaker
17 def initialize
17 def initialize
18 @config = Grader::Configuration.get_instance
18 @config = Grader::Configuration.get_instance
19 end
19 end
20
20
21 def produce_grading_room(test_request)
21 def produce_grading_room(test_request)
22 grading_room = grading_room_dir(test_request)
22 grading_room = grading_room_dir(test_request)
23 FileUtils.mkdir_p(grading_room)
23 FileUtils.mkdir_p(grading_room)
24 +
25 + #
26 + # Also copy additional submitted file to this directory as well.
27 + # The program would see this file only if it is copied
28 + # to the sandbox directory later. The run script should do it.
29 + #
30 + cmd = "cp #{test_request.input_file_name}.files/* #{grading_room}"
31 + system(cmd)
32 +
24 grading_room
33 grading_room
25 end
34 end
26
35
27 def find_problem_home(test_request)
36 def find_problem_home(test_request)
28 problem_name = test_request.problem_name
37 problem_name = test_request.problem_name
29
38
30 template_dir = "#{@config.test_request_problem_templates_dir}/" + problem_name
39 template_dir = "#{@config.test_request_problem_templates_dir}/" + problem_name
31
40
32 raise "Test Request: error template not found" if !File.exists?(template_dir)
41 raise "Test Request: error template not found" if !File.exists?(template_dir)
33
42
34 problem_home = problem_home_dir(test_request)
43 problem_home = problem_home_dir(test_request)
35 FileUtils.mkdir_p(problem_home)
44 FileUtils.mkdir_p(problem_home)
36
45
37 copy_problem_template(template_dir,problem_home)
46 copy_problem_template(template_dir,problem_home)
38 link_input_file(test_request,problem_home)
47 link_input_file(test_request,problem_home)
39
48
40 problem_home
49 problem_home
41 end
50 end
42
51
43 def save_source(test_request,source_name)
52 def save_source(test_request,source_name)
44 dir = self.produce_grading_room(test_request)
53 dir = self.produce_grading_room(test_request)
45 submission = test_request.submission
54 submission = test_request.submission
46 f = File.open("#{dir}/#{source_name}","w")
55 f = File.open("#{dir}/#{source_name}","w")
47 f.write(submission.source)
56 f.write(submission.source)
48 f.close
57 f.close
49 end
58 end
50
59
51 def clean_up(test_request)
60 def clean_up(test_request)
52 problem_home = problem_home_dir(test_request)
61 problem_home = problem_home_dir(test_request)
53 remove_data_files(problem_home)
62 remove_data_files(problem_home)
54 end
63 end
55
64
56 protected
65 protected
57 def grading_room_dir(test_request)
66 def grading_room_dir(test_request)
58 problem_name = test_request.problem_name
67 problem_name = test_request.problem_name
59 user = test_request.user
68 user = test_request.user
60 - "#{@config.user_result_dir}" +
69 + grading_room = "#{@config.user_result_dir}" +
61 "/#{user.login}/test_request" +
70 "/#{user.login}/test_request" +
62 "/#{problem_name}/#{test_request.id}"
71 "/#{problem_name}/#{test_request.id}"
72 + grading_room
63 end
73 end
64
74
65 def problem_home_dir(test_request)
75 def problem_home_dir(test_request)
66 problem_name = test_request.problem_name
76 problem_name = test_request.problem_name
67 user = test_request.user
77 user = test_request.user
68 "#{@config.user_result_dir}" +
78 "#{@config.user_result_dir}" +
69 "/#{user.login}/test_request/#{problem_name}"
79 "/#{user.login}/test_request/#{problem_name}"
70 end
80 end
71
81
72 def copy_problem_template(template_dir,problem_home)
82 def copy_problem_template(template_dir,problem_home)
73 cmd = "cp -R #{template_dir}/* #{problem_home}"
83 cmd = "cp -R #{template_dir}/* #{problem_home}"
74 system_and_raise_when_fail(cmd,"Test Request: cannot copy problem template")
84 system_and_raise_when_fail(cmd,"Test Request: cannot copy problem template")
75 end
85 end
76
86
77 def link_input_file(test_request,problem_home)
87 def link_input_file(test_request,problem_home)
78 input_fname = "#{test_request.input_file_name}"
88 input_fname = "#{test_request.input_file_name}"
79 if !File.exists?(input_fname)
89 if !File.exists?(input_fname)
80 raise "Test Request: input file not found."
90 raise "Test Request: input file not found."
81 end
91 end
82
92
83 input_fname_problem_home = "#{problem_home}/test_cases/1/input-1.txt"
93 input_fname_problem_home = "#{problem_home}/test_cases/1/input-1.txt"
84 if File.exists?(input_fname_problem_home)
94 if File.exists?(input_fname_problem_home)
85 FileUtils.rm([input_fname_problem_home], :force => true)
95 FileUtils.rm([input_fname_problem_home], :force => true)
86 end
96 end
You need to be logged in to leave comments. Login now