rbbt-util 5.34.4 → 5.34.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eda1db070a45b3361a0c5c6b02fd59e39b031ae4264771f015e4068a888d1f09
4
- data.tar.gz: 0f9a4bfafce4180f1db402510f83a880e22f5a75d92bf7506781801ce61575a2
3
+ metadata.gz: '073587b420676db7c055e58dbabaecbf04a7b30ba9d7ea912f1c12df5a6d180d'
4
+ data.tar.gz: 6d263d07b85095fefb48c15692af0db66b56ef671ada83e98c66a4765d4ca416
5
5
  SHA512:
6
- metadata.gz: 7738b49efed37124e80b5aa72b367e9d92d32dc13d64fceef5c452e5b50687882d5bc03106aa906c7f425937ceac72694f8eb8959e2c9d3402164b8618c4c639
7
- data.tar.gz: de617b931b585915e029f8f23124b6ce5cccc9091dec25e2fc3fdd8c4d2eaf4e23bfce798c73b753cb08f590933c316ceb7deffafd8e8aca854ea175d5744014
6
+ metadata.gz: 945c0f4b9d6f99024f6610dc2eb0c52c6546606937fff72558281ecf5d2aaddeb2e32ce3373b9348fa764e8e7285cdcdad6916118ba259d61c24b4b3477e3317
7
+ data.tar.gz: a8ba069b626b1a09d6da8e73eaa901119795ade4b4af33f1891b8581cfe80ccf48ca439a6a96b67f45e6bdf687ba7e90df263b8b4caabec18af45f6008e2b5d9
@@ -162,6 +162,10 @@ module Association
162
162
 
163
163
  data ||= {}
164
164
  tsv = nil
165
+ if data.respond_to?(:close) && data.respond_to?(:write)
166
+ data.close
167
+ data.write
168
+ end
165
169
  TmpFile.with_file do |tmpfile|
166
170
  tmp_data = Persist.open_database(tmpfile, true, open_options[:type], "HDB")
167
171
 
@@ -1,7 +1,7 @@
1
1
  require 'rake'
2
2
  module Rake
3
3
  class TaskNotFound < StandardError; end
4
- def self.run(rakefile, dir, task)
4
+ def self.run(rakefile, dir, task, &block)
5
5
  old_pwd = FileUtils.pwd
6
6
 
7
7
  Rake::FileTask.module_eval do
@@ -32,9 +32,15 @@ module Rake
32
32
  t = nil
