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