bindata 2.4.10 → 2.4.11
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/ChangeLog.rdoc +4 -0
- data/lib/bindata/delayed_io.rb +18 -0
- data/lib/bindata/version.rb +1 -1
- data/test/delayed_io_test.rb +45 -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: a8da7873dc256b291c991e6577d886a78ba27b347b6ef03dd55b7d23ae797611
|
4
|
+
data.tar.gz: c44844d397e1d1c8a332c99bc16f18a64a979f8251ce3dc2e71246882e40f10c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 391299bd3e2f04892a42b1fffabd7e494872f4085d2bef50f6e37b267a7e496ecd61081cd838550d87e5702dcefc8ed63c76446fa72ba02a52e1b60cb13a941a
|
7
|
+
data.tar.gz: ebf86b0c30ceea48215d9beaa39706c9fed31b2b1da788b2c9ddaf1d861ac4ff33a27b7a3211d6e097e077da8625ef6ad2d21a40a6dc9232bc88ec8ad39a0143
|
data/ChangeLog.rdoc
CHANGED
data/lib/bindata/delayed_io.rb
CHANGED
@@ -116,9 +116,25 @@ module BinData
|
|
116
116
|
0
|
117
117
|
end
|
118
118
|
|
119
|
+
def eval_parameter_with_delayed_io(key, overrides = nil)
|
120
|
+
result = eval_parameter_without_delayed_io(key, overrides)
|
121
|
+
|
122
|
+
# Delay processing :onlyif until we do the actual read/write
|
123
|
+
result = true if key == :onlyif && ! result
|
124
|
+
|
125
|
+
result
|
126
|
+
end
|
127
|
+
alias_method :eval_parameter_without_delayed_io, :eval_parameter
|
128
|
+
alias_method :eval_parameter, :eval_parameter_with_delayed_io
|
129
|
+
|
130
|
+
def include_obj?
|
131
|
+
! has_parameter?(:onlyif) || eval_parameter_without_delayed_io(:onlyif)
|
132
|
+
end
|
133
|
+
|
119
134
|
# DelayedIO objects aren't read when #read is called.
|
120
135
|
# The reading is delayed until this method is called.
|
121
136
|
def read_now!
|
137
|
+
return unless include_obj?
|
122
138
|
raise IOError, "read from where?" unless @read_io
|
123
139
|
|
124
140
|
@read_io.seekbytes(abs_offset - @read_io.offset)
|
@@ -130,7 +146,9 @@ module BinData
|
|
130
146
|
# DelayedIO objects aren't written when #write is called.
|
131
147
|
# The writing is delayed until this method is called.
|
132
148
|
def write_now!
|
149
|
+
return unless include_obj?
|
133
150
|
raise IOError, "write to where?" unless @write_io
|
151
|
+
|
134
152
|
@write_io.seekbytes(abs_offset - @write_io.offset)
|
135
153
|
@type.do_write(@write_io)
|
136
154
|
end
|
data/lib/bindata/version.rb
CHANGED
data/test/delayed_io_test.rb
CHANGED
@@ -184,6 +184,51 @@ describe BinData::DelayedIO, "inside a Record" do
|
|
184
184
|
end
|
185
185
|
end
|
186
186
|
|
187
|
+
describe BinData::DelayedIO, "inside a Record with onlyif" do
|
188
|
+
class DelayedIOOnlyIfRecord < BinData::Record
|
189
|
+
endian :little
|
190
|
+
|
191
|
+
uint8 :flag
|
192
|
+
delayed_io :my_int1, read_abs_offset: 4, onlyif: -> { flag != 0 } do
|
193
|
+
uint16 initial_value: 6
|
194
|
+
end
|
195
|
+
delayed_io :my_int2, read_abs_offset: 2, onlyif: -> { flag == 0 } do
|
196
|
+
uint16 initial_value: 7
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
it "reads" do
|
201
|
+
obj = DelayedIOOnlyIfRecord.read "\x01\x00\x03\x0012345"
|
202
|
+
obj.num_bytes.must_equal 1
|
203
|
+
obj.snapshot.must_equal({flag: 1, my_int1: 6, my_int2: 7})
|
204
|
+
end
|
205
|
+
|
206
|
+
it "reads explicitly when flag is set" do
|
207
|
+
obj = DelayedIOOnlyIfRecord.read "\x01\xff\x01\x00\x02\x00"
|
208
|
+
obj.my_int1.read_now!
|
209
|
+
obj.my_int2.read_now!
|
210
|
+
obj.num_bytes.must_equal 1
|
211
|
+
obj.snapshot.must_equal({flag: 1, my_int1: 2, my_int2: 7})
|
212
|
+
end
|
213
|
+
|
214
|
+
it "reads explicitly when flag is not set" do
|
215
|
+
obj = DelayedIOOnlyIfRecord.read "\x00\xff\x01\x00\x02\x00"
|
216
|
+
obj.my_int1.read_now!
|
217
|
+
obj.my_int2.read_now!
|
218
|
+
obj.num_bytes.must_equal 1
|
219
|
+
obj.snapshot.must_equal({flag: 0, my_int1: 6, my_int2: 1})
|
220
|
+
end
|
221
|
+
|
222
|
+
it "writes" do
|
223
|
+
obj = DelayedIOOnlyIfRecord.new(flag:1, my_int1: 3, my_int2: 4)
|
224
|
+
io = StringIO.new
|
225
|
+
obj.write(io)
|
226
|
+
obj.my_int1.write_now!
|
227
|
+
obj.my_int2.write_now!
|
228
|
+
io.value.must_equal "\x01\x00\x00\x00\x03\x00"
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
187
232
|
describe BinData::DelayedIO, "with auto_call" do
|
188
233
|
class AutoCallDelayedIORecord < BinData::Record
|
189
234
|
auto_call_delayed_io
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bindata
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.4.
|
4
|
+
version: 2.4.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dion Mendel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-09-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|