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.

78 lines
1.9 KiB

  1. module KGrader
  2. class CLI
  3. def initialize(dir)
  4. @fs = Filesystem.new dir
  5. end
  6. def list(course, semester)
  7. if semester
  8. puts Course.new(@fs, course).roster(semester).students
  9. elsif course
  10. list_course course, 0
  11. else
  12. @fs.courses.each do |name|
  13. puts "course: #{name}"
  14. list_course name, 1
  15. end
  16. end
  17. end
  18. def roster(course, semester, rosterfile)
  19. course = Course.new(@fs, course)
  20. semester ||= course.current_semester
  21. course.roster(semester).load rosterfile
  22. end
  23. def grade(course, semester, assignment, students = nil, options = {})
  24. course = Course.new(@fs, course)
  25. semester ||= course.current_semester
  26. course.task(semester, assignment, students).grade options
  27. end
  28. def commit(course, semester, assignment, students = nil)
  29. course = Course.new(@fs, course)
  30. semester ||= course.current_semester
  31. course.task(semester, assignment, students).commit
  32. end
  33. def clean
  34. clear_jail
  35. # TODO: also purge uncommitted grades: set all graded to ungraded and delete all pending files
  36. end
  37. def clobber
  38. puts "clobbering means deleting local student repos and roster files"
  39. print "are you sure? [y/N] "
  40. abort "aborted" unless ['y', 'yes'].include? STDIN.gets.strip.downcase
  41. clear_jail
  42. clear_desk
  43. end
  44. private
  45. def list_course(name, indent = 0)
  46. course = Course.new(@fs, name)
  47. pad = ' ' * indent
  48. puts "#{pad}rosters:"
  49. course.rosters.each do |roster|
  50. puts "#{pad} - #{roster.semester} (#{roster.students.size} students)"
  51. end
  52. puts "#{pad}assignments:"
  53. course.assignments.each do |assignment|
  54. puts "#{pad} - #{assignment.name}"
  55. end
  56. end
  57. def clear_jail
  58. FileUtils.rm_rf @fs.jail
  59. end
  60. def clear_desk
  61. FileUtils.rm_rf Dir[File.join @fs.desk, '*', '']
  62. end
  63. end
  64. end