From: why t. l. s. <yam...@wh...> - 2003-01-09 04:51:07
|
Robert Feldt (fe...@ce...) wrote: > > I briefly tried 0.47 and like it. Using it in two projects already. Never > really liked XML... > So good to hear. > Two things though, when I use Yaml for ini files I'd like to be able to > spec an order for map pairs to be serialized in. Obviously Ruby hashes has > no garantuee for this but are there any plans on supporting this? If not > I'll whip something up myself; I really wanna make sure the most important > stuff comes out on top... Was that two things? Here's a few solutions to your dilemma: 1. When using objects, you can specify the ordering of your properties explicitly by defining a `to_yaml_properties' method. >> class Instrument >> attr_accessor :name, :key, :is_woodwind >> def initialize( n, k, ww ) >> @name, @key, @is_woodwind = n, k, ww >> end >> def to_yaml_properties >> [ '@name', '@key', '@is_woodwind' ] >> end >> end >> >> y Instrument.new( 'Alto Saxophone', 'Eb', true ) --- !ruby/object:Instrument name: Alto Saxophone key: Eb is_woodwind: true You can see the properties properly ordered above. 2. The same can't be done for Hashes because the key set isn't predictable. But if the :SortKeys method is called, then the Hash will be sorted with Hash#sort. You could define a singleton `sort' method to sort certain Hashes. >> test = { 'name' => 'Alto Saxophone', 'key' => 'Eb', >> 'is_woodwind' => true } >> def test.sort >> order = [ 'name', 'key', 'is_woodwind' ] >> super { |a,b| order.index( a[0] ) <=> order.index( b[0] ) } >> end >> >> puts test.to_yaml( :SortKeys => true ) name: Alto Saxophone key: Eb is_woodwind: true Alternatively, you could define a singleton `to_a' to sort correctly and skip the :SortKeys option. 3. Finally, the YAML spec now defines an !omap type. This type is an ordered mapping with unique keys. YAML.rb will load this into a Hash-like class. >> o = YAML::Omap.new >> o['name'] = 'Alto Saxophone' >> o['key'] = 'Eb' >> o['is_woodwind'] = true >> y o --- !omap - name: Alto Saxophone - key: Eb - is_woodwind: true Let me know if you remember that second thing. _why |