radiant-comments-extension 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/CHANGELOG +40 -0
- data/HELP_admin.markdown +52 -0
- data/HELP_designer.markdown +36 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +53 -0
- data/Rakefile +133 -0
- data/TODO +6 -0
- data/VERSION +1 -0
- data/app/controllers/admin/comments_controller.rb +130 -0
- data/app/controllers/comments_controller.rb +59 -0
- data/app/helpers/admin/comments_helper.rb +7 -0
- data/app/models/akismet_spam_filter.rb +37 -0
- data/app/models/comment.rb +121 -0
- data/app/models/comment_mailer.rb +24 -0
- data/app/models/mollom_spam_filter.rb +52 -0
- data/app/models/simple_spam_filter.rb +38 -0
- data/app/models/spam_filter.rb +43 -0
- data/app/views/admin/comments/_comment.rhtml +34 -0
- data/app/views/admin/comments/_form.rhtml +36 -0
- data/app/views/admin/comments/edit.rhtml +5 -0
- data/app/views/admin/comments/index.rhtml +55 -0
- data/app/views/admin/pages/_comments.rhtml +0 -0
- data/app/views/admin/pages/_edit_comments_enabled.rhtml +8 -0
- data/app/views/admin/pages/_index_head_view_comments.rhtml +1 -0
- data/app/views/admin/pages/_index_view_comments.rhtml +11 -0
- data/app/views/comment_mailer/comment_notification.rhtml +21 -0
- data/app/views/comments/_comment.rhtml +1 -0
- data/app/views/comments/_form.rhtml +23 -0
- data/app/views/comments/_new.rhtml +5 -0
- data/autotest/discover.rb +3 -0
- data/comments_extension.rb +81 -0
- data/cucumber.yml +1 -0
- data/db/migrate/001_create_comments.rb +29 -0
- data/db/migrate/002_create_snippets.rb +115 -0
- data/db/migrate/003_change_filter_id_from_integer_to_string.rb +10 -0
- data/db/migrate/004_add_approval_columns.rb +13 -0
- data/db/migrate/005_add_mollomid_column.rb +11 -0
- data/db/migrate/006_move_config_to_migrations.rb +22 -0
- data/db/migrate/007_add_preference_for_simple_spamcheck.rb +12 -0
- data/features/support/env.rb +16 -0
- data/features/support/paths.rb +16 -0
- data/lib/akismet.rb +134 -0
- data/lib/comment_page_extensions.rb +41 -0
- data/lib/comment_tags.rb +338 -0
- data/lib/mollom.rb +246 -0
- data/lib/radiant-comments-extension.rb +0 -0
- data/lib/tasks/comments_extension_tasks.rake +68 -0
- data/public/images/admin/accept.png +0 -0
- data/public/images/admin/comment_edit.png +0 -0
- data/public/images/admin/comments.png +0 -0
- data/public/images/admin/comments_delete.png +0 -0
- data/public/images/admin/delete.png +0 -0
- data/public/images/admin/email.png +0 -0
- data/public/images/admin/error.png +0 -0
- data/public/images/admin/link.png +0 -0
- data/public/images/admin/page_white_edit.png +0 -0
- data/public/images/admin/table_save.png +0 -0
- data/public/images/admin/tick.png +0 -0
- data/public/stylesheets/admin/comments.css +41 -0
- data/radiant-comments-extension.gemspec +133 -0
- data/spec/controllers/admin/comments_controller_spec.rb +57 -0
- data/spec/controllers/admin/comments_routing_spec.rb +43 -0
- data/spec/controllers/page_postback_spec.rb +51 -0
- data/spec/datasets/comments_dataset.rb +7 -0
- data/spec/models/akismet_spam_filter_spec.rb +61 -0
- data/spec/models/comment_spec.rb +148 -0
- data/spec/models/comment_tags_spec.rb +55 -0
- data/spec/models/mollom_spam_filter_spec.rb +103 -0
- data/spec/models/simple_spam_filter_spec.rb +44 -0
- data/spec/models/spam_filter_spec.rb +38 -0
- data/spec/spec.opts +6 -0
- data/spec/spec_helper.rb +36 -0
- data/test/fixtures/users.yml +6 -0
- data/test/integration/comment_enabling_test.rb +18 -0
- data/test/test_helper.rb +24 -0
- data/test/unit/comment_test.rb +52 -0
- metadata +177 -0
data/lib/mollom.rb
ADDED
@@ -0,0 +1,246 @@
|
|
1
|
+
require 'xmlrpc/client'
|
2
|
+
require 'openssl'
|
3
|
+
require 'base64'
|
4
|
+
|
5
|
+
# Mollom API requires this to change, but this gives a warning!
|
6
|
+
# XMLRPC::Client::USER_AGENT = "Ruby Mollom/0.1"
|
7
|
+
|
8
|
+
class Mollom
|
9
|
+
API_VERSION = '1.0'
|
10
|
+
STATIC_SERVER_LIST = [{:proto => 'http', :host => 'xmlrpc3.mollom.com'},
|
11
|
+
{:proto => 'http', :host => 'xmlrpc2.mollom.com'},
|
12
|
+
{:proto => 'http', :host => 'xmlrpc1.mollom.com'}].freeze
|
13
|
+
|
14
|
+
module Errors
|
15
|
+
Standard = 1000
|
16
|
+
Refresh = 1100
|
17
|
+
TooBusy = 1200
|
18
|
+
end
|
19
|
+
|
20
|
+
attr_accessor :private_key, :public_key
|
21
|
+
|
22
|
+
# Creates a new Mollom object. Takes +private_key+ and +public_key+ as keys.
|
23
|
+
#
|
24
|
+
# Mollom.new(:private_key => 'qopzalnzanzajlazjna', :public_key => 'aksakzaddazidzaodjaz')
|
25
|
+
# # => #<Mollom:0x5b6454 @public_key="aksakzaddazidzaodjaz", @private_key="qopzalnzanzajlazjna">
|
26
|
+
|
27
|
+
def initialize(options = {})
|
28
|
+
@private_key = options[:private_key]
|
29
|
+
@public_key = options[:public_key]
|
30
|
+
end
|
31
|
+
|
32
|
+
# Checks the content whether it is spam, ham (not spam), or undecided, and gives a quality assessment of the content.
|
33
|
+
# Possible content keys are:
|
34
|
+
# session_id # => If you allready have a session_id
|
35
|
+
# post_title # => The title
|
36
|
+
# post_body # => The main content of the post.
|
37
|
+
# author_name # => The name of the post author
|
38
|
+
# author_url # => The url the author enters
|
39
|
+
# author_mail # => The author's email address
|
40
|
+
# author_ip # => The author's IP address
|
41
|
+
# author_openid # => The author's OpenID
|
42
|
+
# author_id # => The author's ID
|
43
|
+
#
|
44
|
+
# Only the +post_body+ key is required, all other keys are optional.
|
45
|
+
# This function returns a ContentResponse object.
|
46
|
+
#
|
47
|
+
# response = mollom.check_content :post_title => 'Mollom rules!',
|
48
|
+
# :post_body => 'I think that mollom is so cool!',
|
49
|
+
# :author_name => 'Jan De Poorter',
|
50
|
+
# :author_url => 'http://www.openminds.be'
|
51
|
+
# response.spam? # => false
|
52
|
+
# response.ham? # => true
|
53
|
+
def check_content(content = {})
|
54
|
+
return ContentResponse.new(send_command('mollom.checkContent', content))
|
55
|
+
end
|
56
|
+
|
57
|
+
# Requests an Image captcha from Mollom. It takes the optional <tt>session_id</tt> and <tt>author_ip</tt> keys, if you allready have a session.
|
58
|
+
# It returns a hash with the URL where the captcha can be found, and the session_id, to keep track of the current session (Needed later in <tt>Mollom#check_captcha</tt>)
|
59
|
+
#
|
60
|
+
# captcha = mollom.image_captcha :author_ip => '172.16.0.1'
|
61
|
+
# captcha['url'] # => http://xmlrpc1.mollom.com:80/a9616e6b4cd6a81ecdd509fa624d895d.png
|
62
|
+
# captcha['session_id'] # => a9616e6b4cd6a81ecdd509fa624d895d
|
63
|
+
def image_captcha(info = {})
|
64
|
+
return send_command('mollom.getImageCaptcha', info)
|
65
|
+
end
|
66
|
+
|
67
|
+
# Requests an Audio captcha from Mollom. It takes the optional +session_id+ and +author_ip+ keys, if you allready have a session.
|
68
|
+
# It returns a hash with the URL where the captcha can be found, and the session_id, to keep track of the current session (Needed later in <tt>Mollom#check_captcha</tt>)
|
69
|
+
#
|
70
|
+
# captcha = mollom.audio_captcha :author_ip => '172.16.0.2', :session_id => 'a9616e6b4cd6a81ecdd509fa624d895d'
|
71
|
+
# captcha['url'] # => http://xmlrpc1.mollom.com:80/a9616e6b4cd6a81ecdd509fa624d895d.mp3
|
72
|
+
# captcha['session_id'] # => a9616e6b4cd6a81ecdd509fa624d895d
|
73
|
+
def audio_captcha(info = {})
|
74
|
+
return send_command('mollom.getAudioCaptcha', info)
|
75
|
+
end
|
76
|
+
|
77
|
+
# Checks with mollom if the given captcha (by the user) is correct. Takes +session_id+ and +solution+ keys. Both keys are required.
|
78
|
+
# Returns true if the captcha is valid, false if it is incorrect
|
79
|
+
#
|
80
|
+
# captcha = mollom.image_captcha :author_ip => '172.16.0.1'
|
81
|
+
# # show to user... input from user
|
82
|
+
# return = mollom.valid_captcha? :session_id => captcha['session_id'], :solution => 'abcDe9'
|
83
|
+
# return # => true
|
84
|
+
def valid_captcha?(info = {})
|
85
|
+
return send_command('mollom.checkCaptcha', info)
|
86
|
+
end
|
87
|
+
|
88
|
+
# Standard check to see if your public/private keypair are recognized. Takes no options
|
89
|
+
def key_ok?
|
90
|
+
return send_command('mollom.verifyKey')
|
91
|
+
rescue
|
92
|
+
return false
|
93
|
+
end
|
94
|
+
|
95
|
+
# Gets some statistics from Mollom about your site.
|
96
|
+
#
|
97
|
+
# The type has to be passed. Possible types:
|
98
|
+
# total_days
|
99
|
+
# total_accepted
|
100
|
+
# total_rejected
|
101
|
+
# yesterday_accepted
|
102
|
+
# yesterday_rejected
|
103
|
+
# today_accepted
|
104
|
+
# today_rejected
|
105
|
+
#
|
106
|
+
# mollom.statistics :type => 'total_accepted' # => 123
|
107
|
+
def statistics(options = {})
|
108
|
+
return send_command('mollom.getStatistics', options)
|
109
|
+
end
|
110
|
+
|
111
|
+
# Send feedback to Mollom about a certain content. Required keys are +session_id+ and +feedback+.
|
112
|
+
#
|
113
|
+
# Feedback can be any of
|
114
|
+
# spam
|
115
|
+
# profanity
|
116
|
+
# low-quality
|
117
|
+
# unwanted
|
118
|
+
#
|
119
|
+
# mollom.send_feedback :session_id => 'a9616e6b4cd6a81ecdd509fa624d895d', :feedback => 'unwanted'
|
120
|
+
def send_feedback(feedback = {})
|
121
|
+
return send_command('mollom.sendFeedback', feedback)
|
122
|
+
end
|
123
|
+
|
124
|
+
# Gets a list of servers from Mollom. You should cache this information in your application in a temporary file or in a database. You can set this with Mollom#server_list=
|
125
|
+
#
|
126
|
+
# Takes an optional parameter +refresh+, which resets the cached value.
|
127
|
+
#
|
128
|
+
# mollom.server_list
|
129
|
+
# # => [{:proto=>"http", :host=>"88.151.243.81"}, {:proto=>"http", :host=>"82.103.131.136"}]
|
130
|
+
def server_list(refresh = false)
|
131
|
+
return @server_list if @server_list && !refresh
|
132
|
+
STATIC_SERVER_LIST.each do |static_server|
|
133
|
+
@server_list = get_server_list_from(static_server)
|
134
|
+
return @server_list if @server_list
|
135
|
+
end
|
136
|
+
# Should have returned a server_list here..
|
137
|
+
raise(Error.new("Can't get mollom server-list"))
|
138
|
+
end
|
139
|
+
|
140
|
+
# Sets the server list used to contact Mollom. This should be used to set the list of cached servers.
|
141
|
+
#
|
142
|
+
# If you try to set a faulty server list, the function will silently fail, so we can get the server-list from Mollom.
|
143
|
+
def server_list=(list)
|
144
|
+
# Check if we get an actual serverlist-array
|
145
|
+
if list.is_a?(Array) && list.all? {|hash| hash.has_key?(:host) && hash.has_key?(:proto) }
|
146
|
+
@server_list = list
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
private
|
151
|
+
def get_server_list_from(server)
|
152
|
+
XMLRPC::Client.new(server[:host], "/#{API_VERSION}").call('mollom.getServerList', authentication_hash).collect do |server|
|
153
|
+
proto, ip = server.split('://')
|
154
|
+
{:proto => proto, :host => ip}
|
155
|
+
end
|
156
|
+
rescue
|
157
|
+
nil
|
158
|
+
end
|
159
|
+
|
160
|
+
def send_command(command, data = {})
|
161
|
+
server_list.each do |server|
|
162
|
+
begin
|
163
|
+
return XMLRPC::Client.new(server[:host], "/#{API_VERSION}").call(command, data.merge(authentication_hash))
|
164
|
+
# TODO: Rescue more stuff (Connection Timeout and such)
|
165
|
+
rescue XMLRPC::FaultException => error
|
166
|
+
case error.faultCode
|
167
|
+
when Errors::Standard
|
168
|
+
raise Error.new(error.faultString)
|
169
|
+
when Errors::Refresh # Refresh server list please!
|
170
|
+
# we take this one out of our loop
|
171
|
+
raise
|
172
|
+
when Errors::TooBusy # Server is too busy, take the next one
|
173
|
+
next
|
174
|
+
else
|
175
|
+
next
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
raise Mollom::NoAvailableServers
|
180
|
+
rescue XMLRPC::FaultException
|
181
|
+
# We know it is Errors::Refresh
|
182
|
+
server_list(true)
|
183
|
+
retry
|
184
|
+
end
|
185
|
+
|
186
|
+
# Creates a HMAC-SHA1 Hash with the current timestamp, a nonce, and your private key.
|
187
|
+
def authentication_hash
|
188
|
+
now = Time.now.gmtime.strftime('%Y-%m-%dT%H:%M:%S.000+0000')
|
189
|
+
nonce = Kernel.rand(2**31) # Random signed int
|
190
|
+
|
191
|
+
hash = Base64.encode64(
|
192
|
+
OpenSSL::HMAC.digest(OpenSSL::Digest::SHA1.new, @private_key, "#{now}:#{nonce}:#{@private_key}")
|
193
|
+
).chomp
|
194
|
+
|
195
|
+
return :public_key=> @public_key, :time => now, :hash => hash, :nonce => nonce
|
196
|
+
end
|
197
|
+
|
198
|
+
class ContentResponse
|
199
|
+
attr_reader :session_id, :quality
|
200
|
+
|
201
|
+
Unknown = 0
|
202
|
+
Ham = 1
|
203
|
+
Unsure = 2
|
204
|
+
Spam = 3
|
205
|
+
|
206
|
+
# This class should only be initialized from within the +check_content+ command.
|
207
|
+
def initialize(hash)
|
208
|
+
@spam_response = hash["spam"]
|
209
|
+
@session_id = hash["session_id"]
|
210
|
+
@quality = hash["quality"]
|
211
|
+
end
|
212
|
+
|
213
|
+
# Is the content Spam?
|
214
|
+
def spam?
|
215
|
+
@spam_response == Spam
|
216
|
+
end
|
217
|
+
|
218
|
+
# Is the content Ham?
|
219
|
+
def ham?
|
220
|
+
@spam_response == Ham
|
221
|
+
end
|
222
|
+
|
223
|
+
# is Mollom unsure about the content?
|
224
|
+
def unsure?
|
225
|
+
@spam_response == Unsure
|
226
|
+
end
|
227
|
+
|
228
|
+
# is the content unknown?
|
229
|
+
def unknown?
|
230
|
+
@spam_response == Unknown
|
231
|
+
end
|
232
|
+
|
233
|
+
# Returns 'unknown', 'ham', 'unsure' or 'spam', depending on what the content is.
|
234
|
+
def to_s
|
235
|
+
case @spam_response
|
236
|
+
when Unknown: 'unknown'
|
237
|
+
when Ham: 'ham'
|
238
|
+
when Unsure: 'unsure'
|
239
|
+
when Spam: 'spam'
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
class Error < StandardError; end
|
245
|
+
class NoAvailableServers < Error; end
|
246
|
+
end
|
File without changes
|
@@ -0,0 +1,68 @@
|
|
1
|
+
namespace :radiant do
|
2
|
+
namespace :extensions do
|
3
|
+
namespace :comments do
|
4
|
+
|
5
|
+
desc "Single task to install and update the Comments extension"
|
6
|
+
task :install => [:environment, :initialize, :migrate, :update]
|
7
|
+
|
8
|
+
desc "Runs the migration of the Comments extension"
|
9
|
+
task :migrate => :environment do
|
10
|
+
require 'radiant/extension_migrator'
|
11
|
+
if ENV["VERSION"]
|
12
|
+
CommentsExtension.migrator.migrate(ENV["VERSION"].to_i)
|
13
|
+
else
|
14
|
+
CommentsExtension.migrator.migrate
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "Copies public assets of the CommentsExtension to the instance public/ directory."
|
19
|
+
task :update => :environment do
|
20
|
+
is_svn_or_dir = proc {|path| path =~ /\.svn/ || File.directory?(path) }
|
21
|
+
puts "Copying assets from CommentsExtension"
|
22
|
+
Dir[CommentsExtension.root + "/public/**/*"].reject(&is_svn_or_dir).each do |file|
|
23
|
+
path = file.sub(CommentsExtension.root, '')
|
24
|
+
directory = File.dirname(path)
|
25
|
+
mkdir_p RAILS_ROOT + directory, :verbose => false
|
26
|
+
cp file, RAILS_ROOT + path, :verbose => false
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
desc "Generates the initializer for comment sanitizing"
|
31
|
+
task :initialize do
|
32
|
+
sanitizer_path = File.join(Rails.root, 'config', 'initializers', 'sanitizer.rb')
|
33
|
+
if !File.exist?(sanitizer_path)
|
34
|
+
Rake::Task["radiant:extensions:comments:forced_initialize"].execute
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
desc "Regenerates the initializer for comment sanitizing if it does not yet exist"
|
39
|
+
task :forced_initialize do
|
40
|
+
sanitizer_path = File.join(Rails.root, 'config', 'initializers', 'sanitizer.rb')
|
41
|
+
mkdir_p File.dirname(sanitizer_path), :verbose => false
|
42
|
+
File.open(sanitizer_path,'w+') do |file|
|
43
|
+
file.write string = <<FILE
|
44
|
+
# The Comments Extension uses this option to clean out unwanted elements from the comments.
|
45
|
+
# The example output for each option is the result of sanitization for this text:
|
46
|
+
#
|
47
|
+
# '<b><a href="http://foo.com/">foo</a></b><img src="http://foo.com/bar.jpg" />'
|
48
|
+
#
|
49
|
+
# Uncomment one of the options below to choose your preference. By default, RELAXED is used.
|
50
|
+
# For more information about your options, please see the Sanitize documentation:
|
51
|
+
# http://rgrove.github.com/sanitize/
|
52
|
+
|
53
|
+
COMMENT_SANITIZER_OPTION =
|
54
|
+
Sanitize::Config::RELAXED # Gives you '<b><a href="http://foo.com/">foo</a></b><img src="http://foo.com/bar.jpg" />'
|
55
|
+
# Sanitize::Config::BASIC # Results in '<b><a href="http://foo.com/" rel="nofollow">foo</a></b>'
|
56
|
+
# Sanitize::Config::RESTRICTED # This results in '<b>foo</b>'
|
57
|
+
|
58
|
+
# Or you may create your own sanitization rules. Uncomment all the lines below and edit them as you need.
|
59
|
+
# {:elements => ['a', 'span'],
|
60
|
+
# :attributes => {'a' => ['href', 'title'], 'span' => ['class']},
|
61
|
+
# :protocols => {'a' => {'href' => ['http', 'https', 'mailto']}}}
|
62
|
+
FILE
|
63
|
+
end
|
64
|
+
puts "Comment sanitization settings may be found in config/initializers/sanitizer.rb"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,41 @@
|
|
1
|
+
#comment-nav {
|
2
|
+
float: right;
|
3
|
+
list-style: none;
|
4
|
+
margin: -42px 0 0 96px;
|
5
|
+
padding: 0; }
|
6
|
+
#comment-nav li {
|
7
|
+
display: inline;
|
8
|
+
margin: 0 5px 0 0; }
|
9
|
+
#comment-nav a, #comment-nav span {
|
10
|
+
padding: 5px 5px 5px 25px;
|
11
|
+
background-position: 5px center;
|
12
|
+
background-repeat: no-repeat; }
|
13
|
+
#comment-nav a, #comment-nav a:visited {
|
14
|
+
color: black; }
|
15
|
+
#comment-nav span {
|
16
|
+
border: 1px solid #ffa;
|
17
|
+
background-color: #ffd; }
|
18
|
+
#comment-nav li.all a, #comment-nav li.all span {
|
19
|
+
background-image: url(/images/admin/comments.png); }
|
20
|
+
#comment-nav li.approved a, #comment-nav li.approved span {
|
21
|
+
background-image: url(/images/admin/accept.png); }
|
22
|
+
#comment-nav li.unapproved a, #comment-nav li.unapproved span {
|
23
|
+
background-image: url(/images/admin/error.png); }
|
24
|
+
#comment-nav li.csv a, #comment-nav li.csv span {
|
25
|
+
background-image: url(/images/admin/table_save.png); }
|
26
|
+
|
27
|
+
html>body li.all a, html>body li.all span, html>body li.approved a, html>body li.approved span, html>body li.unapproved a, html>body li.unapproved span, html>body li.csv a, html>body li.csv span {
|
28
|
+
*display: inline-block; }
|
29
|
+
|
30
|
+
* html li.all a, * html li.all span, * html li.approved a, * html li.approved span, * html li.unapproved a, * html li.unapproved span, * html li.csv a, * html li.csv span {
|
31
|
+
display: inline-block; }
|
32
|
+
|
33
|
+
#content tr.comment td.content { color: #333; padding-right: 8px; width: 45%; font-size: 75%; }
|
34
|
+
#content tr.comment blockquote.short { display: inline; margin: 0 }
|
35
|
+
#content tr.comment blockquote.expanded { display:block; margin: 0; padding: 4px; border: 1px solid #bbc; background-color: #eef; }
|
36
|
+
#content tr.comment td.controls, #content tr.comment td.date { white-space: nowrap }
|
37
|
+
#content tr.comment.approved { background-color: #efe; }
|
38
|
+
#content tr.comment a { color: black; }
|
39
|
+
#content tr.comment a:visited { color: black; }
|
40
|
+
|
41
|
+
button.delete-unapproved { padding: 5px; font-size: 120%; }
|
@@ -0,0 +1,133 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{radiant-comments-extension}
|
8
|
+
s.version = "0.0.6"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Jim Gay", "Ryan Heneise", "Sean Cribbs", "John Muhl", "Sven Schwyn", "Gerrit Kaiser", "Stephen Lombardo", "Benny Degezelle", "Frank Louwers", "Michael Hale", "Nathaniel Talbott", "John Croisant", "Jon Leighton", "Witter Cheng", "Keith Bingman"]
|
12
|
+
s.date = %q{2010-04-01}
|
13
|
+
s.description = %q{Adds blog-like comment functionality to Radiant.}
|
14
|
+
s.email = %q{jim@saturnflyer.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README.rdoc",
|
17
|
+
"TODO"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".gitignore",
|
21
|
+
"CHANGELOG",
|
22
|
+
"HELP_admin.markdown",
|
23
|
+
"HELP_designer.markdown",
|
24
|
+
"MIT-LICENSE",
|
25
|
+
"README.rdoc",
|
26
|
+
"Rakefile",
|
27
|
+
"TODO",
|
28
|
+
"VERSION",
|
29
|
+
"app/controllers/admin/comments_controller.rb",
|
30
|
+
"app/controllers/comments_controller.rb",
|
31
|
+
"app/helpers/admin/comments_helper.rb",
|
32
|
+
"app/models/akismet_spam_filter.rb",
|
33
|
+
"app/models/comment.rb",
|
34
|
+
"app/models/comment_mailer.rb",
|
35
|
+
"app/models/mollom_spam_filter.rb",
|
36
|
+
"app/models/simple_spam_filter.rb",
|
37
|
+
"app/models/spam_filter.rb",
|
38
|
+
"app/views/admin/comments/_comment.rhtml",
|
39
|
+
"app/views/admin/comments/_form.rhtml",
|
40
|
+
"app/views/admin/comments/edit.rhtml",
|
41
|
+
"app/views/admin/comments/index.rhtml",
|
42
|
+
"app/views/admin/pages/_comments.rhtml",
|
43
|
+
"app/views/admin/pages/_edit_comments_enabled.rhtml",
|
44
|
+
"app/views/admin/pages/_index_head_view_comments.rhtml",
|
45
|
+
"app/views/admin/pages/_index_view_comments.rhtml",
|
46
|
+
"app/views/comment_mailer/comment_notification.rhtml",
|
47
|
+
"app/views/comments/_comment.rhtml",
|
48
|
+
"app/views/comments/_form.rhtml",
|
49
|
+
"app/views/comments/_new.rhtml",
|
50
|
+
"autotest/discover.rb",
|
51
|
+
"comments_extension.rb",
|
52
|
+
"cucumber.yml",
|
53
|
+
"db/migrate/001_create_comments.rb",
|
54
|
+
"db/migrate/002_create_snippets.rb",
|
55
|
+
"db/migrate/003_change_filter_id_from_integer_to_string.rb",
|
56
|
+
"db/migrate/004_add_approval_columns.rb",
|
57
|
+
"db/migrate/005_add_mollomid_column.rb",
|
58
|
+
"db/migrate/006_move_config_to_migrations.rb",
|
59
|
+
"db/migrate/007_add_preference_for_simple_spamcheck.rb",
|
60
|
+
"features/support/env.rb",
|
61
|
+
"features/support/paths.rb",
|
62
|
+
"lib/akismet.rb",
|
63
|
+
"lib/comment_page_extensions.rb",
|
64
|
+
"lib/comment_tags.rb",
|
65
|
+
"lib/mollom.rb",
|
66
|
+
"lib/radiant-comments-extension.rb",
|
67
|
+
"lib/tasks/comments_extension_tasks.rake",
|
68
|
+
"public/images/admin/accept.png",
|
69
|
+
"public/images/admin/comment_edit.png",
|
70
|
+
"public/images/admin/comments.png",
|
71
|
+
"public/images/admin/comments_delete.png",
|
72
|
+
"public/images/admin/delete.png",
|
73
|
+
"public/images/admin/email.png",
|
74
|
+
"public/images/admin/error.png",
|
75
|
+
"public/images/admin/link.png",
|
76
|
+
"public/images/admin/page_white_edit.png",
|
77
|
+
"public/images/admin/table_save.png",
|
78
|
+
"public/images/admin/tick.png",
|
79
|
+
"public/stylesheets/admin/comments.css",
|
80
|
+
"radiant-comments-extension.gemspec",
|
81
|
+
"spec/controllers/admin/comments_controller_spec.rb",
|
82
|
+
"spec/controllers/admin/comments_routing_spec.rb",
|
83
|
+
"spec/controllers/page_postback_spec.rb",
|
84
|
+
"spec/datasets/comments_dataset.rb",
|
85
|
+
"spec/models/akismet_spam_filter_spec.rb",
|
86
|
+
"spec/models/comment_spec.rb",
|
87
|
+
"spec/models/comment_tags_spec.rb",
|
88
|
+
"spec/models/mollom_spam_filter_spec.rb",
|
89
|
+
"spec/models/simple_spam_filter_spec.rb",
|
90
|
+
"spec/models/spam_filter_spec.rb",
|
91
|
+
"spec/spec.opts",
|
92
|
+
"spec/spec_helper.rb",
|
93
|
+
"test/fixtures/users.yml",
|
94
|
+
"test/integration/comment_enabling_test.rb",
|
95
|
+
"test/test_helper.rb",
|
96
|
+
"test/unit/comment_test.rb"
|
97
|
+
]
|
98
|
+
s.homepage = %q{http://github.com/saturnflyer/radiant-comments-extension}
|
99
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
100
|
+
s.require_paths = ["lib"]
|
101
|
+
s.rubygems_version = %q{1.3.6}
|
102
|
+
s.summary = %q{Comments Extension for Radiant CMS}
|
103
|
+
s.test_files = [
|
104
|
+
"spec/controllers/admin/comments_controller_spec.rb",
|
105
|
+
"spec/controllers/admin/comments_routing_spec.rb",
|
106
|
+
"spec/controllers/page_postback_spec.rb",
|
107
|
+
"spec/datasets/comments_dataset.rb",
|
108
|
+
"spec/models/akismet_spam_filter_spec.rb",
|
109
|
+
"spec/models/comment_spec.rb",
|
110
|
+
"spec/models/comment_tags_spec.rb",
|
111
|
+
"spec/models/mollom_spam_filter_spec.rb",
|
112
|
+
"spec/models/simple_spam_filter_spec.rb",
|
113
|
+
"spec/models/spam_filter_spec.rb",
|
114
|
+
"spec/spec_helper.rb",
|
115
|
+
"test/integration/comment_enabling_test.rb",
|
116
|
+
"test/test_helper.rb",
|
117
|
+
"test/unit/comment_test.rb"
|
118
|
+
]
|
119
|
+
|
120
|
+
if s.respond_to? :specification_version then
|
121
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
122
|
+
s.specification_version = 3
|
123
|
+
|
124
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
125
|
+
s.add_development_dependency(%q<radiant>, [">= 0"])
|
126
|
+
else
|
127
|
+
s.add_dependency(%q<radiant>, [">= 0"])
|
128
|
+
end
|
129
|
+
else
|
130
|
+
s.add_dependency(%q<radiant>, [">= 0"])
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|