Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add per gem rss feed #479

Merged
merged 1 commit into from
Nov 28, 2012
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions app/helpers/rubygems_helper.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ def unsubscribe_link(rubygem)
end end
end end


def atom_link(rubygem)
link_to 'RSS', rubygem_versions_path(rubygem, format: 'atom'), :id => :rss
end

def download_link(version) def download_link(version)
link_to "Download", "/downloads/#{version.full_name}.gem", :id => :download link_to "Download", "/downloads/#{version.full_name}.gem", :id => :download
end end
Expand Down
1 change: 1 addition & 0 deletions app/views/layouts/application.html.erb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
<![endif]--> <![endif]-->
<%= render "layouts/feeds" %> <%= render "layouts/feeds" %>
<%= csrf_meta_tag %> <%= csrf_meta_tag %>
<%= yield :head %>
<title><%= page_title %></title> <title><%= page_title %></title>
</head> </head>
<body> <body>
Expand Down
3 changes: 3 additions & 0 deletions app/views/rubygems/show.html.erb
Original file line number Original file line Diff line number Diff line change
@@ -1,6 +1,8 @@
<% @title = @rubygem.name %> <% @title = @rubygem.name %>
<% @subtitle = @latest_version.try(:slug) %> <% @subtitle = @latest_version.try(:slug) %>


<%= content_for :head, auto_discovery_link_tag(:atom, rubygem_versions_path(@rubygem, format: "atom"), {title: "#{@rubygem.name} Version Feed"}) %>

<% if @rubygem.versions.count.zero? %> <% if @rubygem.versions.count.zero? %>
<p><%= t '.not_hosted_notice' %></p> <p><%= t '.not_hosted_notice' %></p>
<% else %> <% else %>
Expand All @@ -27,6 +29,7 @@
<%= documentation_link(@latest_version, @rubygem.linkset) %> <%= documentation_link(@latest_version, @rubygem.linkset) %>
<%= subscribe_link(@rubygem) if @latest_version.indexed %> <%= subscribe_link(@rubygem) if @latest_version.indexed %>
<%= unsubscribe_link(@rubygem) %> <%= unsubscribe_link(@rubygem) %>
<%= atom_link(@rubygem) %>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if you also put it into the header the browser can show it in the url-bar rss dropdown

</div> </div>


<% if @latest_version.indexed %> <% if @latest_version.indexed %>
Expand Down
27 changes: 27 additions & 0 deletions app/views/versions/_versions_feed.atom.builder
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,27 @@
builder.instruct!

builder.feed "xmlns" => "http://www.w3.org/2005/Atom" do

builder.title title
builder.link "rel" => "self", "href" => rubygems_url(:format => :atom)
builder.link "rel" => "alternate", "href" => rubygems_url
builder.id rubygems_url

builder.updated(versions.first.updated_at.iso8601) if versions.any?

builder.author { xml.name "Rubygems" }

versions.each do |version|
builder.entry do
builder.title version.to_title
builder.link "rel" => "alternate", "href" => rubygem_version_url(version.rubygem, version.slug)
builder.id rubygem_version_url(version.rubygem, version.slug)
builder.updated version.created_at.iso8601
builder.author {|author| author.name h(version.authors) }
builder.summary version.summary if version.summary?
builder.content "type" => "html" do
builder.text! h(version.description)
end
end
end
end
34 changes: 7 additions & 27 deletions app/views/versions/feed.atom.builder
Original file line number Original file line Diff line number Diff line change
@@ -1,27 +1,7 @@
xml.instruct! render(

partial: 'versions/versions_feed',
xml.feed "xmlns" => "http://www.w3.org/2005/Atom" do locals: {

builder: xml,
xml.title "Gemcutter | Latest Gems" versions: @versions,
xml.link "rel" => "self", "href" => rubygems_url(:format => :atom) title: "Rubygems | Latest Gems"
xml.link "rel" => "alternate", "href" => rubygems_url })
xml.id rubygems_url

xml.updated(@versions.first.updated_at.strftime("%Y-%m-%dT%H:%M:%SZ")) if @versions.any?

xml.author { xml.name "Gemcutter" }

@versions.each do |version|
xml.entry do
xml.title version.to_title
xml.link "rel" => "alternate", "href" => rubygem_version_url(version.rubygem, version.slug)
xml.id rubygem_version_url(version.rubygem, version.slug)
xml.updated version.created_at.strftime("%Y-%m-%dT%H:%M:%SZ")
xml.author {|author| author.name h(version.authors) }
xml.summary version.summary if version.summary?
xml.content "type" => "html" do
xml.text! h(version.description)
end
end
end
end
7 changes: 7 additions & 0 deletions app/views/versions/index.atom.builder
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,7 @@
render(
partial: 'versions/versions_feed',
locals: {
builder: xml,
versions: @versions,
title: "Rubygems | Latest Versions for #{@rubygem.name}"
})
4 changes: 4 additions & 0 deletions public/stylesheets/screen.css
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -497,6 +497,10 @@ table {
background: url('/images/download.png') no-repeat; background: url('/images/download.png') no-repeat;
} }


.main .info .meta .admin #rss {
background: url('/images/feed.png') no-repeat;
}

.main .info .meta .admin #docs { .main .info .meta .admin #docs {
background: url('/images/docs.png') no-repeat; background: url('/images/docs.png') no-repeat;
} }
Expand Down
28 changes: 28 additions & 0 deletions test/functional/versions_controller_test.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -23,6 +23,34 @@ class VersionsControllerTest < ActionController::TestCase
end end
end end


context 'GET to index as an atom feed' do
setup do
@rubygem = create(:rubygem)
@versions = (1..5).map do |version|
create(:version, :rubygem => @rubygem)
end

get :index, :rubygem_id => @rubygem.name, :format => "atom"
end

should respond_with :success
should assign_to(:versions) { @versions }

should "render correct gem information in the feed" do
assert_select "feed > title", :count => 1, :text => /#{@rubygem.name}/
assert_select "feed > updated", :count => 1, :text => @rubygem.updated_at.iso8601
end

should "render information about versions" do
@versions.each do |v|
assert_select "entry > title", :count => 1, :text => v.to_title
assert_select "entry > link[href='#{rubygem_version_url(v.rubygem, v.slug)}']", :count => 1
assert_select "entry > id", :count => 1, :text => rubygem_version_url(v.rubygem, v.slug)
assert_select "entry > updated", :count => @versions.count, :text => v.updated_at.iso8601
end
end
end

context "GET to index for gem with no versions" do context "GET to index for gem with no versions" do
setup do setup do
@rubygem = create(:rubygem) @rubygem = create(:rubygem)
Expand Down