bistro 2.1.0 → 2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d3005111ea2c6d80cebb2b9fbb18942b70b8c90d6c785bb1b54a65db01e978fa
4
- data.tar.gz: 62fdd3216e53989c4fcb18b1a8a38c3399b44c2daac249c9cabfcafd4d907415
3
+ metadata.gz: '083a2a52e47ed66b526780f8bcfe4d3cb270a1dde098c496497bd6b5f4b8f774'
4
+ data.tar.gz: 9388db96083be467a06e1e0b8032454f7e26095bf6b8a4594b58b4b01d124b0d
5
5
  SHA512:
6
- metadata.gz: e656723aae47b109c66804e0ec03838193c464b3a4d0377f7691f8ea02f0c783fbfc5e4ad04fcda4bdab88a8012d23f242f25ac688ecab8e86c84406b6a51fd8
7
- data.tar.gz: ae09a95c27537d26b0bfcfa6c418e72cbe95c358ef0e3d10976924ecb0d2c8894341060887427c97fad8b3abcd7b3765bf77f9449a859b11e2a8902090c69761
6
+ metadata.gz: 4efee30bc303d5dd3725f69ffc16d544a1376b314e8d05d9c5aa9d7e2ef82d73aa45112d7f7ed3698bd9be5da2b65ddfc7e1583b7f3757b6e9f5f35a8521476a
7
+ data.tar.gz: 217c4ce2ddbb989d49da962d39d20c720be4c34c4e7fefd3186365661757ae1dab3852b52e13a91fdd85eb48fcf4e5c1b708e616bd42eafa363d5cc1ed90a398
@@ -60,10 +60,13 @@ class Bistro
60
60
  else
61
61
  value = value.to_a.map(&:reverse).flatten if value.kind_of?(Hash)
62
62
  value = Array(value)
63
+
63
64
  self.class.validate_definition(value)
64
65
  @definition = value
65
66
  end
66
- @size = @decode_format = @decode_name = nil
67
+
68
+ @size = @decode_types = @decode_formats =
69
+ @decode_names = @decode_counts = nil
67
70
  end
68
71
 
69
72
  def size
@@ -81,15 +84,27 @@ class Bistro
81
84
 
82
85
  def decode_to_array(data, num = 1)
83
86
  raise ArgumentError, "data cannot be nil" if data.nil?
84
- @decode_format, @decode_names = self.class.prep_decode(@definition) if @decode_format.nil?
85
- format = (num == 1) ? @decode_format : @decode_format * num
87
+ @decode_types, @decode_formats,
88
+ @decode_names, @decode_counts =
89
+ self.class.prep_decode(@definition) if @decode_formats.nil?
90
+
91
+ format = (num == 1) ? @decode_formats : @decode_formats * num
86
92
  return data.unpack(format)
87
93
  end
88
94
 
89
95
  def decoded_array_to_hash!(array)
90
96
  hash = {}
91
- @decode_names.each do |k|
92
- v = array.shift
97
+ @decode_names.each_with_index do |k,i|
98
+ c = @decode_counts[i].to_i
99
+ t = @decode_types[i]
100
+
101
+ v = nil
102
+ if !STRING_FORMATS.include?(t) && c != 1
103
+ v = 0.upto(c-1).collect { array.shift }
104
+ else
105
+ v = array.shift
106
+ end
107
+
93
108
  next if k.nil?
94
109
  hash[k] = v
95
110
  end
@@ -107,12 +122,15 @@ class Bistro
107
122
  def encode_hash(hash)
108
123
  data = ""
109
124
  @definition.each_slice(2) do |format, name|
110
- raise "member not found: #{name}" unless name.nil? || hash.has_key?(name)
125
+ raise "member not found: #{name}" unless name.nil? ||
126
+ hash.has_key?(name)
127
+
111
128
  value = unless name.nil?
112
129
  hash[name]
113
130
  else
114
131
  STRING_FORMATS.include?(format[0, 1]) ? '0' : 0
115
132
  end
133
+
116
134
  data << [value].pack(format)
117
135
  end
118
136
  return data
@@ -151,14 +169,19 @@ class Bistro
151
169
  private
152
170
 
153
171
  def self.struct_by_definition(definition)
154
- @@structs_by_definition[definition] ||= definition.kind_of?(self) ? definition : self.new(definition)
172
+ @@structs_by_definition[definition] ||= definition.kind_of?(self) ?
173
+ definition :
174
+ self.new(definition)
155
175
  end
156
176
 
157
177
  def self.validate_definition(definition)
158
- raise "definition must be an array of format/name pairs" if definition.empty? || definition.length % 2 != 0
178
+ raise "definition must be an array of format/name pairs" if definition.empty? ||
179
+ definition.length % 2 != 0
180
+
159
181
  definition.each_slice(2) do |format, _|
160
- type, count = format[0, 1], format[1..-1]
161
- modifier, modcount = count[0, 1], count[1..-1]
182
+ type, count = format[0, 1], format[1..-1]
183
+ modifier, modcount = count[0, 1], count[1..-1]
184
+
162
185
  validate_definition_entry_type(type)
