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.
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
+