James Gray wrote: > On Jun 5, 2006, at 7:38 AM, Shane Emmons wrote: > >> Question, should {w: 1, t: 7} be an OpenStruct or remain a hash? > > My opinion is an OpenStruct, for consistency. > > James Edward Gray II Great, then here is my solution along with test code and input file. Not as small as most solutions, but hopefully understandable. Please let me know if you spot anything wrong with it. --- yaml2os.rb --- #!/usr/local/bin/ruby -w require 'yaml' require 'ostruct' class YAML2OS attr_reader :os def initialize( file = nil ) convert(file) if file end def convert( file ) yaml = YAML.load(File.open(file)) @os = hash2os(yaml) end private # Check for hashes and arrays inside 'hash'. Convert any hashes. def hash2os( hash ) hash.each_key do |key| hash[key] = hash2os(hash[key]) if hash[key].is_a?(Hash) chk_array(hash[key]) if hash[key].is_a?(Array) end hash = OpenStruct.new(hash) end # Check for hashes and arrays inside 'array'. Convert any hashes. def chk_array( array ) array.each_index do |i| array[i] = hash2os(array[i]) if array[i].is_a?(Hash) chk_array(array[i]) if array[i].is_a?(Array) end end end --- tc_yaml2os.rb --- #!/usr/local/bin/ruby -w require 'test/unit' require 'ostruct' require 'yaml2os' class TC_YAML2OS < Test::Unit::TestCase def setup @os = OpenStruct.new @os.foo = 1 @os.bar = OpenStruct.new @os.bar.baz = [ 1, 2, OpenStruct.new({'b' => 1, 'c' => 2}), [3, 4, [5, OpenStruct.new({'d' => 3})]] ] @os.bar.quux = 42 @os.bar.doctors = [ 'William Hartnell', 'Patrick Troughton', 'Jon Pertwee', 'Tom Baker', 'Peter Davison', 'Colin Baker', 'Sylvester McCoy', 'Paul McGann', 'Christopher Eccleston', 'David Tennant', OpenStruct.new({'w' => 1, 't' => 7}) ] @os.bar.a = OpenStruct.new({'x' => 1, 'y' => 2, 'z' => 3}) @os.bar.b = OpenStruct.new({'a' => [ 1, OpenStruct.new({'b' => 2}) ]}) test_construction end def test_construction @yaml2os = YAML2OS.new('test.yaml') assert_not_nil(@yaml2os) assert_instance_of(YAML2OS, @yaml2os) assert_equal(@os, @yaml2os.os) @yaml2os = YAML2OS.new assert_not_nil(@yaml2os) assert_instance_of(YAML2OS, @yaml2os) assert_nil(@yaml2os.os) end def test_convert os = @yaml2os.convert('test.yaml') assert_equal(@os, os) assert_equal(@os, @yaml2os.os) end end --- test.yaml --- --- foo: 1 bar: baz: [1, 2, {b: 1, c: 2}, [3, 4, [5, {d: 3}]]] quux: 42 doctors: - William Hartnell - Patrick Troughton - Jon Pertwee - Tom Baker - Peter Davison - Colin Baker - Sylvester McCoy - Paul McGann - Christopher Eccleston - David Tennant - {w: 1, t: 7} a: {x: 1, y: 2, z: 3} b: {a: [1, {b: 2}]} -- Posted via http://www.ruby-forum.com/.