despamilator_rails 1.0.1 → 1.1

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
+ .bundle
2
+ .idea
3
+ coverage
4
+ *.gem
5
+ pkg/
6
+ *.sqlite3
7
+ doc/
data/Gemfile CHANGED
@@ -1,17 +1,19 @@
1
1
  # A sample Gemfile
2
2
  source "http://rubygems.org"
3
3
 
4
- gem 'hoe', '>= 2.7.0'
5
- gem 'newgem', '>= 1.5.3'
6
- gem 'activesupport', '>= 2.3.10'
7
-
8
- # while we're fetching from git, we need to execute everything with 'bundle exec'
9
- #gem 'despamilator', :git => 'git://github.com/moowahaha/despamilator.git'
10
4
  gem 'despamilator', '>= 1.0'
5
+ gem 'activemodel', '>= 3.0.0'
11
6
 
12
7
  group :test do
8
+ gem 'activerecord', '>= 3.0.0'
9
+ gem 'dm-migrations', '>= 1.0.2'
10
+ gem 'dm-validations', '>= 1.0.2'
11
+ gem 'dm-sqlite-adapter', '>= 1.0.2'
13
12
  gem 'rspec', '>= 2.4.0'
14
13
  gem 'sqlite3', '>= 0.1.1'
15
- gem 'activerecord', '>= 2.3.10'
16
14
  gem 'one_hundred_percent_coverage'
17
15
  end
16
+
17
+ group :development do
18
+ gem 'ruby-debug19'
19
+ end
data/Gemfile.lock CHANGED
@@ -1,22 +1,46 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- RedCloth (4.2.3)
5
- activerecord (2.3.10)
6
- activesupport (= 2.3.10)
7
- activesupport (2.3.10)
4
+ activemodel (3.0.3)
5
+ activesupport (= 3.0.3)
6
+ builder (~> 2.1.2)
7
+ i18n (~> 0.4)
8
+ activerecord (3.0.3)
9
+ activemodel (= 3.0.3)
10
+ activesupport (= 3.0.3)
11
+ arel (~> 2.0.2)
12
+ tzinfo (~> 0.3.23)
13
+ activesupport (3.0.3)
14
+ addressable (2.2.2)
15
+ archive-tar-minitar (0.5.2)
16
+ arel (2.0.6)
17
+ builder (2.1.2)
18
+ columnize (0.3.2)
19
+ data_objects (0.10.2)
20
+ addressable (~> 2.1)
8
21
  despamilator (1.0)
9
22
  diff-lcs (1.1.2)
23
+ dm-core (1.0.2)
24
+ addressable (~> 2.2)
25
+ extlib (~> 0.9.15)
26
+ dm-do-adapter (1.0.2)
27
+ data_objects (~> 0.10.2)
28
+ dm-core (~> 1.0.2)
29
+ dm-migrations (1.0.2)
30
+ dm-core (~> 1.0.2)
31
+ dm-sqlite-adapter (1.0.2)
32
+ dm-do-adapter (~> 1.0.2)
33
+ do_sqlite3 (~> 0.10.2)
34
+ dm-validations (1.0.2)
35
+ dm-core (~> 1.0.2)
36
+ do_sqlite3 (0.10.2)
37
+ data_objects (= 0.10.2)
38
+ extlib (0.9.15)
10
39
  ffi (1.0.4)
11
40
  rake (>= 0.8.7)
12
- hoe (2.8.0)
13
- rake (>= 0.8.7)
14
- newgem (1.5.3)
15
- RedCloth (>= 4.1.1)
16
- activesupport (~> 2.3.4)
17
- hoe (>= 2.4.0)
18
- rubigen (>= 1.5.3)
19
- syntax (>= 1.0.0)
41
+ i18n (0.5.0)
42
+ linecache19 (0.5.11)
43
+ ruby_core_source (>= 0.1.4)
20
44
  one_hundred_percent_coverage (0.0.2)
21
45
  simplecov (>= 0.3.7)
22
46
  rake (0.8.7)
@@ -28,24 +52,34 @@ GEM
28
52
  rspec-expectations (2.4.0)
29
53
  diff-lcs (~> 1.1.2)
30
54
  rspec-mocks (2.4.0)
