Commit 0ea98e348e04355a4ee208c243d5aa262114be1c

Authored by Rafael Manzo
1 parent 9b8c21ed

Displaying metric results for the root module

Signed-off by: Renan Fichberg <rfichberg@gmail.com>
@@ -37,7 +37,7 @@ gem &#39;jbuilder&#39;, &#39;~&gt; 1.2&#39; @@ -37,7 +37,7 @@ gem &#39;jbuilder&#39;, &#39;~&gt; 1.2&#39;
37 gem 'devise', '~> 3.1.0' 37 gem 'devise', '~> 3.1.0'
38 38
39 # Kalibro integration 39 # Kalibro integration
40 -gem 'kalibro_entities', "~> 0.0.1.rc3" 40 +gem 'kalibro_entities', "~> 0.0.1.rc4"
41 41
42 # PostgreSQL integration 42 # PostgreSQL integration
43 gem "pg", "~> 0.17.0" 43 gem "pg", "~> 0.17.0"
@@ -101,7 +101,7 @@ GEM @@ -101,7 +101,7 @@ GEM
101 railties (>= 3.0, < 5.0) 101 railties (>= 3.0, < 5.0)
102 thor (>= 0.14, < 2.0) 102 thor (>= 0.14, < 2.0)
103 json (1.8.1) 103 json (1.8.1)
104 - kalibro_entities (0.0.1.rc3) 104 + kalibro_entities (0.0.1.rc4)
105 activesupport (~> 4.0.0) 105 activesupport (~> 4.0.0)
106 savon-ng-1.6 (~> 2.4.1) 106 savon-ng-1.6 (~> 2.4.1)
107 konacha (3.0.0) 107 konacha (3.0.0)
@@ -116,7 +116,7 @@ GEM @@ -116,7 +116,7 @@ GEM
116 treetop (~> 1.4.8) 116 treetop (~> 1.4.8)
117 metaclass (0.0.1) 117 metaclass (0.0.1)
118 mime-types (1.25) 118 mime-types (1.25)
119 - mini_portile (0.5.1) 119 + mini_portile (0.5.2)
120 minitest (4.7.5) 120 minitest (4.7.5)
121 mocha (0.14.0) 121 mocha (0.14.0)
122 metaclass (~> 0.0.1) 122 metaclass (~> 0.0.1)
@@ -255,7 +255,7 @@ DEPENDENCIES @@ -255,7 +255,7 @@ DEPENDENCIES
255 factory_girl_rails 255 factory_girl_rails
256 jbuilder (~> 1.2) 256 jbuilder (~> 1.2)
257 jquery-rails 257 jquery-rails
258 - kalibro_entities (~> 0.0.1.rc3) 258 + kalibro_entities (~> 0.0.1.rc4)
259 konacha (~> 3.0.0) 259 konacha (~> 3.0.0)
260 mocha 260 mocha
261 modernizr-rails 261 modernizr-rails
app/controllers/repositories_controller.rb
@@ -9,15 +9,16 @@ class RepositoriesController &lt; ApplicationController @@ -9,15 +9,16 @@ class RepositoriesController &lt; ApplicationController
9 # GET /projects/1/repositories/1 9 # GET /projects/1/repositories/1
10 # GET /projects/1/repositories/1.json 10 # GET /projects/1/repositories/1.json
11 def show 11 def show
12 - @configuration = KalibroEntities::Entities::Configuration.find(@repository.configuration_id) #FIXME: As soon as the Configuration model gets created refactor this!  
13 - @processing = @repository.last_processing 12 + @configuration = KalibroEntities::Entities::Configuration.find(@repository.configuration_id) #FIXME: As soon as the Configuration model gets created refactor this!
  13 + @processing = @repository.last_processing
  14 + @metric_results = @processing.metric_results if @processing.ready?
14 end 15 end
15 16
16 # GET projects/1/repositories/new 17 # GET projects/1/repositories/new
17 def new 18 def new
18 - @project_id = params[:project_id]  
19 - @repository = Repository.new  
20 - @repository_types = Repository.repository_types 19 + @project_id = params[:project_id]
  20 + @repository = Repository.new
  21 + @repository_types = Repository.repository_types
