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: 95 inserted, 21 deleted

@@ -56,12 +56,6
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]
@@ -115,14 +109,65
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]
@@ -174,8 +219,8
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)
@@ -198,11 +243,20
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)
208 if prob==nil
262 if prob==nil
@@ -212,6 +266,10
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)
@@ -14,11 +14,19
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,
@@ -32,13 +32,21
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)
@@ -156,8 +156,8
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
You need to be logged in to leave comments. Login now