#!/usr/bin/env ruby require 'fileutils' require 'optparse' require 'jkr' def ul(str) "\033[4m#{str}\033[24m" end def identity end class JkrCmd def jkr_commands() self.methods.map{|method_sym| if method_sym.to_s =~ /^([a-z_-]+)_cmd$/ $~[1] else nil end }.compact end def setup_optparser() @optparser = OptionParser.new @optparser.banner = < "analyze results", :desc => "Usage: #{$0} analyze #{ul('RESULT_ID')} ..." } end def list_cmd(argv) puts "Existing plans:" puts plans = @jkr_env.plans.map do |plan_file_path| plan = Jkr::Plan.new(@jkr_env, plan_file_path) [File.basename(plan_file_path, ".plan"), plan.title] end maxlen = plans.map{|plan| plan[0].size}.max plans.each do |plan| printf(" %#{maxlen}s : %s\n", plan[0], plan[1]) end puts end def list_cmd_help() { :summary => "list existing plans", :desc => "list existing plans" } end def run_cmd(argv) filter = (if argv.empty? lambda{|x| true} else lambda do |plan_file_path| argv.map{|arg| Regexp.compile(arg) }.any?{|regex| File.basename(plan_file_path) =~ regex } end end) @jkr_env.plans.each do |plan_file_path| if filter.call(plan_file_path) plan = Jkr::Plan.new(@jkr_env, plan_file_path) Jkr::Trial.run(@jkr_env, plan) end end end def run_cmd_help() { :summary => "run experiments", :desc => "" } end def install_cmd(argv) jkr_dir = File.join(@options[:directory], "jkr") result_dir = File.join(@options[:directory], "jkr", "result") plan_dir = File.join(@options[:directory], "jkr", "plan") [jkr_dir, result_dir, plan_dir].each{|dir| FileUtils.mkdir(dir) } File.open(File.join(plan_dir, "sample.plan"), "w") do |file| file.puts < 1..10 p.param :use_yyy => false if p.param[:use_yyy] p.param[:yyy_zzz] = "foo" else p.param[:yyy_zzz] = "bar" end end def_execution do |params| puts "hello world, #\{params.num_xxx\}, #\{params[:num_xxx]\}" end EOSS end end def install_cmd_help() { :summary => "install jkr skelton setting files", :desc => "" } end def help_cmd(argv) case argv[0] when /^commands/ commands = self.jkr_commands puts "Available commands:" max_len = commands.map(&:size).max commands.each do |command| help = self.send("#{command}_cmd_help") printf " %#{max_len}s : #{help[:summary]}\n", command end puts else commands = argv.select{|arg| self.jkr_commands.include?(arg)} if commands.size > 0 commands.each do |cmd| help = self.send("#{cmd}_cmd_help") puts("== help: #{cmd} ==\n#{help[:summary]}\n\n#{help[:desc]}\n") end else puts @optparser.help end end end def help_cmd_help() { :summary => "show helps", :desc => "" } end end def main(argv) JkrCmd.new.dispatch(argv) end if __FILE__ == $0 main(ARGV.dup) end