bindata 2.4.3 → 2.4.8

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of bindata might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dd9ce2f3336fc2e9f8e3250a278732351d6a1af220603fb62763b3ef83caaf5e
4
- data.tar.gz: f8f15a3836564c6a51891231a276ed0848cc92bdb4663c5aca6d4eecd0f53ec4
3
+ metadata.gz: 930073ad9a50e67aa2d584a17c0138f3cb4008e4bd96851ceef305e16c7cadd2
4
+ data.tar.gz: ec59bb6fcff33192da1ee33952c69e1069c214c0f41f9b21786694ed7fa4c87c
5
5
  SHA512:
6
- metadata.gz: 5abcc6829c6b6ea410bc3c542d4b60d40a83e6ac883bb3a4b09dfefdc1e5a4ae1d37307d75e53cbbc1593a17dd327269974835a6f0936f2ab21f66fe69f120ba
7
- data.tar.gz: ba8d7abcaac0ceb95acb6ffa8b24b7253495241fbd483ef887103a63d5c65c9649954a1998a70289e64823d0fb85bef1ba22a5bfb126b1cae9708a7412658220
6
+ metadata.gz: c2ebc4a2e56294d7b503d73cfee08fa165c37b96a4216e6ac17206b2566d3b5ea77adb188b819a8e63bf1a059ab79d068d1def5059d7b2b6811609f099a3656f
7
+ data.tar.gz: 96c38802d6197001dfbfb76a4a338bcc7dbf2e8f7ec685b5007cdc6a8917b502ad8bc1ca106323a52f3555cada27f1b90ba204a5c72253447983026af020c27f
@@ -1,9 +1,11 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.0
4
- - 2.1.10
5
3
  - 2.2
6
4
  - 2.3
5
+ - 2.4
6
+ - 2.5
7
+ - 2.6
8
+ - 2.7
7
9
  - jruby
8
10
  - ruby-head
9
11
 
@@ -1,5 +1,30 @@
1
1
  = BinData Changelog
2
2
 
3
+ == Version 2.4.8 (2020-07-21)
4
+
5
+ * Bug fix array self assignment. Thanks to Spencer McIntyre.
6
+ * Bug fix Stringz max_length. Thanks to cdelafuente-r7.
7
+
8
+ == Version 2.4.7 (2020-03-31)
9
+
10
+ * Fix choice assignment inside arrays. Reported by Spencer McIntyre.
11
+
12
+ == Version 2.4.6 (2020-02-27)
13
+
14
+ * More encoding fixes. Thanks to Aaron Patterson.
15
+
16
+ == Version 2.4.5 (2020-02-21)
17
+
18
+ * Small typo fixes to examples.
19
+ * Fix encoding issue for ruby 2.7. Thanks to Aaron Patterson.
20
+ * Quieter test output.
21
+
22
+ == Version 2.4.4 (2018-10-03)
23
+
24
+ * Display a hint when endian is omitted. Requested by Tails.
25
+ * Add thread safety to Integer/BitField creation. Requested by jbpeirce.
26
+ * Ensure windows sockets are unseekable. Thanks to Brent Cook.
27
+
3
28
  == Version 2.4.3 (2018-03-10)
4
29
 
5
30
  * Add Uint8Arrays. Requested by masarakki.
data/README.md CHANGED
@@ -2,7 +2,6 @@
2
2
 
