bindata 2.4.10 → 2.4.11
Sign up to get free protection for your applications and to get access to all the features.
- 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
|