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.

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