Add RSS Feed (#1500)
This commit is contained in:
@@ -24,7 +24,8 @@ Gollum is a simple wiki system built on top of Git. A Gollum Wiki is simply a gi
|
||||
* Annotations using [CriticMarkup](https://github.com/gollum/gollum/wiki#criticmarkup-annotations)
|
||||
* Mathematics via [MathJax](https://github.com/gollum/gollum/wiki#mathematics)
|
||||
* [Macros](https://github.com/gollum/gollum/wiki/Standard-Macros)
|
||||
* [Redirects](https://github.com/gollum/gollum/wiki/5.0-release-notes#support-for-redirects)
|
||||
* [Redirects](https://github.com/gollum/gollum/wiki#redirects)
|
||||
* [RSS Feed](https://github.com/gollum/gollum/wiki/5.0-release-notes#rss-feed) of latest changes
|
||||
* ...and [more](https://github.com/gollum/gollum/wiki)
|
||||
|
||||
### SYSTEM REQUIREMENTS
|
||||
|
||||
@@ -37,6 +37,7 @@ Gem::Specification.new do |s|
|
||||
s.add_dependency 'sass', '~> 3.5'
|
||||
s.add_dependency 'uglifier', '~> 3.2'
|
||||
s.add_dependency 'sprockets-helpers', '~> 1.2'
|
||||
s.add_dependency 'rss', '~> 0.2.9'
|
||||
|
||||
s.add_development_dependency 'rack-test', '~> 0.6.3'
|
||||
s.add_development_dependency 'shoulda', '~> 3.6.0'
|
||||
|
||||
+14
-2
@@ -19,7 +19,7 @@ require 'gollum/views/editable'
|
||||
require 'gollum/views/has_page'
|
||||
require 'gollum/views/has_user_icons'
|
||||
require 'gollum/views/pagination'
|
||||
|
||||
require 'gollum/views/rss.rb'
|
||||
|
||||
require File.expand_path '../helpers', __FILE__
|
||||
|
||||
@@ -44,6 +44,7 @@ module Precious
|
||||
register Mustache::Sinatra
|
||||
register Sinatra::Namespace
|
||||
include Precious::Helpers
|
||||
|
||||
dir = File.dirname(File.expand_path(__FILE__))
|
||||
|
||||
set :sprockets, ::Precious::Assets.sprockets(dir)
|
||||
@@ -77,6 +78,8 @@ module Precious
|
||||
@critic_markup = settings.wiki_options[:critic_markup]
|
||||
@redirects_enabled = settings.wiki_options.fetch(:redirects_enabled, true)
|
||||
@per_page_uploads = settings.wiki_options[:per_page_uploads]
|
||||
|
||||
@wiki_title = settings.wiki_options.fetch(:title, 'Gollum Wiki')
|
||||
|
||||
forbid unless @allow_editing || request.request_method == 'GET'
|
||||
Precious::App.set(:mustache, {:templates => settings.wiki_options[:template_dir]}) if settings.wiki_options[:template_dir]
|
||||
@@ -111,7 +114,16 @@ module Precious
|
||||
end
|
||||
|
||||
namespace '/gollum' do
|
||||
|
||||
get '/feed/' do
|
||||
url = "#{env['rack.url_scheme']}://#{env['HTTP_HOST']}"
|
||||
changes = wiki_new.latest_changes(::Gollum::Page.log_pagination_options(
|
||||
per_page: settings.wiki_options.fetch(:pagination_count, 10),
|
||||
page_num: 0)
|
||||
)
|
||||
content_type :rss
|
||||
RSSView.new(@base_url, @wiki_title, url, changes).render
|
||||
end
|
||||
|
||||
get '/assets/mathjax/*' do
|
||||
env['PATH_INFO'].sub!("/gollum/assets/mathjax", '')
|
||||
Rack::Static.new(not_found_proc, {:root => @mathjax_path, :urls => ['']}).call(env)
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
require 'rss'
|
||||
|
||||
class RSSView
|
||||
|
||||
include Precious::Views::AppHelpers
|
||||
include Precious::Views::RouteHelpers
|
||||
|
||||
attr_reader :base_url
|
||||
|
||||
def initialize(base_url, wiki_title, url, changes)
|
||||
@base_url = base_url
|
||||
@wiki_title = wiki_title
|
||||
@url = url
|
||||
@changes = changes
|
||||
end
|
||||
|
||||
def render
|
||||
latest_changes = "#{@url}#{latest_changes_path}"
|
||||
RSS::Maker.make('2.0') do |maker|
|
||||
maker.channel.author = 'Gollum Wiki'
|
||||
maker.channel.updated = @changes.first.authored_date
|
||||
maker.channel.title = "#{@wiki_title} Latest Changes"
|
||||
maker.channel.description = "Latest Changes in #{@wiki_title}"
|
||||
maker.channel.link = latest_changes
|
||||
@changes.each do |change|
|
||||
maker.items.new_item do |item|
|
||||
item.link = latest_changes
|
||||
item.title = change.message
|
||||
item.updated = change.authored_date
|
||||
id = change.id
|
||||
files = change.stats.files.map do |files|
|
||||
[files[:old_file], files[:new_file]].compact.map do |file|
|
||||
f = extract_page_dir(file)
|
||||
"<li><a href=\"#{@url}#{page_route(f)}/#{id}\">#{f}</a></li>"
|
||||
end
|
||||
end
|
||||
item.description = "Commited by: <a href=\"mailto:#{change.author.email}\">#{change.author.name}</a><br/>Commit ID: #{id[0..6]}<br/><br/>Affected files:<ul>#{files.join}</ul>"
|
||||
end
|
||||
end
|
||||
end.to_s
|
||||
end
|
||||
|
||||
end
|
||||
@@ -63,6 +63,21 @@ context "Frontend" do
|
||||
|
||||
assert_match /#{expected}/, actual
|
||||
end
|
||||
|
||||
test 'rss feed' do
|
||||
channel_title = <<EOF
|
||||
<title>Gollum Wiki Latest Changes</title>
|
||||
EOF
|
||||
item = <<EOF
|
||||
<description>Commited by: <a href="mailto:dawa.ometto@phil.uu.nl">Dawa Ometto</a><br/>Commit ID: 02796b1<br/><br/>Affected files:<ul><li><a href="http://example.org/custom.css/02796b1450691f90db5d6dc6a816a4980ce80d07">custom.css</a></li><li><a href="http://example.org/custom.js/02796b1450691f90db5d6dc6a816a4980ce80d07">custom.js</a></li></ul></description>
|
||||
EOF
|
||||
get '/gollum/feed/'
|
||||
assert last_response.ok?
|
||||
assert_equal 'application/rss+xml', last_response.headers['Content-Type']
|
||||
assert last_response.body.start_with?('<?xml')
|
||||
assert last_response.body.include?(item)
|
||||
assert last_response.body.include?(channel_title)
|
||||
end
|
||||
|
||||
test "show sidebar, header, footer when present" do
|
||||
divs = [@wiki.page("_Header").formatted_data, @wiki.page("_Footer").formatted_data, @wiki.page("_Sidebar").formatted_data]
|
||||
|
||||
@@ -41,7 +41,6 @@ context "Precious::Views::Overview" do
|
||||
test "breadcrumb" do
|
||||
@page.instance_variable_set("@path", "Mordor/Eye-Of-Sauron/Saruman")
|
||||
@page.instance_variable_set("@base_url", "")
|
||||
$stderr.puts @page.breadcrumb.inspect
|
||||
assert_equal "<nav aria-label=\"Breadcrumb\"><ol><li class=\"breadcrumb-item\"><a href=\"/gollum/overview\">Home</a></li>\n<li class=\"breadcrumb-item\"><a href=\"/gollum/overview/Mordor/\">Mordor</a></li>\n<li class=\"breadcrumb-item\"><a href=\"/gollum/overview/Mordor/Eye-Of-Sauron/\">Eye-Of-Sauron</a></li>\n<li class=\"breadcrumb-item\" aria-current=\"page\">Saruman</li>\n</ol></nav>", @page.breadcrumb
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user