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.

64 lines
1.5 KiB

  1. module KGrader
  2. class Assignment
  3. attr_reader :name, :manifest
  4. def initialize(filesystem, course, name)
  5. @fs = filesystem
  6. @course = course
  7. @name = name
  8. @root = @fs.assignment @course.name, @name
  9. @config = @fs.load @fs.assignment_config(@course.name, @name)
  10. verify_config
  11. @manifest = get_manifest
  12. rescue FilesystemError
  13. raise AssignmentError, "unknown assignment: #{name}"
  14. end
  15. def id
  16. @config['id'] || @name
  17. end
  18. def build_steps
  19. @config['build']
  20. end
  21. def tests
  22. @config['grade']
  23. end
  24. def report
  25. @config['commit']['report'] || "report.txt"
  26. end
  27. def commit_message(student)
  28. default = "adding grade report for #{name}: {student}"
  29. template = @config['commit']['message'].clone || default
  30. template['{student}'] = student
  31. template
  32. end
  33. private
  34. def verify_config
  35. %w(stage build grade).each do |key|
  36. unless @config.include? key
  37. raise AssignmentError, "missing #{key} section in config: #{@name}"
  38. end
  39. end
  40. end
  41. def get_manifest
  42. stage = @config['stage']
  43. raise AssignmentError, "chroot is not supported yet" if stage['chroot']
  44. provided = stage['provided'].map do |fn|
  45. { :name => fn, :path => File.join(@root, 'provided', fn) }
  46. end
  47. graded = stage['graded'].map { |fn| { :name => fn } }
  48. { :provided => provided, :graded => graded }
  49. end
  50. end
  51. end