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. 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, options = {})
  24. course = Course.new(@fs, course)
  25. semester ||= course.current_semester
  26. course.task(semester, assignment).grade options
  27. end
  28. def commit(course, semester, assignment, options = {})
  29. course = Course.new(@fs, course)
  30. semester ||= course.current_semester
  31. course.task(semester, assignment).commit options
  32. end
  33. def clean
  34. # TODO: also purge uncommitted grades
  35. clear_jail
  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