Sha256: a4b737d5d0a4c6839974ad24895c51196b97b4dca9d4d0d5a92ae04a33438441

Contents?: true

Size: 1.55 KB

Versions: 1

Compression:

Stored size: 1.55 KB

Contents

require 'active_support/core_ext/hash/conversions'

module Tokamak
  module Xml
    module Base
      module ClassMethods
        mattr_reader :media_type_name
        @@media_type_name = 'application/xml'
    
        mattr_reader :headers
        @@headers = { 
          :post => { 'Content-Type' => media_type_name }
        }
    
        def marshal(entity, options = {})
          to_xml(entity, options)
        end
    
        def unmarshal(string)
          Hash.from_xml string
        end
    
        mattr_reader :recipes
        @@recipes = {}
    
        def describe_recipe(recipe_name, options={}, &block)
          raise 'Undefined recipe' unless block_given?
          raise 'Undefined recipe_name'   unless recipe_name
          @@recipes[recipe_name] = block
        end
    
        def to_xml(obj, options = {}, &block)
          return obj if obj.kind_of?(String)
          
          if block_given?
            recipe = block 
          elsif options[:recipe]
            recipe = @@recipes[options[:recipe]]
          elsif obj.kind_of?(Hash) && obj.size==1
            root = obj.values.first
            return root.to_xml(:root => obj.keys.first)
          else
            return obj.to_xml
          end
          
          # Create representation and proxy
          builder = Builder.new(obj, options)
    
          # Check recipe arity size before calling it
          recipe.call(*[builder, obj, options][0,recipe.arity])
          builder.doc.to_xml
        end
        
        def helper
          Helpers
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
tokamak-1.0.0.beta2 lib/tokamak/xml/base.rb