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.

79 lines
1.8 KiB

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