rbbt-util 5.21.91 → 5.21.92
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/lib/rbbt/association/index.rb +2 -0
- data/lib/rbbt/tsv/excel.rb +7 -3
- data/lib/rbbt/tsv/manipulate.rb +2 -2
- data/lib/rbbt/tsv/parser.rb +11 -2
- data/lib/rbbt/tsv/stream.rb +3 -3
- data/lib/rbbt/util/R.rb +5 -0
- data/lib/rbbt/util/log.rb +5 -4
- data/lib/rbbt/util/misc/format.rb +40 -0
- data/lib/rbbt/util/misc/inspect.rb +14 -0
- data/lib/rbbt/util/misc/omics.rb +1 -1
- data/lib/rbbt/util/misc/pipes.rb +26 -0
- data/lib/rbbt/util/open.rb +4 -4
- data/lib/rbbt/workflow.rb +1 -0
- data/lib/rbbt/workflow/accessor.rb +4 -1
- data/lib/rbbt/workflow/step.rb +48 -13
- data/lib/rbbt/workflow/step/dependencies.rb +1 -1
- data/lib/rbbt/workflow/step/run.rb +16 -4
- data/lib/rbbt/workflow/task.rb +3 -1
- data/lib/rbbt/workflow/usage.rb +5 -1
- data/share/Rlib/util.R +33 -5
- data/share/rbbt_commands/app/template +1 -1
- data/share/rbbt_commands/log +1 -0
- data/share/rbbt_commands/tsv/get +46 -9
- data/share/rbbt_commands/tsv/info +1 -1
- data/share/rbbt_commands/tsv/values +3 -0
- data/share/rbbt_commands/workflow/info +8 -5
- data/share/rbbt_commands/workflow/task +8 -0
- data/test/rbbt/util/test_misc.rb +7 -0
- metadata +64 -64
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: '085baf05c5686c39e301773dce420dd46947b483'
         | 
| 4 | 
            +
              data.tar.gz: 1e45580741e0644488f7c891f1d737d8ff421668
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: b07ae9833c2832a79511ca6539d7de339e8008d83bc1d7056bb0d679355fce723b5233598c2ca372d0d55e99e7f0352c1c3f489f9c42dce0dc58ba89c3b99998
         | 
| 7 | 
            +
              data.tar.gz: c41b15827ed605424506a7bf44ceebd27ad0c95012cc449cebb04d9e2660af6c96a6b9897f0ff8c9ccf91564bd196b4a5c0f66f43784dba12c1ae15e86d017eb
         | 
    
        data/lib/rbbt/tsv/excel.rb
    CHANGED
    
    | @@ -110,6 +110,7 @@ module TSV | |
| 110 110 | 
             
                      rows << row.values_at(0..(row.size - 1)).collect{|c| String === c ? c.gsub("\n", ' ') : c }
         | 
| 111 111 | 
             
                    end
         | 
| 112 112 |  | 
| 113 | 
            +
                    num_values = rows.first.length
         | 
| 113 114 | 
             
                    File.open(filename, 'w') do |f|
         | 
| 114 115 | 
             
                      if header
         | 
| 115 116 | 
             
                        header = rows.shift
         | 
| @@ -118,6 +119,7 @@ module TSV | |
| 118 119 |  | 
| 119 120 | 
             
                      rows.each do |row| 
         | 
| 120 121 | 
             
                        values =  row.collect{|c| c.respond_to?(:value) ? c.value : c }
         | 
| 122 | 
            +
                        values[num_values-1] ||= nil
         | 
| 121 123 | 
             
                        f.puts values * "\t"
         | 
| 122 124 | 
             
                      end
         | 
| 123 125 | 
             
                    end
         | 
| @@ -151,8 +153,6 @@ module TSV | |
| 151 153 | 
             
                  sheet = Misc.process_options options, :sheet
         | 
| 152 154 | 
             
                  header = Misc.process_options options, :header
         | 
| 153 155 |  | 
| 154 | 
            -
                  iii options
         | 
| 155 | 
            -
                  iii sheet
         | 
| 156 156 | 
             
                  header = true unless header == false
         | 
| 157 157 | 
             
                  TmpFile.with_file do |filename|
         | 
| 158 158 | 
             
                    workbook = RubyXL::Parser.parse file
         | 
| @@ -165,13 +165,17 @@ module TSV | |
| 165 165 | 
             
                      rows << row.cells.collect{|c| c.nil? ? nil : c.value}.collect{|c| String === c ? c.gsub("\n", ' ') : c }
         | 
| 166 166 | 
             
                    end
         | 
| 167 167 |  | 
| 168 | 
            +
                    num_values = rows.first.length
         | 
| 168 169 | 
             
                    File.open(filename, 'w') do |f|
         | 
| 169 170 | 
             
                      if header
         | 
| 170 171 | 
             
                        header = rows.shift
         | 
| 171 172 | 
             
                        f.puts "#" + header * "\t"
         | 
| 172 173 | 
             
                      end
         | 
| 173 174 |  | 
| 174 | 
            -
                      rows.each do |row|  | 
| 175 | 
            +
                      rows.each do |row| 
         | 
| 176 | 
            +
                        row[num_values-1] ||= nil
         | 
| 177 | 
            +
                        f.puts row * "\t" 
         | 
| 178 | 
            +
                      end
         | 
| 175 179 | 
             
                    end
         | 
| 176 180 |  | 
| 177 181 | 
             
                    TSV.open(filename, options)
         | 
    
        data/lib/rbbt/tsv/manipulate.rb
    CHANGED
    
    | @@ -717,12 +717,12 @@ module TSV | |
| 717 717 |  | 
| 718 718 | 
             
              def transpose(key_field = "Unkown ID")
         | 
| 719 719 | 
             
                case type
         | 
| 720 | 
            +
                when :single, :flat
         | 
| 721 | 
            +
                  transpose_list self.to_list, key_field
         | 
| 720 722 | 
             
                when :list
         | 
| 721 723 | 
             
                  transpose_list key_field
         | 
| 722 724 | 
             
                when :double
         | 
| 723 725 | 
             
                  transpose_double key_field
         | 
| 724 | 
            -
                else
         | 
| 725 | 
            -
                  raise "Transposing only works for TSVs of type :list or :double"
         | 
| 726 726 | 
             
                end
         | 
| 727 727 | 
             
              end
         | 
| 728 728 |  | 
    
        data/lib/rbbt/tsv/parser.rb
    CHANGED
    
    | @@ -39,7 +39,7 @@ module TSV | |
| 39 39 |  | 
| 40 40 | 
             
                  preamble << line if line
         | 
