зеркало из https://github.com/github/bert.git
switch to explicitly declaring tuples instead of lists
This commit is contained in:
Родитель
3d28846aea
Коммит
a13f8746e6
|
@ -22,11 +22,12 @@ Instances of the following Ruby classes will be automatically converted to the p
|
||||||
* Time
|
* Time
|
||||||
* Regexp
|
* Regexp
|
||||||
|
|
||||||
Most of these conversions work as expected with one important caveat. Arrays will be converted into tuples. To have an array converted as a list, simply prepend it with `l` like so:
|
To designate tuples, simply prefix an Array literal with a `t` or use the BERT::Tuple class:
|
||||||
|
|
||||||
[:foo, l[1, 2, 3]]
|
t[:foo, [1, 2, 3]]
|
||||||
|
BERT::Tuple.new([:foo, [1, 2, 3]])
|
||||||
|
|
||||||
This will be converted as (in Erlang syntax):
|
Both of these will be converted to (in Erlang syntax):
|
||||||
|
|
||||||
{foo, [1, 2, 3]}
|
{foo, [1, 2, 3]}
|
||||||
|
|
||||||
|
|
12
lib/bert.rb
12
lib/bert.rb
|
@ -20,6 +20,14 @@ module BERT
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def l
|
module BERT
|
||||||
Erl::List
|
class Tuple < Array
|
||||||
|
def inspect
|
||||||
|
"t#{super}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def t
|
||||||
|
BERT::Tuple
|
||||||
end
|
end
|
|
@ -20,6 +20,8 @@ module BERT
|
||||||
item.to_s.to_sym
|
item.to_s.to_sym
|
||||||
when [:nil, :nil]
|
when [:nil, :nil]
|
||||||
nil
|
nil
|
||||||
|
when Erl::List
|
||||||
|
item.map { |x| convert(x) }
|
||||||
when Array
|
when Array
|
||||||
case item.first
|
case item.first
|
||||||
when :dict
|
when :dict
|
||||||
|
@ -37,7 +39,7 @@ module BERT
|
||||||
options |= Regexp::MULTILINE if item[2] =~ /m/
|
options |= Regexp::MULTILINE if item[2] =~ /m/
|
||||||
Regexp.new(item[1], options)
|
Regexp.new(item[1], options)
|
||||||
else
|
else
|
||||||
item.map { |x| convert(x) }
|
Tuple.new(item.map { |x| convert(x) })
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
item
|
item
|
||||||
|
|
|
@ -17,11 +17,13 @@ module BERT
|
||||||
def self.convert(item)
|
def self.convert(item)
|
||||||
case item
|
case item
|
||||||
when Hash
|
when Hash
|
||||||
pairs = l[]
|
pairs = Erl::List[]
|
||||||
item.each_pair { |k, v| pairs << [convert(k), convert(v)] }
|
item.each_pair { |k, v| pairs << [convert(k), convert(v)] }
|
||||||
[:dict, pairs]
|
[:dict, pairs]
|
||||||
when Array
|
when Tuple
|
||||||
item.map { |x| convert(x) }
|
item.map { |x| convert(x) }
|
||||||
|
when Array
|
||||||
|
Erl::List.new(item.map { |x| convert(x) })
|
||||||
when nil
|
when nil
|
||||||
[:nil, :nil]
|
[:nil, :nil]
|
||||||
when TrueClass, FalseClass
|
when TrueClass, FalseClass
|
||||||
|
|
|
@ -3,10 +3,10 @@ require 'test_helper'
|
||||||
class BertTest < Test::Unit::TestCase
|
class BertTest < Test::Unit::TestCase
|
||||||
context "BERT" do
|
context "BERT" do
|
||||||
setup do
|
setup do
|
||||||
t = Time.at(1254976067)
|
time = Time.at(1254976067)
|
||||||
@ruby = [:user, {:name => 'TPW'}, l[/cat/i, 9.9], nil, true, false, :true, :false]
|
@ruby = t[:user, {:name => 'TPW'}, [/cat/i, 9.9], nil, true, false, :true, :false]
|
||||||
@bert = "\203h\bd\000\004userh\002d\000\004dictl\000\000\000\001h\002d\000\004namem\000\000\000\003TPWjh\002h\003d\000\005regexm\000\000\000\003catm\000\000\000\001ic9.900000000000000e+00\000\000\000\000\000\000\000\000\000\000h\002d\000\003nild\000\003nilh\002d\000\004boold\000\004trueh\002d\000\004boold\000\005falsed\000\004trued\000\005false"
|
@bert = "\203h\bd\000\004userh\002d\000\004dictl\000\000\000\001h\002d\000\004namem\000\000\000\003TPWjl\000\000\000\002h\003d\000\005regexm\000\000\000\003catm\000\000\000\001ic9.900000000000000e+00\000\000\000\000\000\000\000\000\000\000jh\002d\000\003nild\000\003nilh\002d\000\004boold\000\004trueh\002d\000\004boold\000\005falsed\000\004trued\000\005false"
|
||||||
@ebin = "<<131,104,8,100,0,4,117,115,101,114,104,2,100,0,4,100,105,99,116,108,0,0,0,1,104,2,100,0,4,110,97,109,101,109,0,0,0,3,84,80,87,106,104,2,104,3,100,0,5,114,101,103,101,120,109,0,0,0,3,99,97,116,109,0,0,0,1,105,99,57,46,57,48,48,48,48,48,48,48,48,48,48,48,48,48,48,101,43,48,48,0,0,0,0,0,0,0,0,0,0,104,2,100,0,3,110,105,108,100,0,3,110,105,108,104,2,100,0,4,98,111,111,108,100,0,4,116,114,117,101,104,2,100,0,4,98,111,111,108,100,0,5,102,97,108,115,101,100,0,4,116,114,117,101,100,0,5,102,97,108,115,101>>"
|
@ebin = "<<131,104,8,100,0,4,117,115,101,114,104,2,100,0,4,100,105,99,116,108,0,0,0,1,104,2,100,0,4,110,97,109,101,109,0,0,0,3,84,80,87,106,108,0,0,0,2,104,3,100,0,5,114,101,103,101,120,109,0,0,0,3,99,97,116,109,0,0,0,1,105,99,57,46,57,48,48,48,48,48,48,48,48,48,48,48,48,48,48,101,43,48,48,0,0,0,0,0,0,0,0,0,0,106,104,2,100,0,3,110,105,108,100,0,3,110,105,108,104,2,100,0,4,98,111,111,108,100,0,4,116,114,117,101,104,2,100,0,4,98,111,111,108,100,0,5,102,97,108,115,101,100,0,4,116,114,117,101,100,0,5,102,97,108,115,101>>"
|
||||||
end
|
end
|
||||||
|
|
||||||
should "encode" do
|
should "encode" do
|
||||||
|
@ -20,5 +20,15 @@ class BertTest < Test::Unit::TestCase
|
||||||
should "ebin" do
|
should "ebin" do
|
||||||
assert_equal @ebin, BERT.ebin(@bert)
|
assert_equal @ebin, BERT.ebin(@bert)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# should "let me inspect it" do
|
||||||
|
# puts
|
||||||
|
# p @ruby
|
||||||
|
# ruby2 = BERT.decode(@bert)
|
||||||
|
# p ruby2
|
||||||
|
# bert2 = BERT.encode(ruby2)
|
||||||
|
# ruby3 = BERT.decode(bert2)
|
||||||
|
# p ruby3
|
||||||
|
# end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -24,6 +24,29 @@ class EncoderTest < Test::Unit::TestCase
|
||||||
assert_equal after, BERT::Encoder.convert(before)
|
assert_equal after, BERT::Encoder.convert(before)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
should "convert hash to tuple with array of tuples" do
|
||||||
|
arr = BERT::Encoder.convert({:foo => 'bar'})
|
||||||
|
assert arr.is_a?(Array)
|
||||||
|
assert arr[1].is_a?(Erl::List)
|
||||||
|
assert arr[1][0].is_a?(Array)
|
||||||
|
end
|
||||||
|
|
||||||
|
should "convert tuple to array" do
|
||||||
|
arr = BERT::Encoder.convert(t[:foo, 2])
|
||||||
|
assert arr.is_a?(Array)
|
||||||
|
end
|
||||||
|
|
||||||
|
should "convert array to erl list" do
|
||||||
|
list = BERT::Encoder.convert([1, 2])
|
||||||
|
assert list.is_a?(Erl::List)
|
||||||
|
end
|
||||||
|
|
||||||
|
should "convert an array in a tuple" do
|
||||||
|
arrtup = BERT::Encoder.convert(t[:foo, [1, 2]])
|
||||||
|
assert arrtup.is_a?(Array)
|
||||||
|
assert arrtup[1].is_a?(Erl::List)
|
||||||
|
end
|
||||||
|
|
||||||
should "convert true" do
|
should "convert true" do
|
||||||
before = true
|
before = true
|
||||||
after = [:bool, :true]
|
after = [:bool, :true]
|
||||||
|
@ -48,6 +71,14 @@ class EncoderTest < Test::Unit::TestCase
|
||||||
assert_equal after, BERT::Encoder.convert(before)
|
assert_equal after, BERT::Encoder.convert(before)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
should "properly convert types" do
|
||||||
|
ruby = t[:user, {:name => 'TPW'}, [/cat/i, 9.9], nil, true, false, :true, :false]
|
||||||
|
cruby = BERT::Encoder.convert(ruby)
|
||||||
|
assert cruby.instance_of?(Array)
|
||||||
|
assert cruby[0].instance_of?(Symbol)
|
||||||
|
assert cruby[1].instance_of?(Array)
|
||||||
|
end
|
||||||
|
|
||||||
should "leave other stuff alone" do
|
should "leave other stuff alone" do
|
||||||
before = [1, 2.0, [:foo, 'bar']]
|
before = [1, 2.0, [:foo, 'bar']]
|
||||||
assert_equal before, BERT::Encoder.convert(before)
|
assert_equal before, BERT::Encoder.convert(before)
|
||||||
|
|
|
@ -8,3 +8,12 @@ require 'bert'
|
||||||
|
|
||||||
class Test::Unit::TestCase
|
class Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# So I can easily see which arrays are Erl::List
|
||||||
|
module Erl
|
||||||
|
class List
|
||||||
|
def inspect
|
||||||
|
"l#{super}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Загрузка…
Ссылка в новой задаче