rbbt-util 5.34.11 → 5.34.12
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.
- checksums.yaml +4 -4
- data/lib/rbbt/annotations/annotated_array.rb +2 -2
- data/lib/rbbt/annotations/util.rb +39 -19
- data/lib/rbbt/entity.rb +15 -10
- data/lib/rbbt/persist/tsv/adapter.rb +7 -2
- data/lib/rbbt/persist/tsv/tokyocabinet/marshal.rb +22 -0
- data/lib/rbbt/persist/tsv/tokyocabinet.rb +2 -0
- data/lib/rbbt/persist.rb +6 -0
- data/lib/rbbt/tsv/manipulate.rb +8 -7
- data/lib/rbbt/tsv/marshal.rb +17 -0
- data/lib/rbbt/tsv/util.rb +0 -10
- data/lib/rbbt/tsv.rb +1 -0
- data/lib/rbbt/util/concurrency/processes/socket.rb +5 -1
- data/lib/rbbt/util/misc/development.rb +11 -0
- data/lib/rbbt/util/misc/objects.rb +5 -4
- data/test/rbbt/annotations/test_util.rb +21 -2
- data/test/rbbt/tsv/test_marshal.rb +24 -0
- data/test/rbbt/tsv/test_util.rb +0 -16
- data/test/rbbt/util/misc/test_development.rb +11 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1d36e35e1495c3c319e8aa0485851b870e985bc34ea282f21c8e744adc302f50
|
4
|
+
data.tar.gz: e4df8738231ce9e1f8ebf70090595413fef4555ad9bedde4b52b36ebc219e39e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3ebc6c5ea53567b06a58854ab0b58c83777d939bb67a80cc28dbe7ebaa992269f59c20c2dba28d799402bfded6cbd9771ad1036e31ebbb365e3995500cd37f44
|
7
|
+
data.tar.gz: 2d3870b76a07c096ee1df74593b6bd641c0f1f8aab68c09827bae57cf64ee97e237b22ee6d16edb81ddcc83b7d8b6f4cb6298da8d203c63f8cdebc408b44fb84
|
@@ -61,8 +61,8 @@ module AnnotatedArray
|
|
61
61
|
|
62
62
|
value = annotate(value)
|
63
63
|
|
64
|
-
value.container = self
|
65
|
-
value.container_index = pos
|
64
|
+
value.container = self if value.respond_to?(:container)
|
65
|
+
value.container_index = pos if value.respond_to?(:container_index)
|
66
66
|
|
67
67
|
pos += 1
|
68
68
|
|
@@ -217,46 +217,66 @@ module Annotated
|
|
217
217
|
end
|
218
218
|
end
|
219
219
|
|
220
|
-
def marshal_dump
|
221
|
-
Annotated.purge(self).to_sym.to_s
|
222
|
-
end
|
223
|
-
|
224
220
|
def self.to_hash(e)
|
225
221
|
hash = {}
|
226
|
-
if Array === e &&
|
222
|
+
if Array === e && AnnotatedArray === e
|
227
223
|
hash[:literal] = Annotated.purge(e)
|
228
224
|
hash[:info] = e.info
|
229
225
|
elsif Array === e
|
230
226
|
hash = e.collect do |_e|
|
231
227
|
_hash = {}
|
232
|
-
_hash[:literal] = _e
|
233
|
-
_hash[:info] = _e.info
|
228
|
+
_hash[:literal] = _e.dup
|
229
|
+
_hash[:info] = _e.info if _e.respond_to?(:info)
|
234
230
|
_hash
|
235
231
|
end
|
236
232
|
else
|
237
|
-
hash[:literal] = e
|
233
|
+
hash[:literal] = e.dup
|
238
234
|
hash[:info] = e.info
|
239
235
|
end
|
240
236
|
hash
|
241
237
|
end
|
242
238
|
|
243
239
|
def self.load_hash(hash)
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
240
|
+
if Array === hash
|
241
|
+
hash.collect{|h| load_hash(h) }
|
242
|
+
else
|
243
|
+
literal = hash[:literal]
|
244
|
+
info = hash[:info]
|
245
|
+
info[:annotation_types].each do |type|
|
246
|
+
type = Kernel.const_get(type) if String === type
|
247
|
+
type.setup(literal, info)
|
248
|
+
end
|
249
|
+
literal
|
249
250
|
end
|
250
|
-
|
251
|
+
end
|
252
|
+
|
253
|
+
def marshal_dump
|
254
|
+
Annotated.to_hash(self)
|
251
255
|
end
|
252
256
|
end
|
253
257
|
|
254
258
|
class String
|
255
|
-
def marshal_load(
|
256
|
-
|
259
|
+
def marshal_load(hash)
|
260
|
+
if Hash === hash
|
261
|
+
e = Annotated.load_hash(hash)
|
262
|
+
self.replace e
|
263
|
+
e.annotate(self)
|
264
|
+
self
|
265
|
+
else
|
266
|
+
self.replace hash
|
267
|
+
end
|
257
268
|
end
|
258
269
|
end
|
259
270
|
|
260
|
-
|
261
|
-
|
262
|
-
|
271
|
+
class Array
|
272
|
+
def marshal_load(hash)
|
273
|
+
if Hash === hash
|
274
|
+
e = Annotated.load_hash(hash)
|
275
|
+
self.replace e
|
276
|
+
e.annotate(self)
|
277
|
+
self
|
278
|
+
else
|
279
|
+
self.replace hash
|
280
|
+
end
|
281
|
+
end
|
282
|
+
end
|
data/lib/rbbt/entity.rb
CHANGED
@@ -5,7 +5,7 @@ module Entity
|
|
5
5
|
|
6
6
|
UNPERSISTED_PREFIX = "entity_unpersisted_property_"
|
7
7
|
|
8
|
-
class MultipleEntity <
|
8
|
+
class MultipleEntity < TryAgain; end
|
9
9
|
|
10
10
|
class DontPersist < Exception
|
11
11
|
attr_accessor :payload
|
@@ -120,10 +120,6 @@ module Entity
|
|
120
120
|
coder.scalar = clean_annotations
|
121
121
|
end
|
122
122
|
|
123
|
-
def marshal_dump
|
124
|
-
clean_annotations
|
125
|
-
end
|
126
|
-
|
127
123
|
def consolidate
|
128
124
|
self.inject(nil){|acc,e|
|
129
125
|
if acc.nil?
|
@@ -203,9 +199,11 @@ module Entity
|
|
203
199
|
end
|
204
200
|
|
205
201
|
define_method name do |*args|
|
202
|
+
|
206
203
|
if self.instance_variable_get("@multiple_result_" + name.to_s)
|
207
204
|
return self.instance_variable_get("@multiple_result_" + name.to_s)
|
208
205
|
end
|
206
|
+
|
209
207
|
obj = if Array === self
|
210
208
|
self
|
211
209
|
elsif self.respond_to?(:container) && Array === self.container
|
@@ -217,7 +215,8 @@ module Entity
|
|
217
215
|
missing = []
|
218
216
|
obj.each do |e|
|
219
217
|
begin
|
220
|
-
e.send(multi_name)
|
218
|
+
res = e.send(multi_name)
|
219
|
+
e.instance_variable_set("@multiple_result_" + name.to_s, res)
|
221
220
|
rescue MultipleEntity
|
222
221
|
missing << e
|
223
222
|
end
|
@@ -227,20 +226,26 @@ module Entity
|
|
227
226
|
case res
|
228
227
|
when Array
|
229
228
|
missing.zip(res).each do |o,res|
|
230
|
-
raise "Multiple function #{name} result nil for element #{o}" if res.nil?
|
229
|
+
raise "Multiple function '#{name}' result 'nil' for element '#{o}'" if res.nil?
|
231
230
|
o.instance_variable_set("@multiple_result_" + name.to_s, res)
|
231
|
+
o.send(multi_name)
|
232
232
|
end
|
233
233
|
when Hash
|
234
234
|
res.each do |o,res|
|
235
|
-
raise "Multiple function #{name} result nil for element #{o}" if res.nil?
|
235
|
+
raise "Multiple function '#{name}' result 'nil' for element '#{o}'" if res.nil?
|
236
236
|
o.instance_variable_set("@multiple_result_" + name.to_s, res)
|
237
|
+
o.send(multi_name)
|
237
238
|
end
|
238
239
|
end
|
239
240
|
|
240
241
|
if Array === self
|
241
|
-
self.collect{|o| o.send(multi_name)}
|
242
|
+
res = self.collect{|o| o.send(multi_name)}
|
243
|
+
self.instance_variable_set("@multiple_result_" + name.to_s, res)
|
244
|
+
res
|
242
245
|
else
|
243
|
-
self.send(multi_name)
|
246
|
+
res = self.send(multi_name)
|
247
|
+
self.instance_variable_set("@multiple_result_" + name.to_s, res)
|
248
|
+
res
|
244
249
|
end
|
245
250
|
end
|
246
251
|
|
@@ -193,8 +193,12 @@ module Persist
|
|
193
193
|
end
|
194
194
|
|
195
195
|
def range(*args)
|
196
|
-
|
197
|
-
|
196
|
+
begin
|
197
|
+
self.read_lock do
|
198
|
+
super(*args)
|
199
|
+
end
|
200
|
+
rescue
|
201
|
+
[]
|
198
202
|
end
|
199
203
|
end
|
200
204
|
|
@@ -266,5 +270,6 @@ module Persist
|
|
266
270
|
end
|
267
271
|
end
|
268
272
|
end
|
273
|
+
|
269
274
|
end
|
270
275
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Persist
|
2
|
+
module TCAdapter
|
3
|
+
def marshal_dump
|
4
|
+
[persistence_path, tokyocabinet_class]
|
5
|
+
end
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class TokyoCabinet::BDB
|
10
|
+
def marshal_load(values)
|
11
|
+
persistence_path, tokyocabinet_class = values
|
12
|
+
Persist::TCAdapter.open persistence_path, false, tokyocabinet_class
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class TokyoCabinet::HDB
|
17
|
+
def marshal_load(values)
|
18
|
+
persistence_path, tokyocabinet_class = values
|
19
|
+
Persist::TCAdapter.open persistence_path, false, tokyocabinet_class
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
data/lib/rbbt/persist.rb
CHANGED
@@ -359,6 +359,12 @@ module Persist
|
|
359
359
|
Log.exception $!
|
360
360
|
sleep 1 + rand(2)
|
361
361
|
retry
|
362
|
+
rescue TryAgain
|
363
|
+
begin
|
364
|
+
Open.rm path
|
365
|
+
rescue
|
366
|
+
end if Open.exists? path
|
367
|
+
raise $!
|
362
368
|
rescue Exception
|
363
369
|
Log.medium "Error in persist: #{path}#{Open.exists?(path) ? Log.color(:red, " Erasing") : ""}"
|
364
370
|
|
data/lib/rbbt/tsv/manipulate.rb
CHANGED
@@ -369,13 +369,14 @@ module TSV
|
|
369
369
|
def select(method = nil, invert = false, &block)
|
370
370
|
new = TSV.setup({}, :key_field => key_field, :fields => fields, :type => type, :filename => filename, :identifiers => identifiers)
|
371
371
|
|
372
|
-
new
|
373
|
-
new.
|
374
|
-
new.
|
375
|
-
new.
|
376
|
-
new.
|
377
|
-
new.
|
378
|
-
new.
|
372
|
+
self.annotate(new)
|
373
|
+
#new.key_field = key_field
|
374
|
+
#new.fields = fields.dup unless fields.nil?
|
375
|
+
#new.type = type
|
376
|
+
#new.filename = filename
|
377
|
+
#new.namespace = namespace
|
378
|
+
#new.entity_options = entity_options
|
379
|
+
#new.entity_templates = entity_templates
|
379
380
|
|
380
381
|
case
|
381
382
|
when (method.nil? and block_given?)
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module TSV
|
2
|
+
def marshal_dump
|
3
|
+
if defined?(Persist::TCAdapter) && Persist::TCAdapter === self
|
4
|
+
super
|
5
|
+
else
|
6
|
+
[info, to_hash]
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class Hash
|
12
|
+
def marshal_load(array)
|
13
|
+
info, to_hash = array
|
14
|
+
self.merge! to_hash
|
15
|
+
TSV.setup(self)
|
16
|
+
end
|
17
|
+
end
|
data/lib/rbbt/tsv/util.rb
CHANGED
@@ -388,9 +388,6 @@ module TSV
|
|
388
388
|
new
|
389
389
|
end
|
390
390
|
|
391
|
-
def marshal_dump
|
392
|
-
[info, to_hash]
|
393
|
-
end
|
394
391
|
|
395
392
|
def to_onehot(boolean = false)
|
396
393
|
all_values = values.flatten.uniq.collect{|v| v.to_s}.sort
|
@@ -405,10 +402,3 @@ module TSV
|
|
405
402
|
end
|
406
403
|
end
|
407
404
|
|
408
|
-
class Hash
|
409
|
-
def marshal_load(array)
|
410
|
-
info, to_hash = array
|
411
|
-
self.merge! to_hash
|
412
|
-
TSV.setup(self)
|
413
|
-
end
|
414
|
-
end
|
data/lib/rbbt/tsv.rb
CHANGED
@@ -29,6 +29,10 @@ class RbbtProcessQueue
|
|
29
29
|
|
30
30
|
def dump(obj, stream)
|
31
31
|
case obj
|
32
|
+
when Annotated
|
33
|
+
payload = @serializer.dump(obj)
|
34
|
+
size_head = [payload.bytesize,"S"].pack 'La'
|
35
|
+
str = size_head << payload
|
32
36
|
when String
|
33
37
|
payload = obj
|
34
38
|
size_head = [payload.bytesize,"C"].pack 'La'
|
@@ -90,7 +94,7 @@ class RbbtProcessQueue
|
|
90
94
|
def push(obj)
|
91
95
|
RbbtSemaphore.synchronize(@write_sem) do
|
92
96
|
multiple = MultipleResult === obj
|
93
|
-
obj = Annotated.purge(obj)
|
97
|
+
#obj = Annotated.purge(obj)
|
94
98
|
obj.extend MultipleResult if multiple
|
95
99
|
self.dump(obj, @swrite)
|
96
100
|
end
|
@@ -413,4 +413,15 @@ def self.add_libdir(dir=nil)
|
|
413
413
|
CMD.cmd("ssh '#{server}' 'shopt -s expand_aliases; bash -l -c \"ruby\"' ", :in => script, :log => true).read
|
414
414
|
end
|
415
415
|
|
416
|
+
def self.timeout_insist(time, msg = nil, &block)
|
417
|
+
Misc.insist do
|
418
|
+
begin
|
419
|
+
Timeout.timeout(time, TryAgain, msg, &block)
|
420
|
+
rescue TryAgain
|
421
|
+
Log.low "Timeout detected after #{time} seconds"
|
422
|
+
raise $!
|
423
|
+
end
|
424
|
+
end
|
425
|
+
end
|
426
|
+
|
416
427
|
end
|
@@ -27,10 +27,11 @@ module Misc
|
|
27
27
|
params.merge!(:format => _format) unless _format.nil? or (params.include?(:format) and not ((f = params[:format]).nil? or (String === f and f.empty?)))
|
28
28
|
|
29
29
|
mod = Entity === field ? field : Entity.formats[field]
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
30
|
+
|
31
|
+
entity = entity.dup
|
32
|
+
entity = (entity.frozen? and not entity.nil?) ? entity.dup : ((Array === entity and dup_array) ? entity.collect{|e| e.nil? ? e : e.dup} : entity)
|
33
|
+
|
34
|
+
entity = mod.setup(entity, params)
|
34
35
|
end
|
35
36
|
|
36
37
|
entity
|
@@ -9,9 +9,19 @@ end
|
|
9
9
|
class TestAnnotation < Test::Unit::TestCase
|
10
10
|
def test_marshal
|
11
11
|
a = "STRING"
|
12
|
-
a.
|
12
|
+
a = TestEntityString.setup(a)
|
13
13
|
|
14
|
-
assert !(Annotated === Marshal.load(Marshal.dump(a)))
|
14
|
+
#assert !(Annotated === Marshal.load(Marshal.dump(a)))
|
15
|
+
assert_equal a, Marshal.load(Marshal.dump(a))
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_marshal_array
|
19
|
+
a = ["STRING"]
|
20
|
+
TestEntityString.setup(a)
|
21
|
+
|
22
|
+
#assert !(Annotated === Marshal.load(Marshal.dump(a)))
|
23
|
+
assert Annotated === a
|
24
|
+
assert Annotated === a.first
|
15
25
|
assert_equal a, Marshal.load(Marshal.dump(a))
|
16
26
|
end
|
17
27
|
|
@@ -20,5 +30,14 @@ class TestAnnotation < Test::Unit::TestCase
|
|
20
30
|
assert_equal "TEST", Annotated.to_hash(e)[:literal]
|
21
31
|
assert_equal 10, Annotated.to_hash(e)[:info][:code]
|
22
32
|
end
|
33
|
+
|
34
|
+
def test_traverse_cpus
|
35
|
+
strings = (1..10).to_a.collect{|n| n.to_s }
|
36
|
+
res = TSV.traverse strings, :cpus => 2, :into => [] do |s|
|
37
|
+
TestEntityString.setup(s, :code => s.to_i)
|
38
|
+
end
|
39
|
+
|
40
|
+
assert TestEntityString === res.first
|
41
|
+
end
|
23
42
|
end
|
24
43
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
|
2
|
+
require 'rbbt/tsv'
|
3
|
+
require 'rbbt/tsv/marshal'
|
4
|
+
require 'rbbt/util/tmpfile'
|
5
|
+
require 'test/unit'
|
6
|
+
|
7
|
+
class TestTSVUtil < Test::Unit::TestCase
|
8
|
+
|
9
|
+
def test_marshal
|
10
|
+
content =<<-EOF
|
11
|
+
#Id ValueA ValueB OtherID
|
12
|
+
row1 a|aa|aaa b Id1|Id2
|
13
|
+
row2 A B Id3
|
14
|
+
EOF
|
15
|
+
|
16
|
+
TmpFile.with_file(content) do |filename|
|
17
|
+
tsv = TSV.open(filename, :sep => /\s+/)
|
18
|
+
|
19
|
+
assert TSV === Marshal.load(Marshal.dump(tsv))
|
20
|
+
assert_equal tsv.to_hash, Marshal.load(Marshal.dump(tsv)).to_hash
|
21
|
+
assert_equal({1 => 1}, Marshal.load(Marshal.dump({1 => 1})))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/test/rbbt/tsv/test_util.rb
CHANGED
@@ -21,22 +21,6 @@ row2 A B Id3
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
def test_marshal
|
25
|
-
content =<<-EOF
|
26
|
-
#Id ValueA ValueB OtherID
|
27
|
-
row1 a|aa|aaa b Id1|Id2
|
28
|
-
row2 A B Id3
|
29
|
-
EOF
|
30
|
-
|
31
|
-
TmpFile.with_file(content) do |filename|
|
32
|
-
tsv = TSV.open(filename, :sep => /\s+/)
|
33
|
-
|
34
|
-
assert TSV === Marshal.load(Marshal.dump(tsv))
|
35
|
-
assert_equal tsv.to_hash, Marshal.load(Marshal.dump(tsv)).to_hash
|
36
|
-
assert_equal({1 => 1}, Marshal.load(Marshal.dump({1 => 1})))
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
24
|
def test_replicates
|
41
25
|
content =<<-EOF
|
42
26
|
#Id ValueA ValueB OtherID
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbbt-util
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.34.
|
4
|
+
version: 5.34.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miguel Vazquez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-08-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -255,6 +255,7 @@ files:
|
|
255
255
|
- lib/rbbt/persist/tsv/packed_index.rb
|
256
256
|
- lib/rbbt/persist/tsv/sharder.rb
|
257
257
|
- lib/rbbt/persist/tsv/tokyocabinet.rb
|
258
|
+
- lib/rbbt/persist/tsv/tokyocabinet/marshal.rb
|
258
259
|
- lib/rbbt/resource.rb
|
259
260
|
- lib/rbbt/resource/path.rb
|
260
261
|
- lib/rbbt/resource/rake.rb
|
@@ -272,6 +273,7 @@ files:
|
|
272
273
|
- lib/rbbt/tsv/filter.rb
|
273
274
|
- lib/rbbt/tsv/index.rb
|
274
275
|
- lib/rbbt/tsv/manipulate.rb
|
276
|
+
- lib/rbbt/tsv/marshal.rb
|
275
277
|
- lib/rbbt/tsv/matrix.rb
|
276
278
|
- lib/rbbt/tsv/melt.rb
|
277
279
|
- lib/rbbt/tsv/parallel.rb
|
@@ -536,6 +538,7 @@ files:
|
|
536
538
|
- test/rbbt/tsv/test_filter.rb
|
537
539
|
- test/rbbt/tsv/test_index.rb
|
538
540
|
- test/rbbt/tsv/test_manipulate.rb
|
541
|
+
- test/rbbt/tsv/test_marshal.rb
|
539
542
|
- test/rbbt/tsv/test_matrix.rb
|
540
543
|
- test/rbbt/tsv/test_parallel.rb
|
541
544
|
- test/rbbt/tsv/test_parser.rb
|
@@ -667,6 +670,7 @@ test_files:
|
|
667
670
|
- test/rbbt/tsv/test_change_id.rb
|
668
671
|
- test/rbbt/tsv/test_attach.rb
|
669
672
|
- test/rbbt/tsv/test_filter.rb
|
673
|
+
- test/rbbt/tsv/test_marshal.rb
|
670
674
|
- test/rbbt/tsv/test_parser.rb
|
671
675
|
- test/rbbt/tsv/test_csv.rb
|
672
676
|
- test/rbbt/tsv/test_accessor.rb
|