OSDN Git Service

Added 'x notes' and +1 counters to issues and merge requests. Refs #549
authorAriejan de Vroom <ariejan@ariejan.net>
Wed, 14 Mar 2012 22:51:03 +0000 (00:51 +0200)
committerAriejan de Vroom <ariejan@ariejan.net>
Wed, 14 Mar 2012 22:51:03 +0000 (00:51 +0200)
app/models/merge_request.rb
app/views/issues/_show.html.haml
app/views/issues/show.html.haml
app/views/merge_requests/_merge_request.html.haml
app/views/merge_requests/show.html.haml
spec/models/merge_request_spec.rb

index cd44a25..9bbbcd4 100644 (file)
@@ -34,7 +34,7 @@ class MergeRequest < ActiveRecord::Base
 
 
   def validate_branches
-    if target_branch == source_branch 
+    if target_branch == source_branch
       errors.add :base, "You can not use same branch for source and target branches"
     end
   end
@@ -51,6 +51,11 @@ class MergeRequest < ActiveRecord::Base
   def last_commit
     project.commit(source_branch)
   end
+
+  # Return the number of +1 comments (upvotes)
+  def upvotes
+    notes.select(&:upvote?).size
+  end
 end
 # == Schema Information
 #
index 505fa81..7b25579 100644 (file)
@@ -14,6 +14,8 @@
       %span.label.important critical
     - if issue.today?
       %span.label.success today
+    - if issue.notes.any?
+      %span.label= pluralize issue.notes.count, 'note'
     - if issue.upvotes > 0
       %span.label.success= "+#{issue.upvotes}"
 
index fc0d349..4769c07 100644 (file)
       - else
         = link_to 'Close', project_issue_path(@project, @issue, :issue => {:closed => true }, :status_only => true), :method => :put, :class => "btn", :title => "Close Issue"
     - if can?(current_user, :admin_project, @project) || @issue.author == current_user
-      = link_to edit_project_issue_path(@project, @issue), :class => "btn small" do 
+      = link_to edit_project_issue_path(@project, @issue), :class => "btn" do 
         Edit
 
+    - if @issue.upvotes > 0
+      %button.btn.success= "+#{@issue.upvotes}"
+      
+
 .back_link
   = link_to project_issues_path(@project) do 
     &larr; To issues list
@@ -36,9 +40,6 @@
     = image_tag gravatar_icon(@issue.assignee_email), :width => 16, :class => "lil_av"
     %strong.author= link_to_issue_assignee(@issue)
 
-    - if @issue.upvotes > 0
-      %span.label.success= "+#{@issue.upvotes}"
-      
     %hr
     
   %div= simple_format @issue.title
index 1b8166c..4b3470f 100644 (file)
@@ -5,6 +5,10 @@
     authored
     = time_ago_in_words(merge_request.created_at)
     ago
+    - if merge_request.notes.any?
+      %span.label= pluralize merge_request.notes.count, 'note'
+    - if merge_request.upvotes > 0
+      %span.label.success= "+#{merge_request.upvotes}"
   .right
     %span.label= merge_request.source_branch
     &rarr;
index e725c19..9c60196 100644 (file)
@@ -18,6 +18,9 @@
       = link_to edit_project_merge_request_path(@project, @merge_request), :class => "btn small" do 
         Edit
 
+    - if @merge_request.upvotes > 0
+      %button.btn.success= "+#{@merge_request.upvotes}"
+
 .back_link
   = link_to project_merge_requests_path(@project) do 
     &larr; To merge requests
index f6b4cbc..63996e2 100644 (file)
@@ -25,6 +25,38 @@ describe MergeRequest do
                       :author => Factory(:user),
                       :assignee => Factory(:user),
                       :project => Factory.create(:project)).should be_valid }
+
+  describe "plus 1" do
+    let(:project) { Factory(:project) }
+    subject {
+      Factory.create(:merge_request,
+                     :author => Factory(:user),
+                     :assignee => Factory(:user),
+                     :project => project)
+    }
+
+    it "with no notes has a 0/0 score" do
+      subject.upvotes.should == 0
+    end
+
+    it "should recognize non-+1 notes" do
+      subject.notes << Factory(:note, note: "No +1 here", project: Factory(:project, path: 'plusone', code: 'plusone'))
+      subject.should have(1).note
+      subject.notes.first.upvote?.should be_false
+      subject.upvotes.should == 0
+    end
+
+    it "should recognize a single +1 note" do
+      subject.notes << Factory(:note, note: "+1 This is awesome", project: Factory(:project, path: 'plusone', code: 'plusone'))
+      subject.upvotes.should == 1
+    end
+
+    it "should recognize a multiple +1 notes" do
+      subject.notes << Factory(:note, note: "+1 This is awesome", project: Factory(:project, path: 'plusone', code: 'plusone'))
+      subject.notes << Factory(:note, note: "+1 I want this", project: Factory(:project, path: 'plustwo', code: 'plustwo'))
+      subject.upvotes.should == 2
+    end
+  end
 end
 # == Schema Information
 #