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.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.rspec +2 -0
- data/.travis.yml +4 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +49 -0
- data/Rakefile +6 -0
- data/erlang-etf.gemspec +30 -0
- data/lib/erlang/etf.rb +40 -0
- data/lib/erlang/etf/atom.rb +46 -0
- data/lib/erlang/etf/atom_utf8.rb +44 -0
- data/lib/erlang/etf/bert.rb +74 -0
- data/lib/erlang/etf/binary.rb +44 -0
- data/lib/erlang/etf/bit_binary.rb +47 -0
- data/lib/erlang/etf/export.rb +44 -0
- data/lib/erlang/etf/extensions.rb +157 -0
- data/lib/erlang/etf/extensions/array.rb +29 -0
- data/lib/erlang/etf/extensions/big_decimal.rb +22 -0
- data/lib/erlang/etf/extensions/erlang-export.rb +26 -0
- data/lib/erlang/etf/extensions/erlang-list.rb +31 -0
- data/lib/erlang/etf/extensions/erlang-nil.rb +22 -0
- data/lib/erlang/etf/extensions/erlang-pid.rb +22 -0
- data/lib/erlang/etf/extensions/erlang-string.rb +22 -0
- data/lib/erlang/etf/extensions/erlang-tuple.rb +31 -0
- data/lib/erlang/etf/extensions/false_class.rb +28 -0
- data/lib/erlang/etf/extensions/float.rb +20 -0
- data/lib/erlang/etf/extensions/hash.rb +32 -0
- data/lib/erlang/etf/extensions/integer.rb +48 -0
- data/lib/erlang/etf/extensions/nil_class.rb +29 -0
- data/lib/erlang/etf/extensions/object.rb +24 -0
- data/lib/erlang/etf/extensions/regexp.rb +34 -0
- data/lib/erlang/etf/extensions/string.rb +35 -0
- data/lib/erlang/etf/extensions/symbol.rb +45 -0
- data/lib/erlang/etf/extensions/time.rb +29 -0
- data/lib/erlang/etf/extensions/true_class.rb +28 -0
- data/lib/erlang/etf/float.rb +57 -0
- data/lib/erlang/etf/fun.rb +67 -0
- data/lib/erlang/etf/integer.rb +29 -0
- data/lib/erlang/etf/large_big.rb +53 -0
- data/lib/erlang/etf/large_tuple.rb +55 -0
- data/lib/erlang/etf/list.rb +50 -0
- data/lib/erlang/etf/new_float.rb +33 -0
- data/lib/erlang/etf/new_fun.rb +98 -0
- data/lib/erlang/etf/new_reference.rb +59 -0
- data/lib/erlang/etf/nil.rb +23 -0
- data/lib/erlang/etf/pid.rb +45 -0
- data/lib/erlang/etf/port.rb +34 -0
- data/lib/erlang/etf/reference.rb +41 -0
- data/lib/erlang/etf/small_atom.rb +48 -0
- data/lib/erlang/etf/small_atom_utf8.rb +44 -0
- data/lib/erlang/etf/small_big.rb +59 -0
- data/lib/erlang/etf/small_integer.rb +29 -0
- data/lib/erlang/etf/small_tuple.rb +56 -0
- data/lib/erlang/etf/string.rb +46 -0
- data/lib/erlang/etf/term.rb +101 -0
- data/lib/erlang/etf/terms.rb +105 -0
- data/lib/erlang/etf/version.rb +5 -0
- data/spec/erlang/etf/atom_spec.rb +90 -0
- data/spec/erlang/etf/atom_utf8_spec.rb +90 -0
- data/spec/erlang/etf/binary_spec.rb +90 -0
- data/spec/erlang/etf/bit_binary_spec.rb +99 -0
- data/spec/erlang/etf/export_spec.rb +58 -0
- data/spec/erlang/etf/extensions/array_spec.rb +40 -0
- data/spec/erlang/etf/extensions/big_decimal_spec.rb +26 -0
- data/spec/erlang/etf/extensions/erlang-export_spec.rb +32 -0
- data/spec/erlang/etf/extensions/erlang-list_spec.rb +76 -0
- data/spec/erlang/etf/extensions/erlang-nil_spec.rb +24 -0
- data/spec/erlang/etf/extensions/erlang-pid_spec.rb +33 -0
- data/spec/erlang/etf/extensions/erlang-string_spec.rb +26 -0
- data/spec/erlang/etf/extensions/erlang-tuple_spec.rb +56 -0
- data/spec/erlang/etf/extensions/false_class_spec.rb +29 -0
- data/spec/erlang/etf/extensions/float_spec.rb +24 -0
- data/spec/erlang/etf/extensions/hash_spec.rb +90 -0
- data/spec/erlang/etf/extensions/integer_spec.rb +259 -0
- data/spec/erlang/etf/extensions/nil_class_spec.rb +29 -0
- data/spec/erlang/etf/extensions/object_spec.rb +30 -0
- data/spec/erlang/etf/extensions/regexp_spec.rb +35 -0
- data/spec/erlang/etf/extensions/string_spec.rb +43 -0
- data/spec/erlang/etf/extensions/symbol_spec.rb +64 -0
- data/spec/erlang/etf/extensions/time_spec.rb +32 -0
- data/spec/erlang/etf/extensions/true_class_spec.rb +29 -0
- data/spec/erlang/etf/float_spec.rb +92 -0
- data/spec/erlang/etf/fun_spec.rb +132 -0
- data/spec/erlang/etf/integer_spec.rb +57 -0
- data/spec/erlang/etf/large_big_spec.rb +67 -0
- data/spec/erlang/etf/large_tuple_spec.rb +119 -0
- data/spec/erlang/etf/list_spec.rb +159 -0
- data/spec/erlang/etf/new_float_spec.rb +92 -0
- data/spec/erlang/etf/new_fun_spec.rb +146 -0
- data/spec/erlang/etf/new_reference_spec.rb +60 -0
- data/spec/erlang/etf/nil_spec.rb +50 -0
- data/spec/erlang/etf/pid_spec.rb +61 -0
- data/spec/erlang/etf/port_spec.rb +58 -0
- data/spec/erlang/etf/reference_spec.rb +58 -0
- data/spec/erlang/etf/small_atom_spec.rb +90 -0
- data/spec/erlang/etf/small_atom_utf8_spec.rb +90 -0
- data/spec/erlang/etf/small_big_spec.rb +67 -0
- data/spec/erlang/etf/small_integer_spec.rb +57 -0
- data/spec/erlang/etf/small_tuple_spec.rb +112 -0
- data/spec/erlang/etf/string_spec.rb +92 -0
- data/spec/erlang/etf/term_spec.rb +27 -0
- data/spec/erlang/etf/terms_spec.rb +23 -0
- data/spec/erlang/etf_spec.rb +23 -0
- data/spec/erlang_spec.rb +77 -0
- data/spec/spec_helper.rb +7 -0
- 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
|