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.8 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 = fetch_course course
  24. semester ||= course.current_semester
  25. course.roster(semester).load rosterfile
  26. end
  27. def grade(course, semester, assignment, options = {})
  28. course = fetch_course course
  29. semester ||= course.current_semester
  30. course.task(semester, assignment).grade options
  31. end
  32. def commit(course, semester, assignment, options = {})
  33. course = fetch_course 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 fetch_course(course)
  50. Course.new(@fs, course)
  51. rescue FilesystemError
  52. KGrader::die "unknown course"
  53. end
  54. def reset_jail
  55. FileUtils.rm_rf @fs.jail
  56. FileUtils.mkdir @fs.jail
  57. FileUtils.touch File.join(@fs.jail, '.gitkeep')
  58. end
  59. def reset_desk
  60. FileUtils.rm_rf Dir[File.join @fs.desk, '*', '']
  61. end
  62. end
  63. end