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.

62 lignes
1.2 KiB

  1. require 'yaml'
  2. module KGrader
  3. class Filesystem
  4. def initialize(root)
  5. @root = root
  6. end
  7. def desk
  8. File.join @root, 'desk'
  9. end
  10. def jail
  11. File.join @root, 'jail'
  12. end
  13. def spec
  14. File.join @root, 'spec'
  15. end
  16. def course(name)
  17. File.join spec, name
  18. end
  19. def course_config(name)
  20. File.join course(name), '_config.yml'
  21. end
  22. def roster(course_name, semester)
  23. File.join desk, course_name, semester, '_roster.csv'
  24. end
  25. def courses
  26. Dir[File.join spec, '*', ''].map! { |fn| File.basename fn }
  27. end
  28. def assignments(course_name)
  29. Dir[File.join course(course_name), '*', '_config.yml'].map! do |fn|
  30. File.basename File.dirname fn
  31. end
  32. end
  33. def semesters(course_name)
  34. Dir[roster course_name, '*'].map! { |fn| File.basename File.dirname fn }
  35. end
  36. def load(path)
  37. case File.extname path
  38. when '.yml', '.yaml'
  39. YAML.load File.read(path)
  40. when '.csv'
  41. File.read(path).split("\n").map! { |line| line.split "," }
  42. else
  43. raise FilesystemError, "unknown file type: #{path}"
  44. end
  45. rescue SystemCallError # Errno::ENOENT, etc.
  46. raise FilesystemError, "can't read file: #{path}"
  47. end
  48. end
  49. end