bytemapper 1.0.26 → 1.0.27

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: 76c2e215cabd7c201c72481a89a032dcd6034512b4242eb821fe097914c7f69f
4
- data.tar.gz: 31615cfac602b73c2d3d36f1c9a0b4bc9ca55befec6cad72c4fae2fd7f39df80
3
+ metadata.gz: 7f16b61aeb646f03cd1a49dbaca9b948bd95c36a9bdf7582b8c97f50d0d6f5c2
4
+ data.tar.gz: 66d21d518947f760770e1fca457bb3d3b993f4d2b5514bc7ad94841f79af19b9
5
5
  SHA512:
6
- metadata.gz: 4b8d9c242406a8d80d30e901231fe674b2d689c8d0f44310e5e021f305c23f1ea508ee0d9f607ec6c19b187c64d060f40b2b970e3ca7f99ab5ced89a48713d84
7
- data.tar.gz: ed768686f5c64498d0c382a57ba92e292ef1a6fcf72fe69ded983378805aac32056e3e78e79be51c3d534bd222b448f6c69b193f49033e7775e90ea22177ecb7
6
+ metadata.gz: 56498f8a6f77dc55686077847d01f34b01cfbdad3004118cf3041bf80148f3af3b0ead05eb7ecefa1c24cea05c620613cbf6d4fd1247befa4d91b957850d8a06
7
+ data.tar.gz: 57ebf44b242121611b71ca6cd2913f2788a538d4af5cfe49c9ca14f1d90ea8d12f15395242cdc37115965b866bf82e5303ba3c527d4d6ce51b735eb5c1ebdc5e
@@ -23,6 +23,8 @@ module Bytemapper
23
23
  require 'bytemapper/chunk'
24
24
  require 'bytemapper/table'
25
25
 
26
+ using Refinements
27
+
26
28
  @@registry = Registry.new
27
29
 
28
30
  class << self
@@ -71,9 +73,11 @@ module Bytemapper
71
73
  end
72
74
 
73
75
  def map(bytes, shape, name = nil)
74
- bytes.force_encoding(Encoding::ASCII_8BIT)
75
- bytes = StringIO.new(bytes)
76
- if shape.is_a?(Array)
76
+ bytes = StringIO.from(bytes)
77
+
78
+ if shape.is_a?(Bytemapper::Table)
79
+ shape.populate(bytes)
80
+ elsif shape.is_a?(Array)
77
81
  chunks = []
78
82
  shape.each { |s| chunks << Chunk.new(bytes.read(s.size), s, name) }
79
83
  chunks
@@ -95,6 +99,11 @@ module Bytemapper
95
99
  registry.get(obj)
96
100
  end
97
101
 
102
+ def get2(obj)
103
+ obj.each_pair { |k,v| obj[k] = get(v) if registry.registered_name?(v) }
104
+ registry.get(obj)
105
+ end
106
+
98
107
  def put(obj, name)
99
108
  registry.put(obj, name)
100
109
  end
@@ -30,7 +30,7 @@ module Bytemapper
30
30
  self[k] = if v.is_a?(Hash)
31
31
  Chunk.new(@bytes.read(v.size), v, k)
32
32
  elsif v.is_a?(Bytemapper::Table)
33
- if v.unbounded?
33
+ if v.empty?
34
34
  v.populate(@bytes.read(@bytes.size-@bytes.pos))
35
35
  else
36
36
  v.populate(@bytes.read(v.capacity))
@@ -16,6 +16,7 @@
16
16
 
17
17
  module Bytemapper
18
18
  class Registry
19
+ require 'set'
19
20
  require 'bytemapper/nameable'
20
21
 
21
22
  attr_reader :names
@@ -1,32 +1,45 @@
1
1
  module Bytemapper
2
- using Refinements
2
+ module NilTimes
3
+ refine NilClass do
4
+ def times
5
+ 0
6
+ end
7
+ end
8
+ end
3
9
 
4
10
  class Table < Array
5
11
  include Flattenable
6
12
  include Nameable
7
- attr_reader :bytes, :shape
13
+ attr_reader :shape, :rows, :bytes
14
+ using NilTimes
8
15
 
9
16
  def initialize(shape, rows = nil)
10
- @bytes = nil
11
- @shape = Bytemapper.get(shape)
17
+ @shape = Bytemapper.get(shape) || shape
18
+ rows.times { self << @shape }
12
19
  end
13
20
 
14
21
  def populate(bytes)
15
- @bytes = StringIO.from(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
+ @shape = Bytemapper.get(shape).nil? ? Bytemapper.get2(shape) : Bytemapper.get(shape)
16
26
 
17
- table = Table.new(shape)
18
- table.clear
27
+ (bytes.size / shape.size).times { self << @shape } if unbounded?
19
28
 
29
+ table = Table.new(shape)
30
+ table.clear
20
31
  (bytes.size / shape.size).times do
21
- table << Chunk.new(@bytes.read(shape.size), shape, shape.name)
32
+ table << Chunk.new(@bytes.read(shape.size), shape, shape.name)
22
33
  end
23
-
24
34
  table
25
35
  end
26
36
 
37
+ def unbounded?
38
+ empty?
39
+ end
40
+
27
41
  def size
28
42
  empty? ? 0 : map(&:size).reduce(:+)
29
43
  end
30
-
31
44
  end
32
45
  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.26
4
+ version: 1.0.27
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-16 00:00:00.000000000 Z
11
+ date: 2020-08-22 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