Description:
added grading report
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r92:274af5f15b1f - - 4 files changed: 93 inserted, 19 deleted

@@ -53,18 +53,12
53 (2) possible modes are: 'queue', 'prob', 'test_request'
53 (2) possible modes are: 'queue', 'prob', 'test_request'
54 (3) create stop-file to stop running grader in queue mode
54 (3) create stop-file to stop running grader in queue mode
55 (4) You are here.
55 (4) You are here.
56 USAGE
56 USAGE
57 end
57 end
58
58
59 - #########################################
60 - # main program
61 - #########################################
62 -
63 - # Reading environment and options.
64 -
65 def process_options_and_stop_file
59 def process_options_and_stop_file
66 # The list of options are:
60 # The list of options are:
67 # - stop [all|process ids]
61 # - stop [all|process ids]
68 # -
62 # -
69
63
70 # Process 'help' option
64 # Process 'help' option
@@ -112,20 +106,71
112 options[:mode] = ARGV.shift
106 options[:mode] = ARGV.shift
113 end
107 end
114 end
108 end
115
109
116 options[:dry_run] = (ARGV.delete('--dry') != nil)
110 options[:dry_run] = (ARGV.delete('--dry') != nil)
117 if options[:dry_run] and (not options[:mode] == 'prob')
111 if options[:dry_run] and (not options[:mode] == 'prob')
118 - puts "Dry run currently works for 'prob' mode."
112 + puts "Dry run currently works only for 'prob' mode."
113 + exit(0)
114 + end
115 +
116 + options[:report] = (ARGV.delete('--report') != nil)
117 + if options[:report] and (not options[:mode] == 'prob')
118 + puts "Report currently works only for 'prob' mode."
119 exit(0)
119 exit(0)
120 end
120 end
121
121
122 return options
122 return options
123 end
123 end
124
124
125 - # ======= Main ========
125 + class ResultCollector
126 + def initialize
127 + @results = {}
128 + @problems = {}
129 + @users = {}
130 + end
131 +
132 + def save(user, problem, grading_result)
133 + if not @problems.has_key? problem.id
134 + @problems[problem.id] = problem
135 + end
136 + if not @users.has_key? user.id
137 + @users[user.id] = user
138 + end
139 + @results[[user.id, problem.id]] = grading_result
140 + end
141 +
142 + def print_report_by_user
143 + puts "---------------------"
144 + puts " REPORT"
145 + puts "---------------------"
146 +
147 + print "login"
148 + @problems.each_value do |problem|
149 + print ",#{problem.name}"
150 + end
151 + print "\n"
152 +
153 + @users.each_value do |user|
154 + print "#{user.login}"
155 + @problems.each_value do |problem|
156 + if @results.has_key? [user.id, problem.id]
157 + print ",#{@results[[user.id,problem.id]][:points]}"
158 + else
159 + print ","
160 + end
161 + end
162 + print "\n"
163 + end
164 + end
165 + end
166 +
167 + #########################################
168 + # main program
169 + #########################################
170 +
126 options = process_options_and_stop_file
171 options = process_options_and_stop_file
127 GRADER_ENV = options[:environment]
172 GRADER_ENV = options[:environment]
128 grader_mode = options[:mode]
173 grader_mode = options[:mode]
129 dry_run = options[:dry_run]
174 dry_run = options[:dry_run]
130
175
131 puts "environment: #{GRADER_ENV}"
176 puts "environment: #{GRADER_ENV}"
@@ -171,14 +216,14
171 case grader_mode
216 case grader_mode
172 when "queue", "test_request"
217 when "queue", "test_request"
173 log "Grader: #{grader_mode}"
218 log "Grader: #{grader_mode}"
174 if grader_mode=="queue"
219 if grader_mode=="queue"
175 engine = Grader::Engine.new
220 engine = Grader::Engine.new
176 else
221 else
177 - engine = Grader::Engine.new(Grader::TestRequestRoomMaker.new,
222 + engine = Grader::Engine.new(:room_maker => Grader::TestRequestRoomMaker.new,
178 - Grader::TestRequestReporter.new)
223 + :reporter => Grader::TestRequestReporter.new)
179 end
224 end
180
225
181 runner = Grader::Runner.new(engine, grader_proc)
226 runner = Grader::Runner.new(engine, grader_proc)
182 while true
227 while true
183
228
184 if check_stopfile # created by calling grader stop
229 if check_stopfile # created by calling grader stop
@@ -195,13 +240,22
195 if task==nil
240 if task==nil
196 sleep(1)
241 sleep(1)
197 end
242 end
198 end
243 end
199
244
200 when "prob"
245 when "prob"
201 - engine = Grader::Engine.new(nil, Grader::SubmissionReporter.new(dry_run))
246 + if options[:report]
247 + result_collector = ResultCollector.new
248 + else
249 + result_collector = nil
250 + end
251 +
252 + engine = (Grader::Engine.
253 + new(:reporter =>
254 + Grader::SubmissionReporter.new(:dry_run => dry_run,
255 + :result_collector => result_collector)))
202 runner = Grader::Runner.new(engine, grader_proc)
256 runner = Grader::Runner.new(engine, grader_proc)
203
257
204 grader_proc.report_active if grader_proc!=nil
258 grader_proc.report_active if grader_proc!=nil
205
259
206 ARGV.each do |prob_name|
260 ARGV.each do |prob_name|
207 prob = Problem.find_by_name(prob_name)
261 prob = Problem.find_by_name(prob_name)
@@ -209,12 +263,16
209 puts "cannot find problem: #{prob_name}"
263 puts "cannot find problem: #{prob_name}"
210 else
264 else
211 runner.grade_problem(prob)
265 runner.grade_problem(prob)
212 end
266 end
213 end
267 end
214
268
269 + if options[:report]
270 + result_collector.print_report_by_user
271 + end
272 +
215 when "sub"
273 when "sub"
216 engine = Grader::Engine.new
274 engine = Grader::Engine.new
217 runner = Grader::Runner.new(engine, grader_proc)
275 runner = Grader::Runner.new(engine, grader_proc)
218
276
219 grader_proc.report_active if grader_proc!=nil
277 grader_proc.report_active if grader_proc!=nil
220
278
@@ -11,17 +11,25
11 #
11 #
12 class Engine
12 class Engine
13
13
14 attr_writer :room_maker
14 attr_writer :room_maker
15 attr_writer :reporter
15 attr_writer :reporter
16
16
17 - def initialize(room_maker=nil, reporter=nil)
17 + def initialize(options={})
18 + # default options
19 + if not options.include? :room_maker
20 + options[:room_maker] = Grader::SubmissionRoomMaker.new
21 + end
22 + if not options.include? :reporter
23 + options[:reporter] = Grader::SubmissionReporter.new
24 + end
25 +
18 @config = Grader::Configuration.get_instance
26 @config = Grader::Configuration.get_instance
19
27
20 - @room_maker = room_maker || Grader::SubmissionRoomMaker.new
28 + @room_maker = options[:room_maker]
21 - @reporter = reporter || Grader::SubmissionReporter.new
29 + @reporter = options[:reporter]
22 end
30 end
23
31
24 # takes a submission, asks room_maker to produce grading directories,
32 # takes a submission, asks room_maker to produce grading directories,
25 # calls grader scripts, and asks reporter to save the result
33 # calls grader scripts, and asks reporter to save the result
26 def grade(submission)
34 def grade(submission)
27 current_dir = `pwd`.chomp
35 current_dir = `pwd`.chomp
@@ -29,19 +29,27
29
29
30 def clean_up(submission)
30 def clean_up(submission)
31 end
31 end
32 end
32 end
33
33
34 class SubmissionReporter
34 class SubmissionReporter
35 - def initialize(dry_run=false)
35 + def initialize(options={})
36 + options = {:dry_run => false, :result_collector => nil}.merge(options)
36 @config = Grader::Configuration.get_instance
37 @config = Grader::Configuration.get_instance
37 - @dry_run = dry_run
38 + @dry_run = options[:dry_run]
39 + @result_collector = options[:result_collector]
38 end
40 end
39
41
40 def report(sub,test_result_dir)
42 def report(sub,test_result_dir)
41 - save_result(sub,read_result(test_result_dir))
43 + result = read_result(test_result_dir)
44 + if @result_collector
45 + @result_collector.save(sub.user,
46 + sub.problem,
47 + result)
48 + end
49 + save_result(sub,result)
42 end
50 end
43
51
44 def report_error(sub,msg)
52 def report_error(sub,msg)
45 save_result(sub,{:points => 0,
53 save_result(sub,{:points => 0,
46 :comment => "Grading error: #{msg}" })
54 :comment => "Grading error: #{msg}" })
47 end
55 end
@@ -153,14 +153,14
153 describe "A grader engine, when grading test requests" do
153 describe "A grader engine, when grading test requests" do
154
154
155 include GraderEngineHelperMethods
155 include GraderEngineHelperMethods
156
156
157 before(:each) do
157 before(:each) do
158 @config = Grader::Configuration.get_instance
158 @config = Grader::Configuration.get_instance
159 - @engine = Grader::Engine.new(Grader::TestRequestRoomMaker.new,
159 + @engine = Grader::Engine.new(:room_maker => Grader::TestRequestRoomMaker.new,
160 - Grader::TestRequestReporter.new)
160 + :reporter => Grader::TestRequestReporter.new)
161 init_sandbox
161 init_sandbox
162 end
162 end
163
163
164 it "should report error if there is no problem template" do
164 it "should report error if there is no problem template" do
165 problem = stub(Problem,
165 problem = stub(Problem,
166 :id => 1, :name => 'nothing')
166 :id => 1, :name => 'nothing')
You need to be logged in to leave comments. Login now