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.

81 lines
1.9 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(course, semester)
  9. if semester
  10. puts Course.new(@fs, course).roster(semester).students
  11. elsif course
  12. list_course course, 0
  13. else
  14. @fs.courses.each do |name|
  15. puts "course: #{name}"
  16. list_course name, 1
  17. end
  18. end
  19. end
  20. def roster(course, semester, rosterfile)
  21. course = Course.new(@fs, course)
  22. semester ||= course.current_semester
  23. 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. clear_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. clear_jail
  44. clear_desk
  45. end
  46. private
  47. def list_course(name, indent = 0)
  48. course = Course.new(@fs, name)
  49. pad = ' ' * indent
  50. puts "#{pad}rosters:"
  51. course.rosters.each do |roster|
  52. puts "#{pad} - #{roster.semester} (#{roster.students.size} students)"
  53. end
  54. puts "#{pad}assignments:"
  55. course.assignments.each do |assignment|
  56. puts "#{pad} - #{assignment}"
  57. end
  58. end
  59. def clear_jail
  60. FileUtils.rm_rf @fs.jail
  61. end
  62. def clear_desk
  63. FileUtils.rm_rf Dir[File.join @fs.desk, '*', '']
  64. end
  65. end
  66. end