Sha256: 0f4c6fbd32388803cf9c26da13532584a724a5d0d0a14bd5b372b92be7434008

Contents?: true

Size: 1.72 KB

Versions: 2

Compression:

Stored size: 1.72 KB

Contents

module Unipept
  class Formatter

    def self.formatters
      @@formatters ||= {}
    end

    def self.new_for_format(format)
      begin
        formatters[format].new
      rescue
        formatters[self.default].new
      end
    end

    def self.register(format)
      self.formatters[format.to_s] = self
    end

    def self.available
      self.formatters.keys
    end

    def self.default
      'json'
    end

    # JSON formatted data goes in, something other comes out
    def format(data)
      data
    end
  end

  class JSONFormatter < Formatter
    require 'json'
    register :json

    def format(data)
      data.to_json
    end

  end
  class CSVFormatter < Formatter
    require 'csv'

    register :csv

    def format(data)
      CSV.generate do |csv|
        first = data.first
        if first.kind_of? Array
          first = first.first
        end
        csv << first.keys.map(&:to_s)

        data.each do |o|
          if o.kind_of? Array
            o.each {|h| csv << h.values }
          else
            csv << o.values
          end
        end
      end
    end
  end

  class XMLFormatter < Formatter

    # Monkey patch (do as to_xml, but saner)

    class ::Object
      def to_xml(name = nil)
        name ? %{<#{name}>#{self.to_s}</#{name}>} : self.to_s
      end
    end

    class ::Array
      def to_xml( array_name = :array, item_name = :item )
        %|<#{array_name} size="#{self.size}">|+map{|n|n.to_xml( :item )}.join+"</#{array_name}>"
      end
    end

    class ::Hash
      def to_xml( name = nil )
        data = to_a.map{|k,v|v.to_xml(k)}.join
        name ? "<#{name}>#{data}</#{name}>" : data
      end
    end

    register :xml

    def format(data)
      data.to_xml
    end

  end


end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
unipept-0.2.1 lib/unipept/formatters.rb
unipept-0.2.0 lib/unipept/formatters.rb