erlang-etf 1.1.1 → 2.0.0

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.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +20 -0
  3. data/.gitignore +10 -18
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +15 -4
  7. data/CHANGELOG.md +7 -0
  8. data/Gemfile +10 -6
  9. data/LICENSE.txt +1 -1
  10. data/README.md +13 -13
  11. data/Rakefile +8 -6
  12. data/erlang-etf.gemspec +10 -10
  13. data/lib/erlang-etf.rb +1 -0
  14. data/lib/erlang/etf.rb +363 -30
  15. data/lib/erlang/etf/atom.rb +28 -48
  16. data/lib/erlang/etf/atom_utf8.rb +28 -48
  17. data/lib/erlang/etf/binary.rb +24 -23
  18. data/lib/erlang/etf/bit_binary.rb +35 -27
  19. data/lib/erlang/etf/compressed.rb +61 -35
  20. data/lib/erlang/etf/export.rb +44 -21
  21. data/lib/erlang/etf/float.rb +33 -29
  22. data/lib/erlang/etf/fun.rb +54 -32
  23. data/lib/erlang/etf/integer.rb +24 -12
  24. data/lib/erlang/etf/large_big.rb +31 -37
  25. data/lib/erlang/etf/large_tuple.rb +41 -30
  26. data/lib/erlang/etf/list.rb +55 -25
  27. data/lib/erlang/etf/map.rb +58 -28
  28. data/lib/erlang/etf/new_float.rb +25 -14
  29. data/lib/erlang/etf/new_fun.rb +70 -47
  30. data/lib/erlang/etf/new_reference.rb +51 -24
  31. data/lib/erlang/etf/nil.rb +21 -6
  32. data/lib/erlang/etf/pid.rb +48 -21
  33. data/lib/erlang/etf/port.rb +49 -13
  34. data/lib/erlang/etf/reference.rb +49 -13
  35. data/lib/erlang/etf/small_atom.rb +31 -27
  36. data/lib/erlang/etf/small_atom_utf8.rb +31 -27
  37. data/lib/erlang/etf/small_big.rb +30 -39
  38. data/lib/erlang/etf/small_integer.rb +27 -12
  39. data/lib/erlang/etf/small_tuple.rb +41 -30
  40. data/lib/erlang/etf/string.rb +23 -23
  41. data/lib/erlang/etf/term.rb +109 -70
  42. data/lib/erlang/etf/version.rb +1 -1
  43. metadata +33 -169
  44. data/.rspec +0 -2
  45. data/lib/erlang/etf/bert.rb +0 -74
  46. data/lib/erlang/etf/extensions.rb +0 -144
  47. data/lib/erlang/etf/extensions/array.rb +0 -27
  48. data/lib/erlang/etf/extensions/big_decimal.rb +0 -20
  49. data/lib/erlang/etf/extensions/erlang-export.rb +0 -24
  50. data/lib/erlang/etf/extensions/erlang-list.rb +0 -29
  51. data/lib/erlang/etf/extensions/erlang-map.rb +0 -26
  52. data/lib/erlang/etf/extensions/erlang-nil.rb +0 -20
  53. data/lib/erlang/etf/extensions/erlang-pid.rb +0 -20
  54. data/lib/erlang/etf/extensions/erlang-string.rb +0 -31
  55. data/lib/erlang/etf/extensions/erlang-tuple.rb +0 -29
  56. data/lib/erlang/etf/extensions/false_class.rb +0 -26
  57. data/lib/erlang/etf/extensions/float.rb +0 -18
  58. data/lib/erlang/etf/extensions/hash.rb +0 -30
  59. data/lib/erlang/etf/extensions/integer.rb +0 -46
  60. data/lib/erlang/etf/extensions/nil_class.rb +0 -27
  61. data/lib/erlang/etf/extensions/object.rb +0 -22
  62. data/lib/erlang/etf/extensions/regexp.rb +0 -32
  63. data/lib/erlang/etf/extensions/string.rb +0 -33
  64. data/lib/erlang/etf/extensions/symbol.rb +0 -43
  65. data/lib/erlang/etf/extensions/time.rb +0 -27
  66. data/lib/erlang/etf/extensions/true_class.rb +0 -26
  67. data/lib/erlang/etf/terms.rb +0 -132
  68. data/spec/erlang/etf/atom_spec.rb +0 -90
  69. data/spec/erlang/etf/atom_utf8_spec.rb +0 -90
  70. data/spec/erlang/etf/binary_spec.rb +0 -90
  71. data/spec/erlang/etf/bit_binary_spec.rb +0 -99
  72. data/spec/erlang/etf/compressed_spec.rb +0 -37
  73. data/spec/erlang/etf/export_spec.rb +0 -58
  74. data/spec/erlang/etf/extensions/array_spec.rb +0 -40
  75. data/spec/erlang/etf/extensions/big_decimal_spec.rb +0 -26
  76. data/spec/erlang/etf/extensions/erlang-export_spec.rb +0 -32
  77. data/spec/erlang/etf/extensions/erlang-list_spec.rb +0 -76
  78. data/spec/erlang/etf/extensions/erlang-map_spec.rb +0 -48
  79. data/spec/erlang/etf/extensions/erlang-nil_spec.rb +0 -24
  80. data/spec/erlang/etf/extensions/erlang-pid_spec.rb +0 -33
  81. data/spec/erlang/etf/extensions/erlang-string_spec.rb +0 -41
  82. data/spec/erlang/etf/extensions/erlang-tuple_spec.rb +0 -57
  83. data/spec/erlang/etf/extensions/false_class_spec.rb +0 -29
  84. data/spec/erlang/etf/extensions/float_spec.rb +0 -24
  85. data/spec/erlang/etf/extensions/hash_spec.rb +0 -90
  86. data/spec/erlang/etf/extensions/integer_spec.rb +0 -259
  87. data/spec/erlang/etf/extensions/nil_class_spec.rb +0 -29
  88. data/spec/erlang/etf/extensions/object_spec.rb +0 -30
  89. data/spec/erlang/etf/extensions/regexp_spec.rb +0 -35
  90. data/spec/erlang/etf/extensions/string_spec.rb +0 -43
  91. data/spec/erlang/etf/extensions/symbol_spec.rb +0 -64
  92. data/spec/erlang/etf/extensions/time_spec.rb +0 -32
  93. data/spec/erlang/etf/extensions/true_class_spec.rb +0 -29
  94. data/spec/erlang/etf/float_spec.rb +0 -92
  95. data/spec/erlang/etf/fun_spec.rb +0 -132
  96. data/spec/erlang/etf/integer_spec.rb +0 -57
  97. data/spec/erlang/etf/large_big_spec.rb +0 -67
  98. data/spec/erlang/etf/large_tuple_spec.rb +0 -119
  99. data/spec/erlang/etf/list_spec.rb +0 -159
  100. data/spec/erlang/etf/map_spec.rb +0 -100
  101. data/spec/erlang/etf/new_float_spec.rb +0 -92
  102. data/spec/erlang/etf/new_fun_spec.rb +0 -146
  103. data/spec/erlang/etf/new_reference_spec.rb +0 -60
  104. data/spec/erlang/etf/nil_spec.rb +0 -50
  105. data/spec/erlang/etf/pid_spec.rb +0 -61
  106. data/spec/erlang/etf/port_spec.rb +0 -58
  107. data/spec/erlang/etf/reference_spec.rb +0 -58
  108. data/spec/erlang/etf/small_atom_spec.rb +0 -90
  109. data/spec/erlang/etf/small_atom_utf8_spec.rb +0 -90
  110. data/spec/erlang/etf/small_big_spec.rb +0 -67
  111. data/spec/erlang/etf/small_integer_spec.rb +0 -57
  112. data/spec/erlang/etf/small_tuple_spec.rb +0 -112
  113. data/spec/erlang/etf/string_spec.rb +0 -92
  114. data/spec/erlang/etf/term_spec.rb +0 -27
  115. data/spec/erlang/etf/terms_spec.rb +0 -23
  116. data/spec/erlang/etf_spec.rb +0 -23
  117. data/spec/erlang_spec.rb +0 -95
  118. data/spec/spec_helper.rb +0 -31
