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 | 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
- uint8 :tag, always: Terms::SMALL_INTEGER_EXT
18
+ UINT8 = Erlang::ETF::Term::UINT8
19
19
 
20
- uint8 :int
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
- finalize
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(int)
25
- @int = int
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 __ruby_evolve__
29
- int
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
- uint8 :tag, always: Terms::SMALL_TUPLE_EXT
20
+ UINT8 = Erlang::ETF::Term::UINT8
21
21
 
22
- uint8 :arity, always: -> { elements.size }
23
-
24
- term :elements, type: :array
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
- deserialize do |buffer|
27
- arity, = buffer.read(BYTES_8).unpack(UINT8_PACK)
28
- self.elements = []
29
- arity.times do
30
- self.elements << Terms.deserialize(buffer)
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
- finalize
36
-
37
- def initialize(elements)
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 serialize_header(buffer)
42
- serialize_tag(buffer)
43
- serialize_arity(buffer)
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 bert?
47
- elements[0].respond_to?(:atom_name) &&
48
- elements[0].atom_name == BERT_PREFIX
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 __ruby_evolve__
52
- if bert?
53
- ::Erlang::ETF::BERT.evolve(self)
54
- else
55
- ::Erlang::Tuple[*elements.map(&:__ruby_evolve__)]
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
@@ -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
- uint8 :tag, always: Terms::STRING_EXT
24
+ UINT16BE = Erlang::ETF::Term::UINT16BE
25
25
 
26
- uint16be :len, default: 0 do
27
- string :characters
28
- end
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
- undef serialize_characters
36
- def serialize_characters(buffer)
37
- buffer << characters.to_utf8_binary
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
- finalize
41
-
42
- def initialize(characters)
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 __ruby_evolve__
47
- ::Erlang::String.new(characters)
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
@@ -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, ::Binary::Protocol)
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
- def term(name, options = {})
28
- if options.key?(:always)
29
- __define_always__(name, options[:always])
30
- else
31
- if options.key?(:default)
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
- serialization << :"serialize_#{name}"
69
- fields << name
70
- end
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 ==(other)
75
- self.class === other &&
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 __erlang_type__
82
- word = self.class.name.split('::').last.dup
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 __erlang_evolve__
93
- self
131
+ def <=>(other)
132
+ return Erlang.compare(self, other)
94
133
  end
95
134
 
96
- def __ruby_evolve__
97
- self
135
+ def to_erlang_etf
136
+ return self
98
137
  end
99
138
  end
100
139
  end
101
- end
140
+ end
@@ -1,5 +1,5 @@
1
1
  module Erlang
2
2
  module ETF
3
- VERSION = "1.1.1"
3
+ VERSION = "2.0.0"
4
4
  end
5
5
  end
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: 1.1.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Bennett
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2014-03-06 00:00:00.000000000 Z
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: 1.1.0
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: 1.1.0
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.3'
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.3'
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: rspec
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@delorum.com
71
+ - andrew@pixid.com
86
72
  executables: []
87
73
  extensions: []
88
74
  extra_rdoc_files: []
89
75
  files:
90
- - .coveralls.yml
91
- - .gitignore
92
- - .rspec
93
- - .travis.yml
94
- - .yardopts
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
- - spec/erlang/etf/atom_spec.rb
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.2.1
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: []