erlang-etf 1.0.1 → 1.1.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 +4 -4
- data/erlang-etf.gemspec +1 -1
- data/lib/erlang/etf/extensions.rb +6 -0
- data/lib/erlang/etf/extensions/erlang-map.rb +26 -0
- data/lib/erlang/etf/map.rb +51 -0
- data/lib/erlang/etf/terms.rb +3 -0
- data/lib/erlang/etf/version.rb +1 -1
- data/spec/erlang/etf/extensions/erlang-map_spec.rb +48 -0
- data/spec/erlang/etf/map_spec.rb +100 -0
- data/spec/erlang_spec.rb +4 -1
- metadata +11 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c065a1c33b75cf6235b7911022718a22fa44204c
|
4
|
+
data.tar.gz: 57fb1fc1ce89f1826ac5bcef122f1eb085430baa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3979a241f92a3f08a19e81042c266381fc8e17837e08f7f7dd7be0d34d637bacc051d0fff6a808237c57386b23fed4cc13970247efb70054c7f3ba0355668f79
|
7
|
+
data.tar.gz: 8947fad90e772020fff53c997d7c5240b73cb9cd298e4ab0f3f951d76aefc90ab193225a4241b4636f022c2031fecdb4d29f12bab2fdeb02e4003fc7795e6189
|
data/erlang-etf.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
21
|
spec.add_dependency "binary-protocol"
|
22
|
-
spec.add_dependency "erlang-terms"
|
22
|
+
spec.add_dependency "erlang-terms", ">= 1.1.0"
|
23
23
|
|
24
24
|
spec.add_development_dependency "bundler", "~> 1.3"
|
25
25
|
spec.add_development_dependency "rake"
|
@@ -14,6 +14,7 @@ end
|
|
14
14
|
|
15
15
|
require "erlang/etf/extensions/erlang-export"
|
16
16
|
require "erlang/etf/extensions/erlang-list"
|
17
|
+
require "erlang/etf/extensions/erlang-map"
|
17
18
|
require "erlang/etf/extensions/erlang-nil"
|
18
19
|
require "erlang/etf/extensions/erlang-pid"
|
19
20
|
require "erlang/etf/extensions/erlang-string"
|
@@ -33,6 +34,11 @@ module Erlang
|
|
33
34
|
include Erlang::ETF::Extensions::ErlangList
|
34
35
|
end
|
35
36
|
|
37
|
+
# @private
|
38
|
+
class ::Erlang::Map
|
39
|
+
include Erlang::ETF::Extensions::ErlangMap
|
40
|
+
end
|
41
|
+
|
36
42
|
# @private
|
37
43
|
class ::Erlang::Nil
|
38
44
|
include Erlang::ETF::Extensions::ErlangNil
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'erlang/map'
|
2
|
+
|
3
|
+
module Erlang
|
4
|
+
module ETF
|
5
|
+
module Extensions
|
6
|
+
|
7
|
+
module ErlangMap
|
8
|
+
|
9
|
+
def __erlang_type__
|
10
|
+
:map
|
11
|
+
end
|
12
|
+
|
13
|
+
def __erlang_evolve__
|
14
|
+
if size == 0
|
15
|
+
ETF::Map.new([], [])
|
16
|
+
else
|
17
|
+
ETF::Map.new(*map do |(key, value)|
|
18
|
+
[key.__erlang_evolve__, value.__erlang_evolve__]
|
19
|
+
end.transpose)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Erlang
|
2
|
+
module ETF
|
3
|
+
|
4
|
+
#
|
5
|
+
# 1 | 4 | N | N
|
6
|
+
# --- | ---- | ---- | ------
|
7
|
+
# 116 | Size | Keys | Values
|
8
|
+
#
|
9
|
+
# The Size specifies the number of keys and values that
|
10
|
+
# follows the size descriptor.
|
11
|
+
#
|
12
|
+
# (see [`MAP_EXT`])
|
13
|
+
#
|
14
|
+
# [`MAP_EXT`]: http://erlang.org/doc/apps/erts/erl_ext_dist.html#MAP_EXT
|
15
|
+
#
|
16
|
+
class Map
|
17
|
+
include Term
|
18
|
+
|
19
|
+
uint8 :tag, always: Terms::MAP_EXT
|
20
|
+
|
21
|
+
uint32be :size, always: -> { keys.size }
|
22
|
+
|
23
|
+
term :keys, type: :array
|
24
|
+
term :values, type: :array
|
25
|
+
|
26
|
+
deserialize do |buffer|
|
27
|
+
size, = buffer.read(BYTES_32).unpack(UINT32BE_PACK)
|
28
|
+
self.keys = []
|
29
|
+
size.times do
|
30
|
+
self.keys << Terms.deserialize(buffer)
|
31
|
+
end
|
32
|
+
self.values = []
|
33
|
+
size.times do
|
34
|
+
self.values << Terms.deserialize(buffer)
|
35
|
+
end
|
36
|
+
self
|
37
|
+
end
|
38
|
+
|
39
|
+
finalize
|
40
|
+
|
41
|
+
def initialize(keys, values)
|
42
|
+
@keys = keys
|
43
|
+
@values = values
|
44
|
+
end
|
45
|
+
|
46
|
+
def __ruby_evolve__
|
47
|
+
::Erlang::Map[keys.map(&:__ruby_evolve__).zip(values.map(&:__ruby_evolve__))]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/erlang/etf/terms.rb
CHANGED
@@ -26,6 +26,7 @@ module Erlang
|
|
26
26
|
NEW_FLOAT_EXT = 70.freeze
|
27
27
|
ATOM_UTF8_EXT = 118.freeze
|
28
28
|
SMALL_ATOM_UTF8_EXT = 119.freeze
|
29
|
+
MAP_EXT = 116.freeze
|
29
30
|
end
|
30
31
|
end
|
31
32
|
end
|
@@ -44,6 +45,7 @@ require "erlang/etf/integer"
|
|
44
45
|
require "erlang/etf/large_big"
|
45
46
|
require "erlang/etf/large_tuple"
|
46
47
|
require "erlang/etf/list"
|
48
|
+
require "erlang/etf/map"
|
47
49
|
require "erlang/etf/new_float"
|
48
50
|
require "erlang/etf/new_fun"
|
49
51
|
require "erlang/etf/new_reference"
|
@@ -87,6 +89,7 @@ module Erlang
|
|
87
89
|
MAP[NEW_FLOAT_EXT] = ETF::NewFloat
|
88
90
|
MAP[ATOM_UTF8_EXT] = ETF::AtomUTF8
|
89
91
|
MAP[SMALL_ATOM_UTF8_EXT] = ETF::SmallAtomUTF8
|
92
|
+
MAP[MAP_EXT] = ETF::Map
|
90
93
|
|
91
94
|
def self.deserialize(buffer)
|
92
95
|
key, = buffer.read(1).unpack(::Binary::Protocol::UINT8_PACK)
|
data/lib/erlang/etf/version.rb
CHANGED
@@ -0,0 +1,48 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Erlang::ETF::Extensions::ErlangMap do
|
6
|
+
let(:klass) { ::Erlang::Map }
|
7
|
+
|
8
|
+
describe '[instance]' do
|
9
|
+
let(:instance) { klass[keys.zip(values)] }
|
10
|
+
|
11
|
+
describe '__erlang_type__' do
|
12
|
+
subject { instance.__erlang_type__ }
|
13
|
+
|
14
|
+
context 'when empty' do
|
15
|
+
let(:keys) { [] }
|
16
|
+
let(:values) { [] }
|
17
|
+
|
18
|
+
it { should eq(:map) }
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'when not empty' do
|
22
|
+
let(:keys) { [:a] }
|
23
|
+
let(:values) { [1] }
|
24
|
+
|
25
|
+
it { should eq(:map) }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '__erlang_evolve__' do
|
30
|
+
subject { instance.__erlang_evolve__ }
|
31
|
+
|
32
|
+
context 'when empty' do
|
33
|
+
let(:keys) { [] }
|
34
|
+
let(:values) { [] }
|
35
|
+
|
36
|
+
it { should eq(Erlang::ETF::Map.new([], [])) }
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'when not empty' do
|
40
|
+
let(:keys) { [:a] }
|
41
|
+
let(:values) { [1] }
|
42
|
+
|
43
|
+
it { should eq(Erlang::ETF::Map.new([Erlang::ETF::SmallAtom.new("a")], [Erlang::ETF::SmallInteger.new(1)])) }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'pry'
|
5
|
+
|
6
|
+
describe Erlang::ETF::Map do
|
7
|
+
let(:term_class) { Erlang::ETF::Map }
|
8
|
+
|
9
|
+
let(:atom) { Erlang::ETF::SmallAtom.new("test").tap(&:serialize) }
|
10
|
+
let(:binary) { Erlang::ETF::Binary.new("test").tap(&:serialize) }
|
11
|
+
let(:new_float) { Erlang::ETF::NewFloat.new(1.1) }
|
12
|
+
let(:small_integer) { Erlang::ETF::SmallInteger.new(13) }
|
13
|
+
let(:small_list) { Erlang::ETF::List.new([atom, binary, new_float, small_integer]) }
|
14
|
+
let(:erlang_nil) { Erlang::ETF::Nil.new }
|
15
|
+
let(:small_tuple) { Erlang::ETF::SmallTuple.new([atom, binary, new_float, small_integer, small_list]) }
|
16
|
+
let(:small_map) { Erlang::ETF::Map.new([atom, binary, new_float], [small_integer, erlang_nil, small_list]) }
|
17
|
+
|
18
|
+
describe '[class]' do
|
19
|
+
describe 'deserialize' do
|
20
|
+
let(:buffer) { StringIO.new(bytes.pack('C*')) }
|
21
|
+
subject { term_class.deserialize(buffer) }
|
22
|
+
|
23
|
+
context 'single item map' do
|
24
|
+
let(:bytes) { [0, 0, 0, 1, 100, 0, 1, 97, 106] }
|
25
|
+
let(:atom_a) { Erlang::ETF::Atom.new("a").tap(&:serialize) }
|
26
|
+
|
27
|
+
its(:size) { should eq(1) }
|
28
|
+
its(:keys) { should eq([atom_a]) }
|
29
|
+
its(:values) { should eq([erlang_nil]) }
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'multiple item map' do
|
33
|
+
let(:bytes) { [0, 0, 0, 3, 115, 4, 116, 101, 115, 116, 109, 0, 0, 0, 4, 116, 101, 115, 116, 70, 63, 241, 153, 153, 153, 153, 153, 154, 97, 13, 106, 108, 0, 0, 0, 4, 115, 4, 116, 101, 115, 116, 109, 0, 0, 0, 4, 116, 101, 115, 116, 70, 63, 241, 153, 153, 153, 153, 153, 154, 97, 13, 106] }
|
34
|
+
|
35
|
+
its(:size) { should eq(3) }
|
36
|
+
its(:keys) { should eq([atom, binary, new_float]) }
|
37
|
+
its(:values) { should eq([small_integer, erlang_nil, small_list]) }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '[instance]' do
|
43
|
+
let(:term) { term_class.new(keys, values) }
|
44
|
+
|
45
|
+
let(:atom_a) { Erlang::ETF::Atom.new("a").tap(&:serialize) }
|
46
|
+
|
47
|
+
describe 'serialize' do
|
48
|
+
subject { term.serialize }
|
49
|
+
|
50
|
+
context 'single item map' do
|
51
|
+
let(:bytes) { [116, 0, 0, 0, 1, 100, 0, 1, 97, 106].pack('C*') }
|
52
|
+
|
53
|
+
let(:keys) { [atom_a] }
|
54
|
+
let(:values) { [erlang_nil] }
|
55
|
+
|
56
|
+
it { should eq(bytes) }
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'multiple item map' do
|
60
|
+
let(:bytes) { [116, 0, 0, 0, 3, 115, 4, 116, 101, 115, 116, 109, 0, 0, 0, 4, 116, 101, 115, 116, 70, 63, 241, 153, 153, 153, 153, 153, 154, 97, 13, 116, 0, 0, 0, 3, 115, 4, 116, 101, 115, 116, 109, 0, 0, 0, 4, 116, 101, 115, 116, 70, 63, 241, 153, 153, 153, 153, 153, 154, 97, 13, 106, 108, 0, 0, 0, 4, 115, 4, 116, 101, 115, 116, 109, 0, 0, 0, 4, 116, 101, 115, 116, 70, 63, 241, 153, 153, 153, 153, 153, 154, 97, 13, 106, 108, 0, 0, 0, 4, 115, 4, 116, 101, 115, 116, 109, 0, 0, 0, 4, 116, 101, 115, 116, 70, 63, 241, 153, 153, 153, 153, 153, 154, 97, 13, 106].pack('C*') }
|
61
|
+
|
62
|
+
let(:keys) { [atom, binary, new_float] }
|
63
|
+
let(:values) { [small_integer, small_map, small_list] }
|
64
|
+
|
65
|
+
it { should eq(bytes) }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe '__erlang_type__' do
|
70
|
+
subject { term.__erlang_type__ }
|
71
|
+
|
72
|
+
let(:keys) { [atom_a] }
|
73
|
+
let(:values) { [erlang_nil] }
|
74
|
+
it { should eq(:map) }
|
75
|
+
end
|
76
|
+
|
77
|
+
describe '__ruby_evolve__' do
|
78
|
+
context 'single item map' do
|
79
|
+
let(:ruby_obj) { ::Erlang::Map[:a, :a] }
|
80
|
+
subject { term.__ruby_evolve__ }
|
81
|
+
|
82
|
+
let(:keys) { [atom_a] }
|
83
|
+
let(:values) { [atom_a] }
|
84
|
+
|
85
|
+
it { should eq(ruby_obj) }
|
86
|
+
end
|
87
|
+
|
88
|
+
context 'multiple item map' do
|
89
|
+
let(:ruby_obj) { ::Erlang::Map[:test, "test", 1.1, 13, ::Erlang::Tuple[:test, "test", 1.1, 13, ::Erlang::List[:test, "test", 1.1, 13]], ::Erlang::List[:test, "test", 1.1, 13]] }
|
90
|
+
subject { term.__ruby_evolve__ }
|
91
|
+
|
92
|
+
let(:keys) { [atom, new_float, small_tuple] }
|
93
|
+
let(:values) { [binary, small_integer, small_list] }
|
94
|
+
|
95
|
+
it { should eq(ruby_obj) }
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
data/spec/erlang_spec.rb
CHANGED
@@ -67,7 +67,10 @@ describe Erlang do
|
|
67
67
|
|
68
68
|
Erlang::Export.new(:erlang, :now, 0),
|
69
69
|
Erlang::Pid.new(:'node@host', 100, 10, 1),
|
70
|
-
Erlang::String.new("test")
|
70
|
+
Erlang::String.new("test"),
|
71
|
+
Erlang::Map[],
|
72
|
+
Erlang::Map[:atom, 1],
|
73
|
+
Erlang::Map[Erlang::Map[:atom, 1], 2]
|
71
74
|
]
|
72
75
|
|
73
76
|
roundtrip_variables.each do |roundtrip_variable|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: erlang-etf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Bennett
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-03-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: binary-protocol
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 1.1.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 1.1.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,6 +108,7 @@ files:
|
|
108
108
|
- lib/erlang/etf/extensions/big_decimal.rb
|
109
109
|
- lib/erlang/etf/extensions/erlang-export.rb
|
110
110
|
- lib/erlang/etf/extensions/erlang-list.rb
|
111
|
+
- lib/erlang/etf/extensions/erlang-map.rb
|
111
112
|
- lib/erlang/etf/extensions/erlang-nil.rb
|
112
113
|
- lib/erlang/etf/extensions/erlang-pid.rb
|
113
114
|
- lib/erlang/etf/extensions/erlang-string.rb
|
@@ -129,6 +130,7 @@ files:
|
|
129
130
|
- lib/erlang/etf/large_big.rb
|
130
131
|
- lib/erlang/etf/large_tuple.rb
|
131
132
|
- lib/erlang/etf/list.rb
|
133
|
+
- lib/erlang/etf/map.rb
|
132
134
|
- lib/erlang/etf/new_float.rb
|
133
135
|
- lib/erlang/etf/new_fun.rb
|
134
136
|
- lib/erlang/etf/new_reference.rb
|
@@ -154,6 +156,7 @@ files:
|
|
154
156
|
- spec/erlang/etf/extensions/big_decimal_spec.rb
|
155
157
|
- spec/erlang/etf/extensions/erlang-export_spec.rb
|
156
158
|
- spec/erlang/etf/extensions/erlang-list_spec.rb
|
159
|
+
- spec/erlang/etf/extensions/erlang-map_spec.rb
|
157
160
|
- spec/erlang/etf/extensions/erlang-nil_spec.rb
|
158
161
|
- spec/erlang/etf/extensions/erlang-pid_spec.rb
|
159
162
|
- spec/erlang/etf/extensions/erlang-string_spec.rb
|
@@ -175,6 +178,7 @@ files:
|
|
175
178
|
- spec/erlang/etf/large_big_spec.rb
|
176
179
|
- spec/erlang/etf/large_tuple_spec.rb
|
177
180
|
- spec/erlang/etf/list_spec.rb
|
181
|
+
- spec/erlang/etf/map_spec.rb
|
178
182
|
- spec/erlang/etf/new_float_spec.rb
|
179
183
|
- spec/erlang/etf/new_fun_spec.rb
|
180
184
|
- spec/erlang/etf/new_reference_spec.rb
|
@@ -213,7 +217,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
213
217
|
version: '0'
|
214
218
|
requirements: []
|
215
219
|
rubyforge_project:
|
216
|
-
rubygems_version: 2.
|
220
|
+
rubygems_version: 2.2.1
|
217
221
|
signing_key:
|
218
222
|
specification_version: 4
|
219
223
|
summary: Erlang External Term Format (ETF) for Ruby
|
@@ -227,6 +231,7 @@ test_files:
|
|
227
231
|
- spec/erlang/etf/extensions/big_decimal_spec.rb
|
228
232
|
- spec/erlang/etf/extensions/erlang-export_spec.rb
|
229
233
|
- spec/erlang/etf/extensions/erlang-list_spec.rb
|
234
|
+
- spec/erlang/etf/extensions/erlang-map_spec.rb
|
230
235
|
- spec/erlang/etf/extensions/erlang-nil_spec.rb
|
231
236
|
- spec/erlang/etf/extensions/erlang-pid_spec.rb
|
232
237
|
- spec/erlang/etf/extensions/erlang-string_spec.rb
|
@@ -248,6 +253,7 @@ test_files:
|
|
248
253
|
- spec/erlang/etf/large_big_spec.rb
|
249
254
|
- spec/erlang/etf/large_tuple_spec.rb
|
250
255
|
- spec/erlang/etf/list_spec.rb
|
256
|
+
- spec/erlang/etf/map_spec.rb
|
251
257
|
- spec/erlang/etf/new_float_spec.rb
|
252
258
|
- spec/erlang/etf/new_fun_spec.rb
|
253
259
|
- spec/erlang/etf/new_reference_spec.rb
|