ActiveSupport::XmlMini (original) (raw)
To use the much faster libxml parser:
gem "libxml-ruby"
XmlMini.backend = 'LibXML'
Methods
B
R
T
W
Constants
DEFAULT_ENCODINGS | = | { "binary" => "base64" } unless defined?(DEFAULT_ENCODINGS) | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
FORMATTING | = | { "symbol" => Proc.new { |symbol | symbol.to_s }, "date" => Proc.new { | date | date.to_fs(:db) }, "dateTime" => Proc.new { | time | time.xmlschema }, "duration" => Proc.new { | duration | duration.iso8601 }, "binary" => Proc.new { | binary | ::Base64.encode64(binary) }, "yaml" => Proc.new { | yaml | yaml.to_yaml } } unless defined?(FORMATTING) | ||
PARSING | = | { "symbol" => Proc.new { |symbol | symbol.to_s.to_sym }, "date" => Proc.new { | date | ::Date.parse(date) }, "datetime" => Proc.new { | time | Time.xmlschema(time).utc rescue ::DateTime.parse(time).utc }, "duration" => Proc.new { | duration | Duration.parse(duration) }, "integer" => Proc.new { | integer | integer.to_i }, "float" => Proc.new { | float | float.to_f }, "decimal" => Proc.new do | number | if String === number number.to_d else BigDecimal(number) end end, "boolean" => Proc.new { |
TYPE_NAMES | = | { "Symbol" => "symbol", "Integer" => "integer", "BigDecimal" => "decimal", "Float" => "float", "TrueClass" => "boolean", "FalseClass" => "boolean", "Date" => "date", "DateTime" => "dateTime", "Time" => "dateTime", "ActiveSupport::Duration" => "duration", "Array" => "array", "Hash" => "hash" } | |||||||||||||
Attributes
Instance Public methods
backend()Link
def backend current_thread_backend || @backend end
backend=(name)Link
def backend=(name) backend = name && cast_backend_name_to_module(name) self.current_thread_backend = backend if current_thread_backend @backend = backend end
rename_key(key, options = {})Link
def rename_key(key, options = {}) camelize = options[:camelize] dasherize = !options.has_key?(:dasherize) || options[:dasherize] if camelize key = true == camelize ? key.camelize : key.camelize(camelize) end key = _dasherize(key) if dasherize key end
to_tag(key, value, options)Link
def to_tag(key, value, options) type_name = options.delete(:type) merged_options = options.merge(root: key, skip_instruct: true)
if value.is_a?(::Method) || value.is_a?(::Proc) if value.arity == 1 value.call(merged_options) else value.call(merged_options, key.to_s.singularize) end elsif value.respond_to?(:to_xml) value.to_xml(merged_options) else type_name ||= TYPE_NAMES[value.class.name] type_name ||= value.class.name if value && !value.respond_to?(:to_str) type_name = type_name.to_s if type_name type_name = "dateTime" if type_name == "datetime"
key = rename_key(key.to_s, options)
attributes = options[:skip_types] || type_name.nil? ? {} : { type: type_name }
attributes[:nil] = true if value.nil?
encoding = options[:encoding] || DEFAULT_ENCODINGS[type_name]
attributes[:encoding] = encoding if encoding
formatted_value = FORMATTING[type_name] && !value.nil? ?
FORMATTING[type_name].call(value) : value
options[:builder].tag!(key, formatted_value, attributes)
end end
with_backend(name)Link
def with_backend(name) old_backend = current_thread_backend self.current_thread_backend = name && cast_backend_name_to_module(name) yield ensure self.current_thread_backend = old_backend end