despamilator 0.2 → 0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. data/History.txt +7 -1
  2. data/Manifest.txt +4 -23
  3. data/README.rdoc +4 -1
  4. data/despamilator.gemspec +1 -1
  5. data/lib/despamilator/filter/html_tags.rb +1 -1
  6. data/lib/despamilator/filter/ip_address_url.rb +11 -0
  7. data/lib/despamilator/filter/naughty_q.rb +3 -2
  8. data/lib/despamilator/filter/shouting.rb +21 -0
  9. data/lib/despamilator/filter.rb +6 -10
  10. data/lib/despamilator.rb +2 -2
  11. data/spec/filters/html_tags_spec.rb +12 -9
  12. data/spec/filters/ip_address_url_spec.rb +29 -0
  13. data/spec/filters/shouting_spec.rb +49 -0
  14. metadata +15 -51
  15. data/pkg/despamilator-0.1/History.txt +0 -4
  16. data/pkg/despamilator-0.1/Manifest.txt +0 -21
  17. data/pkg/despamilator-0.1/PostInstall.txt +0 -1
  18. data/pkg/despamilator-0.1/README.rdoc +0 -107
  19. data/pkg/despamilator-0.1/Rakefile +0 -33
  20. data/pkg/despamilator-0.1/despamilator.gemspec +0 -42
  21. data/pkg/despamilator-0.1/lib/despamilator/filter/html_tags.rb +0 -116
  22. data/pkg/despamilator-0.1/lib/despamilator/filter/naughty_q.rb +0 -17
  23. data/pkg/despamilator-0.1/lib/despamilator/filter/numbers_and_words.rb +0 -33
  24. data/pkg/despamilator-0.1/lib/despamilator/filter/script_tag.rb +0 -13
  25. data/pkg/despamilator-0.1/lib/despamilator/filter.rb +0 -52
  26. data/pkg/despamilator-0.1/lib/despamilator/filter_base.rb +0 -37
  27. data/pkg/despamilator-0.1/lib/despamilator.rb +0 -19
  28. data/pkg/despamilator-0.1/spec/despamilator_spec.rb +0 -15
  29. data/pkg/despamilator-0.1/spec/filters/html_tags_spec.rb +0 -144
  30. data/pkg/despamilator-0.1/spec/filters/naughty_q_spec.rb +0 -39
  31. data/pkg/despamilator-0.1/spec/filters/numbers_and_words_spec.rb +0 -59
  32. data/pkg/despamilator-0.1/spec/filters/script_tag_spec.rb +0 -32
  33. data/pkg/despamilator-0.1/spec/spec.opts +0 -1
  34. data/pkg/despamilator-0.1/spec/spec_helper.rb +0 -10
  35. data/pkg/despamilator-0.1/tasks/rspec.rake +0 -21
  36. data/pkg/despamilator-0.1.gem +0 -0
  37. data/pkg/despamilator-0.1.tgz +0 -0
data/History.txt CHANGED
@@ -1,4 +1,10 @@
1
- === 0.0.1 2010-01-30
1
+ === 0.1 2010-01-30
2
2
 
3
3
  * 1 major enhancement:
4
4
  * Initial release
5
+
6
+ === 0.3 2010-05-11
7
+
8
+ * Added HTML tag detection
9
+ * Added IP address detection
10
+
data/Manifest.txt CHANGED
@@ -7,38 +7,19 @@ despamilator.gemspec
7
7
  lib/despamilator.rb
8
8
  lib/despamilator/filter.rb
9
9
  lib/despamilator/filter/html_tags.rb
10
+ lib/despamilator/filter/ip_address_url.rb
10
11
  lib/despamilator/filter/naughty_q.rb
11
12
  lib/despamilator/filter/numbers_and_words.rb
12
13
  lib/despamilator/filter/script_tag.rb
14
+ lib/despamilator/filter/shouting.rb
13
15
  lib/despamilator/filter_base.rb
14
- pkg/despamilator-0.1.gem
15
- pkg/despamilator-0.1.tgz
16
- pkg/despamilator-0.1/History.txt
17
- pkg/despamilator-0.1/Manifest.txt
18
- pkg/despamilator-0.1/PostInstall.txt
19
- pkg/despamilator-0.1/README.rdoc
20
- pkg/despamilator-0.1/Rakefile
21
- pkg/despamilator-0.1/despamilator.gemspec
22
- pkg/despamilator-0.1/lib/despamilator.rb
23
- pkg/despamilator-0.1/lib/despamilator/filter.rb
24
- pkg/despamilator-0.1/lib/despamilator/filter/html_tags.rb
25
- pkg/despamilator-0.1/lib/despamilator/filter/naughty_q.rb
26
- pkg/despamilator-0.1/lib/despamilator/filter/numbers_and_words.rb
27
- pkg/despamilator-0.1/lib/despamilator/filter/script_tag.rb
28
- pkg/despamilator-0.1/lib/despamilator/filter_base.rb
29
- pkg/despamilator-0.1/spec/despamilator_spec.rb
30
- pkg/despamilator-0.1/spec/filters/html_tags_spec.rb
31
- pkg/despamilator-0.1/spec/filters/naughty_q_spec.rb
32
- pkg/despamilator-0.1/spec/filters/numbers_and_words_spec.rb
33
- pkg/despamilator-0.1/spec/filters/script_tag_spec.rb
34
- pkg/despamilator-0.1/spec/spec.opts
35
- pkg/despamilator-0.1/spec/spec_helper.rb
36
- pkg/despamilator-0.1/tasks/rspec.rake
37
16
  spec/despamilator_spec.rb
38
17
  spec/filters/html_tags_spec.rb
18
+ spec/filters/ip_address_url_spec.rb
39
19
  spec/filters/naughty_q_spec.rb
40
20
  spec/filters/numbers_and_words_spec.rb
41
21
  spec/filters/script_tag_spec.rb
22
+ spec/filters/shouting_spec.rb
42
23
  spec/spec.opts
43
24
  spec/spec_helper.rb
44
25
  tasks/rspec.rake
data/README.rdoc CHANGED
@@ -5,7 +5,7 @@
5
5
  == DESCRIPTION:
