Browse Source

Extend list, improve arg parsing for roster.

master
Ben Kurtovic 8 years ago
parent
commit
3dae85e141
4 changed files with 45 additions and 32 deletions
  1. +8
    -8
      README.md
  2. +24
    -13
      lib/kgrader/cli.rb
  3. +4
    -3
      lib/kgrader/util.rb
  4. +9
    -8
      rakefile

+ 8
- 8
README.md View File

@@ -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`.

+ 24
- 13
lib/kgrader/cli.rb View File

@@ -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


+ 4
- 3
lib/kgrader/util.rb View File

@@ -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




+ 9
- 8
rakefile View File

@@ -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


Loading…
Cancel
Save