rakismet 0.3.6 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ .DS_Store
2
+ *.tmproj
3
+ tmtags
4
+ *.swp
5
+ coverage
6
+ rdoc
7
+ pkg
data/CHANGELOG CHANGED
@@ -1,3 +1,5 @@
1
+ = 0.3.6
2
+ * Allow attributes to fall through to methods or AR attributes
1
3
  = 0.3.5
2
4
  * Added gemspec and rails/init.rb so rakismet can work as a gem [Michael Air]
3
5
  * Added generator template and manifest [Michael Air]
data/README.md CHANGED
@@ -21,14 +21,16 @@ vendor/plugins/rakismet/generators/rakismet/templates/config/initializers/rakism
21
21
  As a gem
22
22
  --------
23
23
 
24
- `gem install rakismet` if you're using gemcutter or
25
- `gem install jfrench-rakismet` if you're using GitHub.
24
+ `gem install rakismet`
25
+
26
+ In config/environment.rb, require the gem by adding `config.gem 'rakismet'`
27
+ within the config block.
26
28
 
27
29
  From your app root, run `./script/generate rakismet` to create the Rakismet
28
30
  initializer.
29
31
 
30
32
  Getting Started
31
- ---------------
33
+ ===============
32
34
 
33
35
  Once you've installed Rakismet via your method of choice, you'll need an API
34
36
  key from the folks at WordPress. Head on over to http://wordpress.com/api-keys/
@@ -39,49 +41,19 @@ Edit config/initializers/rakismet.rb and fill in `Rakismet::URL` and
39
41
  from WordPress.
40
42
 
41
43
  If you wish to use another Akismet-compatible API provider such as TypePad's
42
- antispam service, you'll also need to change the `Rakismet::HOST`.
43
-
44
- Finally, introduce Rakismet to your application. Let's assume you have a
45
- Comment model and a CommentsController:
46
-
47
- class Comment < ActiveRecord::Base
48
- has_rakismet
49
- end
50
-
51
- class CommentsController < ActionController::Base
52
- has_rakismet
53
- end
54
-
55
-
56
- Basic Usage
57
- ===========
44
+ antispam service, you'll also need to change the `Rakismet::HOST` to your
45
+ service provider's endpoint.
58
46
 
59
- Rakismet provides three methods for interacting with Akismet:
60
-
61
- `spam?`
62
-
63
- From within a CommentsController action, simply call `@comment.spam?` to get a
64
- true/false response. True means it's spam, false means it's not. Well,
65
- usually; it's possible something went wrong and Akismet returned an error
66
- message. `@comment.spam?` will return false if this happens. You can check
67
- `@comment.akismet_response` to be certain; anything other than 'true' or
68
- 'false' means you got an error. That said, as long as you're collecting the
69
- data listed above it's probably sufficient to check `spam?` alone.
70
-
71
- `ham!` and `spam!`
72
-
73
- Akismet works best with your feedback. If you spot a comment that was
74
- erroneously marked as spam, `@comment.ham!` will resubmit to Akismet, marked
75
- as a false positive. Likewise if they missed a spammy comment,
76
- `@comment.spam!` will resubmit marked as spam.
47
+ Rakismet::Model
48
+ ---------------
77
49
 
50
+ First, introduce Rakismet to your model:
78
51
 
79
- What's Required in the Comment Model?
80
- =====================================
52
+ class Comment
53
+ include Rakismet::Model
54
+ end
81
55
 
82
- Rakismet sends the following information to the spam-hungry robots at Akismet.
83
- This means these attributes should be stored in your Comment model or
84
- accessible through that class's associations.
56
+ Rakismet sends the following information to the spam-hungry robots at Akismet:
85
57
 
86
58
  author : name submitted with the comment
87
59
  author_url : URL submitted with the comment
@@ -93,56 +65,92 @@ accessible through that class's associations.
93
65
  user_agent : user agent string
94
66
  referrer : http referer
95
67
 