33
33
  pid = Process.fork{
34
34
  if block_given?
35
- yield
35
+ TOPLEVEL_BINDING.receiver.instance_exec &block
36
36
  else
37
- load rakefile
37
+ if Misc.is_filename? rakefile
38
+ load rakefile
39
+ else
40
+ TmpFile.with_file(rakefile) do |tmpfile|
41
+ load tmpfile
42
+ end
43
+ end
38
44
  end
39
45
 
40
46
  raise TaskNotFound if Rake::Task[task].nil?
@@ -123,8 +123,8 @@ module Resource
123
123
 
124
124
 
125
125
  def rake_for(path)
126
- @rake_dirs.reject{|dir, content|
127
- !Misc.common_path(dir, path)
126
+ @rake_dirs.select{|dir, content|
127
+ Misc.common_path(dir, path)
128
128
  }.sort_by{|dir, content|
129
129
  dir.length
130
130
  }.last
@@ -137,12 +137,17 @@ module Resource
137
137
  def run_rake(path, rakefile, rake_dir)
138
138
  task = Misc.path_relative_to rake_dir, path
139
139
  rakefile = rakefile.produce if rakefile.respond_to? :produce
140
+ rakefile = rakefile.find if rakefile.respond_to? :find
140
141
 
141
142
  rake_dir = rake_dir.find(:user) if rake_dir.respond_to? :find
142
143
 
143
144
  begin
144
145
  require 'rbbt/resource/rake'
145
- Rake.run(rakefile, rake_dir, task)
146
+ if Proc === rakefile
147
+ Rake.run(nil, rake_dir, task, &rakefile)
148
+ else
149
+ Rake.run(rakefile, rake_dir, task)
150
+ end
146
151
  rescue Rake::TaskNotFound
147
152
  raise $! if rake_dir.nil? or rake_dir.empty? or rake_dir == "/" or rake_dir == "./"
148
153
  task = File.join(File.basename(rake_dir), task)
data/lib/rbbt/resource.rb CHANGED
@@ -59,7 +59,7 @@ module Resource
59
59
 
60
60
  def claim(path, type, content = nil, &block)
61
61
  if type == :rake
62
- @rake_dirs[path] = content
62
+ @rake_dirs[path] = content || block
63
63
  else
64
64
  @resources[path] = [type, content || block]
65
65
 
@@ -89,7 +89,7 @@ module TSV
89
89
  tsv[k] = v
90
90
  end
91
91
  end
92
-
92
+
93
93
  tsv.fields = tsv.fields.collect{|f| f == field ? format : f}
94
94
  end
95
95
 
@@ -8,7 +8,9 @@ module TSV
8
8
 
9
9
  def all_fields
10
10
  all = [key_field] + fields
11
- NamedArray.setup all, all
11
+ # ToDo: What was this for?
12
+ #NamedArray.setup all, all
13
+ all
12
14
  end
13
15
 
14
16
  def parse_header(stream)
@@ -550,12 +552,12 @@ module TSV
550
552
  line = self.rescue_first_line
551
553
  line = stream.gets if line.nil?
552
554
 
553
- if @tsv_grep
555
+ if @tsv_grep || grep
554
556
 
555
- stream = Open.grep(stream, @tsv_grep, invert_grep, fixed_grep)
557
+ stream = Open.grep(stream, @tsv_grep || grep, invert_grep, fixed_grep)
556
558
  stream.no_fail = true
557
559
  begin
558
- match = Open.grep(StringIO.new(line), @tsv_grep, invert_grep, fixed_grep).read
560
+ match = Open.grep(StringIO.new(line), @tsv_grep || grep, invert_grep, fixed_grep).read
559
561
  line = stream.gets if match.empty?
560
562
  rescue Exception
561
563
  Log.exception $!
@@ -72,7 +72,9 @@ module Misc
72
72
  when File
73
73
  "<File:" + obj.path + ">"
74
74
  when NamedArray
75
- "[<NamedArray: fields=#{fingerprint obj.fields} -- values=#{fingerprint obj[0..-1]}]"
75
+ fields = obj.fields
76
+ fields = fields.collect if NamedArray === fields
77
+ "[<NamedArray: fields=#{fingerprint fields} -- values=#{fingerprint obj[0..-1]}]"
76
78
  when Array
77
79
  if (length = obj.length) > 10
78
80
  "[#{length}--" << (obj.values_at(0,1, length / 2, -2, -1).collect{|e| fingerprint(e)} * ",") << "]"
@@ -299,7 +301,7 @@ module Misc
299
301
  when nil
300
302
  'nil'
301
303
  when Numeric
302
- obj.to_f
304
+ Float === obj && obj % 1 == 0 ? obj.to_i.to_s : obj.to_s
303
305
  when Symbol
304
306
  obj.to_s
305
307
  when TrueClass
@@ -119,7 +119,7 @@ module Misc
119
119
  def self.correct_icgc_mutation(pos, ref, mut_str)
120
120
  mut = mut_str
121
121
  mut = '-' * (mut_str.length - 1) if mut =~/^-[ACGT]/
122
- mut = "+" << mut if ref == '-'
122
+ mut = "+" << mut if ref == '-'
123
123
  [pos, [mut]]
124
124
  end
125
125
 
@@ -1,5 +1,6 @@
1
1
  require 'rbbt-util'
2
2
  require 'pycall/import'
3
+ require 'rbbt/util/python/util'
3
4
 
4
5
  module RbbtPython
5
6
  extend PyCall::Import
@@ -148,6 +148,11 @@ job.clean
148
148
  def self.upload_inputs(server, inputs, input_types, input_id)
149
149
  TmpFile.with_file do |dir|
150
150
  if Step.save_inputs(inputs, input_types, dir)
151
+ Dir.glob(File.join(dir, "*.as_step")).each do |file|
152
+ path = Open.read(file).strip
153
+ new = Step.migrate(path, :user, :target => server)
154
+ Open.write(file, new)
155
+ end
151
156
  CMD.cmd("ssh '#{server}' mkdir -p .rbbt/tmp/tmp-ssh_job_inputs/; scp -r '#{dir}' #{server}:.rbbt/tmp/tmp-ssh_job_inputs/#{input_id}")
152
157
  end
153
158
  end
@@ -3,6 +3,7 @@ class RemoteStep
3
3
  attr_accessor :override_dependencies
4
4
 
5
5
  def init_job(cache_type = nil, other_params = {})
6
+ return self if @url
6
7
  cache_type = :asynchronous if cache_type.nil? and not @is_exec
7
8
  cache_type = :exec if cache_type.nil?
8
9
  @last_info_time = nil
@@ -10,20 +11,17 @@ class RemoteStep
10
11
  @server, @server_path = RemoteWorkflow::SSH.parse_url base_url
11
12
  @input_id ||= "inputs-" << rand(100000).to_s
12
13
 
13
- if override_dependencies
14
-
15
- if override_dependencies && override_dependencies.any?
16
- override_dependencies.each do |od|
17
- name, _sep, value = od.partition("=")
18
- inputs[name] = value
19
- end
14
+ if override_dependencies && override_dependencies.any?
15
+ override_dependencies.each do |od|
16
+ name, _sep, value = od.partition("=")
17
+ inputs[name] = value
20
18
  end
21
-
22
- RemoteWorkflow::SSH.upload_inputs(@server, inputs, @input_types, @input_id)
23
- else
24
- RemoteWorkflow::SSH.upload_inputs(@server, inputs, @input_types, @input_id)
25
19
  end
26
20
 
21
+ inputs.select{|i| Step === i }.each{|i| i.produce }
22
+
23
+ RemoteWorkflow::SSH.upload_inputs(@server, inputs, @input_types, @input_id)
24
+
27
25
  @name ||= Persist.memory("RemoteSteps", :workflow => self, :task => task, :jobname => @name, :inputs => inputs, :cache_type => cache_type) do
28
26
  Misc.insist do
29
27
  input_types = {}
@@ -51,8 +51,8 @@ module Workflow
51
51
  when :path
52
52
  inputs[input.to_sym] = Open.read(file).strip.split("\n").first
53
53
  when :io
54
- inputs[input.to_sym] = Open.open(Open.realpath(file)).split("\n")
55
- when :io
54
+ inputs[input.to_sym] = Open.open(Open.realpath(file))
55
+ when :io_array
56
56
  inputs[input.to_sym] = Open.realpath(file).split("\n").collect{|f| Open.open(f)}
57
57
  when :step_array
58
58
  steps = Open.read(file).strip.split("\n").collect{|path| Workflow.load_step(path) }
@@ -97,6 +97,10 @@ module Workflow
97
97
  inputs[input.to_sym] = TSV.open(file)
98
98
  when :boolean
99
99
  inputs[input.to_sym] = (file.read.strip == 'true')
100
+ when :integer
101
+ inputs[input.to_sym] = file.read.to_i
102
+ when :float
103
+ inputs[input.to_sym] = file.read.to_f
100
104
  else
101
105
  Log.debug "Loading #{ input } from #{file}"
102
106
  inputs[input.to_sym] = file.read.strip
@@ -172,10 +176,17 @@ class Step
172
176
  end
173
177
 
174
178
  Log.debug "Saving job input #{name} (#{type}) into #{path}"
175
- Open.write(path, value.to_s)
179
+
180
+ if value.respond_to? :filename
181
+ Open.write(path, value.filename)
182
+ elsif IO === value
183
+ Open.write(path, value)
184
+ else
185
+ Open.write(path, value.to_s)
186
+ end
176
187
  end
177
188
 
178
- def self.save_inputs(inputs, input_types, input_options, dir)
189
+ def self.save_inputs(inputs, input_types, dir)
179
190
  inputs.each do |name,value|
180
191
  type = input_types[name]
181
192
  type = type.to_s if type
@@ -220,7 +231,7 @@ class Step
220
231
  input_types = IndiferentHash.setup(input_types.merge(:override_dependencies => :array))
221
232
  end
222
233
 
223
- save_inputs(inputs, input_types, input_options, dir)
234
+ save_inputs(inputs, input_types, dir)
224
235
 
225
236
  inputs.keys
226
237
  end
@@ -363,7 +363,7 @@ class Step
363
363
  def recursive_clean
364
364
  dependencies.each do |step|
365
365
  step.recursive_clean
366
- end
366
+ end if dependencies
367
367
  clean if Open.exists?(self.info_file)
368
368
  self
369
369
  end
@@ -184,9 +184,13 @@ puts files * "\n"
184
184
 
185
185
  target = Rbbt.migrate_target_path('var/jobs', search_path, resource, options[:target])
186
186
 
187
+ target_path = File.join(target, *path.split("/")[-3..-1])
188
+
187
189
  subpath_files.each do |subpath, files|
188
190
  Rbbt.migrate_files([subpath], target, options.merge(:files => files))
189
191
  end
192
+
193
+ target_path
190
194
  end
191
195
 
192
196
  def self.purge(path, recursive = false, skip_overriden = true)
@@ -109,7 +109,7 @@ class Step
109
109
  end
110
110
  end
111
111
  end
112
- end
112
+ end if step.dependencies
113
113
 
114
114
  str = ""
115
115
  str = " " * offset + this_step_msg if ENV["RBBT_ORIGINAL_STACK"] == 'true'
data/share/Rlib/util.R CHANGED
@@ -232,20 +232,26 @@ rbbt.tsv2tibble <- function(data){
232
232
  as_tibble(data, rownames=attr(data, 'key.field'))
233
233
  }
234
234
 
235
- rbbt.tsv.write <- function(filename, data, key.field = NULL, extra_headers = NULL, eol="\n", ...){
235
+ rbbt.tsv.write <- function(filename, data, key.field = NULL, extra_headers = NULL, eol="\n", type = 'list', names = NULL, ...){
236
236
 
237
237
  if (is.null(key.field)){ key.field = attributes(data)$key.field;}
238
238
  if (is.null(key.field)){ key.field = "ID";}
239
239
 
240
240
  f = file(filename, 'wb');
241
241
 
242
+ if (is.null(extra_headers)){
243
+ extra_headers = paste(":type",type,sep="=")
244
+ }
245
+
242
246
  if (!is.null(extra_headers)){
243
247
  extra_headers = paste("#: ", extra_headers, "\n", sep="");
244
248
  cat(extra_headers, file=f);
245
249
  }
246
250
 
247
251
  header = paste("#", key.field, sep="");
248
- for (name in colnames(data)){ header = paste(header, name, sep="\t");}
252
+ if (is.null(names)){ names = colnames(data)}
253
+ if (is.null(names)){ names = names(data)}
254
+ for (name in names){ header = paste(header, name, sep="\t");}
249
255
  header = paste(header, "\n", sep="");
250
256
  cat(header, file=f);
251
257
 
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rbbt-util'
4
+ require 'rbbt/util/simpleopt'
5
+
6
+ $0 = "rbbt #{$previous_commands*" "} #{ File.basename(__FILE__) }" if $previous_commands
7
+
8
+ options = SOPT.setup <<EOF
9
+
10
+ View TSV nicer
11
+
12
+ $ #{$0} [options] <filename.tsv|->
13
+
14
+ Use - to read from STDIN
15
+
16
+ -h--help Print this help
17
+
18
+ EOF
19
+ if options[:help]
20
+ if defined? rbbt_usage
21
+ rbbt_usage
22
+ else
23
+ puts SOPT.doc
24
+ end
25
+ exit 0
26
+ end
27
+
28
+
29
+ file = ARGV.shift
30
+
31
+ file = STDIN if file == '-'
32
+
33
+ case
34
+ when options[:tokyocabinet]
35
+ tsv = Persist.open_tokyocabinet(file, false)
36
+ when options[:tokyocabinet_bd]
37
+ tsv = Persist.open_tokyocabinet(file, false, nil, TokyoCabinet::BDB)
38
+ else
39
+ if String === file
40
+ file = file.dup
41
+ Path.setup(File.expand_path(file))
42
+ end
43
+ tsv = file
44
+ end
45
+
46
+ tsv = TSV.open(tsv) if IO === tsv
47
+
48
+
49
+ begin
50
+ Workflow.require_workflow "Genomics"
51
+ tsv = Genomics.job(:names, nil, :tsv => tsv).run
52
+ rescue
53
+ end
54
+
55
+ puts [Log.highlight(Log.color(:magenta, tsv.key_field)), Log.color(:yellow, tsv.fields * "\t")] * "\t"
56
+ TSV.traverse tsv do |k,values,fields|
57
+ fvalues = values.zip(fields).collect do |v,field|
58
+ if String === v
59
+ v = v.to_f.round(2) if v =~ /^-?\d+\.\d+$/
60
+ v = v.to_i if v =~ /^-?\d+$/
61
+ end
62
+
63
+ if Numeric === v
64
+ if field =~ /p.?value/i
65
+ v = v.round(4)
66
+ v < 0.05 ? Log.color(:cyan, v.to_s) : v
67
+ else
68
+ v = v.round(2)
69
+ v < 0 ? Log.color(:red, v.to_s) : Log.color(:green, v.to_s)
70
+ end
71
+ else
72
+ v
73
+ end
74
+ end
75
+ puts [Log.color(:magenta, k), fvalues] * "\t"
76
+ end
@@ -17,9 +17,18 @@ module TestResource
17
17
  file 'foo' do |t|
18
18
  Open.write(t.name, "TEST")
19
19
  end
20
+
21
+ rule /.*/ do |t|
22
+ Open.write(t.name, "bar")
23
+ end
20
24
  EOF
21
25
 
22
- claim tmp.test.work.footest, :rake, tmp.test.rakefiles.foo
26
+ claim tmp.test.work.footest, :rake, TestResource.tmp.test.rakefiles.foo
27
+
28
+ claim tmp.test.work.file_proc, :file_proc do |file,filename|
29
+ Open.write(filename, file)
30
+ nil
31
+ end
23
32
  end
24
33
 
25
34
  class TestTSV < Test::Unit::TestCase
@@ -33,11 +42,12 @@ class TestTSV < Test::Unit::TestCase
33
42
  assert TSV === TestResource.tmp.test.test_tsv.tsv
34
43
  end
35
44
 
36
- def __test_rake
37
- TestResource.tmp.test.work.footest.foo.read == "TEST"
38
- assert TestResource.tmp.test.work.footest.foo.read == "TEST"
45
+ def test_rake
46
+ assert_equal TestResource.tmp.test.work.footest.foo.read, "TEST"
47
+ assert_equal TestResource.tmp.test.work.footest.bar.read, "bar"
39
48
  end
40
49
 
50
+
41
51
  def test_proc
42
52
  assert TestResource.tmp.test.proc.read == "PROC TEST"
43
53
  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.34.4
4
+ version: 5.34.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Vazquez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-07-13 00:00:00.000000000 Z
11
+ date: 2022-07-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -459,6 +459,7 @@ files:
459
459
  - share/rbbt_commands/tsv/uncollapse
460
460
  - share/rbbt_commands/tsv/unzip
461
461
  - share/rbbt_commands/tsv/values
462
+ - share/rbbt_commands/tsv/view
462
463
  - share/rbbt_commands/tsv/write_excel
463
464
  - share/rbbt_commands/tsv/zip
464
465
  - share/rbbt_commands/watch