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.

65 lines
1.6 KiB

  1. module KGrader
  2. class Task
  3. def initialize(filesystem, course, semester, assignment)
  4. @fs = filesystem
  5. @course = course
  6. @semester = semester
  7. @assignment = @course.assignment assignment
  8. @students = @course.roster(@semester).students
  9. end
  10. def grade(options = {})
  11. submissions = get_submissions options[:students]
  12. due = options.fetch(:due, Time.now)
  13. fetch = options.fetch(:fetch, true)
  14. regrade = options.fetch(:regrade, false)
  15. count = submissions.count
  16. puts "[grading #{count} student#{'s' if count != 1}]"
  17. submissions.each do |sub|
  18. unless sub.exists?
  19. puts "[init #{sub.student}]"
  20. sub.create
  21. end
  22. end
  23. if fetch
  24. submissions.each do |sub|
  25. puts "[fetch #{sub.student}]"
  26. sub.fetch due
  27. end
  28. end
  29. submissions.each do |sub|
  30. sub.status = :ungraded if regrade
  31. if sub.status == :ungraded
  32. puts "[grade #{sub.student}]"
  33. sub.grade
  34. end
  35. end
  36. end
  37. def commit(options = {})
  38. submissions = get_submissions options[:students]
  39. # TODO
  40. puts "[committing]"
  41. puts "course => #{@course.name}"
  42. puts "semester => #{@semester}"
  43. puts "assignment => #{@assignment.name}"
  44. puts "students => #{submissions.map { |sub| sub.student }.join ', '}"
  45. end
  46. private
  47. def get_submissions(students)
  48. students.nil? ? (students = @students) : (students &= @students)
  49. students.map do |student|
  50. Submission.new @fs, @course, @semester, @assignment, student
  51. end
  52. end
  53. end
  54. end