3
3
  [![Version ](http://img.shields.io/gem/v/bindata.svg) ](https://rubygems.org/gems/bindata)
4
4
  [![Travis CI ](http://img.shields.io/travis/dmendel/bindata/master.svg) ](https://travis-ci.org/dmendel/bindata)
5
- [![Quality ](http://img.shields.io/codeclimate/github/dmendel/bindata.svg)](https://codeclimate.com/github/dmendel/bindata)
6
5
  [![Coverage ](http://img.shields.io/coveralls/dmendel/bindata.svg) ](https://coveralls.io/r/dmendel/bindata)
7
6
 
8
7
  Do you ever find yourself writing code like this?
@@ -9,16 +9,14 @@ Gem::Specification.new do |s|
9
9
  s.author = 'Dion Mendel'
10
10
  s.email = 'bindata@dm9.info'
11
11
  s.homepage = 'http://github.com/dmendel/bindata'
12
- s.rubyforge_project = 'bindata'
13
12
  s.require_path = 'lib'
14
- s.has_rdoc = true
15
13
  s.extra_rdoc_files = ['NEWS.rdoc']
16
14
  s.rdoc_options << '--main' << 'NEWS.rdoc'
17
15
  s.files = `git ls-files`.split("\n")
18
16
  s.license = 'Ruby'
19
17
 
20
18
  s.add_development_dependency('rake')
21
- s.add_development_dependency('minitest', "> 5.0.0")
19
+ s.add_development_dependency('minitest', "> 5.0.0", "< 5.12.0")
22
20
  s.add_development_dependency('coveralls')
23
21
  s.description = <<-END.gsub(/^ +/, "")
24
22
  BinData is a declarative way to read and write binary file formats.
@@ -14,7 +14,7 @@ class MacAddr < BinData::Primitive
14
14
  array :octets, type: :uint8, initial_length: 6
15
15
 
16
16
  def set(val)
17
- self.octets = val.split(/\./).collect(&:to_i)
17
+ self.octets = val.split(/:/).collect(&:to_i)
18
18
  end
19
19
 
20
20
  def get
@@ -23,7 +23,7 @@ class MacAddr < BinData::Primitive
23
23
  end
24
24
 
25
25
  # Present IP addresses in a human readable way
26
- class IPAddr < BinData::Primitive
26
+ class IP_Addr < BinData::Primitive
27
27
  array :octets, type: :uint8, initial_length: 4
28
28
 
29
29
  def set(val)
@@ -1,13 +1,5 @@
1
1
  # BinData -- Binary data manipulator.
2
- # Copyright (c) 2007 - 2016 Dion Mendel.
3
-
4
- if RUBY_VERSION <= "1.9"
5
- fail "BinData requires ruby >= 1.9.3. Use BinData version 1.8.x instead"
6
- end
7
-
8
- if RUBY_VERSION == "2.1.0" and RUBY_PATCHLEVEL == "0"
9
- fail "Ruby 2.1.0p0 has a bug that causes BinData to fail. Upgrade your ruby version"
10
- end
2
+ # Copyright (c) 2007 - 2018 Dion Mendel.
11
3
 
12
4
  require 'bindata/version'
13
5
  require 'bindata/array'
@@ -36,10 +28,10 @@ require 'bindata/warnings'
36
28
  # A declarative way to read and write structured binary data.
37
29
  #
38
30
  # A full reference manual is available online at
39
- # http://bindata.rubyforge.org/manual.html
31
+ # https://github.com/dmendel/bindata/wiki
40
32
  #
41
33
  # == License
42
34
  #
43
35
  # BinData is released under the same license as Ruby.
44
36
  #
45
- # Copyright (c) 2007 - 2016 Dion Mendel.
37
+ # Copyright (c) 2007 - 2018 Dion Mendel.
@@ -80,9 +80,11 @@ module BinData
80
80
  end
81
81
 
82
82
  def assign(array)
83
+ return if self.equal?(array) # prevent self assignment
83
84
  raise ArgumentError, "can't set a nil value for #{debug_name}" if array.nil?
84
85
 
85
- @element_list = to_storage_formats(array.to_ary)
86
+ @element_list = []
87
+ concat(array)
86
88
  end
87
89
 
88
90
  def snapshot
@@ -119,7 +121,17 @@ module BinData
119
121
 
120
122
  def insert(index, *objs)
121
123
  extend_array(index - 1)
122
- elements.insert(index, *to_storage_formats(objs))
124
+ abs_index = (index >= 0) ? index : index + 1 + length
125
+
126
+ # insert elements before...
127
+ new_elements = objs.map { new_element }
128
+ elements.insert(index, *new_elements)
129
+
130
+ # ...assigning values
131
+ objs.each_with_index do |obj, i|
132
+ self[abs_index + i] = obj
133
+ end
134
+
123
135
  self
124
136
  end
125
137
 
@@ -238,10 +250,6 @@ module BinData
238
250
  end
239
251
  end
240
252
 
241
- def to_storage_formats(els)
242
- els.collect { |el| new_element(el) }
243
- end
244
-
245
253
  def elements
246
254
  @element_list ||= []
247
255
  end
@@ -252,8 +260,8 @@ module BinData
252
260
  element
253
261
  end
254
262
 
255
- def new_element(value = nil)
256
- @element_prototype.instantiate(value, self)
263
+ def new_element
264
+ @element_prototype.instantiate(nil, self)
257
265
  end
258
266
 
259
267
  def sum_num_bytes_for_all_elements
@@ -172,8 +172,7 @@ module BinData
172
172
  def to_binary_s(&block)
173
173
  io = BinData::IO.create_string_io
174
174
  write(io, &block)
175
- io.rewind
176
- io.read
175
+ io.string
177
176
  end
178
177
 
179
178
  # Returns the hexadecimal string representation of this data object.
@@ -1,3 +1,4 @@
1
+ require 'thread'
1
2
  require 'bindata/base_primitive'
2
3
 
3
4
  module BinData
@@ -5,15 +6,18 @@ module BinData
5
6
  # The integer is defined by endian and number of bits.
6
7
 
7
8
  module BitField #:nodoc: all
9
+ @@mutex = Mutex.new
10
+
8
11
  class << self
9
12
  def define_class(name, nbits, endian, signed = :unsigned)
10
- unless BinData.const_defined?(name)
11
- BinData.module_eval <<-END
12
- class #{name} < BinData::BasePrimitive
13
- # nbits is either an integer or the symbol `:nbits`
14
- BitField.define_methods(self, #{nbits.inspect}, :#{endian}, :#{signed})
15
- end
16
- END
13
+ @@mutex.synchronize do
14
+ unless BinData.const_defined?(name)
15
+ new_class = Class.new(BinData::BasePrimitive)
16
+ BitField.define_methods(new_class, nbits, endian.to_sym, signed.to_sym)
17
+ RegisteredClasses.register(name, new_class)
18
+
19
+ BinData.const_set(name, new_class)
20
+ end
17
21
  end
18
22
 
19
23
  BinData.const_get(name)
@@ -1,3 +1,4 @@
1
+ require 'thread'
1
2
  require 'bindata/base_primitive'
2
3
 
3
4
  module BinData
@@ -5,14 +6,18 @@ module BinData
5
6
  # is defined by endian, signedness and number of bytes.
6
7
 
7
8
  module Int #:nodoc: all
9
+ @@mutex = Mutex.new
10
+
8
11
  class << self
9
12
  def define_class(name, nbits, endian, signed)
10
- unless BinData.const_defined?(name)
11
- BinData.module_eval <<-END
12
- class #{name} < BinData::BasePrimitive
13
- Int.define_methods(self, #{nbits}, :#{endian}, :#{signed})
14
- end
15
- END
13
+ @@mutex.synchronize do
14
+ unless BinData.const_defined?(name)
15
+ new_class = Class.new(BinData::BasePrimitive)
16
+ Int.define_methods(new_class, nbits, endian.to_sym, signed.to_sym)
17
+ RegisteredClasses.register(name, new_class)
18
+
19
+ BinData.const_set(name, new_class)
20
+ end
16
21
  end
17
22
 
18
23
  BinData.const_get(name)
@@ -29,7 +29,7 @@ module BinData
29
29
 
30
30
  def seekable?
31
31
  @raw_io.pos
32
- rescue NoMethodError, Errno::ESPIPE, Errno::EPIPE
32
+ rescue NoMethodError, Errno::ESPIPE, Errno::EPIPE, Errno::EINVAL
33
33
  nil
34
34
  end
35
35
 
@@ -213,7 +213,9 @@ module BinData
213
213
 
214
214
  # Creates a StringIO around +str+.
215
215
  def self.create_string_io(str = "")
216
- StringIO.new(str.dup.force_encoding(Encoding::BINARY))
216
+ s = StringIO.new(str.dup.force_encoding(Encoding::BINARY))
217
+ s.binmode
218
+ s
217
219
  end
218
220
 
219
221
  # Create a new IO Read wrapper around +io+. +io+ must provide #read,
@@ -24,7 +24,7 @@ module BinData
24
24
  end
25
25
 
26
26
  def register(name, class_to_register)
27
- return if class_to_register.nil?
27
+ return if name.nil? || class_to_register.nil?
28
28
 
29
29
  formatted_name = underscore_name(name)
30
30
  warn_if_name_is_already_registered(formatted_name, class_to_register)
@@ -37,8 +37,14 @@ module BinData
37
37
  end
38
38
 
39
39
  def lookup(name, hints = {})
40
- key = normalize_name(name, hints)
41
- @registry[key] || raise(UnRegisteredTypeError, name.to_s)
40
+ the_class = @registry[normalize_name(name, hints)]
41
+ if the_class
42
+ the_class
43
+ elsif @registry[normalize_name(name, hints.merge(endian: :big))]
44
+ raise(UnRegisteredTypeError, "#{name}, do you need to specify endian?")
45
+ else
46
+ raise(UnRegisteredTypeError, name)
47
+ end
42
48
  end
43
49
 
44
50
  # Convert CamelCase +name+ to underscore style.
@@ -80,7 +80,7 @@ module BinData
80
80
  def trim_to!(str, max_length = nil)
81
81
  if max_length
82
82
  max_length = 1 if max_length < 1
83
- str.slice!(max_length)
83
+ str.slice!(max_length..-1)
84
84
  if str.length == max_length && str[-1, 1] != "\0"
85
85
  str[-1, 1] = "\0"
86
86
  end
@@ -1,3 +1,3 @@
1
1
  module BinData
2
- VERSION = "2.4.3"
2
+ VERSION = "2.4.8"
3
3
  end
@@ -266,6 +266,11 @@ describe BinData::Array, "when accessing elements" do
266
266
  lambda { obj["a"] }.must_raise TypeError
267
267
  lambda { obj[1, "a"] }.must_raise TypeError
268
268
  end
269
+
270
+ it "is unaffected by self assignment" do
271
+ obj.assign(obj)
272
+ obj.snapshot.must_equal [1, 2, 3, 4, 5]
273
+ end
269
274
  end
270
275
 
271
276
  describe BinData::Array, "with :read_until" do
@@ -153,4 +153,3 @@ describe BinData::Buffer, "nested buffers" do
153
153
  obj.to_binary_s.must_equal_binary "abcdeABCDE12345"
154
154
  end
155
155
  end
156
-
@@ -74,9 +74,15 @@ describe BinData::Base, "offsets" do
74
74
  end
75
75
 
76
76
  it "adjust offset when incorrect" do
77
- io.seek(2)
78
- obj = TenByteOffsetBase.create(adjust_offset: 13)
79
- obj.read(io).snapshot.must_equal data[2 + 13, 3]
77
+ w, $-w = $-w, false
78
+
79
+ begin
80
+ io.seek(2)
81
+ obj = TenByteOffsetBase.create(adjust_offset: 13)
82
+ obj.read(io).snapshot.must_equal data[2 + 13, 3]
83
+ ensure
84
+ $-w = w
85
+ end
80
86
  end
81
87
 
82
88
  it "succeeds when offset is correct" do
@@ -36,10 +36,16 @@ describe BinData::Registry do
36
36
  end
37
37
 
38
38
  it "allows overriding of registered classes" do
39
- r.register('A', A)
40
- r.register('A', B)
39
+ w, $-w = $-w, false
41
40
 
42
- r.lookup('a').must_equal B
41
+ begin
42
+ r.register('A', A)
43
+ r.register('A', B)
44
+
45
+ r.lookup('a').must_equal B
46
+ ensure
47
+ $-w = w
48
+ end
43
49
  end
44
50
 
45
51
  it "converts CamelCase to underscores" do
@@ -71,6 +77,14 @@ describe BinData::Registry, "with numerics" do
71
77
  }.must_raise BinData::UnRegisteredTypeError
72
78
  end
73
79
 
80
+ it "provides a nice error message when endian is omitted" do
81
+ begin
82
+ r.lookup("int24")
83
+ rescue BinData::UnRegisteredTypeError => e
84
+ e.message.must_equal "int24, do you need to specify endian?"
85
+ end
86
+ end
87
+
74
88
  it "does not lookup non byte based integers" do
75
89
  lambda {
76
90
  r.lookup("int3")
@@ -106,12 +106,12 @@ describe BinData::Stringz, "with max_length" do
106
106
  end
107
107
 
108
108
  it "trims values greater than max_length" do
109
- obj.assign("abcde")
109
+ obj.assign("abcdefg")
110
110
  obj.must_equal "abcd"
111
111
  end
112
112
 
113
113
  it "writes values greater than max_length" do
114
- obj.assign("abcde")
114
+ obj.assign("abcdefg")
115
115
  obj.to_binary_s.must_equal_binary "abcd\0"
116
116
  end
117
117
 
@@ -360,3 +360,37 @@ describe BinData::Record, "with boolean parameters" do
360
360
  obj.a.must_equal 2
361
361
  end
362
362
  end
363
+
364
+ describe BinData::Record, "encoding" do
365
+ class EncodingTestBufferRecord < BinData::Record
366
+ endian :big
367
+ default_parameter length: 5
368
+
369
+ uint16 :num
370
+ string :str, length: 10
371
+ end
372
+
373
+ it "returns binary encoded data" do
374
+ obj = EncodingTestBufferRecord.new(num: 3)
375
+ obj.to_binary_s.encoding.must_equal Encoding::ASCII_8BIT
376
+ end
377
+
378
+ it "returns binary encoded data with utf-8 string" do
379
+ obj = EncodingTestBufferRecord.new(num: 3, str: "日本語")
380
+ obj.to_binary_s.encoding.must_equal Encoding::ASCII_8BIT
381
+ end
382
+
383
+ it "returns binary encoded data despite Encoding.default_internal" do
384
+ w, $-w = $-w, false
385
+ before_enc = Encoding.default_internal
386
+
387
+ begin
388
+ Encoding.default_internal = Encoding::UTF_8
389
+ obj = EncodingTestBufferRecord.new(num: 3, str: "日本語")
390
+ obj.to_binary_s.encoding.must_equal Encoding::ASCII_8BIT
391
+ ensure
392
+ Encoding.default_internal = before_enc
393
+ $-w = w
394
+ end
395
+ end
396
+ end
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.3
4
+ version: 2.4.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dion Mendel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-09 00:00:00.000000000 Z
11
+ date: 2020-07-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -31,6 +31,9 @@ dependencies:
31
31
  - - ">"
32
32
  - !ruby/object:Gem::Version
33
33
  version: 5.0.0
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: 5.12.0
34
37
  type: :development
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
@@ -38,6 +41,9 @@ dependencies:
38
41
  - - ">"
39
42
  - !ruby/object:Gem::Version
40
43
  version: 5.0.0
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: 5.12.0
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: coveralls
43
49
  requirement: !ruby/object:Gem::Requirement
@@ -164,8 +170,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
164
170
  - !ruby/object:Gem::Version
165
171
  version: '0'
166
172
  requirements: []
167
- rubyforge_project: bindata
168
- rubygems_version: 2.6.14
173
+ rubygems_version: 3.1.2
169
174
  signing_key:
170
175
  specification_version: 4
171
176
  summary: A declarative way to read and write binary file formats