rbbt-util 5.27.1 → 5.27.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rbbt/annotations/util.rb +1 -2
  3. data/lib/rbbt/entity.rb +8 -5
  4. data/lib/rbbt/fix_width_table.rb +6 -5
  5. data/lib/rbbt/knowledge_base/entity.rb +3 -2
  6. data/lib/rbbt/knowledge_base/query.rb +9 -0
  7. data/lib/rbbt/persist.rb +2 -3
  8. data/lib/rbbt/persist/tsv.rb +5 -5
  9. data/lib/rbbt/persist/tsv/adapter.rb +136 -43
  10. data/lib/rbbt/persist/tsv/tokyocabinet.rb +5 -3
  11. data/lib/rbbt/resource.rb +8 -5
  12. data/lib/rbbt/resource/path.rb +3 -3
  13. data/lib/rbbt/tsv/accessor.rb +6 -6
  14. data/lib/rbbt/tsv/change_id.rb +3 -1
  15. data/lib/rbbt/tsv/parallel/traverse.rb +1 -1
  16. data/lib/rbbt/tsv/util.rb +1 -0
  17. data/lib/rbbt/util/misc/exceptions.rb +8 -0
  18. data/lib/rbbt/workflow.rb +1 -1
  19. data/lib/rbbt/workflow/accessor.rb +3 -1
  20. data/lib/rbbt/workflow/definition.rb +6 -0
  21. data/lib/rbbt/workflow/remote_workflow/driver/rest.rb +9 -3
  22. data/lib/rbbt/workflow/remote_workflow/remote_step.rb +9 -3
  23. data/lib/rbbt/workflow/remote_workflow/remote_step/rest.rb +7 -1
  24. data/lib/rbbt/workflow/step/accessor.rb +4 -0
  25. data/lib/rbbt/workflow/step/dependencies.rb +10 -6
  26. data/lib/rbbt/workflow/step/run.rb +2 -2
  27. data/lib/rbbt/workflow/task.rb +1 -1
  28. data/lib/rbbt/workflow/usage.rb +25 -8
  29. data/lib/rbbt/workflow/util/archive.rb +30 -4
  30. data/share/install/software/lib/install_helpers +9 -3
  31. data/share/rbbt_commands/migrate_job +3 -1
  32. data/share/rbbt_commands/system/status +3 -2
  33. data/share/rbbt_commands/tsv/get +33 -7
  34. data/share/rbbt_commands/workflow/monitor +3 -3
  35. data/share/rbbt_commands/workflow/task +1 -1
  36. data/test/rbbt/knowledge_base/test_query.rb +1 -1
  37. data/test/rbbt/test_entity.rb +14 -5
  38. data/test/rbbt/test_knowledge_base.rb +3 -3
  39. data/test/rbbt/workflow/step/test_dependencies.rb +40 -8
  40. data/test/rbbt/workflow/test_remote_workflow.rb +13 -1
  41. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f9a8f4d4bbf80d9f7ad26f1867efe048bad08e1f0bd42b32ac731744380ba571
4
- data.tar.gz: 9692dd68f20cec3b8688cc9d75e1bcd4d75a024924c56c191a87897162d34ef4
3
+ metadata.gz: fe7c3dec4d2333e77ea396a2d6e572512bf7033999ff4715f1a1c6c9d3d1b9d5
4
+ data.tar.gz: 32a3d905c1a95f9c7e5cb359855f8781509cfeecdd8db7b77ee29eaea528d030
5
5
  SHA512:
6
- metadata.gz: cb9672eec11a5184795c1e85283f0ed948f34c77f91d31fd6852c389820abdadb555dc99acd823adefd8b6afbb3c4589988599f3095e2ba10e7bdb633404db98
7
- data.tar.gz: e28718c7c60c25a4316997f477b2fca33b067865965bff51a423b1a84124e3abe20fdce50543e23e11852256376d4caaf6932a399d404e27823db2d577e543e8
6
+ metadata.gz: d009024642898f775d423e1ddede6aea538e8ed5ff4675eedadd64768e67b0a46f6519038378a221db76b0e196cfc713ca8dc7553788cdb9a51014c14a97de4c
7
+ data.tar.gz: 5c0612feca84b00e6d402f7a68ca1cebd6f4b7a785b40899bdaed3385a3f68853824dcc98d9cfd2e641768ef5ca3d52e38e41bdbc1d7a3751ae288e8f8d7ed2d
@@ -145,10 +145,9 @@ module Annotated
145
145
 