@@ -2,9 +2,9 @@ module Erlang
2
2
  module ETF
3
3
 
4
4
  #
5
- # 1 | 2 | Len
6
- # --- | --- | --------
7
- # 100 | Len | AtomName
5
+ # | 1 | 2 | Len |
6
+ # | --- | --- | -------- |
7
+ # | 100 | Len | AtomName |
8
8
  #
9
9
  # An atom is stored with a 2 byte unsigned length in big-endian
10
10
  # order, followed by `Len` numbers of 8 bit Latin1 characters that
@@ -17,55 +17,35 @@ module Erlang
17
17
  # [`ATOM_EXT`]: http://erlang.org/doc/apps/erts/erl_ext_dist.html#ATOM_EXT
18
18
  #
19
19
  class Atom
20
- include Term
21
-
22
- uint8 :tag, always: Terms::ATOM_EXT
23
-
24
- uint16be :len, default: 0 do
25
- string :atom_name
26
- end
27
-
28
- undef deserialize_atom_name
29
- # @private
30
- def deserialize_atom_name(buffer)
31
- self.atom_name = buffer.read(len).from_utf8_binary
20
+ include Erlang::ETF::Term
21
+
22
+ UINT16BE = Erlang::ETF::Term::UINT16BE
23
+
24
+ class << self
25
+ def [](term)
26
+ return term if term.kind_of?(Erlang::ETF::Term)
27
+ term = Erlang.from(term) if not term.kind_of?(Erlang::Atom)
28
+ return new(term)
29
+ end
30
+
31
+ def erlang_load(buffer)
32
+ size, = buffer.read(2).unpack(UINT16BE)
33
+ data = buffer.read(size)
34
+ return new(Erlang::Atom[data])
35
+ end
32
36
  end
