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,110 +1,120
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
87
97
88 cmd = "ln -s #{input_fname} #{input_fname_problem_home}"
98 cmd = "ln -s #{input_fname} #{input_fname_problem_home}"
89 system_and_raise_when_fail(cmd,"Test Request: cannot link input file")
99 system_and_raise_when_fail(cmd,"Test Request: cannot link input file")
90 end
100 end
91
101
92 def remove_data_files(problem_home)
102 def remove_data_files(problem_home)
93 if File.exists?("#{problem_home}/test_cases/1/input-1.txt")
103 if File.exists?("#{problem_home}/test_cases/1/input-1.txt")
94 cmd = "rm #{problem_home}/test_cases/1/*"
104 cmd = "rm #{problem_home}/test_cases/1/*"
95 system_and_raise_when_fail(cmd,"Test Request: cannot remove data files")
105 system_and_raise_when_fail(cmd,"Test Request: cannot remove data files")
96 end
106 end
97 end
107 end
98
108
99 def system_and_raise_when_fail(cmd,msg)
109 def system_and_raise_when_fail(cmd,msg)
100 if !system(cmd)
110 if !system(cmd)
101 raise msg
111 raise msg
102 end
112 end
103 end
113 end
104
114
105 end
115 end
106
116
107 class TestRequestReporter
117 class TestRequestReporter
108 def initialize
118 def initialize
109 @config = Grader::Configuration.get_instance
119 @config = Grader::Configuration.get_instance
110 end
120 end
You need to be logged in to leave comments. Login now