146
146
  end
147
147
 
148
- fields = fields.collect{|f| f.to_s}
148
+ fields = fields.collect{|f| f.to_s}.uniq
149
149
 
150
150
  case
151
-
152
151
  when (Annotated === annotations and not (AnnotatedArray === annotations and annotations.double_array))
153
152
  tsv = TSV.setup({}, :key_field => "List", :fields => fields, :type => :list, :unnamed => true)
154
153
 
@@ -194,13 +194,16 @@ module Entity
194
194
  multi_name = "_multiple_" << name
195
195
 
196
196
  define_method multi_name do
197
- if self.instance_variable_get("@multiple_result")
198
- return self.instance_variable_get("@multiple_result")
197
+ if self.instance_variable_get("@multiple_result_" + name.to_s)
198
+ return self.instance_variable_get("@multiple_result_" + name.to_s)
199
199
  end
200
- raise MultipleEntity, "Entity #{name} runs with multiple entities: #{self}"
200
+ raise MultipleEntity, "Entity #{name} runs with multiple entities"
201
201
  end
202
202
 
203
203
  define_method name do |*args|
204
+ if self.instance_variable_get("@multiple_result_" + name.to_s)
205
+ return self.instance_variable_get("@multiple_result_" + name.to_s)
206
+ end
204
207
  obj = if Array === self
205
208
  self
206
209
  elsif self.respond_to?(:container) && Array === self.container
@@ -222,11 +225,11 @@ module Entity
222
225
  case res
223
226
  when Array
224
227
  missing.zip(res).each do |o,res|
225
- o.instance_variable_set("@multiple_result", res)
228
+ o.instance_variable_set("@multiple_result_" + name.to_s, res)
226
229
  end
227
230
  when Hash
228
231
  res.each do |o,res|
229
- o.instance_variable_set("@multiple_result", res)
232
+ o.instance_variable_set("@multiple_result_" + name.to_s, res)
230
233
  end
231
234
  end
232
235
 
@@ -4,20 +4,21 @@ class FixWidthTable
4
4
  def initialize(filename, value_size = nil, range = nil, update = false, in_memory = true)
5
5
  @filename = filename
6
6
 
7
- if update or %w(memory stringio).include?(filename.to_s.downcase) or not File.exist?(filename)
7
+ if update || %w(memory stringio).include?(filename.to_s.downcase) || ! File.exist?(filename)
8
8
  Log.debug "FixWidthTable create: #{ filename }"
9
9
  @value_size = value_size
10
10
  @range = range
11
11
  @record_size = @value_size + (@range ? 16 : 8)
12
12
  @write = true
13
13
 
14
- if %w(memory stringio).include? filename.to_s.downcase
14
+ if %w(memory stringio).include?(filename.to_s.downcase)
15
15
  @filename = :memory
16
16
  @file = StringIO.new
17
17
  else
18
18
  FileUtils.rm @filename if File.exist? @filename
19
19
  FileUtils.mkdir_p File.dirname(@filename) unless File.exist? @filename
20
- @file = File.open(@filename, 'wb')
20
+ #@file = File.open(@filename, 'wb')
21
+ @file = File.open(@filename, 'w:ASCII-8BIT')
21
22
  end
22
23
 
23
24
  @file.write [value_size].pack("L")
@@ -25,9 +26,9 @@ class FixWidthTable
25
26
 
26
27
  @size = 0
27
28
  else
28
- Log.debug "FixWidthTable up-to-date: #{ filename }"
29
+ Log.debug "FixWidthTable up-to-date: #{ filename } - (in_memory:#{in_memory})"
29
30
  if in_memory
