Class: Icss::MetaType
- Inherits:
-
Object
- Object
- Icss::MetaType
- Includes:
- Receiver
- Defined in:
- lib/icss/type/factory.rb
Class Method Summary collapse
Instance Method Summary collapse
-
#initialize(*args) ⇒ MetaType
constructor
A new instance of MetaType.
- #to_json(*args) ⇒ Object
-
#to_xml(options = {}, &block) ⇒ Object
Returns a string containing an XML representation of its receiver:.
Constructor Details
#initialize(*args) ⇒ MetaType
Returns a new instance of MetaType.
5 6 7 |
# File 'lib/icss/type/factory.rb', line 5 def initialize *args receive! *args unless args.empty? end |
Class Method Details
.xml_type_name ⇒ Object
115 116 117 |
# File 'lib/icss/type/factory.rb', line 115 def self.xml_type_name self.to_s.demodulize.underscore.gsub(/_/, '-') end |
Instance Method Details
#to_json(*args) ⇒ Object
119 120 121 |
# File 'lib/icss/type/factory.rb', line 119 def to_json *args to_hash.to_json(*args) end |
#to_xml(options = {}, &block) ⇒ Object
Returns a string containing an XML representation of its receiver:
{"foo" => 1, "bar" => 2}.to_xml
# =>
# <?xml version="1.0" encoding="UTF-8"?>
# <hash>
# <foo type="integer">1</foo>
# <bar type="integer">2</bar>
# </hash>
To do so, the method loops over the pairs and builds nodes that depend on the values. Given a pair key
, value
:
-
If
value
is a hash there’s a recursive call withkey
as:root
. -
If
value
is an array there’s a recursive call withkey
as:root
, andkey
singularized as:children
. -
If
value
is a callable object it must expect one or two arguments. Depending on the arity, the callable is invoked with theoptions
hash as first argument withkey
as:root
, andkey
singularized as second argument. Its return value becomes a new node. -
If
value
responds toto_xml
the method is invoked withkey
as:root
. -
Otherwise, a node with
key
as tag is created with a string representation ofvalue
as text node. Ifvalue
isnil
an attribute “nil” set to “true” is added. Unless the option:skip_types
exists and is true, an attribute “type” is added as well according to the following mapping:XML_TYPE_NAMES = { "Symbol" => "symbol", "Fixnum" => "integer", "Bignum" => "integer", "BigDecimal" => "decimal", "Float" => "float", "TrueClass" => "boolean", "FalseClass" => "boolean", "Date" => "date", "DateTime" => "datetime", "Time" => "datetime" }
By default the root node is “hash”, but that’s configurable via the :root
option.
The default XML builder is a fresh instance of Builder::XmlMarkup
. You can configure your own builder with the :builder
option. The method also accepts options like :dasherize
and friends, they are forwarded to the builder. Returns a string containing an XML representation of its receiver:
{"foo" => 1, "bar" => 2}.to_xml
# =>
# <?xml version="1.0" encoding="UTF-8"?>
# <hash>
# <foo type="integer">1</foo>
# <bar type="integer">2</bar>
# </hash>
To do so, the method loops over the pairs and builds nodes that depend on the values. Given a pair key
, value
:
-
If
value
is a hash there’s a recursive call withkey
as:root
. -
If
value
is an array there’s a recursive call withkey
as:root
, andkey
singularized as:children
. -
If
value
is a callable object it must expect one or two arguments. Depending on the arity, the callable is invoked with theoptions
hash as first argument withkey
as:root
, andkey
singularized as second argument. Its return value becomes a new node. -
If
value
responds toto_xml
the method is invoked withkey
as:root
. -
Otherwise, a node with
key
as tag is created with a string representation ofvalue
as text node. Ifvalue
isnil
an attribute “nil” set to “true” is added. Unless the option:skip_types
exists and is true, an attribute “type” is added as well according to the following mapping:XML_TYPE_NAMES = { "Symbol" => "symbol", "Fixnum" => "integer", "Bignum" => "integer", "BigDecimal" => "decimal", "Float" => "float", "TrueClass" => "boolean", "FalseClass" => "boolean", "Date" => "date", "DateTime" => "datetime", "Time" => "datetime" }
By default the root node is “hash”, but that’s configurable via the :root
option.
The default XML builder is a fresh instance of Builder::XmlMarkup
. You can configure your own builder with the :builder
option. The method also accepts options like :dasherize
and friends, they are forwarded to the builder.
107 108 109 110 111 112 113 |
# File 'lib/icss/type/factory.rb', line 107 def to_xml ={}, &block = .reverse_merge(:root => self.class.xml_type_name) xml_hsh = self.to_hash # # remove once microsoft has signed off on this # xml_hsh.merge!(:_note => "XML support is experimental, structure may change in future") unless options[:skip_instruct] xml_hsh.to_xml(, &block) end |