163
186
  if valid_definition_entry_modifier?(modifier)
164
187
  validate_definition_endian_modifier(modifier, type)
@@ -171,7 +194,7 @@ class Bistro
171
194
 
172
195
  def self.validate_definition_entry_type(type)
173
196
  raise "unrecognized format: #{type}" unless SIZES.has_key?(type)
174
- raise "unsupported format: #{type}" if SIZES[type].nil?
197
+ raise "unsupported format: #{type}" if SIZES[type].nil?
175
198
  return true
176
199
  end
177
200
 
@@ -192,7 +215,8 @@ class Bistro
192
215
 
193
216
  def self.validate_definition_endian_modifier(modifier, type)
194
217
  if ENDIAN_MODIFIERS.include? modifier
195
- raise "unsupported type attribute #{type} for endian modifier #{modifier}" unless ENDIAN_FORMATS.include? type
218
+ raise "unsupported type attribute #{type} "\
219
+ "for endian modifier #{modifier}" unless ENDIAN_FORMATS.include? type
196
220
  return true
197
221
  end
198
222
  false
@@ -200,11 +224,13 @@ class Bistro
200
224
 
201
225
  def self.get_size(definition)
202
226
  size = 0
227
+
203
228
  definition.each_slice(2) do |format, _|
204
- type, count = format[0, 1], format[1..-1]
205
- modifier, modcount = count[0, 1], count[1..-1]
229
+ type, count = format[0, 1], format[1..-1]
230
+ modifier, modcount = count[0, 1], count[1..-1]
206
231
  count = modcount if valid_definition_entry_modifier?(modifier)
207
232
  count = count.empty? ? 1 : count.to_i
233
+
208
234
  size +=
209
235
  if BIT_FORMATS.include?(type)
210
236
  (count / 8.0).ceil
@@ -214,16 +240,28 @@ class Bistro
214
240
  count * SIZES[type]
215
241
  end
216
242
  end
243
+
217
244
  size
218
245
  end
219
246
 
220
247
  def self.prep_decode(definition)
221
248
  formats = ""
222
- names = []
249
+ types = []
250
+ names = []
251
+ counts = []
252
+
223
253
  definition.each_slice(2) do |format, name|
254
+ type, count = format[0, 1], format[1..-1]
255
+ modifier, modcount = count[0, 1], count[1..-1]
256
+ count = modcount if valid_definition_entry_modifier?(modifier)
257
+ count = 1 if count.empty?
258
+
259
+ types << type
224
260
  formats << format
225
- names << name
261
+ names << name
262
+ counts << count
226
263
  end
227
- return formats, names
264
+
265
+ return types, formats, names, counts
228
266
  end
229
267
  end
@@ -1,3 +1,3 @@
1
1
  class Bistro
2
- VERSION = "2.1.0"
2
+ VERSION = "2.2.0"
3
3
  end
@@ -0,0 +1,29 @@
1
+ describe Bistro do
2
+ ACCUM_STRUCT_DEF = [
3
+ 'C', 'first',
4
+ 'C2', 'second',
5
+ 'H', 'third',
6
+ 'H2', 'fourth',
7
+ 'b', 'fifth',
8
+ 'b2', 'sixth',
9
+ 'i', 'seventh',
10
+ 'i2', 'eighth',
11
+ ]
12
+
13
+ ACCUM_STRUCT_ENCODED_STR = "\0\1\2\3\4\5\6\7\8\9\0\1\2\3\4\5\6\7\8\9\0\1\2\3\4\5\6\7\8\9\0"
14
+
15
+ ACCUM_STRUCT_DECODED_HASH = {
16
+ "first"=>0,
17
+ "second"=>[1, 2],
18
+ "third"=>"0",
19
+ "fourth"=>"04",
20
+ "fifth"=>"1",
21
+ "sixth"=>"01",
22
+ "seventh"=>3749895,
23
+ "eighth"=>[67305985, 939984389]
24
+ }
25
+
26
+ it "accumulates numerical values" do
27
+ expect(Bistro.new(ACCUM_STRUCT_DEF).decode(ACCUM_STRUCT_ENCODED_STR)).to eq(ACCUM_STRUCT_DECODED_HASH)
28
+ end
29
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bistro
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dev Null Productions
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-16 00:00:00.000000000 Z
11
+ date: 2019-04-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -64,6 +64,7 @@ files:
64
64
  - README.md
65
65
  - lib/bistro.rb
66
66
  - lib/bistro/version.rb
67
+ - spec/accum_spec.rb
67
68
  - spec/bistro_spec.rb
68
69
  - spec/data/test.gif
69
70
  - spec/endian_spec.rb
@@ -94,6 +95,7 @@ signing_key:
94
95
  specification_version: 4
95
96
  summary: Bistro is a class for dealing with BInary STRuctured data.
96
97
  test_files:
98
+ - spec/accum_spec.rb
97
99
  - spec/bistro_spec.rb
98
100
  - spec/data/test.gif
99
101
  - spec/endian_spec.rb