Class: Ossert::Presenters::Project::Decorator

Inherits:
Object
  • Object
show all
Defined in:
lib/ossert/presenters/project.rb

Constant Summary collapse

TOO_LONG_AGO =
20.years.ago
METRICS_DECORATIONS =
{
  /(percent|divergence)/ => ->(value) { "#{value.ceil}%" },
  /(date|changed)/ => (lambda do |value|
    date = Time.at(value)
    return 'N/A' if date < TOO_LONG_AGO
    date.strftime('%d/%m/%y')
  end),
  /processed_in/ => (lambda do |value|
    return 'N/A' if value >= Ossert::Stats::PER_YEAR_TOO_LONG || value.zero?
    case value
    when 1
      "~#{value.ceil} day"
    when 2..30
      "~#{value.ceil} days"
    when 31..61
      "~#{(value / 31).to_i} month"
    else
      "~#{(value / 31).to_i} months"
    end
  end),
  /period/ => (lambda do |value|
    if (years = value.to_i / 365).positive?
      "#{years}+ years"
      'Less than a year'
    else
    end
  end),
  /downloads/ => ->(value) { value.ceil.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse }
}.freeze

Instance Method Summary collapse

Constructor Details

#initialize(reference) ⇒ Decorator

Returns a new instance of Decorator.



25
26
27
# File 'lib/ossert/presenters/project.rb', line 25

def initialize(reference)
  @reference = reference
end

Instance Method Details

#metric(metric, value, type) ⇒ Object



81
82
83
# File 'lib/ossert/presenters/project.rb', line 81

def metric(metric, value, type)
  with_reference(value(metric, value), value.to_f, metric, type)
end

#metrics(metrics_data, section_type) ⇒ Object



98
99
100
101
102
# File 'lib/ossert/presenters/project.rb', line 98

def metrics(metrics_data, section_type)
  metrics_data.each_with_object({}) do |(metric, value), result|
    result[metric] = metric(metric, value.to_i, section_type)
  end
end

#quarter_values(quarter_data) ⇒ Object



104
105
106
107
108
# File 'lib/ossert/presenters/project.rb', line 104

def quarter_values(quarter_data)
  quarter_data.each_with_object({}) do |(metric, value), res|
    res[metric] = value.to_i
  end
end

#quarter_with_diff(project, time, section) ⇒ Object



85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/ossert/presenters/project.rb', line 85

def quarter_with_diff(project, time, section)
  section_type = "#{section}_quarter".to_sym
  quarter_data = project.send(section).quarters[quarter_start(time)].metrics_to_hash
  diff = quarter_values(project.send(section).quarters[quarter_start(time) - 1.day].metrics_to_hash)

  quarter_data.each_with_object({}) do |(metric, value), result|
    decorated_metric = metric(metric, value, section_type)
    result[Ossert.t(metric)] = "  \#{decorated_metric[:text]} <> \#{metric(metric, value.to_i - diff[metric], :delta)}\n    TEXT\n  end\nend\n"

#value(metric, value) ⇒ Object



75
76
77
78
79
# File 'lib/ossert/presenters/project.rb', line 75

def value(metric, value)
  value = value.to_f
  METRICS_DECORATIONS.each { |check, decorator| return decorator.call(value) if metric =~ check }
  value.to_i
end

#with_reference(text, value, metric, type) ⇒ Object

value, Float !



30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/ossert/presenters/project.rb', line 30

def with_reference(text, value, metric, type)
  return (text.to_i.positive? ? "+#{text}" : text).to_s if type == :delta
  metric_by_ref = @reference[type][metric.to_s]
  reference = Project::CLASSES.inject('NaN') do |acc, ref|
    metric_by_ref[ref][:range].cover?(value) ? ref : acc
  end

  { text: "#{text}&nbsp;#{Project::KLASS_2_GRADE[reference]}",
    mark: Project::KLASS_2_GRADE[reference].downcase }
rescue => e
  puts "NO DATA FOR METRIC: '#{metric}'"
  raise e
end