33
37
 
34
- undef serialize_atom_name
35
- # @private
36
- def serialize_atom_name(buffer)
37
- buffer << atom_name.to_utf8_binary
38
- end
39
-
40
- finalize
41
-
42
- # Instantiate the new atom.
43
- #
44
- # @example Instantiate the atom.
45
- # Erlang::ETF::Atom.new("test")
46
- # # => #<Erlang::ETF::Atom @tag=100 @len=4 @atom_name="test">
47
- #
48
- # @param [ ::String ] atom_name The `AtomName` as a string.
49
- #
50
- # @since 1.0.0
51
- def initialize(atom_name)
52
- @atom_name = atom_name
53
- @len = atom_name.to_s.bytesize
38
+ def initialize(term)
39
+ raise ArgumentError, "term must be of type Erlang::Atom" if not term.kind_of?(Erlang::Atom)
40
+ @term = term
54
41
  end
55
42
 
56
- # Evolve to native ruby.
57
- #
58
- # @example Evolve to native ruby.
59
- # atom = Erlang::ETF::Atom.new("test")
60
- # atom.__ruby_evolve__
61
- # # => :test
62
- #
63
- # @return [ ::Symbol ] The `AtomName` as a symbol.
64
- #
65
- # @since 1.0.0
66
- def __ruby_evolve__
67
- atom_name.intern
43
+ def erlang_dump(buffer = ::String.new.force_encoding(BINARY_ENCODING))
44
+ buffer << ATOM_EXT
45
+ buffer << [@term.size].pack(UINT16BE)
46
+ buffer << Erlang::ETF::Term.binary_encoding(@term.data)
47
+ return buffer
68
48
  end
69
49
  end
70
50
  end
