Commit 71214863162d216f47f9107669bea942b2cc2475

Authored by dread-uo
2 parents 201d5837 fa3e59b8

Merge pull request #282 from mezuro/fixes_granularity_comparison

Fixes module tree ordering with FUNCTION granularity
app/helpers/kalibro_modules_helper.rb
1 module KalibroModulesHelper 1 module KalibroModulesHelper
  2 + # The comparison between FUNCTION and CLASS or METHOD does not make sense for kalibro.
  3 + # Still, we want to sort the kalibro modules to present it to the user.
  4 + # So, we define that FUNCTION are smaller than all the other granularities.
  5 + class ComparableGranularity < KalibroClient::Entities::Miscellaneous::Granularity
  6 + def <=>(other)
  7 + response = super(other)
  8 + if response.nil?
  9 + response = self.type == :FUNCTION ? -1 : 1
  10 + end
  11 + response
  12 + end
  13 + end
  14 +
2 def sort_by_granularity_and_name(module_results) 15 def sort_by_granularity_and_name(module_results)
3 module_results.sort! do |a,b| 16 module_results.sort! do |a,b|
4 if (a.kalibro_module.granularity == b.kalibro_module.granularity) 17 if (a.kalibro_module.granularity == b.kalibro_module.granularity)
5 a.kalibro_module.name <=> b.kalibro_module.name 18 a.kalibro_module.name <=> b.kalibro_module.name
6 else 19 else
7 - (KalibroClient::Entities::Miscellaneous::Granularity.new(b.kalibro_module.granularity.to_sym) <=> KalibroClient::Entities::Miscellaneous::Granularity.new(a.kalibro_module.granularity.to_sym)) 20 + (ComparableGranularity.new(b.kalibro_module.granularity.to_sym) <=> ComparableGranularity.new(a.kalibro_module.granularity.to_sym))
8 end 21 end
9 end 22 end
10 end 23 end
spec/factories/kalibro_modules.rb
@@ -11,7 +11,17 @@ FactoryGirl.define do @@ -11,7 +11,17 @@ FactoryGirl.define do
11 granlrty 'CLASS' 11 granlrty 'CLASS'
12 end 12 end
13 13
  14 + trait :function do
  15 + granlrty 'FUNCTION'
  16 + end
  17 +
  18 + trait :method do
  19 + granlrty 'METHOD'
  20 + end
  21 +
14 factory :kalibro_module_package, traits: [:package] 22 factory :kalibro_module_package, traits: [:package]
15 factory :kalibro_module_class, traits: [:class] 23 factory :kalibro_module_class, traits: [:class]
  24 + factory :kalibro_module_function, traits: [:function]
  25 + factory :kalibro_module_method, traits: [:method]
16 end 26 end
17 end 27 end
spec/helpers/kalibro_module_helper_spec.rb
@@ -3,12 +3,29 @@ require &#39;rails_helper&#39; @@ -3,12 +3,29 @@ require &#39;rails_helper&#39;
3 describe KalibroModulesHelper, :type => :helper do 3 describe KalibroModulesHelper, :type => :helper do
4 describe 'sort_by_granularity_and_name' do 4 describe 'sort_by_granularity_and_name' do
5 let(:package) { FactoryGirl.build(:module_result, kalibro_module: FactoryGirl.build(:kalibro_module_package)) } 5 let(:package) { FactoryGirl.build(:module_result, kalibro_module: FactoryGirl.build(:kalibro_module_package)) }
6 - let(:class_a) { FactoryGirl.build(:module_result, kalibro_module: FactoryGirl.build(:kalibro_module_class, name: 'a')) }  
7 let(:class_b) { FactoryGirl.build(:module_result, kalibro_module: FactoryGirl.build(:kalibro_module_class, name: 'b')) } 6 let(:class_b) { FactoryGirl.build(:module_result, kalibro_module: FactoryGirl.build(:kalibro_module_class, name: 'b')) }
  7 + let(:class_a) { FactoryGirl.build(:module_result, kalibro_module: FactoryGirl.build(:kalibro_module_class, name: 'a')) }
  8 + let(:function) { FactoryGirl.build(:module_result, kalibro_module: FactoryGirl.build(:kalibro_module_function, name: 'c')) }
  9 + let(:method) { FactoryGirl.build(:module_result, kalibro_module: FactoryGirl.build(:kalibro_module_method, name: 'm')) }
8 10
9 it 'is expected to order the ModuleResults by the Granularity first and then the KalibroModule name' do 11 it 'is expected to order the ModuleResults by the Granularity first and then the KalibroModule name' do
10 - unordered_modules = [class_b, package, class_a]  
11 - expect(helper.sort_by_granularity_and_name(unordered_modules)).to eq([package, class_a, class_b]) 12 + unordered_modules = [class_b, method, package, class_a, function]
  13 + expect(helper.sort_by_granularity_and_name(unordered_modules)).to eq([package, class_a, class_b, method, function])
  14 + end
  15 + end
  16 +
  17 + describe 'ComparableGranularity' do
  18 + describe 'methods' do
  19 + describe '<=>' do
  20 + subject { KalibroModulesHelper::ComparableGranularity.new(:FUNCTION) }
  21 + let(:klass) { KalibroModulesHelper::ComparableGranularity.new(:CLASS) }
  22 + let(:method) { KalibroModulesHelper::ComparableGranularity.new(:METHOD) }
  23 +
  24 + it 'is expected to place FUNCTION below all granularities' do
  25 + expect(subject <=> klass).to eq(-1)
  26 + expect(subject <=> method).to eq(-1)
  27 + end
  28 + end
12 end 29 end
13 end 30 end
14 end 31 end
15 \ No newline at end of file 32 \ No newline at end of file