module Camara::XmlFields
O 'concern' XmlFields
provê a possibiliade de se listar campos que serão extraidos do XML passado na inicialização e disponibilizados como attr_readers pela classe.
@exemple
class Person include Camara::XmlFields fields :name, :phone end data = Nokogiri::XML "<person><name>Dimas Cyriaco</name><phone>9999-9999</phone></person>" person = Person.new(data) person.name # => 'Dimas Cyriaco' person.phone # => '9999-9999'
XmlFields
também aceita classes aninhadas.
@exemple
class Address include Camara::XmlFields fields :street, :number end class Person include Camara::XmlFields fields :name, address: Address end data = Nokogiri::XML "<person><name>Dimas Cyriaco</name><address><street>Blah</street><number>999</number></address></person>" person = Person.new(data) person.name # => 'Dimas Cyriaco' person.phone # => '9999-9999' person.address # => <#Address> person.address.street # => 'Blah' person.address.number # => '999'
Também é possivel configurar campos que contenham um array.
@example
class Hobby include Camara::XmlFields fields :name end class Person include Camara::XmlFields fields :name, hobbies: [Hobby] end data = Nokogiri::XML "<person><name>Dimas Cyriaco</name><hobbies><hobby><name>Football</name></hobby></hobbies></person>" person = Person.new(data) person.hobbies # => [<#Hobby name="Football">]
Public Class Methods
new(data)
click to toggle source
@param [Nokogiri::XML::Element] data
# File lib/camara/xml_fields.rb, line 69 def initialize(data) Array(fields).each do |field_name| case field_name when String, Symbol value = data.css("/#{field_name}").text.presence || data.css("@#{field_name}").text.presence rescue nil instance_variable_set "@#{field_name.to_s.underscore}", value when Hash field_name.keys.each do |key| if field_name[key].is_a? Array objects = data.css("#{key.to_s.singularize}").map do |data| field_name[key].first.new(data) end instance_variable_set "@#{key.to_s.underscore}", objects else instance_variable_set "@#{key.to_s.underscore}", field_name[key].new(data.css("/#{key}")) end end end end end
Public Instance Methods
fields()
click to toggle source
# File lib/camara/xml_fields.rb, line 64 def fields self.class.xml_fields end