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.

74 lines
1.7 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. @tests ||= @config['grade'].map do |it|
  23. { :name => it.keys.first, :max => it.values.first }
  24. end
  25. end
  26. def report
  27. @config['commit']['report'] || "report.txt"
  28. end
  29. def commit_message(student)
  30. default = "Adding grade report for #{title}: {student}"
  31. template = (@config['commit']['message'] || default).clone
  32. template['{student}'] = student
  33. template
  34. end
  35. def extra_comments
  36. @config['commit']['comments'] || []
  37. end
  38. private
  39. def verify_config
  40. %w(stage build grade).each do |key|
  41. unless @config.include? key
  42. raise AssignmentError, "missing #{key} section in config: #{@name}"
  43. end
  44. end
  45. end
  46. def get_manifest
  47. stage = @config['stage']
  48. raise AssignmentError, "chroot is not supported yet" if stage['chroot']
  49. provided = stage['provided'].map do |fn|
  50. { :name => fn, :path => File.join(@root, 'provided', fn) }
  51. end
  52. graded = stage['graded'].map { |fn| { :name => fn } }
  53. { :provided => provided, :graded => graded }
  54. end
  55. def title
  56. @config['title'] || @name
  57. end
  58. end
  59. end