96
- `user_ip`, `user_agent`, and `referrer` are optional; you don't have to store
97
- them, but it's a good idea. If you omit them from your model (see "Customizing
98
- Attributes"), the `spam?` method will attempt to extract these values from the
99
- current request object, if there is one. This means Rakismet can operate
100
- asynchronously by storing the request attributes and validating the comment at
101
- a later time. Or it can operate synchronously by plucking the request
102
- attributes from the environment at the time the comment is initially submitted
103
- and validating on the spot. The latter could work well with a before_create
104
- callback.
105
-
106
-
107
- Customizing the Comment Model
108
- =============================
68
+ By default, Rakismet just looks for attributes or methods on your class that
69
+ match these names. You don't have to have accessors that match these exactly,
70
+ however. If yours differ, just tell Rakismet what to call them:
109
71
 
110
- If your attribute names don't match those listed above, or if some of them
111
- live on other objects, you can pass `has_rakismet` a hash mapping the default
112
- attributes to your own. You can change the names, if your comment attributes
113
- don't match the defaults:
114
-
115
- class Comment < ActiveRecord::Base
116
- has_rakismet :author => :commenter_name,
117
- :author_email => :commenter_email
72
+ class Comment
73
+ include Rakismet::Model
74
+ attr_accessor :commenter_name, :commenter_email
75
+ rakismet_attributes :author => :commenter_name,
76
+ :author_email => :commenter_email
118
77
  end
119
78
 
120
79
  Or you can pass in a proc, to access associations:
121
80
 
122
81
  class Comment < ActiveRecord::Base
82
+ include Rakismet::Model
123
83
  belongs_to :author
124
- has_rakismet :author => proc { author.name },
125
- :author_email => proc { author.email }
84
+ rakismet_attributes :author => proc { author.name },
85
+ :author_email => proc { author.email }
126
86
  end
127
87
 
128
- For any attribute you don't specify, Rakismet will try to find an attribute or
129
- method matching the default name. As mentioned above, if `user_ip`,
130
- `user_agent`, and `referrer` are not present on your model, Rakismet will
131
- attempt to find them in the request environment when `spam?` is called from
132
- within a Rakismet-aware controller action.
88
+ Rakismet::Controller
89
+ --------------------
90
+ Perhaps you want to check a comment's spam status at creation time, and you
91
+ have no need to keep track of request-specific information such as the user's
92
+ IP, user agent, or referrer.
133
93
 
134
- Customizing the Comments Controller
135
- ===================================
94
+ You can add Rakismet to a controller and the IP, user agent, and referrer will
95
+ be taken from the current request instead of your model instance.
136
96
 
137
- Most of the time you won't be checking for spam on every action defined in
138
- your controller. If you only call `spam?` within `CommentsController#create`
139
- and you'd like to reduce filter overhead, `has_rakismet` takes `:only` and
140
- `:except` parameters that work like the standard before/around/after filter
141
- options.
97
+ class MyController < ActionController::Base
98
+ include Rakismet::Controller
99
+ end
142
100
 
143
- class CommentsController < ActionController::Base
144
- has_rakismet :only => :create
101
+ Since you probably won't be checking for spam in every action, Rakismet takes
102
+ `:only` and `:except` options just like other filters. You can reduce overhead
103
+ by specifying just the appropriate actions:
104
+
105
+ class MyController < ActionController::Base
106
+ include Rakismet::Controller
107
+ rakismet_filter :only => :create
145
108
  end
146
109
 
