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.

70 lignes
1.5 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. # -------------------------------------------------------------------------
  17. def course(name)
  18. File.join spec, name
  19. end
  20. def course_config(name)
  21. File.join course(name), '_config.yml'
  22. end
  23. def assignment(courseid, name)
  24. File.join course(courseid), name, '_config.yml'
  25. end
  26. def roster(courseid, semester)
  27. File.join desk, courseid, semester, '_roster.csv'
  28. end
  29. # -------------------------------------------------------------------------
  30. def courses
  31. Dir[File.join spec, '*', ''].map! { |fn| File.basename fn }
  32. end
  33. def assignments(courseid)
  34. Dir[assignment courseid '*'].map! { |fn| File.basename File.dirname fn }
  35. end
  36. def semesters(courseid)
  37. Dir[roster courseid, '*'].map! { |fn| File.basename File.dirname fn }
  38. end
  39. # -------------------------------------------------------------------------
  40. def load(path)
  41. case File.extname path
  42. when '.yml', '.yaml'
  43. YAML.load File.read(path)
  44. when '.csv'
  45. File.read(path).split("\n").map! { |line| line.split "," }
  46. else
  47. raise FilesystemError, "unknown file type: #{path}"
  48. end
  49. rescue SystemCallError # Errno::ENOENT, etc.
  50. raise FilesystemError, "can't read file: #{path}"
  51. end
  52. end
  53. end