class ActiveSupport::XMLConverter
def process_hash(value)
def process_hash(value) if value.include?("type") && !value["type"].is_a?(Hash) && @disallowed_types.include?(value["type"]) raise DisallowedType, value["type"] end if become_array?(value) _, entries = Array.wrap(value.detect { |k, v| not v.is_a?(String) }) if entries.nil? || value["__content__"].try(:empty?) [] else case entries when Array entries.collect { |v| deep_to_h(v) } when Hash [deep_to_h(entries)] else raise "can't typecast #{entries.inspect}" end end elsif become_content?(value) process_content(value) elsif become_empty_string?(value) "" elsif become_hash?(value) xml_value = value.transform_values { |v| deep_to_h(v) } # Turn { files: { file: #<StringIO> } } into { files: #<StringIO> } so it is compatible with # how multipart uploaded files from HTML appear xml_value["file"].is_a?(StringIO) ? xml_value["file"] : xml_value end end