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