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