Class: Dossier::Segmenter

Inherits:
Object
  • Object
show all
Includes:
Summable
Defined in:
lib/dossier/segmenter.rb,
lib/dossier/segmenter/engine.rb,
lib/dossier/segmenter/report.rb,
lib/dossier/segmenter/version.rb,
lib/dossier/segmenter/summable.rb

Defined Under Namespace

Modules: Report, Summable Classes: Engine

Constant Summary collapse

VERSION =
"0.12.0"

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Summable

#summarize, #summary

Constructor Details

#initialize(report) ⇒ Segmenter

Returns a new instance of Segmenter.



32
33
34
35
# File 'lib/dossier/segmenter.rb', line 32

def initialize(report)
  self.report = report
  extend(segment_chain.first.segment_module) if report.segmented?
end

Class Attribute Details

.report_classObject

Returns the value of attribute report_class.



14
15
16
# File 'lib/dossier/segmenter.rb', line 14

def report_class
  @report_class
end

Instance Attribute Details

#reportObject

Returns the value of attribute report.



11
12
13
# File 'lib/dossier/segmenter.rb', line 11

def report
  @report
end

Class Method Details

.segment(name, options = {}, &block) ⇒ Object



21
22
23
24
# 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

.segmentsObject



17
18
19
# File 'lib/dossier/segmenter.rb', line 17

def self.segments
  @segment_chain ||= Segment::Chain.new
end

.skip_headersObject



26
27
28
# File 'lib/dossier/segmenter.rb', line 26

def self.skip_headers
  segments.map(&:columns).flatten
end

Instance Method Details

#dataObject



41
42
43
44
45
# 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_mapObject



78
79
80
# 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

#headersObject



37
38
39
# File 'lib/dossier/segmenter.rb', line 37

def headers
  @headers ||= report_results.headers.reject { |header| header.in?(skip_headers) }
end

#inspectObject



74
75
76
# File 'lib/dossier/segmenter.rb', line 74

def inspect
  "#<#{self.class.name}>"
end

#key_pathObject



70
71
72
# File 'lib/dossier/segmenter.rb', line 70

def key_path
  String.new
end

#segment_chainObject



47
48
49
# File 'lib/dossier/segmenter.rb', line 47

def segment_chain
  self.class.segments
end

#segment_options_for(segment) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
# 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

#segmenterObject



51
52
53
# File 'lib/dossier/segmenter.rb', line 51

def segmenter
  self
end