A code autograder for student homework submissions
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

72 lignes
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