@@ -27,6 +27,10 @@ kgrader uses rake as its command-line interface. | |||||
### Setup | ### Setup | ||||
To show all known classes, semesters, and assignments: | |||||
rake list | |||||
To load a roster for a course semester: | To load a roster for a course semester: | ||||
rake roster cs123 sp2016 myroster.csv | rake roster cs123 sp2016 myroster.csv | ||||
@@ -43,10 +47,6 @@ After verifying that everything looks good, push the grade reports with: | |||||
### Housekeeping | ### Housekeeping | ||||
To show all known classes, semesters, and assignments: | |||||
rake list | |||||
To do some basic cleanup (i.e., trash uncommitted grading attempts, or reset | To do some basic cleanup (i.e., trash uncommitted grading attempts, or reset | ||||
messy internal state after a bad run): | messy internal state after a bad run): | ||||
@@ -63,7 +63,7 @@ but also delete checked-out student repos and roster files -- dangerous!): | |||||
To specify the semester, instead of the inferred current one: | To specify the semester, instead of the inferred current one: | ||||
rake grade cs123 mp1 semester=sp2016 | |||||
rake grade cs123 mp1 semester=sp16 | |||||
To set a cutoff date after which commits will be ignored: | To set a cutoff date after which commits will be ignored: | ||||
@@ -1 +1,2 @@ | |||||
require_relative 'kgrader/cli' | require_relative 'kgrader/cli' | ||||
require_relative 'kgrader/util' |
@@ -5,6 +5,43 @@ module KGrader | |||||
@dir = dir | @dir = dir | ||||
end | end | ||||
def list | |||||
# TODO | |||||
puts "[list]" | |||||
end | |||||
def roster(course, semester, rosterfile) | |||||
# TODO | |||||
puts "[installing roster: c=#{course} s=#{semester} rf=#{rosterfile}]" | |||||
end | |||||
def grade(course, semester, assignment, options = {}) | |||||
# TODO | |||||
puts "[grading c=#{course} s=#{semester} a=#{assignment}]" | |||||
puts " - [students=#{options[:students].inspect}]" | |||||
puts " - [due=#{options[:due].inspect}]" | |||||
puts " - [fetch=#{options.fetch(:fetch, true).inspect}]" | |||||
puts " - [regrade=#{options.fetch(:regrade, false).inspect}]" | |||||
end | |||||
def commit(course, semester, assignment, options = {}) | |||||
# TODO | |||||
puts "[committing c=#{course} s=#{semester} a=#{assignment}]" | |||||
puts " - [students=#{options[:students].inspect}]" | |||||
end | |||||
def clean | |||||
# TODO: also purge uncommitted grades | |||||
reset_jail | |||||
end | |||||
def clobber | |||||
# TODO: confirm | |||||
reset_jail | |||||
reset_desk | |||||
end | |||||
private | |||||
def reset_jail | def reset_jail | ||||
jail_dir = File.join(@dir, 'jail') | jail_dir = File.join(@dir, 'jail') | ||||
FileUtils.rm_rf jail_dir | FileUtils.rm_rf jail_dir | ||||
@@ -0,0 +1,32 @@ | |||||
require 'date' | |||||
module KGrader | |||||
def self.parse_args(raw, num, keywords) | |||||
args = [] | |||||
options = {} | |||||
raw.each do |arg| | |||||
if arg.include? '=' | |||||
key, val = arg.split('=', 2) | |||||
key = key.to_sym | |||||
yield "unknown keyword #{key}" unless keywords.include? key | |||||
options[key] = case keywords[key] | |||||
when :string | |||||
val | |||||
when :bool | |||||
%w(true yes 1 t y).include? val.downcase | |||||
when :array | |||||
val.split(",").map! { |x| x.strip.downcase } | |||||
when :datetime | |||||
DateTime.parse(val) | |||||
end | |||||
else | |||||
args << arg | |||||
end | |||||
end | |||||
yield "too few arguments" if args.size < num | |||||
yield "too many arguments" if args.size > num | |||||
return args, options | |||||
end | |||||
end |
@@ -1,50 +1,56 @@ | |||||
require_relative 'lib/kgrader' | require_relative 'lib/kgrader' | ||||
def get_cli | |||||
def cli | |||||
KGrader::CLI.new Rake.application.original_dir | KGrader::CLI.new Rake.application.original_dir | ||||
end | end | ||||
task :clean do | |||||
cli = get_cli | |||||
# TODO: also purge uncommitted grades | |||||
cli.reset_jail | |||||
def parse_args(num, keywords) | |||||
args, options = KGrader::parse_args ARGV.drop(1), num, keywords do |err| | |||||
abort err | |||||
end | |||||
args.each { |arg| task arg.to_sym {} } | |||||
args + [options] | |||||
end | end | ||||
task :clobber do | |||||
cli = get_cli | |||||
# TODO: confirm | |||||
cli.reset_jail | |||||
cli.reset_desk | |||||
task :default => :help do ; end | |||||
task :help do | |||||
puts %{usage: | |||||
- rake list | |||||
- rake roster <course> <semester> <rosterfile> | |||||
- rake grade <course> <assignment> [semester=<...>] [students=<...>] | |||||
[due=<...>] [fetch=<yes/no>] [regrade=<yes/no>] | |||||
- rake commit <course> <assignment> [semester=<...>] [students=<...>] | |||||
- rake clean | |||||
- rake clobber} | |||||
end | end | ||||
task :list do | task :list do | ||||
# TODO | |||||
puts '[list!]' | |||||
cli.list | |||||
end | end | ||||
task :roster do | task :roster do | ||||
# TODO: [course, assignment, rosterfile] | |||||
puts '[installing roster!]' | |||||
course, semester, rosterfile = parse_args 3 | |||||
cli.roster course, semester, rosterfile | |||||
end | end | ||||
task :grade do | task :grade do | ||||
puts ARGV.inspect | |||||
course = ARGV[1] | |||||
assignment = ARGV[2] | |||||
course, assignment, options = parse_args 2, | |||||
{ :semester => :string, :students => :array, :due => :datetime, | |||||
:fetch => :bool, :regrade => :bool } | |||||
cli.grade course, options[:semester], assignment, options | |||||
end | |||||
task course.to_sym {} | |||||
task assignment.to_sym {} | |||||
task :commit do | |||||
course, assignment, options = parse_args 2, | |||||
{ :semester => :string, :students => :array } | |||||
cli.commit course, options[:semester], assignment, options | |||||
end | |||||
# TODO | |||||
puts "Grading #{assignment} for #{course}..." | |||||
puts " - semester:" | |||||
puts " - due:" | |||||
puts " - fetch:" | |||||
puts " - students:" | |||||
puts " - regrade:" | |||||
task :clean do | |||||
cli.clean | |||||
end | end | ||||
task :commit do | |||||
# TODO: [course, assignment], semester=, students= | |||||
puts '[committing!]' | |||||
task :clobber do | |||||
cli.clobber | |||||
end | end |
@@ -1 +1 @@ | |||||
Subproject commit a0a432cb96f38c230355e3e5b12bbf131beb04bd | |||||
Subproject commit 54398ad4a16ac3d9f7344ecf680f4dd167e05818 |