bytemapper 1.0.25 → 1.0.26

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dce11df6e4ad42a1c8a81853d2e9188fd9a3caaa02692ef12a58dedcae33e296
4
- data.tar.gz: f95e339d989e6346651cc45d07ca0ae1ffd55e2b0a8bd0071b0014b28aa9868c
3
+ metadata.gz: 76c2e215cabd7c201c72481a89a032dcd6034512b4242eb821fe097914c7f69f
4
+ data.tar.gz: 31615cfac602b73c2d3d36f1c9a0b4bc9ca55befec6cad72c4fae2fd7f39df80
5
5
  SHA512:
6
- metadata.gz: 56c5919a1f298fe359eb3931e941965ac43d003ddf2691c2b93394ca8b0dbdba88ef9b64c55cdda5d0902ac148776bfcc6f6aa7c45d43d6320d5a5f028c0cbfd
7
- data.tar.gz: '0698b1a5cc71653eb4044f920f4e4428244c88a8cc08ec22c72324e9943efdbbf0e1c7ec7da91bd319c61fdd3c4a3f9e9271889098f503fbb4f3ad52f112d03c'
6
+ metadata.gz: 4b8d9c242406a8d80d30e901231fe674b2d689c8d0f44310e5e021f305c23f1ea508ee0d9f607ec6c19b187c64d060f40b2b970e3ca7f99ab5ced89a48713d84
7
+ data.tar.gz: ed768686f5c64498d0c382a57ba92e292ef1a6fcf72fe69ded983378805aac32056e3e78e79be51c3d534bd222b448f6c69b193f49033e7775e90ea22177ecb7
@@ -15,6 +15,7 @@
15
15
  # along with this program. If not, see <https://www.gnu.org/licenses/>.
16
16
 
17
17
  module Bytemapper
18
+ require 'refinements'
18
19
  require 'bytemapper/registry'
19
20
  require 'bytemapper/shape'
20
21
  require 'bytemapper/type'
@@ -41,6 +41,8 @@ module Bytemapper
41
41
  singleton_class.instance_eval { attr_reader k }
42
42
  instance_variable_set("@#{k.to_s}", self[k])
43
43
  end
44
+
45
+ shape.hooks.each {|h| h.call(self) }
44
46
  end
45
47
 
46
48
  def string
@@ -19,8 +19,8 @@ module Bytemapper
19
19
  attr_reader :name
20
20
  attr_accessor :names
21
21
 
22
- def name=(val)
23
- @name ||= val.to_sym
22
+ def name=(v)
23
+ @name ||= v.respond_to?(:to_sym) ? v.to_sym : v
24
24
  end
25
25
  end
26
26
  end
@@ -20,6 +20,12 @@ module Bytemapper
20
20
  class Shape < Hash
21
21
  include Flattenable
22
22
  include Nameable
23
+ attr_accessor :hooks
24
+
25
+ def initialize
26
+ super
27
+ @hooks = []
28
+ end
23
29
 
24
30
  def []=(k,v)
25
31
  super
@@ -27,6 +33,10 @@ module Bytemapper
27
33
  instance_variable_set("@#{k.to_s}", self[k])
28
34
  end
29
35
 
36
+ def hook(&block)
37
+ @hooks << block if block_given?
38
+ end
39
+
30
40
  def size
31
41
  flatten.values.map(&:size).reduce(:+)
32
42
  end
@@ -1,44 +1,32 @@
1
1
  module Bytemapper
2
- module NilTimes
3
- refine NilClass do
4
- def times
5
- 0
6
- end
7
- end
8
- end
2
+ using Refinements
9
3
 
10
4
  class Table < Array
11
5
  include Flattenable
12
6
  include Nameable
13
- attr_reader :shape, :rows, :bytes
14
- using NilTimes
7
+ attr_reader :bytes, :shape
15
8
 
16
9
  def initialize(shape, rows = nil)
10
+ @bytes = nil
17
11
  @shape = Bytemapper.get(shape)
18
- rows.times { self << @shape }
19
12
  end
20
13
 
21
14
  def populate(bytes)
22
- bytes = bytes.nil? ? '' : bytes
23
- @bytes = bytes.is_a?(StringIO) ? bytes : StringIO.new(bytes)
24
- @bytes.string.force_encoding(Encoding::ASCII_8BIT)
25
- if unbounded?
26
- (bytes.size / shape.size).times { self << @shape }
27
- end
15
+ @bytes = StringIO.from(bytes)
28
16
 
29
- table = Table.new(shape)
17
+ table = Table.new(shape)
30
18
  table.clear
31
- (bytes.size / shape.size).times { table << Chunk.new(@bytes.read(shape.size), shape, shape.name) }
32
- table
33
- end
34
19
 
35
- def unbounded?
36
- empty?
20
+ (bytes.size / shape.size).times do
21
+ table << Chunk.new(@bytes.read(shape.size), shape, shape.name)
22
+ end
23
+
24
+ table
37
25
  end
38
26
 
39
27
  def size
40
28
  empty? ? 0 : map(&:size).reduce(:+)
41
29
  end
30
+
42
31
  end
43
32
  end
44
-
@@ -0,0 +1,24 @@
1
+ module Refinements
2
+ refine StringIO do
3
+ def peek
4
+ string[pos]
5
+ end
6
+
7
+ def extract(offset, length)
8
+ prev = pos
9
+ seek(offset)
10
+ bytes = read(length)
11
+ seek(prev)
12
+ bytes
13
+ end
14
+ end
15
+
16
+ refine StringIO.singleton_class do
17
+ def from(obj)
18
+ obj = obj.nil? ? '' : obj
19
+ obj = obj.is_a?(StringIO) ? obj : new(obj)
20
+ obj.string.force_encoding(Encoding::ASCII_8BIT)
21
+ obj
22
+ end
23
+ end
24
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bytemapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.25
4
+ version: 1.0.26
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jefferson Hudson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-14 00:00:00.000000000 Z
11
+ date: 2020-08-16 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Model and interact with bytestrings using Ruby objects.
14
14
  email: jefferson.hudson@gmail.com
@@ -25,6 +25,7 @@ files:
25
25
  - lib/bytemapper/table.rb
26
26
  - lib/bytemapper/type.rb
27
27
  - lib/bytemapper/typeable.rb
28
+ - lib/refinements.rb
28
29
  homepage: https://github.com/l4cr0ss/bytemapper
29
30
  licenses:
30
31
  - AGPL-3.0-or-later