class Shiftzilla::ReleaseData

Attributes

bugs[RW]
first_snap[RW]
first_snapdate[RW]
labels[RW]
latest_snap[RW]
latest_snapdate[RW]
prev_snap[RW]
series[RW]
snaps[RW]

Public Class Methods

new(release) click to toggle source
# File lib/shiftzilla/release_data.rb, line 8
def initialize(release)
  @release         = release
  @snaps           = {}
  @bugs            = {}
  @prev_snap       = nil
  @latest_snap     = nil
  @latest_snapdate = nil
  @first_snap      = nil
  @first_snapdate  = nil
  @labels          = {}
  @series          = {
    :date        => [],
    :ideal       => [],
    :total_bugs  => [],
    :new_bugs    => [],
    :closed_bugs => [],
    :total_tb    => [],
    :new_tb      => [],
    :closed_tb   => [],
    :total_cc    => [],
    :new_cc      => [],
    :closed_cc   => [],
  }
end

Public Instance Methods

add_or_update_bug(bzid,binfo) click to toggle source
# File lib/shiftzilla/release_data.rb, line 141
def add_or_update_bug(bzid,binfo)
  unless @bugs.has_key?(bzid)
    @bugs[bzid] = Shiftzilla::Bug.new(bzid,binfo)
  else
    @bugs[bzid].update(binfo)
  end
  @bugs[bzid]
end
bug_avg_age(blockers_only=false) click to toggle source
# File lib/shiftzilla/release_data.rb, line 119
def bug_avg_age(blockers_only=false)
  bug_list  = blockers_only ? @bugs.values.select{ |b| b.test_blocker } : @bugs.values
  bug_count = bug_list.length
  age_total = bug_list.map{ |b| b.age }.sum
  return bug_count == 0 ? 0 : (age_total / bug_count).round(1).to_s
end
burndown_span() click to toggle source
# File lib/shiftzilla/release_data.rb, line 110
def burndown_span
  if @release.uses_milestones?
    return business_days_between(@release.milestones.start.date,@release.milestones.code_freeze.date) - 2
  elsif not @first_snapdate.nil? and not @latest_snapdate.nil?
    return business_days_between(@first_snapdate,@latest_snapdate)
  end
  return nil
end
get_snapdata(snapshot) click to toggle source
# File lib/shiftzilla/release_data.rb, line 134
def get_snapdata(snapshot)
  unless @snaps.has_key?(snapshot)
    @snaps[snapshot] = Shiftzilla::SnapData.new(snapshot)
  end
  @snaps[snapshot]
end
has_snapdata?(snapshot) click to toggle source
# File lib/shiftzilla/release_data.rb, line 130
def has_snapdata?(snapshot)
  @snaps.has_key?(snapshot)
end
max_cc() click to toggle source
# File lib/shiftzilla/release_data.rb, line 50
def max_cc
  pick_max([@snaps.values.map{ |s| s.total_cc },
            @snaps.values.map{ |s| s.new_cc },
            @snaps.values.map{ |s| s.closed_cc }
          ])
end
max_new_closed() click to toggle source
# File lib/shiftzilla/release_data.rb, line 37
def max_new_closed
  pick_max([@snaps.values.map{ |s| s.new_bugs },
            @snaps.values.map{ |s| s.closed_bugs }
          ])
end
max_tb() click to toggle source
# File lib/shiftzilla/release_data.rb, line 43
def max_tb
  pick_max([@snaps.values.map{ |s| s.total_tb },
            @snaps.values.map{ |s| s.new_tb },
            @snaps.values.map{ |s| s.closed_tb }
          ])
end
max_total() click to toggle source
# File lib/shiftzilla/release_data.rb, line 33
def max_total
  pick_max([@snaps.values.map{ |s| s.total_bugs }])
end
populate_series() click to toggle source
# File lib/shiftzilla/release_data.rb, line 57
def populate_series
  return if first_snap.nil?

  # Set up the 'ideal' series
  ideal_slope = max_total.to_f / burndown_span.to_f
  ideal_total = max_total

  range_idx = 0
  series_range.each do |date|
    next if date.saturday? or date.sunday?
    snapshot = date.strftime('%Y-%m-%d')

    @series[:date] << snapshot
    @series[:ideal] << ideal_total
    ideal_total = ideal_total < ideal_slope ? 0 : ideal_total - ideal_slope

    snapdata = @snaps.has_key?(snapshot) ? @snaps[snapshot] : nil
    if date < first_snapdate
      snapdata = @snaps[first_snap]
    end

    ['bugs','tb','cc'].each do |set|
      ['total','new','closed'].each do |count|
        set_key = "#{count}_#{set}".to_sym
        @series[set_key] << (snapdata.nil? ? nil : snapdata.send(set_key))
      end
    end

    if range_idx % label_modulo == 0
      @labels[range_idx] = date.strftime('%m/%d')
    end
    range_idx += 1
  end
end
series_range() click to toggle source
# File lib/shiftzilla/release_data.rb, line 92
def series_range
  if @release.uses_milestones?
    return (@release.milestones.start.date..@release.milestones.ga.date)
  elsif not @first_snapdate.nil? and not @latest_snapdate.nil?
    return (@first_snapdate..@latest_snapdate)
  end
  return nil
end
series_span() click to toggle source
# File lib/shiftzilla/release_data.rb, line 101
def series_span
  if @release.uses_milestones?
    return business_days_between(@release.milestones.start.date,@release.milestones.ga.date)
  elsif not @first_snapdate.nil? and not @latest_snapdate.nil?
    return business_days_between(@first_snapdate,@latest_snapdate)
  end
  return nil
end
tb_avg_age() click to toggle source
# File lib/shiftzilla/release_data.rb, line 126
def tb_avg_age
  bug_avg_age(true)
end

Private Instance Methods

business_days_between(start_date, end_date) click to toggle source

Hat tip to stackoverflow.com/a/24753003 for this:

# File lib/shiftzilla/release_data.rb, line 153
def business_days_between(start_date, end_date)
  days_between = (end_date - start_date).to_i
  return 0 unless days_between > 0
  whole_weeks, extra_days = days_between.divmod(7)
  unless extra_days.zero?
    extra_days -= if (start_date + 1).wday <= end_date.wday
                    [(start_date + 1).sunday?, end_date.saturday?].count(true)
                  else
                    2
                  end
  end
  (whole_weeks * 5) + extra_days
end
label_modulo() click to toggle source
# File lib/shiftzilla/release_data.rb, line 178
def label_modulo
  if series_span < 50
    return 5
  end
  return 10
end
pick_max(series_list) click to toggle source
# File lib/shiftzilla/release_data.rb, line 167
def pick_max(series_list)
  max_val = 0
  series_list.each do |s|
    smax = s.select{ |v| not v.nil? }.max
    next if smax.nil?
    next unless smax > max_val
    max_val = smax
  end
  return max_val
end