Module: GroupableIssueChart

Included in:
AgingWorkInProgressChart, FlowEfficiencyScatterplot, ThroughputChart, TimeBasedHistogram, TimeBasedScatterplot
Defined in:
lib/jirametrics/groupable_issue_chart.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#group_by_blockObject (readonly)

Returns the value of attribute group_by_block.



8
9
10
# File 'lib/jirametrics/groupable_issue_chart.rb', line 8

def group_by_block
  @group_by_block
end

#issue_hintsObject

Returns the value of attribute issue_hints.



7
8
9
# File 'lib/jirametrics/groupable_issue_chart.rb', line 7

def issue_hints
  @issue_hints
end

#issue_periodsObject

Returns the value of attribute issue_periods.



7
8
9
# File 'lib/jirametrics/groupable_issue_chart.rb', line 7

def issue_periods
  @issue_periods
end

Instance Method Details

#accumulate_issue_for_group(result, rules, issue) ⇒ Object

Ruby's Hash keeps whichever key object it saw first, so a later issue whose rules object has different percentiles needs to be reconciled against that retained key rather than just appended under its own (discarded) key.



48
49
50
51
52
# File 'lib/jirametrics/groupable_issue_chart.rb', line 48

def accumulate_issue_for_group result, rules, issue
  existing_key = result.keys.find { |key| key.eql? rules }
  reconcile_percentiles existing_key, rules if existing_key
  (result[existing_key || rules] ||= []) << issue
end

#group_issues(completed_issues) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/jirametrics/groupable_issue_chart.rb', line 19

def group_issues completed_issues
  result = {}
  ignored_issues = []
  @issue_hints = {}
  @issue_periods = {}
  completed_issues.each do |issue|
    rules = GroupingRules.new
    @group_by_block.call(issue, rules)
    if rules.ignored?
      ignored_issues << issue
      next
    end

    @issue_hints[issue] = rules.issue_hint
    @issue_periods[issue] = rules.last_day_of_period
    accumulate_issue_for_group result, rules, issue
  end

  completed_issues.reject! { |issue| ignored_issues.include? issue }

  result.each_key do |rules|
    rules.color = next_palette_color if rules.color.nil?
  end
  result
end

#grouping_rules(&block) ⇒ Object



15
16
17
# File 'lib/jirametrics/groupable_issue_chart.rb', line 15

def grouping_rules &block
  @group_by_block = block
end

#init_configuration_block(user_provided_block, &default_block) ⇒ Object



10
11
12
13
# File 'lib/jirametrics/groupable_issue_chart.rb', line 10

def init_configuration_block user_provided_block, &default_block
  instance_eval(&user_provided_block)
  instance_eval(&default_block) unless @group_by_block
end

#reconcile_percentiles(existing_key, rules) ⇒ Object

The retained hash key is whichever rules object arrived first, so a later issue setting a different list would silently lose. That can only be a config error, so say so.



56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/jirametrics/groupable_issue_chart.rb', line 56

def reconcile_percentiles existing_key, rules
  incoming = rules.percentiles
  return if incoming.nil?

  existing = existing_key.percentiles
  if existing.nil?
    existing_key.percentiles = incoming
  elsif existing != incoming
    raise ArgumentError,
      "group #{existing_key.label.inspect} was given conflicting percentiles: " \
      "#{existing.inspect} and #{incoming.inspect}"
  end
end