| 41 41 | 
             
                  while line and (TrueClass === @header_hash or (String === @header_hash and Misc.fixutf8(line) =~ /^#{@header_hash}/ ))
         | 
| 42 | 
            -
                    @fields = line.split(@sep)
         | 
| 42 | 
            +
                    @fields = line.split(@sep, -1)
         | 
| 43 43 | 
             
                    @key_field = @fields.shift
         | 
| 44 44 | 
             
                    @key_field = @key_field[(0 + header_hash.length)..-1] if String === @header_hash
         | 
| 45 45 |  | 
| @@ -234,7 +234,12 @@ module TSV | |
| 234 234 | 
             
                    if data.include? key
         | 
| 235 235 | 
             
                      new = data[key]
         | 
| 236 236 | 
             
                      new.each_with_index do |old, i|
         | 
| 237 | 
            -
                         | 
| 237 | 
            +
                        next if values[i].nil?
         | 
| 238 | 
            +
                        if old.nil?
         | 
| 239 | 
            +
                          new[i] = values[i] 
         | 
| 240 | 
            +
                        else
         | 
| 241 | 
            +
                          old.concat values[i]
         | 
| 242 | 
            +
                        end
         | 
| 238 243 | 
             
                      end
         | 
| 239 244 | 
             
                      data[key] = new
         | 
| 240 245 | 
             
                    else
         | 
| @@ -247,6 +252,10 @@ module TSV | |
| 247 252 | 
             
                def add_to_data_merge_zipped(data, keys, values)
         | 
| 248 253 | 
             
                  num = keys.length
         | 
| 249 254 |  | 
| 255 | 
            +
                  values = values.collect do |v|
         | 
| 256 | 
            +
                    (v.nil? || v.empty?) ? [""] : v
         | 
| 257 | 
            +
                  end
         | 
| 258 | 
            +
             | 
| 250 259 | 
             
                  if values.first.length > 1 and num == 1
         | 
| 251 260 | 
             
                    keys = keys * values.first.length
         | 
| 252 261 | 
             
                    num = keys.length
         | 
    
        data/lib/rbbt/tsv/stream.rb
    CHANGED
    
    | @@ -248,7 +248,7 @@ module TSV | |
| 248 248 |  | 
| 249 249 | 
             
                  while line  =~ /^#/
         | 
| 250 250 | 
             
                    if Hash === positions
         | 
| 251 | 
            -
                      new = (0..line.split(sep).length-1).to_a
         | 
| 251 | 
            +
                      new = (0..line.split(sep,-1).length-1).to_a
         | 
| 252 252 | 
             
                      positions.each do |k,v|
         | 
| 253 253 | 
             
                        new[k] = v
         | 
| 254 254 | 
             
                        new[v] = k
         | 
| @@ -262,14 +262,14 @@ module TSV | |
| 262 262 |  | 
| 263 263 | 
             
                  while line
         | 
| 264 264 | 
             
                    if Hash === positions
         | 
| 265 | 
            -
                      new = (0..line.split(sep).length-1).to_a
         | 
| 265 | 
            +
                      new = (0..line.split(sep, -1).length-1).to_a
         | 
| 266 266 | 
             
                      positions.each do |k,v|
         | 
| 267 267 | 
             
                        new[k] = v
         | 
| 268 268 | 
             
                        new[v] = k
         | 
| 269 269 | 
             
                      end
         | 
| 270 270 | 
             
                      positions = new
         | 
| 271 271 | 
             
                    end
         | 
| 272 | 
            -
                    values = line.split(sep)
         | 
| 272 | 
            +
                    values = line.split(sep, -1)
         | 
| 273 273 | 
             
                    new_values = values.values_at(*positions)
         | 
| 274 274 | 
             
                    sin.puts new_values * sep
         | 
| 275 275 | 
             
                    line = stream.gets
         | 
    
        data/lib/rbbt/util/R.rb
    CHANGED
    
    | @@ -156,6 +156,11 @@ module TSV | |
| 156 156 | 
             
                script = require_sources + "\n\n" + script if require_sources
         | 
| 157 157 |  | 
| 158 158 | 
             
                r_options = Misc.pull_keys open_options, :R
         | 
| 159 | 
            +
             | 
| 160 | 
            +
                r_options[:monitor] = open_options[:monitor] if open_options.include?(:monitor)
         | 
| 161 | 
            +
                r_options[:method] = open_options[:method] if open_options.include?(:method)
         | 
| 162 | 
            +
                r_options[:debug] = open_options[:debug] if open_options.include?(:debug)
         | 
| 163 | 
            +
             | 
| 159 164 | 
             
                r_options[:debug] = true if r_options[:method] == :debug
         | 
| 160 165 | 
             
                if r_options.delete :debug
         | 
| 161 166 | 
             
                  r_options[:monitor] = true
         | 
    
        data/lib/rbbt/util/log.rb
    CHANGED
    
    | @@ -17,7 +17,7 @@ module Log | |
| 17 17 | 
             
              LOG_MUTEX = Mutex.new
         | 
| 18 18 |  | 
| 19 19 | 
             
              SEVERITY_NAMES ||= begin
         | 
| 20 | 
            -
                                 names = %w(DEBUG LOW MEDIUM HIGH INFO WARN ERROR ) 
         | 
| 20 | 
            +
                                 names = %w(DEBUG LOW MEDIUM HIGH INFO WARN ERROR NONE ) 
         | 
| 21 21 | 
             
                                 names.each_with_index do |name,i|
         | 
| 22 22 | 
             
                                   eval "#{ name } = #{ i }" 
         | 
| 23 23 | 
             
                                 end
         | 
| @@ -31,6 +31,7 @@ module Log | |
| 31 31 | 
             
                  line = stack.shift 
         | 
| 32 32 | 
             
                end
         | 
| 33 33 | 
             
                line ||= caller.first
         | 
| 34 | 
            +
                line.gsub('`', "'")
         | 
| 34 35 | 
             
              end
         | 
| 35 36 |  | 
| 36 37 | 
             
              def self._ignore_stderr
         | 
| @@ -229,12 +230,12 @@ module Log | |
| 229 230 | 
             
              def self.exception(e)
         | 
| 230 231 | 
             
                stack = caller
         | 
| 231 232 | 
             
                error([e.class.to_s, e.message].compact * ": " )
         | 
| 232 | 
            -
                error("BACKTRACE: " << Log.last_caller( | 
| 233 | 
            +
                error("BACKTRACE: " << Log.last_caller(stack) << "\n" + color_stack(e.backtrace)*"\n")
         | 
| 233 234 | 
             
              end
         | 
| 234 235 |  | 
| 235 236 | 
             
              def self.deprecated(m)
         | 
| 236 237 | 
             
                stack = caller
         | 
| 237 | 
            -
                warn("DEPRECATED: " << Log.last_caller( | 
| 238 | 
            +
                warn("DEPRECATED: " << Log.last_caller(stack))
         | 
| 238 239 | 
             
                warn("* " << (m || "").to_s)
         | 
| 239 240 | 
             
              end
         | 
| 240 241 |  | 
| @@ -248,7 +249,7 @@ module Log | |
| 248 249 | 
             
              end
         | 
| 249 250 |  | 
| 250 251 | 
             
              def self.tsv(tsv)
         | 
| 251 | 
            -
                STDERR.puts Log.color :magenta, "TSV log: " << Log.last_caller(caller)
         | 
| 252 | 
            +
                STDERR.puts Log.color :magenta, "TSV log: " << Log.last_caller(caller).gsub('`',"'")
         | 
| 252 253 | 
             
                STDERR.puts Log.color(:blue, "=> "<< Misc.fingerprint(tsv), true) 
         | 
| 253 254 | 
             
                STDERR.puts Log.color(:cyan, "=> " << tsv.summary)
         | 
| 254 255 | 
             
              end
         | 
| @@ -181,4 +181,44 @@ module Misc | |
| 181 181 | 
             
                end
         | 
| 182 182 | 
             
              end
         | 
| 183 183 |  | 
| 184 | 
            +
              def self.parse_sql_values(txt)
         | 
| 185 | 
            +
                io = StringIO.new txt.strip
         | 
| 186 | 
            +
             | 
| 187 | 
            +
                values = []
         | 
| 188 | 
            +
                fields = []
         | 
| 189 | 
            +
                current = nil
         | 
| 190 | 
            +
                quoted = false
         | 
| 191 | 
            +
                while c = io.getc
         | 
| 192 | 
            +
                  if quoted
         | 
| 193 | 
            +
                    if c == "'"
         | 
| 194 | 
            +
                      quoted = false
         | 
| 195 | 
            +
                    else
         | 
| 196 | 
            +
                      current << c
         | 
| 197 | 
            +
                    end
         | 
| 198 | 
            +
                  else
         | 
| 199 | 
            +
                    case c
         | 
| 200 | 
            +
                    when "("
         | 
| 201 | 
            +
                      current = ""
         | 
| 202 | 
            +
                    when ")"
         | 
| 203 | 
            +
                      fields << current
         | 
| 204 | 
            +
                      values << fields
         | 
| 205 | 
            +
                      fields = []
         | 
| 206 | 
            +
                      current = nil
         | 
| 207 | 
            +
                    when ','
         | 
| 208 | 
            +
                      if not current.nil?
         | 
| 209 | 
            +
                        fields << current
         | 
| 210 | 
            +
                        current = ""
         | 
| 211 | 
            +
                      end
         | 
| 212 | 
            +
                    when "'"
         | 
| 213 | 
            +
                      quoted = true
         | 
| 214 | 
            +
                    when ";"
         | 
| 215 | 
            +
                      break
         | 
| 216 | 
            +
                    else
         | 
| 217 | 
            +
                      current << c
         | 
| 218 | 
            +
                    end
         | 
| 219 | 
            +
                  end
         | 
| 220 | 
            +
                end
         | 
| 221 | 
            +
                values
         | 
| 222 | 
            +
              end
         | 
| 223 | 
            +
             | 
| 184 224 | 
             
            end
         | 
| @@ -66,6 +66,8 @@ module Misc | |
| 66 66 | 
             
                  (obj.respond_to?(:filename) and obj.filename ) ? "<IO:" + (obj.filename || obj.inspect + rand(100000)) + ">" : obj.inspect
         | 
| 67 67 | 
             
                when File
         | 
| 68 68 | 
             
                  "<File:" + obj.path + ">"
         | 
| 69 | 
            +
                when NamedArray
         | 
| 70 | 
            +
                  "[<NamedArray: fields=#{fingerprint obj.fields} -- values=#{fingerprint obj[0..-1]}]"
         | 
| 69 71 | 
             
                when Array
         | 
| 70 72 | 
             
                  if (length = obj.length) > 10
         | 
| 71 73 | 
             
                    "[#{length}--" <<  (obj.values_at(0,1, length / 2, -2, -1).collect{|e| fingerprint(e)} * ",") << "]"
         | 
| @@ -289,4 +291,16 @@ module Misc | |
| 289 291 | 
             
              def self.obj2md5(obj)
         | 
| 290 292 | 
             
                obj2digest(obj)
         | 
| 291 293 | 
             
              end
         | 
| 294 | 
            +
             | 
| 295 | 
            +
              def self.get_filename(obj)
         | 
| 296 | 
            +
                if obj.respond_to? :filename
         | 
| 297 | 
            +
                  obj.filename
         | 
| 298 | 
            +
                elsif obj.respond_to? :path
         | 
| 299 | 
            +
                  obj.path
         | 
| 300 | 
            +
                elsif (Path === obj || (String === obj && Misc.is_filename?(obj)))
         | 
| 301 | 
            +
                  obj
         | 
| 302 | 
            +
                else
         | 
| 303 | 
            +
                  nil
         | 
| 304 | 
            +
                end
         | 
| 305 | 
            +
              end
         | 
| 292 306 | 
             
            end
         | 
    
        data/lib/rbbt/util/misc/omics.rb
    CHANGED
    
    
    
        data/lib/rbbt/util/misc/pipes.rb
    CHANGED
    
    | @@ -661,4 +661,30 @@ module Misc | |
| 661 661 | 
             
              end
         | 
| 662 662 |  | 
| 663 663 |  | 
| 664 | 
            +
              def self.swap_quoted_character(stream, charout="\n", charin=" ", quote='"')
         | 
| 665 | 
            +
                io = Misc.open_pipe do |sin|
         | 
| 666 | 
            +
                  begin
         | 
| 667 | 
            +
                    quoted = false
         | 
| 668 | 
            +
                    prev = nil
         | 
| 669 | 
            +
                    while c = stream.getc
         | 
| 670 | 
            +
                      if c == quote and not prev == "\\"
         | 
| 671 | 
            +
                        quoted = ! quoted
         | 
| 672 | 
            +
                      end
         | 
| 673 | 
            +
                      c = charin if c == charout and quoted
         | 
| 674 | 
            +
                      sin << c
         | 
| 675 | 
            +
                      prev = c
         | 
| 676 | 
            +
                    end
         | 
| 677 | 
            +
                  rescue
         | 
| 678 | 
            +
                    stream.abort if stream.respond_to? :abort
         | 
| 679 | 
            +
                    raise $!
         | 
| 680 | 
            +
                  ensure
         | 
| 681 | 
            +
                    stream.join if stream.respond_to? :join
         | 
| 682 | 
            +
                  end
         | 
| 683 | 
            +
                end
         | 
| 684 | 
            +
              end
         | 
| 685 | 
            +
             | 
| 686 | 
            +
              def self.remove_quoted_new_line(stream, quote = '"')
         | 
| 687 | 
            +
                swap_quoted_character(stream, "\n", " ", quote)
         | 
| 688 | 
            +
              end
         | 
| 689 | 
            +
             | 
| 664 690 | 
             
            end
         | 
    
        data/lib/rbbt/util/open.rb
    CHANGED
    
    | @@ -9,7 +9,7 @@ module Open | |
| 9 9 | 
             
              class OpenURLError < StandardError; end
         | 
| 10 10 | 
             
              class OpenGzipError < StandardError; end
         | 
| 11 11 |  | 
| 12 | 
            -
              REMOTE_CACHEDIR = "/tmp/open_cache" | 
| 12 | 
            +
              REMOTE_CACHEDIR = File.join(ENV["HOME"], "/tmp/open_cache")
         | 
| 13 13 | 
             
              FileUtils.mkdir REMOTE_CACHEDIR unless File.exist? REMOTE_CACHEDIR
         | 
| 14 14 |  | 
| 15 15 | 
             
              class << self
         | 
| @@ -126,11 +126,11 @@ module Open | |
| 126 126 | 
             
              # Grep
         | 
| 127 127 |  | 
| 128 128 | 
             
              def self.grep(stream, grep, invert = false)
         | 
| 129 | 
            -
                grep_cmd =  | 
| 129 | 
            +
                grep_cmd = ENV["GREP_CMD"] || "/bin/grep"
         | 
| 130 130 | 
             
                case 
         | 
| 131 131 | 
             
                when Array === grep
         | 
| 132 132 | 
             
                  TmpFile.with_file(grep * "\n", false) do |f|
         | 
| 133 | 
            -
                    CMD.cmd("#{grep_cmd} #{invert ? '-v' : ''}", "-w" => true, "-f" => f, :in => stream, :pipe => true, :post => proc{FileUtils.rm f})
         | 
| 133 | 
            +
                    CMD.cmd("#{grep_cmd} #{invert ? '-v' : ''} -", "-w" => true, "-F" => true, "-f" => f, :in => stream, :pipe => true, :post => proc{FileUtils.rm f})
         | 
| 134 134 | 
             
                  end
         | 
| 135 135 | 
             
                else
         | 
| 136 136 | 
             
                  CMD.cmd("#{grep_cmd} #{invert ? '-v ' : ''} '#{grep}' -", :in => stream, :pipe => true, :post => proc{begin stream.force_close; rescue Exception; end if stream.respond_to?(:force_close)})
         | 
| @@ -319,7 +319,7 @@ module Open | |
| 319 319 | 
             
              end
         | 
| 320 320 |  | 
| 321 321 | 
             
              def self.zip?(file)
         | 
| 322 | 
            -
                !! (file =~ /\.zip | 
| 322 | 
            +
                !! (file =~ /\.zip$/)
         | 
| 323 323 | 
             
              end
         | 
| 324 324 |  | 
| 325 325 |  | 
    
        data/lib/rbbt/workflow.rb
    CHANGED
    
    | @@ -386,6 +386,7 @@ module Workflow | |
| 386 386 | 
             
                task = task_for path
         | 
| 387 387 | 
             
                return remote_tasks[task].load_id(id) if remote_tasks and remote_tasks.include? task
         | 
| 388 388 | 
             
                step = Step.new path, tasks[task.to_sym]
         | 
| 389 | 
            +
                step.load_inputs_from_info
         | 
| 389 390 | 
             
                set_step_dependencies(step)
         | 
| 390 391 | 
             
                step
         | 
| 391 392 | 
             
              end
         | 
| @@ -696,7 +696,7 @@ module Workflow | |
| 696 696 | 
             
                  when :compute
         | 
| 697 697 | 
             
                    compute = v
         | 
| 698 698 | 
             
                  when Symbol
         | 
| 699 | 
            -
                    rec_dependency = all_d.select{|d| d.task_name.to_sym == v }.first
         | 
| 699 | 
            +
                    rec_dependency = all_d.flatten.select{|d| d.task_name.to_sym == v }.first
         | 
| 700 700 |  | 
| 701 701 | 
             
                    if rec_dependency.nil?
         | 
| 702 702 | 
             
                      if inputs.include? v
         | 
| @@ -734,6 +734,8 @@ module Workflow | |
| 734 734 | 
             
                path_deps = {}
         | 
| 735 735 | 
             
                dependencies.each do |dependency|
         | 
| 736 736 | 
             
                  _inputs = IndiferentHash.setup(inputs.dup)
         | 
| 737 | 
            +
                  jobname = _inputs[:jobname] if _inputs.include? :jobname
         | 
| 738 | 
            +
             | 
| 737 739 | 
             
                  real_dep = case dependency
         | 
| 738 740 | 
             
                             when Array
         | 
| 739 741 | 
             
                               workflow, dep_task, options = dependency
         | 
| @@ -743,6 +745,7 @@ module Workflow | |
| 743 745 | 
             
                               all_d = (real_dependencies + real_dependencies.collect{|d| d.rec_dependencies} ).flatten.compact.uniq
         | 
| 744 746 |  | 
| 745 747 | 
             
                               _inputs = assign_dep_inputs(_inputs, options, all_d, workflow.task_info(dep_task))
         | 
| 748 | 
            +
                               jobname = _inputs[:jobname] if _inputs.include? :jobname
         | 
| 746 749 |  | 
| 747 750 | 
             
                               job = workflow.job(dep_task, jobname, _inputs)
         | 
| 748 751 | 
             
                               ComputeDependency.setup(job, compute) if compute
         | 
    
        data/lib/rbbt/workflow/step.rb
    CHANGED
    
    | @@ -45,25 +45,44 @@ class Step | |
| 45 45 | 
             
                                end
         | 
| 46 46 | 
             
                @mutex = Mutex.new
         | 
| 47 47 | 
             
                @info_mutex = Mutex.new
         | 
| 48 | 
            -
                @inputs = inputs  | 
| 48 | 
            +
                @inputs = inputs 
         | 
| 49 49 | 
             
                NamedArray.setup @inputs, task.inputs.collect{|s| s.to_s} if task and task.respond_to? :inputs and task.inputs
         | 
| 50 50 | 
             
              end
         | 
| 51 51 |  | 
| 52 | 
            -
              def  | 
| 53 | 
            -
                 | 
| 54 | 
            -
             | 
| 55 | 
            -
                end
         | 
| 52 | 
            +
              def workflow
         | 
| 53 | 
            +
                info[:workflow]
         | 
| 54 | 
            +
              end
         | 
| 56 55 |  | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 56 | 
            +
              def load_inputs_from_info
         | 
| 57 | 
            +
                if info[:inputs]
         | 
| 58 | 
            +
                  info_inputs = info[:inputs]
         | 
| 59 | 
            +
                  if task && task.respond_to?(:inputs) && task.inputs
         | 
| 60 | 
            +
                    IndiferentHash.setup info_inputs
         | 
| 61 | 
            +
                    @inputs = NamedArray.setup info_inputs.values_at(*task.inputs.collect{|name| name.to_s}), task.inputs
         | 
| 62 | 
            +
                  else
         | 
| 63 | 
            +
                    @inputs = NamedArray.setup info_inputs.values, info_inputs.keys
         | 
| 64 | 
            +
                  end
         | 
| 65 | 
            +
                else
         | 
| 66 | 
            +
                  nil
         | 
| 59 67 | 
             
                end
         | 
| 68 | 
            +
              end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
              def inputs
         | 
| 71 | 
            +
                return @inputs if NamedArray === @inputs
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                load_inputs_from_info if @inputs.nil? 
         | 
| 60 74 |  | 
| 61 | 
            -
                @inputs
         | 
| 75 | 
            +
                NamedArray.setup(@inputs, task.inputs) if task && task.inputs && ! NamedArray === @inputs
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                @inputs || []
         | 
| 62 78 | 
             
              end
         | 
| 63 79 |  | 
| 64 80 | 
             
              def recursive_inputs
         | 
| 65 81 | 
             
                if NamedArray === inputs
         | 
| 66 | 
            -
                  i =  | 
| 82 | 
            +
                  i = {}
         | 
| 83 | 
            +
                  inputs.zip(inputs.fields).each do |v,f|
         | 
| 84 | 
            +
                    i[f] = v
         | 
| 85 | 
            +
                  end
         | 
| 67 86 | 
             
                else
         | 
| 68 87 | 
             
                  i = {}
         | 
| 69 88 | 
             
                end
         | 
| @@ -113,11 +132,27 @@ class Step | |
| 113 132 | 
             
                self
         | 
| 114 133 | 
             
              end
         | 
| 115 134 |  | 
| 135 | 
            +
              def result_type
         | 
| 136 | 
            +
                @result_type ||= if @task.nil?
         | 
| 137 | 
            +
                                   info[:result_type]
         | 
| 138 | 
            +
                                 else
         | 
| 139 | 
            +
                                   @task.result_type
         | 
| 140 | 
            +
                                 end
         | 
| 141 | 
            +
              end
         | 
| 142 | 
            +
             | 
| 143 | 
            +
              def result_description
         | 
| 144 | 
            +
                @result_description ||= if @task.nil?
         | 
| 145 | 
            +
                                   info[:result_description]
         | 
| 146 | 
            +
                                 else
         | 
| 147 | 
            +
                                   @task.result_description
         | 
| 148 | 
            +
                                 end
         | 
| 149 | 
            +
              end
         | 
| 150 | 
            +
             | 
| 116 151 | 
             
              def prepare_result(value, description = nil, entity_info = nil)
         | 
| 117 152 | 
             
                res = case 
         | 
| 118 153 | 
             
                when IO === value
         | 
| 119 154 | 
             
                  begin
         | 
| 120 | 
            -
                    res = case  | 
| 155 | 
            +
                    res = case result_type
         | 
| 121 156 | 
             
                          when :array
         | 
| 122 157 | 
             
                            array = []
         | 
| 123 158 | 
             
                            while line = value.gets
         | 
| @@ -206,13 +241,13 @@ class Step | |
| 206 241 | 
             
                        res = @result
         | 
| 207 242 | 
             
                      else
         | 
| 208 243 | 
             
                        join if not done?
         | 
| 209 | 
            -
                        @path.exists? ? Persist.load_file(@path,  | 
| 244 | 
            +
                        @path.exists? ? Persist.load_file(@path, result_type) : exec
         | 
| 210 245 | 
             
                      end
         | 
| 211 246 |  | 
| 212 | 
            -
                if  | 
| 247 | 
            +
                if result_description
         | 
| 213 248 | 
             
                  entity_info = info.dup
         | 
| 214 249 | 
             
                  entity_info.merge! info[:inputs] if info[:inputs]
         | 
| 215 | 
            -
                  res = prepare_result res,  | 
| 250 | 
            +
                  res = prepare_result res, result_description, entity_info 
         | 
| 216 251 | 
             
                end
         | 
| 217 252 |  | 
| 218 253 | 
             
                res
         | 
| @@ -2,7 +2,7 @@ require 'rbbt/workflow/step/dependencies' | |
| 2 2 |  | 
| 3 3 | 
             
            class Step
         | 
| 4 4 |  | 
| 5 | 
            -
              attr_reader :stream, :dupped, :saved_stream | 
| 5 | 
            +
              attr_reader :stream, :dupped, :saved_stream
         | 
| 6 6 |  | 
| 7 7 | 
             
              def get_stream
         | 
| 8 8 | 
             
                @mutex.synchronize do
         | 
| @@ -21,7 +21,7 @@ class Step | |
| 21 21 | 
             
              def resolve_input_steps
         | 
| 22 22 | 
             
                step = false
         | 
| 23 23 | 
             
                pos = 0
         | 
| 24 | 
            -
                new_inputs =  | 
| 24 | 
            +
                new_inputs = inputs.collect do |i| 
         | 
| 25 25 | 
             
                  begin
         | 
| 26 26 | 
             
                    if Step === i
         | 
| 27 27 | 
             
                      step = true
         | 
| @@ -115,6 +115,10 @@ class Step | |
| 115 115 | 
             
                        :issued => (issue_time = Time.now),
         | 
| 116 116 | 
             
                        :name => name,
         | 
| 117 117 | 
             
                        :clean_name => clean_name,
         | 
| 118 | 
            +
                        :workflow => @task.workflow.to_s,
         | 
| 119 | 
            +
                        :task_name => @task.name,
         | 
| 120 | 
            +
                        :result_type => @task.result_type,
         | 
| 121 | 
            +
                        :result_description => @task.result_description
         | 
| 118 122 | 
             
                      })
         | 
| 119 123 |  | 
| 120 124 | 
             
                      set_info :dependencies, dependencies.collect{|dep| [dep.task_name, dep.name, dep.path]}
         | 
| @@ -124,11 +128,19 @@ class Step | |
| 124 128 | 
             
                      rescue Exception
         | 
| 125 129 | 
             
                        FileUtils.rm pid_file if File.exist?(pid_file)
         | 
| 126 130 | 
             
                        stop_dependencies
         | 
| 127 | 
            -
                        Log.exception $!
         | 
| 128 131 | 
             
                        raise $!
         | 
| 129 132 | 
             
                      end
         | 
| 130 133 |  | 
| 131 | 
            -
                       | 
| 134 | 
            +
                      if not task.inputs.nil?
         | 
| 135 | 
            +
                        info_inputs = @inputs.collect do |i| 
         | 
| 136 | 
            +
                          if Path === i 
         | 
| 137 | 
            +
                            i.to_s
         | 
| 138 | 
            +
                          else 
         | 
| 139 | 
            +
                            i 
         | 
| 140 | 
            +
                          end
         | 
| 141 | 
            +
                        end
         | 
| 142 | 
            +
                        set_info :inputs, Misc.remove_long_items(Misc.zip2hash(task.inputs, info_inputs)) 
         | 
| 143 | 
            +
                      end
         | 
| 132 144 |  | 
| 133 145 | 
             
                      set_info :started, (start_time = Time.now)
         | 
| 134 146 | 
             
                      log :started, "Starting step #{Log.color :yellow, task.name.to_s || ""}"
         | 
    
        data/lib/rbbt/workflow/task.rb
    CHANGED
    
    | @@ -2,7 +2,7 @@ require 'rbbt/util/misc' | |
| 2 2 | 
             
            require 'rbbt/persist'
         | 
| 3 3 |  | 
| 4 4 | 
             
            module Task
         | 
| 5 | 
            -
              attr_accessor :inputs, :input_types, :result_type, :input_defaults, :input_descriptions, :input_options, :required_inputs, :description, :name, :result_description, :extension
         | 
| 5 | 
            +
              attr_accessor :inputs, :input_types, :result_type, :input_defaults, :input_descriptions, :input_options, :required_inputs, :description, :name, :result_description, :extension, :workflow
         | 
| 6 6 |  | 
| 7 7 | 
             
              def self.setup(options = {}, &block)
         | 
| 8 8 | 
             
                block.extend Task
         | 
| @@ -92,6 +92,8 @@ module Task | |
| 92 92 | 
             
                  raise "Dependency task not found: #{dep}" if task.nil?
         | 
| 93 93 | 
             
                  next if seen.include? [wf, task.name]
         | 
| 94 94 |  | 
| 95 | 
            +
                  task.workflow = wf if wf
         | 
| 96 | 
            +
             | 
| 95 97 | 
             
                  seen << [wf, task.name]
         | 
| 96 98 | 
             
                  new_inputs = task.inputs - maps
         | 
| 97 99 | 
             
                  next unless new_inputs.any?
         | 
    
        data/lib/rbbt/workflow/usage.rb
    CHANGED
    
    | @@ -33,7 +33,11 @@ module Task | |
| 33 33 | 
             
                  task_inputs = dep_inputs deps, workflow
         | 
| 34 34 | 
             
                  task_inputs.each do |task,new_inputs|
         | 
| 35 35 | 
             
                    task.inputs.zip(task.input_types.values_at(*task.inputs)).select{|i,t| t.to_sym == :select and task.input_options[i][:select_options] }.each{|i,t| selects << [i, task.input_options[i][:select_options]]  }
         | 
| 36 | 
            -
                     | 
| 36 | 
            +
                    if task.workflow and task.workflow != workflow
         | 
| 37 | 
            +
                      puts "  #{Log.color :yellow, ["[#{task.workflow.to_s}]", task.name.to_s] *" "}:"
         | 
| 38 | 
            +
                    else
         | 
| 39 | 
            +
                      puts "  #{Log.color :yellow, task.name.to_s}:"
         | 
| 40 | 
            +
                    end
         | 
| 37 41 | 
             
                    puts
         | 
| 38 42 | 
             
                    puts SOPT.input_doc(new_inputs, task.input_types, task.input_descriptions, task.input_defaults, true)
         | 
| 39 43 | 
             
                    puts
         | 
    
        data/share/Rlib/util.R
    CHANGED
    
    | @@ -472,12 +472,12 @@ rbbt.get.modes <- function(x,bw = NULL,spar = NULL) { | |
| 472 472 |  | 
| 473 473 | 
             
            #{{{ PLOTS
         | 
| 474 474 |  | 
| 475 | 
            -
            rbbt.png_plot <- function(filename, width, height,  | 
| 475 | 
            +
            rbbt.png_plot <- function(filename, p, width=500, height=500, ...){
         | 
| 476 476 | 
             
                png(filename=filename, width=width, height=height, ...);
         | 
| 477 477 | 
             
                eval(parse(text=p));
         | 
| 478 478 | 
             
            }
         | 
| 479 479 |  | 
| 480 | 
            -
            rbbt.heatmap <- function(filename, width, height,  | 
| 480 | 
            +
            rbbt.heatmap <- function(filename, data, width=500, height=500, take_log=FALSE, ...){
         | 
| 481 481 | 
             
                opar = par()
         | 
| 482 482 | 
             
                png(filename=filename, width=width, height=height);
         | 
| 483 483 |  | 
| @@ -630,7 +630,35 @@ rbbt.plot.text_scatter <- function(formula, data) { | |
| 630 630 | 
             
                text(formula, data=data, cex = 0.6, labels=rownames(data))
         | 
| 631 631 | 
             
            }
         | 
| 632 632 |  | 
| 633 | 
            -
            install. | 
| 634 | 
            -
                 | 
| 635 | 
            -
                 | 
| 633 | 
            +
            rbbt.install.CRAN <- function(pkg){
         | 
| 634 | 
            +
                res = FALSE
         | 
| 635 | 
            +
                tryCatch({ install.packages(pkg); res = TRUE }, error = function(e){ warning(paste("Could not install CRAN ", pkg)); res = FALSE })
         | 
| 636 | 
            +
                return(res)
         | 
| 636 637 | 
             
            }
         | 
| 638 | 
            +
            rbbt.install.bioc <-function(pkg){
         | 
| 639 | 
            +
                res = FALSE
         | 
| 640 | 
            +
                tryCatch({ source("http://bioconductor.org/biocLite.R"); biocLite(pkg); res = TRUE }, error = function(e){ warning(paste("Could not install Bioconductor ", pkg)); res = FALSE })
         | 
| 641 | 
            +
                return(res)
         | 
| 642 | 
            +
            }
         | 
| 643 | 
            +
             | 
| 644 | 
            +
            rbbt.install.github <- function(pkg, ...){
         | 
| 645 | 
            +
                res = FALSE
         | 
| 646 | 
            +
                tryCatch({ library(devtools); install_github(pkg, ...); res = TRUE }, error = function(e){ warning(paste("Could not install GITHUB ", pkg)); res = FALSE })
         | 
| 647 | 
            +
                return(res)
         | 
| 648 | 
            +
            }
         | 
| 649 | 
            +
             | 
| 650 | 
            +
            rbbt.require <- function(pkg, ...){
         | 
| 651 | 
            +
                list.of.packages <- c(pkg)
         | 
| 652 | 
            +
                new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
         | 
| 653 | 
            +
                for (pkg in new.packages){ 
         | 
| 654 | 
            +
                    if (!rbbt.install.github(pkg, ...)){
         | 
| 655 | 
            +
                        if (!rbbt.install.CRAN(pkg, ...)){
         | 
| 656 | 
            +
                            if (!rbbt.install.bioc(pkg, ...)){
         | 
| 657 | 
            +
                                stop("Error!", pkg)
         | 
| 658 | 
            +
                            }
         | 
| 659 | 
            +
                        }
         | 
| 660 | 
            +
                    }
         | 
| 661 | 
            +
                }
         | 
| 662 | 
            +
                library(list.of.packages, character.only=T)
         | 
| 663 | 
            +
            }
         | 
| 664 | 
            +
             | 
| @@ -13,7 +13,7 @@ require 'rbbt/rest/knowledge_base' | |
| 13 13 | 
             
            require 'rbbt/rest/helpers'
         | 
| 14 14 | 
             
            require 'rbbt/rest/web_tool'
         | 
| 15 15 |  | 
| 16 | 
            -
            options = SOPT.get "-e--environment*:-p--port*:-s--server*:-b--bind*:-e--environment*:-R--RServe_session*:--finder:--views*:- | 
| 16 | 
            +
            options = SOPT.get "-e--environment*:-p--port*:-s--server*:-b--bind*:-e--environment*:-R--RServe_session*:--finder:--views*:-W--workflows*"
         | 
| 17 17 |  | 
| 18 18 | 
             
            template = ARGV.first
         | 
| 19 19 |  | 
    
        data/share/rbbt_commands/log
    CHANGED
    
    
    
        data/share/rbbt_commands/tsv/get
    CHANGED
    
    | @@ -3,10 +3,29 @@ | |
| 3 3 | 
             
            require 'rbbt-util'
         | 
| 4 4 | 
             
            require 'rbbt/util/simpleopt'
         | 
| 5 5 |  | 
| 6 | 
            -
            options = SOPT. | 
| 6 | 
            +
            options = SOPT.setup <<EOF
         | 
| 7 7 |  | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 8 | 
            +
            Query a TSV value
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            $ rbbt tsv get [options] <filename.tsv|-> <key>
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            Use - to read from STDIN
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            -tch--tokyocabinet File is a tokyocabinet hash database
         | 
| 15 | 
            +
            -tcb--tokyocabinet_bd File is a tokyocabinet B database
         | 
| 16 | 
            +
            -f--fields* Fields to extract
         | 
| 17 | 
            +
            -k--key_field* Use this field as key
         | 
| 18 | 
            +
            -h--help Print this help
         | 
| 19 | 
            +
            -l--lines Separate in lines
         | 
| 20 | 
            +
            EOF
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            rbbt_usage and exit 0 if options[:help]
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            file, key = ARGV
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            raise ParameterException, "Please specify file and key" if key.nil?
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            file = STDIN if file == '-'
         | 
| 10 29 |  | 
| 11 30 | 
             
            case
         | 
| 12 31 | 
             
            when options[:tokyocabinet]
         | 
| @@ -14,13 +33,31 @@ when options[:tokyocabinet] | |
| 14 33 | 
             
            when options[:tokyocabinet_bd]
         | 
| 15 34 | 
             
              tsv = Persist.open_tokyocabinet(file, false, nil, TokyoCabinet::BDB)
         | 
| 16 35 | 
             
            else
         | 
| 17 | 
            -
               | 
| 36 | 
            +
              if String === file
         | 
| 37 | 
            +
                file = file.dup
         | 
| 38 | 
            +
                Path.setup(File.expand_path(file))
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
              tsv = file
         | 
| 18 41 | 
             
            end
         | 
| 19 42 |  | 
| 20 | 
            -
             | 
| 43 | 
            +
            fields = options[:fields]
         | 
| 44 | 
            +
            key_field = options[:key_field]
         | 
| 45 | 
            +
            fields = fields.split(/[,|]/, -1) unless fields.nil?
         | 
| 21 46 |  | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
            else
         | 
| 25 | 
            -
              puts tsv[value].report
         | 
| 47 | 
            +
            parser = TSV::Parser.new tsv, :key_field => key_field,  :fields => fields
         | 
| 48 | 
            +
            fields ||= parser.fields
         | 
| 26 49 |  | 
| 50 | 
            +
            TSV.traverse(parser) do |k,v|
         | 
| 51 | 
            +
              next unless k.include? key
         | 
| 52 | 
            +
              if fields.length == 1
         | 
| 53 | 
            +
                if options[:lines]
         | 
| 54 | 
            +
                  puts (Array === v ? v.flatten*"\n" : v.to_s ) 
         | 
| 55 | 
            +
                else
         | 
| 56 | 
            +
                  puts (Array === v ? v.flatten*"\t" : v.to_s ) 
         | 
| 57 | 
            +
                end
         | 
| 58 | 
            +
              else
         | 
| 59 | 
            +
                fields.zip(v).each do |field,v|
         | 
| 60 | 
            +
                  puts "#{Log.color :magenta, field+":"} #{v}"
         | 
| 61 | 
            +
                end
         | 
| 62 | 
            +
              end
         | 
| 63 | 
            +
            end
         | 
| @@ -63,7 +63,7 @@ else | |
| 63 63 | 
             
              end
         | 
| 64 64 | 
             
                puts "Rows: #{Log.color :blue, rows}" 
         | 
| 65 65 | 
             
                parts = []
         | 
| 66 | 
            -
                header.first_line.split(header.sep).each_with_index{|p,i| parts << (Log.color(:cyan, "(#{i}) ") << p.strip) }
         | 
| 66 | 
            +
                header.first_line.split(header.sep, -1).each_with_index{|p,i| parts << (Log.color(:cyan, "(#{i}) ") << p.strip) }
         | 
| 67 67 | 
             
                puts parts * "\t"
         | 
| 68 68 | 
             
              puts
         | 
| 69 69 | 
             
            end
         | 
| @@ -14,6 +14,7 @@ Use - to read from STDIN | |
| 14 14 | 
             
            -tch--tokyocabinet File is a tokyocabinet hash database
         | 
| 15 15 | 
             
            -tcb--tokyocabinet_bd File is a tokyocabinet B database
         | 
| 16 16 | 
             
            -f--field* Limit to a particular field
         | 
| 17 | 
            +
            -k--keys Print also keys
         | 
| 17 18 | 
             
            -h--help Print this help
         | 
| 18 19 | 
             
            -l--lines Separate in lines
         | 
| 19 20 |  | 
| @@ -45,6 +46,8 @@ fields = field.nil? ? nil : [field] | |
| 45 46 | 
             
            TSV.traverse(tsv, :fields => fields) do |k,v|
         | 
| 46 47 | 
             
              if options[:lines]
         | 
| 47 48 | 
             
                puts (Array === v ? v.flatten*"\n" : v.to_s ) 
         | 
| 49 | 
            +
              elsif options[:keys]
         | 
| 50 | 
            +
                puts(k << "\t" << (Array === v ? v.flatten*"\t" : v.to_s ))
         | 
| 48 51 | 
             
              else
         | 
| 49 52 | 
             
                puts (Array === v ? v.flatten*"\t" : v.to_s ) 
         | 
| 50 53 | 
             
              end
         | 
| @@ -132,6 +132,7 @@ if recursive | |
| 132 132 |  | 
| 133 133 | 
             
              while deps.any? do
         | 
| 134 134 | 
             
                dep = deps.shift
         | 
| 135 | 
            +
                inputs = {} if inputs.nil?
         | 
| 135 136 | 
             
                inputs = inputs.merge(dep.info[:inputs] || {})
         | 
| 136 137 | 
             
                deps.concat (dep.info[:dependencies] || []).collect{|v| get_step v.last }
         | 
| 137 138 | 
             
              end
         | 
| @@ -139,14 +140,16 @@ if recursive | |
| 139 140 | 
             
              inputs.each do |input,value|
         | 
| 140 141 | 
             
                case value
         | 
| 141 142 | 
             
                when nil
         | 
| 142 | 
            -
                  puts "  " <<  | 
| 143 | 
            +
                  puts Misc.format_definition_list_item("  " << input.to_s, 'nil', 80, 20, :blue)
         | 
| 143 144 | 
             
                when Array
         | 
| 144 | 
            -
                  puts "  " <<  | 
| 145 | 
            +
                  puts Misc.format_definition_list_item("  " << input.to_s, (value.length > 6 ? (value[0..5])*"\n\n" << "\n\n" << "..." : value * "\n\n" ), 80, 20, :blue).gsub("\n\n","\n")
         | 
| 145 146 | 
             
                when TrueClass, FalseClass
         | 
| 146 | 
            -
                  puts "  " <<  | 
| 147 | 
            +
                  puts Misc.format_definition_list_item("  " << input.to_s, value.to_s, 80, 20, :blue)
         | 
| 147 148 | 
             
                else
         | 
| 148 | 
            -
                   | 
| 149 | 
            -
                   | 
| 149 | 
            +
                  lines = value.to_s.split("\n").collect{|l| l.length >= 60 ? l[0..45] + " ..." : l }
         | 
| 150 | 
            +
                  text = lines[0..5].compact * "\n\n"
         | 
| 151 | 
            +
                  text << "\n\n...\n\n" if lines.length > 6
         | 
| 152 | 
            +
                  puts Misc.format_definition_list_item("  " << input.to_s, text, 80, 20, :blue).gsub("\n\n","\n")
         | 
| 150 153 | 
             
                end
         | 
| 151 154 | 
             
              end
         | 
| 152 155 | 
             
            end
         | 
| @@ -184,6 +184,7 @@ the job dependencies recursively. | |
| 184 184 | 
             
            -pn--printname Print the name of the job and exit without starting it
         | 
| 185 185 | 
             
            -pf--printpath Print the path of the job result
         | 
| 186 186 | 
             
            -cl--clean Clean the last step of the job so that it gets recomputed
         | 
| 187 | 
            +
            -ct--clean_task* Clean a particular dependency task
         | 
| 187 188 | 
             
            -rcl--recursive_clean Clean the last step and its dependencies to recompute the job completely
         | 
| 188 189 | 
             
            --fork Run job asyncronously and monitor progress. It monitors detached processes as well
         | 
| 189 190 | 
             
            --detach Run job asyncronously and detach process
         | 
| @@ -210,6 +211,7 @@ do_fork = !!options.delete(:fork) | |
| 210 211 | 
             
            detach = !!options.delete(:detach)
         | 
| 211 212 | 
             
            do_exec = !!options.delete(:exec)
         | 
| 212 213 | 
             
            clean = !!options.delete(:clean)
         | 
| 214 | 
            +
            clean_task = options.delete(:clean_task)
         | 
| 213 215 | 
             
            recursive_clean = !!options.delete(:recursive_clean)
         | 
| 214 216 | 
             
            out = options.include?(:output) ? File.open(options[:output], 'wb') : STDOUT
         | 
| 215 217 |  | 
| @@ -298,6 +300,12 @@ if clean | |
| 298 300 | 
             
              sleep 1
         | 
| 299 301 | 
             
            end
         | 
| 300 302 |  | 
| 303 | 
            +
            if clean_task
         | 
| 304 | 
            +
              job.rec_dependencies.each do |dep|
         | 
| 305 | 
            +
                dep.clean if dep.task_name.to_s == clean_task.to_s
         | 
| 306 | 
            +
              end
         | 
| 307 | 
            +
            end
         | 
| 308 | 
            +
             | 
| 301 309 | 
             
            if recursive_clean 
         | 
| 302 310 | 
             
              job.recursive_clean 
         | 
| 303 311 | 
             
            end
         | 
    
        data/test/rbbt/util/test_misc.rb
    CHANGED
    
    | @@ -557,4 +557,11 @@ eum fugiat quo voluptas nulla pariatur?" | |
| 557 557 | 
             
                assert Misc.break_lines(text, 10).split("\n").length == 1 + text.length / 10
         | 
| 558 558 | 
             
                assert Misc.break_lines(text, 10).split("\n").select{|l| l.length > 10 }.empty?
         | 
| 559 559 | 
             
              end
         | 
| 560 | 
            +
             | 
| 561 | 
            +
              def test_parse_sql_values
         | 
| 562 | 
            +
                str=<<'EOF'
         | 
| 563 | 
            +
            (xxx,yyy,zzz),(aaa,'bb(,)b',ccc)
         | 
| 564 | 
            +
            EOF
         | 
| 565 | 
            +
                assert Misc.parse_sql_values(str)[1][1] == "bb(,)b"
         | 
| 566 | 
            +
              end
         | 
| 560 567 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: rbbt-util
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 5.21. | 
| 4 | 
            +
              version: 5.21.92
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Miguel Vazquez
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2017- | 
| 11 | 
            +
            date: 2017-08-10 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rake
         | 
| @@ -508,83 +508,83 @@ signing_key: | |
| 508 508 | 
             
            specification_version: 4
         | 
| 509 509 | 
             
            summary: Utilities for the Ruby Bioinformatics Toolkit (rbbt)
         | 
| 510 510 | 
             
            test_files:
         | 
| 511 | 
            -
            - test/ | 
| 511 | 
            +
            - test/test_helper.rb
         | 
| 512 512 | 
             
            - test/rbbt/resource/test_path.rb
         | 
| 513 | 
            -
            - test/rbbt/ | 
| 514 | 
            -
            - test/rbbt/ | 
| 515 | 
            -
            - test/rbbt/ | 
| 516 | 
            -
            - test/rbbt/ | 
| 517 | 
            -
            - test/rbbt/ | 
| 518 | 
            -
            - test/rbbt/util/ | 
| 513 | 
            +
            - test/rbbt/association/test_item.rb
         | 
| 514 | 
            +
            - test/rbbt/association/test_database.rb
         | 
| 515 | 
            +
            - test/rbbt/association/test_open.rb
         | 
| 516 | 
            +
            - test/rbbt/association/test_index.rb
         | 
| 517 | 
            +
            - test/rbbt/association/test_util.rb
         | 
| 518 | 
            +
            - test/rbbt/util/test_concurrency.rb
         | 
| 519 519 | 
             
            - test/rbbt/util/test_log.rb
         | 
| 520 | 
            +
            - test/rbbt/util/test_chain_methods.rb
         | 
| 521 | 
            +
            - test/rbbt/util/test_simpleopt.rb
         | 
| 522 | 
            +
            - test/rbbt/util/simpleopt/test_parse.rb
         | 
| 523 | 
            +
            - test/rbbt/util/simpleopt/test_get.rb
         | 
| 524 | 
            +
            - test/rbbt/util/simpleopt/test_setup.rb
         | 
| 525 | 
            +
            - test/rbbt/util/test_cmd.rb
         | 
| 526 | 
            +
            - test/rbbt/util/test_semaphore.rb
         | 
| 527 | 
            +
            - test/rbbt/util/concurrency/test_threads.rb
         | 
| 528 | 
            +
            - test/rbbt/util/concurrency/processes/test_socket.rb
         | 
| 529 | 
            +
            - test/rbbt/util/concurrency/test_processes.rb
         | 
| 530 | 
            +
            - test/rbbt/util/test_tmpfile.rb
         | 
| 520 531 | 
             
            - test/rbbt/util/test_open.rb
         | 
| 532 | 
            +
            - test/rbbt/util/test_filecache.rb
         | 
| 533 | 
            +
            - test/rbbt/util/R/test_eval.rb
         | 
| 534 | 
            +
            - test/rbbt/util/R/test_model.rb
         | 
| 535 | 
            +
            - test/rbbt/util/test_simpleDSL.rb
         | 
| 536 | 
            +
            - test/rbbt/util/log/test_progress.rb
         | 
| 537 | 
            +
            - test/rbbt/util/test_colorize.rb
         | 
| 538 | 
            +
            - test/rbbt/util/test_R.rb
         | 
| 521 539 | 
             
            - test/rbbt/util/misc/test_lock.rb
         | 
| 522 | 
            -
            - test/rbbt/util/misc/test_multipart_payload.rb
         | 
| 523 | 
            -
            - test/rbbt/util/misc/test_bgzf.rb
         | 
| 524 540 | 
             
            - test/rbbt/util/misc/test_pipes.rb
         | 
| 541 | 
            +
            - test/rbbt/util/misc/test_bgzf.rb
         | 
| 525 542 | 
             
            - test/rbbt/util/misc/test_omics.rb
         | 
| 526 | 
            -
            - test/rbbt/util/ | 
| 527 | 
            -
            - test/rbbt/util/test_R.rb
         | 
| 528 | 
            -
            - test/rbbt/util/log/test_progress.rb
         | 
| 529 | 
            -
            - test/rbbt/util/test_colorize.rb
         | 
| 530 | 
            -
            - test/rbbt/util/test_simpleopt.rb
         | 
| 543 | 
            +
            - test/rbbt/util/misc/test_multipart_payload.rb
         | 
| 531 544 | 
             
            - test/rbbt/util/test_excel2tsv.rb
         | 
| 532 | 
            -
            - test/rbbt/util/test_filecache.rb
         | 
| 533 | 
            -
            - test/rbbt/util/concurrency/test_processes.rb
         | 
| 534 | 
            -
            - test/rbbt/util/concurrency/test_threads.rb
         | 
| 535 | 
            -
            - test/rbbt/util/concurrency/processes/test_socket.rb
         | 
| 536 | 
            -
            - test/rbbt/util/test_semaphore.rb
         | 
| 537 545 | 
             
            - test/rbbt/util/test_misc.rb
         | 
| 538 | 
            -
            - test/rbbt/util/test_tmpfile.rb
         | 
| 539 | 
            -
            - test/rbbt/util/R/test_model.rb
         | 
| 540 | 
            -
            - test/rbbt/util/R/test_eval.rb
         | 
| 541 | 
            -
            - test/rbbt/test_packed_index.rb
         | 
| 542 | 
            -
            - test/rbbt/entity/test_identifiers.rb
         | 
| 543 | 
            -
            - test/rbbt/test_association.rb
         | 
| 544 | 
            -
            - test/rbbt/knowledge_base/test_traverse.rb
         | 
| 545 | 
            -
            - test/rbbt/knowledge_base/test_registry.rb
         | 
| 546 | 
            -
            - test/rbbt/knowledge_base/test_entity.rb
         | 
| 547 | 
            -
            - test/rbbt/knowledge_base/test_enrichment.rb
         | 
| 548 | 
            -
            - test/rbbt/knowledge_base/test_syndicate.rb
         | 
| 549 | 
            -
            - test/rbbt/knowledge_base/test_query.rb
         | 
| 550 | 
            -
            - test/rbbt/test_resource.rb
         | 
| 551 546 | 
             
            - test/rbbt/test_entity.rb
         | 
| 552 | 
            -
            - test/rbbt/test_knowledge_base.rb
         | 
| 553 | 
            -
            - test/rbbt/annotations/test_util.rb
         | 
| 554 | 
            -
            - test/rbbt/association/test_index.rb
         | 
| 555 | 
            -
            - test/rbbt/association/test_item.rb
         | 
| 556 | 
            -
            - test/rbbt/association/test_open.rb
         | 
| 557 | 
            -
            - test/rbbt/association/test_util.rb
         | 
| 558 | 
            -
            - test/rbbt/association/test_database.rb
         | 
| 559 | 
            -
            - test/rbbt/test_tsv.rb
         | 
| 560 547 | 
             
            - test/rbbt/workflow/step/test_dependencies.rb
         | 
| 561 | 
            -
            - test/rbbt/workflow/test_task.rb
         | 
| 562 | 
            -
            - test/rbbt/workflow/test_step.rb
         | 
| 563 548 | 
             
            - test/rbbt/workflow/test_doc.rb
         | 
| 564 | 
            -
            - test/rbbt/ | 
| 565 | 
            -
            - test/rbbt/ | 
| 566 | 
            -
            - test/rbbt/ | 
| 567 | 
            -
            - test/rbbt/ | 
| 568 | 
            -
            - test/rbbt/ | 
| 569 | 
            -
            - test/rbbt/ | 
| 570 | 
            -
            - test/rbbt/persist/tsv/test_sharder.rb
         | 
| 571 | 
            -
            - test/rbbt/persist/tsv/test_cdb.rb
         | 
| 572 | 
            -
            - test/rbbt/persist/tsv/test_tokyocabinet.rb
         | 
| 573 | 
            -
            - test/rbbt/persist/tsv/test_leveldb.rb
         | 
| 574 | 
            -
            - test/rbbt/tsv/test_field_index.rb
         | 
| 549 | 
            +
            - test/rbbt/workflow/test_step.rb
         | 
| 550 | 
            +
            - test/rbbt/workflow/test_task.rb
         | 
| 551 | 
            +
            - test/rbbt/test_association.rb
         | 
| 552 | 
            +
            - test/rbbt/test_knowledge_base.rb
         | 
| 553 | 
            +
            - test/rbbt/tsv/parallel/test_traverse.rb
         | 
| 554 | 
            +
            - test/rbbt/tsv/parallel/test_through.rb
         | 
| 575 555 | 
             
            - test/rbbt/tsv/test_parallel.rb
         | 
| 576 | 
            -
            - test/rbbt/tsv/test_index.rb
         | 
| 577 | 
            -
            - test/rbbt/tsv/test_matrix.rb
         | 
| 578 | 
            -
            - test/rbbt/tsv/test_change_id.rb
         | 
| 579 | 
            -
            - test/rbbt/tsv/test_parser.rb
         | 
| 580 | 
            -
            - test/rbbt/tsv/test_stream.rb
         | 
| 581 | 
            -
            - test/rbbt/tsv/test_util.rb
         | 
| 582 556 | 
             
            - test/rbbt/tsv/test_excel.rb
         | 
| 583 557 | 
             
            - test/rbbt/tsv/test_accessor.rb
         | 
| 558 | 
            +
            - test/rbbt/tsv/test_change_id.rb
         | 
| 559 | 
            +
            - test/rbbt/tsv/test_stream.rb
         | 
| 584 560 | 
             
            - test/rbbt/tsv/test_filter.rb
         | 
| 561 | 
            +
            - test/rbbt/tsv/test_matrix.rb
         | 
| 585 562 | 
             
            - test/rbbt/tsv/test_attach.rb
         | 
| 586 563 | 
             
            - test/rbbt/tsv/test_manipulate.rb
         | 
| 587 | 
            -
            - test/rbbt/tsv/ | 
| 588 | 
            -
            - test/rbbt/tsv/ | 
| 564 | 
            +
            - test/rbbt/tsv/test_field_index.rb
         | 
| 565 | 
            +
            - test/rbbt/tsv/test_index.rb
         | 
| 566 | 
            +
            - test/rbbt/tsv/test_util.rb
         | 
| 567 | 
            +
            - test/rbbt/tsv/test_parser.rb
         | 
| 568 | 
            +
            - test/rbbt/test_packed_index.rb
         | 
| 569 | 
            +
            - test/rbbt/test_persist.rb
         | 
| 589 570 | 
             
            - test/rbbt/test_fix_width_table.rb
         | 
| 590 | 
            -
            - test/ | 
| 571 | 
            +
            - test/rbbt/knowledge_base/test_traverse.rb
         | 
| 572 | 
            +
            - test/rbbt/knowledge_base/test_entity.rb
         | 
| 573 | 
            +
            - test/rbbt/knowledge_base/test_query.rb
         | 
| 574 | 
            +
            - test/rbbt/knowledge_base/test_enrichment.rb
         | 
| 575 | 
            +
            - test/rbbt/knowledge_base/test_syndicate.rb
         | 
| 576 | 
            +
            - test/rbbt/knowledge_base/test_registry.rb
         | 
| 577 | 
            +
            - test/rbbt/entity/test_identifiers.rb
         | 
| 578 | 
            +
            - test/rbbt/test_monitor.rb
         | 
| 579 | 
            +
            - test/rbbt/test_workflow.rb
         | 
| 580 | 
            +
            - test/rbbt/test_annotations.rb
         | 
| 581 | 
            +
            - test/rbbt/annotations/test_util.rb
         | 
| 582 | 
            +
            - test/rbbt/test_resource.rb
         | 
| 583 | 
            +
            - test/rbbt/persist/tsv/test_tokyocabinet.rb
         | 
| 584 | 
            +
            - test/rbbt/persist/tsv/test_kyotocabinet.rb
         | 
| 585 | 
            +
            - test/rbbt/persist/tsv/test_lmdb.rb
         | 
| 586 | 
            +
            - test/rbbt/persist/tsv/test_leveldb.rb
         | 
| 587 | 
            +
            - test/rbbt/persist/tsv/test_cdb.rb
         | 
| 588 | 
            +
            - test/rbbt/persist/tsv/test_sharder.rb
         | 
| 589 | 
            +
            - test/rbbt/persist/test_tsv.rb
         | 
| 590 | 
            +
            - test/rbbt/test_tsv.rb
         |