rbbt-util 5.1.0 → 5.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/LICENSE +1 -1
  2. data/README.rdoc +2 -2
  3. data/bin/rbbt +45 -0
  4. data/bin/rbbt_dangling_locks.rb +9 -0
  5. data/bin/rbbt_monitor.rb +12 -10
  6. data/bin/run_workflow.rb +80 -18
  7. data/lib/rbbt.rb +1 -1
  8. data/lib/rbbt/annotations.rb +1 -19
  9. data/lib/rbbt/annotations/annotated_array.rb +23 -0
  10. data/lib/rbbt/fix_width_table.rb +2 -2
  11. data/lib/rbbt/persist.rb +13 -5
  12. data/lib/rbbt/persist/tsv.rb +2 -0
  13. data/lib/rbbt/resource.rb +4 -4
  14. data/lib/rbbt/resource/path.rb +35 -10
  15. data/lib/rbbt/resource/util.rb +54 -47
  16. data/lib/rbbt/tsv.rb +17 -15
  17. data/lib/rbbt/tsv/accessor.rb +35 -37
  18. data/lib/rbbt/tsv/excel.rb +3 -1
  19. data/lib/rbbt/tsv/manipulate.rb +27 -4
  20. data/lib/rbbt/tsv/parser.rb +13 -7
  21. data/lib/rbbt/util/R.rb +11 -1
  22. data/lib/rbbt/util/misc.rb +182 -26
  23. data/lib/rbbt/util/named_array.rb +14 -7
  24. data/lib/rbbt/util/open.rb +2 -1
  25. data/lib/rbbt/util/tmpfile.rb +16 -1
  26. data/lib/rbbt/workflow.rb +63 -101
  27. data/lib/rbbt/workflow/accessor.rb +19 -9
  28. data/lib/rbbt/workflow/annotate.rb +33 -64
  29. data/lib/rbbt/workflow/definition.rb +71 -0
  30. data/lib/rbbt/workflow/soap.rb +15 -5
  31. data/lib/rbbt/workflow/step.rb +57 -8
  32. data/lib/rbbt/workflow/usage.rb +72 -0
  33. data/share/lib/R/util.R +12 -0
  34. data/share/rbbt_commands/conf/web_user/add +26 -0
  35. data/share/rbbt_commands/conf/web_user/list +9 -0
  36. data/share/rbbt_commands/conf/web_user/remove +18 -0
  37. data/share/rbbt_commands/workflow/remote/add +11 -0
  38. data/share/rbbt_commands/workflow/remote/list +9 -0
  39. data/share/rbbt_commands/workflow/remote/remove +9 -0
  40. data/share/rbbt_commands/workflow/task +181 -0
  41. data/test/rbbt/test_resource.rb +2 -1
  42. data/test/rbbt/test_workflow.rb +13 -0
  43. data/test/rbbt/tsv/test_manipulate.rb +18 -0
  44. data/test/rbbt/util/test_misc.rb +19 -39
  45. data/test/rbbt/util/test_tmpfile.rb +8 -0
  46. data/test/rbbt/workflow/test_soap.rb +2 -0
  47. metadata +31 -2
@@ -37,7 +37,7 @@ module Path
37
37
  end
38
38
 
39
39
  def glob(pattern = '*')
40
- Dir.glob(File.join(self, pattern))
40
+ Dir.glob(File.join(self, pattern)).collect{|f| Path.setup(f, self.resource, self.pkgdir)}
41
41
  end
42
42
 
43
43
  def path_get_brackets(name)
@@ -59,13 +59,20 @@ module Path
59
59
  end
60
60
 
