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.
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: []