defender 2.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -44,14 +44,29 @@ module Defender
44
44
  # database and in defensio.
45
45
  # @option options [String] :api_key Your Defensio API key. Get one at
46
46
  # defensio.com.
47
+ # @option options [Boolean] :test_mode Set Defender in test mode. See
48
+ # {#test_mode}.
47
49
  #
48
50
  def configure_defender(options)
49
51
  keys = options.delete(:keys)
50
52
  _defensio_keys.merge!(keys) unless keys.nil?
51
53
  api_key = options.delete(:api_key)
52
54
  Defender.api_key = api_key unless api_key.nil?
55
+ self.test_mode = options.delete(:test_mode)
53
56
  end
54
57
 
58
+ ##
59
+ # Set this to true to put Defender in "test mode". When in test mode, you
60
+ # can check if your code is working properly you can specify in the
61
+ # content field what kind of response you want. If you want a comment to
62
+ # be marked as spam with a spaminess of 0.85 you write [spam,0.85]
63
+ # somewhere in the content field of the document. If you want a malicious
64
+ # response with a spaminess of 0.99 you write [malicious,0.99] and for an
65
+ # innocent response you write [innocent,0.25]. This is the preferred way
66
+ # of testing, if you write spammy comments you might hurt the Defensio
67
+ # performance.
68
+ attr_accessor :test_mode
69
+
55
70
  ##
56
71
  # Returns the key-attribute mapping used.
57
72
  #
@@ -122,7 +137,7 @@ module Defender
122
137
  end
123
138
  data.merge!({
124
139
  'platform' => 'ruby',
125
- 'type' => 'comment'
140
+ 'type' => (self.class.test_mode ? 'test' : 'comment')
126
141
  })
127
142
  data.merge!(defensio_data) if defined?(@_defensio_data)
128
143
  document = Defender.defensio.post_document(data).last
@@ -1,4 +1,4 @@
1
1
  module Defender
2
2
  # Current Defender version
3
- VERSION = '2.0.0'
3
+ VERSION = '2.0.1'
4
4
  end
metadata CHANGED
@@ -1,127 +1,96 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: defender
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 2
7
- - 0
8
- - 0
9
- version: 2.0.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.1
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Henrik Hodne
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2011-01-19 00:00:00 +00:00
12
+ date: 2011-07-02 00:00:00.000000000 +02:00
18
13
  default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
21
16
  name: defensio
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
17
+ requirement: &2168669980 !ruby/object:Gem::Requirement
24
18
  none: false
25
- requirements:
19
+ requirements:
26
20
  - - ~>
27
- - !ruby/object:Gem::Version
28
- segments:
29
- - 0
30
- - 9
31
- - 1
21
+ - !ruby/object:Gem::Version
32
22
  version: 0.9.1
33
23
  type: :runtime
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: activemodel
37
24
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
25
+ version_requirements: *2168669980
26
+ - !ruby/object:Gem::Dependency
27
+ name: activemodel
28
+ requirement: &2168669400 !ruby/object:Gem::Requirement
39
29
  none: false
40
- requirements:
30
+ requirements:
41
31
  - - ~>
42
- - !ruby/object:Gem::Version
43
- segments:
44
- - 3
45
- - 0
46
- - 0
32
+ - !ruby/object:Gem::Version
47
33
  version: 3.0.0
48
34
  type: :runtime
49
- version_requirements: *id002
50
- - !ruby/object:Gem::Dependency
35
+ prerelease: false
36
+ version_requirements: *2168669400
37
+ - !ruby/object:Gem::Dependency
51
38
  name: bundler
39
+ requirement: &2168668920 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ type: :development
52
46
  prerelease: false
53
- requirement: &id003 !ruby/object:Gem::Requirement
47
+ version_requirements: *2168668920
48
+ - !ruby/object:Gem::Dependency
49
+ name: rake
50
+ requirement: &2168668400 !ruby/object:Gem::Requirement
54
51
  none: false
55
- requirements:
56
- - - ~>
57
- - !ruby/object:Gem::Version
58
- segments:
59
- - 1
60
- - 0
61
- - 0
62
- version: 1.0.0
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
63
56
  type: :development
