OSDN Git Service

create atom feed for issues
authorNihad Abbasov <narkoz.2008@gmail.com>
Fri, 11 Nov 2011 09:29:58 +0000 (13:29 +0400)
committerNihad Abbasov <narkoz.2008@gmail.com>
Fri, 11 Nov 2011 09:29:58 +0000 (13:29 +0400)
app/controllers/issues_controller.rb
app/views/issues/index.atom.builder [new file with mode: 0644]
app/views/layouts/project.html.haml
spec/requests/issues_spec.rb

index 508cfc3..2ba54f3 100644 (file)
@@ -22,6 +22,7 @@ class IssuesController < ApplicationController
     respond_to do |format|
       format.html # index.html.erb
       format.js
+      format.atom { render :layout => false }
     end
   end
 
@@ -38,7 +39,7 @@ class IssuesController < ApplicationController
     @notes = @issue.notes.order("created_at DESC").limit(20)
     @note = @project.notes.new(:noteable => @issue)
 
-    respond_to do |format| 
+    respond_to do |format|
       format.html
       format.js { respond_with_notes }
     end
diff --git a/app/views/issues/index.atom.builder b/app/views/issues/index.atom.builder
new file mode 100644 (file)
index 0000000..00ddd4b
--- /dev/null
@@ -0,0 +1,23 @@
+xml.instruct!
+xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do
+  xml.title   "#{@project.name} issues"
+  xml.link    :href => project_issues_url(@project, :atom), :rel => "self", :type => "application/atom+xml"
+  xml.link    :href => project_issues_url(@project), :rel => "alternate", :type => "text/html"
+  xml.id      project_issues_url(@project)
+  xml.updated @issues.first.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") if @issues.any?
+
+  @issues.each do |issue|
+    xml.entry do
+      xml.id      project_issue_url(@project, issue)
+      xml.link    :href => project_issue_url(@project, issue)
+      xml.title   truncate(issue.title, :length => 80)
+      xml.updated issue.created_at.strftime("%Y-%m-%dT%H:%M:%SZ")
+      xml.media   :thumbnail, :width => "40", :height => "40", :url => gravatar_icon(issue.author_email)
+      xml.author do |author|
+        xml.name issue.author_name
+        xml.email issue.author_email
+      end
+      xml.summary issue.title
+    end
+  end
+end
index 927d62d..4fb3354 100644 (file)
@@ -7,6 +7,8 @@
     = javascript_include_tag "application"
     - if current_page?(tree_project_path(@project)) || current_page?(project_commits_path(@project))
       = auto_discovery_link_tag(:atom, project_commits_url(@project, :atom, :ref => @ref), :title => "Recent commits to #{@project.name}:#{@ref}")
+    - if request.path == project_issues_path(@project)
+      = auto_discovery_link_tag(:atom, project_issues_url(@project, :atom), :title => "#{@project.name} issues")
     = csrf_meta_tags
     = javascript_tag do
       REQ_URI = "#{request.env["REQUEST_URI"]}";
index 235b0b2..c77316d 100644 (file)
@@ -27,6 +27,15 @@ describe "Issues" do
     it { should have_content(@issue.project.name) }
     it { should have_content(@issue.assignee.name) }
 
+    it "should render atom feed" do
+      visit project_issues_path(project, :atom)
+
+      page.response_headers['Content-Type'].should have_content("application/atom+xml")
+      page.body.should have_selector("title", :text => "#{project.name} issues")
+      page.body.should have_selector("author email", :text => @issue.author_email)
+      page.body.should have_selector("entry summary", :text => @issue.title)
+    end
+
     describe "Destroy" do
       before do
         # admin access to remove issue
@@ -81,13 +90,13 @@ describe "Issues" do
     end
 
     describe "fill in" do
-      describe 'assign to me' do 
+      describe 'assign to me' do
         before do
           fill_in "issue_title", :with => "bug 345"
           click_link "Select user"
           within "#issue_assignee_id-menu" do
             click_link @user.name
-          end 
+          end
         end
 
         it { expect { click_button "Save" }.to change {Issue.count}.by(1) }
@@ -107,13 +116,13 @@ describe "Issues" do
         end
       end
 
-      describe 'assign to other' do 
+      describe 'assign to other' do
         before do
           fill_in "issue_title", :with => "bug 345"
           click_link "Select user"
           within "#issue_assignee_id-menu" do
             click_link @user2.name
-          end 
+          end
         end
 
         it { expect { click_button "Save" }.to change {Issue.count}.by(1) }
@@ -145,7 +154,7 @@ describe "Issues" do
     end
   end
 
-  describe "Show issue" do 
+  describe "Show issue" do
     before do
       @issue = Factory :issue,
         :author => @user,
@@ -205,7 +214,7 @@ describe "Issues" do
         @issue.save
       end
     end
-      
+
     it "should be able to search on different statuses" do
       @issue = Issue.first
       @issue.closed = true
@@ -214,13 +223,13 @@ describe "Issues" do
       visit project_issues_path(project)
       choose 'closed_issues'
       fill_in 'issue_search', :with => 'foobar'
-      
+
       page.should have_content 'foobar'
       page.should_not have_content 'foobar2'
       page.should_not have_content 'gitlab'
     end
 
-    it "should search for term and return the correct results" do  
+    it "should search for term and return the correct results" do
       visit project_issues_path(project)
       fill_in 'issue_search', :with => 'foobar'