iostruct 0.1.3 → 0.2.0
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/iostruct/version.rb +1 -1
 - data/lib/iostruct.rb +16 -8
 - data/spec/iostruct_spec.rb +14 -0
 - metadata +2 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 7b5299fc722f0b62051802a5ec32ac37de25c48b92a5899a77da7494aa6dfa73
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: dd50d4aa68a79fded59a6720867bea0b4961ca7513d79cf124bda6ad9d5e40fc
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: b3434b61ba2cac8b9465a91da45d7dd5ee5aadd5eeaba77c3d115a564b7dbb31ecdb37e579bd3b41132af5eff42ad687c12ebf4d69da5a4015e23fa317e5b133
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 852776b5bbaacf3ac4107a9755879ca986841e7d415bc16310e7ee6f565b6335b58c2d0730fd5de20ecde7843abe64c30c898855bb48e918e8bd7f83b527b5a0
         
     | 
    
        data/lib/iostruct/version.rb
    CHANGED
    
    
    
        data/lib/iostruct.rb
    CHANGED
    
    | 
         @@ -23,6 +23,9 @@ module IOStruct 
     | 
|
| 
       23 
23 
     | 
    
         | 
| 
       24 
24 
     | 
    
         
             
                'A' => [1, String  ], # arbitrary binary string (remove trailing nulls and ASCII spaces)
         
     | 
| 
       25 
25 
     | 
    
         
             
                'a' => [1, String  ], # arbitrary binary string
         
     | 
| 
      
 26 
     | 
    
         
            +
                'Z' => [1, String  ], # arbitrary binary string (remove trailing nulls)
         
     | 
| 
      
 27 
     | 
    
         
            +
                'H' => [1, String  ], # hex string (high nibble first)
         
     | 
| 
      
 28 
     | 
    
         
            +
                'h' => [1, String  ], # hex string (low nibble first)
         
     | 
| 
       26 
29 
     | 
    
         | 
| 
       27 
30 
     | 
    
         
             
                'D' => [8, Float   ], # double-precision, native format
         
     | 
| 
       28 
31 
     | 
    
         
             
                'd' => [8, Float   ],
         
     | 
| 
         @@ -38,9 +41,10 @@ module IOStruct 
     | 
|
| 
       38 
41 
     | 
    
         | 
| 
       39 
42 
     | 
    
         
             
              FieldInfo = Struct.new :type, :size, :offset
         
     | 
| 
       40 
43 
     | 
    
         | 
| 
       41 
     | 
    
         
            -
              def self.new fmt, *names, inspect: :hex
         
     | 
| 
      
 44 
     | 
    
         
            +
              def self.new fmt, *names, inspect: :hex, **renames
         
     | 
| 
       42 
45 
     | 
    
         
             
                fields, size = parse_format(fmt, names)
         
     | 
| 
       43 
     | 
    
         
            -
                names 
     | 
| 
      
 46 
     | 
    
         
            +
                names = auto_names(fields, size) if names.empty?
         
     | 
| 
      
 47 
     | 
    
         
            +
                names.map!{ |n| renames[n] || n } if renames.any?
         
     | 
| 
       44 
48 
     | 
    
         | 
| 
       45 
49 
     | 
    
         
             
                Struct.new( *names ).tap do |x|
         
     | 
| 
       46 
50 
     | 
    
         
             
                  x.const_set 'FIELDS', names.zip(fields).to_h
         
     | 
| 
         @@ -59,9 +63,13 @@ module IOStruct 
     | 
|
| 
       59 
63 
     | 
    
         
             
                  size, klass = FMTSPEC[type] || raise("Unknown field type #{type.inspect}")
         
     | 
| 
       60 
64 
     | 
    
         
             
                  len = len.empty? ? 1 : len.to_i
         
     | 
| 
       61 
65 
     | 
    
         
             
                  case type
         
     | 
| 
       62 
     | 
    
         
            -
                  when 'A', 'a', 'x'
         
     | 
| 
      
 66 
     | 
    
         
            +
                  when 'A', 'a', 'x', 'Z'
         
     | 
| 
       63 
67 
     | 
    
         
             
                    fields << FieldInfo.new(klass, size*len, offset) if klass
         
     | 
| 
       64 
68 
     | 
    
         
             
                    offset += len
         
     | 
| 
      
 69 
     | 
    
         
            +
                  when 'H', 'h'
         
     | 
| 
      
 70 
     | 
    
         
            +
                    # XXX ruby's String#unpack length for hex strings is in characters, not bytes, i.e. "x".unpack("H2") => ["78"]
         
     | 
| 
      
 71 
     | 
    
         
            +
                    fields << FieldInfo.new(klass, size*len/2, offset) if klass
         
     | 
| 
      
 72 
     | 
    
         
            +
                    offset += len/2
         
     | 
| 
       65 
73 
     | 
    
         
             
                  else
         
     | 
| 
       66 
74 
     | 
    
         
             
                    len.times do |i|
         
     | 
| 
       67 
75 
     | 
    
         
             
                      fields << FieldInfo.new(klass, size, offset)
         
     | 
| 
         @@ -95,9 +103,9 @@ module IOStruct 
     | 
|
| 
       95 
103 
     | 
    
         
             
                    else
         
     | 
| 
       96 
104 
     | 
    
         
             
                      raise "[?] don't know how to read from #{src.inspect}"
         
     | 
