rbbt-util 2.1.0 → 3.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/bin/rbbt_query.rb +63 -0
  2. data/lib/rbbt-util.rb +5 -5
  3. data/lib/rbbt.rb +2 -11
  4. data/lib/rbbt/util/cmd.rb +1 -1
  5. data/lib/rbbt/util/fix_width_table.rb +9 -3
  6. data/lib/rbbt/util/log.rb +23 -7
  7. data/lib/rbbt/util/misc.rb +121 -15
  8. data/lib/rbbt/util/open.rb +14 -4
  9. data/lib/rbbt/util/persistence.rb +52 -21
  10. data/lib/rbbt/util/rake.rb +108 -21
  11. data/lib/rbbt/util/resource.rb +338 -0
  12. data/lib/rbbt/util/simpleDSL.rb +1 -1
  13. data/lib/rbbt/util/simpleopt.rb +1 -1
  14. data/lib/rbbt/util/task.rb +340 -0
  15. data/lib/rbbt/util/tc_hash.rb +19 -2
  16. data/lib/rbbt/util/tsv.rb +15 -10
  17. data/lib/rbbt/util/tsv/accessor.rb +16 -7
  18. data/lib/rbbt/util/tsv/attach.rb +220 -17
  19. data/lib/rbbt/util/tsv/index.rb +6 -1
  20. data/lib/rbbt/util/tsv/manipulate.rb +4 -5
  21. data/lib/rbbt/util/tsv/parse.rb +45 -21
  22. data/lib/rbbt/util/tsv/resource.rb +74 -0
  23. data/lib/rbbt/util/workflow.rb +99 -75
  24. data/test/rbbt/util/test_filecache.rb +2 -2
  25. data/test/rbbt/util/test_misc.rb +7 -2
  26. data/test/rbbt/util/test_persistence.rb +40 -5
  27. data/test/rbbt/util/test_resource.rb +92 -0
  28. data/test/rbbt/util/test_task.rb +118 -0
  29. data/test/rbbt/util/test_tsv.rb +5 -1
  30. data/test/rbbt/util/test_workflow.rb +77 -62
  31. data/test/rbbt/util/tsv/test_attach.rb +95 -7
  32. data/test/rbbt/util/tsv/test_index.rb +0 -1
  33. data/test/rbbt/util/tsv/test_manipulate.rb +20 -0
  34. data/test/rbbt/util/tsv/test_resource.rb +9 -0
  35. data/test/test_helper.rb +10 -0
  36. data/test/test_rbbt.rb +2 -37
  37. metadata +16 -18
  38. data/lib/rbbt/util/data_module.rb +0 -93
  39. data/lib/rbbt/util/path.rb +0 -155
  40. data/lib/rbbt/util/pkg_config.rb +0 -78
  41. data/lib/rbbt/util/pkg_data.rb +0 -119
  42. data/lib/rbbt/util/pkg_software.rb +0 -145
  43. data/test/rbbt/util/test_data_module.rb +0 -50
  44. data/test/rbbt/util/test_path.rb +0 -10
  45. data/test/rbbt/util/test_pkg_data.rb +0 -129
  46. data/test/test_pkg.rb +0 -28
@@ -1,3 +1,4 @@
1
+ require 'rake'
1
2
  require 'rbbt/util/tsv'
2
3
  require 'rbbt/util/open'
3
4
  require 'rbbt/util/log'
@@ -29,7 +30,11 @@ module RakeHelper
29
30
  end
30
31
 
31
32
  def self.files
32
- @@files
33
+ if defined? @@files
34
+ @@files
35
+ else
36
+ @@file = []
37
+ end
33
38
  end
34
39
  end
35
40
 
@@ -48,41 +53,123 @@ module RakeHelper
48
53
  end
49
54
 
50
55
  def self.run(rakefile, task = :default, chdir = nil)
