| @@ -1,3 +1,4 @@ | |||||
| require_relative 'kgrader/assignment' | |||||
| require_relative 'kgrader/cli' | require_relative 'kgrader/cli' | ||||
| require_relative 'kgrader/course' | require_relative 'kgrader/course' | ||||
| require_relative 'kgrader/errors' | require_relative 'kgrader/errors' | ||||
| @@ -0,0 +1,15 @@ | |||||
| module KGrader | |||||
| class Assignment | |||||
| attr_reader :name | |||||
| def initialize(filesystem, course, name) | |||||
| @fs = filesystem | |||||
| @course = course | |||||
| @name = name | |||||
| @config = @fs.load @fs.assignment(@course.name, @name) | |||||
| rescue FilesystemError | |||||
| raise AssignmentError, "unknown assignment: #{name}" | |||||
| end | |||||
| end | |||||
| end | |||||
| @@ -1,6 +1,3 @@ | |||||
| require_relative 'course' | |||||
| require_relative 'filesystem' | |||||
| module KGrader | module KGrader | ||||
| class CLI | class CLI | ||||
| @@ -65,7 +62,7 @@ module KGrader | |||||
| puts "#{pad}assignments:" | puts "#{pad}assignments:" | ||||
| course.assignments.each do |assignment| | course.assignments.each do |assignment| | ||||
| puts "#{pad} - #{assignment}" | |||||
| puts "#{pad} - #{assignment.name}" | |||||
| end | end | ||||
| end | end | ||||
| @@ -1,6 +1,3 @@ | |||||
| require_relative 'roster' | |||||
| require_relative 'task' | |||||
| module KGrader | module KGrader | ||||
| class Course | class Course | ||||
| attr_reader :name | attr_reader :name | ||||
| @@ -11,6 +8,7 @@ module KGrader | |||||
| @config = @fs.load @fs.course_config(@name) | @config = @fs.load @fs.course_config(@name) | ||||
| @rosters = {} | @rosters = {} | ||||
| @assignments = {} | |||||
| rescue FilesystemError | rescue FilesystemError | ||||
| raise CourseError, "unknown or invalid course: #{name}" | raise CourseError, "unknown or invalid course: #{name}" | ||||
| end | end | ||||
| @@ -19,6 +17,10 @@ module KGrader | |||||
| @rosters[semester] ||= Roster.new @fs, self, semester | @rosters[semester] ||= Roster.new @fs, self, semester | ||||
| end | end | ||||
| def assignment(name) | |||||
| @assignments[name] ||= Assignment.new @fs, self, name | |||||
| end | |||||
| def task(semester, assignment) | def task(semester, assignment) | ||||
| Task.new @fs, self, semester, assignment | Task.new @fs, self, semester, assignment | ||||
| end | end | ||||
| @@ -28,7 +30,7 @@ module KGrader | |||||
| end | end | ||||
| def assignments | def assignments | ||||
| @fs.assignments @name | |||||
| @fs.assignments(@name).map! { |name| assignment name } | |||||
| end | end | ||||
| def current_semester | def current_semester | ||||
| @@ -14,6 +14,9 @@ module KGrader | |||||
| class CourseError < KGraderError | class CourseError < KGraderError | ||||
| end | end | ||||
| class AssignmentError < KGraderError | |||||
| end | |||||
| class RosterError < KGraderError | class RosterError < KGraderError | ||||
| end | end | ||||
| end | end | ||||
| @@ -19,6 +19,8 @@ module KGrader | |||||
| File.join @root, 'spec' | File.join @root, 'spec' | ||||
| end | end | ||||
| # ------------------------------------------------------------------------- | |||||
| def course(name) | def course(name) | ||||
| File.join spec, name | File.join spec, name | ||||
| end | end | ||||
| @@ -27,24 +29,30 @@ module KGrader | |||||
| File.join course(name), '_config.yml' | File.join course(name), '_config.yml' | ||||
| end | end | ||||
| def roster(course_name, semester) | |||||
| File.join desk, course_name, semester, '_roster.csv' | |||||
| def assignment(courseid, name) | |||||
| File.join course(courseid), name, '_config.yml' | |||||
| end | |||||
| def roster(courseid, semester) | |||||
| File.join desk, courseid, semester, '_roster.csv' | |||||
| end | end | ||||
| # ------------------------------------------------------------------------- | |||||
| def courses | def courses | ||||
| Dir[File.join spec, '*', ''].map! { |fn| File.basename fn } | Dir[File.join spec, '*', ''].map! { |fn| File.basename fn } | ||||
| end | end | ||||
| def assignments(course_name) | |||||
| Dir[File.join course(course_name), '*', '_config.yml'].map! do |fn| | |||||
| File.basename File.dirname fn | |||||
| end | |||||
| def assignments(courseid) | |||||
| Dir[assignment courseid '*'].map! { |fn| File.basename File.dirname fn } | |||||
| end | end | ||||
| def semesters(course_name) | |||||
| Dir[roster course_name, '*'].map! { |fn| File.basename File.dirname fn } | |||||
| def semesters(courseid) | |||||
| Dir[roster courseid, '*'].map! { |fn| File.basename File.dirname fn } | |||||
| end | end | ||||
| # ------------------------------------------------------------------------- | |||||
| def load(path) | def load(path) | ||||
| case File.extname path | case File.extname path | ||||
| when '.yml', '.yaml' | when '.yml', '.yaml' | ||||
| @@ -5,7 +5,8 @@ module KGrader | |||||
| @fs = filesystem | @fs = filesystem | ||||
| @course = course | @course = course | ||||
| @semester = semester | @semester = semester | ||||
| @assignment = assignment | |||||
| @assignment = @course.assignment assignment | |||||
| @students = @course.roster(@semester).students | @students = @course.roster(@semester).students | ||||
| end | end | ||||
| @@ -18,7 +19,7 @@ module KGrader | |||||
| regrade = options.fetch(:regrade, false) | regrade = options.fetch(:regrade, false) | ||||
| # TODO | # TODO | ||||
| puts "Grading #{@course.name}:#{@semester} assignment #{@assignment}..." | |||||
| puts "Grading #{@course.name}:#{@semester} assignment #{@assignment.name}..." | |||||
| puts "- students: #{students.inspect}" | puts "- students: #{students.inspect}" | ||||
| puts "- due: #{due}" | puts "- due: #{due}" | ||||
| puts "- fetch: #{fetch}" | puts "- fetch: #{fetch}" | ||||
| @@ -30,7 +31,7 @@ module KGrader | |||||
| students &= options[:students] unless options[:students].nil? | students &= options[:students] unless options[:students].nil? | ||||
| # TODO | # TODO | ||||
| puts "Committing #{@course.name}:#{@semester} assignment #{@assignment}..." | |||||
| puts "Committing #{@course.name}:#{@semester} assignment #{@assignment.name}..." | |||||
| puts "- students: #{students.inspect}" | puts "- students: #{students.inspect}" | ||||
| end | end | ||||
| end | end | ||||