From f295ff84d9597b60c985657aa03fc1ef1e087aa8 Mon Sep 17 00:00:00 2001 From: Nihad Abbasov Date: Fri, 11 Nov 2011 13:29:58 +0400 Subject: [PATCH] create atom feed for issues --- app/controllers/issues_controller.rb | 3 ++- app/views/issues/index.atom.builder | 23 +++++++++++++++++++++++ app/views/layouts/project.html.haml | 2 ++ spec/requests/issues_spec.rb | 25 +++++++++++++++++-------- 4 files changed, 44 insertions(+), 9 deletions(-) create mode 100644 app/views/issues/index.atom.builder diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 508cfc39..2ba54f30 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -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 index 00000000..00ddd4bf --- /dev/null +++ b/app/views/issues/index.atom.builder @@ -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 diff --git a/app/views/layouts/project.html.haml b/app/views/layouts/project.html.haml index 927d62db..4fb3354b 100644 --- a/app/views/layouts/project.html.haml +++ b/app/views/layouts/project.html.haml @@ -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"]}"; diff --git a/spec/requests/issues_spec.rb b/spec/requests/issues_spec.rb index 235b0b22..c77316d6 100644 --- a/spec/requests/issues_spec.rb +++ b/spec/requests/issues_spec.rb @@ -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'