Add the ability to extend sitemaps

Clarke Brunsdon committed Jan 23, 2012
commit 75cd666903f1933332c84bf23cf8ac7567756c1e
Showing 5 changed files with 66 additions and 1 deletions
app/views/cms_content/render_sitemap.xml.builder +1 -0
@@ @@ -11,4 +11,5 @@ xml.urlset :xmlns => 'http://www.sitemaps.org/schemas/sitemap/0.9' do
xml.lastmod page.updated_at.strftime('%Y-%m-%d')
end
end
+ ComfortableMexicanSofa::Sitemap.process(@cms_site, self, xml)
end
comfortable_mexican_sofa.rb b/lib/comfortable_mexican_sofa.rb +2 -1
@@ @@ -13,6 +13,7 @@ end
'comfortable_mexican_sofa/view_methods',
'comfortable_mexican_sofa/form_builder',
'comfortable_mexican_sofa/tag',
+ 'comfortable_mexican_sofa/sitemap',
'comfortable_mexican_sofa/fixtures',
'comfortable_mexican_sofa/extensions/rails',
'comfortable_mexican_sofa/extensions/acts_as_tree',
@@ @@ -58,4 +59,4 @@ module ComfortableMexicanSofa
end
end
- end
\ No newline at end of file
+ end
comfortable_mexican_sofa/sitemap.rb b/lib/comfortable_mexican_sofa/sitemap.rb +26 -0
@@ @@ -0,0 +1,26 @@
+ module ComfortableMexicanSofa
+ class Sitemap
+ # we want our callback to include the cms_site and
+ # the view so we have whatever routes are available to us
+ # xml is an xml_builder which expects a sitemap url definition, e.g:
+ # xml.url do
+ # xml.loc view.url_for("http://example.org/example")
+ # xml.lastmod 2.days.ago.strftime('%Y-%m-%d')
+ # end
+ def self.process(cms_site, view, xml)
+ self.sitemap_extensions.each do |extension|
+ extension.call(cms_site, view, xml)
+ end
+ end
+
+ def self.register_extension(callback)
+ self.sitemap_extensions.push(callback)
+ end
+
+ private
+ # A list of registered sitemap extension methods
+ def self.sitemap_extensions
+ @@sitemap_extensions ||= []
+ end
+ end
+ end
test/functional/cms_content_controller_test.rb +17 -0
@@ @@ -182,4 +182,21 @@ class CmsContentControllerTest < ActionController::TestCase
assert_match '<loc>http://test.host/en/child-page</loc>', response.body
end
+ class TestRenderException
+ def self.callback(cms_site, view, xml)
+ xml.url do
+ # make sure we have the view
+ xml.loc view.url_for("http://test.host/test_render")
+ xml.lastmod 2.days.ago.strftime('%Y-%m-%d')
+ end
+ end
+ end
+
+ def test_rendering_sitemap_with_extensions
+ ComfortableMexicanSofa::Sitemap.register_extension(TestRenderException.method(:callback))
+ get :render_sitemap, :format => :xml
+ assert_response :success
+ assert_match '<loc>http://test.host/test_render</loc>', response.body
+ end
+
end
test/unit/sitemap_test.rb +20 -0
@@ @@ -0,0 +1,20 @@
+ require File.expand_path('../test_helper', File.dirname(__FILE__))
+
+ class SitemapTest < ActiveSupport::TestCase
+ class DummySitemapExtension
+ @@calls = 0
+ def self.calls
+ @@calls
+ end
+ def self.callback(cms_site, xml)
+ @@calls = @@calls + 1
+ end
+ end
+
+ def test_should_get_registered_extensions
+ ComfortableMexicanSofa::Sitemap.register_extension(DummySitemapExtension.method(:callback))
+ ComfortableMexicanSofa::Sitemap.process(cms_sites(:default), "xml")
+ assert_equal 1, DummySitemapExtension.calls
+ end
+
+ end