71
- end
51
+ end
@@ -2,9 +2,9 @@ module Erlang
2
2
  module ETF
3
3
 
4
4
  #
5
- # 1 | 2 | Len
6
- # --- | --- | --------
7
- # 118 | Len | AtomName
5
+ # | 1 | 2 | Len |
6
+ # | --- | --- | -------- |
7
+ # | 118 | Len | AtomName |
8
8
  #
9
9
  # An atom is stored with a 2 byte unsigned length in big-endian
10
10
  # order, followed by `Len` bytes containing the `AtomName` encoded
@@ -15,55 +15,35 @@ module Erlang
15
15
  # [`ATOM_UTF8_EXT`]: http://erlang.org/doc/apps/erts/erl_ext_dist.html#ATOM_UTF8_EXT
16
16
  #
17
17
  class AtomUTF8
18
- include Term
19
-
20
- uint8 :tag, always: Terms::ATOM_UTF8_EXT
21
-
22
- uint16be :len, default: 0 do
23
- string :atom_name
24
- end
25
-
26
- undef deserialize_atom_name
27
- # @private
28
- def deserialize_atom_name(buffer)
29
- self.atom_name = buffer.read(len).from_utf8_binary
18
+ include Erlang::ETF::Term
19
+
20
+ UINT16BE = Erlang::ETF::Term::UINT16BE
21
+
22
+ class << self
23
+ def [](term)
24
+ return term if term.kind_of?(Erlang::ETF::Term)
25
+ term = Erlang.from(term) if not term.kind_of?(Erlang::Atom)
26
+ return new(term)
27
+ end
28
+
29
+ def erlang_load(buffer)
30
+ size, = buffer.read(2).unpack(UINT16BE)
31
+ data = buffer.read(size)
32
+ return new(Erlang::Atom[data, utf8: true])
33
+ end
30
34
  end
31
35
 
32
- undef serialize_atom_name
33
- # @private
34
- def serialize_atom_name(buffer)
35
- buffer << atom_name.to_utf8_binary
36
- end
37
-
38
- finalize
39
-
40
- # Instantiate the new UTF-8 atom.
41
- #
42
- # @example Instantiate the UTF-8 atom.
43
- # Erlang::ETF::AtomUTF8.new("Ωmega")
44
- # # => #<Erlang::ETF::AtomUTF8 @tag=118 @len=5 @atom_name="Ωmega">
45
- #
46
- # @param [ ::String ] atom_name The `AtomName` as a string.
47
- #
48
- # @since 1.0.0
49
- def initialize(atom_name)
50
- @atom_name = atom_name
51
- @len = atom_name.to_s.bytesize
36
+ def initialize(term)
37
+ raise ArgumentError, "term must be of type Erlang::Atom" if not term.kind_of?(Erlang::Atom)
38
+ @term = term
52
39
  end
53
40
 
54
- # Evolve to native ruby.
55
- #
56
- # @example Evolve to native ruby.
57
- # atom_utf8 = Erlang::ETF::AtomUTF8.new("Ωmega")
58
- # atom_utf8.__ruby_evolve__
59
- # # => :'Ωmega'
60
- #
61
- # @return [ ::Symbol ] The `AtomName` as a symbol.
62
- #
63
- # @since 1.0.0
64
- def __ruby_evolve__
65
- atom_name.intern
41
+ def erlang_dump(buffer = ::String.new.force_encoding(BINARY_ENCODING))
42
+ buffer << ATOM_UTF8_EXT
43
+ buffer << [@term.size].pack(UINT16BE)
44
+ buffer << Erlang::ETF::Term.binary_encoding(@term.data)
45
+ return buffer
66
46
  end
67
47
  end
68
48
  end
69
- end
49
+ end
@@ -2,9 +2,9 @@ module Erlang
2
2
  module ETF
3
3
 
4
4
  #
