Commit eb86a96443d743f02dbbd4393bee48269c4eda79
1 parent
13bd4e38
Exists in
master
and in
23 other branches
spammable: encapsulate the spam logic to a module
Showing
5 changed files
with
54 additions
and
49 deletions
Show diff stats
app/models/comment.rb
| ... | ... | @@ -16,9 +16,7 @@ class Comment < ActiveRecord::Base |
| 16 | 16 | has_many :children, :class_name => 'Comment', :foreign_key => 'reply_of_id', :dependent => :destroy |
| 17 | 17 | belongs_to :reply_of, :class_name => 'Comment', :foreign_key => 'reply_of_id' |
| 18 | 18 | |
| 19 | - named_scope :without_spam, :conditions => ['spam IS NULL OR spam = ?', false] | |
| 20 | 19 | named_scope :without_reply, :conditions => ['reply_of_id IS NULL'] |
| 21 | - named_scope :spam, :conditions => ['spam = ?', true] | |
| 22 | 20 | |
| 23 | 21 | # unauthenticated authors: |
| 24 | 22 | validates_presence_of :name, :if => (lambda { |record| !record.email.blank? }) |
| ... | ... | @@ -205,27 +203,15 @@ class Comment < ActiveRecord::Base |
| 205 | 203 | @rejected = true |
| 206 | 204 | end |
| 207 | 205 | |
| 208 | - def spam? | |
| 209 | - !spam.nil? && spam | |
| 210 | - end | |
| 211 | - | |
| 212 | - def ham? | |
| 213 | - !spam.nil? && !spam | |
| 214 | - end | |
| 206 | + include Spammable | |
| 215 | 207 | |
| 216 | - def spam! | |
| 217 | - self.spam = true | |
| 218 | - self.save! | |
| 208 | + def after_spam! | |
| 219 | 209 | SpammerLogger.log(ip_address, self) |
| 220 | 210 | Delayed::Job.enqueue(CommentHandler.new(self.id, :marked_as_spam)) |
| 221 | - self | |
| 222 | 211 | end |
| 223 | 212 | |
| 224 | - def ham! | |
| 225 | - self.spam = false | |
| 226 | - self.save! | |
| 213 | + def after_ham! | |
| 227 | 214 | Delayed::Job.enqueue(CommentHandler.new(self.id, :marked_as_ham)) |
| 228 | - self | |
| 229 | 215 | end |
| 230 | 216 | |
| 231 | 217 | def marked_as_spam | ... | ... |
app/models/suggest_article.rb
| ... | ... | @@ -76,17 +76,13 @@ class SuggestArticle < Task |
| 76 | 76 | _('You need to login on %{system} in order to approve or reject this article.') % { :system => target.environment.name } |
| 77 | 77 | end |
| 78 | 78 | |
| 79 | - def spam! | |
| 80 | - super | |
| 79 | + def after_spam! | |
| 81 | 80 | SpammerLogger.log(ip_address, self) |
| 82 | 81 | self.delay.marked_as_spam |
| 83 | - self | |
| 84 | 82 | end |
| 85 | 83 | |
| 86 | - def ham! | |
| 87 | - super | |
| 84 | + def after_ham! | |
| 88 | 85 | self.delay.marked_as_ham |
| 89 | - self | |
| 90 | 86 | end |
| 91 | 87 | |
| 92 | 88 | def marked_as_spam | ... | ... |
app/models/task.rb
| ... | ... | @@ -235,25 +235,7 @@ class Task < ActiveRecord::Base |
| 235 | 235 | end |
| 236 | 236 | end |
| 237 | 237 | |
| 238 | - def spam? | |
| 239 | - !spam.nil? && spam | |
| 240 | - end | |
| 241 | - | |
| 242 | - def ham? | |
| 243 | - !spam.nil? && !spam | |
| 244 | - end | |
| 245 | - | |
| 246 | - def spam! | |
| 247 | - self.spam = true | |
| 248 | - self.save! | |
| 249 | - self | |
| 250 | - end | |
| 251 | - | |
| 252 | - def ham! | |
| 253 | - self.spam = false | |
| 254 | - self.save! | |
| 255 | - self | |
| 256 | - end | |
| 238 | + include Spammable | |
| 257 | 239 | |
| 258 | 240 | protected |
| 259 | 241 | |
| ... | ... | @@ -294,8 +276,6 @@ class Task < ActiveRecord::Base |
| 294 | 276 | named_scope :opened, :conditions => { :status => [Task::Status::ACTIVE, Task::Status::HIDDEN] } |
| 295 | 277 | named_scope :of, lambda { |type| conditions = type ? "type LIKE '#{type}'" : "1=1"; {:conditions => [conditions]} } |
| 296 | 278 | named_scope :order_by, lambda { |attribute, ord| {:order => "#{attribute} #{ord}"} } |
| 297 | - named_scope :without_spam, :conditions => ['spam IS NULL OR spam = ?', false] | |
| 298 | - named_scope :spam, :conditions => ['spam = ?', true] | |
| 299 | 279 | |
| 300 | 280 | |
| 301 | 281 | named_scope :to, lambda { |profile| | ... | ... |
| ... | ... | @@ -0,0 +1,44 @@ |
| 1 | +module Spammable | |
| 2 | + def self.included(recipient) | |
| 3 | + recipient.extend(ClassMethods) | |
| 4 | + end | |
| 5 | + | |
| 6 | + module ClassMethods | |
| 7 | + def self.extended (base) | |
| 8 | + base.class_eval do | |
| 9 | + named_scope :without_spam, :conditions => ['spam IS NULL OR spam = ?', false] | |
| 10 | + named_scope :spam, :conditions => ['spam = ?', true] | |
| 11 | + end | |
| 12 | + end | |
| 13 | + end | |
| 14 | + | |
| 15 | + def spam? | |
| 16 | + !spam.nil? && spam | |
| 17 | + end | |
| 18 | + | |
| 19 | + def ham? | |
| 20 | + !spam.nil? && !spam | |
| 21 | + end | |
| 22 | + | |
| 23 | + def spam! | |
| 24 | + before_spam! | |
| 25 | + self.spam = true | |
| 26 | + self.save! | |
| 27 | + after_spam! | |
| 28 | + self | |
| 29 | + end | |
| 30 | + | |
| 31 | + def ham! | |
| 32 | + before_ham! | |
| 33 | + self.spam = false | |
| 34 | + self.save! | |
| 35 | + after_ham! | |
| 36 | + self | |
| 37 | + end | |
| 38 | + | |
| 39 | + def after_spam!; end | |
| 40 | + def before_spam!; end | |
| 41 | + | |
| 42 | + def after_ham!; end | |
| 43 | + def before_ham!; end | |
| 44 | +end | ... | ... |
plugins/anti_spam/test/unit/anti_spam_plugin_test.rb
| ... | ... | @@ -2,24 +2,23 @@ require 'test_helper' |
| 2 | 2 | |
| 3 | 3 | class AntiSpamPluginTest < ActiveSupport::TestCase |
| 4 | 4 | |
| 5 | - class Spammable | |
| 5 | + class SpammableContent | |
| 6 | 6 | attr_accessor :spam |
| 7 | + include Spammable | |
| 7 | 8 | |
| 8 | 9 | def save!; end |
| 9 | - def spam!; end | |
| 10 | - def ham!; end | |
| 11 | - def spam?; true; end | |
| 12 | 10 | def environment; Environment.default; end |
| 13 | 11 | end |
| 14 | 12 | |
| 15 | 13 | def setup |
| 16 | - @spammable = Spammable.new | |
| 14 | + @spammable = SpammableContent.new | |
| 17 | 15 | @plugin = AntiSpamPlugin.new |
| 18 | 16 | end |
| 19 | 17 | |
| 20 | 18 | attr_accessor :spammable |
| 21 | 19 | |
| 22 | 20 | should 'check for spam and mark as spam if server says it is spam' do |
| 21 | + spammable.expects(:spam?).returns(true) | |
| 23 | 22 | spammable.expects(:save!) |
| 24 | 23 | |
| 25 | 24 | @plugin.check_for_spam(spammable) | ... | ... |