61
61
  SEARCH_PATHS = {
62
- :user => File.join(ENV['HOME'], ".{PKGDIR}", "{TOPLEVEL}", "{SUBPATH}"),
63
- :global => File.join('/', "{TOPLEVEL}", "{PKGDIR}", "{SUBPATH}"),
64
- :local => File.join('/usr/local', "{TOPLEVEL}", "{PKGDIR}", "{SUBPATH}"),
65
- :lib => File.join('{LIBDIR}', "{TOPLEVEL}", "{SUBPATH}"),
62
+ :user => File.join(ENV['HOME'], ".{PKGDIR}", "{TOPLEVEL}", "{SUBPATH}"),
63
+ :global => File.join('/', "{TOPLEVEL}", "{PKGDIR}", "{SUBPATH}"),
64
+ :local => File.join('/usr/local', "{TOPLEVEL}", "{PKGDIR}", "{SUBPATH}"),
65
+ :lib => File.join('{LIBDIR}', "{TOPLEVEL}", "{SUBPATH}"),
66
66
  :default => :user
67
67
  }
68
68
 
69
+ search_path_file = File.join(ENV['HOME'], '.rbbt/etc/search_paths')
70
+ if File.exists?(search_path_file)
71
+ YAML.load(File.open(search_path_file)).each do |where, location|
72
+ SEARCH_PATHS[where.to_sym] = location
73
+ end
74
+ end
75
+
69
76
  def find(where = nil, caller_lib = nil, search_paths = nil)
70
77
  where = search_paths[:default] if where == :default
71
78
  search_paths ||= SEARCH_PATHS
@@ -78,7 +85,9 @@ module Path
78
85
 
79
86
  path = nil
80
87
  if where.nil?
81
- search_paths.keys.each do |w|
88
+ %w(user local global lib).each do |w|
89
+ w = w.to_sym
90
+ next unless search_paths.include? w
82
91
  path = find(w, caller_lib, search_paths)
83
92
  return path if File.exists? path
84
93
  end
@@ -88,12 +97,19 @@ module Path
88
97
  raise "Path '#{ path }' not found, and no default specified in search paths: #{search_paths.inspect}"
89
98
  end
90
99
  else
100
+ where = where.to_sym
101
+ raise "Did not recognize the 'where' tag: #{where}. Options: #{search_paths.keys}" unless search_paths.include? where
91
102
  libdir = where == :lib ? Path.caller_lib_dir(caller_lib) : ""
92
103
  libdir ||= ""
93
104
  Path.setup search_paths[where].sub('{PKGDIR}', pkgdir).sub('{TOPLEVEL}', toplevel).sub('{SUBPATH}', subpath).sub('{LIBDIR}', libdir), @pkgdir, @resource
94
105
  end
95
106
  end
96
107
 
108
+ def find_all(caller_lib = nil, search_paths = nil)
109
+ search_paths ||= SEARCH_PATHS
110
+ search_paths.keys.collect{|where| find(where, Path.caller_lib_dir, search_paths)}.select{|file| file.exists?}.uniq
111
+ end
112
+
97
113
  #{{{ Methods
98
114
 
99
115
  def in_dir?(dir)
@@ -125,13 +141,18 @@ module Path
125
141
 
126
142
  resource.produce self, force
127
143
 
128
- path
144
+ self
129
145
  end
130
146
 
131
147
  def read(&block)
132
148
  Open.read(self.produce.find, &block)
133
149
  end
134
150
 
151
+ def write(*args, &block)
152
+ Open.write(self.produce.find, *args, &block)
153
+ end
154
+
155
+
135
156
  def open(options = {})
136
157
  Open.open(self.produce.find, options)
137
158
  end
@@ -140,6 +161,10 @@ module Path
140
161
  "" + self
141
162
  end
142
163
 
164
+ def basename
165
+ Path.setup(File.basename(self), self.resource, self.pkgdir)
166
+ end
167
+
143
168
  def tsv(*args)
144
169
  TSV.open(self.produce, *args)
145
170
  end
@@ -157,15 +182,15 @@ module Path
157
182
  end
158
183
 
159
184
  def index(options = {})
160
- TSV.index(self.produce.find, options)
185
+ TSV.index(self.produce, options)
161
186
  end
162
187
 
163
188
  def range_index(start, eend, options = {})
