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.

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