5
- # 1 | 4 | Len
6
- # --- | --- | ----
7
- # 109 | Len | Data
5
+ # | 1 | 4 | Len |
6
+ # | --- | --- | ---- |
7
+ # | 109 | Len | Data |
8
8
  #
9
9
  # Binaries are generated with bit syntax expression or with
10
10
  # [`list_to_binary/1`], [`term_to_binary/1`], or as input from
@@ -19,33 +19,34 @@ module Erlang
19
19
  # [`BINARY_EXT`]: http://erlang.org/doc/apps/erts/erl_ext_dist.html#BINARY_EXT
20
20
  #
21
21
  class Binary
22
- include Term
22
+ include Erlang::ETF::Term
23
23
 
24
- uint8 :tag, always: Terms::BINARY_EXT
24
+ UINT32BE = Erlang::ETF::Term::UINT32BE
25
25
 
26
- uint32be :len, default: 0 do
27
- string :data
28
- end
29
-
30
- undef deserialize_data
31
- def deserialize_data(buffer)
32
- self.data = buffer.read(len).from_utf8_binary
33
- end
26
+ class << self
27
+ def [](term)
28
+ term = Erlang.from(term) if not term.kind_of?(Erlang::Binary)
29
+ return new(term)
30
+ end
34
31
 
35
- undef serialize_data
36
- def serialize_data(buffer)
37
- buffer << data.to_utf8_binary
32
+ def erlang_load(buffer)
33
+ size, = buffer.read(4).unpack(UINT32BE)
34
+ data = buffer.read(size)
35
+ return new(Erlang::Binary[data])
36
+ end
38
37
  end
39
38
 
40
- finalize
41
-
42
- def initialize(data)
43
- @data = data
39
+ def initialize(term)
40
+ raise ArgumentError, "term must be of type Erlang::Binary" if not term.kind_of?(Erlang::Binary)
41
+ @term = term
44
42
  end
45
43
 
46
- def __ruby_evolve__
47
- data
44
+ def erlang_dump(buffer = ::String.new.force_encoding(BINARY_ENCODING))
45
+ buffer << BINARY_EXT
46
+ buffer << [@term.bytesize].pack(UINT32BE)
47
+ buffer << Erlang::ETF::Term.binary_encoding(@term.data)
48
+ return buffer
48
49
  end
49
50
  end
50
51
  end
51
- end
52
+ end
@@ -2,9 +2,9 @@ module Erlang
2
2
  module ETF
3
3
 
4
4
  #
5
- # 1 | 4 | 1 | Len
6
- # --- | --- | ---- | ----
7
- # 77 | Len | Bits | Data
5
+ # | 1 | 4 | 1 | Len |
6
+ # | --- | --- | ---- | ---- |
7
+ # | 77 | Len | Bits | Data |
8
8
  #
9
9
  # This term represents a bitstring whose length in bits is not a
10
10
  # multiple of 8 (created using the bit syntax in R12B and later).
@@ -18,34 +18,42 @@ module Erlang
18
18
  # [`BIT_BINARY_EXT`]: http://erlang.org/doc/apps/erts/erl_ext_dist.html#BIT_BINARY_EXT
19
19
  #
20
20
  class BitBinary
21
- include Term
22
-
23
- uint8 :tag, always: Terms::BIT_BINARY_EXT
24
-
25
- uint32be :len, always: -> { data.bytesize }
26
-
27
- uint8 :bits
28
-
29
- string :data, default: ""
30
-
31
- undef serialize_data
32
- def serialize_data(buffer)
33
- buffer << data.to_utf8_binary
21
+ include Erlang::ETF::Term
22
+
23
+ UINT8 = Erlang::ETF::Term::UINT8
24
+ UINT32BE = Erlang::ETF::Term::UINT32BE
25
+ HEAD = (UINT32BE + UINT8).freeze
26
+
27
+ class << self
28
+ def [](term)
29
+ term = Erlang.from(term) if not term.kind_of?(Erlang::Bitstring)
30
+ return new(term)
31
+ end
32
+
33
+ def erlang_load(buffer)
34
+ size, bits, = buffer.read(5).unpack(HEAD)
35
+ data = buffer.read(size)
36
+ if size > 0
37
+ data.setbyte(-1, data.getbyte(-1) >> (8 - bits))
38
+ end
39
+ return new(Erlang::Bitstring[data, bits: bits])
40
+ end
34
41
  end
