erlang_rb 2.0.5 → 2.0.6
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
- checksums.yaml.gz.sig +0 -0
- data/README.markdown +1 -1
- data/lib/erlang.rb +48 -32
- data/tests/erlang_tests.rb +64 -1
- data.tar.gz.sig +0 -0
- metadata +2 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: cb447b6bd939e85f7064d8f8bb2dc8c9c9760dd85176aa03faa2f71b80d399af
|
|
4
|
+
data.tar.gz: 7e44a500d2f09968376420c89a3009299000751c7944e8c34dab65bab65dc364
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 64da30400b66241b3742fe4e05f37c10c8fcf17b01380989d268e11640c5d91a069a37fe965d6b51dcd5ed820cc21cf94ffdd152dcc77d5003c866c7d446bcec
|
|
7
|
+
data.tar.gz: 934690e36553ff1c20eb4de1f1d5d0cc7893d4181e46738792b59238d731bc047e3a72827db6fec30047dbc372ea94878e62edecd3e87d934312a709138d0d6d
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
data/README.markdown
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Erlang External Term Format for Ruby
|
|
2
2
|
====================================
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
[](https://app.travis-ci.com/okeuday/erlang_rb)
|
|
5
5
|
|
|
6
6
|
Provides all encoding and decoding for the Erlang External Term Format
|
|
7
7
|
(as defined at [http://erlang.org/doc/apps/erts/erl_ext_dist.html](http://erlang.org/doc/apps/erts/erl_ext_dist.html))
|
data/lib/erlang.rb
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
#
|
|
4
4
|
# MIT License
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2011-
|
|
6
|
+
# Copyright (c) 2011-2023 Michael Truog <mjtruog at protonmail dot com>
|
|
7
7
|
#
|
|
8
8
|
# Permission is hereby granted, free of charge, to any person obtaining a
|
|
9
9
|
# copy of this software and associated documentation files (the "Software"),
|
|
@@ -118,28 +118,6 @@ module Erlang
|
|
|
118
118
|
alias eql? ==
|
|
119
119
|
end
|
|
120
120
|
|
|
121
|
-
class OtpErlangFunction
|
|
122
|
-
def initialize(tag, value)
|
|
123
|
-
@tag = tag
|
|
124
|
-
@value = value
|
|
125
|
-
end
|
|
126
|
-
attr_reader :tag
|
|
127
|
-
attr_reader :value
|
|
128
|
-
def binary
|
|
129
|
-
return "#{@tag.chr}#{@value}"
|
|
130
|
-
end
|
|
131
|
-
def to_s
|
|
132
|
-
return "#{self.class.name}('#{@tag.to_s}','#{@value.to_s}')"
|
|
133
|
-
end
|
|
134
|
-
def hash
|
|
135
|
-
return binary.hash
|
|
136
|
-
end
|
|
137
|
-
def ==(other)
|
|
138
|
-
return binary == other.binary
|
|
139
|
-
end
|
|
140
|
-
alias eql? ==
|
|
141
|
-
end
|
|
142
|
-
|
|
143
121
|
class OtpErlangList
|
|
144
122
|
def initialize(value, improper = false)
|
|
145
123
|
@value = value
|
|
@@ -232,13 +210,18 @@ module Erlang
|
|
|
232
210
|
attr_reader :id
|
|
233
211
|
attr_reader :creation
|
|
234
212
|
def binary
|
|
235
|
-
|
|
236
|
-
if
|
|
237
|
-
return "#{
|
|
213
|
+
id_size = @id.bytesize
|
|
214
|
+
if id_size == 8
|
|
215
|
+
return "#{TAG_V4_PORT_EXT.chr}" \
|
|
238
216
|
"#{@node.binary}#{@id}#{@creation}"
|
|
239
|
-
|
|
217
|
+
end
|
|
218
|
+
creation_size = @creation.bytesize
|
|
219
|
+
if creation_size == 4
|
|
240
220
|
return "#{TAG_NEW_PORT_EXT.chr}" \
|
|
241
221
|
"#{@node.binary}#{@id}#{@creation}"
|
|
222
|
+
elsif creation_size == 1
|
|
223
|
+
return "#{TAG_PORT_EXT.chr}" \
|
|
224
|
+
"#{@node.binary}#{@id}#{@creation}"
|
|
242
225
|
else
|
|
243
226
|
raise OutputException, 'unknown port type', caller
|
|
244
227
|
end
|
|
@@ -299,6 +282,28 @@ module Erlang
|
|
|
299
282
|
alias eql? ==
|
|
300
283
|
end
|
|
301
284
|
|
|
285
|
+
class OtpErlangFunction
|
|
286
|
+
def initialize(tag, value)
|
|
287
|
+
@tag = tag
|
|
288
|
+
@value = value
|
|
289
|
+
end
|
|
290
|
+
attr_reader :tag
|
|
291
|
+
attr_reader :value
|
|
292
|
+
def binary
|
|
293
|
+
return "#{@tag.chr}#{@value}"
|
|
294
|
+
end
|
|
295
|
+
def to_s
|
|
296
|
+
return "#{self.class.name}('#{@tag.to_s}','#{@value.to_s}')"
|
|
297
|
+
end
|
|
298
|
+
def hash
|
|
299
|
+
return binary.hash
|
|
300
|
+
end
|
|
301
|
+
def ==(other)
|
|
302
|
+
return binary == other.binary
|
|
303
|
+
end
|
|
304
|
+
alias eql? ==
|
|
305
|
+
end
|
|
306
|
+
|
|
302
307
|
# core functionality
|
|
303
308
|
|
|
304
309
|
def self.binary_to_term(data)
|
|
@@ -380,12 +385,18 @@ module Erlang
|
|
|
380
385
|
elsif tag == TAG_FLOAT_EXT
|
|
381
386
|
value = data[i,31].partition(0.chr)[0].to_f
|
|
382
387
|
return [i + 31, value]
|
|
383
|
-
elsif Set[TAG_NEW_PORT_EXT,
|
|
388
|
+
elsif Set[TAG_V4_PORT_EXT,TAG_NEW_PORT_EXT,
|
|
389
|
+
TAG_REFERENCE_EXT,TAG_PORT_EXT].include?(tag)
|
|
384
390
|
result = binary_to_atom(i, data)
|
|
385
391
|
i = result[0]; node = result[1]
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
392
|
+
if tag == TAG_V4_PORT_EXT
|
|
393
|
+
id = data[i,8]
|
|
394
|
+
i += 8
|
|
395
|
+
else
|
|
396
|
+
id = data[i,4]
|
|
397
|
+
i += 4
|
|
398
|
+
end
|
|
399
|
+
if Set[TAG_V4_PORT_EXT,TAG_NEW_PORT_EXT].include?(tag)
|
|
389
400
|
creation = data[i,4]
|
|
390
401
|
i += 4
|
|
391
402
|
else
|
|
@@ -395,7 +406,8 @@ module Erlang
|
|
|
395
406
|
return [i, OtpErlangReference.new(node, id, creation)]
|
|
396
407
|
end
|
|
397
408
|
end
|
|
398
|
-
# tag ==
|
|
409
|
+
# tag == TAG_V4_PORT_EXT or tag == TAG_NEW_PORT_EXT or
|
|
410
|
+
# tag == TAG_PORT_EXT
|
|
399
411
|
return [i, OtpErlangPort.new(node, id, creation)]
|
|
400
412
|
elsif Set[TAG_NEW_PID_EXT, TAG_PID_EXT].include?(tag)
|
|
401
413
|
result = binary_to_atom(i, data)
|
|
@@ -597,6 +609,8 @@ module Erlang
|
|
|
597
609
|
raise ParseException, 'unparsed data', caller
|
|
598
610
|
end
|
|
599
611
|
return [i + j, term]
|
|
612
|
+
elsif tag == TAG_LOCAL_EXT
|
|
613
|
+
raise ParseException, 'LOCAL_EXT is opaque', caller
|
|
600
614
|
else
|
|
601
615
|
raise ParseException, 'invalid tag', caller
|
|
602
616
|
end
|
|
@@ -875,6 +889,8 @@ module Erlang
|
|
|
875
889
|
TAG_FUN_EXT = 117
|
|
876
890
|
TAG_ATOM_UTF8_EXT = 118
|
|
877
891
|
TAG_SMALL_ATOM_UTF8_EXT = 119
|
|
892
|
+
TAG_V4_PORT_EXT = 120
|
|
893
|
+
TAG_LOCAL_EXT = 121
|
|
878
894
|
|
|
879
895
|
end
|
|
880
896
|
|
data/tests/erlang_tests.rb
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
#
|
|
5
5
|
# MIT License
|
|
6
6
|
#
|
|
7
|
-
# Copyright (c) 2014-
|
|
7
|
+
# Copyright (c) 2014-2023 Michael Truog <mjtruog at protonmail dot com>
|
|
8
8
|
# Copyright (c) 2009-2013 Dmitry Vasiliev <dima@hlabs.org>
|
|
9
9
|
#
|
|
10
10
|
# Permission is hereby granted, free of charge, to any person obtaining a
|
|
@@ -339,6 +339,41 @@ class DecodeTestCase < Test::Unit::TestCase
|
|
|
339
339
|
assert_equal(-6618611909121,
|
|
340
340
|
Erlang::binary_to_term("\x83o\0\0\0\6\1\1\2\3\4\5\6"))
|
|
341
341
|
end
|
|
342
|
+
def test_binary_to_term_map
|
|
343
|
+
assert_raise(Erlang::ParseException){
|
|
344
|
+
Erlang::binary_to_term("\x83t")
|
|
345
|
+
}
|
|
346
|
+
assert_raise(Erlang::ParseException){
|
|
347
|
+
Erlang::binary_to_term("\x83t\x00")
|
|
348
|
+
}
|
|
349
|
+
assert_raise(Erlang::ParseException){
|
|
350
|
+
Erlang::binary_to_term("\x83t\x00\x00")
|
|
351
|
+
}
|
|
352
|
+
assert_raise(Erlang::ParseException){
|
|
353
|
+
Erlang::binary_to_term("\x83t\x00\x00\x00")
|
|
354
|
+
}
|
|
355
|
+
assert_raise(Erlang::ParseException){
|
|
356
|
+
Erlang::binary_to_term("\x83t\x00\x00\x00\x01")
|
|
357
|
+
}
|
|
358
|
+
assert_equal({}, Erlang::binary_to_term("\x83t\x00\x00\x00\x00"))
|
|
359
|
+
map1 = {
|
|
360
|
+
Erlang::OtpErlangAtom.new("a".encode(Encoding::ISO_8859_1)) => 1
|
|
361
|
+
}
|
|
362
|
+
map1_binary = "\x83t\x00\x00\x00\x01s\x01aa\x01"
|
|
363
|
+
assert_equal(map1, Erlang::binary_to_term(map1_binary))
|
|
364
|
+
map2 = {
|
|
365
|
+
Erlang::OtpErlangBinary.new("\xA8", 6) =>
|
|
366
|
+
Erlang::OtpErlangBinary.new("everything"),
|
|
367
|
+
nil => Erlang::OtpErlangBinary.new("nothing")
|
|
368
|
+
}
|
|
369
|
+
map2_binary = (
|
|
370
|
+
"\x83\x74\x00\x00\x00\x02\x77\x09\x75\x6E\x64\x65\x66\x69" \
|
|
371
|
+
"\x6E\x65\x64\x6D\x00\x00\x00\x07\x6E\x6F\x74\x68\x69\x6E" \
|
|
372
|
+
"\x67\x4D\x00\x00\x00\x01\x06\xA8\x6D\x00\x00\x00\x0A\x65" \
|
|
373
|
+
"\x76\x65\x72\x79\x74\x68\x69\x6E\x67"
|
|
374
|
+
)
|
|
375
|
+
assert_equal(map2, Erlang::binary_to_term(map2_binary))
|
|
376
|
+
end
|
|
342
377
|
def test_binary_to_term_pid
|
|
343
378
|
pid_old_binary = (
|
|
344
379
|
"\x83\x67\x64\x00\x0D\x6E\x6F\x6E\x6F\x64\x65\x40\x6E\x6F" \
|
|
@@ -377,6 +412,13 @@ class DecodeTestCase < Test::Unit::TestCase
|
|
|
377
412
|
assert_equal(Erlang::term_to_binary(port_new),
|
|
378
413
|
"\x83Ys\rnonode@nohost\x00\x00\x00\x06" \
|
|
379
414
|
"\x00\x00\x00\x00")
|
|
415
|
+
port_v4_binary = (
|
|
416
|
+
"\x83\x78\x77\x0D\x6E\x6F\x6E\x6F\x64\x65\x40\x6E\x6F\x68\x6F" \
|
|
417
|
+
"\x73\x74\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00"
|
|
418
|
+
)
|
|
419
|
+
port_v4 = Erlang::binary_to_term(port_v4_binary)
|
|
420
|
+
assert(port_v4.kind_of?(Erlang::OtpErlangPort))
|
|
421
|
+
assert_equal(Erlang::term_to_binary(port_v4), port_v4_binary)
|
|
380
422
|
end
|
|
381
423
|
def test_binary_to_term_ref
|
|
382
424
|
ref_new_binary = (
|
|
@@ -633,6 +675,27 @@ class EncodeTestCase < Test::Unit::TestCase
|
|
|
633
675
|
assert_equal("\x83F\xc0\t!\xfbM\x12\xd8J",
|
|
634
676
|
Erlang::term_to_binary(-3.1415926))
|
|
635
677
|
end
|
|
678
|
+
def test_term_to_binary_map
|
|
679
|
+
assert_equal("\x83t\x00\x00\x00\x00", Erlang::term_to_binary({}))
|
|
680
|
+
map1 = {
|
|
681
|
+
Erlang::OtpErlangAtom.new("a".encode(Encoding::ISO_8859_1)) => 1
|
|
682
|
+
}
|
|
683
|
+
map1_binary = "\x83t\x00\x00\x00\x01s\x01aa\x01"
|
|
684
|
+
assert_equal(map1_binary, Erlang::term_to_binary(map1))
|
|
685
|
+
map2 = {
|
|
686
|
+
Erlang::OtpErlangAtom.new("undefined".encode(Encoding::UTF_8)) =>
|
|
687
|
+
Erlang::OtpErlangBinary.new("nothing"),
|
|
688
|
+
Erlang::OtpErlangBinary.new("\xA8", 6) =>
|
|
689
|
+
Erlang::OtpErlangBinary.new("everything")
|
|
690
|
+
}
|
|
691
|
+
map2_binary = (
|
|
692
|
+
"\x83\x74\x00\x00\x00\x02\x77\x09\x75\x6E\x64\x65\x66\x69" \
|
|
693
|
+
"\x6E\x65\x64\x6D\x00\x00\x00\x07\x6E\x6F\x74\x68\x69\x6E" \
|
|
694
|
+
"\x67\x4D\x00\x00\x00\x01\x06\xA8\x6D\x00\x00\x00\x0A\x65" \
|
|
695
|
+
"\x76\x65\x72\x79\x74\x68\x69\x6E\x67"
|
|
696
|
+
)
|
|
697
|
+
assert_equal(map2_binary, Erlang::term_to_binary(map2))
|
|
698
|
+
end
|
|
636
699
|
def test_term_to_binary_compressed_term
|
|
637
700
|
assert_equal(
|
|
638
701
|
"\x83P\x00\x00\x00\x15x\x9c\xcba``\xe0\xcfB\x03\x00B@\x07\x1c",
|
data.tar.gz.sig
CHANGED
|
Binary file
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: erlang_rb
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.0.
|
|
4
|
+
version: 2.0.6
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Michael Truog
|
|
@@ -34,7 +34,7 @@ cert_chain:
|
|
|
34
34
|
CUaImqpeG21iNKLYHcNZkGfepUpp4FHudbeQeaJj8R5ug+f402l7T4s3JCAOcVIY
|
|
35
35
|
MqZAStuHt2H1iR+JVSpFx1kkRJncIjtSnxUFd4MsBT083aOme9H/J+tb/YA=
|
|
36
36
|
-----END CERTIFICATE-----
|
|
37
|
-
date:
|
|
37
|
+
date: 2023-06-21 00:00:00.000000000 Z
|
|
38
38
|
dependencies: []
|
|
39
39
|
description: Erlang External Term Format for Ruby
|
|
40
40
|
email: mjtruog@protonmail.com
|
metadata.gz.sig
CHANGED
|
Binary file
|