21 end 22 end
22 23
23 # GET /repositories/1/edit 24 # GET /repositories/1/edit
app/helpers/processings_helper.rb
@@ -2,4 +2,16 @@ module ProcessingsHelper @@ -2,4 +2,16 @@ module ProcessingsHelper
2 def humanize_eplased_time duration_in_milliseconds 2 def humanize_eplased_time duration_in_milliseconds
3 distance_of_time_in_words(Time.now, (duration_in_milliseconds/1000.0).seconds.from_now) 3 distance_of_time_in_words(Time.now, (duration_in_milliseconds/1000.0).seconds.from_now)
4 end 4 end
  5 +
  6 + def format_grade(grade)
  7 + sprintf("%.2f", grade.to_f)
  8 + end
  9 +
  10 + def find_range_snapshot(metric_result)
  11 + range_snapshots = metric_result.metric_configuration_snapshot.range_snapshot
  12 +
  13 + range_snapshots.each do |range_snapshot|
  14 + return range_snapshot if (range_snapshot.beginning <= metric_result.value && range_snapshot.end >= metric_result.value)
  15 + end
  16 + end
5 end 17 end
6 \ No newline at end of file 18 \ No newline at end of file
app/models/processing.rb
1 class Processing < KalibroEntities::Entities::Processing 1 class Processing < KalibroEntities::Entities::Processing
2 include KalibroRecord 2 include KalibroRecord
3 -end  
4 \ No newline at end of file 3 \ No newline at end of file
  4 +
  5 + def ready?
  6 + @state == "READY"
  7 + end
  8 +
  9 + def metric_results
  10 + KalibroEntities::Entities::MetricResult.metric_results_of(@results_root_id)
  11 + end
  12 +end
app/views/repositories/_metric_result.html.erb 0 → 100644
@@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
  1 +<% metric_configuration_snapshot = metric_result.metric_configuration_snapshot %>
  2 +<% unless metric_configuration_snapshot.range_snapshot.nil? %>
  3 + <% range_snapshot = find_range_snapshot(metric_result) %>
  4 + <tr>
  5 + <td><%= metric_configuration_snapshot.metric.name %></td>
  6 + <td><%= format_grade(metric_result.value) %></td>
  7 + <td><%= metric_configuration_snapshot.weight %></td>
  8 + <td><span style="color: #<%= range_snapshot.color %>"><%= range_snapshot.label %></span></td>
  9 + </tr>
  10 +<% end %>
0 \ No newline at end of file 11 \ No newline at end of file
app/views/repositories/show.html.erb
@@ -37,6 +37,24 @@ @@ -37,6 +37,24 @@
37 37
38 <hr/> 38 <hr/>
39 39
  40 +<% if @processing.ready? %>
  41 + <table class="table table-hover">
  42 + <thead>
  43 + <th>Metric</th>
  44 + <th>Value</th>
  45 + <th>Weight</th>
  46 + <th>Threshold</th>
  47 + </thead>
  48 +
  49 + <tbody>
  50 + <%= render partial: 'metric_result', collection: @metric_results %>
  51 + </tbody>
  52 +
  53 + </table>
  54 +<% end %>
  55 +
  56 +<hr/>
  57 +
40 <%= link_to 'Back', project_path(@repository.project_id), class: 'btn btn-default' %> 58 <%= link_to 'Back', project_path(@repository.project_id), class: 'btn btn-default' %>
41 <% if project_owner? @repository.project_id %> 59 <% if project_owner? @repository.project_id %>
42 <%= link_to 'Destroy', project_repository_path(@repository.project_id, @repository.id), method: :delete, data: { confirm: 'Are you sure?' }, class: 'btn btn-danger' %> 60 <%= link_to 'Destroy', project_repository_path(@repository.project_id, @repository.id), method: :delete, data: { confirm: 'Are you sure?' }, class: 'btn btn-danger' %>
features/repository/show.feature
@@ -21,6 +21,10 @@ Feature: Show Repository @@ -21,6 +21,10 @@ Feature: Show Repository
21 And I should see "LOADING time" 21 And I should see "LOADING time"
22 And I should see "COLLECTING time" 22 And I should see "COLLECTING time"
23 And I should see "ANALYZING time" 23 And I should see "ANALYZING time"
  24 + And I should see "Metric"
  25 + And I should see "Value"
  26 + And I should see "Weight"
  27 + And I should see "Threshold"
