erlang-etf 1.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 (107) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +4 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +49 -0
  8. data/Rakefile +6 -0
  9. data/erlang-etf.gemspec +30 -0
  10. data/lib/erlang/etf.rb +40 -0
  11. data/lib/erlang/etf/atom.rb +46 -0
  12. data/lib/erlang/etf/atom_utf8.rb +44 -0
  13. data/lib/erlang/etf/bert.rb +74 -0
  14. data/lib/erlang/etf/binary.rb +44 -0
  15. data/lib/erlang/etf/bit_binary.rb +47 -0
  16. data/lib/erlang/etf/export.rb +44 -0
  17. data/lib/erlang/etf/extensions.rb +157 -0
  18. data/lib/erlang/etf/extensions/array.rb +29 -0
  19. data/lib/erlang/etf/extensions/big_decimal.rb +22 -0
  20. data/lib/erlang/etf/extensions/erlang-export.rb +26 -0
  21. data/lib/erlang/etf/extensions/erlang-list.rb +31 -0
  22. data/lib/erlang/etf/extensions/erlang-nil.rb +22 -0
  23. data/lib/erlang/etf/extensions/erlang-pid.rb +22 -0
  24. data/lib/erlang/etf/extensions/erlang-string.rb +22 -0
  25. data/lib/erlang/etf/extensions/erlang-tuple.rb +31 -0
  26. data/lib/erlang/etf/extensions/false_class.rb +28 -0
  27. data/lib/erlang/etf/extensions/float.rb +20 -0
  28. data/lib/erlang/etf/extensions/hash.rb +32 -0
  29. data/lib/erlang/etf/extensions/integer.rb +48 -0
  30. data/lib/erlang/etf/extensions/nil_class.rb +29 -0
  31. data/lib/erlang/etf/extensions/object.rb +24 -0
  32. data/lib/erlang/etf/extensions/regexp.rb +34 -0
  33. data/lib/erlang/etf/extensions/string.rb +35 -0
  34. data/lib/erlang/etf/extensions/symbol.rb +45 -0
  35. data/lib/erlang/etf/extensions/time.rb +29 -0
  36. data/lib/erlang/etf/extensions/true_class.rb +28 -0
  37. data/lib/erlang/etf/float.rb +57 -0
  38. data/lib/erlang/etf/fun.rb +67 -0
  39. data/lib/erlang/etf/integer.rb +29 -0
  40. data/lib/erlang/etf/large_big.rb +53 -0
  41. data/lib/erlang/etf/large_tuple.rb +55 -0
  42. data/lib/erlang/etf/list.rb +50 -0
  43. data/lib/erlang/etf/new_float.rb +33 -0
  44. data/lib/erlang/etf/new_fun.rb +98 -0
  45. data/lib/erlang/etf/new_reference.rb +59 -0
  46. data/lib/erlang/etf/nil.rb +23 -0
  47. data/lib/erlang/etf/pid.rb +45 -0
  48. data/lib/erlang/etf/port.rb +34 -0
  49. data/lib/erlang/etf/reference.rb +41 -0
  50. data/lib/erlang/etf/small_atom.rb +48 -0
  51. data/lib/erlang/etf/small_atom_utf8.rb +44 -0
  52. data/lib/erlang/etf/small_big.rb +59 -0
  53. data/lib/erlang/etf/small_integer.rb +29 -0
  54. data/lib/erlang/etf/small_tuple.rb +56 -0
  55. data/lib/erlang/etf/string.rb +46 -0
  56. data/lib/erlang/etf/term.rb +101 -0
  57. data/lib/erlang/etf/terms.rb +105 -0
  58. data/lib/erlang/etf/version.rb +5 -0
  59. data/spec/erlang/etf/atom_spec.rb +90 -0
  60. data/spec/erlang/etf/atom_utf8_spec.rb +90 -0
  61. data/spec/erlang/etf/binary_spec.rb +90 -0
  62. data/spec/erlang/etf/bit_binary_spec.rb +99 -0
  63. data/spec/erlang/etf/export_spec.rb +58 -0
  64. data/spec/erlang/etf/extensions/array_spec.rb +40 -0
  65. data/spec/erlang/etf/extensions/big_decimal_spec.rb +26 -0
  66. data/spec/erlang/etf/extensions/erlang-export_spec.rb +32 -0
  67. data/spec/erlang/etf/extensions/erlang-list_spec.rb +76 -0
  68. data/spec/erlang/etf/extensions/erlang-nil_spec.rb +24 -0
  69. data/spec/erlang/etf/extensions/erlang-pid_spec.rb +33 -0
  70. data/spec/erlang/etf/extensions/erlang-string_spec.rb +26 -0
  71. data/spec/erlang/etf/extensions/erlang-tuple_spec.rb +56 -0
  72. data/spec/erlang/etf/extensions/false_class_spec.rb +29 -0
  73. data/spec/erlang/etf/extensions/float_spec.rb +24 -0
  74. data/spec/erlang/etf/extensions/hash_spec.rb +90 -0
  75. data/spec/erlang/etf/extensions/integer_spec.rb +259 -0
  76. data/spec/erlang/etf/extensions/nil_class_spec.rb +29 -0
  77. data/spec/erlang/etf/extensions/object_spec.rb +30 -0
  78. data/spec/erlang/etf/extensions/regexp_spec.rb +35 -0
  79. data/spec/erlang/etf/extensions/string_spec.rb +43 -0
  80. data/spec/erlang/etf/extensions/symbol_spec.rb +64 -0
  81. data/spec/erlang/etf/extensions/time_spec.rb +32 -0
  82. data/spec/erlang/etf/extensions/true_class_spec.rb +29 -0
  83. data/spec/erlang/etf/float_spec.rb +92 -0
  84. data/spec/erlang/etf/fun_spec.rb +132 -0
  85. data/spec/erlang/etf/integer_spec.rb +57 -0
  86. data/spec/erlang/etf/large_big_spec.rb +67 -0
  87. data/spec/erlang/etf/large_tuple_spec.rb +119 -0
  88. data/spec/erlang/etf/list_spec.rb +159 -0
  89. data/spec/erlang/etf/new_float_spec.rb +92 -0
  90. data/spec/erlang/etf/new_fun_spec.rb +146 -0
  91. data/spec/erlang/etf/new_reference_spec.rb +60 -0
  92. data/spec/erlang/etf/nil_spec.rb +50 -0
  93. data/spec/erlang/etf/pid_spec.rb +61 -0
  94. data/spec/erlang/etf/port_spec.rb +58 -0
  95. data/spec/erlang/etf/reference_spec.rb +58 -0
  96. data/spec/erlang/etf/small_atom_spec.rb +90 -0
  97. data/spec/erlang/etf/small_atom_utf8_spec.rb +90 -0
  98. data/spec/erlang/etf/small_big_spec.rb +67 -0
  99. data/spec/erlang/etf/small_integer_spec.rb +57 -0
  100. data/spec/erlang/etf/small_tuple_spec.rb +112 -0
  101. data/spec/erlang/etf/string_spec.rb +92 -0
  102. data/spec/erlang/etf/term_spec.rb +27 -0
  103. data/spec/erlang/etf/terms_spec.rb +23 -0
  104. data/spec/erlang/etf_spec.rb +23 -0
  105. data/spec/erlang_spec.rb +77 -0
  106. data/spec/spec_helper.rb +7 -0
  107. metadata +310 -0