31
- rubigen (1.5.5)
32
- activesupport (~> 2.3.5)
55
+ ruby-debug-base19 (0.11.24)
56
+ columnize (>= 0.3.1)
57
+ linecache19 (>= 0.5.11)
58
+ ruby_core_source (>= 0.1.4)
59
+ ruby-debug19 (0.11.6)
60
+ columnize (>= 0.3.1)
61
+ linecache19 (>= 0.5.11)
62
+ ruby-debug-base19 (>= 0.11.19)
63
+ ruby_core_source (0.1.4)
64
+ archive-tar-minitar (>= 0.5.2)
33
65
  simplecov (0.3.7)
34
66
  simplecov-html (>= 0.3.7)
35
67
  simplecov-html (0.3.9)
36
68
  sqlite3 (0.1.1)
37
69
  ffi (>= 0.6.3)
38
- syntax (1.0.0)
70
+ tzinfo (0.3.23)
39
71
 
40
72
  PLATFORMS
41
73
  ruby
42
74
 
43
75
  DEPENDENCIES
44
- activerecord (>= 2.3.10)
45
- activesupport (>= 2.3.10)
76
+ activemodel (>= 3.0.0)
77
+ activerecord (>= 3.0.0)
46
78
  despamilator (>= 1.0)
47
- hoe (>= 2.7.0)
48
- newgem (>= 1.5.3)
79
+ dm-migrations (>= 1.0.2)
80
+ dm-sqlite-adapter (>= 1.0.2)
81
+ dm-validations (>= 1.0.2)
49
82
  one_hundred_percent_coverage
50
83
  rspec (>= 2.4.0)
84
+ ruby-debug19
51
85
  sqlite3 (>= 0.1.1)
data/History.txt CHANGED
@@ -5,3 +5,9 @@
5
5
  * Better syntactic sugar.
6
6
  * Behaves much more like a regular ActiveRecord validation routine.
7
7
  * Load of tests.
8
+
9
+ === 1.1 2011-02-01
10
+
11
+ * DataMapper support.
12
+ * Exclusive support of Rails 3.
13
+ * Major refactorage.
data/Manifest.txt CHANGED
@@ -12,4 +12,3 @@ spec/active_record_integration_spec.rb
12
12
  spec/despamilator_rails_spec.rb
13
13
  spec/fixtures/active_record_test_class.rb
14
14
  spec/spec_helper.rb
15
- spec/test_db_migrations/create_test_model_table.rb
data/README.rdoc CHANGED
@@ -5,18 +5,14 @@
5
5
  == DESCRIPTION:
6
6
 
7
7
  Spam detection plugin for Rails & ActiveRecord. Uses all the standard Rails conventions and
8
- my Despamilator gem.
8
+ my Despamilator gem. This gem only supports Rails 3. See despamilator_rails2 for Rails 2 support.
9
9
 
10
10
  == FEATURES/PROBLEMS:
11
11
 
12
12
  * To fix the iconv error when developing with Ruby 1.9.2 and RVM,
13
13
  see: http://blog.footle.org/2010/07/29/installing-ruby-1-9-2-via-rvm-on-os-x/ .
14
14
 
15
- * Stuck with lower version of ActiveRecord in Gemfile until Hoe is fixed to support
16
- newer versions.
17
-
18
- * DataMapper not yet supported. That's on the list!
19
-
15
+ * Does not support Rails 2. See despamilator_rails2 for support.
20
16
 
21
17
  == SYNOPSIS:
22
18
 
data/Rakefile CHANGED
@@ -1,23 +1,14 @@
1
1
  require 'rubygems'
2
- gem 'hoe', '>= 2.1.0'
3
- require 'hoe'
4
2
  require 'fileutils'
5
3
  require './lib/despamilator_rails'
6
4
 
7
- Hoe.plugin :newgem
5
+ task :default => [:test]
8
6
 
9
- $hoe = Hoe.spec 'despamilator_rails' do
10
- self.developer 'Stephen Hardisty', 'moowahaha@hotmail.com'
11
- self.rubyforge_name = self.name
12
- self.extra_deps = [['despamilator','>= 1.0'], ['activerecord', '>= 2.3.2']]
7
+ desc "Run specs"
8
+ task :test do
9
+ sh "rspec spec"
13
10
  end
14
11
 
