Class: Repor::Serializers::BaseSerializer

Inherits:
Object
  • Object
show all
Includes:
ActionView::Helpers::TextHelper
Defined in:
lib/repor/serializers/base_serializer.rb

Direct Known Subclasses

FormFieldSerializer, TableSerializer

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(report) ⇒ BaseSerializer

Returns a new instance of BaseSerializer.



8
9
10
# File 'lib/repor/serializers/base_serializer.rb', line 8

def initialize(report)
  @report = report
end

Instance Attribute Details

#reportObject (readonly)

Returns the value of attribute report.



6
7
8
# File 'lib/repor/serializers/base_serializer.rb', line 6

def report
  @report
end

Instance Method Details

#axis_summaryObject



76
77
78
79
80
81
# File 'lib/repor/serializers/base_serializer.rb', line 76

def axis_summary
  y = human_aggregator_label(report.aggregator)
  xes = report.groupers.map(&method(:human_dimension_label))
  count = pluralize(report.records.count, record_type)
  "#{y} by #{xes.to_sentence} for #{count}"
end

#filter_summaryObject



83
84
85
86
87
88
89
# File 'lib/repor/serializers/base_serializer.rb', line 83

def filter_summary
  report.filters.flat_map do |dimension|
    human_dimension_label(dimension) + " = " + dimension.filter_values.map do |value|
      human_dimension_value_label(dimension, value)
    end.to_sentence(last_word_connector: ', or ')
  end.join('; ')
end

#human_aggregator_label(aggregator) ⇒ Object

Consider overriding many of these methods to use I18n with keys based on the aggregator or dimension name.



15
16
17
# File 'lib/repor/serializers/base_serializer.rb', line 15

def human_aggregator_label(aggregator)
  aggregator.name.to_s.humanize
end

#human_aggregator_value_label(aggregator, value) ⇒ Object



23
24
25
# File 'lib/repor/serializers/base_serializer.rb', line 23

def human_aggregator_value_label(aggregator, value)
  value
end

#human_category_value_label(dimension, value) ⇒ Object



40
41
42
# File 'lib/repor/serializers/base_serializer.rb', line 40

def human_category_value_label(dimension, value)
  value
end

#human_dimension_label(dimension) ⇒ Object



19
20
21
# File 'lib/repor/serializers/base_serializer.rb', line 19

def human_dimension_label(dimension)
  dimension.name.to_s.humanize
end

#human_dimension_value_label(dimension, value) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/repor/serializers/base_serializer.rb', line 27

def human_dimension_value_label(dimension, value)
  case dimension
  when Repor::Dimensions::CategoryDimension
    human_category_value_label(dimension, value)
  when Repor::Dimensions::NumberDimension
    human_number_value_label(dimension, value)
  when Repor::Dimensions::TimeDimension
    human_time_value_label(dimension, value)
  else
    value
  end
end

#human_number_value_label(dimension, value) ⇒ Object



44
45
46
47
48
49
50
51
52
# File 'lib/repor/serializers/base_serializer.rb', line 44

def human_number_value_label(dimension, value)
  begin
    min, max = value.values_at(:min, :max)
  rescue
    min, max = value.min, value.max
  end
  return "[#{min.round(2)}, #{max.round(2)})" if min && max
  value
end

#human_time_value_label(dimension, value) ⇒ Object



61
62
63
64
65
66
67
68
69
70
# File 'lib/repor/serializers/base_serializer.rb', line 61

def human_time_value_label(dimension, value)
  min, max = value.min, value.max
  if min && max
    time_formats.each do |step, format|
      return min.strftime(format) if max == min.advance(step => 1)
    end
    return "#{min} to #{max}"
  end
  value
end

#record_typeObject



72
73
74
# File 'lib/repor/serializers/base_serializer.rb', line 72

def record_type
  report.table_name.singularize.humanize
end

#time_formatsObject



54
55
56
57
58
59
# File 'lib/repor/serializers/base_serializer.rb', line 54

def time_formats
  {
    minutes: '%F %k:%M', hours: '%F %k', days: '%F',
    weeks: 'week of %F', months: '%Y-%m', years: '%Y'
  }
end