164
- TSV.range_index(self.produce.find, start, eend, options)
189
+ TSV.range_index(self.produce, start, eend, options)
165
190
  end
166
191
 
167
192
  def pos_index(pos, options = {})
168
- TSV.pos_index(self.produce.find, pos, options)
193
+ TSV.pos_index(self.produce, pos, options)
169
194
  end
170
195
 
171
196
  def to_yaml(*args)
@@ -1,4 +1,3 @@
1
- require 'rbbt/resource/rake'
2
1
 
3
2
  module Path
4
3
 
@@ -31,53 +30,60 @@ end
31
30
 
32
31
  module Resource
33
32
  def set_software_env(software_dir)
34
- bin_dir = File.join(software_dir, 'bin')
35
- opt_dir = File.join(software_dir, 'opt')
36
-
37
- Misc.env_add 'PATH', bin_dir
38
-
39
- FileUtils.mkdir_p opt_dir unless File.exists? opt_dir
40
- %w(.ld-paths .pkgconfig-paths .aclocal-paths .java-classpaths).each do |file|
41
- filename = File.join(opt_dir, file)
42
- FileUtils.touch filename unless File.exists? filename
43
- end
44
-
45
- if not File.exists? File.join(opt_dir,'.post_install')
46
- Open.write(File.join(opt_dir,'.post_install'),"#!/bin/bash\n")
47
- end
48
-
49
- Open.read(File.join opt_dir, '.ld-paths').split(/\n/).each do |line|
50
- Misc.env_add('LD_LIBRARY_PATH',line.chomp)
51
- Misc.env_add('LD_RUN_PATH',line.chomp)
52
- end
53
-
54
- Open.read(File.join opt_dir, '.pkgconfig-paths').split(/\n/).each do |line|
55
- Misc.env_add('PKG_CONFIG_PATH',line.chomp)
56
- end
57
-
58
- Open.read(File.join opt_dir, '.ld-paths').split(/\n/).each do |line|
59
- Misc.env_add('LD_LIBRARY_PATH',line.chomp)
33
+ software_dir.find_all.each do |software_dir|
34
+ bin_dir = File.join(software_dir, 'bin')
35
+ opt_dir = File.join(software_dir, 'opt')
36
+
37
+ Misc.env_add 'PATH', bin_dir
38
+
39
+ FileUtils.mkdir_p opt_dir unless File.exists? opt_dir
40
+
41
+ %w(.ld-paths .pkgconfig-paths .aclocal-paths .java-classpaths).each do |file|
42
+ filename = File.join(opt_dir, file)
43
+ begin
44
+ FileUtils.touch filename unless File.exists? filename
45
+ rescue
46
+ Log.warn("Could not touch #{ filename }")
47
+ end
48
+ end
49
+
50
+ begin
51
+ if not File.exists? File.join(opt_dir,'.post_install')
52
+ Open.write(File.join(opt_dir,'.post_install'),"#!/bin/bash\n")
53
+ end
54
+ rescue Exception
55
+ Log.warn("Could not create default .post_install in #{ software_dir }")
56
+ end
57
+
58
+ Open.read(File.join opt_dir, '.ld-paths').split(/\n/).each do |line|
59
+ Misc.env_add('LD_LIBRARY_PATH',line.chomp)
60
+ Misc.env_add('LD_RUN_PATH',line.chomp)
61
+ end if File.exists? File.join(opt_dir, '.ld-paths')
62
+
63
+ Open.read(File.join opt_dir, '.pkgconfig-paths').split(/\n/).each do |line|
64
+ Misc.env_add('PKG_CONFIG_PATH',line.chomp)
65
+ end if File.exists? File.join(opt_dir, '.pkgconfig-paths')
66
+
67
+ Open.read(File.join opt_dir, '.aclocal-paths').split(/\n/).each do |line|
68
+ Misc.env_add('ACLOCAL_FLAGS', "-I#{File.join(opt_dir, line.chomp)}", ' ')
69
+ end if File.exists? File.join(opt_dir, '.aclocal-paths')
70
+
71
+ Open.read(File.join opt_dir, '.java-classpaths').split(/\n/).each do |line|
72
+ Misc.env_add('CLASSPATH', "#{File.join(opt_dir,'java', 'lib', line.chomp)}")
73
+ end if File.exists? File.join(opt_dir, '.java-classpaths')
74
+
75
+ Dir.glob(File.join opt_dir, 'jars', '*').each do |file|
76
+ Misc.env_add('CLASSPATH', "#{File.expand_path(file)}")
77
+ end
78
+
79
+ begin
80
+ File.chmod 0777, File.join(opt_dir, '.post_install')
81
+ rescue
82
+ Log.warn("Could not change permisions of .post_install in #{ software_dir }")
83
+ end
84
+
85
+ CMD.cmd(File.join(opt_dir, '.post_install')) if File.exists? File.join(opt_dir, '.post_install')
60
86
  end