15
- require 'newgem/tasks'
16
- Dir['tasks/**/*.rake'].each { |t| load t }
17
-
18
- task :default => [:spec]
19
- task :test => [:spec]
20
-
21
12
  desc "Generate appropriate rdoc"
22
13
  task :rdoc do
23
14
  sh "rdoc README.rdoc lib/despamilator_rails.rb"
@@ -28,3 +19,8 @@ task :cultivate do
28
19
  sh "touch Manifest.txt; rake check_manifest |grep -v \"(in \" | patch"
29
20
  sh "rake debug_gem | grep -v \"(in \" > `basename \\`pwd\\``.gemspec"
30
21
  end
22
+
23
+ desc "Build the gem"
24
+ task :package do
25
+ sh "gem build despamilator-rails.gemspec"
26
+ end
@@ -2,21 +2,21 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{despamilator_rails}
5
- s.version = "1.0"
5
+ s.version = "1.1"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Stephen Hardisty"]
9
9
  s.date = %q{2011-01-09}
10
- s.description = %q{FIX (describe your package)}
10
+ s.description = %q{Adds a Rails-esque validation method for use in Rails 3 with ActiveRecord or DataMapper}
11
11
  s.email = ["moowahaha@hotmail.com"]
12
12
  s.extra_rdoc_files = ["History.txt", "Manifest.txt"]
