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.7 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 = Course.new(@fs, course)
  24. semester ||= course.current_semester
  25. course.roster(semester).load rosterfile
  26. end
  27. def grade(course, semester, assignment, options = {})
  28. course = Course.new(@fs, course)
  29. semester ||= course.current_semester
  30. course.task(semester, assignment).grade options
  31. end
  32. def commit(course, semester, assignment, options = {})
  33. course = Course.new(@fs, course)
  34. semester ||= course.current_semester
  35. course.task(semester, assignment).commit options
  36. end
  37. def clean
  38. # TODO: also purge uncommitted grades
  39. reset_jail
  40. end
  41. def clobber
  42. puts "clobbering means deleting local student repos and roster files"
  43. print "are you sure? [y/N] "
  44. abort "aborted" unless ['y', 'yes'].include? STDIN.gets.strip.downcase
  45. reset_jail
  46. reset_desk
  47. end
  48. private
  49. def reset_jail
  50. FileUtils.rm_rf @fs.jail
  51. FileUtils.mkdir @fs.jail
  52. FileUtils.touch File.join(@fs.jail, '.gitkeep')
  53. end
  54. def reset_desk
  55. FileUtils.rm_rf Dir[File.join @fs.desk, '*', '']
  56. end
  57. end
  58. end