defensio 0.9.0 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -9,8 +9,8 @@ begin
9
9
  gemspec.description = "Official Ruby library for Defensio 2.0"
10
10
  gemspec.email = "support@defensio.com"
11
11
  gemspec.homepage = "http://github.com/defensio/defensio-ruby"
12
- gemspec.authors = ["Carl Mercier"]
13
- gemspec.add_dependency('patron', '>= 0.4.4')
12
+ gemspec.authors = ["The Defensio Team", "Carl Mercier"]
13
+ gemspec.add_dependency('httparty', '>= 0.5.0')
14
14
  end
15
15
  Jeweler::GemcutterTasks.new
16
16
  rescue LoadError
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.9.0
1
+ 0.9.1
@@ -0,0 +1,51 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{defensio}
8
+ s.version = "0.9.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["The Defensio Team", "Carl Mercier"]
12
+ s.date = %q{2010-01-21}
13
+ s.description = %q{Official Ruby library for Defensio 2.0}
14
+ s.email = %q{support@defensio.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README"
18
+ ]
19
+ s.files = [
20
+ ".gitignore",
21
+ "LICENSE",
22
+ "README",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "defensio.gemspec",
26
+ "lib/defensio.rb",
27
+ "test/defensio_test.rb"
28
+ ]
29
+ s.homepage = %q{http://github.com/defensio/defensio-ruby}
30
+ s.rdoc_options = ["--charset=UTF-8"]
31
+ s.require_paths = ["lib"]
32
+ s.rubygems_version = %q{1.3.5}
33
+ s.summary = %q{Official Ruby library for Defensio 2.0}
34
+ s.test_files = [
35
+ "test/defensio_test.rb"
36
+ ]
37
+
38
+ if s.respond_to? :specification_version then
39
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
40
+ s.specification_version = 3
41
+
42
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
43
+ s.add_runtime_dependency(%q<httparty>, [">= 0.5.0"])
44
+ else
45
+ s.add_dependency(%q<httparty>, [">= 0.5.0"])
46
+ end
47
+ else
48
+ s.add_dependency(%q<httparty>, [">= 0.5.0"])
49
+ end
50
+ end
51
+
@@ -9,7 +9,7 @@
9
9
  #
10
10
 
11
11
  require 'rubygems'
12
- require 'patron'
12
+ require 'httparty'
13
13
  require 'uri'
14
14
 
15
15
  class Defensio
@@ -18,14 +18,18 @@ class Defensio
18
18
  API_HOST = "http://api.defensio.com"
19
19
 
20
20
  # You should't modify anything below this line.
21
- LIB_VERSION = "0.9"
21
+ LIB_VERSION = "0.9.1"
22
22
  ROOT_NODE = "defensio-result"
23
23
  FORMAT = :yaml
24
24
  USER_AGENT = "Defensio-Ruby #{LIB_VERSION}"
25
25
  CLIENT = "Defensio-Ruby | #{LIB_VERSION} | Carl Mercier | cmercier@websense.com"
26
26
  KEEP_ALIVE = false
27
27
 
28
- attr_reader :http_session, :client
28
+ include HTTParty
29
+ format FORMAT
30
+ base_uri API_HOST
31
+
32
+ attr_reader :api_key, :client
29
33
 
30
34
  def initialize(api_key, client = CLIENT)
31
35
  @client = client
@@ -34,7 +38,7 @@ class Defensio
34
38
 
35
39
  # Get information about the api key
36
40
  def get_user
37
- call :get, api_url
41
+ respond self.class.get(api_path)
38
42
  end
39
43
 
40
44
  # Create and analyze a new document
@@ -42,14 +46,14 @@ class Defensio
42
46
  # @return [Array] An array containing 2 values: the HTTP status code & a Hash with the values returned by Defensio
43
47
  def post_document(data)
44
48
  data = { :client => @client }.merge(data)
45
- call :post, api_url("documents"), data
49
+ respond self.class.post(api_path("documents"), :body => data)
46
50
  end
47
51
 
48
52
  # Get the status of an existing document
49
53
  # @param [String] signature The signature of the document to retrieve
50
54
  # @return [Array] An array containing 2 values: the HTTP status code & a Hash with the values returned by Defensio
51
55
  def get_document(signature)
52
- call :get, api_url("documents", signature)
56
+ respond self.class.get(api_path("documents", signature))
53
57
  end
54
58
 
55
59
  # Modify the properties of an existing document
@@ -57,30 +61,33 @@ class Defensio
57
61
  # @param [Hash] data The parameters to be sent to Defensio. Keys can either be Strings or Symbols
58
62
  # @return [Array] An array containing 2 values: the HTTP status code & a Hash with the values returned by Defensio
59
63
  def put_document(signature, data)
60
- call :put, api_url("documents", signature), data
64
+ respond self.class.put(api_path("documents", signature), :body => data)
61
65
  end
62
66
 
63
67
  # Get basic statistics for the current user
64
68
  # @return [Array] An array containing 2 values: the HTTP status code & a Hash with the values returned by Defensio
65
69
  def get_basic_stats
66
- call :get, api_url("basic-stats")
70
+ respond self.class.get(api_path("basic-stats"))
67
71
  end
68
72
 
69
73
  # Get more exhaustive statistics for the current user
70
74
  # @param [Hash] data The parameters to be sent to Defensio. Keys can either be Strings or Symbols
71
75
  # @return [Array] An array containing 2 values: the HTTP status code & a Hash with the values returned by Defensio
72
76
  def get_extended_stats(data)
73
- result = call(:get, api_url("extended-stats"), data)
74
- 0.upto(result[1]["data"].size - 1) do |i|
75
- result[1]["data"][i]["date"] = Date.parse(result[1]["data"][i]["date"])
77
+ result = self.class.get(api_path("extended-stats"), :query => data)
78
+ code = result.code
79
+ result = result[ROOT_NODE]
80
+
81
+ 0.upto(result["data"].size - 1) do |i|
82
+ result["data"][i]["date"] = Date.parse(result["data"][i]["date"])
76
83
  end
77
84
 
78
- result
85
+ [code, result]
79
86
  end
80
87
 
81
88
  # Filter a set of values based on a pre-defined dictionary
82
89
  def post_profanity_filter(data)
83
- call :post, api_url("profanity-filter"), data
90
+ respond self.class.post(api_path("profanity-filter"), :body => data)
84
91
  end
85
92
 
86
93
  # Takes the request object (Rails, Sinatra, Merb) of an async request callback and returns a hash
@@ -90,7 +97,7 @@ class Defensio
90
97
  def handle_post_document_async_callback(request)
91
98
  if request.is_a?(String)
92
99
  data = request
93
- elsif request.respond_to?(:body) && request.body.is_a?(StringIO)
100
+ elsif request.respond_to?(:body) && request.body.respond_to?(:read)
94
101
  data = request.body.read
95
102
  else
96
103
  raise ArgumentError, "Unknown request type: #{request.class}"
@@ -105,47 +112,16 @@ class Defensio
105
112
  end
106
113
 
107
114
  protected
108
- def api_url(action = nil, id = nil)
109
- path = "#{API_HOST}/#{API_VERSION}/users/#{@api_key}"
115
+ def respond(response)
116
+ [response.code, response[ROOT_NODE]]
117
+ end
118
+
119
+ def api_path(action = nil, id = nil)
120
+ path = "/#{API_VERSION}/users/#{@api_key}"
110
121
  path += "/#{action}" if action
111
122
  path += "/#{id}" if id
112
123
  path += ".#{FORMAT}"
113
124
  end
114
-
115
- def http_session
116
- return @http_session if KEEP_ALIVE && @http_session
117
- @http_session = Patron::Session.new
118
- @http_session.timeout = 20
119
- @http_session.headers['User-Agent'] = USER_AGENT
120
- @http_session.headers['Content-Type'] = "text/#{FORMAT}"
121
- @http_session
122
- end
123
-
124
- def http_session=(session)
125
- @http_session = session
126
- end
127
-
128
- def call(method, url, data = nil)
129
- data = hash_to_query_string(data) if data.is_a?(Hash)
130
- url = url + "?#{data}" unless data.nil? || data.empty?
131
-
132
- response = case method
133
- when :get
134
- http_session.get(url)
135
- when :delete
136
- http_session.delete(url)
137
- when :post
138
- http_session.post(url, {})
139
- when :put
140
- http_session.put(url, {})
141
- else
142
- raise(ArgumentError, "Invalid HTTP method: #{method}")
143
- end
144
-
145
- http_session = nil unless KEEP_ALIVE
146
-
147
- [response.status, parse_body(response.body)]
148
- end
149
125
 
150
126
  def parse_body(str)
151
127
  if FORMAT == :yaml
@@ -155,19 +131,4 @@ class Defensio
155
131
  end
156
132
  end
157
133
 
158
- def hash_to_query_string(data)
159
- return nil unless data.is_a?(Hash)
160
- out = ""
161
- sort_hash_by_key(data).each do |item|
162
- k, v = item[0], item[1]
163
- out += "&" unless out.empty?
164
- k = k.to_s.gsub(/_/, "-") if k.is_a?(Symbol)
165
- out += "#{k}=#{URI.escape(v.to_s)}"
166
- end
167
- out
168
- end
169
-
170
- def sort_hash_by_key(hash)
171
- hash.keys.sort_by {|s| s.to_s}.map {|key| [key, hash[key]] }
172
- end
173
134
  end
@@ -1,78 +1,70 @@
1
- require File.dirname(__FILE__) + "/../lib/defensio"
2
1
  DEFENSIO_ENV = "test"
2
+
3
+ require File.dirname(__FILE__) + "/../lib/defensio"
3
4
  require 'test/unit'
4
5
  require 'mocha'
5
6
  require 'redgreen'
6
7
  require 'ostruct'
7
8
 
8
- class DefensioTest < Test::Unit::TestCase
9
- MOCK_RESPONSE = true
10
- API_KEY = "1234567890"
11
- OWNER_URL = "http://example.org"
12
- SIGNATURE = "abcdefghijklmnop"
9
+ # You must run this script as following:
10
+ # $ DEFENSIO_KEY=<your api key here> ruby test/defensio_test.rb
13
11
 
14
- API_VERSION = 2.0
12
+ class DefensioTest < Test::Unit::TestCase
15
13
  API_HOST = "http://api.defensio.com"
14
+ API_VERSION = 2.0
15
+ OWNER_URL = "http://example.org"
16
16
  FORMAT = :yaml
17
17
  HEADERS = {"User-Agent" => "Defensio-Ruby #{Defensio::LIB_VERSION}", "Content-Type" => "text/yaml"}
18
18
 
19
19
  # API METHOD TESTS -- Useful to learn how to use the library
20
20
  def test_get_user
21
- if MOCK_RESPONSE
22
- Patron::Session.any_instance.expects(:get).with("#{API_HOST}/#{API_VERSION}/users/#{API_KEY}.#{FORMAT}").once.returns(FakePatronResponse.new(200, user_body))
23
- end
24
-
25
21
  status, body = @d.get_user
26
22
  assert body.is_a?(Hash)
27
23
  assert_equal 200, status
28
24
  assert_equal "success", body["status"]
29
25
  end
30
26
 
31
- def test_post_document
32
- if MOCK_RESPONSE
33
- query = "client=Defensio-Ruby%20%7C%20#{Defensio::LIB_VERSION}%20%7C%20Carl%20Mercier%20%7C%20cmercier@websense.com&content=We%20sell%20cheap%20Viagra!%20[spam,0.95]&platform=my_awesome_app&type=test"
34
- Patron::Session.any_instance.expects(:post).with("#{API_HOST}/#{API_VERSION}/users/#{API_KEY}/documents.#{FORMAT}?#{query}", {}).once.returns(FakePatronResponse.new(200, document_body(SIGNATURE)))
35
- end
36
-
37
- data = { :content => "We sell cheap Viagra! [spam,0.95]", :platform => "my_awesome_app", :type => "test" }
27
+ def test_post_get_put_document
28
+ # POST
29
+ data = { :content => "This is a simple test", :platform => "my_awesome_app", :type => "comment" }
38
30
  status, body = @d.post_document(data)
39
31
  assert body.is_a?(Hash)
40
32
  assert_equal 200, status
41
33
  assert_equal "success", body["status"]
42
34
  assert body["signature"].is_a?(String)
43
- end
44
-
45
- def test_get_document
46
- if MOCK_RESPONSE
47
- Patron::Session.any_instance.expects(:get).with("#{API_HOST}/#{API_VERSION}/users/#{API_KEY}/documents/#{SIGNATURE}.#{FORMAT}").once.returns(FakePatronResponse.new(200, document_body(SIGNATURE)))
48
- end
49
-
50
- status, body = @d.get_document(SIGNATURE)
35
+
36
+ # Keep some variables around
37
+ original_allow_result = body["allow"]
38
+ signature = body["signature"]
39
+
40
+ # Give Defensio some time to process
41
+ sleep 0.5
42
+
43
+ # GET
44
+ status, body = @d.get_document(signature)
51
45
  assert body.is_a?(Hash)
52
46
  assert_equal 200, status
53
47
  assert_equal "success", body["status"]
54
- assert_equal SIGNATURE, body["signature"]
55
- end
48
+ assert_equal signature, body["signature"]
56
49
 
57
- def test_put_document
58
- if MOCK_RESPONSE
59
- query = "allow=true"
60
- Patron::Session.any_instance.expects(:put).with("#{API_HOST}/#{API_VERSION}/users/#{API_KEY}/documents/#{SIGNATURE}.#{FORMAT}?#{query}", {}).once.returns(FakePatronResponse.new(200, document_body_allowed(SIGNATURE)))
61
- end
50
+ # PUT
51
+ status, body = @d.put_document(signature, :allow => !original_allow_result)
52
+ assert body.is_a?(Hash)
53
+ assert_equal 200, status
54
+ assert_equal "success", body["status"]
55
+ assert_equal signature, body["signature"]
56
+ assert_equal !original_allow_result, body["allow"]
62
57
 
63
- status, body = @d.put_document(SIGNATURE, :allow => true)
58
+ # PUT (back to original value)
59
+ status, body = @d.put_document(signature, :allow => original_allow_result)
64
60
  assert body.is_a?(Hash)
65
61
  assert_equal 200, status
66
62
  assert_equal "success", body["status"]
67
- assert_equal SIGNATURE, body["signature"]
68
- assert_equal true, body["allow"]
63
+ assert_equal signature, body["signature"]
64
+ assert_equal original_allow_result, body["allow"]
69
65
  end
70
66
 
71
67
  def test_get_basic_stats
72
- if MOCK_RESPONSE
73
- Patron::Session.any_instance.expects(:get).with("#{API_HOST}/#{API_VERSION}/users/#{API_KEY}/basic-stats.#{FORMAT}").once.returns(FakePatronResponse.new(200, basic_stats_body))
74
- end
75
-
76
68
  status, body = @d.get_basic_stats
77
69
  assert body.is_a?(Hash)
78
70
  assert_equal 200, status
@@ -81,63 +73,60 @@ class DefensioTest < Test::Unit::TestCase
81
73
  end
82
74
 
83
75
  def test_get_extended_stats
84
- if MOCK_RESPONSE
85
- query="from=2009-09-01&to=2009-09-03"
86
- Patron::Session.any_instance.expects(:get).with("#{API_HOST}/#{API_VERSION}/users/#{API_KEY}/extended-stats.#{FORMAT}?#{query}").once.returns(FakePatronResponse.new(200, extended_stats_body))
87
- end
88
-
89
76
  status, body = @d.get_extended_stats(:from => Date.new(2009, 9, 1), :to => Date.new(2009, 9, 3))
90
77
  assert body.is_a?(Hash)
91
78
  assert_equal 200, status
92
79
  assert_equal "success", body["status"]
93
80
  assert body["data"].is_a?(Array)
94
- assert body["data"][0]["date"].is_a?(Date)
81
+ assert body["data"][0]["date"].is_a?(Date) if body["data"].size > 0
95
82
  end
96
83
 
97
84
  def test_post_profanity_filter
98
- if MOCK_RESPONSE
99
- query="OtherField=hello%20again&field1=hello%20world"
100
- Patron::Session.any_instance.expects(:post).with("#{API_HOST}/#{API_VERSION}/users/#{API_KEY}/profanity-filter.#{FORMAT}?#{query}", {}).once.returns(FakePatronResponse.new(200, profanity_filter_body))
101
- end
102
-
103
- status, body = @d.post_profanity_filter("field1"=>"hello world", "OtherField"=>"hello again")
85
+ status, body = @d.post_profanity_filter("field1"=>"hello world", "other_field"=>"hello again")
104
86
  assert body.is_a?(Hash)
105
87
  assert_equal 200, status
106
88
  assert_equal "success", body["status"]
107
89
  assert body["filtered"].is_a?(Hash)
108
90
  assert body["filtered"].keys.include?("field1")
109
- assert body["filtered"].keys.include?("OtherField")
91
+ assert body["filtered"].keys.include?("other_field")
110
92
  end
111
93
 
112
94
  def test_handle_post_document_async_callback__string
113
- result = { "api-version" => API_VERSION,
114
- "status" => "success",
115
- "message" => nil,
116
- "signature" => SIGNATURE,
117
- "allow" => false,
118
- "classification" => "malicious",
119
- "spaminess" => 0.95,
120
- "profanity-match" => true }
121
-
122
- assert_equal result, @d.class.handle_post_document_async_callback(document_body(SIGNATURE))
123
- assert_equal result, @d.handle_post_document_async_callback(document_body(SIGNATURE))
95
+ result = { "defensio-result" =>
96
+ { "api-version" => API_VERSION,
97
+ "status" => "success",
98
+ "message" => nil,
99
+ "signature" => "123456",
100
+ "allow" => false,
101
+ "classification" => "malicious",
102
+ "spaminess" => 0.95,
103
+ "profanity-match" => true }
104
+ }
105
+
106
+ assert_equal Hash, @d.class.handle_post_document_async_callback(result.to_yaml).class
124
107
  end
125
108
 
126
109
  def test_handle_post_document_async_callback__request_object
127
- result = { "api-version" => API_VERSION,
128
- "status" => "success",
129
- "message" => nil,
130
- "signature" => SIGNATURE,
131
- "allow" => false,
132
- "classification" => "malicious",
133
- "spaminess" => 0.95,
134
- "profanity-match" => true }
110
+ post_data = { "defensio-result" =>
111
+ { "api-version" => API_VERSION,
112
+ "status" => "success",
113
+ "message" => nil,
114
+ "signature" => "123456",
115
+ "allow" => false,
116
+ "classification" => "malicious",
117
+ "spaminess" => 0.95,
118
+ "profanity-match" => true }
119
+ }
135
120
 
136
- fake_request_object = OpenStruct.new(:body => StringIO.new(document_body(SIGNATURE)))
137
- assert_equal result, @d.class.handle_post_document_async_callback(fake_request_object)
138
-
139
- fake_request_object = OpenStruct.new(:body => StringIO.new(document_body(SIGNATURE)))
140
- assert_equal result, @d.handle_post_document_async_callback(fake_request_object)
121
+ fake_request_object = OpenStruct.new(:body => StringIO.new(post_data.to_yaml))
122
+ result = @d.class.handle_post_document_async_callback(fake_request_object)
123
+ assert_equal Hash, result.class
124
+ assert_equal "success", result["status"]
125
+
126
+ fake_request_object = OpenStruct.new(:body => StringIO.new(post_data.to_yaml))
127
+ result = @d.handle_post_document_async_callback(fake_request_object)
128
+ assert_equal Hash, result.class
129
+ assert_equal "success", result["status"]
141
130
  end
142
131
 
143
132
  def test_handle_post_document_async_callback__invalid_object_type
@@ -147,31 +136,10 @@ class DefensioTest < Test::Unit::TestCase
147
136
 
148
137
 
149
138
  # OTHER TESTS
150
- def test_http_session
151
- s = @d.send(:http_session)
152
- assert s.is_a?(Patron::Session)
153
- if @d.class.class_eval("KEEP_ALIVE")
154
- assert_equal s, @d.send(:http_session) # make sure sessions are reused when KEEP_ALIVE is true
155
- else
156
- assert_not_equal s, @d.send(:http_session) # make sure sessions are dropped when KEEP_ALIVE is false
157
- end
158
-
159
- assert_equal HEADERS, s.headers
160
- end
161
-
162
- def test_api_url
163
- assert_equal "#{API_HOST}/#{API_VERSION}/users/#{API_KEY}.yaml", @d.send(:api_url)
164
- assert_equal "#{API_HOST}/#{API_VERSION}/users/#{API_KEY}/documents.yaml", @d.send(:api_url, "documents")
165
- assert_equal "#{API_HOST}/#{API_VERSION}/users/#{API_KEY}/documents/abcdefghijklmnop.yaml", @d.send(:api_url, "documents", "abcdefghijklmnop")
166
- end
167
-
168
- def test_hash_to_query_string
169
- assert_equal "hello-world=true", @d.send(:hash_to_query_string, {:hello_world => true} )
170
- assert_equal "hello-world=this%20has%20spaces%20and%20characters%20($%20?%20&%20%5E%20%C3%A9)%20that%20should%20be%20escaped",
171
- @d.send(:hash_to_query_string, {:hello_world => "this has spaces and characters ($ ? & ^ é) that should be escaped"} )
172
- assert_equal "value1=true&value2=true&value3=true", @d.send(:hash_to_query_string, { "value1" => true, "value2" => true, :value3 => true})
173
- assert_equal "date=2009-01-01", @d.send(:hash_to_query_string, { "date" => Date.new(2009,1,1) })
174
- assert_nil @d.send(:hash_to_query_string, nil)
139
+ def test_api_path
140
+ assert_equal "/#{API_VERSION}/users/#{@api_key}.yaml", @d.send(:api_path)
141
+ assert_equal "/#{API_VERSION}/users/#{@api_key}/documents.yaml", @d.send(:api_path, "documents")
142
+ assert_equal "/#{API_VERSION}/users/#{@api_key}/documents/abcdefghijklmnop.yaml", @d.send(:api_path, "documents", "abcdefghijklmnop")
175
143
  end
176
144
 
177
145
  def test_parse_body
@@ -181,108 +149,14 @@ class DefensioTest < Test::Unit::TestCase
181
149
 
182
150
  # HELPERS AND SETUP
183
151
  def setup
184
- @d = Defensio.new(API_KEY)
185
- end
186
-
187
- def http_session
188
- @d.send(:http_session)
189
- end
190
-
191
- def base_url
192
- "#{API_HOST}/#{API_VERSION}"
193
- end
194
-
195
- # MOCKING
196
- class FakePatronResponse < Struct.new(:status, :body); end
197
-
198
- def user_body
199
- { "defensio-result" => {"api-version" => API_VERSION, "status" => "success", "message" => nil, "owner-url" => OWNER_URL} }.send("to_#{FORMAT}")
200
- end
201
-
202
- def document_body(signature)
203
- { "defensio-result" => {
204
- "api-version" => API_VERSION,
205
- "status" => "success",
206
- "message" => nil,
207
- "signature" => signature,
208
- "allow" => false,
209
- "classification" => "malicious",
210
- "spaminess" => 0.95,
211
- "profanity-match" => true }
212
- }.send("to_#{FORMAT}")
213
- end
152
+ if ENV['DEFENSIO_KEY'].nil?
153
+ puts "You must set the DEFENSIO_KEY environment variable before running tests. Example:"
154
+ puts "$ DEFENSIO_KEY=<your api key here> ruby test/defensio_test.rb"
155
+ puts "Fail. Epic Fail."
156
+ exit 1
157
+ end
214
158
 
215
- def document_body_allowed(signature)
216
- { "defensio-result" => {
217
- "api-version" => API_VERSION,
218
- "status" => "success",
219
- "message" => nil,
220
- "signature" => signature,
221
- "allow" => true,
222
- "classification" => "innocent",
223
- "spaminess" => 0.95,
224
- "profanity-match" => true }
225
- }.send("to_#{FORMAT}")
226
- end
227
-
228
- def basic_stats_body
229
- { "defensio-result" => {
230
- "api-version" => API_VERSION,
231
- "status" => "success",
232
- "message" => nil,
233
- "recent-accuracy" => 0.9975,
234
- "legitimate" => { "total" => 100 },
235
- "unwanted" => { "total" => 100, "malicious" => 50, "spam" => 100},
236
- "false-positives" => 1,
237
- "false-negatices" => 2,
238
- "learning" => true,
239
- "learning-status" => "Details about learning mode" }
240
- }.send("to_#{FORMAT}")
241
- end
242
-
243
- def extended_stats_body
244
- { "defensio-result" => {
245
- "api-version" => API_VERSION,
246
- "status" => "success",
247
- "message" => nil,
248
- "data" => [
249
- { "date" => "2009-09-01",
250
- "recent-accuracy" => 0.9975,
251
- "legitimate" => 100,
252
- "unwanted" => 500,
253
- "false-positives" => 1,
254
- "false-negatives" => 0 },
255
- {
256
- "date" => "2009-09-02",
257
- "recent-accuracy" => 0.9985,
258
- "legitimate" => 50,
259
- "unwanted" => 475,
260
- "false-positives" => 0,
261
- "false-negatives" => 0 },
262
- { "date" => "2009-09-03",
263
- "recent-accuracy" => 0.9992,
264
- "legitimate" => 100,
265
- "unwanted" => 500,
266
- "false-positives" => 1,
267
- "false-negatives" => 0 }
268
- ],
269
- "chart-urls" => {
270
- "recent-accuracy" => "http://domain.com/chart/123456",
271
- "total-unwanted" => "http://domain.com/chart/abcdef",
272
- "total-legitimate" => "http://domain.com/chart/xyzabc" }
273
- }
274
- }.send("to_#{FORMAT}")
275
- end
276
-
277
- def profanity_filter_body
278
- { "defensio-result" => {
279
- "api-version" => API_VERSION,
280
- "status" => "success",
281
- "message" => nil,
282
- "filtered" =>
283
- { "field1" => "hello world",
284
- "OtherField" => "hello again" }
285
- }
286
- }.send("to_#{FORMAT}")
159
+ @api_key = ENV['DEFENSIO_KEY']
160
+ @d = Defensio.new(@api_key)
287
161
  end
288
162
  end
metadata CHANGED
@@ -1,26 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: defensio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
+ - The Defensio Team
7
8
  - Carl Mercier
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
12
 
12
- date: 2009-12-07 00:00:00 -05:00
13
+ date: 2010-01-21 00:00:00 -05:00
13
14
  default_executable:
14
15
  dependencies:
15
16
  - !ruby/object:Gem::Dependency
16
- name: patron
17
+ name: httparty
17
18
  type: :runtime
18
19
  version_requirement:
19
20
  version_requirements: !ruby/object:Gem::Requirement
20
21
  requirements:
21
22
  - - ">="
22
23
  - !ruby/object:Gem::Version
23
- version: 0.4.4
24
+ version: 0.5.0
24
25
  version:
25
26
  description: Official Ruby library for Defensio 2.0
26
27
  email: support@defensio.com
@@ -37,6 +38,7 @@ files:
37
38
  - README
38
39
  - Rakefile
39
40
  - VERSION
41
+ - defensio.gemspec
40
42
  - lib/defensio.rb
41
43
  - test/defensio_test.rb
42
44
  has_rdoc: true