binaryparse 0.2.7 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/lib/blocker.rb +60 -4
  2. data/test/test_blocker.rb +60 -0
  3. 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
- raise "Now what?"
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.2.7
7
- date: 2006-12-13 00:00:00 -05:00
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