| 
       97 
105 
     | 
    
         
             
                    end
         
     | 
| 
       98 
     | 
    
         
            -
                  if data.size < size
         
     | 
| 
       99 
     | 
    
         
            -
                    $stderr.puts "[!] #{self.to_s} want #{size} bytes, got #{data.size}"
         
     | 
| 
       100 
     | 
    
         
            -
                  end
         
     | 
| 
      
 106 
     | 
    
         
            +
            #      if data.size < size
         
     | 
| 
      
 107 
     | 
    
         
            +
            #        $stderr.puts "[!] #{self.to_s} want #{size} bytes, got #{data.size}"
         
     | 
| 
      
 108 
     | 
    
         
            +
            #      end
         
     | 
| 
       101 
109 
     | 
    
         
             
                  new(*data.unpack(const_get('FORMAT')))
         
     | 
| 
       102 
110 
     | 
    
         
             
                end
         
     | 
| 
       103 
111 
     | 
    
         
             
              end # ClassMethods
         
     | 
| 
         @@ -130,7 +138,7 @@ module IOStruct 
     | 
|
| 
       130 
138 
     | 
    
         | 
| 
       131 
139 
     | 
    
         
             
              module HexInspect
         
     | 
| 
       132 
140 
     | 
    
         
             
                def to_s
         
     | 
| 
       133 
     | 
    
         
            -
                   
     | 
| 
      
 141 
     | 
    
         
            +
                  "<#{self.class.to_s} " + to_h.map do |k, v|
         
     | 
| 
       134 
142 
     | 
    
         
             
                    if v.is_a?(Integer) && v > 9
         
     | 
| 
       135 
143 
     | 
    
         
             
                      "#{k}=0x%x" % v
         
     | 
| 
       136 
144 
     | 
    
         
             
                    else
         
     | 
| 
         @@ -152,7 +160,7 @@ module IOStruct 
     | 
|
| 
       152 
160 
     | 
    
         
             
                      end
         
     | 
| 
       153 
161 
     | 
    
         
             
                    "#{name}=#{fmt}"
         
     | 
| 
       154 
162 
     | 
    
         
             
                  end.join(' ') + ">"
         
     | 
| 
       155 
     | 
    
         
            -
                  sprintf @fmtstr_tbl, *to_a.map{ |v| v.is_a?(String) ? v.inspect : v }
         
     | 
| 
      
 163 
     | 
    
         
            +
                  sprintf @fmtstr_tbl, *to_a.map{ |v| v.is_a?(String) ? v.inspect : (v||0) } # "||0" to avoid "`sprintf': can't convert nil into Integer" error
         
     | 
| 
       156 
164 
     | 
    
         
             
                end
         
     | 
| 
       157 
165 
     | 
    
         | 
| 
       158 
166 
     | 
    
         
             
                def inspect
         
     | 
    
        data/spec/iostruct_spec.rb
    CHANGED
    
    | 
         @@ -59,6 +59,20 @@ describe IOStruct do 
     | 
|
| 
       59 
59 
     | 
    
         
             
                expect(x.y).to eq a[1]
         
     | 
| 
       60 
60 
     | 
    
         
             
              end
         
     | 
| 
       61 
61 
     | 
    
         | 
| 
      
 62 
     | 
    
         
            +
              it "unpacks hex-string (H)" do
         
     | 
| 
      
 63 
     | 
    
         
            +
                data = "1234"
         
     | 
| 
      
 64 
     | 
    
         
            +
                struct = IOStruct.new('H8', :x).read(data)
         
     | 
| 
      
 65 
     | 
    
         
            +
                expect(struct.x).to eq "31323334"
         
     | 
| 
      
 66 
     | 
    
         
            +
                expect(struct.pack).to eq data
         
     | 
| 
      
 67 
     | 
    
         
            +
              end
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
              it "unpacks reverse-nibbled hex-string (h)" do
         
     | 
| 
      
 70 
     | 
    
         
            +
                data = "1234"
         
     | 
| 
      
 71 
     | 
    
         
            +
                struct = IOStruct.new('h8', :x).read(data)
         
     | 
| 
      
 72 
     | 
    
         
            +
                expect(struct.x).to eq "13233343"
         
     | 
| 
      
 73 
     | 
    
         
            +
                expect(struct.pack).to eq data
         
     | 
| 
      
 74 
     | 
    
         
            +
              end
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
       62 
76 
     | 
    
         
             
              ['n', 'N', 'S>', 'L>', 'I>'].each do |fmt|
         
     | 
| 
       63 
77 
     | 
    
         
             
                it "unpacks unsigned big-endian '#{fmt}'" do
         
     | 
| 
       64 
78 
     | 
    
         
             
                  a = [12345]
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: iostruct
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.2.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Andrey "Zed" Zaikin
         
     | 
| 
         @@ -89,7 +89,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       89 
89 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       90 
90 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       91 
91 
     | 
    
         
             
            requirements: []
         
     | 
| 
       92 
     | 
    
         
            -
            rubygems_version: 3.5. 
     | 
| 
      
 92 
     | 
    
         
            +
            rubygems_version: 3.5.11
         
     | 
| 
       93 
93 
     | 
    
         
             
            signing_key:
         
     | 
| 
       94 
94 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       95 
95 
     | 
    
         
             
            summary: A Struct that can read/write itself from/to IO-like objects
         
     |