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.

Source | Google | Stack overflow

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 branch

git checkout -b -your-name--update-docs-Hash-to_xml-for-pr


# Commit to git

git 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 request

gem 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!