binaryparse 0.2.7 → 0.3.3
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.
- data/lib/blocker.rb +60 -4
- data/test/test_blocker.rb +60 -0
- metadata +2 -2
data/lib/blocker.rb
CHANGED
@@ -325,7 +325,7 @@ module BinaryBlocker
|
|
325
325
|
if o.respond_to? :to_hash
|
326
326
|
o.keys.each do |key|
|
327
327
|
if pos = @lookup[key.to_sym]
|
328
|
-
unless @value[pos].key_value?
|
328
|
+
unless @value[pos].respond_to?(:key_value?) && @value[pos].key_value?
|
329
329
|
@value[pos].value = o[key]
|
330
330
|
end
|
331
331
|
end
|
@@ -333,6 +333,19 @@ module BinaryBlocker
|
|
333
333
|
end
|
334
334
|
end
|
335
335
|
end
|
336
|
+
|
337
|
+
alias :orig_clone :clone
|
338
|
+
def clone
|
339
|
+
new_me = orig_clone
|
340
|
+
new_val = self.class.attributes.map { |a| a.call }
|
341
|
+
new_val.each_with_index do |v,i|
|
342
|
+
v.value = @value[i].value
|
343
|
+
end
|
344
|
+
new_me.instance_eval do
|
345
|
+
@value = new_val
|
346
|
+
end
|
347
|
+
new_me
|
348
|
+
end
|
336
349
|
|
337
350
|
def block
|
338
351
|
@value.inject("") do |a,b|
|
@@ -377,7 +390,9 @@ module BinaryBlocker
|
|
377
390
|
end
|
378
391
|
|
379
392
|
def value=(val)
|
380
|
-
|
393
|
+
@lookup.keys.each do |key|
|
394
|
+
@value[@lookup[key]].value = val.send(key)
|
395
|
+
end
|
381
396
|
end
|
382
397
|
|
383
398
|
def valid?
|
@@ -456,7 +471,15 @@ module BinaryBlocker
|
|
456
471
|
|
457
472
|
end
|
458
473
|
BinaryBlocker.register_klass(:string, FixedStringEncoder)
|
459
|
-
|
474
|
+
|
475
|
+
class ByteStringEncoder < FixedStringEncoder
|
476
|
+
def initialize(*opts)
|
477
|
+
super
|
478
|
+
@format = "a#{@length}"
|
479
|
+
end
|
480
|
+
end
|
481
|
+
BinaryBlocker.register_klass(:bytes, ByteStringEncoder)
|
482
|
+
|
460
483
|
class SpacedStringEncoder < SimpleEncoder
|
461
484
|
def initialize(*opts)
|
462
485
|
@value = ''
|
@@ -794,6 +817,35 @@ module BinaryBlocker
|
|
794
817
|
end
|
795
818
|
end
|
796
819
|
|
820
|
+
def to_h
|
821
|
+
result = []
|
822
|
+
@value.each do |value|
|
823
|
+
value = value.to_h if value.respond_to? :to_h
|
824
|
+
result << value
|
825
|
+
end
|
826
|
+
result
|
827
|
+
end
|
828
|
+
|
829
|
+
def clone
|
830
|
+
result = orig_clone
|
831
|
+
end
|
832
|
+
|
833
|
+
def size
|
834
|
+
@count
|
835
|
+
end
|
836
|
+
|
837
|
+
def value
|
838
|
+
self
|
839
|
+
end
|
840
|
+
|
841
|
+
def value=(newval)
|
842
|
+
raise RangeError.new("Array size mismatch") unless newval.size == @count
|
843
|
+
@count.times do |i|
|
844
|
+
@value[i] = newval[i]
|
845
|
+
end
|
846
|
+
newval
|
847
|
+
end
|
848
|
+
|
797
849
|
def [](offset)
|
798
850
|
raise RangeError.new("Access (#{offset}) out of range (#{@count})") unless (0...@count) === offset
|
799
851
|
@value[offset]
|
@@ -813,7 +865,11 @@ module BinaryBlocker
|
|
813
865
|
@value = []
|
814
866
|
initialize_data(*opts)
|
815
867
|
end
|
816
|
-
|
868
|
+
|
869
|
+
def value=(other)
|
870
|
+
@value = other.value.clone
|
871
|
+
end
|
872
|
+
|
817
873
|
def internal_block(val)
|
818
874
|
val.inject("") { |r, o| r + o.block }
|
819
875
|
end
|
data/test/test_blocker.rb
CHANGED
@@ -518,4 +518,64 @@ class TestBlocker < Test::Unit::TestCase
|
|
518
518
|
assert_equal(now, b2.now)
|
519
519
|
end
|
520
520
|
|
521
|
+
def test_clone
|
522
|
+
bb = BBTest1.new
|
523
|
+
bb.foo = 32
|
524
|
+
bb.bar = 24
|
525
|
+
|
526
|
+
assert_equal(32, bb.foo)
|
527
|
+
assert_equal(24, bb.bar)
|
528
|
+
|
529
|
+
b2 = bb.clone
|
530
|
+
assert_equal(32, b2.foo)
|
531
|
+
assert_equal(24, b2.bar)
|
532
|
+
|
533
|
+
b2.foo = 42
|
534
|
+
assert_equal(42, b2.foo)
|
535
|
+
assert_equal(32, bb.foo)
|
536
|
+
end
|
537
|
+
|
538
|
+
def test_clone_some_more
|
539
|
+
bb = BBList.new
|
540
|
+
bb.header = 13
|
541
|
+
bb.footer = 42
|
542
|
+
|
543
|
+
ia = ItemA.new
|
544
|
+
ib = ItemB.new
|
545
|
+
ib.name = 'widget B'
|
546
|
+
bb.items << ia << ib
|
547
|
+
|
548
|
+
b2 = bb.clone
|
549
|
+
assert(13, b2.header)
|
550
|
+
b2.header = 21
|
551
|
+
assert(21, b2.header)
|
552
|
+
assert(13, bb.header)
|
553
|
+
end
|
554
|
+
|
555
|
+
class Nested < BinaryBlocker::Blocker
|
556
|
+
has_one :name, :string, :length => 20
|
557
|
+
end
|
558
|
+
|
559
|
+
class Parent < BinaryBlocker::Blocker
|
560
|
+
has_one :rtype, :string, :length => 10
|
561
|
+
has_one :nest, Nested
|
562
|
+
has_one :footer, :string, :length => 10
|
563
|
+
end
|
564
|
+
|
565
|
+
def test_clone_has_one
|
566
|
+
p = Parent.new
|
567
|
+
p.rtype = 'foo'
|
568
|
+
p.nest.name = 'bar'
|
569
|
+
p.footer = 'end'
|
570
|
+
|
571
|
+
assert_equal('foo', p.rtype)
|
572
|
+
assert_equal('bar', p.nest.name)
|
573
|
+
assert_equal('end', p.footer)
|
574
|
+
|
575
|
+
p2 = p.clone
|
576
|
+
assert_equal('foo', p2.rtype)
|
577
|
+
assert_equal('bar', p2.nest.name)
|
578
|
+
assert_equal('end', p2.footer)
|
579
|
+
|
580
|
+
end
|
521
581
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
|
|
3
3
|
specification_version: 1
|
4
4
|
name: binaryparse
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2006-12-
|
6
|
+
version: 0.3.3
|
7
|
+
date: 2006-12-20 00:00:00 -05:00
|
8
8
|
summary: Binaryparse is a simple Ruby DSL to parse semi-complicated binary structures. This includes structures dynamic in length, which cannot be handled by DL::Struct or BitStructEx.
|
9
9
|
require_paths:
|
10
10
|
- lib
|