| @@ -31,18 +31,18 @@ To show all known classes, semesters, and assignments: | |||||
| rake list | rake list | ||||
| To load a roster (a newline-delimited list of student identifiers) for a | |||||
| specific semester: | |||||
| To load a roster (a newline-delimited list of student identifiers) for the | |||||
| current semester of a particular course (e.g. "cs123"): | |||||
| rake roster cs123 myroster.csv semester=sp16 | |||||
| rake roster cs123 myroster.csv | |||||
| To load a roster for the current semester: | |||||
| You can also specify the semester: | |||||
| rake roster cs123 myroster.csv | |||||
| rake roster cs123 myroster.csv sp16 | |||||
| ### Grading | ### Grading | ||||
| To grade a particular assignment (e.g., "mp1" for the "cs123" course): | |||||
| To grade a particular assignment (e.g., "mp1" for "cs123"): | |||||
| rake grade cs123 mp1 | rake grade cs123 mp1 | ||||
| @@ -88,5 +88,5 @@ repo has changed since the last run. To forcibly regrade: | |||||
| rake grade cs123 mp1 regrade=yes | rake grade cs123 mp1 regrade=yes | ||||
| You can combine these arguments in any meaningful way. `semester` is available | |||||
| for `roster` and `commit`, and and `students` is available for `commit`. | |||||
| You can combine these arguments in any meaningful way. `semester` and | |||||
| `students` are also available options for `commit`. | |||||
| @@ -8,19 +8,15 @@ module KGrader | |||||
| @fs = Filesystem.new dir | @fs = Filesystem.new dir | ||||
| end | end | ||||
| def list | |||||
| @fs.courses.each do |name| | |||||
| puts "course: #{name}" | |||||
| course = Course.new(@fs, name) | |||||
| puts " rosters:" | |||||
| course.rosters.each do |roster| | |||||
| puts " - #{roster.semester} (#{roster.students.size} students)" | |||||
| end | |||||
| puts " assignments:" | |||||
| course.assignments.each do |assignment| | |||||
| puts " - #{assignment}" | |||||
| def list(course, semester) | |||||
| if semester | |||||
| puts Course.new(@fs, course).roster(semester).students | |||||
| elsif course | |||||
| list_course course, 0 | |||||
| else | |||||
| @fs.courses.each do |name| | |||||
| puts "course: #{name}" | |||||
| list_course name, 1 | |||||
| end | end | ||||
| end | end | ||||
| end | end | ||||
| @@ -58,6 +54,21 @@ module KGrader | |||||
| end | end | ||||
| private | private | ||||
| def list_course(name, indent = 0) | |||||
| course = Course.new(@fs, name) | |||||
| pad = ' ' * indent | |||||
| puts "#{pad}rosters:" | |||||
| course.rosters.each do |roster| | |||||
| puts "#{pad} - #{roster.semester} (#{roster.students.size} students)" | |||||
| end | |||||
| puts "#{pad}assignments:" | |||||
| course.assignments.each do |assignment| | |||||
| puts "#{pad} - #{assignment}" | |||||
| end | |||||
| end | |||||
| def reset_jail | def reset_jail | ||||
| FileUtils.rm_rf @fs.jail | FileUtils.rm_rf @fs.jail | ||||
| FileUtils.mkdir @fs.jail | FileUtils.mkdir @fs.jail | ||||
| @@ -1,7 +1,7 @@ | |||||
| require 'time' | require 'time' | ||||
| module KGrader | module KGrader | ||||
| def self.parse_args(raw, num, keywords) | |||||
| def self.parse_args(raw, range, keywords) | |||||
| args = [] | args = [] | ||||
| options = {} | options = {} | ||||
| @@ -27,8 +27,9 @@ module KGrader | |||||
| end | end | ||||
| end | end | ||||
| raise ArgumentError, "too few arguments" if args.size < num | |||||
| raise ArgumentError, "too many arguments" if args.size > num | |||||
| raise ArgumentError, "too few arguments" if args.size < range.begin | |||||
| raise ArgumentError, "too many arguments" if args.size > range.end | |||||
| args[range.end - 1] = nil unless args.size == range.end | |||||
| return args, options | return args, options | ||||
| end | end | ||||
| @@ -12,7 +12,7 @@ end | |||||
| def parse_args(num, keywords = {}) | def parse_args(num, keywords = {}) | ||||
| args, options = KGrader::parse_args ARGV.drop(1), num, keywords | args, options = KGrader::parse_args ARGV.drop(1), num, keywords | ||||
| args.each { |arg| task arg.to_sym {} } | |||||
| args.each { |arg| task arg.to_sym {} unless arg.nil? } | |||||
| args + [options] | args + [options] | ||||
| rescue KGrader::KGraderError => err | rescue KGrader::KGraderError => err | ||||
| die err | die err | ||||
| @@ -22,8 +22,8 @@ task :default => :help do ; end | |||||
| task :help do | task :help do | ||||
| puts %{usage: | puts %{usage: | ||||
| - rake list | |||||
| - rake roster <course> <rosterfile> [semester=<...>] | |||||
| - rake list [<course>] [<semester>] | |||||
| - rake roster <course> <rosterfile> [<semester>] | |||||
| - rake grade <course> <assignment> [semester=<...>] [students=<...>] | - rake grade <course> <assignment> [semester=<...>] [students=<...>] | ||||
| [due=<...>] [fetch=<yes/no>] [regrade=<yes/no>] | [due=<...>] [fetch=<yes/no>] [regrade=<yes/no>] | ||||
| - rake commit <course> <assignment> [semester=<...>] [students=<...>] | - rake commit <course> <assignment> [semester=<...>] [students=<...>] | ||||
| @@ -32,23 +32,24 @@ task :help do | |||||
| end | end | ||||
| task :list do | task :list do | ||||
| run { |cli| cli.list } | |||||
| course, semester = parse_args 0..2 | |||||
| run { |cli| cli.list course, semester } | |||||
| end | end | ||||
| task :roster do | task :roster do | ||||
| course, rosterfile, options = parse_args 2, { :semester => :string } | |||||
| run { |cli| cli.roster course, options[:semester], rosterfile } | |||||
| course, rosterfile, semester = parse_args 2..3 | |||||
| run { |cli| cli.roster course, semester, rosterfile } | |||||
| end | end | ||||
| task :grade do | task :grade do | ||||
| course, assignment, options = parse_args 2, | |||||
| course, assignment, options = parse_args 2..2, | |||||
| { :semester => :string, :students => :array, :due => :time, | { :semester => :string, :students => :array, :due => :time, | ||||
| :fetch => :bool, :regrade => :bool } | :fetch => :bool, :regrade => :bool } | ||||
| run { |cli| cli.grade course, options[:semester], assignment, options } | run { |cli| cli.grade course, options[:semester], assignment, options } | ||||
| end | end | ||||
| task :commit do | task :commit do | ||||
| course, assignment, options = parse_args 2, | |||||
| course, assignment, options = parse_args 2..2, | |||||
| { :semester => :string, :students => :array } | { :semester => :string, :students => :array } | ||||
| run { |cli| cli.commit course, options[:semester], assignment, options } | run { |cli| cli.commit course, options[:semester], assignment, options } | ||||
| end | end | ||||