radiant-comments-extension 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
|