24 28
25 @kalibro_restart 29 @kalibro_restart
26 Scenario: Just after start to process 30 Scenario: Just after start to process
@@ -35,4 +39,8 @@ Feature: Show Repository @@ -35,4 +39,8 @@ Feature: Show Repository
35 And I should see "Address" 39 And I should see "Address"
36 And I should see "Configuration" 40 And I should see "Configuration"
37 And I should see "State" 41 And I should see "State"
38 - And I should see "Creation date"  
39 \ No newline at end of file 42 \ No newline at end of file
  43 + And I should see "Creation date"
  44 + And I should not see Metric
  45 + And I should not see Value
  46 + And I should not see Weight
  47 + And I should not see Threshold
40 \ No newline at end of file 48 \ No newline at end of file
spec/controllers/repositories_controller_spec.rb
@@ -80,9 +80,13 @@ describe RepositoriesController do @@ -80,9 +80,13 @@ describe RepositoriesController do
80 end 80 end
81 81
82 describe 'show' do 82 describe 'show' do
83 - let(:repository) { FactoryGirl.build(:repository)} 83 + let(:repository) { FactoryGirl.build(:repository) }
  84 +
84 before :each do 85 before :each do
85 - repository.expects(:last_processing).returns(FactoryGirl.build(:processing)) 86 + processing = FactoryGirl.build(:processing)
  87 +
  88 + processing.expects(:metric_results).returns(nil)
  89 + repository.expects(:last_processing).returns(processing)
86 KalibroEntities::Entities::Configuration.expects(:find).with(repository.id).returns(FactoryGirl.build(:configuration)) 90 KalibroEntities::Entities::Configuration.expects(:find).with(repository.id).returns(FactoryGirl.build(:configuration))
87 Repository.expects(:find).with(repository.id).returns(repository) 91 Repository.expects(:find).with(repository.id).returns(repository)
88 92
spec/factories/metric_configurations_snapshot.rb 0 → 100644
@@ -0,0 +1,26 @@ @@ -0,0 +1,26 @@
  1 +# This file is part of KalibroEntities
  2 +# Copyright (C) 2013 it's respectives authors (please see the AUTHORS file)
  3 +#
  4 +# This program is free software: you can redistribute it and/or modify
  5 +# it under the terms of the GNU General Public License as published by
  6 +# the Free Software Foundation, either version 3 of the License, or
  7 +# (at your option) any later version.
  8 +#
  9 +# This program is distributed in the hope that it will be useful,
  10 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12 +# GNU General Public License for more details.
  13 +
  14 +# You should have received a copy of the GNU General Public License
  15 +# along with this program. If not, see <http://www.gnu.org/licenses/>.
  16 +
  17 +FactoryGirl.define do
  18 + factory :metric_configuration_snapshot, class: KalibroEntities::Entities::MetricConfigurationSnapshot do
  19 + code "code"
  20 + weight "1.0"
  21 + aggregation_form 'AVERAGE'
  22 + metric {FactoryGirl.build(:metric)}
  23 + base_tool_name "Analizo"
  24 + range {FactoryGirl.build(:range_snapshot)}
  25 + end
  26 +end
0 \ No newline at end of file 27 \ No newline at end of file
spec/factories/metric_results.rb 0 → 100644
@@ -0,0 +1,24 @@ @@ -0,0 +1,24 @@
  1 +# This file is part of KalibroEntities
  2 +# Copyright (C) 2013 it's respectives authors (please see the AUTHORS file)
  3 +#
  4 +# This program is free software: you can redistribute it and/or modify
  5 +# it under the terms of the GNU General Public License as published by
  6 +# the Free Software Foundation, either version 3 of the License, or
  7 +# (at your option) any later version.
  8 +#
  9 +# This program is distributed in the hope that it will be useful,
  10 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12 +# GNU General Public License for more details.
  13 +
  14 +# You should have received a copy of the GNU General Public License
  15 +# along with this program. If not, see <http://www.gnu.org/licenses/>.
  16 +
  17 +FactoryGirl.define do
  18 + factory :metric_result, class: KalibroEntities::Entities::MetricResult do
  19 + id "42"
  20 + self.configuration { FactoryGirl.build(:metric_configuration_snapshot) }
  21 + value "10.0"
  22 + aggregated_value "21"
  23 + end
  24 +end
