jkr 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/etc/zsh-comp.sh +4 -1
- data/lib/jkr/cli.rb +67 -10
- data/lib/jkr/env.rb +60 -1
- data/lib/jkr/plan.rb +24 -4
- data/lib/jkr/trial.rb +93 -26
- data/lib/jkr/version.rb +1 -1
- metadata +2 -3
- data/Gemfile.lock +0 -81
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: c2aa3b45798602f7adfa2ef39671bbd0c67248ad
         | 
| 4 | 
            +
              data.tar.gz: 9033b8152c9b54663ba76df543cb11546bdb5f39
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 9dc067dcb1007050e2317a34a2c6afa23a1dd82caa66b06fdef2e58b8d2779fab496780f39efedfbbd338cd41d7408faf3569273cb608eefa4cf3772c2f45128
         | 
| 7 | 
            +
              data.tar.gz: 37d50d20c882cde08ed6527131f5d3ed4c2e690c60c7f05052727bb5244877449aa36ad45310e0e12a0e19f9c61696309f70891a06b7c892b3839cdf2f68962e
         | 
    
        data/.gitignore
    CHANGED
    
    
    
        data/etc/zsh-comp.sh
    CHANGED
    
    | @@ -76,7 +76,10 @@ _jkr() { | |
| 76 76 |  | 
| 77 77 | 
             
            __jkr_subcmds() {
         | 
| 78 78 | 
             
                _values 'Jkr command' \
         | 
| 79 | 
            +
                        'init[Init a Jkr environment]' \
         | 
| 79 80 | 
             
                        'execute[Execute a plan]' \
         | 
| 81 | 
            +
                        'resume[Resume in-progress execution]' \
         | 
| 80 82 | 
             
                        'list[List jkr plans]' \
         | 
| 81 | 
            -
                        'analyze[Analyze a result]'
         | 
| 83 | 
            +
                        'analyze[Analyze a result]' \
         | 
| 84 | 
            +
                        'query[Query interesting result]'
         | 
| 82 85 | 
             
            }
         | 
    
        data/lib/jkr/cli.rb
    CHANGED
    
    | @@ -43,13 +43,7 @@ module Jkr | |
| 43 43 |  | 
| 44 44 | 
             
                desc "list", "List executable plans"
         | 
| 45 45 | 
             
                def list()
         | 
| 46 | 
            -
                   | 
| 47 | 
            -
                    @jkr_env = Jkr::Env.new(options[:directory])
         | 
| 48 | 
            -
                  rescue Errno::ENOENT
         | 
| 49 | 
            -
                    puts(red("[ERROR] jkr dir not found at #{@options[:directory]}"))
         | 
| 50 | 
            -
                    puts(red("        Maybe you are in a wrong directory."))
         | 
| 51 | 
            -
                    exit(false)
         | 
| 52 | 
            -
                  end
         | 
| 46 | 
            +
                  @jkr_env = create_env()
         | 
| 53 47 |  | 
| 54 48 | 
             
                  plans = Dir.glob("#{@jkr_env.jkr_plan_dir}/*.plan").map do |plan_file_path|
         | 
| 55 49 | 
             
                    plan = Jkr::Plan.create_by_name(@jkr_env, File.basename(plan_file_path, ".plan"))
         | 
| @@ -74,7 +68,7 @@ module Jkr | |
| 74 68 |  | 
| 75 69 | 
             
                desc "execute <plan> [<plan> ...]", "Execute plans"
         | 
| 76 70 | 
             
                def execute(*plan_names)
         | 
| 77 | 
            -
                  @jkr_env =  | 
| 71 | 
            +
                  @jkr_env = create_env()
         | 
| 78 72 |  | 
| 79 73 | 
             
                  if options[:debug]
         | 
| 80 74 | 
             
                    delete_files_on_error = false
         | 
| @@ -89,21 +83,84 @@ module Jkr | |
| 89 83 | 
             
                  end
         | 
| 90 84 | 
             
                end
         | 
| 91 85 |  | 
| 92 | 
            -
                desc " | 
| 86 | 
            +
                desc "resume [<result> ...]", "Resume in-progress execution"
         | 
| 87 | 
            +
                def resume(*result_ids)
         | 
| 88 | 
            +
                  @jkr_env = create_env()
         | 
| 89 | 
            +
                  cur_result_id = Jkr::Env.find_result(Dir.pwd)
         | 
| 90 | 
            +
                  if cur_result_id
         | 
| 91 | 
            +
                    result_ids.push(cur_result_id)
         | 
| 92 | 
            +
                  end
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                  result_ids.each do |rid|
         | 
| 95 | 
            +
                    plan = Plan.create_by_result_id(@jkr_env, rid)
         | 
| 96 | 
            +
                    Jkr::Trial.resume(@jkr_env, plan)
         | 
| 97 | 
            +
                  end
         | 
| 98 | 
            +
                end
         | 
| 99 | 
            +
             | 
| 100 | 
            +
                desc "analyze [<result> ...]", "Run analysis script for executed results"
         | 
| 93 101 | 
             
                def analyze(*result_ids)
         | 
| 94 | 
            -
                  @jkr_env =  | 
| 102 | 
            +
                  @jkr_env = create_env()
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                  # check if current dir is a result dir
         | 
| 105 | 
            +
                  cur_result_id = Jkr::Env.find_result(Dir.pwd)
         | 
| 106 | 
            +
                  if cur_result_id
         | 
| 107 | 
            +
                    result_ids.push(cur_result_id)
         | 
| 108 | 
            +
                  end
         | 
| 95 109 |  | 
| 96 110 | 
             
                  result_ids.each do |arg|
         | 
| 97 111 | 
             
                    Jkr::Analysis.analyze(@jkr_env, arg)
         | 
| 98 112 | 
             
                  end
         | 
| 99 113 | 
             
                end
         | 
| 100 114 |  | 
| 115 | 
            +
                desc "query <result>", "Query interesting result"
         | 
| 116 | 
            +
                def query(result_id = nil)
         | 
| 117 | 
            +
                  @jkr_env = create_env()
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                  if result_id == nil
         | 
| 120 | 
            +
                    # check if current dir is a result dir
         | 
| 121 | 
            +
                    cur_result_id = Jkr::Env.find_result(Dir.pwd)
         | 
| 122 | 
            +
                    if cur_result_id
         | 
| 123 | 
            +
                      result_id = cur_result_id
         | 
| 124 | 
            +
                    else
         | 
| 125 | 
            +
                      raise ArgumentError.new("Result ID must be specified.")
         | 
| 126 | 
            +
                    end
         | 
| 127 | 
            +
                  end
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                  result_dir = Dir.glob(sprintf("#{@jkr_env.jkr_result_dir}/%05d*", result_id.to_i)).first
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                  Dir.glob("#{result_dir}/[0-9][0-9][0-9][0-9][0-9]/metastore.msh").sort.each do |m|
         | 
| 132 | 
            +
                    metastore = Marshal.load(File.open(m))
         | 
| 133 | 
            +
                    params = Marshal.load(File.open(File.expand_path("../params.msh", m)))
         | 
| 134 | 
            +
             | 
| 135 | 
            +
                    disp = metastore[:vars].map do |var|
         | 
| 136 | 
            +
                      "#{var}: #{params[var].inspect}"
         | 
| 137 | 
            +
                    end.join(", ")
         | 
| 138 | 
            +
             | 
| 139 | 
            +
                    puts "#{File.basename(File.dirname(m))}	| #{disp}"
         | 
| 140 | 
            +
                  end
         | 
| 141 | 
            +
                end
         | 
| 142 | 
            +
             | 
| 101 143 | 
             
                no_commands do
         | 
| 102 144 | 
             
                  def find_plan_file(plan_name)
         | 
| 103 145 | 
             
                    @jkr_env.plans.find do |plan_file_path|
         | 
| 104 146 | 
             
                      File.basename(plan_file_path) == plan_name + ".plan"
         | 
| 105 147 | 
             
                    end
         | 
| 106 148 | 
             
                  end
         | 
| 149 | 
            +
             | 
| 150 | 
            +
                  def create_env()
         | 
| 151 | 
            +
                    begin
         | 
| 152 | 
            +
                      if options[:directory]
         | 
| 153 | 
            +
                        return Jkr::Env.new(options[:directory])
         | 
| 154 | 
            +
                      else
         | 
| 155 | 
            +
                        return Jkr::Env.new(Jkr::Env.find(Dir.pwd))
         | 
| 156 | 
            +
                      end
         | 
| 157 | 
            +
                    rescue Errno::ENOENT
         | 
| 158 | 
            +
                      $stderr.puts(red("[ERROR] jkr dir not found at #{@options[:directory]}"))
         | 
| 159 | 
            +
                      $stderr.puts(red("        Maybe you are in a wrong directory."))
         | 
| 160 | 
            +
                      exit(false)
         | 
| 161 | 
            +
                    end
         | 
| 162 | 
            +
             | 
| 163 | 
            +
                  end
         | 
| 107 164 | 
             
                end
         | 
| 108 165 | 
             
              end
         | 
| 109 166 |  | 
    
        data/lib/jkr/env.rb
    CHANGED
    
    | @@ -21,7 +21,7 @@ module Jkr | |
| 21 21 | 
             
                  @jkr_result_dir = File.join(@jkr_dir, RESULT_DIR)
         | 
| 22 22 | 
             
                  @jkr_script_dir = File.join(@jkr_dir, SCRIPT_DIR)
         | 
| 23 23 |  | 
| 24 | 
            -
                  unless Dir.exists?(@ | 
| 24 | 
            +
                  unless Dir.exists?(@env_dir)
         | 
| 25 25 | 
             
                    raise Errno::ENOENT.new(@jkr_dir)
         | 
| 26 26 | 
             
                  end
         | 
| 27 27 |  | 
| @@ -34,5 +34,64 @@ module Jkr | |
| 34 34 | 
             
                    end
         | 
| 35 35 | 
             
                  end
         | 
| 36 36 | 
             
                end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                def self.valid_env_dir?(dir)
         | 
| 39 | 
            +
                  jkr_dir = File.expand_path("jkr", dir)
         | 
| 40 | 
            +
                  plan_dir = File.expand_path("plan", jkr_dir)
         | 
| 41 | 
            +
                  script_dir = File.expand_path("script", jkr_dir)
         | 
| 42 | 
            +
                  result_dir = File.expand_path("result", jkr_dir)
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                  [jkr_dir, result_dir, plan_dir, script_dir].each do |dir_|
         | 
| 45 | 
            +
                    unless Dir.exists?(dir_)
         | 
| 46 | 
            +
                      return false
         | 
| 47 | 
            +
                    end
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  true
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                # Find Jkr env dir if 'dir' is under an valid Jkr environemnt directory.
         | 
| 54 | 
            +
                def self.find(dir)
         | 
| 55 | 
            +
                  dir = File.expand_path("./", dir)
         | 
| 56 | 
            +
                  while true
         | 
| 57 | 
            +
                    if valid_env_dir?(dir)
         | 
| 58 | 
            +
                      return dir
         | 
| 59 | 
            +
                    end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                    parent_dir = File.expand_path("../", dir)
         | 
| 62 | 
            +
                    if parent_dir == dir
         | 
| 63 | 
            +
                      break
         | 
| 64 | 
            +
                    else
         | 
| 65 | 
            +
                      dir = parent_dir
         | 
| 66 | 
            +
                    end
         | 
| 67 | 
            +
                  end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                  nil
         | 
| 70 | 
            +
                end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                # Find an executed Jkr result if 'dir' is under the result dir, and return result id.
         | 
| 73 | 
            +
                # return nil otherwise.
         | 
| 74 | 
            +
                def self.find_result(dir)
         | 
| 75 | 
            +
                  dir = File.expand_path("./", dir)
         | 
| 76 | 
            +
                  while true
         | 
| 77 | 
            +
                    parent_dir = File.expand_path("../", dir)
         | 
| 78 | 
            +
                    gp_dir = File.expand_path("../../", dir) # grand parent
         | 
| 79 | 
            +
                    ggp_dir = File.expand_path("../../../", dir) # grand grand parent
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                    if ggp_dir == gp_dir
         | 
| 82 | 
            +
                      return nil
         | 
| 83 | 
            +
                    end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                    if valid_env_dir?(ggp_dir)
         | 
| 86 | 
            +
                      if File.basename(gp_dir) == "jkr" &&
         | 
| 87 | 
            +
                          File.basename(parent_dir) == "result" &&
         | 
| 88 | 
            +
                          File.basename(dir) =~ /^[0-9]+/
         | 
| 89 | 
            +
                        return File.basename(dir).to_i
         | 
| 90 | 
            +
                      end
         | 
| 91 | 
            +
                    end
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                    dir = File.expand_path("../", dir)
         | 
| 94 | 
            +
                  end
         | 
| 95 | 
            +
                end
         | 
| 37 96 | 
             
              end
         | 
| 38 97 | 
             
            end
         | 
    
        data/lib/jkr/plan.rb
    CHANGED
    
    | @@ -93,12 +93,22 @@ module Jkr | |
| 93 93 | 
             
                  plan.file_path = finder.find_by_result_id(ret_id)
         | 
| 94 94 |  | 
| 95 95 | 
             
                  plan.plan_search_path = [File.expand_path("../plan", plan.file_path)]
         | 
| 96 | 
            -
                  plan.script_search_path = [File.expand_path("../script", plan.file_path) | 
| 96 | 
            +
                  plan.script_search_path = [File.expand_path("../script", plan.file_path),
         | 
| 97 | 
            +
                                             plan.jkr_env.jkr_script_dir]
         | 
| 97 98 |  | 
| 98 99 | 
             
                  unless plan.file_path
         | 
| 99 100 | 
             
                    raise ArgumentError.new("Not valid result ID: #{ret_id}")
         | 
| 100 101 | 
             
                  end
         | 
| 101 102 |  | 
| 103 | 
            +
                  resultset_num = sprintf "%05d", ret_id
         | 
| 104 | 
            +
                  dirs = Dir.glob(File.join(plan.jkr_env.jkr_result_dir, resultset_num)+"*")
         | 
| 105 | 
            +
                  if dirs.size == 0
         | 
| 106 | 
            +
                    raise RuntimeError.new("Resultset not found: #{ret_id}")
         | 
| 107 | 
            +
                  elsif dirs.size > 1
         | 
| 108 | 
            +
                    raise RuntimeError.new("Cannot identify result set directory")
         | 
| 109 | 
            +
                  end
         | 
| 110 | 
            +
                  plan.resultset_dir = dirs.first
         | 
| 111 | 
            +
             | 
| 102 112 | 
             
                  PlanLoader.load_plan(plan)
         | 
| 103 113 |  | 
| 104 114 | 
             
                  plan
         | 
| @@ -185,7 +195,7 @@ module Jkr | |
| 185 195 | 
             
                    @plan
         | 
| 186 196 | 
             
                  end
         | 
| 187 197 |  | 
| 188 | 
            -
                  def use_script(name)
         | 
| 198 | 
            +
                  def use_script(name, use = true)
         | 
| 189 199 | 
             
                    # find script file
         | 
| 190 200 | 
             
                    if name.is_a? Symbol
         | 
| 191 201 | 
             
                      name = name.to_s + ".rb"
         | 
| @@ -206,12 +216,18 @@ module Jkr | |
| 206 216 |  | 
| 207 217 | 
             
                    if path
         | 
| 208 218 | 
             
                      load path
         | 
| 209 | 
            -
                       | 
| 219 | 
            +
                      if use
         | 
| 220 | 
            +
                        @plan.used_scripts.push(path)
         | 
| 221 | 
            +
                      end
         | 
| 210 222 | 
             
                    else
         | 
| 211 223 | 
             
                      raise RuntimeError.new("Cannot use script: #{name}")
         | 
| 212 224 | 
             
                    end
         | 
| 213 225 | 
             
                  end
         | 
| 214 226 |  | 
| 227 | 
            +
                  def load_script(name)
         | 
| 228 | 
            +
                    use_script(name, false)
         | 
| 229 | 
            +
                  end
         | 
| 230 | 
            +
             | 
| 215 231 | 
             
                  def extend(base_plan_name)
         | 
| 216 232 | 
             
                    base_plan = Plan.create_by_name(self.plan.jkr_env, base_plan_name.to_s,
         | 
| 217 233 | 
             
                                                    :plan_search_path => @plan.plan_search_path,
         | 
| @@ -374,7 +390,7 @@ module Jkr | |
| 374 390 | 
             
                                        {'message'=>message})
         | 
| 375 391 | 
             
                  end
         | 
| 376 392 |  | 
| 377 | 
            -
                  def  | 
| 393 | 
            +
                  def sh_(*args)
         | 
| 378 394 | 
             
                    puts "sh: #{args.join(' ')}"
         | 
| 379 395 | 
             
                    return system(*args)
         | 
| 380 396 | 
             
                  end
         | 
| @@ -387,8 +403,12 @@ module Jkr | |
| 387 403 | 
             
                    true
         | 
| 388 404 | 
             
                  end
         | 
| 389 405 |  | 
| 406 | 
            +
                  # for backward compatibility
         | 
| 390 407 | 
             
                  alias :system_ :sh!
         | 
| 391 408 |  | 
| 409 | 
            +
                  # raise Error on failure by default
         | 
| 410 | 
            +
                  alias :sh :sh!
         | 
| 411 | 
            +
             | 
| 392 412 | 
             
                  def su_sh(*args)
         | 
| 393 413 | 
             
                    puts "su_sh: #{args.join(' ')}"
         | 
| 394 414 | 
             
                    su_cmd = File.expand_path("../su_cmd", __FILE__)
         | 
    
        data/lib/jkr/trial.rb
    CHANGED
    
    | @@ -6,6 +6,8 @@ require 'jkr/utils' | |
| 6 6 | 
             
            module Jkr
         | 
| 7 7 | 
             
              class Trial
         | 
| 8 8 | 
             
                attr_reader :params
         | 
| 9 | 
            +
                attr_reader :result_dir
         | 
| 10 | 
            +
             | 
| 9 11 | 
             
                def self.make_trials(resultset_dir, plan)
         | 
| 10 12 | 
             
                  var_combs = [{}]
         | 
| 11 13 | 
             
                  plan.vars.each do |key, vals|
         | 
| @@ -25,8 +27,7 @@ module Jkr | |
| 25 27 | 
             
                  params_list = params_list * plan.routine_nr_run
         | 
| 26 28 |  | 
| 27 29 | 
             
                  params_list.map do |params|
         | 
| 28 | 
            -
                     | 
| 29 | 
            -
                    Trial.new(result_dir, plan, params)
         | 
| 30 | 
            +
                    Trial.new(resultset_dir, plan, params)
         | 
| 30 31 | 
             
                  end
         | 
| 31 32 | 
             
                end
         | 
| 32 33 |  | 
| @@ -40,7 +41,7 @@ module Jkr | |
| 40 41 |  | 
| 41 42 | 
             
                def self.run(env, plan, delete_files_on_error = true)
         | 
| 42 43 | 
             
                  plan_suffix = File.basename(plan.file_path, ".plan")
         | 
| 43 | 
            -
                  plan_suffix += "_#{plan.short_desc}" if plan.short_desc
         | 
| 44 | 
            +
                  plan_suffix += "_#{plan.short_desc}" if plan.short_desc && plan.short_desc.size > 0
         | 
| 44 45 | 
             
                  resultset_dir = Utils.reserve_next_dir(env.jkr_result_dir, plan_suffix)
         | 
| 45 46 | 
             
                  plan.resultset_dir = resultset_dir
         | 
| 46 47 | 
             
                  FileUtils.mkdir_p(File.join(resultset_dir, "plan"))
         | 
| @@ -73,28 +74,71 @@ module Jkr | |
| 73 74 | 
             
                    params = plan.params.merge(plan.vars)
         | 
| 74 75 | 
             
                    plan.freeze
         | 
| 75 76 |  | 
| 77 | 
            +
                    save_info(plan, :start_time => Time.now)
         | 
| 78 | 
            +
             | 
| 76 79 | 
             
                    # show estimated execution time if available
         | 
| 77 80 | 
             
                    if plan.exec_time_estimate
         | 
| 78 81 | 
             
                      puts("")
         | 
| 79 82 | 
             
                      puts("== estimated execution time: #{pretty_time(plan.exec_time_estimate.call(plan))} ==")
         | 
| 80 83 | 
             
                      puts("")
         | 
| 81 84 | 
             
                    end
         | 
| 82 | 
            -
             | 
| 83 | 
            -
                    plan.do_prep()
         | 
| 84 | 
            -
                    trials.each do |trial|
         | 
| 85 | 
            -
                      trial.run
         | 
| 86 | 
            -
                    end
         | 
| 87 | 
            -
                    plan.do_cleanup()
         | 
| 88 85 | 
             
                  rescue Exception => err
         | 
| 89 86 | 
             
                    if delete_files_on_error
         | 
| 90 87 | 
             
                      FileUtils.rm_rf(resultset_dir)
         | 
| 91 88 | 
             
                    end
         | 
| 92 89 | 
             
                    raise err
         | 
| 93 90 | 
             
                  end
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                  resume(env, plan)
         | 
| 93 | 
            +
                end
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                def self.resume(env, plan)
         | 
| 96 | 
            +
                  trials = self.make_trials(plan.resultset_dir, plan)
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                  save_info(plan, :last_resume_time => Time.now)
         | 
| 99 | 
            +
             | 
| 100 | 
            +
                  plan.do_prep()
         | 
| 101 | 
            +
                  trials.each do |trial|
         | 
| 102 | 
            +
                    begin
         | 
| 103 | 
            +
                      trial.run
         | 
| 104 | 
            +
                    rescue Exception => err
         | 
| 105 | 
            +
                      failed_dir = File.expand_path("../_failed_" + File.basename(trial.result_dir),
         | 
| 106 | 
            +
                                                    trial.result_dir)
         | 
| 107 | 
            +
                      i = 1
         | 
| 108 | 
            +
                      while Dir.exists?(failed_dir)
         | 
| 109 | 
            +
                        failed_dir = File.expand_path("../_failed_" + File.basename(trial.result_dir) + "_#{i}",
         | 
| 110 | 
            +
                                                      trial.result_dir)
         | 
| 111 | 
            +
                        i += 1
         | 
| 112 | 
            +
                      end
         | 
| 113 | 
            +
                      FileUtils.mv(trial.result_dir, failed_dir)
         | 
| 114 | 
            +
                      save_info(plan, :last_failure_time => Time.now)
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                      raise err
         | 
| 117 | 
            +
                    end
         | 
| 118 | 
            +
                  end
         | 
| 119 | 
            +
                  plan.do_cleanup()
         | 
| 120 | 
            +
             | 
| 121 | 
            +
                  save_info(plan, :finish_time => Time.now)
         | 
| 122 | 
            +
                end
         | 
| 123 | 
            +
             | 
| 124 | 
            +
                def self.save_info(plan, data = {})
         | 
| 125 | 
            +
                  info_path = File.expand_path("INFO", plan.resultset_dir)
         | 
| 126 | 
            +
                  unless File.exists?(info_path)
         | 
| 127 | 
            +
                    File.open(info_path, "w") do |f|
         | 
| 128 | 
            +
                      f.puts(JSON.pretty_generate({}))
         | 
| 129 | 
            +
                    end
         | 
| 130 | 
            +
                  end
         | 
| 131 | 
            +
             | 
| 132 | 
            +
                  info_data = JSON.load(File.open(info_path))
         | 
| 133 | 
            +
                  info_data = info_data.merge(data)
         | 
| 134 | 
            +
             | 
| 135 | 
            +
                  File.open(info_path, "w") do |f|
         | 
| 136 | 
            +
                    f.puts(JSON.pretty_generate(info_data))
         | 
| 137 | 
            +
                  end
         | 
| 94 138 | 
             
                end
         | 
| 95 139 |  | 
| 96 | 
            -
                def initialize( | 
| 97 | 
            -
                  @ | 
| 140 | 
            +
                def initialize(resultset_dir, plan, params)
         | 
| 141 | 
            +
                  @resultset_dir = resultset_dir
         | 
| 98 142 | 
             
                  @plan = plan
         | 
| 99 143 | 
             
                  @params = params
         | 
| 100 144 | 
             
                end
         | 
| @@ -102,27 +146,50 @@ module Jkr | |
| 102 146 |  | 
| 103 147 | 
             
                def run()
         | 
| 104 148 | 
             
                  plan = @plan
         | 
| 105 | 
            -
             | 
| 106 | 
            -
             | 
| 149 | 
            +
             | 
| 150 | 
            +
                  # check duplicate execution
         | 
| 151 | 
            +
                  Dir.glob("#{@resultset_dir}/*").select do |path|
         | 
| 152 | 
            +
                    File.basename(path) =~ /^[0-9]{5}$/
         | 
| 153 | 
            +
                  end.each do |result_dir|
         | 
| 154 | 
            +
                    params = Marshal.load(File.open("#{result_dir}/params.msh"))
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                    if params == @params
         | 
| 157 | 
            +
                      # already executed trial. skip.
         | 
| 158 | 
            +
                      return false
         | 
| 159 | 
            +
                    end
         | 
| 107 160 | 
             
                  end
         | 
| 108 161 |  | 
| 109 | 
            -
                  #  | 
| 110 | 
            -
                   | 
| 162 | 
            +
                  # make result dir for this trial
         | 
| 163 | 
            +
                  @result_dir = Utils.reserve_next_dir(@resultset_dir)
         | 
| 164 | 
            +
             | 
| 165 | 
            +
                  Dir.chdir(@result_dir) do
         | 
| 166 | 
            +
                    # save params
         | 
| 167 | 
            +
                    File.open("#{@result_dir}/params.msh", "w") do |f|
         | 
| 168 | 
            +
                      Marshal.dump(@params, f)
         | 
| 169 | 
            +
                    end
         | 
| 170 | 
            +
                    File.open("#{@result_dir}/params.json", "w") do |f|
         | 
| 171 | 
            +
                      f.puts(JSON.pretty_generate(@params))
         | 
| 172 | 
            +
                    end
         | 
| 111 173 |  | 
| 112 | 
            -
             | 
| 113 | 
            -
             | 
| 174 | 
            +
                    # reset plan.metastore
         | 
| 175 | 
            +
                    plan.metastore.clear
         | 
| 114 176 |  | 
| 115 | 
            -
             | 
| 116 | 
            -
             | 
| 117 | 
            -
                  @plan.metastore[:trial_end_time] = Time.now
         | 
| 177 | 
            +
                    # define utility functions for plan.routine object
         | 
| 178 | 
            +
                    Jkr::TrialUtils.define_routine_utils(@result_dir, @plan, @params)
         | 
| 118 179 |  | 
| 119 | 
            -
             | 
| 180 | 
            +
                    @plan.metastore[:vars] = @plan.vars.keys
         | 
| 181 | 
            +
                    @plan.metastore[:trial_start_time] = Time.now
         | 
| 182 | 
            +
                    @plan.do_routine(@plan, @params)
         | 
| 183 | 
            +
                    @plan.metastore[:trial_end_time] = Time.now
         | 
| 120 184 |  | 
| 121 | 
            -
             | 
| 122 | 
            -
             | 
| 123 | 
            -
             | 
| 124 | 
            -
             | 
| 125 | 
            -
             | 
| 185 | 
            +
                    Jkr::TrialUtils.undef_routine_utils(@plan)
         | 
| 186 | 
            +
             | 
| 187 | 
            +
                    # save plan.metastore
         | 
| 188 | 
            +
                    Marshal.dump(@plan.metastore,
         | 
| 189 | 
            +
                                 File.open("#{@result_dir}/metastore.msh", "w"))
         | 
| 190 | 
            +
                    File.open("#{@result_dir}/metastore.json", "w") do |f|
         | 
| 191 | 
            +
                      f.puts(JSON.pretty_generate(@plan.metastore))
         | 
| 192 | 
            +
                    end
         | 
| 126 193 | 
             
                  end
         | 
| 127 194 | 
             
                end
         | 
| 128 195 | 
             
              end
         | 
    
        data/lib/jkr/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: jkr
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.1 | 
| 4 | 
            +
              version: 0.2.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Yuto Hayamizu
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2016- | 
| 11 | 
            +
            date: 2016-11-08 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: thor
         | 
| @@ -133,7 +133,6 @@ files: | |
| 133 133 | 
             
            - ".gitignore"
         | 
| 134 134 | 
             
            - ".rspec"
         | 
| 135 135 | 
             
            - Gemfile
         | 
| 136 | 
            -
            - Gemfile.lock
         | 
| 137 136 | 
             
            - Guardfile
         | 
| 138 137 | 
             
            - History.txt
         | 
| 139 138 | 
             
            - LICENSE.txt
         | 
    
        data/Gemfile.lock
    DELETED
    
    | @@ -1,81 +0,0 @@ | |
| 1 | 
            -
            PATH
         | 
| 2 | 
            -
              remote: .
         | 
| 3 | 
            -
              specs:
         | 
| 4 | 
            -
                jkr (0.1.0)
         | 
| 5 | 
            -
                  term-ansicolor
         | 
| 6 | 
            -
                  thor
         | 
| 7 | 
            -
             | 
| 8 | 
            -
            GEM
         | 
| 9 | 
            -
              remote: https://rubygems.org/
         | 
| 10 | 
            -
              specs:
         | 
| 11 | 
            -
                coderay (1.1.1)
         | 
| 12 | 
            -
                diff-lcs (1.2.5)
         | 
| 13 | 
            -
                ffi (1.9.14)
         | 
| 14 | 
            -
                formatador (0.2.5)
         | 
| 15 | 
            -
                guard (2.14.0)
         | 
| 16 | 
            -
                  formatador (>= 0.2.4)
         | 
| 17 | 
            -
                  listen (>= 2.7, < 4.0)
         | 
| 18 | 
            -
                  lumberjack (~> 1.0)
         | 
| 19 | 
            -
                  nenv (~> 0.1)
         | 
| 20 | 
            -
                  notiffany (~> 0.0)
         | 
| 21 | 
            -
                  pry (>= 0.9.12)
         | 
| 22 | 
            -
                  shellany (~> 0.0)
         | 
| 23 | 
            -
                  thor (>= 0.18.1)
         | 
| 24 | 
            -
                guard-compat (1.2.1)
         | 
| 25 | 
            -
                guard-rspec (4.7.3)
         | 
| 26 | 
            -
                  guard (~> 2.1)
         | 
| 27 | 
            -
                  guard-compat (~> 1.1)
         | 
| 28 | 
            -
                  rspec (>= 2.99.0, < 4.0)
         | 
| 29 | 
            -
                listen (3.1.5)
         | 
| 30 | 
            -
                  rb-fsevent (~> 0.9, >= 0.9.4)
         | 
| 31 | 
            -
                  rb-inotify (~> 0.9, >= 0.9.7)
         | 
| 32 | 
            -
                  ruby_dep (~> 1.2)
         | 
| 33 | 
            -
                lumberjack (1.0.10)
         | 
| 34 | 
            -
                method_source (0.8.2)
         | 
| 35 | 
            -
                nenv (0.3.0)
         | 
| 36 | 
            -
                notiffany (0.1.1)
         | 
| 37 | 
            -
                  nenv (~> 0.1)
         | 
| 38 | 
            -
                  shellany (~> 0.0)
         | 
| 39 | 
            -
                pry (0.10.4)
         | 
| 40 | 
            -
                  coderay (~> 1.1.0)
         | 
| 41 | 
            -
                  method_source (~> 0.8.1)
         | 
| 42 | 
            -
                  slop (~> 3.4)
         | 
| 43 | 
            -
                rake (11.2.2)
         | 
| 44 | 
            -
                rb-fsevent (0.9.7)
         | 
| 45 | 
            -
                rb-inotify (0.9.7)
         | 
| 46 | 
            -
                  ffi (>= 0.5.0)
         | 
| 47 | 
            -
                rspec (3.5.0)
         | 
| 48 | 
            -
                  rspec-core (~> 3.5.0)
         | 
| 49 | 
            -
                  rspec-expectations (~> 3.5.0)
         | 
| 50 | 
            -
                  rspec-mocks (~> 3.5.0)
         | 
| 51 | 
            -
                rspec-core (3.5.2)
         | 
| 52 | 
            -
                  rspec-support (~> 3.5.0)
         | 
| 53 | 
            -
                rspec-expectations (3.5.0)
         | 
| 54 | 
            -
                  diff-lcs (>= 1.2.0, < 2.0)
         | 
| 55 | 
            -
                  rspec-support (~> 3.5.0)
         | 
| 56 | 
            -
                rspec-mocks (3.5.0)
         | 
| 57 | 
            -
                  diff-lcs (>= 1.2.0, < 2.0)
         | 
| 58 | 
            -
                  rspec-support (~> 3.5.0)
         | 
| 59 | 
            -
                rspec-support (3.5.0)
         | 
| 60 | 
            -
                ruby_dep (1.4.0)
         | 
| 61 | 
            -
                shellany (0.0.1)
         | 
| 62 | 
            -
                slop (3.6.0)
         | 
| 63 | 
            -
                term-ansicolor (1.3.2)
         | 
| 64 | 
            -
                  tins (~> 1.0)
         | 
| 65 | 
            -
                thor (0.19.1)
         | 
| 66 | 
            -
                tins (1.12.0)
         | 
| 67 | 
            -
             | 
| 68 | 
            -
            PLATFORMS
         | 
| 69 | 
            -
              ruby
         | 
| 70 | 
            -
             | 
| 71 | 
            -
            DEPENDENCIES
         | 
| 72 | 
            -
              bundler
         | 
| 73 | 
            -
              guard
         | 
| 74 | 
            -
              guard-rspec
         | 
| 75 | 
            -
              jkr!
         | 
| 76 | 
            -
              pry
         | 
| 77 | 
            -
              rake
         | 
| 78 | 
            -
              rspec
         | 
| 79 | 
            -
             | 
| 80 | 
            -
            BUNDLED WITH
         | 
| 81 | 
            -
               1.11.2
         |