erlang-etf 1.1.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.editorconfig +20 -0
- data/.gitignore +10 -18
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +15 -4
- data/CHANGELOG.md +7 -0
- data/Gemfile +10 -6
- data/LICENSE.txt +1 -1
- data/README.md +13 -13
- data/Rakefile +8 -6
- data/erlang-etf.gemspec +10 -10
- data/lib/erlang-etf.rb +1 -0
- data/lib/erlang/etf.rb +363 -30
- data/lib/erlang/etf/atom.rb +28 -48
- data/lib/erlang/etf/atom_utf8.rb +28 -48
- data/lib/erlang/etf/binary.rb +24 -23
- data/lib/erlang/etf/bit_binary.rb +35 -27
- data/lib/erlang/etf/compressed.rb +61 -35
- data/lib/erlang/etf/export.rb +44 -21
- data/lib/erlang/etf/float.rb +33 -29
- data/lib/erlang/etf/fun.rb +54 -32
- data/lib/erlang/etf/integer.rb +24 -12
- data/lib/erlang/etf/large_big.rb +31 -37
- data/lib/erlang/etf/large_tuple.rb +41 -30
- data/lib/erlang/etf/list.rb +55 -25
- data/lib/erlang/etf/map.rb +58 -28
- data/lib/erlang/etf/new_float.rb +25 -14
- data/lib/erlang/etf/new_fun.rb +70 -47
- data/lib/erlang/etf/new_reference.rb +51 -24
- data/lib/erlang/etf/nil.rb +21 -6
- data/lib/erlang/etf/pid.rb +48 -21
- data/lib/erlang/etf/port.rb +49 -13
- data/lib/erlang/etf/reference.rb +49 -13
- data/lib/erlang/etf/small_atom.rb +31 -27
- data/lib/erlang/etf/small_atom_utf8.rb +31 -27
- data/lib/erlang/etf/small_big.rb +30 -39
- data/lib/erlang/etf/small_integer.rb +27 -12
- data/lib/erlang/etf/small_tuple.rb +41 -30
- data/lib/erlang/etf/string.rb +23 -23
- data/lib/erlang/etf/term.rb +109 -70
- data/lib/erlang/etf/version.rb +1 -1
- metadata +33 -169
- data/.rspec +0 -2
- data/lib/erlang/etf/bert.rb +0 -74
- data/lib/erlang/etf/extensions.rb +0 -144
- data/lib/erlang/etf/extensions/array.rb +0 -27
- data/lib/erlang/etf/extensions/big_decimal.rb +0 -20
- data/lib/erlang/etf/extensions/erlang-export.rb +0 -24
- data/lib/erlang/etf/extensions/erlang-list.rb +0 -29
- data/lib/erlang/etf/extensions/erlang-map.rb +0 -26
- data/lib/erlang/etf/extensions/erlang-nil.rb +0 -20
- data/lib/erlang/etf/extensions/erlang-pid.rb +0 -20
- data/lib/erlang/etf/extensions/erlang-string.rb +0 -31
- data/lib/erlang/etf/extensions/erlang-tuple.rb +0 -29
- data/lib/erlang/etf/extensions/false_class.rb +0 -26
- data/lib/erlang/etf/extensions/float.rb +0 -18
- data/lib/erlang/etf/extensions/hash.rb +0 -30
- data/lib/erlang/etf/extensions/integer.rb +0 -46
- data/lib/erlang/etf/extensions/nil_class.rb +0 -27
- data/lib/erlang/etf/extensions/object.rb +0 -22
- data/lib/erlang/etf/extensions/regexp.rb +0 -32
- data/lib/erlang/etf/extensions/string.rb +0 -33
- data/lib/erlang/etf/extensions/symbol.rb +0 -43
- data/lib/erlang/etf/extensions/time.rb +0 -27
- data/lib/erlang/etf/extensions/true_class.rb +0 -26
- data/lib/erlang/etf/terms.rb +0 -132
- data/spec/erlang/etf/atom_spec.rb +0 -90
- data/spec/erlang/etf/atom_utf8_spec.rb +0 -90
- data/spec/erlang/etf/binary_spec.rb +0 -90
- data/spec/erlang/etf/bit_binary_spec.rb +0 -99
- data/spec/erlang/etf/compressed_spec.rb +0 -37
- data/spec/erlang/etf/export_spec.rb +0 -58
- data/spec/erlang/etf/extensions/array_spec.rb +0 -40
- data/spec/erlang/etf/extensions/big_decimal_spec.rb +0 -26
- data/spec/erlang/etf/extensions/erlang-export_spec.rb +0 -32
- data/spec/erlang/etf/extensions/erlang-list_spec.rb +0 -76
- data/spec/erlang/etf/extensions/erlang-map_spec.rb +0 -48
- data/spec/erlang/etf/extensions/erlang-nil_spec.rb +0 -24
- data/spec/erlang/etf/extensions/erlang-pid_spec.rb +0 -33
- data/spec/erlang/etf/extensions/erlang-string_spec.rb +0 -41
- data/spec/erlang/etf/extensions/erlang-tuple_spec.rb +0 -57
- data/spec/erlang/etf/extensions/false_class_spec.rb +0 -29
- data/spec/erlang/etf/extensions/float_spec.rb +0 -24
- data/spec/erlang/etf/extensions/hash_spec.rb +0 -90
- data/spec/erlang/etf/extensions/integer_spec.rb +0 -259
- data/spec/erlang/etf/extensions/nil_class_spec.rb +0 -29
- data/spec/erlang/etf/extensions/object_spec.rb +0 -30
- data/spec/erlang/etf/extensions/regexp_spec.rb +0 -35
- data/spec/erlang/etf/extensions/string_spec.rb +0 -43
- data/spec/erlang/etf/extensions/symbol_spec.rb +0 -64
- data/spec/erlang/etf/extensions/time_spec.rb +0 -32
- data/spec/erlang/etf/extensions/true_class_spec.rb +0 -29
- data/spec/erlang/etf/float_spec.rb +0 -92
- data/spec/erlang/etf/fun_spec.rb +0 -132
- data/spec/erlang/etf/integer_spec.rb +0 -57
- data/spec/erlang/etf/large_big_spec.rb +0 -67
- data/spec/erlang/etf/large_tuple_spec.rb +0 -119
- data/spec/erlang/etf/list_spec.rb +0 -159
- data/spec/erlang/etf/map_spec.rb +0 -100
- data/spec/erlang/etf/new_float_spec.rb +0 -92
- data/spec/erlang/etf/new_fun_spec.rb +0 -146
- data/spec/erlang/etf/new_reference_spec.rb +0 -60
- data/spec/erlang/etf/nil_spec.rb +0 -50
- data/spec/erlang/etf/pid_spec.rb +0 -61
- data/spec/erlang/etf/port_spec.rb +0 -58
- data/spec/erlang/etf/reference_spec.rb +0 -58
- data/spec/erlang/etf/small_atom_spec.rb +0 -90
- data/spec/erlang/etf/small_atom_utf8_spec.rb +0 -90
- data/spec/erlang/etf/small_big_spec.rb +0 -67
- data/spec/erlang/etf/small_integer_spec.rb +0 -57
- data/spec/erlang/etf/small_tuple_spec.rb +0 -112
- data/spec/erlang/etf/string_spec.rb +0 -92
- data/spec/erlang/etf/term_spec.rb +0 -27
- data/spec/erlang/etf/terms_spec.rb +0 -23
- data/spec/erlang/etf_spec.rb +0 -23
- data/spec/erlang_spec.rb +0 -95
- data/spec/spec_helper.rb +0 -31
@@ -2,9 +2,9 @@ module Erlang
|
|
2
2
|
module ETF
|
3
3
|
|
4
4
|
#
|
5
|
-
# 1 | 1
|
6
|
-
# --- | ---
|
7
|
-
# 97 | Int
|
5
|
+
# | 1 | 1 |
|
6
|
+
# | --- | --- |
|
7
|
+
# | 97 | Int |
|
8
8
|
#
|
9
9
|
# Unsigned 8 bit integer.
|
10
10
|
#
|
@@ -13,21 +13,36 @@ module Erlang
|
|
13
13
|
# [`SMALL_INTEGER_EXT`]: http://erlang.org/doc/apps/erts/erl_ext_dist.html#SMALL_INTEGER_EXT
|
14
14
|
#
|
15
15
|
class SmallInteger
|
16
|
-
include Term
|
16
|
+
include Erlang::ETF::Term
|
17
17
|
|
18
|
-
|
18
|
+
UINT8 = Erlang::ETF::Term::UINT8
|
19
19
|
|
20
|
-
|
20
|
+
class << self
|
21
|
+
def [](term)
|
22
|
+
return term if term.kind_of?(Erlang::ETF::Integer)
|
23
|
+
return term if term.kind_of?(Erlang::ETF::LargeBig)
|
24
|
+
return term if term.kind_of?(Erlang::ETF::SmallBig)
|
25
|
+
return term if term.kind_of?(Erlang::ETF::SmallInteger)
|
26
|
+
term = Erlang.from(term)
|
27
|
+
return new(term)
|
28
|
+
end
|
21
29
|
|
22
|
-
|
30
|
+
def erlang_load(buffer)
|
31
|
+
term, = buffer.read(1).unpack(UINT8)
|
32
|
+
return new(Erlang.from(term))
|
33
|
+
end
|
34
|
+
end
|
23
35
|
|
24
|
-
def initialize(
|
25
|
-
|
36
|
+
def initialize(term)
|
37
|
+
raise ArgumentError, "term must be of type Integer" if not Erlang.is_integer(term)
|
38
|
+
@term = term
|
26
39
|
end
|
27
40
|
|
28
|
-
def
|
29
|
-
|
41
|
+
def erlang_dump(buffer = ::String.new.force_encoding(BINARY_ENCODING))
|
42
|
+
buffer << SMALL_INTEGER_EXT
|
43
|
+
buffer << [@term].pack(UINT8)
|
44
|
+
return buffer
|
30
45
|
end
|
31
46
|
end
|
32
47
|
end
|
33
|
-
end
|
48
|
+
end
|
@@ -2,9 +2,9 @@ module Erlang
|
|
2
2
|
module ETF
|
3
3
|
|
4
4
|
#
|
5
|
-
# 1 | 1 | N
|
6
|
-
# --- | ----- | --------
|
7
|
-
# 104 | Arity | Elements
|
5
|
+
# | 1 | 1 | N |
|
6
|
+
# | --- | ----- | -------- |
|
7
|
+
# | 104 | Arity | Elements |
|
8
8
|
#
|
9
9
|
# [`SMALL_TUPLE_EXT`] encodes a tuple. The `Arity` field is an unsigned
|
10
10
|
# byte that determines how many element that follows in the
|
@@ -15,46 +15,57 @@ module Erlang
|
|
15
15
|
# [`SMALL_TUPLE_EXT`]: http://erlang.org/doc/apps/erts/erl_ext_dist.html#SMALL_TUPLE_EXT
|
16
16
|
#
|
17
17
|
class SmallTuple
|
18
|
-
include Term
|
18
|
+
include Erlang::ETF::Term
|
19
19
|
|
20
|
-
|
20
|
+
UINT8 = Erlang::ETF::Term::UINT8
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
class << self
|
23
|
+
def [](term, elements = nil)
|
24
|
+
return term if term.kind_of?(Erlang::ETF::Term)
|
25
|
+
term = Erlang.from(term)
|
26
|
+
return new(term, elements)
|
27
|
+
end
|
25
28
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
29
|
+
def erlang_load(buffer)
|
30
|
+
arity, = buffer.read(1).unpack(UINT8)
|
31
|
+
elements = Array.new(arity)
|
32
|
+
arity.times { |i| elements[i] = Erlang::ETF.read_term(buffer) }
|
33
|
+
tuple = Erlang::Tuple[*elements]
|
34
|
+
return new(tuple, elements)
|
31
35
|
end
|
32
|
-
self
|
33
36
|
end
|
34
37
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
@elements = elements
|
38
|
+
def initialize(term, elements = nil)
|
39
|
+
raise ArgumentError, "term must be of type Tuple" if not Erlang.is_tuple(term)
|
40
|
+
@term = term
|
41
|
+
@elements = elements.freeze
|
39
42
|
end
|
40
43
|
|
41
|
-
def
|
42
|
-
|
43
|
-
|
44
|
+
def erlang_dump(buffer = ::String.new.force_encoding(BINARY_ENCODING))
|
45
|
+
buffer << SMALL_TUPLE_EXT
|
46
|
+
elements = @elements || @term
|
47
|
+
arity = elements.size
|
48
|
+
buffer << [arity].pack(UINT8)
|
49
|
+
elements.each { |element| Erlang::ETF.write_term(element, buffer) }
|
50
|
+
return buffer
|
44
51
|
end
|
45
52
|
|
46
|
-
def
|
47
|
-
elements
|
48
|
-
|
53
|
+
def inspect
|
54
|
+
if @elements.nil?
|
55
|
+
return super
|
56
|
+
else
|
57
|
+
return "#{self.class}[#{@term.inspect}, #{@elements.inspect}]"
|
58
|
+
end
|
49
59
|
end
|
50
60
|
|
51
|
-
def
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
61
|
+
def pretty_print(pp)
|
62
|
+
state = [@term]
|
63
|
+
state.push(@elements) if not @elements.nil?
|
64
|
+
return pp.group(1, "#{self.class}[", "]") do
|
65
|
+
pp.breakable ''
|
66
|
+
pp.seplist(state) { |obj| obj.pretty_print(pp) }
|
56
67
|
end
|
57
68
|
end
|
58
69
|
end
|
59
70
|
end
|
60
|
-
end
|
71
|
+
end
|
data/lib/erlang/etf/string.rb
CHANGED
@@ -2,9 +2,9 @@ module Erlang
|
|
2
2
|
module ETF
|
3
3
|
|
4
4
|
#
|
5
|
-
# 1 | 2 | Len
|
6
|
-
# --- | --- | ----------
|
7
|
-
# 107 | Len | Characters
|
5
|
+
# | 1 | 2 | Len |
|
6
|
+
# | --- | --- | ---------- |
|
7
|
+
# | 107 | Len | Characters |
|
8
8
|
#
|
9
9
|
# String does NOT have a corresponding Erlang representation, but
|
10
10
|
# is an optimization for sending lists of bytes (integer in the
|
@@ -19,33 +19,33 @@ module Erlang
|
|
19
19
|
# [`STRING_EXT`]: http://erlang.org/doc/apps/erts/erl_ext_dist.html#STRING_EXT
|
20
20
|
#
|
21
21
|
class String
|
22
|
-
include Term
|
22
|
+
include Erlang::ETF::Term
|
23
23
|
|
24
|
-
|
24
|
+
UINT16BE = Erlang::ETF::Term::UINT16BE
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
undef deserialize_characters
|
31
|
-
def deserialize_characters(buffer)
|
32
|
-
self.characters = buffer.read(len).from_utf8_binary
|
33
|
-
end
|
26
|
+
class << self
|
27
|
+
def [](term)
|
28
|
+
return new(term)
|
29
|
+
end
|
34
30
|
|
35
|
-
|
36
|
-
|
37
|
-
|
31
|
+
def erlang_load(buffer)
|
32
|
+
size, = buffer.read(2).unpack(UINT16BE)
|
33
|
+
data = buffer.read(size)
|
34
|
+
return new(Erlang::String[data])
|
35
|
+
end
|
38
36
|
end
|
39
37
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
@characters = characters
|
38
|
+
def initialize(term)
|
39
|
+
raise ArgumentError, "term must be of type Erlang::String" if not term.kind_of?(Erlang::String)
|
40
|
+
@term = term
|
44
41
|
end
|
45
42
|
|
46
|
-
def
|
47
|
-
|
43
|
+
def erlang_dump(buffer = ::String.new.force_encoding(BINARY_ENCODING))
|
44
|
+
buffer << STRING_EXT
|
45
|
+
buffer << [@term.size].pack(UINT16BE)
|
46
|
+
buffer << Erlang::ETF::Term.binary_encoding(@term.data)
|
47
|
+
return buffer
|
48
48
|
end
|
49
49
|
end
|
50
50
|
end
|
51
|
-
end
|
51
|
+
end
|
data/lib/erlang/etf/term.rb
CHANGED
@@ -1,7 +1,81 @@
|
|
1
1
|
module Erlang
|
2
2
|
module ETF
|
3
|
+
#
|
4
|
+
# See [`erts/emulator/beam/external.h`]
|
5
|
+
#
|
6
|
+
# [`erts/emulator/beam/external.h`]: https://github.com/erlang/otp/blob/master/erts/emulator/beam/external.h
|
7
|
+
#
|
3
8
|
module Term
|
4
9
|
|
10
|
+
BINARY_ENCODING = Encoding.find('binary')
|
11
|
+
|
12
|
+
ERLANG_MAGIC_BYTE = 131.chr.force_encoding(BINARY_ENCODING).freeze
|
13
|
+
SMALL_INTEGER_EXT = 97.freeze
|
14
|
+
INTEGER_EXT = 98.freeze
|
15
|
+
FLOAT_EXT = 99.freeze
|
16
|
+
ATOM_EXT = 100.freeze
|
17
|
+
REFERENCE_EXT = 101.freeze
|
18
|
+
PORT_EXT = 102.freeze
|
19
|
+
PID_EXT = 103.freeze
|
20
|
+
SMALL_TUPLE_EXT = 104.freeze
|
21
|
+
LARGE_TUPLE_EXT = 105.freeze
|
22
|
+
NIL_EXT = 106.freeze
|
23
|
+
STRING_EXT = 107.freeze
|
24
|
+
LIST_EXT = 108.freeze
|
25
|
+
BINARY_EXT = 109.freeze
|
26
|
+
SMALL_BIG_EXT = 110.freeze
|
27
|
+
LARGE_BIG_EXT = 111.freeze
|
28
|
+
NEW_REFERENCE_EXT = 114.freeze
|
29
|
+
SMALL_ATOM_EXT = 115.freeze
|
30
|
+
FUN_EXT = 117.freeze
|
31
|
+
NEW_FUN_EXT = 112.freeze
|
32
|
+
EXPORT_EXT = 113.freeze
|
33
|
+
BIT_BINARY_EXT = 77.freeze
|
34
|
+
NEW_FLOAT_EXT = 70.freeze
|
35
|
+
ATOM_UTF8_EXT = 118.freeze
|
36
|
+
SMALL_ATOM_UTF8_EXT = 119.freeze
|
37
|
+
MAP_EXT = 116.freeze
|
38
|
+
DIST_HEADER = 68.freeze # not implemented
|
39
|
+
ATOM_CACHE_REF = 82.freeze # not implemented
|
40
|
+
ATOM_INTERNAL_REF2 = 73.freeze # not implemented
|
41
|
+
ATOM_INTERNAL_REF3 = 75.freeze # not implemented
|
42
|
+
BINARY_INTERNAL_REF = 74.freeze # not implemented
|
43
|
+
BIT_BINARY_INTERNAL_REF = 76.freeze # not implemented
|
44
|
+
COMPRESSED = 80.freeze
|
45
|
+
|
46
|
+
INT8 = 'c'.freeze # 8-bit signed (signed char)
|
47
|
+
INT16 = 's'.freeze # 16-bit signed, native endian (int16_t)
|
48
|
+
INT32 = 'l'.freeze # 32-bit signed, native endian (int32_t)
|
49
|
+
INT64 = 'q'.freeze # 64-bit signed, native endian (int64_t)
|
50
|
+
INT128 = 'qq'.freeze # 128-bit signed, native endian (int128_t)
|
51
|
+
INT16BE = 's>'.freeze # 16-bit signed, big-endian
|
52
|
+
INT32BE = 'l>'.freeze # 32-bit signed, big-endian
|
53
|
+
INT64BE = 'q>'.freeze # 64-bit signed, big-endian
|
54
|
+
INT128BE = 'q>q>'.freeze # 128-bit signed, big-endian
|
55
|
+
INT16LE = 's<'.freeze # 16-bit signed, little-endian
|
56
|
+
INT32LE = 'l<'.freeze # 32-bit signed, little-endian
|
57
|
+
INT64LE = 'q<'.freeze # 64-bit signed, little-endian
|
58
|
+
INT128LE = 'q<q<'.freeze # 128-bit signed, little-endian
|
59
|
+
UINT8 = 'C'.freeze # 8-bit unsigned (unsigned char)
|
60
|
+
UINT16 = 'S'.freeze # 16-bit unsigned, native endian (uint16_t)
|
61
|
+
UINT32 = 'L'.freeze # 32-bit unsigned, native endian (uint32_t)
|
62
|
+
UINT64 = 'Q'.freeze # 64-bit unsigned, native endian (uint64_t)
|
63
|
+
UINT128 = 'QQ'.freeze # 128-bit unsigned, native endian (uint128_t)
|
64
|
+
UINT16BE = 'n'.freeze # 16-bit unsigned, network (big-endian) byte order
|
65
|
+
UINT32BE = 'N'.freeze # 32-bit unsigned, network (big-endian) byte order
|
66
|
+
UINT64BE = 'Q>'.freeze # 64-bit unsigned, network (big-endian) byte order
|
67
|
+
UINT128BE = 'Q>Q>'.freeze # 128-bit unsigned, network (big-endian) byte order
|
68
|
+
UINT16LE = 'v'.freeze # 16-bit unsigned, VAX (little-endian) byte order
|
69
|
+
UINT32LE = 'V'.freeze # 32-bit unsigned, VAX (little-endian) byte order
|
70
|
+
UINT64LE = 'Q<'.freeze # 64-bit unsigned, VAX (little-endian) byte order
|
71
|
+
UINT128LE = 'Q<Q<'.freeze # 128-bit unsigned, VAX (little-endian) byte order
|
72
|
+
SINGLE = 'F'.freeze # 32-bit single-precision, native format
|
73
|
+
DOUBLE = 'D'.freeze # 64-bit double-precision, native format
|
74
|
+
SINGLEBE = 'g'.freeze # 32-bit sinlge-precision, network (big-endian) byte order
|
75
|
+
DOUBLEBE = 'G'.freeze # 64-bit double-precision, network (big-endian) byte order
|
76
|
+
SINGLELE = 'e'.freeze # 32-bit sinlge-precision, little-endian byte order
|
77
|
+
DOUBLELE = 'E'.freeze # 64-bit double-precision, little-endian byte order
|
78
|
+
|
5
79
|
class << self
|
6
80
|
|
7
81
|
# Extends the including class with +ClassMethods+.
|
@@ -9,93 +83,58 @@ module Erlang
|
|
9
83
|
# @param [Class] subclass the inheriting class
|
10
84
|
def included(base)
|
11
85
|
super
|
12
|
-
|
13
|
-
base.send(:include, ::
|
86
|
+
# base.send(:include, ::Binary::Protocol)
|
87
|
+
base.send(:include, Erlang::Immutable)
|
14
88
|
base.extend ClassMethods
|
89
|
+
base.send(:include, ::Comparable)
|
90
|
+
base.class_eval do
|
91
|
+
attr_reader :term
|
92
|
+
alias :to_erlang :term
|
93
|
+
memoize :erlang_external_type
|
94
|
+
end
|
15
95
|
end
|
16
|
-
|
17
96
|
private :included
|
18
97
|
end
|
19
98
|
|
20
|
-
BERT_PREFIX = "bert".freeze
|
21
|
-
|
22
|
-
BIN_LSB_PACK = 'b*'.freeze
|
23
|
-
BIN_MSB_PACK = 'B*'.freeze
|
24
|
-
|
25
99
|
module ClassMethods
|
100
|
+
end
|
26
101
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
__define_default__(name, options[:default])
|
33
|
-
else
|
34
|
-
attr_accessor name
|
35
|
-
end
|
36
|
-
|
37
|
-
if options[:type] == :array
|
38
|
-
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
39
|
-
def deserialize_#{name}(buffer)
|
40
|
-
raise NotImplementedError
|
41
|
-
end
|
42
|
-
RUBY
|
43
|
-
else
|
44
|
-
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
45
|
-
def deserialize_#{name}(buffer)
|
46
|
-
self.#{name} = Terms.deserialize(buffer)
|
47
|
-
end
|
48
|
-
RUBY
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
if options[:type] == :array
|
53
|
-
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
54
|
-
def serialize_#{name}(buffer)
|
55
|
-
#{name}.each do |term|
|
56
|
-
term.serialize(buffer)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
RUBY
|
60
|
-
else
|
61
|
-
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
62
|
-
def serialize_#{name}(buffer)
|
63
|
-
#{name}.serialize(buffer)
|
64
|
-
end
|
65
|
-
RUBY
|
66
|
-
end
|
102
|
+
def self.binary_encoding(string)
|
103
|
+
string = string.dup if string.frozen?
|
104
|
+
string = string.force_encoding(BINARY_ENCODING)
|
105
|
+
return string
|
106
|
+
end
|
67
107
|
|
68
|
-
|
69
|
-
|
70
|
-
|
108
|
+
def erlang_external_type
|
109
|
+
type = self.class.name.split('::').last.dup
|
110
|
+
type.gsub!('::', '/')
|
111
|
+
type.gsub!(/(?:([A-Za-z\d])|^)(UTF8)(?=\b|[^a-z])/) { "#{$1}#{$1 && '_'}#{$2.downcase}" }
|
112
|
+
type.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
|
113
|
+
type.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
114
|
+
type.tr!("-", "_")
|
115
|
+
type.downcase!
|
116
|
+
return type.intern
|
117
|
+
end
|
71
118
|
|
119
|
+
def inspect
|
120
|
+
return "#{self.class.name}[#{term.inspect}]"
|
72
121
|
end
|
73
122
|
|
74
|
-
def
|
75
|
-
|
76
|
-
self.class.fields.all? do |field|
|
77
|
-
__send__(field) == other.__send__(field)
|
78
|
-
end
|
123
|
+
def hash
|
124
|
+
return @term.hash
|
79
125
|
end
|
80
126
|
|
81
|
-
def
|
82
|
-
|
83
|
-
word.gsub!('::', '/')
|
84
|
-
word.gsub!(/(?:([A-Za-z\d])|^)(UTF8)(?=\b|[^a-z])/) { "#{$1}#{$1 && '_'}#{$2.downcase}" }
|
85
|
-
word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
|
86
|
-
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
87
|
-
word.tr!("-", "_")
|
88
|
-
word.downcase!
|
89
|
-
word.intern
|
127
|
+
def eql?(other)
|
128
|
+
return @term.eql?(other)
|
90
129
|
end
|
91
130
|
|
92
|
-
def
|
93
|
-
self
|
131
|
+
def <=>(other)
|
132
|
+
return Erlang.compare(self, other)
|
94
133
|
end
|
95
134
|
|
96
|
-
def
|
97
|
-
self
|
135
|
+
def to_erlang_etf
|
136
|
+
return self
|
98
137
|
end
|
99
138
|
end
|
100
139
|
end
|
101
|
-
end
|
140
|
+
end
|
data/lib/erlang/etf/version.rb
CHANGED
metadata
CHANGED
@@ -1,131 +1,99 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: erlang-etf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Bennett
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-06-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: binary-protocol
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - '>='
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - '>='
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: erlang-terms
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
30
16
|
requirements:
|
31
|
-
- -
|
17
|
+
- - "~>"
|
32
18
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
19
|
+
version: '2.0'
|
34
20
|
type: :runtime
|
35
21
|
prerelease: false
|
36
22
|
version_requirements: !ruby/object:Gem::Requirement
|
37
23
|
requirements:
|
38
|
-
- -
|
24
|
+
- - "~>"
|
39
25
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
26
|
+
version: '2.0'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: bundler
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
44
30
|
requirements:
|
45
|
-
- - ~>
|
31
|
+
- - "~>"
|
46
32
|
- !ruby/object:Gem::Version
|
47
|
-
version: '1.
|
33
|
+
version: '1.15'
|
48
34
|
type: :development
|
49
35
|
prerelease: false
|
50
36
|
version_requirements: !ruby/object:Gem::Requirement
|
51
37
|
requirements:
|
52
|
-
- - ~>
|
38
|
+
- - "~>"
|
53
39
|
- !ruby/object:Gem::Version
|
54
|
-
version: '1.
|
40
|
+
version: '1.15'
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: rake
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
58
44
|
requirements:
|
59
|
-
- -
|
45
|
+
- - "~>"
|
60
46
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
47
|
+
version: '12.0'
|
62
48
|
type: :development
|
63
49
|
prerelease: false
|
64
50
|
version_requirements: !ruby/object:Gem::Requirement
|
65
51
|
requirements:
|
66
|
-
- -
|
52
|
+
- - "~>"
|
67
53
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
54
|
+
version: '12.0'
|
69
55
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
56
|
+
name: minitest
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
72
58
|
requirements:
|
73
|
-
- -
|
59
|
+
- - ">="
|
74
60
|
- !ruby/object:Gem::Version
|
75
61
|
version: '0'
|
76
62
|
type: :development
|
77
63
|
prerelease: false
|
78
64
|
version_requirements: !ruby/object:Gem::Requirement
|
79
65
|
requirements:
|
80
|
-
- -
|
66
|
+
- - ">="
|
81
67
|
- !ruby/object:Gem::Version
|
82
68
|
version: '0'
|
83
69
|
description: Erlang External Term Format (ETF) for Ruby
|
84
70
|
email:
|
85
|
-
- andrew@
|
71
|
+
- andrew@pixid.com
|
86
72
|
executables: []
|
87
73
|
extensions: []
|
88
74
|
extra_rdoc_files: []
|
89
75
|
files:
|
90
|
-
- .coveralls.yml
|
91
|
-
- .
|
92
|
-
- .
|
93
|
-
- .
|
94
|
-
- .
|
76
|
+
- ".coveralls.yml"
|
77
|
+
- ".editorconfig"
|
78
|
+
- ".gitignore"
|
79
|
+
- ".ruby-gemset"
|
80
|
+
- ".ruby-version"
|
81
|
+
- ".travis.yml"
|
82
|
+
- ".yardopts"
|
83
|
+
- CHANGELOG.md
|
95
84
|
- Gemfile
|
96
85
|
- LICENSE.txt
|
97
86
|
- README.md
|
98
87
|
- Rakefile
|
99
88
|
- erlang-etf.gemspec
|
89
|
+
- lib/erlang-etf.rb
|
100
90
|
- lib/erlang/etf.rb
|
101
91
|
- lib/erlang/etf/atom.rb
|
102
92
|
- lib/erlang/etf/atom_utf8.rb
|
103
|
-
- lib/erlang/etf/bert.rb
|
104
93
|
- lib/erlang/etf/binary.rb
|
105
94
|
- lib/erlang/etf/bit_binary.rb
|
106
95
|
- lib/erlang/etf/compressed.rb
|
107
96
|
- lib/erlang/etf/export.rb
|
108
|
-
- lib/erlang/etf/extensions.rb
|
109
|
-
- lib/erlang/etf/extensions/array.rb
|
110
|
-
- lib/erlang/etf/extensions/big_decimal.rb
|
111
|
-
- lib/erlang/etf/extensions/erlang-export.rb
|
112
|
-
- lib/erlang/etf/extensions/erlang-list.rb
|
113
|
-
- lib/erlang/etf/extensions/erlang-map.rb
|
114
|
-
- lib/erlang/etf/extensions/erlang-nil.rb
|
115
|
-
- lib/erlang/etf/extensions/erlang-pid.rb
|
116
|
-
- lib/erlang/etf/extensions/erlang-string.rb
|
117
|
-
- lib/erlang/etf/extensions/erlang-tuple.rb
|
118
|
-
- lib/erlang/etf/extensions/false_class.rb
|
119
|
-
- lib/erlang/etf/extensions/float.rb
|
120
|
-
- lib/erlang/etf/extensions/hash.rb
|
121
|
-
- lib/erlang/etf/extensions/integer.rb
|
122
|
-
- lib/erlang/etf/extensions/nil_class.rb
|
123
|
-
- lib/erlang/etf/extensions/object.rb
|
124
|
-
- lib/erlang/etf/extensions/regexp.rb
|
125
|
-
- lib/erlang/etf/extensions/string.rb
|
126
|
-
- lib/erlang/etf/extensions/symbol.rb
|
127
|
-
- lib/erlang/etf/extensions/time.rb
|
128
|
-
- lib/erlang/etf/extensions/true_class.rb
|
129
97
|
- lib/erlang/etf/float.rb
|
130
98
|
- lib/erlang/etf/fun.rb
|
131
99
|
- lib/erlang/etf/integer.rb
|
@@ -147,60 +115,8 @@ files:
|
|
147
115
|
- lib/erlang/etf/small_tuple.rb
|
148
116
|
- lib/erlang/etf/string.rb
|
149
117
|
- lib/erlang/etf/term.rb
|
150
|
-
- lib/erlang/etf/terms.rb
|
151
118
|
- lib/erlang/etf/version.rb
|
152
|
-
|
153
|
-
- spec/erlang/etf/atom_utf8_spec.rb
|
154
|
-
- spec/erlang/etf/binary_spec.rb
|
155
|
-
- spec/erlang/etf/bit_binary_spec.rb
|
156
|
-
- spec/erlang/etf/compressed_spec.rb
|
157
|
-
- spec/erlang/etf/export_spec.rb
|
158
|
-
- spec/erlang/etf/extensions/array_spec.rb
|
159
|
-
- spec/erlang/etf/extensions/big_decimal_spec.rb
|
160
|
-
- spec/erlang/etf/extensions/erlang-export_spec.rb
|
161
|
-
- spec/erlang/etf/extensions/erlang-list_spec.rb
|
162
|
-
- spec/erlang/etf/extensions/erlang-map_spec.rb
|
163
|
-
- spec/erlang/etf/extensions/erlang-nil_spec.rb
|
164
|
-
- spec/erlang/etf/extensions/erlang-pid_spec.rb
|
165
|
-
- spec/erlang/etf/extensions/erlang-string_spec.rb
|
166
|
-
- spec/erlang/etf/extensions/erlang-tuple_spec.rb
|
167
|
-
- spec/erlang/etf/extensions/false_class_spec.rb
|
168
|
-
- spec/erlang/etf/extensions/float_spec.rb
|
169
|
-
- spec/erlang/etf/extensions/hash_spec.rb
|
170
|
-
- spec/erlang/etf/extensions/integer_spec.rb
|
171
|
-
- spec/erlang/etf/extensions/nil_class_spec.rb
|
172
|
-
- spec/erlang/etf/extensions/object_spec.rb
|
173
|
-
- spec/erlang/etf/extensions/regexp_spec.rb
|
174
|
-
- spec/erlang/etf/extensions/string_spec.rb
|
175
|
-
- spec/erlang/etf/extensions/symbol_spec.rb
|
176
|
-
- spec/erlang/etf/extensions/time_spec.rb
|
177
|
-
- spec/erlang/etf/extensions/true_class_spec.rb
|
178
|
-
- spec/erlang/etf/float_spec.rb
|
179
|
-
- spec/erlang/etf/fun_spec.rb
|
180
|
-
- spec/erlang/etf/integer_spec.rb
|
181
|
-
- spec/erlang/etf/large_big_spec.rb
|
182
|
-
- spec/erlang/etf/large_tuple_spec.rb
|
183
|
-
- spec/erlang/etf/list_spec.rb
|
184
|
-
- spec/erlang/etf/map_spec.rb
|
185
|
-
- spec/erlang/etf/new_float_spec.rb
|
186
|
-
- spec/erlang/etf/new_fun_spec.rb
|
187
|
-
- spec/erlang/etf/new_reference_spec.rb
|
188
|
-
- spec/erlang/etf/nil_spec.rb
|
189
|
-
- spec/erlang/etf/pid_spec.rb
|
190
|
-
- spec/erlang/etf/port_spec.rb
|
191
|
-
- spec/erlang/etf/reference_spec.rb
|
192
|
-
- spec/erlang/etf/small_atom_spec.rb
|
193
|
-
- spec/erlang/etf/small_atom_utf8_spec.rb
|
194
|
-
- spec/erlang/etf/small_big_spec.rb
|
195
|
-
- spec/erlang/etf/small_integer_spec.rb
|
196
|
-
- spec/erlang/etf/small_tuple_spec.rb
|
197
|
-
- spec/erlang/etf/string_spec.rb
|
198
|
-
- spec/erlang/etf/term_spec.rb
|
199
|
-
- spec/erlang/etf/terms_spec.rb
|
200
|
-
- spec/erlang/etf_spec.rb
|
201
|
-
- spec/erlang_spec.rb
|
202
|
-
- spec/spec_helper.rb
|
203
|
-
homepage: https://github.com/potatosalad/erlang-etf
|
119
|
+
homepage: https://github.com/potatosalad/ruby-erlang-etf
|
204
120
|
licenses:
|
205
121
|
- MIT
|
206
122
|
metadata: {}
|
@@ -210,70 +126,18 @@ require_paths:
|
|
210
126
|
- lib
|
211
127
|
required_ruby_version: !ruby/object:Gem::Requirement
|
212
128
|
requirements:
|
213
|
-
- -
|
129
|
+
- - ">="
|
214
130
|
- !ruby/object:Gem::Version
|
215
131
|
version: '0'
|
216
132
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
217
133
|
requirements:
|
218
|
-
- -
|
134
|
+
- - ">="
|
219
135
|
- !ruby/object:Gem::Version
|
220
136
|
version: '0'
|
221
137
|
requirements: []
|
222
138
|
rubyforge_project:
|
223
|
-
rubygems_version: 2.
|
139
|
+
rubygems_version: 2.6.11
|
224
140
|
signing_key:
|
225
141
|
specification_version: 4
|
226
142
|
summary: Erlang External Term Format (ETF) for Ruby
|
227
|
-
test_files:
|
228
|
-
- spec/erlang/etf/atom_spec.rb
|
229
|
-
- spec/erlang/etf/atom_utf8_spec.rb
|
230
|
-
- spec/erlang/etf/binary_spec.rb
|
231
|
-
- spec/erlang/etf/bit_binary_spec.rb
|
232
|
-
- spec/erlang/etf/compressed_spec.rb
|
233
|
-
- spec/erlang/etf/export_spec.rb
|
234
|
-
- spec/erlang/etf/extensions/array_spec.rb
|
235
|
-
- spec/erlang/etf/extensions/big_decimal_spec.rb
|
236
|
-
- spec/erlang/etf/extensions/erlang-export_spec.rb
|
237
|
-
- spec/erlang/etf/extensions/erlang-list_spec.rb
|
238
|
-
- spec/erlang/etf/extensions/erlang-map_spec.rb
|
239
|
-
- spec/erlang/etf/extensions/erlang-nil_spec.rb
|
240
|
-
- spec/erlang/etf/extensions/erlang-pid_spec.rb
|
241
|
-
- spec/erlang/etf/extensions/erlang-string_spec.rb
|
242
|
-
- spec/erlang/etf/extensions/erlang-tuple_spec.rb
|
243
|
-
- spec/erlang/etf/extensions/false_class_spec.rb
|
244
|
-
- spec/erlang/etf/extensions/float_spec.rb
|
245
|
-
- spec/erlang/etf/extensions/hash_spec.rb
|
246
|
-
- spec/erlang/etf/extensions/integer_spec.rb
|
247
|
-
- spec/erlang/etf/extensions/nil_class_spec.rb
|
248
|
-
- spec/erlang/etf/extensions/object_spec.rb
|
249
|
-
- spec/erlang/etf/extensions/regexp_spec.rb
|
250
|
-
- spec/erlang/etf/extensions/string_spec.rb
|
251
|
-
- spec/erlang/etf/extensions/symbol_spec.rb
|
252
|
-
- spec/erlang/etf/extensions/time_spec.rb
|
253
|
-
- spec/erlang/etf/extensions/true_class_spec.rb
|
254
|
-
- spec/erlang/etf/float_spec.rb
|
255
|
-
- spec/erlang/etf/fun_spec.rb
|
256
|
-
- spec/erlang/etf/integer_spec.rb
|
257
|
-
- spec/erlang/etf/large_big_spec.rb
|
258
|
-
- spec/erlang/etf/large_tuple_spec.rb
|
259
|
-
- spec/erlang/etf/list_spec.rb
|
260
|
-
- spec/erlang/etf/map_spec.rb
|
261
|
-
- spec/erlang/etf/new_float_spec.rb
|
262
|
-
- spec/erlang/etf/new_fun_spec.rb
|
263
|
-
- spec/erlang/etf/new_reference_spec.rb
|
264
|
-
- spec/erlang/etf/nil_spec.rb
|
265
|
-
- spec/erlang/etf/pid_spec.rb
|
266
|
-
- spec/erlang/etf/port_spec.rb
|
267
|
-
- spec/erlang/etf/reference_spec.rb
|
268
|
-
- spec/erlang/etf/small_atom_spec.rb
|
269
|
-
- spec/erlang/etf/small_atom_utf8_spec.rb
|
270
|
-
- spec/erlang/etf/small_big_spec.rb
|
271
|
-
- spec/erlang/etf/small_integer_spec.rb
|
272
|
-
- spec/erlang/etf/small_tuple_spec.rb
|
273
|
-
- spec/erlang/etf/string_spec.rb
|
274
|
-
- spec/erlang/etf/term_spec.rb
|
275
|
-
- spec/erlang/etf/terms_spec.rb
|
276
|
-
- spec/erlang/etf_spec.rb
|
277
|
-
- spec/erlang_spec.rb
|
278
|
-
- spec/spec_helper.rb
|
279
|
-
has_rdoc:
|
143
|
+
test_files: []
|