35
42
 
36
- deserialize do |buffer|
37
- len, = buffer.read(BYTES_32).unpack(UINT32BE_PACK)
38
- deserialize_bits(buffer)
39
- self.data = buffer.read(len).from_utf8_binary
40
- self
43
+ def initialize(term)
44
+ raise ArgumentError, "term must be of type Erlang::Bitstring" if not term.kind_of?(Erlang::Bitstring) and not term.kind_of?(Erlang::Binary)
45
+ @term = term
41
46
  end
42
47
 
43
- finalize
44
-
45
- def initialize(bits, data = "")
46
- self.bits = bits
47
- self.data = data
48
+ def erlang_dump(buffer = ::String.new.force_encoding(BINARY_ENCODING))
49
+ buffer << BIT_BINARY_EXT
50
+ buffer << [@term.bytesize, @term.bits].pack(HEAD)
51
+ buffer << Erlang::ETF::Term.binary_encoding(@term.data)
52
+ if @term.bytesize > 0
53
+ buffer.setbyte(-1, buffer.getbyte(-1) << (8 - @term.bits))
54
+ end
55
+ return buffer
48
56
  end
49
57
  end
50
58
  end
51
- end
59
+ end
@@ -4,17 +4,17 @@ module Erlang
4
4
  module ETF
5
5
 
6
6
  #
7
- # 1 | 4 | N
8
- # --- | ---------------- | -------------------
9
- # 80 | UncompressedSize | Zlib-compressedData
7
+ # | 1 | 4 | N |
8
+ # | --- | ---------------- | ------------------- |
9
+ # | 80 | UncompressedSize | Zlib-compressedData |
10
10
  #
11
- # Uncompressed Size (unsigned 32 bit integer in big-endian
12
- # byte order) is the size of the data before it was compressed.
11
+ # Uncompressed Size (unsigned 32 bit integer in big-endian
12
+ # byte order) is the size of the data before it was compressed.
13
13
  # The compressed data has the following format when it has been expanded:
14
14
  #
15
- # 1 | Uncompressed Size
16
- # ---- | -----------------
17
- # Tag | Data
15
+ # | 1 | Uncompressed Size |
16
+ # | ---- | ----------------- |
17
+ # | Tag | Data |
18
18
  #
19
19
  # (see [`External Term Format`] and [`term_to_binary/2`])
20
20
  #
@@ -22,45 +22,71 @@ module Erlang
22
22
  # [`term_to_binary/2`]: http://www.erlang.org/doc/man/erlang.html#term_to_binary-2
23
23
  #
24
24
  class Compressed
25
- include Term
25
+ include Erlang::ETF::Term
26
26
 
27
- uint8 :tag, always: Terms::COMPRESSED
27
+ LEVEL_RANGE = (0..9).freeze
28
+ LEVEL_DEFAULT = 6.freeze
28
29
 
29
- uint32be :uncompressed_size, always: -> { data.serialize.bytesize }
30
+ UINT32BE = Erlang::ETF::Term::UINT32BE
30
31
 
31
- term :data
32
+ class << self
33
+ def [](term, uncompressed_size = nil, compressed_data = nil, level: LEVEL_DEFAULT)
34
+ term = Erlang.from(term)
35
+ return new(term, uncompressed_size, compressed_data, level)
36
+ end
32
37
 
