<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -13,7 +13,13 @@ class PackagesController &lt; ApplicationController
       params[:search] = @search_term
     end
 
-    @packages = Package.paginating_search(@search_term, page_no)
+    options = {}
+    if params[:popcon]
+      options = {:order =&gt; &quot;score DESC, package_users_count DESC&quot;}
+    end
+
+    @packages = Package.paginating_search(@search_term, page_no, options)
+
     @title = &quot;#{Package.count} R packages&quot;
 
     respond_to do |format|
@@ -81,6 +87,7 @@ class PackagesController &lt; ApplicationController
   def toggle_usage
     @package = Package.find_by_param(params[:id])
     usage = self.current_user.toggle_usage(@package)
+    @package.update_score!
     flash[:notice] = (usage ? &quot;Thanks!&quot; : &quot;You no longer use this package&quot;)
     redirect_to(@package)
   end</diff>
      <filename>app/controllers/packages_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -28,6 +28,7 @@ class Package &lt; ActiveRecord::Base
   has_many :versions, :order =&gt; &quot;id DESC&quot;, :dependent =&gt; :destroy
   has_many :package_ratings, :dependent =&gt; :destroy
   has_many :package_users, :dependent =&gt; :destroy
+  alias :users :package_users
   has_many :reviews, :dependent =&gt; :destroy
   has_many :taggings, :dependent =&gt; :destroy
   has_many :tags, :through =&gt; :taggings, :uniq =&gt; true do
@@ -54,6 +55,10 @@ class Package &lt; ActiveRecord::Base
                        :conditions =&gt; &quot;#{self.table_name}.created_at IS NOT NULL&quot;,
                        :limit =&gt; 50
 
+  named_scope :most_popular, :order =&gt; &quot;score DESC, package_users_count DESC&quot;,
+                             :include =&gt; :latest_version,
+                             :limit =&gt; 5
+
   validates_presence_of :name
   validates_uniqueness_of :name
   validates_length_of :name, :in =&gt; 2..255
@@ -191,4 +196,8 @@ class Package &lt; ActiveRecord::Base
     score
   end
 
+  def update_score!
+    self.update_attribute(:score, self.calculate_score)
+  end
+
 end</diff>
      <filename>app/models/package.rb</filename>
    </modified>
    <modified>
      <diff>@@ -28,6 +28,9 @@ class PackageRating &lt; ActiveRecord::Base
   validates_format_of :rating, :with =&gt; /^[1-5]$/
   validates_inclusion_of :aspect, :in =&gt; %w(overall documentation)
 
+  after_create lambda { |obj| obj.package.update_score! }
+  after_update lambda { |obj| obj.package.update_score! }
+
   # Calculates the average rating for a given package
   def self.calculate_average(package_id, aspect=&quot;overall&quot;)
     average('rating', :conditions =&gt; [&quot;aspect = ? AND package_id = ?&quot;,</diff>
      <filename>app/models/package_rating.rb</filename>
    </modified>
    <modified>
      <diff>@@ -14,7 +14,7 @@
 # Parts of this code has been derived from the vote_fu plugin
 class PackageUser &lt; ActiveRecord::Base
 
-  belongs_to :package, :counter_cache =&gt; true
+  belongs_to :package
   belongs_to :user
 
   named_scope :active,       :conditions =&gt; { :active =&gt; true }
@@ -34,4 +34,7 @@ class PackageUser &lt; ActiveRecord::Base
   validates_existence_of :package_id
   validates_existence_of :user_id
 
+  # Can't use counter cache because it makes the attribute read-only
+  after_create lambda { |obj| obj.package.increment(:package_users_count) }
+
 end</diff>
      <filename>app/models/package_user.rb</filename>
    </modified>
    <modified>
      <diff>@@ -136,7 +136,12 @@ class User &lt; ActiveRecord::Base
     usage = PackageUser.find(:first, :conditions =&gt; {
                                :user_id =&gt; self, :package_id =&gt; pkg
                              })
-    return usage.toggle!(:active) &amp;&amp; usage.active if usage
+    if usage
+      res = usage.toggle!(:active) &amp;&amp; usage.active
+      res ? pkg.increment(:package_users_count) : pkg.decrement(:package_users_count)
+      pkg.save
+      return res
+    end
     self.package_users &lt;&lt; PackageUser.new(:package =&gt; pkg)
     true
   end</diff>
      <filename>app/models/user.rb</filename>
    </modified>
    <modified>
      <diff>@@ -3,6 +3,15 @@
   to &lt;span class=&quot;red&quot;&gt;crantastic&lt;/span&gt;, a community site for R packages where you
   can search for, review and tag CRAN packages.
 
+%div(style=&quot;margin: 15px 0 15px 0&quot;)
+  %h1(style=&quot;font-size: 220%&quot;) Most popular packages
+  %ul.tags.cloud
+    - Package.most_popular.each_with_index do |pkg, i|
+      %li
+        = &quot;#{i+1}. #{link_to pkg, pkg}&quot;
+    %li
+      \...#{link_to &quot;more!&quot;, popcon_url, :style =&gt; &quot;background: transparent&quot;}
+
 %h1(style=&quot;font-size: 220%&quot;) Recent activity
 
 #timeline= render :partial =&gt; &quot;paginated_events&quot;, :locals =&gt; { :events =&gt; @timeline_events }</diff>
      <filename>app/views/timeline_events/index.html.haml</filename>
    </modified>
    <modified>
      <diff>@@ -52,6 +52,7 @@ ActionController::Routing::Routes.draw do |map|
   map.activate '/activate/:activation_code', :controller =&gt; 'users', :action =&gt; 'activate'
   map.login    '/login', :controller =&gt; 'sessions', :action =&gt; 'new'
   map.logout   '/logout', :controller =&gt; 'sessions', :action =&gt; 'destroy'
+  map.popcon   '/popcon', :controller =&gt; 'packages', :action =&gt; 'index', :popcon =&gt; '1'
 
   map.connect ':controller/:action/:id.:format'
 </diff>
      <filename>config/routes.rb</filename>
    </modified>
    <modified>
      <diff>@@ -38,6 +38,7 @@ describe PackagesController do
     login_as_user(:id =&gt; 1, :login =&gt; &quot;test&quot;)
 
     pkg_mock = mock_model(Package)
+    pkg_mock.should_receive(:update_score!)
     controller.instance_eval do
       current_user.should_receive(:toggle_usage).with(pkg_mock).and_return(true)
     end</diff>
      <filename>spec/controllers/packages_controller_spec.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>ded0dabc22bfcfaedb31d2df20b9c1d9dd0182e6</id>
    </parent>
  </parents>
  <author>
    <name>Bj&#248;rn Arild M&#230;land</name>
    <email>bjorn.maeland@gmail.com</email>
  </author>
  <url>http://github.com/hadley/crantastic/commit/962e6b76678a04309acbc1ba0b2d277679dd00c0</url>
  <id>962e6b76678a04309acbc1ba0b2d277679dd00c0</id>
  <committed-date>2009-10-10T14:56:56-07:00</committed-date>
  <authored-date>2009-10-10T14:56:56-07:00</authored-date>
  <message>Now updating packages scores when ratings/usages are updated. Also displaying most popular packages on the front page.</message>
  <tree>24f9ab150298a8902ebc3a2e3a5ad5db6da7842f</tree>
  <committer>
    <name>Bj&#248;rn Arild M&#230;land</name>
    <email>bjorn.maeland@gmail.com</email>
  </committer>
</commit>
