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.

85 lines
2.1 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, students = nil, options = {})
  24. course = Course.new(@fs, course)
  25. semester ||= course.current_semester
  26. course.task(semester, assignment, students).grade options
  27. end
  28. def commit(course, semester, assignment, students = nil)
  29. course = Course.new(@fs, course)
  30. semester ||= course.current_semester
  31. course.task(semester, assignment, students).commit
  32. end
  33. def clean
  34. clear_jail
  35. clean_desk
  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. def clean_desk
  64. Dir[File.join @fs.desk, '*', '*', '*', '*', 'status.txt'].each do |fn|
  65. File.write fn, "ungraded" if File.read(fn) == "graded"
  66. end
  67. FileUtils.rm_rf Dir[File.join @fs.desk, '*', '*', '*', '*', 'pending']
  68. end
  69. end
  70. end