Class: Ossert::Presenters::Project::Decorator
- Inherits:
-
Object
- Object
- Ossert::Presenters::Project::Decorator
- 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
-
#initialize(reference) ⇒ Decorator
constructor
A new instance of Decorator.
- #metric(metric, value, type) ⇒ Object
- #metrics(metrics_data, section_type) ⇒ Object
- #quarter_values(quarter_data) ⇒ Object
- #quarter_with_diff(project, time, section) ⇒ Object
- #value(metric, value) ⇒ Object
-
#with_reference(text, value, metric, type) ⇒ Object
value, Float !.
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} #{Project::KLASS_2_GRADE[reference]}", mark: Project::KLASS_2_GRADE[reference].downcase } rescue => e puts "NO DATA FOR METRIC: '#{metric}'" raise e end |