From 3be6de1e810b97e4194aab7068145f47d3686abd Mon Sep 17 00:00:00 2001 From: Paulo Meirelles Date: Sat, 7 Jul 2012 00:47:49 +0400 Subject: [PATCH] [Mezuro] Refactoring project content, views and controller (profile) --- plugins/mezuro/controllers/mezuro_plugin_profile_controller.rb | 63 +++++++++++++++++++++++++++++++++++++-------------------------- plugins/mezuro/lib/mezuro_plugin/project_content.rb | 63 +++++++++++++++++++++++++++++++++++++++++++++++++-------------- plugins/mezuro/public/javascripts/project_content.js | 12 +++++++++++- plugins/mezuro/test/functional/mezuro_plugin_profile_controller_test.rb | 6 +++--- plugins/mezuro/views/cms/mezuro_plugin/_project_content.html.erb | 16 ++++++++++++---- plugins/mezuro/views/content_viewer/_module_result.rhtml | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------- plugins/mezuro/views/content_viewer/_project_error.rhtml | 4 ++-- plugins/mezuro/views/content_viewer/_project_result.rhtml | 93 ++++++++++++++++++++++++++++++++++++++++++++++++--------------------------------------------- plugins/mezuro/views/content_viewer/_score_history.rhtml | 2 +- plugins/mezuro/views/content_viewer/_source_tree.rhtml | 76 ++++++++++++++++++++++++++++++++++++++++------------------------------------ plugins/mezuro/views/content_viewer/show_project.rhtml | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------ 11 files changed, 312 insertions(+), 233 deletions(-) diff --git a/plugins/mezuro/controllers/mezuro_plugin_profile_controller.rb b/plugins/mezuro/controllers/mezuro_plugin_profile_controller.rb index 6a8e59d..f780113 100644 --- a/plugins/mezuro/controllers/mezuro_plugin_profile_controller.rb +++ b/plugins/mezuro/controllers/mezuro_plugin_profile_controller.rb @@ -1,56 +1,67 @@ class MezuroPluginProfileController < ProfileController append_view_path File.join(File.dirname(__FILE__) + '/../views') - + def project_state - content = profile.articles.find(params[:id]) - project = content.project + @content = profile.articles.find(params[:id]) + project = @content.project state = project.error.nil? ? project.state : "ERROR" render :text => state end def project_error - content = profile.articles.find(params[:id]) - project = content.project - render :partial => 'content_viewer/project_error', :locals => { :project => project } + @content = profile.articles.find(params[:id]) + @project = @content.project + render :partial => 'content_viewer/project_error' end def project_result - content = profile.articles.find(params[:id]) + @content = profile.articles.find(params[:id]) date = params[:date] - project_result = date.nil? ? content.project_result : content.get_date_result(date) - project = content.project - render :partial => 'content_viewer/project_result', :locals => { :project_result => project_result} + @project_result = date.nil? ? @content.project_result : @content.get_date_result(date) + render :partial => 'content_viewer/project_result' end def module_result - content = profile.articles.find(params[:id]) + @content = profile.articles.find(params[:id]) date = params[:date] - date.nil? ? content.project_result : content.get_date_result(date) - module_result = content.module_result(params[:module_name]) - render :partial => 'content_viewer/module_result', :locals => { :module_result => module_result} + date.nil? ? @content.project_result : @content.get_date_result(date) + @module_result = @content.module_result(params[:module_name]) + render :partial => 'content_viewer/module_result' end def project_tree - content = profile.articles.find(params[:id]) + @content = profile.articles.find(params[:id]) date = params[:date] - project_result = date.nil? ? content.project_result : content.get_date_result(date) - source_tree = project_result.node_of(params[:module_name]) - render :partial =>'content_viewer/source_tree', :locals => { :source_tree => source_tree, :project_name => content.project.name} + project_result = date.nil? ? @content.project_result : @content.get_date_result(date) + @project_name = @content.project.name + @source_tree = project_result.node_of(params[:module_name]) + render :partial =>'content_viewer/source_tree' end def module_metrics_history metric_name = params[:metric_name] - content = profile.articles.find(params[:id]) - module_history = content.result_history(params[:module_name]) - score_history = (module_history.collect { |module_result| (module_result.metric_results.select { |metric_result| metric_result.metric.name.delete("() ") == metric_name })[0] }).collect { |metric_result| metric_result.value } - render :partial => 'content_viewer/score_history', :locals => {:score_history => score_history} + @content = profile.articles.find(params[:id]) + module_history = @content.result_history(params[:module_name]) + @score_history = filtering_metric_history(metric_name, module_history) + render :partial => 'content_viewer/score_history' end def module_grade_history - content = profile.articles.find(params[:id]) - modules_results = content.result_history(params[:module_name]) - score_history = modules_results.collect { |module_result| module_result.grade } - render :partial => 'content_viewer/score_history', :locals => {:score_history => score_history} + @content = profile.articles.find(params[:id]) + modules_results = @content.result_history(params[:module_name]) + @score_history = modules_results.collect { |module_result| module_result.grade } + render :partial => 'content_viewer/score_history' + end + + private + + def filtering_metric_history(metric_name, module_history) + metric_history = module_history.collect do |module_result| + module_result.metric_results.select do |metric_result| + metric_result.metric.name.delete("() ") == metric_name + end + end + metric_history[0].collect{ |metric_result| metric_result.value } end end diff --git a/plugins/mezuro/lib/mezuro_plugin/project_content.rb b/plugins/mezuro/lib/mezuro_plugin/project_content.rb index 43909ca..7ad9919 100644 --- a/plugins/mezuro/lib/mezuro_plugin/project_content.rb +++ b/plugins/mezuro/lib/mezuro_plugin/project_content.rb @@ -1,6 +1,6 @@ class MezuroPlugin::ProjectContent < Article - validate :validate_kalibro_project_name - + validate_on_create :validate_kalibro_project_name + validate_on_create :validate_repository_url def self.short_description 'Kalibro project' end @@ -20,17 +20,29 @@ class MezuroPlugin::ProjectContent < Article def project - @project ||= Kalibro::Client::ProjectClient.project(name) + begin + @project ||= Kalibro::Client::ProjectClient.project(name) + rescue Exception => error + errors.add_to_base(error.message) + end end def project_result - @project_result ||= Kalibro::Client::ProjectResultClient.last_result(name) + begin + @project_result ||= Kalibro::Client::ProjectResultClient.last_result(name) + rescue Exception => error + errors.add_to_base(error.message) + end end def get_date_result(date) - client = Kalibro::Client::ProjectResultClient.new - @project_result ||= client.has_results_before(name, date) ? client.last_result_before(name, date) : + begin + client = Kalibro::Client::ProjectResultClient.new + @project_result ||= client.has_results_before(name, date) ? client.last_result_before(name, date) : client.first_result_after(name, date) + rescue Exception => error + errors.add_to_base(error.message) + end end def module_result(module_name) @@ -48,24 +60,47 @@ client.first_result_after(name, date) private def validate_kalibro_project_name - existing = Kalibro::Client::ProjectClient.new.project_names + begin + existing = Kalibro::Client::ProjectClient.new.project_names + rescue Exception => error + errors.add_to_base(error.message) + end - if existing.include?(name) + if existing.any?{|existing_name| existing_name.casecmp(name)==0} # existing.include?(name) + case insensitive errors.add_to_base("Project name already exists in Kalibro") end end - + + def validate_repository_url + if(repository_url.nil? || repository_url == "") + errors.add_to_base("Repository URL is mandatory") + end + end + def send_project_to_service - Kalibro::Client::ProjectClient.save(self) - Kalibro::Client::KalibroClient.process_project(name, periodicity_in_days) + begin + Kalibro::Client::ProjectClient.save(self) + Kalibro::Client::KalibroClient.process_project(name, periodicity_in_days) + rescue Exception => error + errors.add_to_base(error.message) + end + end def remove_project_from_service - Kalibro::Client::ProjectClient.remove(name) + begin + Kalibro::Client::ProjectClient.remove(name) + rescue Exception => error + errors.add_to_base(error.message) + end + end def module_result_client - @module_result_client ||= Kalibro::Client::ModuleResultClient.new + begin + @module_result_client ||= Kalibro::Client::ModuleResultClient.new + rescue Exception => error + errors.add_to_base(error.message) + end end end - diff --git a/plugins/mezuro/public/javascripts/project_content.js b/plugins/mezuro/public/javascripts/project_content.js index 9c1fc91..f40868d 100644 --- a/plugins/mezuro/public/javascripts/project_content.js +++ b/plugins/mezuro/public/javascripts/project_content.js @@ -5,6 +5,7 @@ jQuery(function (){ jQuery('[data-show]').live("click", toggle_mezuro); jQuery('[show-metric-history]').live("click", display_metric_history); jQuery('[show-grade-history]').live("click", display_grade_history); + jQuery('#project_date_submit').live("click", reloadProjectWithDate); showLoadingProcess(true); showProjectContent(); }); @@ -55,8 +56,17 @@ function reloadProjectWithDate(){ var month = jQuery("#project_date_month").val(); var year = jQuery("#project_date_year").val(); - var date = year + "-" + month + "-" + day + "T00:00:00+00:00"; + if(day.length == 1) + day = "0" + day; + if(month.length == 1) + month = "0" + month; + var date = new Date(year + "-" + month + "-" + day + "T00:00:00+00:00"); + + if(isNaN(date)){ + alert("Invalid date! " + date); + return false; + } reloadProject(date); return false; } diff --git a/plugins/mezuro/test/functional/mezuro_plugin_profile_controller_test.rb b/plugins/mezuro/test/functional/mezuro_plugin_profile_controller_test.rb index 2d24691..efddf78 100644 --- a/plugins/mezuro/test/functional/mezuro_plugin_profile_controller_test.rb +++ b/plugins/mezuro/test/functional/mezuro_plugin_profile_controller_test.rb @@ -6,6 +6,7 @@ require "#{RAILS_ROOT}/plugins/mezuro/test/fixtures/error_fixtures" require "#{RAILS_ROOT}/plugins/mezuro/test/fixtures/base_tool_fixtures" require "#{RAILS_ROOT}/plugins/mezuro/test/fixtures/native_metric_fixtures" require "#{RAILS_ROOT}/plugins/mezuro/test/fixtures/metric_configuration_fixtures" +require "#{RAILS_ROOT}/plugins/mezuro/test/fixtures/repository_fixtures" class MezuroPluginProfileControllerTest < ActionController::TestCase @@ -17,6 +18,7 @@ class MezuroPluginProfileControllerTest < ActionController::TestCase @project_result = ProjectResultFixtures.qt_calculator @module_result = ModuleResultFixtures.create + @repository_url = RepositoryFixtures.qt_calculator.address @project = @project_result.project @name = @project.name @@ -66,7 +68,6 @@ class MezuroPluginProfileControllerTest < ActionController::TestCase should 'get project results without date' do create_project_content Kalibro::Client::ProjectResultClient.expects(:last_result).with(@name).returns(@project_result) - Kalibro::Client::ProjectClient.expects(:project).with(@name).returns(@project) get :project_result, :profile => @profile.identifier, :id => @content.id assert_response 200 assert_select('h4', 'Last Result') @@ -75,7 +76,6 @@ class MezuroPluginProfileControllerTest < ActionController::TestCase should 'get project results from a specific date' do create_project_content mock_project_result - Kalibro::Client::ProjectClient.expects(:project).with(@name).returns(@project) get :project_result, :profile => @profile.identifier, :id => @content.id, :date => @project_result.date assert_response 200 end @@ -90,7 +90,6 @@ class MezuroPluginProfileControllerTest < ActionController::TestCase mock_module_result Kalibro::Client::ProjectResultClient.expects(:last_result).with(@name).returns(@project_result) Kalibro::Client::ProjectClient.expects(:project).with(@name).returns(@project) - get :module_result, :profile => @profile.identifier, :id => @content.id, :module_name => @name assert_response 200 assert_select('h5', 'Metric results for: Qt-Calculator (APPLICATION)') @@ -157,6 +156,7 @@ class MezuroPluginProfileControllerTest < ActionController::TestCase @content = MezuroPlugin::ProjectContent.new(:profile => @profile, :name => @name) @content.expects(:send_project_to_service).returns(nil) Kalibro::Client::ProjectClient.expects(:new).returns(client) + @content.repository_url = @repository_url client.expects(:project_names).returns([]) @content.save end diff --git a/plugins/mezuro/views/cms/mezuro_plugin/_project_content.html.erb b/plugins/mezuro/views/cms/mezuro_plugin/_project_content.html.erb index 6c1c616..e127b44 100644 --- a/plugins/mezuro/views/cms/mezuro_plugin/_project_content.html.erb +++ b/plugins/mezuro/views/cms/mezuro_plugin/_project_content.html.erb @@ -15,8 +15,11 @@ <%= hidden_field_tag 'id', @article.id %> <%= required_fields_message %> - -<%= required f.text_field(:name) %> +<% if !@project.nil? && !@article.id.nil? %> + <%= required f.text_field(:name, :disabled => 'true') %> +<% else %> + <%= required f.text_field(:name) %> +<% end %> <%= f.text_field :license %>
@@ -31,9 +34,14 @@ <% @configuration_names = Kalibro::Client::ConfigurationClient.new.configuration_names.sort %> <% @selected = (@project.nil? ? @configuration_names[0] : @project.configuration_name) %> -<%= required labelled_form_field _('Configuration'), - f.select(:configuration_name, @configuration_names, {:selected => @selected}) %>
+<% if !@project.nil? && !@article.id.nil? %> + <%= required labelled_form_field _('Configuration'), + f.select(:configuration_name, @configuration_names, {:selected => @selected}, :disabled => 'true') %> +<% else %> + <%= required labelled_form_field _('Configuration'), + f.select(:configuration_name, @configuration_names, {:selected => @selected}) %>
+<% end %> <% selected = (@project.nil? ? 0 : @kalibro_client.process_period(@article.title).to_i) %> <%= required labelled_form_field _('Periodic Avaliation'), diff --git a/plugins/mezuro/views/content_viewer/_module_result.rhtml b/plugins/mezuro/views/content_viewer/_module_result.rhtml index d1194f0..3684b19 100644 --- a/plugins/mezuro/views/content_viewer/_module_result.rhtml +++ b/plugins/mezuro/views/content_viewer/_module_result.rhtml @@ -1,56 +1,60 @@ -<% the_module = module_result.module %> -<% module_label = "#{the_module.name} (#{the_module.granularity})" %> +<% unless @content.errors[:base].nil? %> + <%= @content.errors[:base] %> +<% else %> + <% the_module = @module_result.module %> + <% module_label = "#{the_module.name} (#{the_module.granularity})" %> -
<%= _('Metric results for: ') + module_label %>
+
<%= _('Metric results for: ') + module_label %>
-
-
- - - - - - - - - - - <% module_result.metric_results.each do |metric_result| %> - <% range = metric_result.range %> - <% if !range.nil? %> - - - - - - - - - - +
+
+
MetricValueWeightThreshold
<%= metric_result.metric.name %><%= MezuroPlugin::Helpers::ContentViewerHelper.format_grade(metric_result.value) %><%= metric_result.weight %><%= range.label %>
+ + + + + + + + + + <% @module_result.metric_results.each do |metric_result| %> + <% range = metric_result.range %> + <% if !range.nil? %> + + + + + + + + + + + <% end %> <% end %> - <% end %> - - - - - - - -
MetricValueWeightThreshold
<%= metric_result.metric.name %><%= MezuroPlugin::Helpers::ContentViewerHelper.format_grade(metric_result.value) %><%= metric_result.weight %><%= range.label %>
-
-
- - - <%= _('Grade:') %> - <%= "%.02f" % module_result.grade %> - - -
-
+ + + + +
+ + + + + <%= _('Grade:') %> + <%= "%.02f" % @module_result.grade %> + + + + + + + +<% end %> diff --git a/plugins/mezuro/views/content_viewer/_project_error.rhtml b/plugins/mezuro/views/content_viewer/_project_error.rhtml index 5256e2c..0bb2c75 100644 --- a/plugins/mezuro/views/content_viewer/_project_error.rhtml +++ b/plugins/mezuro/views/content_viewer/_project_error.rhtml @@ -1,8 +1,8 @@

<%= _('ERROR') %>

- <%= "State when error ocurred: #{project.state}" %> + <%= "State when error ocurred: #{@project.state}" %>
- <% error = project.error %> + <% error = @project.error %> <%= error.message %>