110
+ Checking For Spam
111
+ =================
112
+
113
+ Rakismet provides three methods for interacting with Akismet:
114
+
115
+ * `spam?`
116
+
117
+ Simply call `@comment.spam?` to get a true/false response. True means it's spam, false means it's not. Well, usually; it's possible something went wrong
118
+ and Akismet returned an error message. `@comment.spam?` will return false if
119
+ this happens. You can check `@comment.akismet_response` to be certain;
120
+ anything other than 'true' or 'false' means you got an error. That said, as
121
+ long as you're collecting the data listed above it's probably sufficient to
122
+ check `spam?` alone.
123
+
124
+ Keep in mind that if you call `spam?` from within a controller action that
125
+ uses the Rakismet filter, the user IP, user agent, and referrer will be taken
126
+ from the current request regardless of what your model attributes are. In
127
+ other words: if you're not verifying comments at the moment they're submitted,
128
+ you probably want to store those attributes rather than rely on the controller
129
+ methods.
130
+
131
+ * `ham!` and
132
+ * `spam!`
133
+
134
+ Akismet works best with your feedback. If you spot a comment that was
135
+ erroneously marked as spam, `@comment.ham!` will resubmit to Akismet, marked
136
+ as a false positive. Likewise if they missed a spammy comment,
137
+ `@comment.spam!` will resubmit marked as spam.
138
+
139
+ Updating from Rakismet < 0.4
140
+ ----------------------------
141
+ There were some significant changes to the API in version 0.4. This was done
142
+ to make Rakismet easier to use with persistence layers other than
143
+ ActiveRecord.
144
+
145
+ If you're updating from an older version, please note:
146
+
147
+ * Rakismet is no longer automatically injected into ActiveRecord and
148
+ ActionController. You'll need to manually include Rakismet with
149
+ `include Rakismet::Model` and `include Rakismet::Controller`.
150
+ * `ActiveRecord::Base#has_rakismet` now becomes
151
+ `Rakismet::Model#rakismet_attrs`.
152
+ * `ActionController::Base#has_rakismet` now becomes
153
+ `Rakismet::Controller#rakismet_filter`.
154
+
147
155
  --------------------------------------------------------------
148
156
  Copyright (c) 2008 Josh French, released under the MIT license