61
-
62
- Open.read(File.join opt_dir, '.ld-paths').split(/\n/).each do |line|
63
- Misc.env_add('LD_LIBRARY_PATH',line.chomp)
64
- end
65
-
66
- Open.read(File.join opt_dir, '.aclocal-paths').split(/\n/).each do |line|
67
- Misc.env_add('ACLOCAL_FLAGS', "-I#{File.join(opt_dir, line.chomp)}", ' ')
68
- end
69
-
70
- Open.read(File.join opt_dir, '.java-classpaths').split(/\n/).each do |line|
71
- Misc.env_add('CLASSPATH', "#{File.join(opt_dir,'java', 'lib', line.chomp)}")
72
- end
73
-
74
- Dir.glob(File.join opt_dir, 'jars', '*').each do |file|
75
- Misc.env_add('CLASSPATH', "#{File.expand_path(file)}")
76
- end
77
-
78
- File.chmod 0774, File.join(opt_dir, '.post_install')
79
-
80
- CMD.cmd(File.join(opt_dir, '.post_install'))
81
87
  end
82
88
 
83
89
 
@@ -100,6 +106,7 @@ module Resource
100
106
  rake_dir = rake_dir.find if rake_dir.respond_to? :find
101
107
 
102
108
  begin
109
+ require 'rbbt/resource/rake'
103
110
  Rake.run(rakefile, rake_dir, task)
104
111
  rescue Rake::TaskNotFound
105
112
  raise $! if rake_dir.nil? or rake_dir.empty? or rake_dir == "/" or rake_dir == "./"
data/lib/rbbt/tsv.rb CHANGED
@@ -31,7 +31,7 @@ module TSV
31
31
  hash
32
32
  end
33
33
 
34
- # options shifts if type.nil?
34
+ # options shift if type.nil?
35
35
  def self.open(source, type = nil, options = nil)
36
36
  type, options = nil, type if options.nil? and Hash === type
37
37
  options ||= {}
@@ -50,24 +50,24 @@ module TSV
50
50
 
51
51
  lock_filename = filename.nil? ? nil : Persist.persistence_path(filename, {:dir => Rbbt.tmp.tsv_open_locks.find})
52
52
  Misc.lock lock_filename do
53
- data = Persist.persist_tsv source, filename, options, persist_options do |data|
54
- if serializer
55
- data.extend TSV unless TSV === data
56
- data.serializer = serializer
57
- end
53
+ data = Persist.persist_tsv source, filename, options, persist_options do |data|
54
+ if serializer
55
+ data.extend TSV unless TSV === data
56
+ data.serializer = serializer
57
+ end
58
58
 
59
- open_options = Misc.pull_keys options, :open
59
+ open_options = Misc.pull_keys options, :open
60
60
 
61
- stream = get_stream source, open_options
62
- parse stream, data, options
61
+ stream = get_stream source, open_options
62
+ parse stream, data, options
63
63
 
