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.

70 lines
1.6 KiB

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