6
6
 
7
7
  Despamilator is a plugin based spam detector designed for use on your web forms borne out of two annoyances:
8
- Spam being submitted in my web forms AND CAPTCHAS being intrusive. Despamilator will apply
8
+ Spam being submitted in my web forms and CAPTCHAS being intrusive. Despamilator will apply
9
9
  some commonly used heuristics from the world of anti-spam to help you decide whether your users are human or machine.
10
10
 
11
11
  == FEATURES/PROBLEMS:
@@ -15,6 +15,9 @@ some commonly used heuristics from the world of anti-spam to help you decide whe
15
15
  == SYNOPSIS:
16
16
 
17
17
  # using Despamilator
18
+ require 'rubygems'
19
+ require 'desplamilator'
20
+
18
21
  dspam = Despamilator.new('some text with an <h2> tag qthhg')
19
22
 
20
23
  dspam.score #=> the total score for this string (1 is considered high)
data/despamilator.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{despamilator}
5
- s.version = "0.2"
5
+ s.version = "0.3"
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"]
@@ -1,6 +1,6 @@
1
1
  def parse
2
2
  html = self.text.downcase
3
-
3
+
4
4
  html_tags.each do |tag|
5
5
  if html.match(/<\s*#{tag}\W/) || html.match(/<\n*#{tag}\W/) || html.match(/\W#{tag}\s*\//) || html.match(/\W#{tag}\n*\//)
6
6
  self.append_score = 0.3
@@ -0,0 +1,11 @@
1
+ def name
2
+ 'IP Address URL'
3
+ end
4
+
5
+ def description
6
+ 'Detects IP address URLs'
7
+ end
8
+
9
+ def parse
10
+ self.append_score = 0.5 if (self.text.downcase.scan(/http:\/\/\d+\.\d+\.\d+\.\d+/).length > 0)
11
+ end
@@ -7,11 +7,12 @@ def description
7
7
  end
8
8
 
9
9
  def parse
10
- matches = self.text.downcase.scan(/q./)
10
+ matches = self.text.downcase.scan(/q(\w|\d)/)
11
11
 
12
12
  return unless matches
13
13
 
14
14
  matches.each do |match|
15
- self.append_score = 0.2 if match != 'qu' and match != 'qa' and match !~ /q\s/
15
+ match = match.first
16
+ self.append_score = 0.2 unless match == 'u' or match == 'a'
16
17
  end
17
18
  end
@@ -0,0 +1,21 @@
1
+ def name
2
+ 'Shouting'
3
+ end
4
+
5
+ def description
6
+ 'Detects and scores shouting (all caps)'
7
+ end
8
+
9
+ def parse
10
+ # strip HTML
11
+ text = self.text.gsub(/<\/?[^>]*>/, "")
12
+
13
+ return if text.length < 20
14
+
15
+ uppercased = text.scan(/[A-Z]/).length
16
+ lowercased = text.scan(/[a-z]/).length
17
+
18
+ if uppercased > 0
19
+ self.append_score = (uppercased.to_f / (uppercased + lowercased)) * 0.5
20
+ end
21
+ end
@@ -3,7 +3,6 @@ class Despamilator
3
3
  attr_accessor :matches, :score
4
4
 
5
5
  def initialize text
6
- @@loaded ||= {}
7
6
  @filters ||= []
8
7
  @matches ||= []
9
8
  @score ||= 0
@@ -16,15 +15,12 @@ class Despamilator
16
15
  def load_filters text
17
16
  Dir.glob(File.dirname(__FILE__) + "/filter/*.rb").each do |filter_file|
18
17
  filter_name = classify_filename filter_file
19
- filter = @@loaded[filter_name]
20
-
21
- unless filter
22
- filter_code = File.open(filter_file, File::RDWR).read
23
- filter = Class.new
24
- filter.class_eval(
25
- "require 'despamilator/filter_base'\nclass #{filter_name} < Despamilator::FilterBase\n#{filter_code}\nend"
26
- )
27
- end
18
+
19
+ filter_code = File.open(filter_file, File::RDWR).read
20
+ filter = Class.new
21
+ filter.class_eval(
22
+ "require 'despamilator/filter_base'\nclass #{filter_name} < Despamilator::FilterBase\n#{filter_code}\nend"
23
+ )
28
24
 
29
25
  @filters.push(filter.const_get(filter_name).new(text.to_s.dup, File.basename(filter_file)))
30
26
  end
data/lib/despamilator.rb CHANGED
@@ -3,7 +3,7 @@ $:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) ||
3
3
  require 'despamilator/filter'
4
4
 
5
5
  class Despamilator
6
- VERSION = "0.2"
6
+ VERSION = "0.3"
7
7
 
8
8
  def initialize text
9
9
  @filters = Despamilator::Filter.new text
@@ -16,4 +16,4 @@ class Despamilator
16
16
  def matched_by
17
17
  @filters.matches
18
18
  end
19
- end
19
+ end
@@ -99,18 +99,17 @@ context "HtmlTags" do
99
99
  ].each do |script_tag|
100
100
  [script_tag.upcase, script_tag.downcase].each do |script_tag|
101
101
  [
102
- "<#{script_tag}",
103
- "#{script_tag}/>",
102
+ "<#{script_tag}>",
104
103
  "<#{script_tag}/>",
105
- "< #{script_tag} ",
106
- "#{script_tag} />",
104
+ "< #{script_tag} >",
105
+ "<#{script_tag} />",
107
106
  "<\n#{script_tag}\n/>",
108
- "<\n#{script_tag} ",
109
- "#{script_tag}\n/>",
107
+ "<\n#{script_tag} >",
108
+ "<#{script_tag}\n/>",
110
109
  "<\r#{script_tag}\r/>"
111
- ].each do |script_tag|
112
- it "should detect '#{script_tag}'" do
113
- dspam = Despamilator.new(script_tag)
110
+ ].each do |tag|
111
+ it "should detect '#{tag}'" do
112
+ dspam = Despamilator.new(tag)
114
113
  dspam.score.should == 0.3
115
114
  end
116
115
  end
