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