64
- version_requirements: *id003
65
- description: An ActiveModel plugin for Defensio.
66
- email:
57
+ prerelease: false
58
+ version_requirements: *2168668400
59
+ description:
60
+ email:
67
61
  - dvyjones@dvyjones.com
68
62
  executables: []
69
-
70
63
  extensions: []
71
-
72
64
  extra_rdoc_files: []
73
-
74
- files:
75
- - .document
76
- - .gitignore
77
- - Gemfile
78
- - LICENSE
79
- - README.md
80
- - Rakefile
81
- - defender.gemspec
82
- - lib/defender.rb
65
+ files:
83
66
  - lib/defender/defender_error.rb
84
67
  - lib/defender/spammable.rb
85
68
  - lib/defender/test/comment.rb
86
69
  - lib/defender/version.rb
87
- - spec/defender/spammable_spec.rb
88
- - spec/fake_defensio.rb
89
- - spec/spec.opts
90
- - spec/spec_helper.rb
70
+ - lib/defender.rb
91
71
  has_rdoc: true
92
- homepage: http://rubygems.org/gems/dvyjones
72
+ homepage:
93
73
  licenses: []
94
-
95
74
  post_install_message:
96
75
  rdoc_options: []
97
-
98
- require_paths:
99
- - - lib
100
- required_ruby_version: !ruby/object:Gem::Requirement
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
101
79
  none: false
102
- requirements:
103
- - - ">="
104
- - !ruby/object:Gem::Version
105
- segments:
106
- - 0
107
- version: "0"
108
- required_rubygems_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ! '>='
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
85
  none: false
110
- requirements:
111
- - - ">="
112
- - !ruby/object:Gem::Version
113
- segments:
114
- - 0
115
- version: "0"
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
116
90
  requirements: []
117
-
118
91
  rubyforge_project:
119
- rubygems_version: 1.3.7
92
+ rubygems_version: 1.6.2
120
93
  signing_key:
121
94
  specification_version: 3
122
95
  summary: ActiveModel plugin for Defensio.