30
- @file = StringIO.new(Open.read(@filename, :mode => 'r:ASCII-8BIT'), 'r')
31
+ @file = Open.open(@filename, :mode => 'r:ASCII-ASCII'){|f| StringIO.new f.read}
31
32
  else
32
33
  @file = File.open(@filename, 'r:ASCII-8BIT')
33
34
  end
@@ -5,14 +5,15 @@ class KnowledgeBase
5
5
 
6
6
  def select_entities(name, entities, options = {})
7
7
  index = get_index(name, options)
8
+
8
9
  source_field = index.source_field
9
10
  target_field = index.target_field
10
11
 
11
12
  source_type = Entity.formats[source_field]
12
13
  target_type = Entity.formats[target_field]
13
14
 
14
- source_entities = entities[:source] || entities[source_field] || entities[Entity.formats[source_field].to_s]
15
- target_entities = entities[:target] || entities[target_field] || entities[Entity.formats[target_field].to_s]
15
+ source_entities = entities[:source] || entities[source_field] || entities[Entity.formats[source_field].to_s] || entities[:both]
16
+ target_entities = entities[:target] || entities[target_field] || entities[Entity.formats[target_field].to_s] || entities[:both]
16
17
 
17
18
  [source_entities, target_entities]
18
19
  end
@@ -10,6 +10,7 @@ class KnowledgeBase
10
10
 
11
11
  def subset(name, entities, options = {}, &block)
12
12
  entities, options = options, entities if entities.nil? and Hash === options
13
+
13
14
  entities = case entities
14
15
  when :all
15
16
  {:target => :all, :source => :all}
@@ -23,7 +24,15 @@ class KnowledgeBase
23
24
  raise "Entities are not a Hash or an AnnotatedArray: #{Misc.fingerprint entities}"
24
25
  end
25
26
 
27
+ identify, identify_source, identify_target = entities.merge(options || {}).values_at :identify, :identify_source, :identify_target
28
+
26
29
  source, target = select_entities(name, entities, options)
30
+
31
+ source = identify_source(name, source) if identify_source
32
+ target = identify_target(name, target) if identify_target
33
+
34
+ source = identify(name, source) if identify && !identify_source
35
+ target = identify(name, target) if identify && !identify_target
27
36
 
28
37
  return [] if source.nil? or target.nil?
29
38
  return [] if Array === target and target.empty?
@@ -407,7 +407,6 @@ module Persist
407
407
  repo.read_and_close do
408
408
  keys = repo.range subkey + 0.chr, true, subkey + 254.chr, true
409
409
  end
410
- repo.close
411
410
  else
412
411
  repo.read_and_close do
413
412
  keys = repo.range subkey + 0.chr, true, subkey + 254.chr, true
@@ -461,13 +460,13 @@ module Persist
461
460
  entities.each_with_index do |e,i|
462
461
  next if e.nil?
463
462
  tsv_values = e.tsv_values("literal", "annotation_types", "JSON")
464
- repo[subkey + e.id << ":ANNOTATED_DOUBLE_ARRAY:" << i.to_s] = tsv_values
463
+ repo[subkey + "ANNOTATED_DOUBLE_ARRAY:" << i.to_s] = tsv_values
465
464
  end
466
465
  else
467
466
  entities.each_with_index do |e,i|
468
467
  next if e.nil?
469
468
  tsv_values = e.tsv_values("literal", "annotation_types", "JSON")
470
- repo[subkey + e.id << ":" << i.to_s] = tsv_values
469
+ repo[subkey + i.to_s] = tsv_values
471
470
  end
472
471
  end
473
472
  end
@@ -148,13 +148,13 @@ module Persist
148
148
 
149
149
  data.write_and_read do
150
150
  yield data
151
- end
152
151
 
153
- FileUtils.mv data.persistence_path, path if File.exist? data.persistence_path and not File.exist? path
154
- tsv = CONNECTIONS[path] = CONNECTIONS.delete tmp_path
155
- tsv.persistence_path = path
152
+ FileUtils.mv data.persistence_path, path if File.exist? data.persistence_path and not File.exist? path
153
+ tsv = CONNECTIONS[path] = CONNECTIONS.delete tmp_path
154
+ tsv.persistence_path = path
156
155
 
157
- tsv.fix_io if tsv.respond_to? :fix_io
156
+ tsv.fix_io if tsv.respond_to? :fix_io
157
+ end
158
158
 
159
159
  data
160
160
  rescue Exception
@@ -9,43 +9,40 @@ module Persist
9
9
  @mutex ||= Mutex.new
10
10
  end
11
11
 
12
- def prefix(key)
13
- range(key, 1, key + MAX_CHAR, 1)
14
- end
15
-
16
- def get_prefix(key)
17
- keys = prefix(key)
18
- select(:key => keys)
19
- end
20
-
21
12
  def closed?
22
13
  @closed
23
14
  end
24
15
 
25
- def close
26
- @closed = true
27
- super
28
- self
29
- end
30
-
31
16
  def write?
32
17
  @writable
33
18
  end
34
19
 
35
20
  def read?
36
- ! write?
21
+ ! (write? || closed?)
37
22
  end
38
23
 
39
- def collect
40
- res = []
41
- each do |key, value|
42
- res << if block_given?
43
- yield key, value
44
- else
45
- [key, value]
46
- end
24
+ def write(*args)
25
+ begin
26
+ super(*args)
27
+ @writable = true
28
+ rescue NoMethodError
29
+ end
30
+ end
31
+
32
+ def close(*args)
33
+ begin
34
+ super(*args)
35
+ @closed = true
36
+ rescue NoMethodError
37
+ end
38
+ self
39
+ end
40
+
41
+ def read(*args)
42
+ begin
43
+ super(*args)
44
+ rescue NoMethodError
47
45
  end
48
- res
49
46
  end
50
47
 
51
48
  def delete(key)
@@ -53,34 +50,59 @@ module Persist
53
50
  end
54
51
 
55
52
  def lock
53
+ return yield if @locked
56
54
  lock_filename = Persist.persistence_path(persistence_path, {:dir => TSV.lock_dir})
55
+ Log.stack caller if $LOG
57
56
  Misc.lock(lock_filename) do
58
- yield
57
+ begin
58
+ @locked = true
59
+ yield
60
+ ensure
61
+ @locked = false
62
+ end
63
+ end
64
+ end
65
+
66
+ def lock_and_close
67
+ lock do
68
+ begin
69
+ yield
70
+ ensure
71
+ close
72
+ end
59
73
  end
60
74
  end
61
75
 
62
76
  def write_and_read
63
- #lock_filename = Persist.persistence_path(persistence_path, {:dir => TSV.lock_dir})
64
- #mutex.synchronize do
65
- #Misc.lock(lock_filename) do
77
+ if write?
78
+ begin
79
+ return yield
80
+ ensure
81
+ read
82
+ end
83
+ end
84
+
66
85
  lock do
67
- write true if closed? or not write?
86
+ write(true) if closed? || !write?
68
87
  begin
69
88
  yield
70
89
  ensure
71
90
  read
72
91
  end
73
92
  end
74
- #end
75
- #end
76
93
  end
77
94
 
78
95
  def write_and_close
79
- #lock_filename = Persist.persistence_path(persistence_path + '.write', {:dir => TSV.lock_dir})
80
- #mutex.synchronize do
81
- #Misc.lock(lock_filename, true) do
96
+ if write?
97
+ begin
98
+ return yield
99
+ ensure
100
+ close unless @locked
101
+ end
102
+ end
103
+
82
104
  lock do
83
- write true if closed? || ! write?
105
+ write(true) if closed? || ! write?
84
106
  res = begin
85
107
  yield
86
108
  rescue Exception
@@ -91,11 +113,18 @@ module Persist
91
113
  end
92
114
  res
93
115
  end
94
- #end
95
- #end
96
116
  end