64
- data.filename = filename.to_s unless filename.nil?
65
- if data.identifiers.nil? and Path === filename and filename.identifier_file_path
66
- data.identifiers = filename.identifier_file_path.to_s
67
- end
64
+ data.filename = filename.to_s unless filename.nil?
65
+ if data.identifiers.nil? and Path === filename and filename.identifier_file_path
66
+ data.identifiers = filename.identifier_file_path.to_s
67
+ end
68
68
 
69
- data
70
- end
69
+ data
70
+ end
71
71
  end
72
72
 
73
73
  data.unnamed = unnamed unless unnamed.nil?
@@ -145,6 +145,8 @@ module TSV
145
145
  begin
146
146
  progress_monitor.tick(stream.pos) if progress_monitor
147
147
 
148
+ raise Parser::SKIP_LINE if line.empty?
149
+
148
150
  line = Misc.fixutf8(line)
149
151
  line = parser.process line
150
152
  parts = parser.chop_line line
@@ -6,7 +6,7 @@ module TSV
6
6
 
7
7
  NIL_YAML = "--- \n"
8
8
 
9
- attr_accessor :unnamed, :serializer_module, :entity_options
9
+ attr_accessor :unnamed, :serializer_module, :entity_options, :entity_templates
10
10
 
11
11
  def entity_options
12
12
  if @entity_options.nil?
@@ -16,33 +16,43 @@ module TSV
16
16
  @entity_options
17
17
  end
18
18
 
19
+ def entity_templates
20
+ @entity_templates ||= {}
21
+ end
22
+
19
23
  def prepare_entity(entity, field, options = {})
20
24
  return entity if entity.nil?
21
25
  return entity unless defined? Entity
22
26
  entity = entity if options.delete :dup_array
23
- @entity_templates ||= {}
24
- if (template = @entity_templates[field])
27
+ entity_templates
28
+ if (template = entity_templates[field])
25
29
  entity = template.annotate(entity.frozen? ? entity.dup : entity)
26
30
  entity.extend AnnotatedArray if Array === entity
27
31
  entity
28
32
  else
29
- if @entity_templates.include? field
33
+ if entity_templates.include? field
30
34
  entity
31
35
  else
32
36
  template = Misc.prepare_entity("TEMPLATE", field, options)
33
37
  if Annotated === template
34
- @entity_templates[field] = template
38
+ entity_templates[field] = template
35
39
  entity = template.annotate(entity.frozen? ? entity.dup : entity)
36
40
  entity.extend AnnotatedArray if Array === entity
37
41
  entity
38
42
  else
39
- @entity_templates[field] = nil
43
+ entity_templates[field] = nil
40
44
  entity
41
45
  end
42
46
  end
43
47
  end
44
48
  end
45
49
 
50
+ def setup_array(*args)
51
+ res = NamedArray.setup(*args)
52
+ res.instance_variable_set(:@entity_templates, entity_templates)
53
+ res
54
+ end
55
+
46
56
  def with_unnamed
47
57
  saved_unnamed = @unnamed
48
58
  @unnamed = true
@@ -109,7 +119,7 @@ module TSV
109
119
 
110
120
  case type
111
121
  when :double, :list
112
- NamedArray.setup value, fields, key, entity_options
122
+ setup_array value, fields, key, entity_options, entity_templates
113
123
  when :flat, :single
114
124
  value = value.dup if value.frozen?
115
125
 
@@ -135,7 +145,7 @@ module TSV
135
145
 
136
146
  case type
137
147
  when :double, :list
138
- values.each{|value| NamedArray.setup value, fields, nil, entity_options}
148
+ values.each{|value| setup_array value, fields, nil, entity_options}
139
149
  when :flat, :single
140
150
  values = values.collect{|v| prepare_entity(v, fields.first, entity_options)}
141
151
  end
@@ -159,7 +169,7 @@ module TSV
159
169
  if not fields.nil?
160
170
  case type
161
171
  when :double, :list