123
- test_files:
124
- - spec/defender/spammable_spec.rb
125
- - spec/fake_defensio.rb
126
- - spec/spec.opts
127
- - spec/spec_helper.rb
96
+ test_files: []
data/.document DELETED
@@ -1,5 +0,0 @@
1
- README.md
2
- lib/**/*.rb
3
- bin/*
4
- features/**/*.feature
5
- LICENSE
data/.gitignore DELETED
@@ -1,25 +0,0 @@
1
- ## MAC OS
2
- .DS_Store
3
-
4
- ## TEXTMATE
5
- *.tmproj
6
- tmtags
7
-
8
- ## EMACS
9
- *~
10
- \#*
11
- .\#*
12
-
13
- ## VIM
14
- *.swp
15
-
16
- ## PROJECT::GENERAL
17
- coverage
18
- rdoc
19
- pkg
20
- doc
21
- .yardoc
22
-
23
- ## PROJECT::SPECIFIC
24
-
25
- .bundle
data/Gemfile DELETED
@@ -1,7 +0,0 @@
1
- source :rubygems
2
-
3
- gemspec
4
-
5
- gem 'watchr', '~> 0.7'
6
- gem 'rspec', '~> 2.1.0'
7
- gem 'yard', '~> 0.6.3'
data/LICENSE DELETED
@@ -1,20 +0,0 @@
1
- Copyright (c) 2009-2010 Henrik Hodne
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining
4
- a copy of this software and associated documentation files (the
5
- "Software"), to deal in the Software without restriction, including
6
- without limitation the rights to use, copy, modify, merge, publish,
7
- distribute, sublicense, and/or sell copies of the Software, and to
8
- permit persons to whom the Software is furnished to do so, subject to
9
- the following conditions:
10
-
11
- The above copyright notice and this permission notice shall be
12
- included in all copies or substantial portions of the Software.
13
-
14
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md DELETED
@@ -1,193 +0,0 @@
1
- Defender
2
- ========
3
-
4
- Defender is a wrapper for the [Defensio][0] spam filtering API. From
5
- their own site:
6
-
7
- > More than just another spam filter, Defensio also eliminates malware
8
- > and other unwanted or risky content to fully protect your blog or Web
9
- > 2.0 application.
10
-
11
- Defensio is able to not only find spam, but also filter profanity and
12
- other similarities. It can also see the difference between malicious
13
- material and spammy material.
14
-
15
-
16
- Overview
17
- --------
18
-
19
- With Defender you can submit documents to Defensio, which will look for
20
- spam and malicious content in the documents.
21
-
22
- A document contains content to be analyzed by Defensio, or that has been
23
- analyzed.
24
-
25
- To use Defender, you need to retrieve an API key from
26
- [Defensio][4]. Then add Defender (`gem 'defender'`) to your Gemfile and run
27
- `bundle install`. To set up Defender, open your Comment class and include
28
- Defender::Spammable, and configure it by adding your API key. Your comment
29
- class should look something like this:
30
-
31
- class Comment < ActiveRecord::Base
32
- include Defender::Spammable
33
- configure_defender :api_key => '0123456789abcdef'
34
- end
35
-
36
- Now you need to add a few fields to your model. Defender requires a boolean
37
- field named "spam" (this will be `true` for comments marked as spam, and
38
- `false otherwise`), and a string field named "defensio_sig" (this will include
39
- a unique identifier so you can later mark false positives and negatives).
40
- Defender will also set the spaminess field if it exists (the spaminess field
41
- should be a float that can range between 0.00 and 1.00, where 0.00 is the
42
- least spammy and 1.00 is the most spammy). After you've done this, you're
43
- probably done setting up Defender, although you should read on as there's some
44
- more things you should know.
45
-
46
- Defender will automatically get the comment body, author name, email, IP and
47
- URL if you have them in your comment class with "standard names". Defender
48
- will look for fields named "body", "content" and "comment" (in that order) for
49
- the comment content, "author_name", "author" for the author name,
50
- "author_email", "email" for the author email, "author_ip", "ip" for the author
51
- IP, "author_url", "url" for the author URL. Only the comment content is the
52
- required one of these. If you're not using those attribute names, look further
53
- down in the readme under "Defining your own attribute names".
54
-
55
- Not using ActiveRecord? No problem, Defender supports all libraries that
56
- support ActiveModel, including Mongoid, MongoMapper and DataMapper. The syntax
57
- is the exact same, just use the method your library uses to set up the fields
58
- needed.
59
-
60
-
61
- Defining your own attribute names
62
- ---------------------------------
63
-
64
- Defensio supports a large amount of attributes you can send to it, and the
65
- more you send the more accurately it can determine whether it's spam or not.
66
- For some of these attributes, Defender will use conventions and try to find
67
- the attribute, but not all are set up (look at
68
- Defender::Spammable::DEFENSIO_KEYS for the exact keys it uses). If you are
69
- using other attribute names, or want to add more to get more accurate spam
70
- evaluation, you do that in the `configure_defender` method. Pass in another
71
- option called `:keys`, which should be a hash of defensio key names and
72
- attribute names. The list of defensio key names are after the code example,
73
- and the attribute name is just a symbol. So if your comment content field is
74
- called "the_comment_itself", your comment class should look like this:
75
-
76
- class Comment
77
- include Defender::Spammable
78
- configure_defender :api_key => '0123456789abcdef', :keys => { 'content' => :the_comment_itself }
79
- end
80
-
81
- If you don't want to store all the information in the database, you can also
82
- use the `defensio_data` method. In the model, before saving, call
83
- `defensio_data` with a hash containing the data you want to send. The keys
84
- should be strings, you can see all the possible values listed below. The
85
- `defensio_data` method can be called several times with more data.
86
-
87
- These are the keys defensio supports (at the time of writing, see
88
- http://defensio.com/api for a completely up-to-date list):
89
-
90
- * **author-email**: The email address of the author of the document.
91
- * **author-ip**: The IP address of the author of the document.
92
- * **author-logged-in**: Whether or not the user posting the document is logged
93
- onto your Web site, either through your own authentication method or
94
- through OpenID.
95
- * **author-name**: The name of the author of the document.
96
- * **author-openid**: The OpenID URL of the logged-on user. Must be used in
97
- conjunction with user-logged-in=true.
98
- * **author-trusted**: Whether or not the user is an administrator, moderator,
99
- or editor of your Web site. Pass true only if you can guarantee that the
100
- user has been authenticated, has a role of responsibility, and can be
101
- trusted as a good Web citizen.
102
- * **author-url**: The URL of the person posting the document.
103
- * **browser-cookies**: Whether or not the Web browser used to post the
104
- document (ie. the comment) has cookies enabled. If no such detection has
105
- been made, leave this value empty.
106
- * **browser-javascript**: Whether or not the Web browser used to post the
107
- document (ie. the comment) has JavaScript enabled. If no such detection
108
- has been made, leave this value empty.
109
- * **document-permalink**: The URL to the document being posted.
110
- * **http-headers**: Contains the HTTP headers sent with the request. You can
111
- send a few values or all values. Because this information helps Defensio
112
- determine if a document is innocent or not, the more headers you send, the
113
- better. The format of this value is one key/value pair per line, each line
114
- starting with the key followed by a colon and then the value.
115
- * **parent-document-date**: The date the parent document was posted. For
116
- example, on a blog, this would be the date the article related to the
117
- comment (document) was posted. If you're using threaded comments, send the
118
- date the article was posted, not the date the parent comment was posted.
119
- * **parent-document-permalink**: The URL of the parent document. For example,
120
- on a blog, this would be the URL the article related to the comment
121
- (document) was posted.
122
- * **referrer**: Provide the value of the HTTP_REFERER (note spelling) in this
123
- field.
124
- * **title**: Provide the title of the document being sent. For example, this
125
- might be the title of a blog article.
126
-
127
-
128
- Development
129
- -----------
130
-
131
- Want to help out on Defender?
132
-
133
- First, you should clone the repo and run the features and specs:
134
-
135
- git clone git://github.com/dvyjones/defender.git
136
- cd defender
137
- rake spec
138
-
139
- Feel free to ping the mailing list if you have any problems and we'll
140
- try to sort it out.
141
-
142
-
143
- Contributing
144
- ------------
145
-
146
- Once you've made your great commits:
147
-
148
- 1. [Fork][1] defender
149
- 2. Create a topic branch - `git checkout -b my_branch`
150
- 3. Push to your branch - `git push origin my_branch`
151
- 4. Create an [Issue][2] with a link to your branch
152
- 5. That's it!
153
-
154
- You might want to checkout our [Contributing][cb] wiki page for
155
- information on coding standards, new features, etc.
156
-
157
-
158
- Mailing List
159
- ------------
160
-
161
- To join the list simply send an email to <defender@librelist.com>. This
162
- will subscribe you and send you information about your subscription,
163
- include unsubscribe information.
164
-
165
- The archive can be found at <http://librelist.com/browser/>.
166
-
167
-
168
- Meta
169
- ----
170
-
171
- * Code: `git clone git://github.com/dvyjones/defender.git`
172
- * Home: <http://github.com/dvyjones/defender/>
173
- * Docs: <http://rubydoc.info/github/dvyjones/defender/maser/frames>
174
- * Bugs: <http://github.com/dvyjones/defender/issues>
175
- * List: <defender@librelist.com>
176
- * Gems: <http://rubygems.org/gems/defender>
177
-
178
- This project uses [Semantic Versioning][sv].
179
-
180
-
181
- Author
182
- ------
183
-
184
- Henrik Hodne :: <dvyjones@binaryhex.com> :: @[dvyjones][5]
185
-
186
- [0]: http://defensio.com
187
- [1]: http://help.github.com/forking/
188
- [2]: http://github.com/dvyjones/defender/issues
189
- [3]: http://defensio.com/api
190
- [4]: http://defensio.com/signup/
191
- [5]: http://twitter.com/dvyjones
192
- [sv]: http://semver.org
193
- [cb]: http://wiki.github.com/dvyjones/defender/contributing
data/Rakefile DELETED
@@ -1,25 +0,0 @@
1
- # coding:utf-8
2
- $:.unshift File.expand_path('../lib', __FILE__)
3
-
4
- require 'bundler'
5
- require 'rubygems'
6
- require 'rubygems/specification'
7
- require 'defender'
8
-
9
- Bundler::GemHelper.install_tasks
10
-
11
- require 'rspec/core/rake_task'
12
- RSpec::Core::RakeTask.new(:spec) do |t|
13
- t.rspec_opts = %w{-fs --color}
14
- end
15
-
16
- begin
17
- require 'yard'
18
- rescue LoadError
19
- raise 'Run `gem install yard` to generate docs'
20
- else
21
- YARD::Rake::YardocTask.new do |conf|
22
- conf.options = ['-mmarkdown', '-rREADME.md']
23
- conf.files = ['lib/**/*.rb', '-', 'LICENSE']
24
- end
25
- end
@@ -1,22 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- require File.expand_path("../lib/defender/version", __FILE__)
3
-
4
- Gem::Specification.new do |s|
5
- s.name = "defender"
6
- s.version = Defender::VERSION
7
- s.platform = Gem::Platform::RUBY
8
- s.authors = ['Henrik Hodne']
9
- s.email = ['dvyjones@dvyjones.com']
10
- s.homepage = 'http://rubygems.org/gems/dvyjones'
11
- s.summary = 'ActiveModel plugin for Defensio.'
12
- s.description = 'An ActiveModel plugin for Defensio.'
13
-
14
- s.add_dependency('defensio', '~> 0.9.1')
15
- s.add_dependency('activemodel', '~> 3.0.0')
16
- s.add_development_dependency('bundler', '~> 1.0.0')
17
-
18
- s.files = `git ls-files`.split("\n")
19
- s.test_files = `git ls-files -- spec/*`.split("\n")
20
-
21
- s.require_path = ['lib']
22
- end
@@ -1,124 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Defender
4
- describe Spammable do
5
- describe '.configure_defender' do
6
- it 'sets the attribute-data key mappers' do
7
- Comment.configure_defender(:keys => {'foo' => :bar, 'foobar' => :baz})
8
- Comment._defensio_keys.should include({'foo' => :bar, 'foobar' => :baz})
9
- end
10
-
11
- it 'sets the API key' do
12
- Comment.configure_defender(:api_key => 'foobar')
13
- Defender.api_key.should == 'foobar'
14
- end
15
- end
16
-
17
- describe '#spam?' do
18
- it 'returns the "spam" attribute unless it is nil' do
19
- comment_class = Class.new
20
- comment_class.instance_eval { attr_accessor :spam }
21
- def comment_class.before_save(*args, &block); end
22
- comment_class.send(:define_method, :new_record?) { false }
23
- comment_class.send(:include, Defender::Spammable)
24
- comment = comment_class.new
25
- comment.spam = true
26
- comment.spam?.should be_true
27
- end
28
-
29
- it 'returns nil for a new record' do
30
- comment_class = Class.new
31
- comment_class.instance_eval { attr_accessor :spam }
32
- def comment_class.before_save(*args, &block); end
33
- comment_class.send(:define_method, :new_record?) { true }
34
- comment_class.send(:include, Defender::Spammable)
35
- comment = comment_class.new
36
- comment.spam?.should be_nil
37
- end
38
-
39
- it 'raises a DefenderError if no spam attribute exists' do
40
- comment_class = Class.new
41
- def comment_class.before_save(*args, &block); end
42
- comment_class.send(:define_method, :new_record?) { false }
43
- comment_class.send(:include, Defender::Spammable)
44
- comment = comment_class.new
45
- expect { comment.spam? }.to raise_error(Defender::DefenderError)
46
- end
47
- end
48
-
49
- describe '#defensio_data' do
50
- it 'merges in more data to be sent to Defensio' do
51
- comment = Comment.new
52
- comment.defensio_data({'foo' => 'FOOBAR', 'foobar' => 'baz'})
53
- comment.defensio_data.should include({'foo' => 'FOOBAR', 'foobar' => 'baz'})
54
- end
55
-
56
- it 'overwrites values repassed' do
57
- comment = Comment.new
58
- comment.defensio_data({'foo' => 'FOOBAR'})
59
- comment.defensio_data({'foo' => 'baz'})
60
- comment.defensio_data['foo'].should == 'baz'
61
- end
62
-
63
- it 'leaves values that aren\'t modified' do
64
- comment = Comment.new
65
- comment.defensio_data({'foo' => 'baz'})
66
- comment.defensio_data({'bar' => 'foobar'})
67
- comment.defensio_data['foo'].should == 'baz'
68
- end
69
- end
70
-
71
- describe '#_defender_before_save' do
72
- it 'sets the attributes returned from defensio' do
73
- comment = Comment.new
74
- comment.body = '[innocent,0.9]'
75
- comment.save
76
- comment.spam.should be_false
77
- comment.defensio_sig.should_not be_nil
78
- end
79
-
80
- it 'sends the information off to Defensio' do
81
- old_defensio = Defender.defensio
82
- defensio = double('defensio')
83
- defensio.should_receive(:post_document) { [200, {'signature' => 1234567890, 'spaminess' => 0.9, 'allow' => true}] }
84
- Defender.defensio = defensio
85
- comment = Comment.new
86
- comment.body = 'Hello, world!'
87
- comment.save
88
- Defender.defensio = old_defensio
89
- end
90
- end
91
-
92
- describe '#_pick_attribute' do
93
- it 'returns the value of the attribute passed if it exists' do
94
- comment = Comment.new
95
- comment.body = 'Foobar!'
96
- comment.send(:_pick_attribute, :body).should == 'Foobar!'
97
- end
98
-
99
- it 'returns the value for the first attribute that exists in a list of attributes' do
100
- comment = Comment.new
101
- comment.body = 'Foobar!'
102
- comment.send(:_pick_attribute, [:content, :body]).should == 'Foobar!'
103
- end
104
-
105
- it 'returns nil if no attribute with the given names exists' do
106
- comment = Comment.new
107
- comment.send(:_pick_attribute, :bogus_attribute).should be_nil
108
- end
109
- end
110
-
111
- describe '#_get_defensio_document' do
112
- it 'retrieves the document from Defensio' do
113
- old_defensio = Defender.defensio
114
- defensio = double('defensio')
115
- defensio.should_receive(:get_document) { [200, {'status' => 'succeed'}] }
116
- Defender.defensio = defensio
117
- comment = Comment.new
118
- comment.defensio_sig = '0123456789abcdef'
119
- comment.send(:_get_defensio_document)
120
- Defender.defensio = old_defensio
121
- end
122
- end
123
- end
124
- end
@@ -1,36 +0,0 @@
1
- class FakeDefensio
2
- def initialize
3
- @documents = {}
4
- end
5
-
6
- def post_document(data)
7
- content = data[:content] || data['content']
8
- classification, spaminess = content[1..-2].split(',')
9
- signature = "#{rand}#{content}".hash
10
-
11
- @documents[signature] = {
12
- 'api-version' => '2.0',
13
- 'status' => 'success',
14
- 'message' => '',
15
- 'signature' => signature,
16
- 'allow' => (classification == 'innocent'),
17
- 'classification' => classification,
18
- 'spaminess' => spaminess.to_f,
19
- 'profanity-match' => false
20
- }
21
-
22
- [200, @documents[signature]]
23
- end
24
-
25
- def get_document(signature)
26
- if @documents.has_key?(signature)
27
- [200, @documents[signature]]
28
- else
29
- [404,
30
- 'api-version' => '2.0',
31
- 'status' => 'failure',
32
- 'message' => 'document not found'
33
- ]
34
- end
35
- end
36
- end
@@ -1,2 +0,0 @@
1
- --color
2
- --format nested
@@ -1,7 +0,0 @@
1
- require 'defender'
2
- require 'defender/test/comment'
3
- require 'fake_defensio'
4
-
5
- Comment = Defender::Test::Comment
6
-
7
- Defender.defensio = FakeDefensio.new