Class: KPI::MergedReport

Inherits:
Object
  • Object
show all
Defined in:
app/models/kpi/merged_report.rb

Instance Method Summary collapse

Constructor Details

#initialize(*args, &block) ⇒ MergedReport

Returns a new instance of MergedReport.

Raises:

  • (ArgumentError)


4
5
6
7
8
9
10
11
12
13
# File 'app/models/kpi/merged_report.rb', line 4

def initialize(*args, &block)
  options = args.extract_options!
  raise ArgumentError, "Should have any argument" if args.length == 0
  raise Exception unless block_given?
  @_mode = options[:mode] || :&
  @_title = options[:title] 

  @_reports = args
  @_merge = block
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'app/models/kpi/merged_report.rb', line 33

def method_missing(name, *args)
  return kpi_exists?($1) if (/(.*)\?/ =~ name.to_s)                  # check if KPI exists in report if name of missing method has trailing '?'
  result = merge_proc_call(name)                                     
  orginal = @_reports.find(&:"#{name}?").send(name)                  # find first report having requested KPI
  description = if orginal.description && result.description         # if description exists in orginal and result Entries
                  result.description.gsub("$$", orginal.description)
                else nil
                end

  KPI::Entry.new(result.name.gsub("$$", orginal.name),
                 result.value,
                 :description => description,
                 :unit => (result.unit || orginal.unit),
                 :important => (result.important? || orginal.important?))
end

Instance Method Details

#defined_kpisObject



27
28
29
30
31
# File 'app/models/kpi/merged_report.rb', line 27

def defined_kpis
  # takes all reports and uses & (default) or | operator for inject function
  # to build list of defined KPIs
  @_reports.map(&:defined_kpis).inject(&@_mode).map(&:to_sym)
end

#entriesObject



15
16
17
18
19
20
21
# File 'app/models/kpi/merged_report.rb', line 15

def entries
  Enumerator.new do |yielder|
    defined_kpis.each do |kpi_method|
      yielder.yield(send(kpi_method))
    end
  end
end

#titleObject



23
24
25
# File 'app/models/kpi/merged_report.rb', line 23

def title
  @_title || @_reports.first.title
end