rbbt-util 5.27.1 → 5.27.6

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