@@ -0,0 +1,44 @@
1
+ module Erlang
2
+ module ETF
3
+
4
+ #
5
+ # 1 | N1 | N2 | N3
6
+ # --- | ------ | -------- | -----
7
+ # 113 | Module | Function | Arity
8
+ #
9
+ # This term is the encoding for external funs: fun M:F/A.
10
+ #
11
+ # Module and Function are atoms (encoded using ATOM_EXT,
12
+ # SMALL_ATOM_EXT or ATOM_CACHE_REF).
13
+ #
14
+ # Arity is an integer encoded using SMALL_INTEGER_EXT.
15
+ #
16
+ class Export
17
+ include Term
18
+
19
+ uint8 :tag, always: Terms::EXPORT_EXT
20
+
21
+ term :mod # atom, small_atom
22
+
23
+ term :function # atom, small_atom
24
+
25
+ term :arity # small_integer
26
+
27
+ finalize
28
+
29
+ def initialize(mod, function, arity)
30
+ self.mod = mod
31
+ self.function = function
32
+ self.arity = arity
33
+ end
34
+
35
+ def __ruby_evolve__
36
+ ::Erlang::Export.new(
37
+ mod.__ruby_evolve__,
38
+ function.__ruby_evolve__,
39
+ arity.__ruby_evolve__
40
+ )
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,157 @@
1
+ require "erlang/etf/extensions/object"
2
+
3
+ module Erlang
4
+ module ETF
5
+ module Extensions
6
+
7
+ # @private
8
+ class ::Object
9
+ extend Erlang::ETF::Extensions::Object::ClassMethods
10
+ include Erlang::ETF::Extensions::Object
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+ require "erlang/etf/extensions/erlang-export"
17
+ require "erlang/etf/extensions/erlang-list"
18
+ require "erlang/etf/extensions/erlang-nil"
19
+ require "erlang/etf/extensions/erlang-pid"
20
+ require "erlang/etf/extensions/erlang-string"
21
+ require "erlang/etf/extensions/erlang-tuple"
22
+
23
+ module Erlang
24
+ module ETF
25
+ module Extensions
26
+
27
+ # @private
28
+ class ::Erlang::Export
29
+ extend Erlang::ETF::Extensions::ErlangExport::ClassMethods
30
+ include Erlang::ETF::Extensions::ErlangExport
31
+ end
32
+
33
+ # @private
34
+ class ::Erlang::List
35
+ extend Erlang::ETF::Extensions::ErlangList::ClassMethods
36
+ include Erlang::ETF::Extensions::ErlangList
37
+ end
38
+
39
+ # @private
40
+ class ::Erlang::Nil
41
+ extend Erlang::ETF::Extensions::ErlangNil::ClassMethods
42
+ include Erlang::ETF::Extensions::ErlangNil
43
+ end
44
+
45
+ # @private
46
+ class ::Erlang::Pid
47
+ extend Erlang::ETF::Extensions::ErlangPid::ClassMethods
48
+ include Erlang::ETF::Extensions::ErlangPid
49
+ end
50
+
51
+ # @private
52
+ class ::Erlang::String
53
+ extend Erlang::ETF::Extensions::ErlangString::ClassMethods
54
+ include Erlang::ETF::Extensions::ErlangString
55
+ end
56
+
57
+ # @private
58
+ class ::Erlang::Tuple
59
+ extend Erlang::ETF::Extensions::ErlangTuple::ClassMethods
60
+ include Erlang::ETF::Extensions::ErlangTuple
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ require "erlang/etf/extensions/array"
67
+ require "erlang/etf/extensions/big_decimal"
68
+ require "erlang/etf/extensions/false_class"
69
+ require "erlang/etf/extensions/float"
70
+ require "erlang/etf/extensions/hash"
71
+ require "erlang/etf/extensions/integer"
72
+ require "erlang/etf/extensions/nil_class"
73
+ require "erlang/etf/extensions/regexp"
74
+ require "erlang/etf/extensions/string"
75
+ require "erlang/etf/extensions/symbol"
76
+ require "erlang/etf/extensions/time"
77
+ require "erlang/etf/extensions/true_class"
78
+
79
+ module Erlang
80
+ module ETF
81
+ module Extensions
82
+
83
+ # @private
84
+ class ::Array
85
+ extend Erlang::ETF::Extensions::Array::ClassMethods
86
+ include Erlang::ETF::Extensions::Array
87
+ end
88
+
89
+ # @private
90
+ class ::BigDecimal
91
+ extend Erlang::ETF::Extensions::BigDecimal::ClassMethods
92
+ include Erlang::ETF::Extensions::BigDecimal
93
+ end
94
+
95
+ # @private
96
+ class ::FalseClass
97
+ extend Erlang::ETF::Extensions::FalseClass::ClassMethods
98
+ include Erlang::ETF::Extensions::FalseClass
99
+ end
100
+
101
+ # @private
102
+ class ::Float
103
+ extend Erlang::ETF::Extensions::Float::ClassMethods
104
+ include Erlang::ETF::Extensions::Float
105
+ end
106
+
107
+ # @private
108
+ class ::Hash
109
+ extend Erlang::ETF::Extensions::Hash::ClassMethods
110
+ include Erlang::ETF::Extensions::Hash
111
+ end
112
+
113
+ # @private
114
+ class ::Integer
115
+ extend Erlang::ETF::Extensions::Integer::ClassMethods
116
+ include Erlang::ETF::Extensions::Integer
117
+ end
118
+
119
+ # @private
120
+ class ::NilClass
121
+ extend Erlang::ETF::Extensions::NilClass::ClassMethods
122
+ include Erlang::ETF::Extensions::NilClass
123
+ end
124
+
125
+ # @private
126
+ class ::Regexp
127
+ extend Erlang::ETF::Extensions::Regexp::ClassMethods
128
+ include Erlang::ETF::Extensions::Regexp
129
+ end
130
+
131
+ # @private
132
+ class ::String
133
+ extend Erlang::ETF::Extensions::String::ClassMethods
134
+ include Erlang::ETF::Extensions::String
135
+ end
136
+
137
+ # @private
138
+ class ::Symbol
139
+ extend Erlang::ETF::Extensions::Symbol::ClassMethods
140
+ include Erlang::ETF::Extensions::Symbol
141
+ end
142
+
143
+ # @private
144
+ class ::Time
145
+ extend Erlang::ETF::Extensions::Time::ClassMethods
146
+ include Erlang::ETF::Extensions::Time
147
+ end
148
+
149
+ # @private
150
+ class ::TrueClass
151
+ extend Erlang::ETF::Extensions::TrueClass::ClassMethods
152
+ include Erlang::ETF::Extensions::TrueClass
153
+ end
154
+
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,29 @@
1
+ module Erlang
2
+ module ETF
3
+ module Extensions
4
+
5
+ module Array
6
+
7
+ def __erlang_type__
8
+ if empty?
9
+ :nil
10
+ else
11
+ :list
12
+ end
13
+ end
14
+
15
+ def __erlang_evolve__
16
+ case __erlang_type__
17
+ when :nil
18
+ ETF::Nil.new
19
+ when :list
20
+ ETF::List.new(map(&:__erlang_evolve__))
21
+ end
22
+ end
23
+
24
+ module ClassMethods
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,22 @@
1
+ require 'bigdecimal'
2
+
3
+ module Erlang
4
+ module ETF
5
+ module Extensions
6
+
7
+ module BigDecimal
8
+
9
+ def __erlang_type__
10
+ :float
11
+ end
12
+
13
+ def __erlang_evolve__
14
+ ETF::Float.new(self)
15
+ end
16
+
17
+ module ClassMethods
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,26 @@
1
+ require 'erlang/export'
2
+
3
+ module Erlang
4
+ module ETF
5
+ module Extensions
6
+
7
+ module ErlangExport
8
+
9
+ def __erlang_type__
10
+ :export
11
+ end
12
+
13
+ def __erlang_evolve__
14
+ ETF::Export.new(
15
+ mod.to_s.intern.__erlang_evolve__,
16
+ function.to_s.intern.__erlang_evolve__,
17
+ arity.__erlang_evolve__
18
+ )
19
+ end
20
+
21
+ module ClassMethods
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,31 @@
1
+ require 'erlang/list'
2
+
3
+ module Erlang
4
+ module ETF
5
+ module Extensions
6
+
7
+ module ErlangList
8
+
9
+ def __erlang_type__
10
+ if empty? and not improper?
11
+ :nil
12
+ else
13
+ :list
14
+ end
15
+ end
16
+
17
+ def __erlang_evolve__
18
+ case __erlang_type__
19
+ when :nil
20
+ ETF::Nil.new
21
+ when :list
22
+ ETF::List.new(map(&:__erlang_evolve__), tail.__erlang_evolve__)
23
+ end
24
+ end
25
+
26
+ module ClassMethods
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,22 @@
1
+ require 'erlang/nil'
2
+
3
+ module Erlang
4
+ module ETF
5
+ module Extensions
6
+
7
+ module ErlangNil
8
+
9
+ def __erlang_type__
10
+ :nil
11
+ end
12
+
13
+ def __erlang_evolve__
14
+ ETF::Nil.new
15
+ end
16
+
17
+ module ClassMethods
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ require 'erlang/pid'
2
+
3
+ module Erlang
4
+ module ETF
5
+ module Extensions
6
+
7
+ module ErlangPid
8
+
9
+ def __erlang_type__
10
+ :pid
11
+ end
12
+
13
+ def __erlang_evolve__
14
+ ETF::Pid.new(node.to_s.intern.__erlang_evolve__, id, serial, creation)
15
+ end
16
+
17
+ module ClassMethods
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ require 'erlang/string'
2
+
3
+ module Erlang
4
+ module ETF
5
+ module Extensions
6
+
7
+ module ErlangString
8
+
9
+ def __erlang_type__
10
+ :string
11
+ end
12
+
13
+ def __erlang_evolve__
14
+ ETF::String.new(self)
15
+ end
16
+
17
+ module ClassMethods
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,31 @@
1
+ require 'erlang/tuple'
2
+
3
+ module Erlang
4
+ module ETF
5
+ module Extensions
6
+
7
+ module ErlangTuple
8
+
9
+ def __erlang_type__
10
+ if length < 256
11
+ :small_tuple
12
+ else
13
+ :large_tuple
14
+ end
15
+ end
16
+
17
+ def __erlang_evolve__
18
+ case __erlang_type__
19
+ when :small_tuple
20
+ ETF::SmallTuple.new(map(&:__erlang_evolve__))
21
+ when :large_tuple
22
+ ETF::LargeTuple.new(map(&:__erlang_evolve__))
23
+ end
24
+ end
25
+
26
+ module ClassMethods
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,28 @@
1
+ module Erlang
2
+ module ETF
3
+ module Extensions
4
+
5
+ #
6
+ # boolean {bert, true} or {bert, false}
7
+ #
8
+ # Erlang equates the true and false atoms with booleans while other languages do not have this behavior.
9
+ # To disambiguate these cases, booleans are expressed as their own complex type.
10
+ #
11
+ # See: http://bert-rpc.org/
12
+ #
13
+ module FalseClass
14
+
15
+ def __erlang_type__
16
+ :bert_boolean
17
+ end
18
+
19
+ def __erlang_evolve__
20
+ ::Erlang::Tuple[:bert, :false].__erlang_evolve__
21
+ end
22
+
23
+ module ClassMethods
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end