Sha256: e9c8869e35d5a676742a657b0f31c2d4c8e092f23bd2063f3e2d815901f2fcf9

Contents?: true

Size: 995 Bytes

Versions: 5

Compression:

Stored size: 995 Bytes

Contents

module Decisive
  class Renderer < Struct.new(:records, :block)
    include Enumerable

    def each &block
      (header + body).each(&block)
    end

    private

    def header
      [keys]
    end

    def body
      hashes.map do |hash|
        hash.values_at(*keys)
      end
    end

    def keys
      @keys ||= hashes.flat_map(&:keys).uniq
    end

    def hashes
      @hashes ||= records.map do |record|
        Row.new(record, block).to_hash
      end
    end

    class Row < Struct.new(:record, :block)
      module Nothing; end

      def to_hash
        @hash = {}
        instance_exec record, &block
        @hash
      end

      private

      def column key, value=Nothing, &block
        @hash[key] = if block_given?
          block.call(record)
        elsif value.is_a?(Symbol)
          record.send(value)
        elsif value == Nothing
          record.send(key.parameterize.underscore.to_sym)
        else
          value
        end.to_s
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
decisive-0.8.5 lib/decisive/renderer.rb
decisive-0.8.4 lib/decisive/renderer.rb
decisive-0.8.2 lib/decisive/renderer.rb
decisive-0.8.1 lib/decisive/renderer.rb
decisive-0.8.0 lib/decisive/renderer.rb