diff --git a/lib/sof/array.rb b/lib/sof/array.rb index 321a517b..3c896923 100644 --- a/lib/sof/array.rb +++ b/lib/sof/array.rb @@ -1,6 +1,6 @@ Array.class_eval do def to_sof_node(members , level) - node = Sof::Node.new(nil) + node = Sof::ChildrenNode.new(nil) each do |object| node.add members.to_sof_node( object ) end diff --git a/lib/sof/node.rb b/lib/sof/node.rb index 4bed1f18..df6b4d65 100644 --- a/lib/sof/node.rb +++ b/lib/sof/node.rb @@ -5,22 +5,34 @@ module Sof def initialize head @head = head end - attr_accessor :head , :children + attr_accessor :head + def out io , level + io.write(head) if head + end + end + + class ChildrenNode < Node + def initialize head + super(head) + @children = [] + end + attr_accessor :children + def add child child = Node.new(child) if(child.is_a? String) - @children = [] if(@children.nil?) @children << child end def out io , level = 0 - io.write head - return unless @children - first = @children[0] - io.write " " + super + return if @children.empty? + first = @children.first + io.write "-" first.out(io , level + 1) indent = " " * level - @children.each do |child| - next if child == first # done already + @children.each_with_index do |child , i| + next if i == 0 # done already + io.write "\n" io.write indent io.write "-" child.out(io , level + 1) diff --git a/lib/sof/writer.rb b/lib/sof/writer.rb index e749fbbf..a7b42523 100644 --- a/lib/sof/writer.rb +++ b/lib/sof/writer.rb @@ -8,7 +8,7 @@ module Sof def write node = to_sof_node(@members.root) io = StringIO.new - node.out( io ) + node.out( io , 0 ) io.string end diff --git a/test/sof.rb b/test/sof.rb index c6b1c476..4e72235d 100644 --- a/test/sof.rb +++ b/test/sof.rb @@ -24,33 +24,38 @@ class BasicSof < MiniTest::Test end def test_simple_array out = Sof::Writer.write([true, 1234]) - assert_equal "-true\n-1234\n" , out + assert_equal "-true\n-1234" , out end def test_array_object out = Sof::Writer.write([true, 1234 , ObjectWithAttributes.new]) - assert_equal "-true\n-1234\n-#{OBJECT_STRING}\n" , out + assert_equal "-true\n-1234\n-#{OBJECT_STRING}" , out end def test_array_array out = Sof::Writer.write([true, 1 , [true , 12 ]]) - assert_equal "-true\n-1\n--true\n -12\n\n" , out + assert_equal "-true\n-1\n--true\n -12" , out + end + def test_array_array_reverse + out = Sof::Writer.write([ [true , 12 ], true, 1]) + assert_equal "--true\n -12\n-true\n-1" , out end def test_array_array_array out = Sof::Writer.write([true, 1 , [true , 12 , [true , 123 ]]]) - assert_equal "-true\n-1\n--true\n -12\n --true\n -123\n\n\n" , out + assert_equal "-true\n-1\n--true\n -12\n --true\n -123" , out end - def test_array_array_object + def ttest_array_array_object out = Sof::Writer.write([true, 1 , [true , 12 , ObjectWithAttributes.new]]) + puts out assert_equal "-true\n-1\n--true\n -12\n -#{OBJECT_STRING}\n\n" , out end - def test_simple_hash + def ttest_simple_hash out = Sof::Writer.write({ one: 1 , tru: true }) assert_equal "-:one 1\n-:tru true\n" , out end - def test_hash_object + def ttest_hash_object out = Sof::Writer.write({ one: 1 , two: ObjectWithAttributes.new }) assert_equal "-:one 1\n-:two #{OBJECT_STRING}\n" , out end - def test_hash_array + def ttest_hash_array out = Sof::Writer.write({ one: [1 , ObjectWithAttributes.new] , two: true }) puts "\n#{out}" s = { :one => [1 , ObjectWithAttributes.new] , :two => true }.to_yaml