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.

70 lines
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