Skip to content

jawheeler/rapport

Repository files navigation

Rapport

Rapport allows you to create tabular reports with a DSL, which can be outputted via customizable formatters.

Quick-Start

Include the Rapport::Report module in any object to allow it to generate reports in the pre-built formatters (csv, fake) or in a custom formatter. Use an easy DSL to write all your reports once, and all your formats once, and then mix and match as you please.

Creating a Report

require 'rubygems'
require 'rapport'

class OrderReport
  include Rapport::Report
  
  def initialize(options)
    self.options = options
  end
  
  # Add columns to the report with column(column_header, *args)
  # Column Header is what appears in the report, and *args specify how to calculate the values using the model
  #
  #   examples:
  #     column('column header')
  #     column('column header', :column_symbol)
  #     column('column header', :model_type => :column_symbol, ...)
  #
  # All equivalent:
  # column 'Product ID', :map_to => lambda {|model| !model.nil? and model.respond_to?(:product_id) ? model.product_id : nil }
  # column 'Product ID', :map_to => :product_id
  # column 'Product ID', :product_id
  column 'Product ID'         # by default converts 'Product ID' to :product_id
  
  # special calculation depending on type of model
  column 'Price',         :additional_charge => :amount,
                          :line_item => :price,  # not required; defaults to :price
                          :special_line_item => lambda {|line_item| line_item.price - line_item.tax },
                          # Display price (in cents) as dollars
                          :format => :cents 
  
  # Navigate an object heirarchy using :through
  column 'Order ID',      :through -> :order, :map_to => :id                    
  column 'Customer Name', :through => [:order, :customer], :map_to => lambda {|customer| "#{customer.first_name} #{customer.last_name}" }

  # Implement each_model to specify which models belong to the report.
  # The method should yield each model, and optionally specify the model type in order to customize how the value is calculated.
  def each_model
    AdditionalCharge.in_order_report.each do |additional_charge|
      yield additional_charge # equivalent to yield additional_charge, :additional_charge
    end
       
    LineItem.in_order_report.each do |line_item|
      if line_item.special?
        yield line_item, :special_line_item  # uses special price calculation above 
      else
        yield line_item  # equivalent to yield line_item, :line_item
      end
    end
  end
end

Running a Report

order_report = OrderReport.new(:format => 'csv', :output_dir => 'my_dir')
order_report.generate # generates a csv file named 'my_dir/OrderReport_{timestamp}.csv

order_report = OrderReport.new(:format => 'my_custom')
order_report.generate # generates the same report, but in your custom format

Creating a Custom Format

module Rapport
  class ReportGeneratorMyCustom
    include ReportGenerator

    generate_with do |report|
      File.open(output_filename,'w') do |file|
        file.puts(report.column_headers.join('|'))
        report.each_row do |row|
          file.puts(row.join('|'))
        end
      end
    end

  end
end

Copyright

Copyright (c) 2011 Andrew Wheeler. See LICENSE.txt for further details.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages