Skip to content

Commit 4cc7814

Browse files
authored
Merge pull request #609 from rootstrap/add_zero_comments_percetage
Add zero comments percetage
2 parents 2c73ec6 + 4666cf1 commit 4cc7814

File tree

11 files changed

+114
-45
lines changed

11 files changed

+114
-45
lines changed

app/controllers/development_metrics_controller.rb

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,12 @@ def products_metrics
4949
def build_overall_calculations(entity_name)
5050
key = "per_#{entity_name.downcase}_distribution".to_sym
5151

52-
merge_time = @merge_time[key].first
53-
@merge_time_success_rate = merge_time[:success_rate]
54-
@merge_time_avg = merge_time[:avg]
55-
@pull_request_size_avg = @pull_request_size[key].first[:avg]
56-
@review_coverage_avg = @review_coverage[key].first[:avg] if @review_coverage.present?
52+
@merge_time_interval_metrics = @merge_time[key].first[:interval_metrics]
53+
@pull_request_size_interval_metrics = @pull_request_size[key].first[:interval_metrics]
54+
55+
return if @review_coverage.blank?
56+
57+
@review_coverage_interval_metrics = @review_coverage[key].first[:interval_metrics]
5758
end
5859

5960
def build_metrics(entity_id, entity_name)

app/models/review_coverage.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,6 @@ class ReviewCoverage < ApplicationRecord
2929
validates :pull_request_id, uniqueness: true
3030
validates :total_files_changed, :files_with_comments_count,
3131
numericality: { greater_than_or_equal_to: 0 }
32+
33+
scope :with_zero_coverage, -> { where(coverage_percentage: 0) }
3234
end

app/services/alerts_service.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def build_success_rates(metric_name, entity_id, entity_name)
4040

4141
data = distribution_data.first
4242

43-
success_rate = data[:success_rate] if data.present?
43+
success_rate = data[:interval_metrics][:success_rate] if data.present?
4444

4545
success_rate[:rate] if success_rate
4646
end

app/services/builders/chartkick/repository_distribution_data.rb

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,10 @@ module Builders
22
module Chartkick
33
class RepositoryDistributionData < Builders::Chartkick::Base
44
def call
5-
intervals = build_distribution_data(retrieve_records)
6-
75
[{
86
name: repository_name,
97
data: intervals,
10-
success_rate: build_success_rate(repository_name, metric_name, intervals),
11-
avg: build_average
8+
interval_metrics: build_interval_metrics
129
}]
1310
end
1411

@@ -34,20 +31,41 @@ def metric
3431
@metric ||= RepositoryDistributionDataMetrics.const_get(metric_name.to_s.camelize).new
3532
end
3633

34+
def intervals
35+
@intervals ||= build_distribution_data(retrieve_records)
36+
end
37+
3738
def resolve_interval(entity)
3839
metric.resolve_interval(entity)
3940
end
4041

41-
def build_average
42-
return if retrieve_records.empty?
42+
def total_value
43+
@total_value ||= retrieve_records.sum { |record| metric.value_for_average(record) }
44+
end
45+
46+
def total_records
47+
@total_records ||= retrieve_records.size
48+
end
49+
50+
def success_rate
51+
build_success_rate(repository_name, metric_name, intervals)
52+
end
4353

44-
total_value = retrieve_records.sum { |record| metric.value_for_average(record) }
45-
total_records = retrieve_records.count
54+
def build_interval_metrics
55+
return if retrieve_records.empty?
4656

47-
{
57+
interval_data = {
58+
success_rate: success_rate,
4859
avg_number: (total_value.to_f / total_records).round(1),
4960
total: total_records
5061
}
62+
63+
if metric_name == :review_coverage
64+
interval_data[:zero_coverage_percentage] =
65+
metric.zero_coverage_percentage(retrieve_records)
66+
end
67+
68+
interval_data
5169
end
5270
end
5371
end

app/services/builders/chartkick/repository_distribution_data_metrics/review_coverage.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,15 @@ def resolve_interval(entity)
2222
def value_for_average(entity)
2323
entity.coverage_percentage * 100
2424
end
25+
26+
def zero_coverage_percentage(records)
27+
total_count = records.count
28+
return 0 if total_count.zero?
29+
30+
zero_coverage_count = records.with_zero_coverage.count
31+
32+
((zero_coverage_count.to_f / total_count) * 100).round
33+
end
2534
end
2635
end
2736
end

app/views/development_metrics/repositories.erb

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,19 +47,19 @@
4747
<div class='row'>
4848
<div class="col-md-12">
4949
<div class="box-title" >
50-
<% if @merge_time_avg.present? %>
50+
<% if @merge_time_interval_metrics.present? %>
5151
<span class="badge badge-info success_rate_btn">
52-
Average: <%= @merge_time_avg[:avg_number] %> hours
52+
Average: <%= @merge_time_interval_metrics[:avg_number] %> hours
5353
</span>
5454
<% end %>
55-
<% if @merge_time_success_rate.present? %>
55+
<% if @merge_time_interval_metrics.present? && @merge_time_interval_metrics[:success_rate].present? %>
5656
<span class="badge badge-info success_rate_btn">
57-
Success rate: <%= @merge_time_success_rate[:rate] %>%
57+
Success rate: <%= @merge_time_interval_metrics[:success_rate][:rate] %>%
5858
</span>
5959
<% end %>
60-
<% if @merge_time_avg.present? %>
60+
<% if @merge_time_interval_metrics.present? %>
6161
<span class="badge badge-info success_rate_btn">
62-
Total: <%= @merge_time_avg[:total] %> PRs (bots excluded)
62+
Total: <%= @merge_time_interval_metrics[:total] %> PRs (bots excluded)
6363
</span>
6464
<% end %>
6565
</div>
@@ -88,12 +88,12 @@
8888
<span data-placement='right' class='metric_tooltip' aria-hidden='true' data-toggle='tooltip' title='<%= pull_request_size_presenter.metric_explanation %>'>¡</span>
8989
</div>
9090
<div class="box-title" >
91-
<% if @pull_request_size_avg.present? %>
91+
<% if @pull_request_size_interval_metrics.present? %>
9292
<span class="badge badge-info success_rate_btn">
93-
Average: <%= @pull_request_size_avg[:avg_number].round %> lines
93+
Average: <%= @pull_request_size_interval_metrics[:avg_number].round %> lines
9494
</span>
9595
<span class="badge badge-info success_rate_btn">
96-
Total: <%= @pull_request_size_avg[:total] %> PRs (bots excluded)
96+
Total: <%= @pull_request_size_interval_metrics[:total] %> PRs (bots excluded)
9797
</span>
9898
<% end %>
9999
</div>
@@ -125,12 +125,17 @@
125125
<span data-placement='right' class='metric_tooltip' aria-hidden='true' data-toggle='tooltip' title='<%= review_coverage_presenter.metric_explanation %>'>¡</span>
126126
</div>
127127
<div class="box-title" >
128-
<% if @review_coverage_avg.present? %>
128+
<% if @review_coverage_interval_metrics.present? %>
129129
<span class="badge badge-info success_rate_btn">
130-
Average: <%= @review_coverage_avg[:avg_number] %>%
130+
Average: <%= @review_coverage_interval_metrics[:avg_number] %>%
131131
</span>
132+
<% if @review_coverage_interval_metrics[:zero_coverage_percentage].present? %>
133+
<span class="badge badge-warning success_rate_btn">
134+
PRs with 0 Comments: <%= @review_coverage_interval_metrics[:zero_coverage_percentage] %>%
135+
</span>
136+
<% end %>
132137
<span class="badge badge-info success_rate_btn">
133-
Total: <%= @review_coverage_avg[:total] %> PRs (bots excluded)
138+
Total: <%= @review_coverage_interval_metrics[:total] %> PRs (bots excluded)
134139
</span>
135140
<% end %>
136141
</div>

spec/presenters/metric_presenter_spec.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@
77
per_users_repository: [{ name: 'horacio', data: { "2022-10-24": 3.0 } },
88
{ name: 'hvilloria', data: { "2022-10-24": 5.0 } },
99
{ name: 'sandro', data: { "2022-10-24": 14.0 } }],
10-
per_repository_distribution: [{ name: 'forecast', data: [], success_rate: nil }]
10+
per_repository_distribution: [{
11+
name: 'forecast',
12+
data: [],
13+
interval_metrics: { success_rate: nil }
14+
}]
1115
}
1216
end
1317
let(:metric_def) { build(:metric_definition) }

spec/services/builders/chartkick/department_distribution_data_spec.rb

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,12 @@
2424
let(:metric_name) { :merge_time }
2525

2626
it_behaves_like 'merge time data distribution'
27-
it_behaves_like 'success rate'
2827
end
2928

3029
context 'when name is review turnaround' do
3130
let(:metric_name) { :review_turnaround }
3231

3332
it_behaves_like 'review turnaround data distribution'
34-
it_behaves_like 'success rate'
3533
end
3634

3735
context 'when name is pull request size' do

spec/services/builders/chartkick/repository_distribution_data_spec.rb

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,38 @@
4545
it_behaves_like 'pull request size data distribution'
4646
it_behaves_like 'average'
4747
end
48+
49+
context 'when name is review coverage' do
50+
let(:metric_name) { :review_coverage }
51+
52+
before do
53+
pr_with_zero = create(
54+
:pull_request,
55+
:merged,
56+
repository: repository,
57+
merged_at: range.begin + 1.hour
58+
)
59+
pr_with_zero.review_coverage.update!(coverage_percentage: 0.0)
60+
61+
pr_with_coverage = create(
62+
:pull_request,
63+
:merged,
64+
repository: repository,
65+
merged_at: range.begin + 2.hours
66+
)
67+
pr_with_coverage.review_coverage.update!(coverage_percentage: 0.5)
68+
end
69+
70+
it 'includes zero_coverage_percentage in interval_metrics data' do
71+
result = subject.first
72+
expect(result[:interval_metrics]).to include(:zero_coverage_percentage)
73+
end
74+
75+
it 'calculates zero coverage percentage correctly' do
76+
result = subject.first
77+
expect(result[:interval_metrics][:zero_coverage_percentage]).to eq(50)
78+
end
79+
end
4880
end
4981
end
5082
end

spec/support/shared_examples/average.rb

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,16 @@
1515
query.merge!(name: metric_name)
1616
end
1717

18-
it 'returns an array with avg key' do
19-
expect(subject.first).to have_key(:avg)
18+
it 'returns an array with interval_metrics key' do
19+
expect(subject.first).to have_key(:interval_metrics)
2020
end
2121

2222
it 'returns an array with filled value' do
23-
expect(subject.first[:avg][:avg_number]).to eq(average_value)
23+
expect(subject.first[:interval_metrics][:avg_number]).to eq(average_value)
2424
end
2525

2626
it 'returns total number of records' do
27-
expect(subject.first[:avg][:total]).to eq(values_for_average.count)
27+
expect(subject.first[:interval_metrics][:total]).to eq(values_for_average.count)
2828
end
2929

3030
context 'when there is an ignored user' do
@@ -42,15 +42,15 @@
4242
end
4343

4444
it 'does not include ignored user in the total' do
45-
expect(subject.first[:avg][:total]).to eq(values_for_average.count)
45+
expect(subject.first[:interval_metrics][:total]).to eq(values_for_average.count)
4646
end
4747
end
4848

4949
context 'when there are no records' do
5050
let(:values_for_average) { [] }
5151

52-
it 'returns nil for avg' do
53-
expect(subject.first[:avg]).to be_nil
52+
it 'returns nil for interval_metrics' do
53+
expect(subject.first[:interval_metrics]).to be_nil
5454
end
5555
end
5656
end

0 commit comments

Comments
 (0)