rbbt-util 2.1.0 → 3.0.2

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.
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