Introduction
*This is currently undergoing some rewrite. 2.x branch will introduce minor api incompatibilities.*
Upd:
Ok, the thing is out and the example below has been updated for 2.x, but the rdocs are largely out of date and I’m not sure whether I should update them since it seems like nobody’s using this lib anyway.
Peanuts is an library that allows for bidirectional mapping between Ruby objects and XML.
Released under the MIT license.
Features
-
Type awareness (extensible).
-
XML namespaces support.
-
Pluggable backends to work with different XML APIs (REXML implemented so far).
Installation
Beta 2.x (recommended) and stable 1.x available from Gemcutter
gem install peanuts --source http://gemcutter.org
Usage
Please see an example below. See also Peanuts
, Peanuts::ClassMethods
TODO
-
Inheritance
-
Mixins
-
More mappings?
-
More types?
Docs
rdoc.info/projects/omg/peanuts
Bugs & such
Please report via Github issue tracking.
Example
See also gist.github.com/230202 for real world example.
class Cheezburger
include Peanuts
attribute :weight, :float
attribute :price, :decimal
def initialize(weight = nil, price = nil)
@weight, @price = weight, price
end
def eql?(other)
other && weight == other.weight && price == other.price
end
alias == eql?
end
class Paws
include Peanuts
elements :paws, :name => :paw, :ns => 'urn:x-lol'
end
class Cat
include Peanuts
namespaces :lol => 'urn:x-lol', :kthnx => 'urn:x-lol:kthnx'
root 'kitteh', :ns => 'urn:x-lol'
attribute :has_tail?, :boolean, :name => 'has-tail', :ns => :kthnx
attribute :ears, :integer
element :ration, [:string], :name => :eats, :ns => :kthnx
element :name, :ns => 'urn:x-lol:kthnx'
shallow :paws, Paws
shallow :pals, :ns => :kthnx do
elements :friends, :name => :pal
end
element :cheezburger, Cheezburger
element :moar_cheezburgers do
elements :cheezburger, Cheezburger
end
end
xml_fragment = <<-EOS
<kitteh xmlns='urn:x-lol' xmlns:kthnx='urn:x-lol:kthnx' ears=' 2 ' kthnx:has-tail=' yes '>
<name xmlns='urn:x-lol:kthnx'>
Silly
Tom
</name>
<kthnx:eats>
tigers
lions
</kthnx:eats>
<kthnx:pals>
<pal>Chrissy</pal>
<pal>Missy</pal>
<pal>Sissy</pal>
</kthnx:pals>
<paws>
<paw> one</paw>
<paw> two </paw>
<paw>three</paw>
<paw>four</paw>
</paws>
<cheezburger price='2.05' weight='14.5547' />
<moar_cheezburgers>
<cheezburger price='19' weight='685.940' />
<cheezburger price='7.40' weight='9356.7' />
</moar_cheezburgers>
</kitteh>
EOS
cat = Cat.restore_from(xml_fragment)
cheezburger = cat.cheezburger
assert_equal 'Silly Tom', cat.name
assert_equal %w(tigers lions), cat.ration
assert_equal ['Chrissy', 'Missy', 'Sissy'], cat.friends.names
assert_equal 2, cat.ears
assert_equal true, cat.has_tail
assert_equal %w(one two three four), cat.paws
assert_kind_of Cheezburger, cat.cheezburger
assert_equal 2, cat.cheezburger.weight
...
puts cat.save_to(:string)
See also
-
github.com/omg/unrest – REST-client
-
github.com/omg/statelogic – Simple state machine for ActiveRecord
Copyright © 2009 Igor Gunko, released under the MIT license