51
- pid = Process.fork{
52
- require 'rake'
53
- FileUtils.chdir chdir if chdir
56
+ require 'rake'
57
+ old_pwd = FileUtils.pwd
58
+ FileUtils.chdir chdir if chdir
54
59
 
55
- Rake::FileTask.module_eval do
60
+ Rake::FileTask.module_eval do
61
+ if not self.respond_to? :old_define_task
56
62
  class << self
57
63
  alias_method :old_define_task, :define_task
58
64
  end
65
+
59
66
  def self.define_task(file, *args, &block)
60
67
  @@files ||= []
61
68
  @@files << file
62
69
  old_define_task(file, *args, &block)
63
70
  end
64
-
65
- def self.files
66
- @@files
67
- end
68
71
  end
69
72
 
70
- if block_given?
71
- yield
72
- else
73
- load rakefile
73
+ def self.files
74
+ @@files
74
75
  end
75
-
76
- task(:default) do |t|
77
- Rake::FileTask.files.each do |file| Rake::Task[file].invoke end
76
+
77
+ def self.clear_files
78
+ @@files = []
78
79
  end
80
+ end
79
81
 
80
- Rake::Task[task].invoke
81
- exit
82
- }
83
- pid, status = Process.waitpid2(pid)
82
+ Rake::Task.clear
83
+ Rake::FileTask.clear_files
84
+ if block_given?
85
+ yield
86
+ else
87
+ load rakefile
88
+ end
89
+
90
+ task(:default) do |t|
91
+ Rake::FileTask.files.each do |file| Rake::Task[file].invoke end
92
+ end
93
+
94
+ Rake::Task[task].invoke
95
+
96
+ Rake::Task.clear
97
+ Rake::FileTask.clear_files
98
+
99
+ FileUtils.chdir old_pwd
100
+ end
84
101
 