13
- s.files = [".rspec", ".rvmrc", "Gemfile", "Gemfile.lock", "History.txt", "Manifest.txt", "README.rdoc", "Rakefile", "despamilator-rails.gemspec", "lib/despamilator_rails.rb", "spec/active_record_integration_spec.rb", "spec/despamilator_rails_spec.rb", "spec/fixtures/active_record_test_class.rb", "spec/spec_helper.rb", "spec/test_db_migrations/create_test_model_table.rb"]
13
+ s.files = `git ls-files`.split("\n")
14
14
  s.homepage = %q{https://github.com/moowahaha/despamilator-rails}
15
- s.rdoc_options = ["--main", "README.rdoc"]
15
+ s.rdoc_options = ["lib/despamilator_rails.rb", "README.rdoc"]
16
16
  s.require_paths = ["lib"]
17
17
  s.rubyforge_project = %q{despamilator_rails}
18
18
  s.rubygems_version = %q{1.3.7}
19
- s.summary = %q{FIX (describe your package)}
19
+ s.summary = %q{Anti-spam validation hooks for Rails.}
20
20
 
21
21
  if s.respond_to? :specification_version then
22
22
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
@@ -24,16 +24,13 @@ Gem::Specification.new do |s|
24
24
 
25
25
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
26
26
  s.add_runtime_dependency(%q<despamilator>, [">= 1.0"])
27
- s.add_runtime_dependency(%q<activesupport>, [">= 2.3.2"])
28
- s.add_development_dependency(%q<hoe>, [">= 2.8.0"])
27
+ s.add_runtime_dependency(%q<activemodel>, [">= 3.0.0"])
29
28
  else
30
29
  s.add_dependency(%q<despamilator>, [">= 1.0"])
31
- s.add_dependency(%q<activesupport>, [">= 2.3.2"])
32
- s.add_dependency(%q<hoe>, [">= 2.8.0"])
30
+ s.add_dependency(%q<activemodel>, [">= 3.0.0"])
33
31
  end
34
32
  else
35
33
  s.add_dependency(%q<despamilator>, [">= 1.0"])
36
- s.add_dependency(%q<activesupport>, [">= 2.3.2"])
37
- s.add_dependency(%q<hoe>, [">= 2.8.0"])
34
+ s.add_dependency(%q<activemodel>, [">= 3.0.0"])
38
35
  end
39
36
  end
@@ -1,102 +1,90 @@
1
1
  require 'despamilator'
2
- require 'active_record'
2
+ require 'active_model'
3
3
 
4
- module DespamilatorRails
5
- VERSION = "1.0.1"
4
+ Dir.glob(File.join(File.dirname(__FILE__), 'despamilator_rails', '*.rb')) do |file|
5
+ require file
6
6
  end
7
7
 
8
- module ActiveRecord
9
-
10
- class Base
11
-
12
- # Somewhere (such as your environment.rb...)
13
- #
14
- # require 'despamilator_rails'
15
- #
16
- # In your model (basic example):
17
- #
18
- # class YourModel < ActiveRecord::Base
19
- # validate_with_despamilator :attributes => [:some_field]
20
- # end
21
- #
22
- # When "some_field" is assigned a spammy value, it will add to the errors. For example...
23
- #
24
- # YourModel.new(:some_field => spammy_value).save! #=> ActiveRecord::RecordInvalid exception!
25
- #
26
- # Or...
27
- #
28
- # your_instance = YourModel.new(:some_field => spammy_value)
29
- # your_instance.save
30
- # your_instance.errors.full_messages.should #=> ["Some field looks like spam"]
31
- #
32
- # If you want to configure the threshold (which defaults to 1) or add your own callback, you can do the following:
33
- #
34
- # class YourModel < ActiveRecord::Base
35
- # validate_with_despamilator :attributes => [:some_field], :threshold => 1 do |field, value, despamilator|
36
- # raise "spam! field: #{field}, value: #{value}, score: #{despamailtor.score}"
37
- # end
38
- # end
39
- #
40
- # This example will...
41
- #
42
- # your_instance = YourModel.new(:some_field => "spammy string")
43
- # your_instance.save! #=> Exception "spam! field: some_field, value: spammy string, score: 123"
44
- #
45
- # The callback will receive the field name, the value and the instance of the Despamilator class.
46
-
47
- def self.validate_with_despamilator settings, &block
48
- assign_despamilator_attributes settings
49
- assign_despamilator_threshold settings
50
- assign_despamilator_callback block
51
-
52
- add_despamilator_validation settings
53
- end
54
-
55
- private
56
-
57
- class << self
58
-
59
- def add_despamilator_validation settings
60
-
61
- send(validation_method(:save), settings) do |record|
62
-
63
- record.despamilator_checked_attributes.each do |attribute|
64
- text = record.send(attribute)
65
- dspam = Despamilator.new(text)
8
+ class DespamilatorActiveRecordValidator < ActiveModel::EachValidator
9
+ def validate_each(record, attribute, text)
10
+ dspam = Despamilator.new(text)
11
+ record.despamilator_callback(attribute, text, dspam) if dspam.score >= record.despamilator_threshold
12
+ end
13
+ end
66
14
 
67
- record.despamilator_callback(attribute, text, dspam) if dspam.score >= record.despamilator_threshold
68
- end
15
+ module DespamilatorRails
69
16
 
70
- end
17
+ # In your model (basic example):
18
+ #
19
+ # class YourModel < ActiveRecord::Base
20
+ # validate_with_despamilator :attributes => [:some_field]
21
+ # end
22
+ #
23
+ # When "some_field" is assigned a spammy value, it will add to the errors. For example...
24
+ #
25
+ # YourModel.new(:some_field => spammy_value).save! #=> ActiveRecord::RecordInvalid exception!
26
+ #
27
+ # Or...
28
+ #
29
+ # your_instance = YourModel.new(:some_field => spammy_value)
30
+ # your_instance.save
31
+ # your_instance.errors.full_messages.should #=> ["Some field looks like spam"]
32
+ #
33
+ # Note that, by default, DataMapper behaves slightly differently in that it will not raise exceptions
34
+ # unless you code a callback to deal with that. Instead it will return "false" on an unsuccessful save.
35
+ #
36
+ # If you want to configure the threshold (which defaults to 1) or add your own callback, you can do the following:
37
+ #
38
+ # class YourModel < ActiveRecord::Base
39
+ # validate_with_despamilator :attributes => [:some_field], :threshold => 1 do |field, value, despamilator|
40
+ # raise "spam! field: #{field}, value: #{value}, score: #{despamailtor.score}"
41
+ # end
42
+ # end
43
+ #
44
+ # This example will...
45
+ #
46
+ # your_instance = YourModel.new(:some_field => "spammy string")
47
+ # your_instance.save! #=> Exception "spam! field: some_field, value: spammy string, score: 123"
48
+ #
49
+ # The callback will receive the field name, the value and the instance of the Despamilator class.
50
+
51
+ def validate_with_despamilator settings, & block
52
+ extend(respond_to?(:validates_with_block) ? DespamilatorRails::DataMapperValidator : DespamilatorRails::ActiveRecordValidator)
53
+
54
+ assign_despamilator_threshold settings
55
+ assign_despamilator_callback block
56
+
57
+ add_despamilator_validation settings
58
+ end
71
59
 
72
- end
60
+ private
73
61
 
74
- def assign_despamilator_attributes(settings)
75
- clean_attributes = settings[:attributes].reject do |attribute|
76
- attribute.blank?
77
- end
62
+ def add_despamilator_validation settings
78
63
 
79
- raise('At least one attribute must be defined') if clean_attributes.empty?
64
+ clean_despamilator_attributes(settings).each do |attribute|
65
+ setup_despamilation_detection_for attribute
66
+ end
80
67
 
81
- define_method(:despamilator_checked_attributes, lambda { clean_attributes })
82
- end
68
+ end
83
69
 
84
- def assign_despamilator_threshold(settings)
85
- define_method(:despamilator_threshold, lambda { settings[:threshold] || 1 })
86
- end
70
+ def clean_despamilator_attributes(settings)
71
+ clean_attributes = settings[:attributes].reject do |attribute|
72
+ attribute.blank?
73
+ end
87
74
 
88
- def assign_despamilator_callback(block)
89
- define_method(:despamilator_callback, block || default_despamilator_detection_response)
90
- end
75
+ raise('At least one attribute must be defined') if clean_attributes.empty?
91
76
 
92
- def default_despamilator_detection_response
93
- lambda { |attribute, value, dspam|
94
- errors.add(attribute, "looks like spam")
95
- }
96
- end
77
+ clean_attributes
78
+ end
97
79
 
98
- end
80
+ def assign_despamilator_threshold(settings)
81
+ define_method(:despamilator_threshold, lambda { settings[:threshold] || 1 })
82
+ end
99
83
 
84
+ def assign_despamilator_callback(block)
85
+ define_method(:despamilator_callback, block || default_despamilator_detection_response)
100
86
  end
101
87
 
102
88
  end
89
+
90
+ Module.send(:include, DespamilatorRails)
@@ -0,0 +1,15 @@
1
+ module DespamilatorRails
2
+ module ActiveRecordValidator
3
+
4
+ def setup_despamilation_detection_for attribute
5
+ validates attribute, :despamilator_active_record => true
6
+ end
7
+
8
+ def default_despamilator_detection_response
9
+ lambda { |attribute, value, dspam|
10
+ errors.add(attribute, "looks like spam")
11
+ }
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ module DespamilatorRails
2
+ module DataMapperValidator
3
+
4
+ def setup_despamilation_detection_for attribute
5
+
6
+ validates_with_block attribute do
7
+ text = send(attribute)
8
+ dspam = Despamilator.new(text)
9
+ despamilator_callback(attribute, text, dspam) if dspam.score >= despamilator_threshold
10
+ end
11
+
12
+ end
13
+
14
+ def default_despamilator_detection_response
15
+ lambda { |attribute, value, dspam|
16
+ [false, "looks like spam"]
17
+ }
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,18 @@
1
+ describe SomeActiveRecordModel do
2
+
3
+ it_should_behave_like "a spam protected model"
4
+
5
+ it "should notify of spam detection in a railsy way" do
6
+
7
+ class SomeActiveRecordModelWithSpam < SomeActiveRecordModel
8
+ validate_with_despamilator :attributes => [:some_field]
9
+ end
10
+
11
+ some_model = SomeActiveRecordModelWithSpam.new
12
+ some_model.some_field = Despamilator.gtubs_test_string
13
+
14
+ -> {some_model.save!}.should raise_error(ActiveRecord::RecordInvalid)
15
+ some_model.errors.full_messages.should == ["Some field looks like spam"]
16
+ end
17
+
18
+ end
@@ -0,0 +1,17 @@
1
+ describe SomeDataMapperModel do
2
+
3
+ it_should_behave_like "a spam protected model"
4
+
5
+ it "should notify of spam detection in a railsy way" do
6
+
7
+ class SomeDataMapperModelWithSpam < SomeDataMapperModel
8
+ validate_with_despamilator :attributes => [:some_field]
9
+ end
10
+
11
+ some_model = SomeDataMapperModelWithSpam.new
12
+ some_model.some_field = Despamilator.gtubs_test_string
13
+
14
+ some_model.save.should be_false
15
+ some_model.errors.first.should == ["looks like spam"]
16
+ end
17
+ end
@@ -1,5 +1,11 @@
1
- class SomeModel < ActiveRecord::Base
1
+ require 'active_record'
2
2
 
3
- validate_with_despamilator :attributes => [:some_field]
3
+ class SomeActiveRecordModel < ActiveRecord::Base
4
+
5
+ establish_connection :adapter => 'sqlite3', :database => 'test.sqlite3'
6
+
7
+ connection.create_table table_name, :force => true do |t|
8
+ t.text :some_field
9
+ end
4
10
 
5
11
  end
@@ -0,0 +1,15 @@
1
+ require 'dm-migrations'
2
+ require 'dm-validations'
3
+
4
+ class SomeDataMapperModel
5
+
6
+ DataMapper.setup(:default, 'sqlite::memory:')
7
+
8
+ include DataMapper::Resource
9
+
10
+ property :id, Serial
11
+ property :some_field, Text
12
+
13
+ end
14
+
15
+ DataMapper.auto_migrate!
@@ -0,0 +1,97 @@
1
+ shared_examples_for "a spam protected model" do
2
+
3
+ before do
4
+ Object.send(:remove_const, :TestClass) if Module.constants.include?(:TestClass)
5
+ end
6
+
7
+ it "should be just fine when no spam is passed" do
8
+ some_instance = described_class.new
9
+ some_instance.some_field = 'hello'
10
+
11
+ some_instance.save.should be_true
12
+ end
13
+
14
+ it "should check for spam on save" do
15
+
16
+ class TestClass < described_class
17
+ validate_with_despamilator :attributes => [:some_field]
18
+ end
19
+
20
+ some_instance = TestClass.new
21
+ some_instance.some_field = Despamilator.gtubs_test_string
22
+
23
+ some_instance.save.should be_false
24
+ end
25
+
26
+ describe "threshold" do
27
+
28
+ it "should default to 1" do
29
+
30
+ class TestClass < described_class
31
+ validate_with_despamilator :attributes => [:some_field]
32
+ end
33
+
34
+ some_model = TestClass.new
35
+ some_model.despamilator_threshold.should == 1
36
+ end
37
+
38
+ it "should be settable" do
39
+
40
+ class TestClass < described_class
41
+ validate_with_despamilator :attributes => [:some_field], :threshold => 9
42
+ end
43
+
44
+ some_model = TestClass.new
45
+ some_model.despamilator_threshold.should == 9
46
+
47
+ end
48
+
49
+ end
50
+
51
+ describe "attributes" do
52
+
53
+ it "should cause an exception when an empty array is passed" do
54
+
55
+ ->{
56
+ class TestClass < described_class
57
+ validate_with_despamilator :attributes => []
58
+ end
59
+ }.should raise_error('At least one attribute must be defined')
60
+
61
+ end
62
+
63
+ it "should cause an exception when an empty string is passed" do
64
+
65
+ -> {
66
+ class TestClass < described_class
67
+ validate_with_despamilator :attributes => ['']
68
+ end
69
+ }.should raise_error('At least one attribute must be defined')
70
+
71
+ end
72
+
73
+ end
74
+
75
+ it "should allow a block to be specified" do
76
+
77
+ class TestClass < described_class
78
+ def do_something field, value, despamilator
79
+ end
80
+
81
+ validate_with_despamilator :attributes => [:some_field] do |field, value, despamilator|
82
+ do_something(field, value, despamilator)
83
+ end
84
+ end
85
+
86
+ fake_despamilator = mock('despamilator')
87
+ Despamilator.should_receive(:new).and_return(fake_despamilator)
88
+ fake_despamilator.should_receive(:score).and_return(10000)
89
+
90
+ some_model = TestClass.new
91
+ some_model.should_receive(:do_something).with(:some_field, 'blah', fake_despamilator)
92
+ some_model.some_field = 'blah'
93
+ some_model.save
94
+
95
+ end
96
+
97
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,22 +1,9 @@
1
1
  require 'one_hundred_percent_coverage'
2
+
2
3
  require File.join(File.dirname(__FILE__), '..', 'lib', 'despamilator_rails')
3
- require 'active_record'
4
4
 
5
- Dir.glob(File.join(File.dirname(__FILE__), 'test_db_migrations', '*.rb')).each do |file|
6
- require file
5
+ %w{active_record_test_class data_mapper_test_class}.each do |file|
6
+ require File.join(File.dirname(__FILE__), 'fixtures', file)
7
7
  end
8
8
 
9
- db_file = 'test.sqlite3'
10
-
11
- File.unlink(db_file) if File.exists?(db_file)
12
-
13
- ActiveRecord::Base.establish_connection(
14
- :adapter => 'sqlite3',
15
- :database => db_file
16
- )
17
-
18
- CreateSomeModel.migrate(:up)
19
-
20
- Dir.glob(File.join(File.dirname(__FILE__), 'fixtures', '*.rb')).each do |file|
21
- require file
22
- end
9
+ require File.join(File.dirname(__FILE__), 'spam_protected_model_shared')
metadata CHANGED
@@ -4,9 +4,8 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 1
7
- - 0
8
7
  - 1
9
- version: 1.0.1
8
+ version: "1.1"
10
9
  platform: ruby
11
10
  authors:
12
11
  - Stephen Hardisty
@@ -32,7 +31,7 @@ dependencies:
32
31
  type: :runtime
33
32
  version_requirements: *id001
34
33
  - !ruby/object:Gem::Dependency
35
- name: activerecord
34
+ name: activemodel
36
35
  prerelease: false
37
36
  requirement: &id002 !ruby/object:Gem::Requirement
38
37
  none: false
@@ -40,30 +39,13 @@ dependencies:
40
39
  - - ">="
41
40
  - !ruby/object:Gem::Version
42
41
  segments:
43
- - 2
44
42
  - 3
45
- - 2
46
- version: 2.3.2
43
+ - 0
44
+ - 0
45
+ version: 3.0.0
47
46
  type: :runtime
48
47
  version_requirements: *id002
49
- - !ruby/object:Gem::Dependency
50
- name: hoe
51
- prerelease: false
52
- requirement: &id003 !ruby/object:Gem::Requirement
53
- none: false
54
- requirements:
55
- - - ">="
56
- - !ruby/object:Gem::Version
57
- segments:
58
- - 2
59
- - 8
60
- - 0
61
- version: 2.8.0
62
- type: :development
63
- version_requirements: *id003
64
- description: |-
65
- Spam detection plugin for Rails & ActiveRecord. Uses all the standard Rails conventions and
66
- my Despamilator gem.
48
+ description: Adds a Rails-esque validation method for use in Rails 3 with ActiveRecord or DataMapper
67
49
  email:
68
50
  - moowahaha@hotmail.com
69
51
  executables: []
@@ -74,6 +56,7 @@ extra_rdoc_files:
74
56
  - History.txt
75
57
  - Manifest.txt
76
58
  files:
59
+ - .gitignore
77
60
  - .rspec
78
61
  - .rvmrc
79
62
  - Gemfile
@@ -84,18 +67,21 @@ files:
84
67
  - Rakefile
85
68
  - despamilator-rails.gemspec
86
69
  - lib/despamilator_rails.rb
87
- - spec/active_record_integration_spec.rb
88
- - spec/despamilator_rails_spec.rb
70
+ - lib/despamilator_rails/active_record_validator.rb
71
+ - lib/despamilator_rails/data_mapper_validator.rb
72
+ - spec/active_record_spec.rb
73
+ - spec/data_mapper_spec.rb
89
74
  - spec/fixtures/active_record_test_class.rb
75
+ - spec/fixtures/data_mapper_test_class.rb
76
+ - spec/spam_protected_model_shared.rb
90
77
  - spec/spec_helper.rb
91
- - spec/test_db_migrations/create_test_model_table.rb
92
78
  has_rdoc: true
93
79
  homepage: https://github.com/moowahaha/despamilator-rails
94
80
  licenses: []
95
81
 
96
82
  post_install_message:
97
83
  rdoc_options:
98
- - --main
84
+ - lib/despamilator_rails.rb
99
85
  - README.rdoc
100
86
  require_paths:
101
87
  - lib
@@ -121,6 +107,6 @@ rubyforge_project: despamilator_rails
121
107
  rubygems_version: 1.3.7
122
108
  signing_key:
123
109
  specification_version: 3
124
- summary: Spam detection plugin for Rails & ActiveRecord
110
+ summary: Anti-spam validation hooks for Rails.
125
111
  test_files: []
126
112
 
@@ -1,8 +0,0 @@
1
- describe "active_record integration" do
2
- it "should check for spam on save" do
3
- some_instance = SomeModel.new
4
- some_instance.some_field = Despamilator.gtubs_test_string
5
-
6
- -> {some_instance.save!}.should raise_error(ActiveRecord::RecordInvalid)
7
- end
8
- end
@@ -1,120 +0,0 @@
1
- describe "despamilator_rails" do
2
-
3
- it "should notify of spam detection in a railsy way" do
4
-
5
- class SomeModelWithSpam < ActiveRecord::Base
6
- set_table_name 'some_models'
7
- validate_with_despamilator :attributes => [:some_field]
8
- end
9
-
10
- some_model = SomeModelWithSpam.new
11
- some_model.some_field = Despamilator.gtubs_test_string
12
-
13
- -> {some_model.save!}.should raise_error(ActiveRecord::RecordInvalid)
14
- some_model.errors.full_messages.should == ["Some field looks like spam"]
15
- end
16
-
17
- describe "threshold" do
18
-
19
- it "should default to 1" do
20
-
21
- class SomeModelWithDefaultThreshold < ActiveRecord::Base
22
- set_table_name 'some_models'
23
- validate_with_despamilator :attributes => [:some_field]
24
- end
25
-
26
- some_model = SomeModelWithDefaultThreshold.new
27
- some_model.despamilator_threshold.should == 1
28
- end
29
-
30
- it "should be settable" do
31
-
32
- class SomeModelWithDefinedThreshold < ActiveRecord::Base
33
- set_table_name 'some_models'
34
- validate_with_despamilator :attributes => [:some_field], :threshold => 9
35
- end
36
-
37
- some_model = SomeModelWithDefinedThreshold.new
38
- some_model.despamilator_threshold.should == 9
39
-
40
- end
41
-
42
- end
43
-
44
- describe "attributes" do
45
-
46
- it "should cause an exception when an empty array is passed" do
47
-
48
- ->{
49
- class SomeModelWithMissingAttributes < ActiveRecord::Base
50
- validate_with_despamilator :attributes => []
51
- end
52
- }.should raise_error('At least one attribute must be defined')
53
-
54
- end
55
-
56
- it "should cause an exception when an empty string is passed" do
57
-
58
- -> {
59
- class SomeModelWithEmptyAttributes < ActiveRecord::Base
60
- validate_with_despamilator :attributes => ['']
61
- end
62
- }.should raise_error('At least one attribute must be defined')
63
-
64
- end
65
-
66
- end
67
-
68
- it "should allow a block to be specified" do
69
-
70
- class SomeModelWithABlock < ActiveRecord::Base
71
- set_table_name 'some_models'
72
-
73
- def do_something field, value, despamilator
74
- end
75
-
76
- validate_with_despamilator :attributes => [:some_field] do |field, value, despamilator|
77
- do_something(field, value, despamilator)
78
- end
79
- end
80
-
81
- fake_despamilator = mock('despamilator')
82
- Despamilator.should_receive(:new).and_return(fake_despamilator)
83
- fake_despamilator.should_receive(:score).and_return(10000)
84
-
85
- some_model = SomeModelWithABlock.new
86
- some_model.should_receive(:do_something).with(:some_field, 'blah', fake_despamilator)
87
- some_model.some_field = 'blah'
88
- some_model.save
89
-
90
- end
91
-
92
- it "should work nicely with other validate methods" do
93
- class SomeModelWithAnotherValidate < ActiveRecord::Base
94
- set_table_name 'some_models'
95
-
96
- validate_with_despamilator :attributes => [:some_field] do |field, value, despamilator|
97
- do_something
98
- end
99
-
100
- def do_something
101
- end
102
-
103
- def do_something_else
104
- end
105
-
106
- def validate
107
- do_something_else
108
- end
109
-
110
- end
111
-
112
- some_model = SomeModelWithAnotherValidate.new
113
- some_model.should_receive(:do_something)
114
- some_model.should_receive(:do_something_else)
115
- some_model.some_field = Despamilator.gtubs_test_string
116
- some_model.save
117
-
118
- end
119
-
120
- end
@@ -1,10 +0,0 @@
1
- class CreateSomeModel < ActiveRecord::Migration
2
- ActiveRecord::Migration.verbose = false
3
-
4
- def self.up
5
- create_table :some_models do |t|
6
- t.text :some_field
7
- end
8
- end
9
-
10
- end