rbbt-util 4.4.0 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +3 -0
- data/bin/rbbt_exec.rb +6 -1
- data/bin/rbbt_monitor.rb +117 -0
- data/bin/run_workflow.rb +7 -3
- data/lib/rbbt/annotations.rb +147 -81
- data/lib/rbbt/fix_width_table.rb +5 -1
- data/lib/rbbt/persist.rb +51 -34
- data/lib/rbbt/persist/tsv.rb +26 -15
- data/lib/rbbt/resource.rb +14 -9
- data/lib/rbbt/resource/path.rb +5 -5
- data/lib/rbbt/resource/rake.rb +9 -5
- data/lib/rbbt/resource/util.rb +4 -2
- data/lib/rbbt/tsv.rb +23 -8
- data/lib/rbbt/tsv/accessor.rb +18 -5
- data/lib/rbbt/tsv/attach/util.rb +12 -2
- data/lib/rbbt/tsv/manipulate.rb +69 -16
- data/lib/rbbt/tsv/parser.rb +3 -2
- data/lib/rbbt/tsv/util.rb +5 -4
- data/lib/rbbt/util/chain_methods.rb +8 -8
- data/lib/rbbt/util/cmd.rb +1 -1
- data/lib/rbbt/util/misc.rb +118 -13
- data/lib/rbbt/util/open.rb +38 -14
- data/lib/rbbt/util/simpleDSL.rb +1 -1
- data/lib/rbbt/workflow.rb +5 -4
- data/lib/rbbt/workflow/accessor.rb +7 -5
- data/lib/rbbt/workflow/step.rb +50 -7
- data/test/rbbt/test_annotations.rb +29 -3
- data/test/rbbt/test_persist.rb +150 -0
- data/test/rbbt/test_tsv.rb +35 -0
- data/test/rbbt/tsv/test_accessor.rb +9 -0
- data/test/rbbt/util/test_misc.rb +17 -3
- data/test/rbbt/util/test_open.rb +21 -0
- data/test/rbbt/workflow/test_step.rb +41 -1
- metadata +140 -136
data/lib/rbbt/fix_width_table.rb
CHANGED
@@ -69,6 +69,10 @@ class FixWidthTable
|
|
69
69
|
end
|
70
70
|
alias << add
|
71
71
|
|
72
|
+
def last_pos
|
73
|
+
pos(size - 1)
|
74
|
+
end
|
75
|
+
|
72
76
|
def pos(index)
|
73
77
|
return nil if index < 0 or index >= size
|
74
78
|
@file.seek(5 + (record_size) * index, IO::SEEK_SET)
|
@@ -156,7 +160,7 @@ class FixWidthTable
|
|
156
160
|
idx = idx - 1
|
157
161
|
end
|
158
162
|
|
159
|
-
idx
|
163
|
+
idx.to_i
|
160
164
|
end
|
161
165
|
|
162
166
|
def get_range(pos)
|
data/lib/rbbt/persist.rb
CHANGED
@@ -93,6 +93,7 @@ module Persist
|
|
93
93
|
f = File.open(path, 'rb')
|
94
94
|
res = f.read
|
95
95
|
f.close
|
96
|
+
res.force_encoding("ASCII-8BIT") if res.respond_to? :force_encoding
|
96
97
|
res
|
97
98
|
when :array
|
98
99
|
res = Open.read(path).split("\n", -1)
|
@@ -106,8 +107,6 @@ module Persist
|
|
106
107
|
Open.read(path).to_f
|
107
108
|
when :integer
|
108
109
|
Open.read(path).to_i
|
109
|
-
when :tsv
|
110
|
-
TSV.open(Open.open(path))
|
111
110
|
else
|
112
111
|
raise "Unknown persistence: #{ type }"
|
113
112
|
end
|
@@ -132,6 +131,7 @@ module Persist
|
|
132
131
|
when :string, :text
|
133
132
|
Open.write(path, content)
|
134
133
|
when :binary
|
134
|
+
content.force_encoding("ASCII-8BIT") if content.respond_to? :force_encoding
|
135
135
|
f = File.open(path, 'wb')
|
136
136
|
f.puts content
|
137
137
|
f.close
|
@@ -197,31 +197,48 @@ module Persist
|
|
197
197
|
repo[key]
|
198
198
|
end
|
199
199
|
Annotated.load_tsv_values(key, values, "literal", "annotation_types", "JSON")
|
200
|
-
when keys.any?
|
200
|
+
when (keys.any? and not keys.first =~ /ANNOTATED_DOUBLE_ARRAY/)
|
201
201
|
repo.read_and_close do
|
202
|
-
keys.collect{|key|
|
202
|
+
keys.sort_by{|k| k.split(":").last.to_i}.collect{|key|
|
203
203
|
v = repo[key]
|
204
204
|
Annotated.load_tsv_values(key, v, "literal", "annotation_types", "JSON")
|
205
205
|
}
|
206
206
|
end
|
207
|
+
when (keys.any? and keys.first =~ /ANNOTATED_DOUBLE_ARRAY/)
|
208
|
+
repo.read_and_close do
|
209
|
+
|
210
|
+
res = keys.sort_by{|k| k.split(":").last.to_i}.collect{|key|
|
211
|
+
v = repo[key]
|
212
|
+
Annotated.load_tsv_values(key, v, "literal", "annotation_types", "JSON")
|
213
|
+
}
|
214
|
+
|
215
|
+
res.first.annotate res
|
216
|
+
res.extend AnnotatedArray
|
217
|
+
|
218
|
+
res
|
219
|
+
end
|
207
220
|
else
|
208
221
|
entities = yield
|
209
222
|
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
223
|
+
repo.write_and_close do
|
224
|
+
case
|
225
|
+
when entities.nil?
|
226
|
+
repo[subkey + "NIL"] = nil
|
227
|
+
when entities.empty?
|
228
|
+
repo[subkey + "EMPTY"] = nil
|
229
|
+
when (not Array === entities or (AnnotatedArray === entities and not Array === entities.first))
|
230
|
+
tsv_values = entities.tsv_values("literal", "annotation_types", "JSON")
|
231
|
+
repo[subkey + entities.id << ":" << "SINGLE"] = tsv_values
|
232
|
+
when (not Array === entities or (AnnotatedArray === entities and AnnotatedArray === entities.first))
|
233
|
+
entities.each_with_index do |e,i|
|
234
|
+
tsv_values = e.tsv_values("literal", "annotation_types", "JSON")
|
235
|
+
repo[subkey + e.id << ":ANNOTATED_DOUBLE_ARRAY:" << i.to_s] = tsv_values
|
236
|
+
end
|
237
|
+
else
|
238
|
+
entities.each_with_index do |e,i|
|
239
|
+
next if e.nil?
|
240
|
+
tsv_values = e.tsv_values("literal", "annotation_types", "JSON")
|
241
|
+
repo[subkey + e.id << ":" << i.to_s] = tsv_values
|
225
242
|
end
|
226
243
|
end
|
227
244
|
end
|
@@ -230,23 +247,23 @@ module Persist
|
|
230
247
|
end
|
231
248
|
|
232
249
|
else
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
250
|
+
if is_persisted?(path, persist_options)
|
251
|
+
Log.debug "Persist up-to-date: #{ path } - #{persist_options.inspect[0..100]}"
|
252
|
+
return nil if persist_options[:no_load]
|
253
|
+
return load_file(path, type)
|
254
|
+
else
|
255
|
+
Log.debug "Persist create: #{ path } - #{persist_options.inspect[0..100]}"
|
256
|
+
end
|
257
|
+
begin
|
258
|
+
res = yield
|
259
|
+
Misc.lock(path) do
|
243
260
|
save_file(path, type, res)
|
244
|
-
res
|
245
|
-
rescue
|
246
|
-
Log.high "Error in persist. Erasing '#{ path }'"
|
247
|
-
FileUtils.rm path if File.exists? path
|
248
|
-
raise $!
|
249
261
|
end
|
262
|
+
res
|
263
|
+
rescue
|
264
|
+
Log.high "Error in persist. Erasing '#{ path }'"
|
265
|
+
FileUtils.rm path if File.exists? path
|
266
|
+
raise $!
|
250
267
|
end
|
251
268
|
end
|
252
269
|
|
data/lib/rbbt/persist/tsv.rb
CHANGED
@@ -82,13 +82,15 @@ module Persist
|
|
82
82
|
end
|
83
83
|
|
84
84
|
def write_and_close
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
85
|
+
Misc.lock(persistence_path) do
|
86
|
+
write if @closed or not write?
|
87
|
+
res = begin
|
88
|
+
yield
|
89
|
+
ensure
|
90
|
+
close
|
91
|
+
end
|
92
|
+
res
|
93
|
+
end
|
92
94
|
end
|
93
95
|
|
94
96
|
def read_and_close
|
@@ -135,7 +137,15 @@ module Persist
|
|
135
137
|
persist_options[:data]
|
136
138
|
when persist_options[:persist]
|
137
139
|
|
138
|
-
filename ||=
|
140
|
+
filename ||= case
|
141
|
+
when source.respond_to?(:filename)
|
142
|
+
source.filename
|
143
|
+
when source.respond_to?(:cmd)
|
144
|
+
"CMD-#{Misc.digest(source.cmd)}"
|
145
|
+
else
|
146
|
+
source.object_id.to_s
|
147
|
+
end
|
148
|
+
|
139
149
|
filename ||= source.object_id.to_s
|
140
150
|
|
141
151
|
path = persistence_path(filename, persist_options, options)
|
@@ -161,25 +171,26 @@ module Persist
|
|
161
171
|
|
162
172
|
begin
|
163
173
|
if data.respond_to? :persistence_path and data != persist_options[:data]
|
164
|
-
|
165
|
-
data
|
166
|
-
yield data
|
167
|
-
end
|
174
|
+
data.write_and_close do
|
175
|
+
yield data
|
168
176
|
end
|
169
177
|
else
|
170
178
|
yield data
|
171
179
|
end
|
172
180
|
rescue Exception
|
181
|
+
FileUtils.rm path if path and File.exists? path
|
182
|
+
raise $!
|
183
|
+
ensure
|
173
184
|
begin
|
174
|
-
data.close if data.
|
185
|
+
data.close if data.respond_to? :close
|
175
186
|
rescue
|
187
|
+
raise $!
|
176
188
|
end
|
177
|
-
FileUtils.rm path if path and File.exists? path
|
178
|
-
raise $!
|
179
189
|
end
|
180
190
|
|
181
191
|
data.read if data.respond_to? :read and ((data.respond_to?(:write?) and data.write?) or (data.respond_to?(:closed?) and data.closed?))
|
182
192
|
|
193
|
+
|
183
194
|
data
|
184
195
|
end
|
185
196
|
|
data/lib/rbbt/resource.rb
CHANGED
@@ -29,7 +29,11 @@ module Resource
|
|
29
29
|
|
30
30
|
def resource_method_missing(name, prev = nil, *args)
|
31
31
|
# Fix problem with ruby 1.9 calling methods by its own initiative. ARG
|
32
|
-
|
32
|
+
if prev.nil?
|
33
|
+
root.send(name, *args)
|
34
|
+
else
|
35
|
+
root.send(name, prev, *args)
|
36
|
+
end
|
33
37
|
end
|
34
38
|
|
35
39
|
def [](file = nil)
|
@@ -41,7 +45,6 @@ module Resource
|
|
41
45
|
end
|
42
46
|
|
43
47
|
def claim(path, type, content = nil, &block)
|
44
|
-
path = path.find if path.respond_to? :find
|
45
48
|
if type == :rake
|
46
49
|
@rake_dirs[path] = content
|
47
50
|
else
|
@@ -56,28 +59,30 @@ module Resource
|
|
56
59
|
end
|
57
60
|
end
|
58
61
|
|
59
|
-
def produce(path)
|
62
|
+
def produce(path, force = false)
|
60
63
|
case
|
61
64
|
when @resources.include?(path)
|
62
65
|
type, content = @resources[path]
|
63
66
|
when has_rake(path)
|
64
67
|
type = :rake
|
65
68
|
rake_dir, content = rake_for(path)
|
69
|
+
rake_dir = Path.setup(rake_dir.dup, self.pkgdir, self)
|
66
70
|
else
|
67
71
|
raise "Resource #{ path } does not seem to be claimed"
|
68
72
|
end
|
69
73
|
|
70
|
-
|
71
|
-
|
74
|
+
final_path = path.respond_to?(:find) ? (force ? path.find(:user) : path.find) : path
|
75
|
+
if not File.exists? final_path or force
|
76
|
+
Misc.lock final_path + '.produce' do
|
72
77
|
begin
|
73
78
|
case type
|
74
79
|
when :string
|
75
|
-
Open.write(
|
80
|
+
Open.write(final_path, content)
|
76
81
|
when :url
|
77
|
-
Open.write(
|
82
|
+
Open.write(final_path, Open.open(content))
|
78
83
|
when :proc
|
79
84
|
data = content.call
|
80
|
-
Open.write(
|
85
|
+
Open.write(final_path, data)
|
81
86
|
when :rake
|
82
87
|
run_rake(path, content, rake_dir)
|
83
88
|
when :install
|
@@ -99,7 +104,7 @@ source "$INSTALL_HELPER_FILE"
|
|
99
104
|
raise "Could not produce #{ resource }. (#{ type }, #{ content })"
|
100
105
|
end
|
101
106
|
rescue
|
102
|
-
FileUtils.
|
107
|
+
FileUtils.rm_rf final_path if File.exists? final_path
|
103
108
|
raise $!
|
104
109
|
end
|
105
110
|
end
|
data/lib/rbbt/resource/path.rb
CHANGED
@@ -117,19 +117,19 @@ module Path
|
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
120
|
-
def produce
|
120
|
+
def produce(force = false)
|
121
121
|
path = self.find
|
122
|
-
return self if File.exists?
|
122
|
+
return self if File.exists?(path) and not force
|
123
123
|
|
124
124
|
raise "No resource defined to produce file: #{ self }" if resource.nil?
|
125
125
|
|
126
|
-
resource.produce
|
126
|
+
resource.produce self, force
|
127
127
|
|
128
128
|
path
|
129
129
|
end
|
130
130
|
|
131
|
-
def read
|
132
|
-
Open.read(self.produce.find)
|
131
|
+
def read(&block)
|
132
|
+
Open.read(self.produce.find, &block)
|
133
133
|
end
|
134
134
|
|
135
135
|
def open(options = {})
|
data/lib/rbbt/resource/rake.rb
CHANGED
@@ -37,12 +37,16 @@ module Rake
|
|
37
37
|
|
38
38
|
raise TaskNotFound if Rake::Task[task].nil?
|
39
39
|
|
40
|
-
|
41
|
-
|
40
|
+
t = nil
|
41
|
+
pid = Process.fork{
|
42
|
+
Misc.in_dir(dir) do
|
43
|
+
Rake::Task[task].invoke
|
42
44
|
|
43
|
-
|
44
|
-
|
45
|
-
|
45
|
+
Rake::Task.clear
|
46
|
+
Rake::FileTask.clear_files
|
47
|
+
end
|
48
|
+
}
|
49
|
+
Process.wait(pid)
|
46
50
|
|
47
51
|
end
|
48
52
|
end
|
data/lib/rbbt/resource/util.rb
CHANGED
@@ -8,7 +8,7 @@ module Path
|
|
8
8
|
l =~ /rbbt\/resource\/path\.rb/ or
|
9
9
|
l =~ /rbbt\/util\/misc\.rb/ or
|
10
10
|
l =~ /progress-monitor\.rb/
|
11
|
-
}.first.sub(/\.rb.*/,'.rb') if file.nil?
|
11
|
+
}.first.sub(/\.rb[^\w].*/,'.rb') if file.nil?
|
12
12
|
|
13
13
|
file = File.expand_path file
|
14
14
|
return Path.setup(file) if File.exists? File.join(file, relative_to)
|
@@ -82,7 +82,7 @@ module Resource
|
|
82
82
|
|
83
83
|
|
84
84
|
def rake_for(path)
|
85
|
-
|
85
|
+
@rake_dirs.reject{|dir, content|
|
86
86
|
!Misc.common_path(dir, path)
|
87
87
|
}.sort_by{|dir, content|
|
88
88
|
dir.length
|
@@ -97,6 +97,8 @@ module Resource
|
|
97
97
|
task = Misc.path_relative_to rake_dir, path
|
98
98
|
rakefile = rakefile.produce if rakefile.respond_to? :produce
|
99
99
|
|
100
|
+
rake_dir = rake_dir.find if rake_dir.respond_to? :find
|
101
|
+
|
100
102
|
begin
|
101
103
|
Rake.run(rakefile, rake_dir, task)
|
102
104
|
rescue Rake::TaskNotFound
|
data/lib/rbbt/tsv.rb
CHANGED
@@ -17,7 +17,9 @@ require 'rbbt/tsv/filter'
|
|
17
17
|
|
18
18
|
module TSV
|
19
19
|
def self.setup(hash, options = {})
|
20
|
-
|
20
|
+
options = Misc.add_defaults options, :default_value => []
|
21
|
+
default_value = Misc.process_options options, :default_value
|
22
|
+
hash = Misc.array2hash(hash, default_value) if Array === hash
|
21
23
|
hash.extend TSV
|
22
24
|
|
23
25
|
IndiferentHash.setup(options)
|
@@ -40,9 +42,14 @@ module TSV
|
|
40
42
|
filename = get_filename source
|
41
43
|
serializer = Misc.process_options options, :serializer
|
42
44
|
unnamed = Misc.process_options options, :unnamed
|
45
|
+
entity_options = Misc.process_options options, :entity_options
|
43
46
|
|
44
|
-
Log.debug "TSV open: #{ filename } - #{options.inspect}"
|
47
|
+
Log.debug "TSV open: #{ filename } - #{options.inspect}.#{unnamed ? " [unnamed]" : "[not unnamed]"}"
|
45
48
|
|
49
|
+
data = nil
|
50
|
+
|
51
|
+
lock_filename = filename.nil? ? nil : Persist.persistence_path(filename, {:dir => Rbbt.tmp.tsv_open_locks.find})
|
52
|
+
Misc.lock lock_filename do
|
46
53
|
data = Persist.persist_tsv source, filename, options, persist_options do |data|
|
47
54
|
if serializer
|
48
55
|
data.extend TSV unless TSV === data
|
@@ -56,14 +63,17 @@ module TSV
|
|
56
63
|
|
57
64
|
data.filename = filename.to_s unless filename.nil?
|
58
65
|
if data.identifiers.nil? and Path === filename and filename.identifier_file_path
|
59
|
-
data.identifiers = filename.identifier_file_path.
|
66
|
+
data.identifiers = filename.identifier_file_path.to_s
|
60
67
|
end
|
61
68
|
|
62
69
|
data
|
63
70
|
end
|
71
|
+
end
|
64
72
|
|
65
73
|
data.unnamed = unnamed unless unnamed.nil?
|
66
74
|
|
75
|
+
data.entity_options = entity_options
|
76
|
+
|
67
77
|
data
|
68
78
|
end
|
69
79
|
|
@@ -72,13 +82,13 @@ module TSV
|
|
72
82
|
end
|
73
83
|
|
74
84
|
def self.parse(stream, data, options = {})
|
75
|
-
monitor, grep = Misc.process_options options, :monitor, :grep
|
85
|
+
monitor, grep, invert_grep = Misc.process_options options, :monitor, :grep, :invert_grep
|
76
86
|
|
77
87
|
parser = Parser.new stream, options
|
78
88
|
|
79
89
|
if grep
|
80
90
|
stream.rewind
|
81
|
-
stream = Open.grep(stream, grep)
|
91
|
+
stream = Open.grep(stream, grep, invert_grep)
|
82
92
|
parser.first_line = stream.gets
|
83
93
|
end
|
84
94
|
|
@@ -131,10 +141,11 @@ module TSV
|
|
131
141
|
progress_monitor = nil
|
132
142
|
end
|
133
143
|
|
134
|
-
while not line.nil?
|
144
|
+
while not line.nil?
|
135
145
|
begin
|
136
146
|
progress_monitor.tick(stream.pos) if progress_monitor
|
137
147
|
|
148
|
+
line = Misc.fixutf8(line)
|
138
149
|
line = parser.process line
|
139
150
|
parts = parser.chop_line line
|
140
151
|
key, values = parser.get_values parts
|
@@ -142,8 +153,12 @@ module TSV
|
|
142
153
|
parser.add_to_data data, key, values
|
143
154
|
line = stream.gets
|
144
155
|
rescue Parser::SKIP_LINE
|
145
|
-
|
146
|
-
|
156
|
+
begin
|
157
|
+
line = stream.gets
|
158
|
+
next
|
159
|
+
rescue IOError
|
160
|
+
break
|
161
|
+
end
|
147
162
|
rescue Parser::END_PARSING
|
148
163
|
break
|
149
164
|
rescue IOError
|