class Dossier::Segmenter
Constants
- VERSION
Attributes
report_class[RW]
report[RW]
Public Class Methods
new(report)
click to toggle source
# File lib/dossier/segmenter.rb, line 32 def initialize(report) self.report = report extend(segment_chain.first.segment_module) if report.segmented? end
segment(name, options = {}, &block)
click to toggle source
# File lib/dossier/segmenter.rb, line 21 def self.segment(name, options = {}, &block) segments << Segment::Definition.new(self, name, options) instance_eval(&block) if block_given? end
segments()
click to toggle source
# File lib/dossier/segmenter.rb, line 17 def self.segments @segment_chain ||= Segment::Chain.new end
skip_headers()
click to toggle source
# File lib/dossier/segmenter.rb, line 26 def self.skip_headers segments.map(&:columns).flatten end
Public Instance Methods
data()
click to toggle source
# File lib/dossier/segmenter.rb, line 41 def data @data ||= report_results.rows.inject(Hash.new { [] }) { |acc, row| acc.tap { |hash| hash[key_path_for(row)] += [row] } } end
header_index_map()
click to toggle source
# File lib/dossier/segmenter.rb, line 78 def header_index_map @header_index_map ||= Hash[skip_headers.map { |h| [h, report_results.headers.index(h)] }] end
headers()
click to toggle source
# File lib/dossier/segmenter.rb, line 37 def headers @headers ||= report_results.headers.reject { |header| header.in?(skip_headers) } end
inspect()
click to toggle source
# File lib/dossier/segmenter.rb, line 74 def inspect "#<#{self.class.name}>" end
key_path()
click to toggle source
# File lib/dossier/segmenter.rb, line 70 def key_path String.new end
segment_chain()
click to toggle source
# File lib/dossier/segmenter.rb, line 47 def segment_chain self.class.segments end
segment_options_for(segment)
click to toggle source
# File lib/dossier/segmenter.rb, line 55 def segment_options_for(segment) position = segment.key_path.split('.').count data.keys.map { |key| key.split('.') }.inject({}) { |acc, key| acc.tap { |hash| hash[key.first(position + 1)] ||= data[key.join('.')].first } }.select { |key, value| key.first(position) == segment.key_path.split('.') }.values.map { |row| Hash[report_results.headers.zip(row)] } end
segmenter()
click to toggle source
# File lib/dossier/segmenter.rb, line 51 def segmenter self end
Private Instance Methods
group_by_indexes()
click to toggle source
# File lib/dossier/segmenter.rb, line 97 def group_by_indexes @group_by_indexes ||= header_index_map.values_at(*segment_chain.map(&:group_by).map(&:to_s)) end
key_path_for(row)
click to toggle source
# File lib/dossier/segmenter.rb, line 88 def key_path_for(row) group_by_indexes.map { |i| row.at(i) }.join('.') end
report_results()
click to toggle source
# File lib/dossier/segmenter.rb, line 84 def report_results report.raw_results end
segment_options()
click to toggle source
# File lib/dossier/segmenter.rb, line 92 def segment_options data unless defined?(@data) @segment_options end