Module: Tricle::EmailHelper

Defined in:
lib/tricle/email_helper.rb

Instance Method Summary collapse

Instance Method Details

#dates_cell(start_at, end_at) ⇒ Object



64
65
66
67
# File 'lib/tricle/email_helper.rb', line 64

def dates_cell(start_at, end_at)
  range = dates_range_str(start_at, end_at)
  %[<div class="date-range">(#{range})</div>].html_safe
end

#dates_range_str(start_at, end_at) ⇒ Object



60
61
62
# File 'lib/tricle/email_helper.rb', line 60

def dates_range_str(start_at, end_at)
  "#{ self.format_date(start_at) } - #{ self.format_date(end_at) }"
end

#format_date(date) ⇒ Object



10
11
12
# File 'lib/tricle/email_helper.rb', line 10

def format_date(date)
  date.strftime('%-m/%-d/%y')
end

#format_number(number) ⇒ Object



14
15
16
# File 'lib/tricle/email_helper.rb', line 14

def format_number(number)
  number_with_delimiter((number.abs >= 100 ? number.round : sig_figs(number)))
end

#last_week_dates_cellObject



73
74
75
# File 'lib/tricle/email_helper.rb', line 73

def last_week_dates_cell
  single_week_dates_cell(weeks_ago(1))
end

#list_markup(list) ⇒ Object



85
86
87
88
89
# File 'lib/tricle/email_helper.rb', line 85

def list_markup(list)
  start_at = self.weeks_ago(1).to_time
  end_at = start_at + 7.days
  list.items_markup(start_at, end_at).html_safe
end

#number_with_delimiter(number) ⇒ Object



18
19
20
21
22
# File 'lib/tricle/email_helper.rb', line 18

def number_with_delimiter(number)
  # from http://stackoverflow.com/a/11466770/358804
  integer, decimal = number.to_s.split(".")
  [integer.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse, decimal].compact.join('.')
end

#percent_change(new_val, old_val) ⇒ Object



31
32
33
34
35
36
37
38
39
40
# File 'lib/tricle/email_helper.rb', line 31

def percent_change(new_val, old_val)
  if old_val == new_val
    'No change'
  elsif old_val == 0
    new_val >= 0 ? '+' : '-'
  else
    fraction = (new_val - old_val) / old_val.to_f
    (fraction >= 0 ? '+' : '').concat("#{sig_figs(fraction * 100.0)}%")
  end
end

#percent_change_cell(new_val, old_val, better) ⇒ Object



53
54
55
56
57
58
# File 'lib/tricle/email_helper.rb', line 53

def percent_change_cell(new_val, old_val, better)
  cls = self.percent_change_class(new_val, old_val, better)
  pct_str = percent_change(new_val, old_val)
  old_val_str = format_number(old_val)
  %[<td class="#{cls}"><div>#{pct_str}</div><div>#{old_val_str}</div></td>].html_safe
end

#percent_change_class(new_val, old_val, better) ⇒ Object



42
43
44
45
46
47
48
49
50
51
# File 'lib/tricle/email_helper.rb', line 42

def percent_change_class(new_val, old_val, better)
  case better
  when :higher
    (new_val >= old_val) ? 'good' : 'bad'
  when :lower
    (new_val > old_val) ? 'bad' : 'good'
  else
    ''
  end
end

#previous_week_dates_cellObject



77
78
79
# File 'lib/tricle/email_helper.rb', line 77

def previous_week_dates_cell
  single_week_dates_cell(weeks_ago(2))
end

#quarter_dates_cellObject



81
82
83
# File 'lib/tricle/email_helper.rb', line 81

def quarter_dates_cell
  dates_cell(weeks_ago(13), weeks_ago(1).end_of_week)
end

#sig_figs(number, num_sig_figs = 3) ⇒ Object



24
25
26
27
28
29
# File 'lib/tricle/email_helper.rb', line 24

def sig_figs(number, num_sig_figs = 3)
  # http://six-impossible.blogspot.com/2011/05/significant-digits-in-ruby-float.html
  f = sprintf("%.#{num_sig_figs - 1}e", number).to_f
  i = f.to_i # avoid
  i == f && i.to_s.size > num_sig_figs ? i : f
end

#single_week_dates_cell(start_at) ⇒ Object



69
70
71
# File 'lib/tricle/email_helper.rb', line 69

def single_week_dates_cell(start_at)
  dates_cell(start_at, start_at.end_of_week)
end

#sparkline(metric) ⇒ Object



91
92
93
94
95
# File 'lib/tricle/email_helper.rb', line 91

def sparkline(metric)
  values = metric.weekly_values(13)
  attachment_url = "https://sparklines.herokuapp.com/api/v1.png?values=#{values.join(',')}"
  image_tag(attachment_url, alt: 'sparkline').html_safe
end

#weeks_ago(n) ⇒ Object



6
7
8
# File 'lib/tricle/email_helper.rb', line 6

def weeks_ago(n)
  Date.today.beginning_of_week.ago(n.weeks)
end