bert 1.0.0 → 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.
- data/.gitignore +3 -0
- data/History.txt +9 -0
- data/README.md +8 -5
- data/Rakefile +34 -4
- data/VERSION +1 -1
- data/bench/bench.rb +36 -0
- data/bench/decode_bench.rb +87 -0
- data/bench/encode_bench.rb +36 -0
- data/bench/results.txt +55 -0
- data/bert.gemspec +14 -6
- data/ext/bert/c/decode.c +438 -0
- data/ext/bert/c/extconf.rb +11 -0
- data/lib/bert.rb +14 -23
- data/lib/bert/bert.rb +21 -0
- data/lib/bert/decode.rb +248 -0
- data/lib/bert/decoder.rb +1 -53
- data/lib/bert/encode.rb +142 -0
- data/lib/bert/encoder.rb +13 -14
- data/lib/bert/types.rb +21 -0
- data/test/decoder_test.rb +51 -24
- data/test/encoder_test.rb +10 -5
- data/test/test_helper.rb +1 -12
- metadata +15 -14
data/lib/bert/encoder.rb
CHANGED
@@ -6,38 +6,37 @@ module BERT
|
|
6
6
|
# Returns a BERT
|
7
7
|
def self.encode(ruby)
|
8
8
|
complex_ruby = convert(ruby)
|
9
|
-
|
9
|
+
Encode.encode(complex_ruby)
|
10
10
|
end
|
11
11
|
|
12
|
-
# Convert Ruby
|
13
|
-
# of BERT complex types.
|
12
|
+
# Convert complex Ruby form in simple Ruby form.
|
14
13
|
# +item+ is the Ruby object to convert
|
15
14
|
#
|
16
15
|
# Returns the converted Ruby object
|
17
16
|
def self.convert(item)
|
18
17
|
case item
|
19
18
|
when Hash
|
20
|
-
pairs =
|
21
|
-
item.each_pair { |k, v| pairs << [convert(k), convert(v)] }
|
22
|
-
[:bert, :dict, pairs]
|
19
|
+
pairs = []
|
20
|
+
item.each_pair { |k, v| pairs << t[convert(k), convert(v)] }
|
21
|
+
t[:bert, :dict, pairs]
|
23
22
|
when Tuple
|
24
|
-
item.map { |x| convert(x) }
|
23
|
+
Tuple.new(item.map { |x| convert(x) })
|
25
24
|
when Array
|
26
|
-
|
25
|
+
item.map { |x| convert(x) }
|
27
26
|
when nil
|
28
|
-
[:bert, :nil]
|
27
|
+
t[:bert, :nil]
|
29
28
|
when TrueClass
|
30
|
-
[:bert, :true]
|
29
|
+
t[:bert, :true]
|
31
30
|
when FalseClass
|
32
|
-
[:bert, :false]
|
31
|
+
t[:bert, :false]
|
33
32
|
when Time
|
34
|
-
[:bert, :time, item.to_i / 1_000_000, item.to_i % 1_000_000, item.usec]
|
33
|
+
t[:bert, :time, item.to_i / 1_000_000, item.to_i % 1_000_000, item.usec]
|
35
34
|
when Regexp
|
36
|
-
options =
|
35
|
+
options = []
|
37
36
|
options << :caseless if item.options & Regexp::IGNORECASE > 0
|
38
37
|
options << :extended if item.options & Regexp::EXTENDED > 0
|
39
38
|
options << :multiline if item.options & Regexp::MULTILINE > 0
|
40
|
-
[:bert, :regex, item.source, options]
|
39
|
+
t[:bert, :regex, item.source, options]
|
41
40
|
else
|
42
41
|
item
|
43
42
|
end
|
data/lib/bert/types.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
module BERT
|
2
|
+
module Types
|
3
|
+
SMALL_INT = 97
|
4
|
+
INT = 98
|
5
|
+
SMALL_BIGNUM = 110
|
6
|
+
LARGE_BIGNUM = 111
|
7
|
+
FLOAT = 99
|
8
|
+
ATOM = 100
|
9
|
+
SMALL_TUPLE = 104
|
10
|
+
LARGE_TUPLE = 105
|
11
|
+
NIL = 106
|
12
|
+
STRING = 107
|
13
|
+
LIST = 108
|
14
|
+
BIN = 109
|
15
|
+
FUN = 117
|
16
|
+
NEW_FUN = 112
|
17
|
+
MAGIC = 131
|
18
|
+
MAX_INT = (1 << 27) -1
|
19
|
+
MIN_INT = -(1 << 27)
|
20
|
+
end
|
21
|
+
end
|
data/test/decoder_test.rb
CHANGED
@@ -1,64 +1,91 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class DecoderTest < Test::Unit::TestCase
|
4
|
+
BERT_NIL = [131,104,2,100,0,4,98,101,114,116,100,0,3,110,105,108].pack('c*')
|
5
|
+
BERT_TRUE = [131,104,2,100,0,4,98,101,114,116,100,0,4,116,114,117,101].pack('c*')
|
6
|
+
BERT_FALSE = [131,104,2,100,0,4,98,101,114,116,100,0,5,102,97,108,115,101].pack('c*')
|
7
|
+
|
4
8
|
context "BERT Decoder complex type converter" do
|
5
9
|
should "convert nil" do
|
6
|
-
|
7
|
-
after = nil
|
8
|
-
assert_equal after, BERT::Decoder.convert(before)
|
10
|
+
assert_equal nil, BERT::Decoder.decode(BERT_NIL)
|
9
11
|
end
|
10
12
|
|
11
13
|
should "convert nested nil" do
|
12
|
-
|
13
|
-
|
14
|
-
|
14
|
+
bert = [131,108,0,0,0,2,104,2,100,0,4,98,101,114,116,100,0,3,110,105,
|
15
|
+
108,108,0,0,0,1,104,2,100,0,4,98,101,114,116,100,0,3,110,105,
|
16
|
+
108,106,106].pack('c*')
|
17
|
+
assert_equal [nil, [nil]], BERT::Decoder.decode(bert)
|
15
18
|
end
|
16
19
|
|
17
20
|
should "convert hashes" do
|
18
|
-
|
21
|
+
bert = [131,104,3,100,0,4,98,101,114,116,100,0,4,100,105,99,116,108,
|
22
|
+
0,0,0,1,104,2,100,0,3,102,111,111,109,0,0,0,3,98,97,114,
|
23
|
+
106].pack('c*')
|
19
24
|
after = {:foo => 'bar'}
|
20
|
-
assert_equal after, BERT::Decoder.
|
25
|
+
assert_equal after, BERT::Decoder.decode(bert)
|
21
26
|
end
|
22
27
|
|
23
28
|
should "convert empty hashes" do
|
24
|
-
|
29
|
+
bert = [131,104,3,100,0,4,98,101,114,116,100,0,4,100,105,99,116,
|
30
|
+
106].pack('c*')
|
25
31
|
after = {}
|
26
|
-
assert_equal after, BERT::Decoder.
|
32
|
+
assert_equal after, BERT::Decoder.decode(bert)
|
27
33
|
end
|
28
34
|
|
29
35
|
should "convert nested hashes" do
|
30
|
-
|
36
|
+
bert = [131,104,3,100,0,4,98,101,114,116,100,0,4,100,105,99,116,108,0,
|
37
|
+
0,0,1,104,2,100,0,3,102,111,111,104,3,100,0,4,98,101,114,116,
|
38
|
+
100,0,4,100,105,99,116,108,0,0,0,1,104,2,100,0,3,98,97,122,109,
|
39
|
+
0,0,0,3,98,97,114,106,106].pack('c*')
|
31
40
|
after = {:foo => {:baz => 'bar'}}
|
32
|
-
assert_equal after, BERT::Decoder.
|
41
|
+
assert_equal after, BERT::Decoder.decode(bert)
|
33
42
|
end
|
34
43
|
|
35
44
|
should "convert true" do
|
36
|
-
|
37
|
-
after = true
|
38
|
-
assert_equal after, BERT::Decoder.convert(before)
|
45
|
+
assert_equal true, BERT::Decoder.decode(BERT_TRUE)
|
39
46
|
end
|
40
47
|
|
41
48
|
should "convert false" do
|
42
|
-
|
43
|
-
after = false
|
44
|
-
assert_equal after, BERT::Decoder.convert(before)
|
49
|
+
assert_equal false, BERT::Decoder.decode(BERT_FALSE)
|
45
50
|
end
|
46
51
|
|
47
52
|
should "convert times" do
|
48
|
-
|
53
|
+
bert = [131,104,5,100,0,4,98,101,114,116,100,0,4,116,105,109,101,98,0,
|
54
|
+
0,4,230,98,0,14,228,195,97,0].pack('c*')
|
49
55
|
after = Time.at(1254976067)
|
50
|
-
assert_equal after, BERT::Decoder.
|
56
|
+
assert_equal after, BERT::Decoder.decode(bert)
|
51
57
|
end
|
52
58
|
|
53
59
|
should "convert regexen" do
|
54
|
-
|
60
|
+
bert = [131,104,4,100,0,4,98,101,114,116,100,0,5,114,101,103,101,120,
|
61
|
+
109,0,0,0,7,94,99,40,97,41,116,36,108,0,0,0,2,100,0,8,99,97,
|
62
|
+
115,101,108,101,115,115,100,0,8,101,120,116,101,110,100,101,
|
63
|
+
100,106].pack('c*')
|
55
64
|
after = /^c(a)t$/ix
|
56
|
-
assert_equal after, BERT::Decoder.
|
65
|
+
assert_equal after, BERT::Decoder.decode(bert)
|
57
66
|
end
|
58
67
|
|
59
68
|
should "leave other stuff alone" do
|
60
|
-
|
61
|
-
|
69
|
+
bert = [131,108,0,0,0,3,97,1,99,50,46,48,48,48,48,48,48,48,48,48,48,48,
|
70
|
+
48,48,48,48,48,48,48,48,48,101,43,48,48,0,0,0,0,0,108,0,0,0,2,
|
71
|
+
100,0,3,102,111,111,109,0,0,0,3,98,97,114,106,106].pack('c*')
|
72
|
+
after = [1, 2.0, [:foo, 'bar']]
|
73
|
+
assert_equal after, BERT::Decoder.decode(bert)
|
74
|
+
end
|
75
|
+
|
76
|
+
should "handle bignums" do
|
77
|
+
bert = [131,110,8,0,0,0,232,137,4,35,199,138].pack('c*')
|
78
|
+
assert_equal 10_000_000_000_000_000_000, BERT::Decoder.decode(bert)
|
79
|
+
end
|
80
|
+
|
81
|
+
should "handle bytelists" do
|
82
|
+
bert = [131,104,3,100,0,3,102,111,111,107,0,2,97,97,100,0,3,98,97,114].pack('c*')
|
83
|
+
assert_equal t[:foo, [97, 97], :bar], BERT::Decoder.decode(bert)
|
84
|
+
end
|
85
|
+
|
86
|
+
should "handle massive binaries" do
|
87
|
+
bert = [131,109,0,128,0,0].pack('c*') + ('a' * (8 * 1024 * 1024))
|
88
|
+
assert_equal (8 * 1024 * 1024), BERT::Decoder.decode(bert).size
|
62
89
|
end
|
63
90
|
end
|
64
91
|
end
|
data/test/encoder_test.rb
CHANGED
@@ -27,7 +27,7 @@ class EncoderTest < Test::Unit::TestCase
|
|
27
27
|
should "convert hash to tuple with array of tuples" do
|
28
28
|
arr = BERT::Encoder.convert({:foo => 'bar'})
|
29
29
|
assert arr.is_a?(Array)
|
30
|
-
assert arr[2].is_a?(
|
30
|
+
assert arr[2].is_a?(Array)
|
31
31
|
assert arr[2][0].is_a?(Array)
|
32
32
|
end
|
33
33
|
|
@@ -38,13 +38,13 @@ class EncoderTest < Test::Unit::TestCase
|
|
38
38
|
|
39
39
|
should "convert array to erl list" do
|
40
40
|
list = BERT::Encoder.convert([1, 2])
|
41
|
-
assert list.is_a?(
|
41
|
+
assert list.is_a?(Array)
|
42
42
|
end
|
43
43
|
|
44
44
|
should "convert an array in a tuple" do
|
45
45
|
arrtup = BERT::Encoder.convert(t[:foo, [1, 2]])
|
46
46
|
assert arrtup.is_a?(Array)
|
47
|
-
assert arrtup[1].is_a?(
|
47
|
+
assert arrtup[1].is_a?(Array)
|
48
48
|
end
|
49
49
|
|
50
50
|
should "convert true" do
|
@@ -74,9 +74,14 @@ class EncoderTest < Test::Unit::TestCase
|
|
74
74
|
should "properly convert types" do
|
75
75
|
ruby = t[:user, {:name => 'TPW'}, [/cat/i, 9.9], nil, true, false, :true, :false]
|
76
76
|
cruby = BERT::Encoder.convert(ruby)
|
77
|
-
assert cruby.instance_of?(
|
77
|
+
assert cruby.instance_of?(BERT::Tuple)
|
78
78
|
assert cruby[0].instance_of?(Symbol)
|
79
|
-
assert cruby[1].instance_of?(
|
79
|
+
assert cruby[1].instance_of?(BERT::Tuple)
|
80
|
+
end
|
81
|
+
|
82
|
+
should "handle bignums" do
|
83
|
+
bert = [131,110,8,0,0,0,232,137,4,35,199,138].pack('c*')
|
84
|
+
assert_equal bert, BERT::Encoder.encode(10_000_000_000_000_000_000)
|
80
85
|
end
|
81
86
|
|
82
87
|
should "leave other stuff alone" do
|
data/test/test_helper.rb
CHANGED
@@ -5,15 +5,4 @@ require 'shoulda'
|
|
5
5
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
6
6
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
7
7
|
require 'bert'
|
8
|
-
|
9
|
-
class Test::Unit::TestCase
|
10
|
-
end
|
11
|
-
|
12
|
-
# So I can easily see which arrays are Erl::List
|
13
|
-
module Erl
|
14
|
-
class List
|
15
|
-
def inspect
|
16
|
-
"l#{super}"
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
8
|
+
puts "Using #{BERT::Decode.impl} implementation."
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bert
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Preston-Werner
|
@@ -9,19 +9,9 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-10-
|
12
|
+
date: 2009-10-28 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
|
-
- !ruby/object:Gem::Dependency
|
16
|
-
name: erlectricity
|
17
|
-
type: :runtime
|
18
|
-
version_requirement:
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 1.1.0
|
24
|
-
version:
|
25
15
|
- !ruby/object:Gem::Dependency
|
26
16
|
name: thoughtbot-shoulda
|
27
17
|
type: :development
|
@@ -36,8 +26,8 @@ description: BERT Serializiation for Ruby
|
|
36
26
|
email: tom@mojombo.com
|
37
27
|
executables: []
|
38
28
|
|
39
|
-
extensions:
|
40
|
-
|
29
|
+
extensions:
|
30
|
+
- ext/bert/c/extconf.rb
|
41
31
|
extra_rdoc_files:
|
42
32
|
- LICENSE
|
43
33
|
- README.md
|
@@ -49,10 +39,20 @@ files:
|
|
49
39
|
- README.md
|
50
40
|
- Rakefile
|
51
41
|
- VERSION
|
42
|
+
- bench/bench.rb
|
43
|
+
- bench/decode_bench.rb
|
44
|
+
- bench/encode_bench.rb
|
45
|
+
- bench/results.txt
|
52
46
|
- bert.gemspec
|
47
|
+
- ext/bert/c/decode.c
|
48
|
+
- ext/bert/c/extconf.rb
|
53
49
|
- lib/bert.rb
|
50
|
+
- lib/bert/bert.rb
|
51
|
+
- lib/bert/decode.rb
|
54
52
|
- lib/bert/decoder.rb
|
53
|
+
- lib/bert/encode.rb
|
55
54
|
- lib/bert/encoder.rb
|
55
|
+
- lib/bert/types.rb
|
56
56
|
- test/bert_test.rb
|
57
57
|
- test/decoder_test.rb
|
58
58
|
- test/encoder_test.rb
|
@@ -66,6 +66,7 @@ rdoc_options:
|
|
66
66
|
- --charset=UTF-8
|
67
67
|
require_paths:
|
68
68
|
- lib
|
69
|
+
- ext
|
69
70
|
required_ruby_version: !ruby/object:Gem::Requirement
|
70
71
|
requirements:
|
71
72
|
- - ">="
|