A code autograder for student homework submissions
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
1.8 KiB

  1. require 'ruby-progressbar'
  2. module KGrader
  3. class Task
  4. def initialize(filesystem, course, semester, assignment, students = nil)
  5. @fs = filesystem
  6. @course = course
  7. @semester = semester
  8. @assignment = @course.assignment assignment
  9. @submissions = get_submissions students
  10. end
  11. def grade(options = {})
  12. due = options.fetch(:due, Time.now)
  13. fetch = options.fetch(:fetch, true)
  14. regrade = options.fetch(:regrade, false)
  15. subtask 'setup' do |sub|
  16. sub.create unless sub.exists?
  17. end
  18. if fetch
  19. subtask 'fetch' do |sub|
  20. sub.fetch due
  21. end
  22. end
  23. subtask 'grade' do |sub|
  24. if sub.status == :init || sub.status == :fetching
  25. next 'skip (need to fetch first)'
  26. elsif sub.status == :graded && !regrade
  27. next
  28. else
  29. sub.grade
  30. end
  31. end
  32. end
  33. def commit
  34. subtask 'commit', &:commit
  35. end
  36. private
  37. def get_submissions(students)
  38. roster = @course.roster(@semester).students
  39. students.nil? ? (students = roster) : (students &= roster)
  40. students.map do |student|
  41. Submission.new @fs, @course, @semester, @assignment, student
  42. end
  43. end
  44. def student_len
  45. @student_len ||= @submissions.map { |sub| sub.student.length }.max
  46. end
  47. def subtask(name)
  48. progress = ProgressBar.create title: name, total: @submissions.size,
  49. throttle_rate: 0, format: '%t [%b>%i] %j%% %e '
  50. @submissions.each.with_index do |sub, i|
  51. job = "#{name} [#{sub.student.ljust student_len}]"
  52. progress.title = "#{job}:"
  53. result = yield sub
  54. progress.title = name if i == @submissions.size - 1
  55. progress.log "#{job}#{': ' if result}#{result}" if result
  56. progress.increment
  57. end
  58. end
  59. end
  60. end