Commit 6c8532e8abd691b55be7675d19e7d3ed17d4fa18

Authored by Vasiliy Ermolovich
2 parents c00f1ebe 4bcc2aee
Exists in master and in 1 other branch production

Merge pull request #300 from lest/patch-1

refactor apps sorting
app/controllers/apps_controller.rb
@@ -52,23 +52,7 @@ class AppsController < InheritedResources::Base @@ -52,23 +52,7 @@ class AppsController < InheritedResources::Base
52 52
53 protected 53 protected
54 def collection 54 def collection
55 - @unresolved_counts, @problem_counts = {}, {}  
56 - @apps ||= begin  
57 - apps = end_of_association_chain.all  
58 -  
59 - # Cache counts for unresolved errs and problems  
60 - apps.each do |app|  
61 - @unresolved_counts[app.id] ||= app.problems.unresolved.count  
62 - @problem_counts[app.id] ||= app.problems.count  
63 - end  
64 -  
65 - # Sort apps by number of unresolved errs, then problem counts.  
66 - apps.sort do |a,b|  
67 - (@unresolved_counts[b.id] <=> @unresolved_counts[a.id]).nonzero? ||  
68 - (@problem_counts[b.id] <=> @problem_counts[a.id]).nonzero? ||  
69 - a.name <=> b.name  
70 - end  
71 - end 55 + @apps ||= end_of_association_chain.all.sort
72 end 56 end
73 57
74 def initialize_subclassed_issue_tracker 58 def initialize_subclassed_issue_tracker
app/models/app.rb
1 class App 1 class App
2 include Mongoid::Document 2 include Mongoid::Document
3 include Mongoid::Timestamps 3 include Mongoid::Timestamps
  4 + include Comparable
4 5
5 field :name, :type => String 6 field :name, :type => String
6 field :api_key 7 field :api_key
@@ -169,6 +170,21 @@ class App @@ -169,6 +170,21 @@ class App
169 end 170 end
170 end 171 end
171 172
  173 + def unresolved_count
  174 + @unresolved_count ||= problems.unresolved.count
  175 + end
  176 +
  177 + def problem_count
  178 + @problem_count ||= problems.count
  179 + end
  180 +
  181 + # Compare by number of unresolved errs, then problem counts.
  182 + def <=>(other)
  183 + (other.unresolved_count <=> unresolved_count).nonzero? ||
  184 + (other.problem_count <=> problem_count).nonzero? ||
  185 + name <=> other.name
  186 + end
  187 +
172 protected 188 protected
173 189
174 def store_cached_attributes_on_problems 190 def store_cached_attributes_on_problems
app/views/apps/index.html.haml
@@ -47,8 +47,8 @@ @@ -47,8 +47,8 @@
47 - revision = app.deploys.last.short_revision 47 - revision = app.deploys.last.short_revision
48 = link_to( app.last_deploy_at.to_s(:micro) << (revision.present? ? " (#{revision})" : ""), app_deploys_path(app)) 48 = link_to( app.last_deploy_at.to_s(:micro) << (revision.present? ? " (#{revision})" : ""), app_deploys_path(app))
49 %td.count 49 %td.count
50 - - if @problem_counts[app.id] > 0  
51 - - unresolved = @unresolved_counts[app.id] 50 + - if app.problem_count > 0
  51 + - unresolved = app.unresolved_count
52 = link_to unresolved, app_path(app), :class => (unresolved == 0 ? "resolved" : nil) 52 = link_to unresolved, app_path(app), :class => (unresolved == 0 ? "resolved" : nil)
53 - if @apps.none? 53 - if @apps.none?
54 %tr 54 %tr
spec/controllers/apps_controller_spec.rb
@@ -31,17 +31,6 @@ describe AppsController do @@ -31,17 +31,6 @@ describe AppsController do
31 assigns(:apps).should_not include(unwatched_app) 31 assigns(:apps).should_not include(unwatched_app)
32 end 32 end
33 end 33 end
34 -  
35 - context 'when there is only one app' do  
36 - it 'sets unresolved_counts and problem_counts variables' do  
37 - sign_in Fabricate(:admin)  
38 - app = Fabricate(:app)  
39 - get :index  
40 -  
41 - assigns(:unresolved_counts).should == {app.id => 0}  
42 - assigns(:problem_counts).should == {app.id => 0}  
43 - end  
44 - end  
45 end 34 end
46 35
47 describe "GET /apps/:id" do 36 describe "GET /apps/:id" do
spec/models/app_spec.rb
@@ -23,6 +23,31 @@ describe App do @@ -23,6 +23,31 @@ describe App do
23 end 23 end
24 end 24 end
25 25
  26 + describe '<=>' do
  27 + it 'is compared by unresolved count' do
  28 + app_0 = stub_model(App, :name => 'app', :unresolved_count => 1, :problem_count => 1)
  29 + app_1 = stub_model(App, :name => 'app', :unresolved_count => 0, :problem_count => 1)
  30 +
  31 + app_0.should < app_1
  32 + app_1.should > app_0
  33 + end
  34 +
  35 + it 'is compared by problem count' do
  36 + app_0 = stub_model(App, :name => 'app', :unresolved_count => 0, :problem_count => 1)
  37 + app_1 = stub_model(App, :name => 'app', :unresolved_count => 0, :problem_count => 0)
  38 +
  39 + app_0.should < app_1
  40 + app_1.should > app_0
  41 + end
  42 +
  43 + it 'is compared by name' do
  44 + app_0 = stub_model(App, :name => 'app_0', :unresolved_count => 0, :problem_count => 0)
  45 + app_1 = stub_model(App, :name => 'app_1', :unresolved_count => 0, :problem_count => 0)
  46 +
  47 + app_0.should < app_1
  48 + app_1.should > app_0
  49 + end
  50 + end
26 51
27 context 'being created' do 52 context 'being created' do
28 it 'generates a new api-key' do 53 it 'generates a new api-key' do
spec/views/apps/index.html.haml_spec.rb
@@ -4,8 +4,6 @@ describe &quot;apps/index.html.haml&quot; do @@ -4,8 +4,6 @@ describe &quot;apps/index.html.haml&quot; do
4 before do 4 before do
5 app = stub_model(App, :deploys => [stub_model(Deploy, :created_at => Time.now, :revision => "123456789abcdef")]) 5 app = stub_model(App, :deploys => [stub_model(Deploy, :created_at => Time.now, :revision => "123456789abcdef")])
6 assign :apps, [app] 6 assign :apps, [app]
7 - assign :problem_counts, {app.id => 0}  
8 - assign :unresolved_counts, {app.id => 0}  
9 controller.stub(:current_user) { stub_model(User) } 7 controller.stub(:current_user) { stub_model(User) }
10 end 8 end
11 9