@@ -139,6 +138,10 @@ context "HtmlTags" do
139
138
  it "should detect an h1" do
140
139
  Despamilator.new('<h1>TITLE!!</h1>').score.should == 0.3
141
140
  end
141
+
142
+ it "should not detect tags twice" do
143
+ Despamilator.new('<i>italic</i>').score.should == 0.3
144
+ end
142
145
  end
143
146
  end
144
147
  end
@@ -0,0 +1,29 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper.rb'
2
+
3
+ describe "IP Address URL" do
4
+ describe 'attributes' do
5
+ before :each do
6
+ @filter = Despamilator.new('http://12.34.56.78/').matched_by.first
7
+ end
8
+
9
+ it "should have a filename" do
10
+ @filter.filename.should == 'ip_address_url.rb'
11
+ end
12
+
13
+ it "should have a name" do
14
+ @filter.name.should == 'IP Address URL'
15
+ end
16
+
17
+ it "should have a description" do
18
+ @filter.description.should == 'Detects IP address URLs'
19
+ end
20
+
21
+ it "should have a number of matches" do
22
+ @filter.matches.should == 1
23
+ end
24
+
25
+ it "should have a score" do
26
+ @filter.score.should == 0.5
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,49 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper.rb'
2
+
3
+ describe "Shouting" do
4
+ describe 'attributes' do
5
+ before :each do
6
+ @filter = Despamilator.new('HELLO THERE!! THIS IS SHOUTING!!').matched_by.first
7
+ end
8
+
9
+ it "should have a filename" do
10
+ @filter.filename.should == 'shouting.rb'
11
+ end
12
+
13
+ it "should have a name" do
14
+ @filter.name.should == 'Shouting'
15
+ end
16
+
17
+ it "should have a description" do
18
+ @filter.description.should == 'Detects and scores shouting (all caps)'
19
+ end
20
+
21
+ it "should have a number of matches" do
22
+ @filter.matches.should == 1
23
+ end
24
+
25
+ it "should have a score" do
26
+ @filter.score.should == 0.5
27
+ end
28
+ end
29
+
30
+ describe "filter" do
31
+ it "should strip out HTML" do
32
+ Despamilator.new('<H1>this is a flipping html tag whose contents is very long</h1>').matched_by.select {|a| a.name == 'Shouting'}.should be_empty
33
+ end
34
+
35
+ it "should ignore strings less than 20 characters long" do
36
+ Despamilator.new('ABCD EFG HIJKLM NOP').matched_by.select {|a| a.name == 'Shouting'}.should be_empty
37
+ end
38
+
39
+ it "should score based on a percentage of uppercase words" do
40
+ [
41
+ ['this is a lowercased string', 0],
42
+ ['this lil string is 50 PERCENT SHOUTING', 0.25],
43
+ ['THIS LIL STRING IS 100 PERCENT SHOUTING', 0.5]
44
+ ].each do |string, expected_score|
45
+ Despamilator.new(string).score.should == expected_score
46
+ end
47
+ end
48
+ end
49
+ end
metadata CHANGED
@@ -4,8 +4,8 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 2
8
- version: "0.2"
7
+ - 3
8
+ version: "0.3"
9
9
  platform: ruby
10
10
  authors:
11
11
  - Stephen Hardisty
@@ -13,7 +13,7 @@ autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
15
 
16
- date: 2010-03-28 00:00:00 +11:00
16
+ date: 2010-05-11 00:00:00 +10:00
17
17
  default_executable:
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
@@ -26,41 +26,27 @@ dependencies:
26
26
  segments:
27
27
  - 2
28
28
  - 0
29
- - 3
30
- version: 2.0.3
29
+ - 4
30
+ version: 2.0.4
31
31
  type: :development
32
32
  version_requirements: *id001
33
- - !ruby/object:Gem::Dependency
34
- name: gemcutter
35
- prerelease: false
36
- requirement: &id002 !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- segments:
41
- - 0
42
- - 5
43
- - 0
44
- version: 0.5.0
45
- type: :development
46
- version_requirements: *id002
47
33
  - !ruby/object:Gem::Dependency
48
34
  name: hoe
49
35
  prerelease: false
50
- requirement: &id003 !ruby/object:Gem::Requirement
36
+ requirement: &id002 !ruby/object:Gem::Requirement
51
37
  requirements:
52
38
  - - ">="
53
39
  - !ruby/object:Gem::Version
54
40
  segments:
55
41
  - 2
56
- - 5
42
+ - 6
57
43
  - 0
58
- version: 2.5.0
44
+ version: 2.6.0
59
45
  type: :development
60
- version_requirements: *id003
46
+ version_requirements: *id002
61
47
  description: |-
62
48
  Despamilator is a plugin based spam detector designed for use on your web forms borne out of two annoyances:
63
- Spam being submitted in my web forms AND CAPTCHAS being intrusive. Despamilator will apply
49
+ Spam being submitted in my web forms and CAPTCHAS being intrusive. Despamilator will apply
64
50
  some commonly used heuristics from the world of anti-spam to help you decide whether your users are human or machine.
65
51
  email:
66
52
  - moowahaha@hotmail.com
@@ -72,9 +58,6 @@ extra_rdoc_files:
72
58
  - History.txt
73
59
  - Manifest.txt
74
60
  - PostInstall.txt
75
- - pkg/despamilator-0.1/History.txt
76
- - pkg/despamilator-0.1/Manifest.txt
77
- - pkg/despamilator-0.1/PostInstall.txt
78
61
  files:
79
62
  - History.txt
80
63
  - Manifest.txt
@@ -85,38 +68,19 @@ files:
85
68
  - lib/despamilator.rb
86
69
  - lib/despamilator/filter.rb
87
70
  - lib/despamilator/filter/html_tags.rb
71
+ - lib/despamilator/filter/ip_address_url.rb
88
72
  - lib/despamilator/filter/naughty_q.rb
89
73
  - lib/despamilator/filter/numbers_and_words.rb
90
74
  - lib/despamilator/filter/script_tag.rb
75
+ - lib/despamilator/filter/shouting.rb
91
76
  - lib/despamilator/filter_base.rb
