Commit 82433ef3e6555ec36b448fa66dd0b8321fc28598
Exists in
master
and in
29 other branches
Merge branch 'new_source_tree' into mezuro
Showing
15 changed files
with
158 additions
and
72 deletions
Show diff stats
plugins/mezuro/controllers/mezuro_plugin_profile_controller.rb
| ... | ... | @@ -18,6 +18,7 @@ class MezuroPluginProfileController < ProfileController |
| 18 | 18 | def project_result |
| 19 | 19 | content = profile.articles.find(params[:id]) |
| 20 | 20 | project_result = content.project_result |
| 21 | + project = content.project | |
| 21 | 22 | render :partial => 'content_viewer/project_result', :locals => { :project_result => project_result } |
| 22 | 23 | end |
| 23 | 24 | |
| ... | ... | @@ -27,4 +28,11 @@ class MezuroPluginProfileController < ProfileController |
| 27 | 28 | render :partial => 'content_viewer/module_result', :locals => { :module_result => module_result} |
| 28 | 29 | end |
| 29 | 30 | |
| 31 | + def project_tree | |
| 32 | + content = profile.articles.find(params[:id]) | |
| 33 | + project_result = content.project_result | |
| 34 | + source_tree = project_result.node_of(params[:module_name]) | |
| 35 | + render :partial =>'content_viewer/source_tree', :locals => { :source_tree => source_tree, :project_name => content.project.name} | |
| 36 | + end | |
| 37 | + | |
| 30 | 38 | end | ... | ... |
plugins/mezuro/lib/kalibro/entities/entity.rb
| ... | ... | @@ -7,7 +7,7 @@ class Kalibro::Entities::Entity |
| 7 | 7 | end |
| 8 | 8 | |
| 9 | 9 | def set(field, value) |
| 10 | - send("#{field}=", value) | |
| 10 | + send("#{field}=", value) if not field.to_s.start_with? '@' | |
| 11 | 11 | end |
| 12 | 12 | |
| 13 | 13 | def to_entity_array(value, entity_class = nil) |
| ... | ... | @@ -50,4 +50,4 @@ class Kalibro::Entities::Entity |
| 50 | 50 | send("#{field}") |
| 51 | 51 | end |
| 52 | 52 | |
| 53 | -end | |
| 54 | 53 | \ No newline at end of file |
| 54 | +end | ... | ... |
plugins/mezuro/lib/kalibro/entities/module.rb
| ... | ... | @@ -2,4 +2,17 @@ class Kalibro::Entities::Module < Kalibro::Entities::Entity |
| 2 | 2 | |
| 3 | 3 | attr_accessor :name, :granularity |
| 4 | 4 | |
| 5 | -end | |
| 6 | 5 | \ No newline at end of file |
| 6 | + def self.parent_names(name) | |
| 7 | + path = [] | |
| 8 | + ancestors = [] | |
| 9 | + name.split(".").each do |token| | |
| 10 | + path << token | |
| 11 | + ancestors << path.join(".") | |
| 12 | + end | |
| 13 | + ancestors | |
| 14 | + end | |
| 15 | + | |
| 16 | + def ancestor_names | |
| 17 | + Kalibro::Entities::Module.parent_names(@name) | |
| 18 | + end | |
| 19 | +end | ... | ... |
plugins/mezuro/lib/kalibro/entities/native_metric.rb
plugins/mezuro/lib/kalibro/entities/project_result.rb
| ... | ... | @@ -31,4 +31,29 @@ class Kalibro::Entities::ProjectResult < Kalibro::Entities::Entity |
| 31 | 31 | ('%2d' % amount).sub(/\s/, '0') |
| 32 | 32 | end |
| 33 | 33 | |
| 34 | -end | |
| 35 | 34 | \ No newline at end of file |
| 35 | + def node_of(module_name) | |
| 36 | + if module_name.nil? or module_name == project.name | |
| 37 | + node = source_tree | |
| 38 | + else | |
| 39 | + node = get_node(module_name) | |
| 40 | + end | |
| 41 | + end | |
| 42 | + | |
| 43 | + def get_node(module_name) | |
| 44 | + path = Kalibro::Entities::Module.parent_names(module_name) | |
| 45 | + parent = @source_tree | |
| 46 | + path.each do |node_name| | |
| 47 | + parent = get_leaf_from(parent, node_name) | |
| 48 | + end | |
| 49 | + return parent | |
| 50 | + end | |
| 51 | + | |
| 52 | + private | |
| 53 | + def get_leaf_from(node, module_name) | |
| 54 | + node.children.each do |child_node| | |
| 55 | + return child_node if child_node.module.name == module_name | |
| 56 | + end | |
| 57 | + nil | |
| 58 | + end | |
| 59 | + | |
| 60 | +end | ... | ... |
plugins/mezuro/lib/mezuro_plugin/project_content.rb
plugins/mezuro/public/javascripts/project_content.js
| 1 | -jQuery(showProjectContent); | |
| 1 | +jQuery(function (){ | |
| 2 | + jQuery('.source-tree-link').live("click", reloadModule); | |
| 3 | + showProjectContent(); | |
| 4 | +}); | |
| 2 | 5 | |
| 3 | 6 | function showProjectContent() { |
| 4 | 7 | callAction('project_state', {}, showProjectContentFor); |
| 5 | 8 | } |
| 6 | 9 | |
| 10 | +function reloadModule(){ | |
| 11 | + var module_name = jQuery(this).attr('data-module-name'); | |
| 12 | + callAction('project_tree', {module_name: module_name }, showProjectTree); | |
| 13 | + callAction('module_result', {module_name: module_name}, showModuleResult); | |
| 14 | + return false; | |
| 15 | +} | |
| 16 | + | |
| 7 | 17 | function showProjectContentFor(state){ |
| 8 | 18 | if (state == 'ERROR') |
| 9 | - callAction('project_error', {}, setProjectContent); | |
| 10 | - else if (state == 'READY') | |
| 11 | - callAction('project_result', {}, setProjectContent); | |
| 19 | + callAction('project_error', {}, showProjectResult); | |
| 20 | + else if (state == 'READY') { | |
| 21 | + callAction('project_result', {}, showProjectResult); | |
| 22 | + callAction('project_tree', {}, showProjectTree); | |
| 23 | + callAction('module_result', {}, showModuleResult); | |
| 24 | + } | |
| 12 | 25 | else if (state.endsWith("ING")) |
| 13 | 26 | showProjectContentAfter(20); |
| 14 | 27 | } |
| ... | ... | @@ -23,19 +36,15 @@ function showProjectContentAfter(seconds){ |
| 23 | 36 | } |
| 24 | 37 | } |
| 25 | 38 | |
| 26 | -function setProjectContent(content){ | |
| 27 | - jQuery('#project-content').html(content); | |
| 28 | - jQuery('.module-result-link').click(showModuleResult); | |
| 39 | +function showProjectResult(content) { | |
| 40 | + jQuery('#project-result').html(content); | |
| 29 | 41 | } |
| 30 | 42 | |
| 31 | -function showModuleResult(){ | |
| 32 | - var module_name = jQuery(this).attr('data-module-name'); | |
| 33 | - setModuleResult("Loading results for " + module_name + "..."); | |
| 34 | - callAction('module_result', {module_name: module_name}, setModuleResult); | |
| 35 | - return false; | |
| 43 | +function showProjectTree(content){ | |
| 44 | + jQuery('#project-tree').html(content); | |
| 36 | 45 | } |
| 37 | 46 | |
| 38 | -function setModuleResult(content){ | |
| 47 | +function showModuleResult(content){ | |
| 39 | 48 | jQuery('#module-result').html(content); |
| 40 | 49 | } |
| 41 | 50 | |
| ... | ... | @@ -47,11 +56,5 @@ function callAction(action, params, callback){ |
| 47 | 56 | } |
| 48 | 57 | |
| 49 | 58 | function projectContentData(data){ |
| 50 | - return jQuery('#project-content').attr('data-' + data); | |
| 59 | + return jQuery('#project-result').attr('data-' + data); | |
| 51 | 60 | } |
| 52 | - | |
| 53 | -function sourceNodeToggle(id){ | |
| 54 | - var suffixes = ['_hidden', '_plus', '_minus']; | |
| 55 | - for (var i in suffixes) | |
| 56 | - jQuery('#' + id + suffixes[i]).toggle(); | |
| 57 | -} | |
| 58 | 61 | \ No newline at end of file | ... | ... |
plugins/mezuro/test/fixtures/module_node_fixtures.rb
| ... | ... | @@ -3,7 +3,9 @@ class ModuleNodeFixtures |
| 3 | 3 | def self.qt_calculator_tree |
| 4 | 4 | node = Kalibro::Entities::ModuleNode.new |
| 5 | 5 | node.module = ModuleFixtures.qt_calculator |
| 6 | - node.children = [new_node('Dialog', 'CLASS'), new_node('main', 'CLASS')] | |
| 6 | + org_node = new_node('org', 'PACKAGE') | |
| 7 | + org_node.children = [new_node('org.Window', 'CLASS')] | |
| 8 | + node.children = [new_node('Dialog', 'CLASS'), new_node('main', 'CLASS'), org_node] | |
| 7 | 9 | node |
| 8 | 10 | end |
| 9 | 11 | |
| ... | ... | @@ -11,7 +13,9 @@ class ModuleNodeFixtures |
| 11 | 13 | {:module => ModuleFixtures.qt_calculator_hash, |
| 12 | 14 | :child => [ |
| 13 | 15 | {:module => {:name => 'Dialog', :granularity => 'CLASS'}}, |
| 14 | - {:module => {:name => 'main', :granularity => 'CLASS'}} | |
| 16 | + {:module => {:name => 'main', :granularity => 'CLASS'}}, | |
| 17 | + {:module => {:name => 'org', :granularity => 'PACKAGE'}, | |
| 18 | + :child => [{:module => {:name => 'org.Window', :granularity => 'CLASS'}}]} | |
| 15 | 19 | ] |
| 16 | 20 | } |
| 17 | 21 | end | ... | ... |
plugins/mezuro/test/functional/mezuro_plugin_profile_controller_test.rb
| ... | ... | @@ -54,10 +54,10 @@ class MezuroPluginProfileControllerTest < ActionController::TestCase |
| 54 | 54 | Kalibro::Client::ProjectResultClient.expects(:last_result).with(@name).returns(@project_result) |
| 55 | 55 | get :project_result, :profile => @profile.identifier, :id => @content.id |
| 56 | 56 | assert_response 200 |
| 57 | - assert_select('h3', 'LAST RESULT') | |
| 57 | + assert_select('h4', 'Last Result') | |
| 58 | 58 | end |
| 59 | 59 | |
| 60 | - should 'get metric results for a module' do | |
| 60 | + should 'get module result' do | |
| 61 | 61 | create_project_content |
| 62 | 62 | Kalibro::Client::ModuleResultClient.expects(:module_result).with(@content, @name).returns(@module_result) |
| 63 | 63 | get :module_result, :profile => @profile.identifier, :id => @content.id, :module_name => @name | ... | ... |
plugins/mezuro/test/unit/kalibro/entities/module_test.rb
| ... | ... | @@ -17,4 +17,14 @@ class ModuleTest < ActiveSupport::TestCase |
| 17 | 17 | assert_equal @hash, @module.to_hash |
| 18 | 18 | end |
| 19 | 19 | |
| 20 | -end | |
| 21 | 20 | \ No newline at end of file |
| 21 | + should 'list ancestor names' do | |
| 22 | + @module.name = "org.kalibro.core" | |
| 23 | + assert_equal ["org", "org.kalibro", "org.kalibro.core"], @module.ancestor_names | |
| 24 | + end | |
| 25 | + | |
| 26 | + should 'list ancestor with one name' do | |
| 27 | + @module.name = "org" | |
| 28 | + assert_equal ["org"], @module.ancestor_names | |
| 29 | + end | |
| 30 | + | |
| 31 | +end | ... | ... |
plugins/mezuro/test/unit/kalibro/entities/project_result_test.rb
| ... | ... | @@ -24,5 +24,26 @@ class ProjectResultTest < ActiveSupport::TestCase |
| 24 | 24 | should 'retrieve formatted analysis time' do |
| 25 | 25 | assert_equal '00:00:01', @result.formatted_analysis_time |
| 26 | 26 | end |
| 27 | + | |
| 28 | + should 'retrieve module node' do | |
| 29 | + node = @result.get_node("main") | |
| 30 | + assert_equal @hash[:source_tree][:child][1], node.to_hash | |
| 31 | + end | |
| 32 | + | |
| 33 | + should 'retrive complex module' do | |
| 34 | + node = @result.get_node("org.Window") | |
| 35 | + assert_equal @hash[:source_tree][:child][2][:child].first, node.to_hash | |
| 36 | + end | |
| 37 | + | |
| 38 | + should 'return source tree node when nil is given' do | |
| 39 | + assert_equal @hash[:source_tree], @result.node_of(nil).to_hash | |
| 40 | + end | |
| 27 | 41 | |
| 28 | -end | |
| 29 | 42 | \ No newline at end of file |
| 43 | + should 'return source tree node when project name is given' do | |
| 44 | + assert_equal @hash[:source_tree], @result.node_of(@result.project.name).to_hash | |
| 45 | + end | |
| 46 | + | |
| 47 | + should 'return correct node when module name is given' do | |
| 48 | + assert_equal @hash[:source_tree][:child][1], @result.node_of("main").to_hash | |
| 49 | + end | |
| 50 | +end | ... | ... |
plugins/mezuro/test/unit/mezuro_plugin/project_content_test.rb
| ... | ... | @@ -50,6 +50,20 @@ class ProjectContentTest < ActiveSupport::TestCase |
| 50 | 50 | assert_equal module_result, @content.module_result(module_name) |
| 51 | 51 | end |
| 52 | 52 | |
| 53 | + should 'get module result root when nil is given' do | |
| 54 | + module_result = mock | |
| 55 | + Kalibro::Client::ModuleResultClient.expects(:module_result).with(@content, @project.name). | |
| 56 | + returns(module_result) | |
| 57 | + assert_equal module_result, @content.module_result(nil) | |
| 58 | + end | |
| 59 | + | |
| 60 | + should 'get module result root when project name is give' do | |
| 61 | + module_result = mock | |
| 62 | + Kalibro::Client::ModuleResultClient.expects(:module_result).with(@content, @project.name). | |
| 63 | + returns(module_result) | |
| 64 | + assert_equal module_result, @content.module_result(@project.name) | |
| 65 | + end | |
| 66 | + | |
| 53 | 67 | should 'send project to service after saving' do |
| 54 | 68 | @content.expects :send_project_to_service |
| 55 | 69 | @content.run_callbacks :after_save | ... | ... |
plugins/mezuro/views/content_viewer/_project_result.rhtml
| 1 | -<h3><%= _('LAST RESULT') %></h3> | |
| 1 | +<h4><%= _('Last Result') %></h4> | |
| 2 | 2 | |
| 3 | 3 | <table> |
| 4 | 4 | <tr> |
| ... | ... | @@ -14,9 +14,3 @@ |
| 14 | 14 | <td><%= project_result.formatted_analysis_time %></td> |
| 15 | 15 | </tr> |
| 16 | 16 | </table> |
| 17 | - | |
| 18 | -<h4><%= _('Source tree') %></h4> | |
| 19 | -<%= render :partial => 'content_viewer/source_tree', :locals => { :source_tree => project_result.source_tree } %> | |
| 20 | - | |
| 21 | -<div id='module-result'> | |
| 22 | -</div> | ... | ... |
plugins/mezuro/views/content_viewer/_source_tree.rhtml
| 1 | +<h4><%= _('Source tree') %></h4> | |
| 1 | 2 | <% module_name = source_tree.module.name %> |
| 2 | 3 | <% module_label = "#{module_name} (#{source_tree.module.granularity})" %> |
| 4 | + | |
| 5 | +<% if module_name != project_name %> | |
| 6 | + <a href="#" class="source-tree-link" data-module-name="<%= project_name %>"> | |
| 7 | + <%= project_name %> | |
| 8 | + </a> | |
| 9 | +<% end %> | |
| 10 | + | |
| 11 | + <% split_link = source_tree.module.ancestor_names %> | |
| 12 | + <% split_link.each do |link| %> | |
| 13 | + <a href="#" class="source-tree-link" data-module-name="<%= link %>"> | |
| 14 | + <%= link.split(".").last %> | |
| 15 | + </a> | |
| 16 | +<% end %> | |
| 17 | + | |
| 3 | 18 | <% if source_tree.children %> |
| 4 | 19 | <table> |
| 5 | - <tr> | |
| 6 | - <td width="10%"> | |
| 7 | - <img alt="+" src="/plugins/mezuro/images/plus.png" class="link" | |
| 8 | - id="<%= module_name %>_plus" onclick="sourceNodeToggle('<%= module_name %>')"/> | |
| 9 | - <img alt="-" src="/plugins/mezuro/images/minus.png" class="link" style="display: none" | |
| 10 | - id="<%= module_name %>_minus" onclick="sourceNodeToggle('<%= module_name %>')"/> | |
| 11 | - </td> | |
| 12 | - <td> | |
| 13 | - <a href="#" class="module-result-link" data-module-name="<%= module_name %>"> | |
| 14 | - <%= module_label %> | |
| 15 | - </a> | |
| 16 | - </td> | |
| 17 | - </tr> | |
| 18 | - <tr id="<%= module_name %>_hidden" style="display: none"> | |
| 19 | - <td></td> | |
| 20 | - <td style="text-align: left"> | |
| 21 | - <% source_tree.children.each do |child| %> | |
| 22 | - <%= render :partial => 'content_viewer/source_tree', :locals => { :source_tree => child } %> | |
| 23 | - <% end %> | |
| 24 | - </td> | |
| 25 | - </tr> | |
| 26 | - </table> | |
| 27 | -<% else %> | |
| 28 | - <table> | |
| 29 | - <tr> | |
| 30 | - <td width="1"></td> | |
| 31 | - <td> | |
| 32 | - <a href="#" class="module-result-link" data-module-name="<%= module_name %>"> | |
| 33 | - <%= module_label %> | |
| 34 | - </a> | |
| 35 | - </td> | |
| 36 | - </tr> | |
| 20 | + <% source_tree.children.each do |child| %> | |
| 21 | + <tr> | |
| 22 | + <td> | |
| 23 | + <a href='#' class="source-tree-link" data-module-name="<%= child.module.name %>"> | |
| 24 | + <%= "#{child.module.name} (#{child.module.granularity})" %> | |
| 25 | + </td> | |
| 26 | + </tr> | |
| 27 | + <% end %> | |
| 37 | 28 | </table> |
| 38 | 29 | <% end %> | ... | ... |
plugins/mezuro/views/content_viewer/show_project.rhtml
| ... | ... | @@ -30,6 +30,8 @@ |
| 30 | 30 | |
| 31 | 31 | <br /> |
| 32 | 32 | |
| 33 | -<div id="project-content" data-profile="<%= @page.profile.identifier %>" data-content="<%= @page.id %>"> | |
| 33 | +<div id="project-result" data-profile="<%= @page.profile.identifier %>" data-content="<%= @page.id %>"> | |
| 34 | 34 | <h3><%= _('Processing ') + @project.name + '...' %></h3> |
| 35 | -</div> | |
| 36 | 35 | \ No newline at end of file |
| 36 | +</div> | |
| 37 | +<div id="project-tree"></div> | |
| 38 | +<div id="module-result"></div> | ... | ... |