radiant-comments-extension 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. data/.gitignore +3 -0
  2. data/CHANGELOG +40 -0
  3. data/HELP_admin.markdown +52 -0
  4. data/HELP_designer.markdown +36 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.rdoc +53 -0
  7. data/Rakefile +133 -0
  8. data/TODO +6 -0
  9. data/VERSION +1 -0
  10. data/app/controllers/admin/comments_controller.rb +130 -0
  11. data/app/controllers/comments_controller.rb +59 -0
  12. data/app/helpers/admin/comments_helper.rb +7 -0
  13. data/app/models/akismet_spam_filter.rb +37 -0
  14. data/app/models/comment.rb +121 -0
  15. data/app/models/comment_mailer.rb +24 -0
  16. data/app/models/mollom_spam_filter.rb +52 -0
  17. data/app/models/simple_spam_filter.rb +38 -0
  18. data/app/models/spam_filter.rb +43 -0
  19. data/app/views/admin/comments/_comment.rhtml +34 -0
  20. data/app/views/admin/comments/_form.rhtml +36 -0
  21. data/app/views/admin/comments/edit.rhtml +5 -0
  22. data/app/views/admin/comments/index.rhtml +55 -0
  23. data/app/views/admin/pages/_comments.rhtml +0 -0
  24. data/app/views/admin/pages/_edit_comments_enabled.rhtml +8 -0
  25. data/app/views/admin/pages/_index_head_view_comments.rhtml +1 -0
  26. data/app/views/admin/pages/_index_view_comments.rhtml +11 -0
  27. data/app/views/comment_mailer/comment_notification.rhtml +21 -0
  28. data/app/views/comments/_comment.rhtml +1 -0
  29. data/app/views/comments/_form.rhtml +23 -0
  30. data/app/views/comments/_new.rhtml +5 -0
  31. data/autotest/discover.rb +3 -0
  32. data/comments_extension.rb +81 -0
  33. data/cucumber.yml +1 -0
  34. data/db/migrate/001_create_comments.rb +29 -0
  35. data/db/migrate/002_create_snippets.rb +115 -0
  36. data/db/migrate/003_change_filter_id_from_integer_to_string.rb +10 -0
  37. data/db/migrate/004_add_approval_columns.rb +13 -0
  38. data/db/migrate/005_add_mollomid_column.rb +11 -0
  39. data/db/migrate/006_move_config_to_migrations.rb +22 -0
  40. data/db/migrate/007_add_preference_for_simple_spamcheck.rb +12 -0
  41. data/features/support/env.rb +16 -0
  42. data/features/support/paths.rb +16 -0
  43. data/lib/akismet.rb +134 -0
  44. data/lib/comment_page_extensions.rb +41 -0
  45. data/lib/comment_tags.rb +338 -0
  46. data/lib/mollom.rb +246 -0
  47. data/lib/radiant-comments-extension.rb +0 -0
  48. data/lib/tasks/comments_extension_tasks.rake +68 -0
  49. data/public/images/admin/accept.png +0 -0
  50. data/public/images/admin/comment_edit.png +0 -0
  51. data/public/images/admin/comments.png +0 -0
  52. data/public/images/admin/comments_delete.png +0 -0
  53. data/public/images/admin/delete.png +0 -0
  54. data/public/images/admin/email.png +0 -0
  55. data/public/images/admin/error.png +0 -0
  56. data/public/images/admin/link.png +0 -0
  57. data/public/images/admin/page_white_edit.png +0 -0
  58. data/public/images/admin/table_save.png +0 -0
  59. data/public/images/admin/tick.png +0 -0
  60. data/public/stylesheets/admin/comments.css +41 -0
  61. data/radiant-comments-extension.gemspec +133 -0
  62. data/spec/controllers/admin/comments_controller_spec.rb +57 -0
  63. data/spec/controllers/admin/comments_routing_spec.rb +43 -0
  64. data/spec/controllers/page_postback_spec.rb +51 -0
  65. data/spec/datasets/comments_dataset.rb +7 -0
  66. data/spec/models/akismet_spam_filter_spec.rb +61 -0
  67. data/spec/models/comment_spec.rb +148 -0
  68. data/spec/models/comment_tags_spec.rb +55 -0
  69. data/spec/models/mollom_spam_filter_spec.rb +103 -0
  70. data/spec/models/simple_spam_filter_spec.rb +44 -0
  71. data/spec/models/spam_filter_spec.rb +38 -0
  72. data/spec/spec.opts +6 -0
  73. data/spec/spec_helper.rb +36 -0
  74. data/test/fixtures/users.yml +6 -0
  75. data/test/integration/comment_enabling_test.rb +18 -0
  76. data/test/test_helper.rb +24 -0
  77. data/test/unit/comment_test.rb +52 -0
  78. 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
@@ -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
+