162
- NamedArray.setup value, fields, key, entity_options if Array === value
172
+ setup_array value, fields, key, entity_options, entity_templates if Array === value
163
173
  when :flat, :single
164
174
  prepare_entity(value, fields.first, entity_options)
165
175
  end
@@ -186,7 +196,7 @@ module TSV
186
196
  if not fields.nil?
187
197
  case type
188
198
  when :double, :list
189
- NamedArray.setup value, fields, key, entity_options if Array === value
199
+ setup_array value, fields, key, entity_options if Array === value
190
200
  when :flat, :single
191
201
  value = prepare_entity(value, fields.first, entity_options)
192
202
  end
@@ -194,7 +204,6 @@ module TSV
194
204
  key = prepare_entity(key, key_field, entity_options)
195
205
  end
196
206
 
197
-
198
207
  if block_given?
199
208
  yield key, value
200
209
  else
@@ -225,8 +234,6 @@ module TSV
225
234
  end
226
235
  end
227
236
 
228
-
229
-
230
237
  #{{{ Sorting
231
238
 
232
239
  def tsv_sort_by(field = nil, just_keys = false, &block)
@@ -282,30 +289,21 @@ module TSV
282
289
  end
283
290
 
284
291
  # Starts in page 1
285
- def page(pnum, psize, field = nil, just_keys = false, &block)
286
- if pnum.to_s =~ /-(.*)/
287
- reverse = true
288
- pnum = $1.to_i
292
+ def page(pnum, psize, field = nil, just_keys = false, reverse = false, &block)
293
+ pstart = psize * (pnum - 1)
294
+ pend = psize * pnum - 1
295
+ field = :key if field == "key"
296
+ keys = sort_by(field || :key, true, &block)
297
+ keys.reverse! if reverse
298
+
299
+ if just_keys
300
+ keys[pstart..pend]
289
301
  else
290
- reverse = false
291
- end
292
-
293
- with_unnamed do
294
- pstart = psize * (pnum - 1)
295
- pend = psize * pnum - 1
296
- field = :key if field == "key"
297
- keys = sort_by(field || :key, true, &block)
298
- keys.reverse! if reverse
299
-
300
- if just_keys
301
- keys[pstart..pend]
302
- else
303
- select :key => keys[pstart..pend]
304
- end
302
+ select :key => keys[pstart..pend]
305
303
  end
306
304
  end
307
305
 
308
-
306
+
309
307
  def self.entry(*entries)
310
308
  entries = entries.collect{|entry| entry.to_s}
311
309
  ENTRIES.concat entries
@@ -332,7 +330,7 @@ if '#{entry}' == 'serializer'
332
330
  return if value.nil?
333
331
 
334
332
  self.serializer_module = SERIALIZER_ALIAS[value.to_sym]
335
-
333
+
336
334
  if serializer_module.nil?
337
335
  class << self
338
336
  alias serialized_get tsv_clean_get_brackets
@@ -366,7 +364,7 @@ else
366
364
  self.tsv_clean_set_brackets '#{key}', value.nil? ? NIL_YAML : value.to_yaml
367
365
  end
368
366
  end
369
- "
367
+ "
370
368
  end
371
369
  end
372
370
 
@@ -384,7 +382,7 @@ end
384
382
  if @fields.nil? or @unnamed
385
383
  @fields
386
384
  else
387
- @named_fields ||= NamedArray.setup @fields, @fields, nil, entity_options
385
+ @named_fields ||= NamedArray.setup @fields, @fields, nil, entity_options, entity_templates
388
386
  end
389
387
  end
390
388
 
@@ -404,7 +402,7 @@ end
404
402
  return [] if list.nil? || list.empty?
405
403
  fields ||= list.fields if list.respond_to? :fields
406
404
  zipped = list[0].zip(*list[1..-1])
407
- zipped = zipped.collect{|v| NamedArray.setup(v, fields)} if fields
405
+ zipped = zipped.collect{|v| setup_array(v, fields)} if fields
408
406
  zipped
409
407
  end
410
408