Class: RubyReport::Report

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby_report/report.rb

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(data:, scope: nil, columns: nil, header_builder: ::RubyReport::Builder::DefaultHeaderBuilder, row_builder: ::RubyReport::Builder::DefaultRowBuilder, row_resolver: ->(row) { row }) ⇒ Report

Returns a new instance of Report.



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/ruby_report/report.rb', line 15

def initialize(
  data:, scope: nil, columns: nil,
  header_builder: ::RubyReport::Builder::DefaultHeaderBuilder,
  row_builder: ::RubyReport::Builder::DefaultRowBuilder,
  row_resolver: ->(row) { row }
)
  @data = data
  @scope = scope
  @columns =
    if columns.nil?
      self.class.columns_set || raise("Columns not defined")
    else
      Set.new(columns)
    end
  @header_builder = header_builder
  @row_builder = row_builder
  @row_resolver = row_resolver
  @reports = [self]
end

Class Attribute Details

.columns_setObject (readonly)

Returns the value of attribute columns_set.



6
7
8
# File 'lib/ruby_report/report.rb', line 6

def columns_set
  @columns_set
end

.decoratorsObject (readonly)

Returns the value of attribute decorators.



6
7
8
# File 'lib/ruby_report/report.rb', line 6

def decorators
  @decorators
end

.formattersObject (readonly)

Returns the value of attribute formatters.



6
7
8
# File 'lib/ruby_report/report.rb', line 6

def formatters
  @formatters
end

Class Method Details

.columns(*keys, decorators: ::RubyReport::Decorator, formatters: ::RubyReport::Formatter) ⇒ Object



8
9
10
11
12
# File 'lib/ruby_report/report.rb', line 8

def columns(*keys, decorators: ::RubyReport::Decorator, formatters: ::RubyReport::Formatter)
  @columns_set = Set.new(keys)
  @decorators = decorators
  @formatters = formatters
end

Instance Method Details

#add_report(report) ⇒ Object



35
36
37
# File 'lib/ruby_report/report.rb', line 35

def add_report(report)
  reports << report
end

#build_headerObject



91
92
93
94
95
# File 'lib/ruby_report/report.rb', line 91

def build_header
  columns.map do |key|
    header_builder.call(key, self)
  end
end

#build_row(row) ⇒ Object



97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/ruby_report/report.rb', line 97

def build_row(row)
  current_row = row_resolver.call(row)

  return [] unless current_row

  Array(decorators).each { |decorator| current_row = decorator.new(current_row, scope) }
  Array(formatters).each { |formatter| current_row = formatter.new(current_row, scope) }

  columns.map do |key|
    row_builder.call(current_row, key, self)
  end
end

#collect_row(row) ⇒ Object



110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/ruby_report/report.rb', line 110

def collect_row(row)
  result_row = []

  reports.each do |report|
    result_row +=
      if report == self
        report.build_row(row)
      else
        report.collect_row(row)
      end
  end

  result_row
end

#each_rowObject



57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/ruby_report/report.rb', line 57

def each_row
  return enum_for(:each_row) unless block_given?

  method =
    if data.respond_to?(:find_each)
      :find_each
    else
      :each
    end

  data.public_send(method) do |row|
    yield collect_row(row)
  end
end

#headerObject



43
44
45
46
47
48
49
50
51
# File 'lib/ruby_report/report.rb', line 43

def header
  @header ||= reports.flat_map do |report|
    if report == self
      report.build_header
    else
      report.header
    end
  end
end

#prepend_report(report) ⇒ Object



39
40
41
# File 'lib/ruby_report/report.rb', line 39

def prepend_report(report)
  reports.unshift(report)
end

#rowsObject



53
54
55
# File 'lib/ruby_report/report.rb', line 53

def rows
  @rows ||= each_row.to_a
end

#to_with(generator, **opts) ⇒ Object



72
73
74
75
76
# File 'lib/ruby_report/report.rb', line 72

def to_with(generator, **opts)
  report = generator.new
  report.add_report(self, **opts)
  report.generate
end