92
- - pkg/despamilator-0.1.gem
93
- - pkg/despamilator-0.1.tgz
94
- - pkg/despamilator-0.1/History.txt
95
- - pkg/despamilator-0.1/Manifest.txt
96
- - pkg/despamilator-0.1/PostInstall.txt
97
- - pkg/despamilator-0.1/README.rdoc
98
- - pkg/despamilator-0.1/Rakefile
99
- - pkg/despamilator-0.1/despamilator.gemspec
100
- - pkg/despamilator-0.1/lib/despamilator.rb
101
- - pkg/despamilator-0.1/lib/despamilator/filter.rb
102
- - pkg/despamilator-0.1/lib/despamilator/filter/html_tags.rb
103
- - pkg/despamilator-0.1/lib/despamilator/filter/naughty_q.rb
104
- - pkg/despamilator-0.1/lib/despamilator/filter/numbers_and_words.rb
105
- - pkg/despamilator-0.1/lib/despamilator/filter/script_tag.rb
106
- - pkg/despamilator-0.1/lib/despamilator/filter_base.rb
107
- - pkg/despamilator-0.1/spec/despamilator_spec.rb
108
- - pkg/despamilator-0.1/spec/filters/html_tags_spec.rb
109
- - pkg/despamilator-0.1/spec/filters/naughty_q_spec.rb
110
- - pkg/despamilator-0.1/spec/filters/numbers_and_words_spec.rb
111
- - pkg/despamilator-0.1/spec/filters/script_tag_spec.rb
112
- - pkg/despamilator-0.1/spec/spec.opts
113
- - pkg/despamilator-0.1/spec/spec_helper.rb
114
- - pkg/despamilator-0.1/tasks/rspec.rake
115
77
  - spec/despamilator_spec.rb
116
78
  - spec/filters/html_tags_spec.rb
79
+ - spec/filters/ip_address_url_spec.rb
117
80
  - spec/filters/naughty_q_spec.rb
118
81
  - spec/filters/numbers_and_words_spec.rb
119
82
  - spec/filters/script_tag_spec.rb
83
+ - spec/filters/shouting_spec.rb
120
84
  - spec/spec.opts
121
85
  - spec/spec_helper.rb
122
86
  - tasks/rspec.rake
@@ -150,6 +114,6 @@ rubyforge_project: despamilator
150
114
  rubygems_version: 1.3.6
151
115
  signing_key:
152
116
  specification_version: 3
153
- summary: "Despamilator is a plugin based spam detector designed for use on your web forms borne out of two annoyances: Spam being submitted in my web forms AND CAPTCHAS being intrusive"
117
+ summary: "Despamilator is a plugin based spam detector designed for use on your web forms borne out of two annoyances: Spam being submitted in my web forms and CAPTCHAS being intrusive"
154
118
  test_files: []
155
119
 
