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