85
- raise "Error in Rake: #{ rakefile } => #{ task }" unless status.success?
102
+ module WorkFlow
103
+ attr_accessor :default_persistence, :stage_options, :run_options
104
+
105
+ def stage_options(stage = :next)
106
+ @stage_options ||= {}
107
+ @stage_options[stage] ||= []
108
+ end
109
+
110
+ def run_options
111
+ @run_options ||= {}
112
+ end
113
+
114
+ def stage(stage_name, options = nil)
115
+ dependencies, options = case
116
+ when ((String === options or Symbol === options) and %w(string marshal yaml tsv tsv_string).include? options.to_s)
117
+ [nil, {:persistence_type => options}]
118
+ when Hash === options
119
+ [nil, options]
120
+ else
121
+ [options, {}]
122
+ end
123
+
124
+ @stage_options[stage_name] = @stage_options[:next]
125
+
126
+ options = Misc.add_defaults options, :persistence_type => default_persistence || :string
127
+ persistence_type = Misc.process_options options, :persistence_type
128
+ dependencies = Misc.process_options options, :dependencies if options.include? :dependencies
129
+
130
+ re = Regexp.new(/(?:^|\/)#{Regexp.quote stage_name.to_s}\/.*$/)
131
+
132
+ @last_step = nil unless defined? @last_step
133
+ @last_persistence_type = nil unless defined? @last_persistence_type
134
+
135
+ if dependencies.nil? && ! @last_step.nil?
136
+ dependencies = @last_step
137
+ end
138
+ @last_step = stage_name
139
+
140
+ # Generate the Hash definition
141
+ rule_def = case
142
+ when dependencies.nil?
143
+ re
144
+ when String === dependencies
145
+ {re => dependencies}
146
+ when Symbol === dependencies
147
+ {re => lambda{|filename| filename.sub(stage_name.to_s, dependencies.to_s) }}
148
+ when Array === dependencies
149
+ {re => lambda{|filename| dependencies.collect{|dep| filename.sub(stage_name.to_s, dep.to_s) } }}
150
+ when Proc === dependencies
151
+ {re => dependencies}
152
+ end
153
+
154
+ @last_step = stage_name
155
+ last_persistence_type, @last_persistence_type = @last_persistence_type, persistence_type
156
+
157
+ rule rule_def do |t|
158
+ Persistence.persist(t, "", persistence_type, :persistence_file => t.name) do |t, options|
159
+ data = case
160
+ when (t.prerequisites.nil? or (Array === t.prerequisites and t.prerequisites.empty?))
161
+ nil
162
+ else
163
+ Persistence.persist(t.prerequisites.first, "", last_persistence_type, :persistence_file => t.prerequisites.first) do
164
+ raise "Error, this file should be produced already"
165
+ end
166
+ end
167
+ options = @run_options.values_at *stage_options
168
+ step stage_name, "Executing step [#{ stage_name }]"
169
+ yield t, *options
170
+ end
171
+ end
172
+ end
86
173
  end
87
174
  end
88
175
 
@@ -0,0 +1,338 @@
1
+ require 'rbbt/util/open'
2
+ require 'rbbt/util/rake'
3
+
4
+ module Resource
5
+ class << self
6
+ attr_accessor :resources, :rake_dirs
7
+ end
8
+
9
+ def self.extended(base)
10
+ class << base
11
+ attr_accessor :pkgdir, :lib_dir, :base, :offsetdir, :namespace
12
+ end
13
+ base.base = base
14
+ base.lib_dir = caller_lib_dir
15
+ base.pkgdir = base.to_s.downcase unless base.to_s == "Rbbt"
16
+ end
17
+
18
+ def self.caller_base_dir(file = nil)
19
+ file = caller.reject{|l| l =~ /\/util\/(?:resource\.rb|progress-monitor\.rb|workflow\.rb)/ }.first.sub(/\.rb.*/,'.rb') if file.nil?
20
+ File.dirname(File.expand_path(file))
21
+ end
22
+
23
+ def self.caller_lib_dir(file = nil)
24
+ file = caller.reject{|l| l =~ /\/util\/(?:resource\.rb|progress-monitor\.rb|workflow\.rb)/ }.first.sub(/\.rb.*/,'.rb') if file.nil?
25
+
26
+ file = File.expand_path file
27
+ while file != '/'
28
+ dir = File.dirname file
29
+ return dir if File.exists? File.join(dir, 'lib')
30
+ file = File.dirname file
31
+ end
32
+ return nil
33
+ end
34
+
35
+ def self.resolve(path, pkgdir, type = :find, lib_dir = nil)
36
+ if path.match(/(.*?)\/(.*)/)
37
+ location, subpath = path.match(/(.*?)\/(.*)/).values_at 1, 2
38
+ else
39
+ location, subpath = path, ""
40
+ end
41
+
42
+ case type.to_sym
43
+ when :user
44
+ pkgdir = 'rbbt' if pkgdir.nil? or pkgdir.empty?
45
+ File.join(ENV['HOME'], '.' + pkgdir, location, subpath)
46
+ when :local
47
+ File.join('/usr/local', location, pkgdir, subpath)
48
+ when :global
49
+ File.join('/', location, pkgdir, subpath)
50
+ when :lib
51
+ if not caller_lib_dir.nil? and not caller_lib_dir == "/"
52
+ path = File.join(caller_lib_dir, location, subpath)
53
+ return path if File.exists?(path) or lib_dir.nil?
54
+ end
55
+ raise "Root of library not found" if lib_dir.nil?
56
+ File.join(lib_dir, location, subpath)
57
+ when :find
58
+ %w(user local global lib).each do |_type|
59
+ file = resolve(path, pkgdir, _type.to_sym, lib_dir)
60
+ return file if File.exists? file
61
+ end
62
+
63
+ resolve(path, pkgdir, :user)
64
+ end
65
+ end
66
+
67
+ def self.define_rake(path, rakefile)
68
+ @rake_dirs ||= {}
69
+ @rake_dirs[path.find] = rakefile
70
+ end
71
+
72
+ def self.define_resource(path, type, content)
73
+ @resources ||= {}
74
+ @resources[path.find] = [type, content]
75
+ end
76
+
77
+ def self.set_software_env(software_dir)
78
+ bin_dir = File.join(software_dir, 'bin')
79
+ opt_dir = File.join(software_dir, 'opt')
80
+
81
+ Misc.env_add 'PATH', bin_dir
82
+
83
+ FileUtils.mkdir_p opt_dir unless File.exists? opt_dir
84
+ %w(.ld-paths .pkgconfig-paths .aclocal-paths .java-classpaths).each do |file|
85
+ filename = File.join(opt_dir, file)
86
+ FileUtils.touch filename unless File.exists? filename
87
+ end
88
+
89
+ if not File.exists? File.join(opt_dir,'.post_install')
90
+ Open.write(File.join(opt_dir,'.post_install'),"#!/bin/bash\n")
91
+ end
92
+
93
+ Open.read(File.join opt_dir, '.ld-paths').split(/\n/).each do |line|
94
+ Misc.env_add('LD_LIBRARY_PATH',line.chomp)
95
+ Misc.env_add('LD_RUN_PATH',line.chomp)
96
+ end
97
+
98
+ Open.read(File.join opt_dir, '.pkgconfig-paths').split(/\n/).each do |line|
99
+ Misc.env_add('PKG_CONFIG_PATH',line.chomp)
100
+ end
101
+
102
+ Open.read(File.join opt_dir, '.ld-paths').split(/\n/).each do |line|
103
+ Misc.env_add('LD_LIBRARY_PATH',line.chomp)
104
+ end
105
+
106
+ Open.read(File.join opt_dir, '.ld-paths').split(/\n/).each do |line|
107
+ Misc.env_add('LD_LIBRARY_PATH',line.chomp)
108
+ end
109
+
110
+ Open.read(File.join opt_dir, '.aclocal-paths').split(/\n/).each do |line|
111
+ Misc.env_add('ACLOCAL_FLAGS', "-I#{File.join(opt_dir, line.chomp)}", ' ')
112
+ end
113
+
114
+ Open.read(File.join opt_dir, '.java-classpaths').split(/\n/).each do |line|
115
+ Misc.env_add('CLASSPATH', "#{File.join(opt_dir,'java', 'lib', line.chomp)}")
116
+ end
117
+
118
+ Dir.glob(File.join opt_dir, 'jars', '*').each do |file|
119
+ Misc.env_add('CLASSPATH', "#{File.expand_path(file)}")
120
+ end
121
+
122
+ File.chmod 0774, File.join(opt_dir, '.post_install')
123
+
124
+ CMD.cmd(File.join(opt_dir, '.post_install'))
125
+ end
126
+
127
+ def self.produce(resource)
128
+ resource = resource.find if Path === resource
129
+ return resource if File.exists? resource
130
+
131
+ @resources ||= {}
132
+ @rake_dirs ||= {}
133
+ case
134
+ when @resources.include?(resource)
135
+ type, content = @resources[resource]
136
+
137
+ case type
138
+ when :string
139
+ Open.write(resource, content)
140
+ when :url
141
+ Open.write(resource, Open.read(content))
142
+ when :proc
143
+ Open.write(resource, content.call)
144
+ when :install
145
+ software_dir = File.dirname(File.dirname(resource.to_s))
146
+ preamble = <<-EOF
147
+ #!/bin/bash
148
+
149
+ RBBT_SOFTWARE_DIR="#{software_dir}"
150
+
151
+ INSTALL_HELPER_FILE="#{Rbbt.share.install.software.lib.install_helpers.find :lib, caller_lib_dir(__FILE__)}"
152
+ source "$INSTALL_HELPER_FILE"
153
+ EOF
154
+
155
+ CMD.cmd('bash', :in => preamble + "\n" + content.read)
156
+ set_software_env(software_dir)
157
+ else
158
+ raise "Could not produce #{ resource }. (#{ type }, #{ content })"
159
+ end
160
+ resource
161
+
162
+ when @rake_dirs.select{|dir,rakefile| resource.in_dir?(dir)}.any?
163
+ dir, rakefile = @rake_dirs.select{|dir,rakefile| resource.in_dir?(dir)}.first
164
+ file = resource.sub(dir, '').sub(/^\//,'')
165
+ rakefile = rakefile.find if Resource::Path === rakefile
166
+ dir = dir.find if Resource::Path === dir
167
+ FileUtils.mkdir_p dir unless File.exists? dir
168
+ RakeHelper.run(rakefile, file, dir)
169
+ resource
170
+ end
171
+ end
172
+
173
+ def relative_to(klass, path)
174
+ self.offsetdir = path
175
+ if Rbbt == klass
176
+ self.pkgdir = ""
177
+ else
178
+ self.pkgdir = klass.to_s.downcase
179
+ end
180
+ end
181
+
182
+ def data_module(klass)
183
+ relative_to klass, "share/#{self.to_s.downcase}"
184
+ rakefile = klass.share.install[self.to_s].Rakefile
185
+ rakefile.lib_dir = Resource.caller_lib_dir
186
+
187
+ self[''].define_as_rake rakefile
188
+ self.namespace = base.to_s
189
+ self.lib_dir = caller_lib_dir
190
+ end
191
+
192
+ module Path
193
+ attr_accessor :pkgdir, :namespace, :lib_dir
194
+
195
+ def self.path(name = nil, pkgdir = nil, namespace = nil, lib_dir = nil)
196
+ name = name.nil? ? "" : name.to_s
197
+ name.extend Path
198
+ name.pkgdir = pkgdir
199
+ name.namespace = namespace
200
+ name.lib_dir = lib_dir
201
+ name
202
+ end
203
+
204
+ def find(type = :find, lib_dir = nil)
205
+ lib_dir ||= @lib_dir
206
+ return self if pkgdir.nil?
207
+ path = Path.path(Resource.resolve(self, pkgdir, type, lib_dir), nil)
208
+ path.namespace = namespace
209
+ path
210
+ end
211
+
212
+ def produce
213
+ Resource.produce self.find
214
+ end
215
+
216
+ def dirname
217
+ Path.path(File.dirname(self), pkgdir, namespace, lib_dir)
218
+ end
219
+
220
+ def join(name)
221
+ Path.path(File.join(self, name.to_s), pkgdir, namespace, lib_dir)
222
+ end
223
+
224
+ def [](name)
225
+ join name
226
+ end
227
+
228
+ def method_missing(name, prev = nil)
229
+ join prev unless prev.nil?
230
+ join name
231
+ end
232
+
233
+ def open(*args)
234
+ Resource.produce self.find
235
+ Open.open self.find, *args
236
+ end
237
+
238
+ def read(*args)
239
+ Resource.produce self.find
240
+ Open.read self.find, *args
241
+ end
242
+
243
+ def write(content, *args)
244
+ FileUtils.mkdir_p File.dirname(self.find) unless File.exists? self.find
245
+ Open.write(self.find, content, *args)
246
+ end
247
+
248
+ def define_as_string(content)
249
+ Resource.define_resource(self, :string, content)
250
+ end
251
+
252
+ def define_as_url(url)
253
+ Resource.define_resource(self, :url, url)
254
+ end
255
+
256
+ def define_as_rake(rakefile)
257
+ Resource.define_rake(self, rakefile)
258
+ end
259
+
260
+ def define_as_proc(&block)
261
+ Resource.define_resource(self, :proc, &block)
262
+ end
263
+
264
+
265
+ def define_as_install(install_file)
266
+ Resource.define_resource(self, :install, install_file.find)
267
+ self.produce
268
+ software_dir = File.dirname(File.dirname(self.to_s))
269
+ Resource.set_software_env(software_dir)
270
+ end
271
+
272
+ def in_dir?(dir)
273
+ ! ! File.expand_path(self).match(/^#{Regexp.quote dir}/)
274
+ end
275
+
276
+ def to_s
277
+ self.find
278
+ end
279
+
280
+ def filename
281
+ self.find
282
+ end
283
+
284
+ def exists?
285
+ begin
286
+ self.produce
287
+ File.exists? self.find
288
+ rescue
289
+ false
290
+ end
291
+ end
292
+ end
293
+
294
+ module WithKey
295
+ def self.extended(base)
296
+ class << base
297
+ attr_accessor :klass, :key
298
+ end
299
+ end
300
+
301
+ def method_missing(name, *args)
302
+ if key
303
+ klass.send(name, key, *args)
304
+ else
305
+ klass.send(name, *args)
306
+ end
307
+ end
308
+ end
309
+
310
+ def with_key(key)
311
+ klass = self
312
+ o = Object.new
313
+ o.extend WithKey
314
+ o.klass = self
315
+ o.key = key
316
+ o
317
+ end
318
+
319
+ def [](name)
320
+ if pkgdir.nil?
321
+ @pkgdir = (base == Rbbt ? '' : base.to_s.downcase)
322
+ end
323
+ name = File.join(offsetdir.to_s, name.to_s) unless offsetdir.nil? or offsetdir.empty?
324
+ Path.path(name, pkgdir, namespace, lib_dir)
325
+ end
326
+
327
+ def method_missing(name, prev = nil)
328
+ if prev
329
+ self[prev][name]
330
+ else
331
+ self[name]
332
+ end
333
+ end
334
+ end
335
+
336
+ def resource_path(path)
337
+ Resource::Path.path(path)
338
+ end