33
- deserialize do |buffer|
34
- uncompressed_size, = buffer.read(BYTES_32).unpack(UINT32BE_PACK)
35
- compressed_data = buffer.read()
36
- uncompressed_data = ::Zlib::Inflate.inflate(compressed_data)
37
- if uncompressed_size == uncompressed_data.bytesize
38
- deserialize_data(::StringIO.new(uncompressed_data))
39
- else
40
- raise ::Zlib::DataError, "UncompressedSize value did not match the size of the uncompressed data"
38
+ def erlang_load(buffer)
39
+ uncompressed_size, = buffer.read(4).unpack(UINT32BE)
40
+ compressed_data = buffer.read()
41
+ uncompressed_data = ::Zlib::Inflate.inflate(compressed_data)
42
+ if uncompressed_size == uncompressed_data.bytesize
43
+ term = Erlang.from(Erlang::ETF.read_term(StringIO.new(uncompressed_data)))
44
+ return new(term, uncompressed_size, compressed_data)
45
+ else
46
+ raise ::Zlib::DataError, "UncompressedSize value did not match the size of the uncompressed data"
47
+ end
41
48
  end
42
49
  end
43
50
 
44
- undef serialize_data
45
- def serialize_data(buffer)
46
- uncompressed_data = data.serialize
47
- compressed_data = ::Zlib::Deflate.deflate(uncompressed_data, @level)
48
- buffer << compressed_data
51
+ def initialize(term, uncompressed_size = nil, compressed_data = nil, level = LEVEL_DEFAULT)
52
+ raise ArgumentError, "term must be of any type" if not Erlang.is_any(term)
53
+ @term = term
54
+ @uncompressed_size = uncompressed_size
55
+ @compressed_data = compressed_data
56
+ @level = LEVEL_RANGE.include?(level) ? level : LEVEL_DEFAULT
49
57
  end
50
58
 
51
- finalize
52
-
53
- LEVEL_RANGE = (0..9).freeze
54
- LEVEL_DEFAULT = 6.freeze
59
+ def erlang_dump(buffer = ::String.new.force_encoding(BINARY_ENCODING))
60
+ buffer << COMPRESSED
61
+ if @uncompressed_size.nil? and @compressed_data.nil?
62
+ uncompressed_data = Erlang::ETF.write_term(@term, ::String.new.force_encoding(BINARY_ENCODING))
63
+ uncompressed_size = uncompressed_data.bytesize
64
+ compressed_data = ::Zlib::Deflate.deflate(uncompressed_data, @level)
65
+ buffer << [uncompressed_size].pack(UINT32BE)
66
+ buffer << Erlang::ETF::Term.binary_encoding(compressed_data)
67
+ else
68
+ buffer << [@uncompressed_size].pack(UINT32BE)
69
+ buffer << Erlang::ETF::Term.binary_encoding(@compressed_data)
70
+ end
71
+ return buffer
72
+ end
55
73
 
56
- def initialize(data, level = LEVEL_DEFAULT)
57
- @data = data
58
- @level = LEVEL_RANGE.include?(level) ? level : LEVEL_DEFAULT
74
+ def inspect
75
+ if @uncompressed_size.nil? and @compressed_data.nil?
76
+ return "#{self.class}[#{@term.inspect}, level: #{@level.inspect}]"
77
+ else
78
+ return "#{self.class}[#{@term.inspect}, #{@uncompressed_size.inspect}, #{@compressed_data.inspect}, level: #{@level.inspect}]"
79
+ end
59
80
  end
60
81
 
61
- def __ruby_evolve__
62
- data.__ruby_evolve__
82
+ def pretty_print(pp)
83
+ state = [@term]
84
+ state.push(@uncompressed_size, @compressed_data) if not @uncompressed_size.nil? or not @compressed_data.nil?
85
+ return pp.group(1, "#{self.class}[", ", level: #{@level.inspect}]") do
86
+ pp.breakable ''
87
+ pp.seplist(state) { |obj| obj.pretty_print(pp) }
88
+ end
63
89
  end
64
90
  end
65
91
  end
66
- end
92
+ end