sonic-pi
https://github.com/sonic-pi-net/sonic-pi
C++
Code. Music. Live.
Hash#to_xml
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 with +key+ as <tt>:root</tt>.
* If +value+ is an array there's a recursive call with +key+ as <tt>:root</tt>,
and +key+ singularized as <tt>:children</tt>.
* If +value+ is a callable object it must expect one or two arguments. Depending
on the arity, the callable is invoked with the +options+ hash as first argument
with +key+ as <tt>:root</tt>, and +key+ singularized as second argument. The
callable can add nodes by using <tt>options[:builder]</tt>.
'foo'.to_xml(lambda { |options, key| options[:builder].b(key) })
# => "<b>foo</b>"
* If +value+ responds to +to_xml+ the method is invoked with +key+ as <tt>:root</tt>.
class Foo
def to_xml(options)
options[:builder].bar 'fooing!'
end
end
{ foo: Foo.new }.to_xml(skip_instruct: true)
# =>
# <hash>
# <bar>fooing!</bar>
# </hash>
* Otherwise, a node with +key+ as tag is created with a string representation of
+value+ as text node. If +value+ is +nil+ an attribute "nil" set to "true" is added.
Unless the option <tt>:skip_types</tt> 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 <tt>:root</tt> option.
The default XML builder is a fresh instance of <tt>Builder::XmlMarkup</tt>. You can
configure your own builder with the <tt>:builder</tt> option. The method also accepts
options like <tt>:dasherize</tt> and friends, they are forwarded to the builder.Edit
git clone [email protected]:sonic-pi-net/sonic-pi.git
cd sonic-pi
open app/server/ruby/vendor/activesupport-7.0.6/lib/active_support/core_ext/hash/conversions.rb
Contribute
# Make a new branchgit checkout -b -your-name--update-docs-Hash-to_xml-for-pr
# Commit to gitgit add app/server/ruby/vendor/activesupport-7.0.6/lib/active_support/core_ext/hash/conversions.rbgit commit -m "better docs for Hash#to_xml"
# Open pull requestgem install hub # on a mac you can `brew install hub`
hub fork
git push <your name> -your-name--update-docs-Hash-to_xml-for-pr
hub pull-request
# Celebrate!