data/Rakefile ADDED
@@ -0,0 +1,26 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "rakismet"
8
+ gem.summary = %Q{Akismet and TypePad AntiSpam integration for Rails.}
9
+ gem.description = %Q{Rakismet is the easiest way to integrate Akismet or TypePad's AntiSpam into your Rails app.}
10
+ gem.email = "josh@digitalpulp.com"
11
+ gem.homepage = "http://github.com/jfrench/rakismet"
12
+ gem.authors = ["Josh French"]
13
+ gem.rubyforge_project = %q{rakismet}
14
+ end
15
+ Jeweler::GemcutterTasks.new
16
+ rescue LoadError
17
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
18
+ end
19
+
20
+ require 'spec/rake/spectask'
21
+ Spec::Rake::SpecTask.new(:spec) do |spec|
22
+ spec.libs << 'lib' << 'spec'
23
+ spec.spec_files = FileList['spec/**/*_spec.rb']
24
+ end
25
+
26
+ task :default => :spec
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :major: 0
3
+ :minor: 4
4
+ :patch: 0
data/install.rb ADDED
@@ -0,0 +1,7 @@
1
+ File.open(File.join(RAILS_ROOT, %w(config initializers rakismet.rb)) , 'w') do |f|
2
+ f.puts "Rakismet::KEY = ''"
3
+ f.puts "Rakismet::URL = ''"
4
+ f.puts "Rakismet::HOST = 'rest.akismet.com'"
5
+ end
6
+
7
+ puts "If you're updating from Rakismet < 0.4, please see the README for important changes to the API."
@@ -1,9 +1,10 @@
1
1
  module Rakismet
2
- module ControllerExtensions
2
+ module Controller
3
3
 
4
4
  def self.included(base)
5
5
  base.class_eval do
6
6
  extend ClassMethods
7
+ around_filter :rakismet
7
8
  end
8
9
  end
9
10
 
@@ -15,7 +16,7 @@ module Rakismet
15
16
  private :rakismet
16
17
 
17
18
  module ClassMethods
18
- def has_rakismet(opts={})
19
+ def rakismet_filter(opts={})
19
20
  skip_filter :rakismet # in case we're inheriting from another Rakismeted controller
20
21
  opts.assert_valid_keys(:only, :except)
21
22
  self.around_filter :rakismet, opts
@@ -1,5 +1,5 @@
1
1
  module Rakismet
2
- module ModelExtensions
2
+ module Model
3
3
 
4
4
  def self.included(base)
5
5
  base.class_eval do
@@ -7,11 +7,12 @@ module Rakismet
7
7
  class_inheritable_hash :akismet_attrs
8
8
  extend ClassMethods
9
9
  include InstanceMethods
10
+ self.rakismet_attrs
10
11
  end
11
12
  end
12
13
 
13
14
  module ClassMethods
14
- def has_rakismet(args={})
15
+ def rakismet_attrs(args={})
15
16
  self.akismet_attrs ||= {}
16
17
  [:comment_type, :author, :author_url, :author_email, :content].each do |field|
17
18
  # clunky, but throwing around +type+ will break your heart
data/lib/rakismet.rb CHANGED
@@ -1,15 +1,13 @@
1
1
  require 'net/http'
2
2
  require 'uri'
3
+ require 'yaml'
3
4
 
4
5
  module Rakismet
5
- module Version
6
- Major = '0'
7
- Minor = '3'
8
- Tiny = '6'
9
- end
10
-
11
6
  def self.version
12
- [Version::Major, Version::Minor, Version::Tiny].join('.')
7
+ @version ||= begin
8
+ version = YAML.load_file(File.join(File.dirname(__FILE__), %w(.. VERSION.yml)))
9
+ [version[:major], version[:minor], version[:patch]].join('.')
10
+ end
13
11
  end
14
12
 
15
13
  class Base
@@ -0,0 +1,54 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ ActionController::Routing::Routes.draw do |map|
4
+ map.connect ':controller/:action/:id'
5
+ end
6
+
7
+ class StubController < ActionController::Base
8
+ include Rakismet::Controller
9
+ def one ; render :nothing => true; end
10
+ def two ; render :nothing => true; end
11
+ end
12
+
13
+ describe StubController do
14
+
15
+ it "should set Rakismet::Base.rakismet_binding" do
16
+ Rakismet::Base.should_receive(:rakismet_binding=).twice
17
+ get :one
18
+ end
19
+
20
+ it "should return Rakismet::Base.rakismet_binding to nil after request" do
21
+ get :one
22
+ Rakismet::Base.rakismet_binding.should be_nil
23
+ end
24
+
25
+ it "should add around_filter" do
26
+ StubController.filter_chain.map(&:class).should include(ActionController::Filters::AroundFilter)
27
+ end
28
+ end
29
+
30
+ describe StubController.subclass('OnlyActions') { rakismet_filter(:only => :one) } do
31
+
32
+ it "should add around filter to specified actions" do
33
+ Rakismet::Base.should_receive(:rakismet_binding=).twice
34
+ get :one
35
+ end
36
+
37
+ it "should not add around filter to unspecified actions" do
38
+ Rakismet::Base.should_not_receive(:rakismet_binding=)
39
+ get :two
40
+ end
41
+ end
42
+
43
+ describe StubController.subclass('ExceptActions') { rakismet_filter(:except => :one) } do
44
+
45
+ it "should not add around filter to specified actions" do
46
+ Rakismet::Base.should_not_receive(:rakismet_binding=)
47
+ get :one
48
+ end
49
+
50
+ it "should add around filter to other actions" do
51
+ Rakismet::Base.should_receive(:rakismet_binding=).twice
52
+ get :two
53
+ end
54
+ end
@@ -0,0 +1,77 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe Rakismet::Base do
4
+
5
+ before do
6
+ load File.join(RAILS_ROOT, 'config', 'initializers', 'rakismet.rb')
7
+ end
8
+
9
+ describe ".validate_constants" do
10
+ it "should raise an error if key is not found" do
11
+ Rakismet::KEY = ""
12
+ lambda { Rakismet::Base.send(:validate_constants) }.should raise_error(Rakismet::Undefined)
13
+ end
14
+
15
+ it "should raise an error if url is not found" do
16
+ Rakismet::URL = ""
17
+ lambda { Rakismet::Base.send(:validate_constants) }.should raise_error(Rakismet::Undefined)
18
+ end
19
+
20
+ it "should raise an error if host is not found" do
21
+ Rakismet::HOST = ""
22
+ lambda { Rakismet::Base.send(:validate_constants) }.should raise_error(Rakismet::Undefined)
23
+ end
24
+ end
25
+
26
+ describe ".validate_key" do
27
+ it "should set @@valid_key = true if key is valid" do
28
+ Net::HTTP.stub!(:start).and_return([nil, 'valid'])
29
+ Rakismet::Base.validate_key
30
+ Rakismet::Base.valid_key?.should be_true
31
+ end
32
+
33
+ it "should set @@valid_key = false if key is invalid" do
34
+ Net::HTTP.stub!(:start).and_return([nil, 'invalid'])
35
+ Rakismet::Base.validate_key
36
+ Rakismet::Base.valid_key?.should be_false
37
+ end
38
+
39
+ it "should build url with host" do
40
+ host = "api.antispam.typepad.com"
41
+ Rakismet::HOST = host
42
+ Net::HTTP.should_receive(:start).with(host).and_yield(mock(:http).as_null_object)
43
+ Rakismet::Base.validate_key
44
+ end
45
+ end
46
+
47
+ describe ".akismet_call" do
48
+ before do
49
+ @http = mock(:http)
50
+ Net::HTTP.stub!(:start).and_yield(@http)
51
+ end
52
+
53
+ it "should build url with API key for the correct host" do
54
+ host = "api.antispam.typepad.com"
55
+ Rakismet::HOST = host
56
+ Net::HTTP.should_receive(:start).with("#{Rakismet::KEY}.#{host}").and_yield(mock(:http).as_null_object)
57
+ Rakismet::Base.send(:akismet_call, 'bogus-function')
58
+ end
59
+
60
+ it "should post data to named function" do
61
+ @http.should_receive(:post).with('/1.1/bogus-function', %r(foo=#{CGI.escape 'escape//this'}), Rakismet::HEADERS)
62
+ Rakismet::Base.send(:akismet_call, 'bogus-function', { :foo => 'escape//this' })
63
+ end
64
+
65
+ it "should return response.body" do
66
+ Net::HTTP.stub!(:start).and_return([nil, 'akismet response'])
67
+ Rakismet::Base.send(:akismet_call, 'bogus-function').should eql('akismet response')
68
+ end
69
+
70
+ it "should build query string when params are nil" do
71
+ lambda {
72
+ Rakismet::Base.send(:akismet_call, 'bogus-function', { :nil_param => nil })
73
+ }.should_not raise_error(NoMethodError)
74
+ end
75
+ end
76
+
77
+ end
@@ -0,0 +1,223 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+ require 'ostruct'
3
+
4
+ class AkismetModel
5
+ include Rakismet::Model
6
+ end
7
+
8
+ class StoredParams
9
+ include Rakismet::Model
10
+ attr_accessor :user_ip, :user_agent, :referrer
11
+ end
12
+
13
+ describe AkismetModel do
14
+
15
+ before do
16
+ @model = AkismetModel.new
17
+ comment_attrs.each_pair { |k,v| @model.stub!(k).and_return(v) }
18
+ end
19
+
20
+ it "should have default mappings" do
21
+ [:comment_type, :author, :author_email, :author_url, :content].each do |field|
22
+ fieldname = field.to_s =~ %r(^comment_) ? field : "comment_#{field}".intern
23
+ AkismetModel.akismet_attrs[fieldname].should eql(field)
24
+ end
25
+ end
26
+
27
+ it "should have nil placeholders for optional binding variables" do
28
+ [:user_ip, :user_agent, :referrer].each do |field|
29
+ AkismetModel.akismet_attrs.should have_key(field)
30
+ end
31
+ end
32
+
33
+ mapped_params = { :comment_type => :type2, :author => :author2, :content => :content2,
34
+ :author_email => :author_email2, :author_url => :author_url2 }
35
+
36
+ describe override = AkismetModel.subclass('Override') { rakismet_attrs(mapped_params.dup) } do
37
+ it "should override default mappings" do
38
+ [:comment_type, :author, :author_url, :author_email, :content].each do |field|
39
+ fieldname = field.to_s =~ %r(^comment_) ? field : "comment_#{field}".intern
40
+ override.akismet_attrs[fieldname].should eql(mapped_params[field])
41
+ end
42
+ end
43
+ end
44
+
45
+ extended_params = { :user_ip => :stored_ip, :user_agent => :stored_agent,
46
+ :referrer => :stored_referrer }
47
+
48
+ describe extended = AkismetModel.subclass('Extended') { rakismet_attrs(extended_params.dup) } do
49
+
50
+ before do
51
+ @extended = extended.new
52
+ attrs = comment_attrs(:stored_ip => '127.0.0.1', :stored_agent => 'RSpec', :stored_referrer => 'http://test.host/')
53
+ attrs.each_pair { |k,v| @extended.stub!(k).and_return(v) }
54
+ end
55
+
56
+ it "should extend optional mappings" do
57
+ [:user_ip, :user_agent, :referrer].each do |field|
58
+ extended.akismet_attrs[field].should eql(extended_params[field])
59
+ end
60
+ end
61
+
62
+ describe ".spam!" do
63
+ it "should use stored request vars if available" do
64
+ Rakismet::Base.should_receive(:akismet_call).
65
+ with('submit-spam', akismet_attrs(:user_ip => '127.0.0.1', :user_agent => 'RSpec',
66
+ :referrer => 'http://test.host/'))
67
+ @extended.spam!
68
+ end
69
+ end
70
+
71
+ describe ".ham!" do
72
+ it "should use stored request vars if available" do
73
+ Rakismet::Base.should_receive(:akismet_call).
74
+ with('submit-ham', akismet_attrs(:user_ip => '127.0.0.1', :user_agent => 'RSpec',
75
+ :referrer => 'http://test.host/'))
76
+ @extended.ham!
77
+ end
78
+ end
79
+ end
80
+
81
+ @proc = proc { author.reverse }
82
+ block_params = { :author => @proc }
83
+
84
+ describe block = AkismetModel.subclass('Block') { rakismet_attrs(block_params) } do
85
+
86
+ before do
87
+ @block = block.new
88
+ comment_attrs.each_pair { |k,v| @block.stub!(k).and_return(v) }
89
+ end
90
+
91
+ it "should accept a block" do
92
+ block.akismet_attrs[:author].should eql(@proc)
93
+ end
94
+
95
+ it "should eval block with self = instance" do
96
+ data = @block.send(:akismet_data)
97
+ data[:comment_author].should eql(comment_attrs[:author].reverse)
98
+ end
99
+ end
100
+
101
+ extra_params = { :extra => :extra, :another => lambda { } }
102
+
103
+ describe extra = AkismetModel.subclass('ExtraParams') { rakismet_attrs(extra_params.dup) } do
104
+ it "should map additional attributes" do
105
+ [:extra, :another].each do |field|
106
+ extra.akismet_attrs[field].should eql(extra_params[field])
107
+ end
108
+ end
109
+ end
110
+
111
+ string_params = { :comment_type => 'pingback' }
112
+
113
+ describe string = AkismetModel.subclass('StringParams') { rakismet_attrs(string_params) } do
114
+
115
+ before do
116
+ @string = string.new
117
+ comment_attrs.each_pair { |k,v| @string.stub!(k).and_return(v) }
118
+ end
119
+
120
+ it "should map string attributes" do
121
+ @string.send(:akismet_data)[:comment_type].should eql('pingback')
122
+ end
123
+ end
124
+
125
+ describe ".spam?" do
126
+
127
+ before do
128
+ Rakismet::Base.rakismet_binding = request_binding
129
+ end
130
+
131
+ it "should eval request variables in context of Base.rakismet_binding" do
132
+ Rakismet::Base.should_receive(:akismet_call).
133
+ with('comment-check', akismet_attrs.merge(:user_ip => '127.0.0.1',
134
+ :user_agent => 'RSpec',
135
+ :referrer => 'http://test.host/referrer'))
136
+ @model.spam?
137
+ end
138
+
139
+ it "should be true if comment is spam" do
140
+ Rakismet::Base.stub!(:akismet_call).and_return('true')
141
+ @model.should be_spam
142
+ end
143
+
144
+ it "should be false if comment is not spam" do
145
+ Rakismet::Base.stub!(:akismet_call).and_return('false')
146
+ @model.should_not be_spam
147
+ end
148
+
149
+ it "should set last_akismet_response" do
150
+ Rakismet::Base.stub!(:akismet_call).and_return('response')
151
+ @model.spam?
152
+ @model.akismet_response.should eql('response')
153
+ end
154
+
155
+ it "should not throw an error if request vars are missing" do
156
+ Rakismet::Base.rakismet_binding = nil_binding
157
+ lambda { @model.spam? }.should_not raise_error(NoMethodError)
158
+ end
159
+ end
160
+
161
+ describe StoredParams do
162
+ before do
163
+ Rakismet::Base.rakismet_binding = nil
164
+ @model = StoredParams.new
165
+ comment_attrs.each_pair { |k,v| @model.stub!(k).and_return(v) }
166
+ end
167
+
168
+ it "should use local values if Rakismet binding is not present" do
169
+ @model.user_ip = '127.0.0.1'
170
+ @model.user_agent = 'RSpec'
171
+ @model.referrer = 'http://test.host/referrer'
172
+
173
+ Rakismet::Base.should_receive(:akismet_call).
174
+ with('comment-check', akismet_attrs.merge(:user_ip => '127.0.0.1',
175
+ :user_agent => 'RSpec',
176
+ :referrer => 'http://test.host/referrer'))
177
+ @model.spam?
178
+ end
179
+ end
180
+
181
+ describe ".spam!" do
182
+ it "should call Base.akismet_call with submit-spam" do
183
+ Rakismet::Base.should_receive(:akismet_call).with('submit-spam', akismet_attrs)
184
+ @model.spam!
185
+ end
186
+ end
187
+
188
+ describe ".ham!" do
189
+ it "should call Base.akismet_call with submit-ham" do
190
+ Rakismet::Base.should_receive(:akismet_call).with('submit-ham', akismet_attrs)
191
+ @model.ham!
192
+ end
193
+ end
194
+
195
+ private
196
+
197
+ def comment_attrs(attrs={})
198
+ { :comment_type => 'test', :author => 'Rails test',
199
+ :author_email => 'test@test.host', :author_url => 'test.host',
200
+ :content => 'comment content', :blog => Rakismet::URL }.merge(attrs)
201
+ end
202
+
203
+ def akismet_attrs(attrs={})
204
+ { :comment_type => 'test', :comment_author_email => 'test@test.host',
205
+ :comment_author => 'Rails test', :comment_author_url => 'test.host',
206
+ :comment_content => 'comment content' }.merge(attrs)
207
+ end
208
+
209
+ def request_binding
210
+ request = OpenStruct.new(:remote_ip => '127.0.0.1',
211
+ :user_agent => 'RSpec',
212
+ :referer => 'http://test.host/referrer')
213
+ binding
214
+ end
215
+
216
+ def nil_binding
217
+ request = OpenStruct.new(:remote_ip => nil,
218
+ :user_agent => nil,
219
+ :referer => nil)
220
+ binding
221
+ end
222
+
223
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1,6 @@
1
+ --colour
2
+ --format
3
+ progress
4
+ --loadby
5
+ mtime
6
+ --reverse
@@ -0,0 +1,28 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+ require File.expand_path(File.dirname(__FILE__) + "/../../../../config/environment")
3
+ require 'spec'
4
+ require 'spec/rails'
5
+
6
+ Spec::Runner.configure do |config|
7
+
8
+ end
9
+
10
+ class Class
11
+ # Creates a new subclass of self, with a name "under" our own name. Example:
12
+ #
13
+ # x = Foo::Bar.subclass('Zap'){}
14
+ # x.name # => Foo::Bar::Zap_1
15
+ # x.superclass.name # => Foo::Bar
16
+ #
17
+ # Removed from RSpec after 1.1.something; reproduced here because much of the
18
+ # spec suite was already written with dynamic class creation.
19
+ def subclass(base_name, &body)
20
+ klass = Class.new(self)
21
+ class_name = "#{self.name}_#{base_name}"
22
+ instance_eval do
23
+ const_set(class_name, klass)
24
+ end
25
+ klass.instance_eval(&body)
26
+ klass
27
+ end
28
+ end
data/uninstall.rb ADDED
@@ -0,0 +1 @@
1
+ File.delete(File.join(RAILS_ROOT, %w(config initializers rakismet.rb)))
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rakismet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.6
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh French
@@ -9,11 +9,11 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-05 00:00:00 -05:00
12
+ date: 2010-02-25 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
16
- description: Rakismet is easy Akismet integration with your Rails app, including support for TypePad's AntiSpam service.
16
+ description: Rakismet is the easiest way to integrate Akismet or TypePad's AntiSpam into your Rails app.
17
17
  email: josh@digitalpulp.com
18
18
  executables: []
19
19
 
@@ -21,24 +21,31 @@ extensions: []
21
21
 
22
22
  extra_rdoc_files:
23
23
  - README.md
24
- - MIT-LICENSE
25
24
  files:
25
+ - .gitignore
26
26
  - CHANGELOG
27
- - README.md
28
27
  - MIT-LICENSE
29
- - rails/init.rb
30
- - lib/rakismet.rb
31
- - lib/rakismet/controller_extensions.rb
32
- - lib/rakismet/model_extensions.rb
28
+ - README.md
29
+ - Rakefile
30
+ - VERSION.yml
33
31
  - generators/rakismet/rakismet_generator.rb
34
32
  - generators/rakismet/templates/config/initializers/rakismet.rb
33
+ - install.rb
34
+ - lib/rakismet.rb
35
+ - lib/rakismet/controller.rb
36
+ - lib/rakismet/model.rb
37
+ - spec/controllers/rakismet_controller_spec.rb
38
+ - spec/models/base_spec.rb
39
+ - spec/models/rakismet_model_spec.rb
40
+ - spec/spec.opts
41
+ - spec/spec_helper.rb
42
+ - uninstall.rb
35
43
  has_rdoc: true
36
44
  homepage: http://github.com/jfrench/rakismet
37
45
  licenses: []
38
46
 
39
47
  post_install_message:
40
48
  rdoc_options:
41
- - --inline-source
42
49
  - --charset=UTF-8
43
50
  require_paths:
44
51
  - lib
@@ -57,9 +64,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
57
64
  requirements: []
58
65
 
59
66
  rubyforge_project: rakismet
60
- rubygems_version: 1.3.4
67
+ rubygems_version: 1.3.5
61
68
  signing_key:
62
69
  specification_version: 3
63
- summary: Rakismet is easy Akismet integration with your Rails app, including support for TypePad's AntiSpam service.
64
- test_files: []
65
-
70
+ summary: Akismet and TypePad AntiSpam integration for Rails.
71
+ test_files:
72
+ - spec/controllers/rakismet_controller_spec.rb
73
+ - spec/models/base_spec.rb
74
+ - spec/models/rakismet_model_spec.rb
75
+ - spec/spec_helper.rb
data/rails/init.rb DELETED
@@ -1,2 +0,0 @@
1
- ActionController::Base.send :include, Rakismet::ControllerExtensions
2
- ActiveRecord::Base.send :include, Rakismet::ModelExtensions