97
117
 
98
118
  def read_and_close
119
+ #return yield if @locked
120
+ if read? || write?
121
+ begin
122
+ return yield
123
+ ensure
124
+ close unless @locked
125
+ end
126
+ end
127
+
99
128
  lock do
100
129
  read true if closed? || ! read?
101
130
  begin
@@ -106,21 +135,85 @@ module Persist
106
135
  end
107
136
  end
108
137
 
109
-
110
138
  def merge!(hash)
111
139
  hash.each do |key,values|
112
140
  self[key] = values
113
141
  end
114
142
  end
115
143
 
116
-
117
144
  def range(*args)
118
- super(*args) #- TSV::ENTRY_KEYS.to_a
145
+ self.read_and_close do
146
+ super(*args)
147
+ end
119
148
  end
120
149
 
121
150
  def include?(*args)
122
- read if closed?
123
- super(*args) #- TSV::ENTRY_KEYS.to_a
151
+ self.read_and_close do
152
+ super(*args) #- TSV::ENTRY_KEYS.to_a
153
+ end
154
+ end
155
+
156
+ def [](*args)
157
+ self.read_and_close do
158
+ super(*args) #- TSV::ENTRY_KEYS.to_a
159
+ end
160
+ end
161
+
162
+ def []=(*args)
163
+ self.write_and_close do
164
+ super(*args) #- TSV::ENTRY_KEYS.to_a
165
+ end
166
+ end
167
+
168
+ def keys(*args)
169
+ self.read_and_close do
170
+ super(*args)
171
+ end
172
+ end
173
+
174
+
175
+ def prefix(key)
176
+ self.read_and_close do
177
+ range(key, 1, key + MAX_CHAR, 1)
178
+ end
179
+ end
180
+
181
+ def get_prefix(key)
182
+ keys = prefix(key)
183
+ select(:key => keys)
184
+ end
185
+
186
+
187
+ def size(*args)
188
+ self.read_and_close do
189
+ super(*args)
190
+ end
191
+ end
192
+
193
+ def each(*args, &block)
194
+ self.read_and_close do
195
+ super(*args, &block)
196
+ end
197
+ end
198
+
199
+ def collect
200
+ res = []
201
+ each do |key, value|
202
+ res << if block_given?
203
+ yield key, value
204
+ else
205
+ [key, value]
206
+ end
207
+ end
208
+ res
209
+ end
210
+
211
+ def values_at(*keys)
212
+ self.read_and_close do
213
+ keys.collect do |k|
214
+ self[k]
215
+ end
216
+ end
124
217
  end
125
218
  end
126
219
  end
@@ -16,7 +16,7 @@ module Persist
16
16
  end
17
17
 
18
18
  dir = File.dirname(File.expand_path(path))
19
- Open.mkdir(dir) unless Open.exists?(dir)
19
+ File.mkdir(dir) unless File.exists?(dir)
20
20
 
21
21
  tokyocabinet_class = TokyoCabinet::HDB if tokyocabinet_class == "HDB" or tokyocabinet_class.nil?
22
22
  tokyocabinet_class = TokyoCabinet::BDB if tokyocabinet_class == "BDB"
@@ -87,13 +87,15 @@ module Persist
87
87
  def self.open_tokyocabinet(path, write, serializer = nil, tokyocabinet_class = TokyoCabinet::HDB)
88
88
  write = true unless File.exist? path
89
89
 
90
- FileUtils.mkdir_p File.dirname(path) unless Open.exist?(File.dirname(path))
90
+ FileUtils.mkdir_p File.dirname(path) unless File.exist?(File.dirname(path))
91
91
 
92
92
  database = Persist::TCAdapter.open(path, write, tokyocabinet_class)
93
93
 
94
94
  unless serializer == :clean
95
95
  TSV.setup database
96
- database.serializer = serializer || database.serializer
96
+ database.write_and_read do
97
+ database.serializer = serializer
98
+ end if serializer && database.serializer != serializer
97
99
  end
98
100
 
99
101
  database