@@ -1,4 +0,0 @@
1
- === 0.0.1 2010-01-30
2
-
3
- * 1 major enhancement:
4
- * Initial release
@@ -1,21 +0,0 @@
1
- History.txt
2
- Manifest.txt
3
- PostInstall.txt
4
- README.rdoc
5
- Rakefile
6
- despamilator.gemspec
7
- lib/despamilator.rb
8
- lib/despamilator/filter.rb
9
- lib/despamilator/filter/html_tags.rb
10
- lib/despamilator/filter/naughty_q.rb
11
- lib/despamilator/filter/numbers_and_words.rb
12
- lib/despamilator/filter/script_tag.rb
13
- lib/despamilator/filter_base.rb
14
- spec/despamilator_spec.rb
15
- spec/filters/html_tags_spec.rb
16
- spec/filters/naughty_q_spec.rb
17
- spec/filters/numbers_and_words_spec.rb
18
- spec/filters/script_tag_spec.rb
19
- spec/spec.opts
20
- spec/spec_helper.rb
21
- tasks/rspec.rake
@@ -1 +0,0 @@
1
- For more information on despamilator or to contribute more filters, see http://github.com/moowahaha/despamliator
@@ -1,107 +0,0 @@
1
- = Despamilator
2
-
3
- * http://github.com/moowahaha/despamliator
4
-
5
- == DESCRIPTION:
6
-
7
- Despamilator is a plugin based spam detector designed for use on your web forms borne out of two annoyances:
8
- Spam being submitted in my web forms AND CAPTCHAS being intrusive. Despamilator will apply
9
- some commonly used heuristics from the world of anti-spam to help you decide whether your users are human or machine.
10
-
11
- == FEATURES/PROBLEMS:
12
-
13
- * rspec will be run twice. How annoying?!
14
-
15
- == SYNOPSIS:
16
-
17
- # using Despamilator
18
- dspam = Despamilator.new('some text with an <h2> tag qthhg')
19
-
20
- dspam.score #=> the total score for this string (1 is considered high)
21
- dspam.matched_by #=> array of matching filters
22
- first_match = dspam.matched_by.first #=> first matching filter
23
- first_match.name #=> some string with the name of the filter
24
- first_match.description #=> some string to describe
25
- first_match.score #=> the individual score assigned by this filter
26
-
27
- # adding a new filter! example: detecting the letter "a"
28
- # put the following code in lib/despamilator/filter/detect_letter_a.rb
29
- def name
30
- 'Detecting the letter A'
31
- end
32
-
33
- def description
34
- 'Detects the letter "a" in a string for no reason other than a demo'
35
- end
36
-
37
- def parse
38
- if self.text.downcase.scan(/a/)
39
- # add 0.1 to the score of the text
40
- self.append_score = 0.1
41
- end
42
- end
43
-
44
- == FILTERING:
45
-
46
- As stated, this is a heuristic scanner so its up to the user to decide the thresholds of the scanner. I usually
47
- say "it's spam" if the score reaches 1.
48
-
49
- The score will be added to incrementally by each matching filter. So if there is some HTML in there, it will be added
50
- to the score. If there is also a script tag of some sort, that will add more.
51
-
52
- Each filter decides how much of a score it assigns. For example, detecting a number next to a letter
53
- (the numbers_an_words filter) is only a mild hint compared with a script tag (detected by the script_tag filter).
54
-
55
- === NEW FILTERS:
56
-
57
- I absolutely welcome new filters and experiments. New filters should be put in the 'lib/despamilator/filter/' directory.
58
- The core filtering code will detect and use what is in there so you only need to drop the code in.
59
- Filters should be simple, no classes etc wrapped around them and should try to perform one simple task.
60
- They should always supply the following methods:
61
-
62
- * name #=> the name of your filter.
63
- * description #=> what your filter will look for.
64
- * parse #=> the method that will be called when parsing.
65
-
66
- Along side the above, the following methods are made available to each filter:
67
-
68
- * text #=> a copy of the text your parser will parse
69
- * append_score= #=> method to append a score to the text if there are matches in your parser.
70
- * matched? #=> whether or not any filter has so far detected something suspect
71
- * score #=> the current score assigned to the text
72
-
73
- spec tests are an absolute must!
74
-
75
-
76
- == REQUIREMENTS:
77
-
78
- * hoe
79
- * rspec
80
-
81
-
82
- == INSTALL:
83
-
84
- $ sudo gem install despamilator
85
-
86
- == LICENSE:
87
-
88
- Copyright (c) 2010 Stephen Hardisty
89
-
90
- Permission is hereby granted, free of charge, to any person obtaining
91
- a copy of this software and associated documentation files (the
92
- 'Software'), to deal in the Software without restriction, including
93
- without limitation the rights to use, copy, modify, merge, publish,
94
- distribute, sublicense, and/or sell copies of the Software, and to
95
- permit persons to whom the Software is furnished to do so, subject to
96
- the following conditions:
97
-
98
- The above copyright notice and this permission notice shall be
99
- included in all copies or substantial portions of the Software.
100
-
101
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
102
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
103
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
104
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
105
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
106
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
107
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -1,33 +0,0 @@
1
- require 'rubygems'
2
- gem 'hoe', '>= 2.1.0'
3
- require 'hoe'
4
- require 'fileutils'
5
- require './lib/despamilator'
6
-
7
- Hoe.plugin :newgem
8
- # Hoe.plugin :website
9
- # Hoe.plugin :cucumberfeatures
10
-
11
- # Generate all the Rake tasks
12
- # Run 'rake -T' to see list of generated tasks (from gem root directory)
13
- $hoe = Hoe.spec 'despamilator' do
14
- self.developer 'Stephen Hardisty', 'moowahaha@hotmail.com'
15
- self.post_install_message = 'PostInstall.txt'
16
- self.rubyforge_name = self.name # TODO this is default value
17
- # self.extra_deps = [['activesupport','>= 2.0.2']]
18
-
19
- end
20
-
21
- require 'newgem/tasks'
22
- Dir['tasks/**/*.rake'].each { |t| load t }
23
-
24
- # TODO - want other tests/tasks run by default? Add them to the list
25
- # remove_task :default
26
- task :test => [:spec]
27
- task :default => [:test]
28
- task :install => [:install_gem]
29
-
30
- task :cultivate do
31
- system "touch Manifest.txt; rake check_manifest | grep -v \"(in \" | patch"
32
- system "rake debug_gem | grep -v \"(in \" > `basename \\`pwd\\``.gemspec"
33
- end
@@ -1,42 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
- Gem::Specification.new do |s|
4
- s.name = %q{despamilator}
5
- s.version = "0.2"
6
-
7
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
- s.authors = ["Stephen Hardisty"]
9
- s.date = %q{2010-03-28}
10
- s.description = %q{Despamilator is a plugin based spam detector designed for use on your web forms borne out of two annoyances:
11
- Spam being submitted in my web forms AND CAPTCHAS being intrusive. Despamilator will apply
12
- some commonly used heuristics from the world of anti-spam to help you decide whether your users are human or machine.}
13
- s.email = ["moowahaha@hotmail.com"]
14
- s.extra_rdoc_files = ["History.txt", "Manifest.txt", "PostInstall.txt", "pkg/despamilator-0.1/History.txt", "pkg/despamilator-0.1/Manifest.txt", "pkg/despamilator-0.1/PostInstall.txt"]
15
- s.files = ["History.txt", "Manifest.txt", "PostInstall.txt", "README.rdoc", "Rakefile", "despamilator.gemspec", "lib/despamilator.rb", "lib/despamilator/filter.rb", "lib/despamilator/filter/html_tags.rb", "lib/despamilator/filter/naughty_q.rb", "lib/despamilator/filter/numbers_and_words.rb", "lib/despamilator/filter/script_tag.rb", "lib/despamilator/filter_base.rb", "pkg/despamilator-0.1.gem", "pkg/despamilator-0.1.tgz", "pkg/despamilator-0.1/History.txt", "pkg/despamilator-0.1/Manifest.txt", "pkg/despamilator-0.1/PostInstall.txt", "pkg/despamilator-0.1/README.rdoc", "pkg/despamilator-0.1/Rakefile", "pkg/despamilator-0.1/despamilator.gemspec", "pkg/despamilator-0.1/lib/despamilator.rb", "pkg/despamilator-0.1/lib/despamilator/filter.rb", "pkg/despamilator-0.1/lib/despamilator/filter/html_tags.rb", "pkg/despamilator-0.1/lib/despamilator/filter/naughty_q.rb", "pkg/despamilator-0.1/lib/despamilator/filter/numbers_and_words.rb", "pkg/despamilator-0.1/lib/despamilator/filter/script_tag.rb", "pkg/despamilator-0.1/lib/despamilator/filter_base.rb", "pkg/despamilator-0.1/spec/despamilator_spec.rb", "pkg/despamilator-0.1/spec/filters/html_tags_spec.rb", "pkg/despamilator-0.1/spec/filters/naughty_q_spec.rb", "pkg/despamilator-0.1/spec/filters/numbers_and_words_spec.rb", "pkg/despamilator-0.1/spec/filters/script_tag_spec.rb", "pkg/despamilator-0.1/spec/spec.opts", "pkg/despamilator-0.1/spec/spec_helper.rb", "pkg/despamilator-0.1/tasks/rspec.rake", "spec/despamilator_spec.rb", "spec/filters/html_tags_spec.rb", "spec/filters/naughty_q_spec.rb", "spec/filters/numbers_and_words_spec.rb", "spec/filters/script_tag_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "tasks/rspec.rake"]
16
- s.homepage = %q{http://github.com/moowahaha/despamliator}
17
- s.post_install_message = %q{PostInstall.txt}
18
- s.rdoc_options = ["--main", "README.rdoc"]
19
- s.require_paths = ["lib"]
20
- s.rubyforge_project = %q{despamilator}
21
- s.rubygems_version = %q{1.3.6}
22
- s.summary = %q{Despamilator is a plugin based spam detector designed for use on your web forms borne out of two annoyances: Spam being submitted in my web forms AND CAPTCHAS being intrusive}
23
-
24
- if s.respond_to? :specification_version then
25
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
26
- s.specification_version = 3
27
-
28
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
29
- s.add_development_dependency(%q<rubyforge>, [">= 2.0.3"])
30
- s.add_development_dependency(%q<gemcutter>, [">= 0.5.0"])
31
- s.add_development_dependency(%q<hoe>, [">= 2.5.0"])
32
- else
33
- s.add_dependency(%q<rubyforge>, [">= 2.0.3"])
34
- s.add_dependency(%q<gemcutter>, [">= 0.5.0"])
35
- s.add_dependency(%q<hoe>, [">= 2.5.0"])
36
- end
37
- else
38
- s.add_dependency(%q<rubyforge>, [">= 2.0.3"])
39
- s.add_dependency(%q<gemcutter>, [">= 0.5.0"])
40
- s.add_dependency(%q<hoe>, [">= 2.5.0"])
41
- end
42
- end
@@ -1,116 +0,0 @@
1
- def parse
2
- html = self.text.downcase
3
-
4
- html_tags.each do |tag|
5
- if html.match(/<\s*#{tag}\W/) || html.match(/<\n*#{tag}\W/) || html.match(/\W#{tag}\s*\//) || html.match(/\W#{tag}\n*\//)
6
- self.append_score = 0.3
7
- end
8
- end
9
- end
10
-
11
- def name
12
- 'Detects HTML tags in text'
13
- end
14
-
15
- def description
16
- 'Searches for various HTML tags'
17
- end
18
-
19
- def html_tags
20
- # make sure these are lowercase, in order to save processing
21
- [
22
- '!--',
23
- '!doctype',
24
- 'a',
25
- 'abbr',
26
- 'acronym',
27
- 'address',
28
- 'applet',
29
- 'area',
30
- 'b',
31
- 'base',
32
- 'basefont',
33
- 'bdo',
34
- 'big',
35
- 'blockquote',
36
- 'body',
37
- 'br',
38
- 'button',
39
- 'caption',
40
- 'center',
41
- 'cite',
42
- 'code',
43
- 'col',
44
- 'colgroup',
45
- 'dd',
46
- 'del',
47
- 'dfn',
48
- 'dir',
49
- 'div',
50
- 'dl',
51
- 'dt',
52
- 'em',
53
- 'fieldset',
54
- 'font',
55
- 'form',
56
- 'frame',
57
- 'frameset',
58
- 'h1',
59
- 'h2',
60
- 'h3',
61
- 'h4',
62
- 'h5',
63
- 'h6',
64
- 'head',
65
- 'hr',
66
- 'html',
67
- 'i',
68
- 'iframe',
69
- 'img',
70
- 'input',
71
- 'ins',
72
- 'isindex',
73
- 'kbd',
74
- 'label',
75
- 'legend',
76
- 'li',
77
- 'link',
78
- 'map',
79
- 'menu',
80
- 'meta',
81
- 'noframes',
82
- 'noscript',
83
- 'object',
84
- 'ol',
85
- 'optgroup',
86
- 'option',
87
- 'p',
88
- 'param',
89
- 'pre',
90
- 'q',
91
- 's',
92
- 'samp',
93
- 'select',
94
- 'small',
95
- 'span',
96
- 'strike',
97
- 'strong',
98
- 'style',
99
- 'sub',
100
- 'sup',
101
- 'table',
102
- 'tbody',
103
- 'td',
104
- 'textarea',
105
- 'tfoot',
106
- 'th',
107
- 'thead',
108
- 'title',
109
- 'tr',
110
- 'tt',
111
- 'u',
112
- 'ul',
113
- 'var',
114
- 'xmp'
115
- ]
116
- end
@@ -1,17 +0,0 @@
1
- def name
2
- 'Naughty Q'
3
- end
4
-
5
- def description
6
- 'Detects possible misuse of the letter Q (English language)'
7
- end
8
-
9
- def parse
10
- matches = self.text.downcase.scan(/q./)
11
-
12
- return unless matches
13
-
14
- matches.each do |match|
15
- self.append_score = 0.2 if match != 'qu' and match != 'qa' and match !~ /q\s/
16
- end
17
- end
@@ -1,33 +0,0 @@
1
- def parse
2
- string = self.text.downcase
3
-
4
- # strip out "good numbers"
5
- string.gsub!(/h[1-6]/, '')
6
- string.gsub!(/(^|\b)\d+($|\b)/, '')
7
- string.gsub!(/(^|\b)\d+(,|\.)\d+($|\b)/, '')
8
- string.gsub!(/(^|\b)\d+(st|nd|rd|th)($|\b)/, '')
9
-
10
- [
11
- /\w\d+/,
12
- /\d+\w/,
13
- /\d+($|\b)/
14
- ].each do |regexp|
15
- matches = string.scan(regexp)
16
-
17
- next if matches.empty?
18
-
19
- matches.each do |to_remove|
20
- to_remove = to_remove.to_s
21
- string.sub!(to_remove, '') unless to_remove.empty?
22
- self.append_score = 0.1
23
- end
24
- end
25
- end
26
-
27
- def name
28
- 'Numbers next to words'
29
- end
30
-
31
- def description
32
- 'Detects unusual number/word combinations'
33
- end
@@ -1,13 +0,0 @@
1
- def parse
2
- if self.text.downcase.match(/<\/?script(>|\s+|\n|\r)/)
3
- self.append_score = 1
4
- end
5
- end
6
-
7
- def name
8
- 'Detects script tags in text'
9
- end
10
-
11
- def description
12
- 'Searches for variations for the HTML script tag'
13
- end
@@ -1,52 +0,0 @@
1
- class Despamilator
2
- class Filter
3
- attr_accessor :matches, :score
4
-
5
- def initialize text
6
- @@loaded ||= {}
7
- @filters ||= []
8
- @matches ||= []
9
- @score ||= 0
10
- load_filters text
11
- run_filters
12
- end
13
-
14
- private
15
-
16
- def load_filters text
17
- Dir.glob(File.dirname(__FILE__) + "/filter/*.rb").each do |filter_file|
18
- filter_name = classify_filename filter_file
19
- filter = @@loaded[filter_name]
20
-
21
- unless filter
22
- filter_code = File.open(filter_file, File::RDWR).read
23
- filter = Class.new
24
- filter.class_eval(
25
- "require 'despamilator/filter_base'\nclass #{filter_name} < Despamilator::FilterBase\n#{filter_code}\nend"
26
- )
27
- end
28
-
29
- @filters.push(filter.const_get(filter_name).new(text.to_s.dup, File.basename(filter_file)))
30
- end
31
- end
32
-
33
- def run_filters
34
- @filters.each do |filter|
35
- filter.parse
36
-
37
- if filter.matched?
38
- @matches.push(filter)
39
- @score += filter.score
40
- end
41
- end
42
- end
43
-
44
- def classify_filename filename
45
- classname = ''
46
- File.basename(filename).gsub(/\.rb$/, '').split('_').each do |filename_part|
47
- classname += filename_part.capitalize
48
- end
49
- classname || filename.capitalize
50
- end
51
- end
52
- end
@@ -1,37 +0,0 @@
1
- class Despamilator
2
- class FilterBase
3
- attr_accessor :text, :score, :filename, :matches
4
-
5
- def initialize text, filename
6
- @matches = 0
7
- @filename = filename
8
- @score = 0
9
- @text = text
10
- @matched = false
11
- end
12
-
13
- def description
14
- raise "No description defined in #{filename}"
15
- end
16
-
17
- def parse blah
18
- raise "No parser defined in #{filename}"
19
- end
20
-
21
- def name
22
- raise "No name defined in #{filename}"
23
- end
24
-
25
- def matched?
26
- @score > 0
27
- end
28
-
29
- protected
30
-
31
- def append_score= new_score
32
- @matches += 1
33
- @score += new_score
34
- end
35
-
36
- end
37
- end
@@ -1,19 +0,0 @@
1
- $:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
2
-
3
- require 'despamilator/filter'
4
-
5
- class Despamilator
6
- VERSION = "0.2"
7
-
8
- def initialize text
9
- @filters = Despamilator::Filter.new text
10
- end
11
-
12
- def score
13
- @filters.score
14
- end
15
-
16
- def matched_by
17
- @filters.matches
18
- end
19
- end
@@ -1,15 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec_helper.rb'
2
-
3
- describe Despamilator do
4
- before :each do
5
- @dspam = Despamilator.new('this text is absolutely fine')
6
- end
7
-
8
- it "should return a zero score for fine text" do
9
- @dspam.score.should == 0
10
- end
11
-
12
- it "should return no matching filter for fine text" do
13
- @dspam.matched_by.should be_empty
14
- end
15
- end
@@ -1,144 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
2
-
3
- context "HtmlTags" do
4
- describe "filtering" do
5
- [
6
- '!--',
7
- '!DOCTYPE',
8
- 'a',
9
- 'abbr',
10
- 'acronym',
11
- 'address',
12
- 'applet',
13
- 'area',
14
- 'b',
15
- 'base',
16
- 'basefont',
17
- 'bdo',
18
- 'big',
19
- 'blockquote',
20
- 'body',
21
- 'br',
22
- 'button',
23
- 'caption',
24
- 'center',
25
- 'cite',
26
- 'code',
27
- 'col',
28
- 'colgroup',
29
- 'dd',
30
- 'del',
31
- 'dfn',
32
- 'dir',
33
- 'div',
34
- 'dl',
35
- 'dt',
36
- 'em',
37
- 'fieldset',
38
- 'font',
39
- 'form',
40
- 'frame',
41
- 'frameset',
42
- 'h1',
43
- 'h2',
44
- 'h3',
45
- 'h4',
46
- 'h5',
47
- 'h6',
48
- 'head',
49
- 'hr',
50
- 'html',
51
- 'i',
52
- 'iframe',
53
- 'img',
54
- 'input',
55
- 'ins',
56
- 'isindex',
57
- 'kbd',
58
- 'label',
59
- 'legend',
60
- 'li',
61
- 'link',
62
- 'map',
63
- 'menu',
64
- 'meta',
65
- 'noframes',
66
- 'noscript',
67
- 'object',
68
- 'ol',
69
- 'optgroup',
70
- 'option',
71
- 'p',
72
- 'param',
73
- 'pre',
74
- 'q',
75
- 's',
76
- 'samp',
77
- 'select',
78
- 'small',
79
- 'span',
80
- 'strike',
81
- 'strong',
82
- 'style',
83
- 'sub',
84
- 'sup',
85
- 'table',
86
- 'tbody',
87
- 'td',
88
- 'textarea',
89
- 'tfoot',
90
- 'th',
91
- 'thead',
92
- 'title',
93
- 'tr',
94
- 'tt',
95
- 'u',
96
- 'ul',
97
- 'var',
98
- 'xmp'
99
- ].each do |script_tag|
100
- [script_tag.upcase, script_tag.downcase].each do |script_tag|
101
- [
102
- "<#{script_tag}",
103
- "#{script_tag}/>",
104
- "<#{script_tag}/>",
105
- "< #{script_tag} ",
106
- "#{script_tag} />",
107
- "<\n#{script_tag}\n/>",
108
- "<\n#{script_tag} ",
109
- "#{script_tag}\n/>",
110
- "<\r#{script_tag}\r/>"
111
- ].each do |script_tag|
112
- it "should detect '#{script_tag}'" do
113
- dspam = Despamilator.new(script_tag)
114
- dspam.score.should == 0.3
115
- end
116
- end
117
- end
118
- end
119
-
120
- describe 'attributes' do
121
- before :all do
122
- @dspam = Despamilator.new('<xmp>').matched_by.first
123
- end
124
-
125
- it "should have a name" do
126
- @dspam.name.should == 'Detects HTML tags in text'
127
- end
128
-
129
- it "should have a description" do
130
- @dspam.description.should == 'Searches for various HTML tags'
131
- end
132
-
133
- it "should have a filename" do
134
- @dspam.filename.should == 'html_tags.rb'
135
- end
136
- end
137
-
138
- describe 'bug fixes' do
139
- it "should detect an h1" do
140
- Despamilator.new('<h1>TITLE!!</h1>').score.should == 0.3
141
- end
142
- end
143
- end
144
- end
@@ -1,39 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
2
-
3
- describe "NaughtyQ" do
4
- it "should return a score for 1 misplaced q" do
5
- dspam = Despamilator.new('qtu')
6
- dspam.score.should == 0.2
7
- end
8
-
9
- describe 'attributes' do
10
- before :each do
11
- @filter = Despamilator.new('qtqt').matched_by.first
12
- end
13
-
14
- it "should have a filename" do
15
- @filter.filename.should == 'naughty_q.rb'
16
- end
17
-
18
- it "should have a name" do
19
- @filter.name.should == 'Naughty Q'
20
- end
21
-
22
- it "should have a description" do
23
- @filter.description.should == 'Detects possible misuse of the letter Q (English language)'
24
- end
25
-
26
- it "should have a number of matches" do
27
- @filter.matches.should == 2
28
- end
29
-
30
- it "should have a score" do
31
- @filter.score.should == 0.4
32
- end
33
- end
34
-
35
- it "should score more for 3 misplaced q's" do
36
- dspam = Despamilator.new('qtuqsq')
37
- dspam.score.to_s.should == 0.4.to_s
38
- end
39
- end
@@ -1,59 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
2
-
3
- describe "NumbersAndWords" do
4
- [1, 4, 10, 100000, '1,000,000', '1st', '2nd', '3rd', '4th', '5th', '6th', '10th', '122nd'].each do |number|
5
- it "should return a blank for a #{number}" do
6
- dspam = Despamilator.new(number)
7
- dspam.score.should == 0
8
- end
9
- end
10
-
11
- ['wanga x5 mool', '4ghk', 'XTHL9'].each do |string|
12
- it "should detect suspicious number word combos such as #{string}" do
13
- dspam = Despamilator.new(string)
14
- dspam.score.should == 0.1
15
- end
16
- end
17
-
18
- ['4wanga x5 mool', '4g6hk', 'XT7HL9', '77th8nd'].each do |string|
19
- it "should detect multiple suspicious number word combos such as #{string}" do
20
- dspam = Despamilator.new(string)
21
- dspam.score.should == 0.2
22
- end
23
- end
24
-
25
- [1, 2, 3, 4, 5, 6].each do |tag_no|
26
- header_tag = "h#{tag_no}"
27
-
28
- it "should ignore html header tag #{header_tag}" do
29
- dspam = Despamilator.new(header_tag)
30
- dspam.score.should == 0
31
- end
32
- end
33
-
34
- describe 'attributes' do
35
- before :each do
36
- @filter = Despamilator.new('X5T').matched_by.first
37
- end
38
-
39
- it "should have a filename" do
40
- @filter.filename.should == 'numbers_and_words.rb'
41
- end
42
-
43
- it "should have a name" do
44
- @filter.name.should == 'Numbers next to words'
45
- end
46
-
47
- it "should have a description" do
48
- @filter.description.should == 'Detects unusual number/word combinations'
49
- end
50
-
51
- it "should have a number of matches" do
52
- @filter.matches.should == 1
53
- end
54
-
55
- it "should have a score" do
56
- @filter.score.should == 0.1
57
- end
58
- end
59
- end
@@ -1,32 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
2
-
3
- context "ScriptTag" do
4
- describe "detecting various script tags" do
5
- ['<script type="whatever">', '<script></script>', '</script>', '<script>', "<script\n>"].each do |script_tag|
6
- [script_tag.upcase, script_tag.downcase].each do |script_tag|
7
- it "should detect '#{script_tag}' of a script tag" do
8
- dspam = Despamilator.new(script_tag)
9
- dspam.score.should == 1
10
- end
11
- end
12
- end
13
- end
14
-
15
- describe 'attributes' do
16
- before :all do
17
- @dspam = Despamilator.new('<script>').matched_by.first
18
- end
19
-
20
- it "should have a name" do
21
- @dspam.name.should == 'Detects script tags in text'
22
- end
23
-
24
- it "should have a description" do
25
- @dspam.description.should == 'Searches for variations for the HTML script tag'
26
- end
27
-
28
- it "should have a filename" do
29
- @dspam.filename.should == 'script_tag.rb'
30
- end
31
- end
32
- end
@@ -1 +0,0 @@
1
- --colour
@@ -1,10 +0,0 @@
1
- begin
2
- require 'spec'
3
- rescue LoadError
4
- require 'rubygems' unless ENV['NO_RUBYGEMS']
5
- gem 'rspec'
6
- require 'spec'
7
- end
8
-
9
- $:.unshift(File.dirname(__FILE__) + '/../lib')
10
- require 'despamilator'
@@ -1,21 +0,0 @@
1
- begin
2
- require 'spec'
3
- rescue LoadError
4
- require 'rubygems' unless ENV['NO_RUBYGEMS']
5
- require 'spec'
6
- end
7
- begin
8
- require 'spec/rake/spectask'
9
- rescue LoadError
10
- puts <<-EOS
11
- To use rspec for testing you must install rspec gem:
12
- gem install rspec
13
- EOS
14
- exit(0)
15
- end
16
-
17
- desc "Run the specs under spec/models"
18
- Spec::Rake::SpecTask.new do |t|
19
- t.spec_opts = ['--options', "spec/spec.opts"]
20
- t.spec_files = FileList['spec/**/*_spec.rb']
21
- end
Binary file
Binary file