spec/factories/ranges_snapshot.rb 0 → 100644
@@ -0,0 +1,26 @@ @@ -0,0 +1,26 @@
  1 +# This file is part of KalibroEntities
  2 +# Copyright (C) 2013 it's respectives authors (please see the AUTHORS file)
  3 +#
  4 +# This program is free software: you can redistribute it and/or modify
  5 +# it under the terms of the GNU General Public License as published by
  6 +# the Free Software Foundation, either version 3 of the License, or
  7 +# (at your option) any later version.
  8 +#
  9 +# This program is distributed in the hope that it will be useful,
  10 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12 +# GNU General Public License for more details.
  13 +
  14 +# You should have received a copy of the GNU General Public License
  15 +# along with this program. If not, see <http://www.gnu.org/licenses/>.
  16 +
  17 +FactoryGirl.define do
  18 + factory :range_snapshot, class: KalibroEntities::Entities::RangeSnapshot do
  19 + beginning 1.1
  20 + self.end 5.1
  21 + label "Snapshot"
  22 + grade 10.1
  23 + color "FF2284"
  24 + comments "Comment"
  25 + end
  26 +end
0 \ No newline at end of file 27 \ No newline at end of file
spec/helpers/processings_helper_spec.rb
@@ -6,4 +6,29 @@ describe ProcessingsHelper do @@ -6,4 +6,29 @@ describe ProcessingsHelper do
6 helper.humanize_eplased_time(6000).should eq('less than a minute') 6 helper.humanize_eplased_time(6000).should eq('less than a minute')
7 end 7 end
8 end 8 end
  9 +
  10 + describe 'format_grade' do
  11 + it 'should format a Float to a readable format' do
  12 + helper.format_grade(1.333333333).should eq("1.33")
  13 + end
  14 + end
  15 +
  16 + describe 'find_range_snapshot' do
  17 + let(:metric_configuration_snapshot) { FactoryGirl.build(:metric_configuration_snapshot)}
  18 + let(:metric_result) { FactoryGirl.build(:metric_result, {value: 6.0, configuration: metric_configuration_snapshot})}
  19 + let(:range_snapshot_1_to_5) { FactoryGirl.build(:range_snapshot, {beginning: 1.0, end: 5.0}) }
  20 + let(:range_snapshot_5dot1_to_10) { FactoryGirl.build(:range_snapshot, {beginning: 5.1, end: 10.0}) }
  21 + let(:range_snapshot_10dot1_to_15) { FactoryGirl.build(:range_snapshot, {beginning: 10.1, end: 15.0}) }
  22 +
  23 + before :each do
  24 + metric_configuration_snapshot.expects(:range_snapshot).
  25 + returns([range_snapshot_1_to_5,
  26 + range_snapshot_5dot1_to_10,
  27 + range_snapshot_10dot1_to_15])
  28 + end
  29 +
  30 + it 'should return the range snapshot in which the value was in between' do
  31 + helper.find_range_snapshot(metric_result).should eq(range_snapshot_5dot1_to_10)
  32 + end
  33 + end
9 end 34 end
10 \ No newline at end of file 35 \ No newline at end of file
spec/models/processing_spec.rb 0 → 100644
@@ -0,0 +1,31 @@ @@ -0,0 +1,31 @@
  1 +require 'spec_helper'
  2 +
  3 +describe Processing do
  4 + describe 'methods' do
  5 + subject { FactoryGirl.build(:processing) }
  6 +
  7 + describe 'ready?' do
  8 + context 'with a READY processing' do
  9 + it 'should return true' do
  10 + subject.ready?.should be_true
  11 + end
  12 + end
  13 +
  14 + context 'without a READY processing' do
  15 + subject { FactoryGirl.build(:processing, state: 'COLLECTING') }
  16 +
  17 + it 'should return false' do
  18 + subject.ready?.should be_false
  19 + end
  20 + end
  21 + end
  22 +
  23 + describe 'metric_results' do
  24 + it 'should call the metric_results_of method' do
  25 + KalibroEntities::Entities::MetricResult.expects(:metric_results_of).with(subject.results_root_id).returns(nil)
  26 +
  27 + subject.metric_results
  28 + end
  29 + end
  30 + end
  31 +end
0 \ No newline at end of file 32 \ No newline at end of file