glennr-recaptcha 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG ADDED
@@ -0,0 +1,23 @@
1
+ == 0.2.2 / 2009-09-14
2
+
3
+ * Add a timeout to the validator
4
+ * Give the documentation some love
5
+
6
+ == 0.2.1 / 2009-09-14
7
+
8
+ * Removed Ambethia namespace, and restructured classes a bit
9
+ * Added an example rails app in the example-rails branch
10
+
11
+ == 0.2.0 / 2009-09-12
12
+
13
+ * RecaptchaOptions AJAX API Fix
14
+ * Added 'cucumber' as a test environment to skip
15
+ * Ruby 1.9 compat fixes
16
+ * Added option :message => 'Custom error message' to verify_recaptcha
17
+ * Removed dependency on ActiveRecord constant
18
+ * Add I18n
19
+
20
+ == 0.1.0 / 2008-2-8
21
+
22
+ * 1 major enhancement
23
+ * Initial Gem Release
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2007 Jason L Perry
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,106 @@
1
+ == Changes in 0.2.4 (Glenn Roberts)
2
+
3
+ Now adds model errors to :recaptcha, not :base.
4
+
5
+ Handy if you like to use inline errors in your forms.
6
+
7
+ = reCAPTCHA
8
+
9
+ Author:: Jason L Perry (http://ambethia.com)
10
+ Copyright:: Copyright (c) 2007 Jason L Perry
11
+ License:: {MIT}[http://creativecommons.org/licenses/MIT/]
12
+ Info:: http://ambethia.com/recaptcha
13
+ Git:: http://github.com/ambethia/recaptcha/tree/master
14
+ Bugs:: http://github.com/ambethia/recaptcha/issues
15
+
16
+ This plugin adds helpers for the {reCAPTCHA API}[http://recaptcha.net]. In your views you can use
17
+ the +recaptcha_tags+ method to embed the needed javascript, and you can validate in your controllers
18
+ with +verify_recaptcha+.
19
+
20
+ You'll want to add your public and private API keys in the environment variables +RECAPTCHA_PUBLIC_KEY+
21
+ and +RECAPTCHA_PRIVATE_KEY+, respectively. You could also specify them in <tt>config/environment.rb</tt> if you
22
+ are so inclined (see below). Exceptions will be raised if you call these methods and the keys can't be found.
23
+
24
+ == Rails Installation
25
+
26
+ reCAPTCHA for Rails can be installed as a gem:
27
+
28
+ config.gem "ambethia-recaptcha", :lib => "recaptcha/rails", :source => "http://gems.github.com"
29
+
30
+ Or, as a standard rails plugin:
31
+
32
+ script/plugin install git://github.com/ambethia/recaptcha.git
33
+
34
+ == Merb Installation
35
+
36
+ reCAPTCHA can also be used in a Merb application when installed as a gem:
37
+
38
+ dependency "alm-recaptcha", ">=0.2.2.1", :require_as => "recaptcha/merb"
39
+
40
+ Initial Merb compatability funded by ALM Labs.
41
+
42
+ == Setting up your API Keys
43
+
44
+ There are two ways to setup your reCAPTCHA API keys once you {obtain}[http://recaptcha.net/whyrecaptcha.html]
45
+ a pair. You can pass in your keys as options at runtime, for example:
46
+
47
+ recaptcha_tags :public_key => '6Lc6BAAAAAAAAChqRbQZcn_yyyyyyyyyyyyyyyyy'
48
+
49
+ and later,
50
+
51
+ verify_recaptcha :private_key => '6Lc6BAAAAAAAAKN3DRm6VA_xxxxxxxxxxxxxxxxx'
52
+
53
+
54
+ Or, preferably, you can keep your keys out of your code base by exporting the environment variables
55
+ mentioned earlier. You might do this in the .profile/rc, or equivalent for the user running your
56
+ application:
57
+
58
+ export RECAPTCHA_PUBLIC_KEY = '6Lc6BAAAAAAAAChqRbQZcn_yyyyyyyyyyyyyyyyy'
59
+ export RECAPTCHA_PRIVATE_KEY = '6Lc6BAAAAAAAAKN3DRm6VA_xxxxxxxxxxxxxxxxx'
60
+
61
+ If that's not your thing, and dropping things into <tt>config/environment.rb</tt> is, you can just do:
62
+
63
+ ENV['RECAPTCHA_PUBLIC_KEY'] = '6Lc6BAAAAAAAAChqRbQZcn_yyyyyyyyyyyyyyyyy'
64
+ ENV['RECAPTCHA_PRIVATE_KEY'] = '6Lc6BAAAAAAAAKN3DRm6VA_xxxxxxxxxxxxxxxxx'
65
+
66
+ == +recaptcha_tags+
67
+
68
+ Some of the options available:
69
+
70
+ <tt>:ssl</tt>:: Uses secure http for captcha widget (default +false+)
71
+ <tt>:noscript</tt>:: Include <noscript> content (default +true+)
72
+ <tt>:display</tt>:: Takes a hash containing the +theme+ and +tabindex+ options per the API. (default +nil+)
73
+ <tt>:ajax</tt>:: Render the dynamic AJAX captcha per the API. (default +false+)
74
+ <tt>:public_key</tt>:: Your public API key, takes precedence over the ENV variable (default +nil+)
75
+ <tt>:error</tt>:: Override the error code returned from the reCAPTCHA API (default +nil+)
76
+
77
+ You can also override the html attributes for the sizes of the generated +textarea+ and +iframe+
78
+ elements, if CSS isn't your thing. Inspect the source of +recaptcha_tags+ to see these options.
79
+
80
+ == +verify_recaptcha+
81
+
82
+ This method returns +true+ or +false+ after processing the parameters from the reCAPTCHA widget. Why
83
+ isn't this a model validation? Because that violates MVC. Use can use it like this, or how ever you
84
+ like. Passing in the ActiveRecord object is optional, if you do--and the captcha fails to verify--an
85
+ error will be added to the object for you to use.
86
+
87
+ Some of the options available:
88
+
89
+ <tt>:model</tt>:: Model to set errors
90
+ <tt>:message</tt>:: Custom error message
91
+ <tt>:private_key</tt>:: Your private API key, takes precedence over the ENV variable (default +nil+).
92
+ <tt>:timeout</tt>:: The number of seconds to wait for reCAPTCHA servers before give up. (default +3+)
93
+
94
+ respond_to do |format|
95
+ if verify_recaptcha(:model => @post, :message => 'Oh! It's error with reCAPTCHA!') && @post.save
96
+ # ...
97
+ else
98
+ # ...
99
+ end
100
+ end
101
+
102
+ == TODO
103
+ * Remove Rails/ActionController dependencies
104
+ * Framework agnostic
105
+ * Add some helpers to use in before_filter and what not
106
+ * Better documentation
data/Rakefile ADDED
@@ -0,0 +1,58 @@
1
+ require 'rake'
2
+
3
+ begin
4
+ require 'jeweler'
5
+ Jeweler::Tasks.new do |gem|
6
+ gem.name = "recaptcha"
7
+ gem.description = "This plugin adds helpers for the reCAPTCHA API "
8
+ gem.summary = "Helpers for the reCAPTCHA API"
9
+ gem.homepage = "http://ambethia.com/recaptcha"
10
+ gem.authors = ["Jason L. Perry"]
11
+ gem.email = "jasper@ambethia.com"
12
+ gem.files.reject! { |fn| fn.include? ".gitignore" }
13
+ end
14
+ Jeweler::GemcutterTasks.new
15
+ rescue LoadError
16
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
17
+ end
18
+
19
+ require 'rake/rdoctask'
20
+ Rake::RDocTask.new do |rd|
21
+ if File.exist?('VERSION.yml')
22
+ config = YAML.load(File.read('VERSION.yml'))
23
+ version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
24
+ else
25
+ version = ""
26
+ end
27
+
28
+ rd.main = "README.rdoc"
29
+ rd.rdoc_files.include "README.rdoc", "LICENSE", "lib/**/*.rb"
30
+ rd.rdoc_dir = 'rdoc'
31
+ rd.options << '-N' # line numbers
32
+ rd.options << '-S' # inline source
33
+ end
34
+
35
+ require 'rake/testtask'
36
+ Rake::TestTask.new(:test) do |test|
37
+ test.libs << 'test'
38
+ test.pattern = 'test/**/*_test.rb'
39
+ # test.verbose = true
40
+ end
41
+
42
+ begin
43
+ require 'rcov/rcovtask'
44
+ Rcov::RcovTask.new do |test|
45
+ test.libs << 'test'
46
+ test.pattern = 'test/**/*_test.rb'
47
+ test.verbose = true
48
+ end
49
+ rescue LoadError
50
+ task :rcov do
51
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
52
+ end
53
+ end
54
+
55
+ task :default => :test
56
+
57
+
58
+
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.2.3
data/init.rb ADDED
@@ -0,0 +1,6 @@
1
+ # Rails plugin initialization.
2
+ # You can also install it as a gem:
3
+ # config.gem "ambethia-recaptcha", :lib => "recaptcha/rails", :source => "http://gems.github.com"
4
+
5
+ require 'net/http'
6
+ require 'recaptcha/rails'
data/lib/recaptcha.rb ADDED
@@ -0,0 +1,23 @@
1
+ require 'recaptcha/client_helper'
2
+ require 'recaptcha/verify'
3
+
4
+ module Recaptcha
5
+ module VERSION #:nodoc:
6
+ MAJOR = 0
7
+ MINOR = 2
8
+ TINY = 2
9
+ PATCH = 1
10
+
11
+ STRING = [MAJOR, MINOR, TINY, PATCH].join('.')
12
+ end
13
+
14
+
15
+ RECAPTCHA_API_SERVER = 'http://api.recaptcha.net';
16
+ RECAPTCHA_API_SECURE_SERVER = 'https://api-secure.recaptcha.net';
17
+ RECAPTCHA_VERIFY_SERVER = 'api-verify.recaptcha.net';
18
+
19
+ SKIP_VERIFY_ENV = ['test', 'cucumber']
20
+
21
+ class RecaptchaError < StandardError
22
+ end
23
+ end
@@ -0,0 +1,42 @@
1
+ module Recaptcha
2
+ module ClientHelper
3
+ # Your public API can be specified in the +options+ hash or preferably
4
+ # the environment variable +RECAPTCHA_PUBLIC_KEY+.
5
+ def recaptcha_tags(options = {})
6
+ # Default options
7
+ key = options[:public_key] ||= ENV['RECAPTCHA_PUBLIC_KEY']
8
+ raise RecaptchaError, "No public key specified." unless key
9
+ error = options[:error] ||= (defined? flash ? flash[:recaptcha_error] : "")
10
+ uri = options[:ssl] ? RECAPTCHA_API_SECURE_SERVER : RECAPTCHA_API_SERVER
11
+ html = ""
12
+ if options[:display]
13
+ html << %{<script type="text/javascript">\n}
14
+ html << %{ var RecaptchaOptions = #{options[:display].to_json};\n}
15
+ html << %{</script>\n}
16
+ end
17
+ if options[:ajax]
18
+ html << %{<div id="dynamic_recaptcha"></div>}
19
+ html << %{<script type="text/javascript" src="#{uri}/js/recaptcha_ajax.js"></script>\n}
20
+ html << %{<script type="text/javascript">\n}
21
+ html << %{ Recaptcha.create('#{key}', document.getElementById('dynamic_recaptcha')#{options[:display] ? ',RecaptchaOptions' : ''});}
22
+ html << %{</script>\n}
23
+ else
24
+ html << %{<script type="text/javascript" src="#{uri}/challenge?k=#{key}}
25
+ html << %{#{error ? "&error=#{CGI::escape(error)}" : ""}"></script>\n}
26
+ unless options[:noscript] == false
27
+ html << %{<noscript>\n }
28
+ html << %{<iframe src="#{uri}/noscript?k=#{key}" }
29
+ html << %{height="#{options[:iframe_height] ||= 300}" }
30
+ html << %{width="#{options[:iframe_width] ||= 500}" }
31
+ html << %{frameborder="0"></iframe><br/>\n }
32
+ html << %{<textarea name="recaptcha_challenge_field" }
33
+ html << %{rows="#{options[:textarea_rows] ||= 3}" }
34
+ html << %{cols="#{options[:textarea_cols] ||= 40}"></textarea>\n }
35
+ html << %{<input type="hidden" name="recaptcha_response_field" value="manual_challenge">}
36
+ html << %{</noscript>\n}
37
+ end
38
+ end
39
+ return html
40
+ end # recaptcha_tags
41
+ end # ClientHelper
42
+ end # Recaptcha
@@ -0,0 +1,4 @@
1
+ require 'recaptcha'
2
+
3
+ Merb::GlobalHelpers.send(:include, Recaptcha::ClientHelper)
4
+ Merb::Controller.send(:include, Recaptcha::Verify)
@@ -0,0 +1,4 @@
1
+ require 'recaptcha'
2
+
3
+ ActionView::Base.send(:include, Recaptcha::ClientHelper)
4
+ ActionController::Base.send(:include, Recaptcha::Verify)
@@ -0,0 +1,50 @@
1
+ module Recaptcha
2
+ module Verify
3
+ # Your private API can be specified in the +options+ hash or preferably
4
+ # the environment variable +RECAPTCHA_PUBLIC_KEY+.
5
+ def verify_recaptcha(options = {})
6
+ if !options.is_a? Hash
7
+ options = {:model => options}
8
+ end
9
+
10
+ env = options[:env] || ENV['RAILS_ENV']
11
+ return true if SKIP_VERIFY_ENV.include? env
12
+ model = options[:model]
13
+ private_key = options[:private_key] || ENV['RECAPTCHA_PRIVATE_KEY']
14
+ raise RecaptchaError, "No private key specified." unless private_key
15
+
16
+ begin
17
+ recaptcha = nil
18
+ Timeout::timeout(options[:timeout] || 3) do
19
+ recaptcha = Net::HTTP.post_form URI.parse("http://#{RECAPTCHA_VERIFY_SERVER}/verify"), {
20
+ "privatekey" => private_key,
21
+ "remoteip" => request.remote_ip,
22
+ "challenge" => params[:recaptcha_challenge_field],
23
+ "response" => params[:recaptcha_response_field]
24
+ }
25
+ end
26
+ answer, error = recaptcha.body.split.map { |s| s.chomp }
27
+ unless answer == 'true'
28
+ flash[:recaptcha_error] = error
29
+ if model
30
+ model.valid?
31
+ model.errors.add :recaptcha, options[:message] || "Word verification response is incorrect, please try again."
32
+ end
33
+ return false
34
+ else
35
+ flash[:recaptcha_error] = nil
36
+ return true
37
+ end
38
+ rescue Timeout::Error
39
+ flash[:recaptcha_error] = "recaptcha-not-reachable"
40
+ if model
41
+ model.valid?
42
+ model.errors.add :recaptcha, options[:message] || "Oops, we failed to validate your word verification response. Please try again."
43
+ end
44
+ return false
45
+ rescue Exception => e
46
+ raise RecaptchaError, e.message, e.backtrace
47
+ end
48
+ end # verify_recaptcha
49
+ end # Verify
50
+ end # Recaptcha
data/recaptcha.gemspec ADDED
@@ -0,0 +1,56 @@
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{glennr-recaptcha}
8
+ s.version = "0.2.4"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Jason L. Perry", "Glenn Roberts"]
12
+ s.date = %q{2009-12-21}
13
+ s.description = %q{This plugin adds helpers for the reCAPTCHA API }
14
+ s.email = %q{jasper@ambethia.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ "CHANGELOG",
21
+ "LICENSE",
22
+ "README.rdoc",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "init.rb",
26
+ "lib/recaptcha.rb",
27
+ "lib/recaptcha/client_helper.rb",
28
+ "lib/recaptcha/merb.rb",
29
+ "lib/recaptcha/rails.rb",
30
+ "lib/recaptcha/verify.rb",
31
+ "recaptcha.gemspec",
32
+ "tasks/recaptcha_tasks.rake",
33
+ "test/recaptcha_test.rb",
34
+ "test/verify_recaptcha_test.rb"
35
+ ]
36
+ s.homepage = %q{http://ambethia.com/recaptcha}
37
+ s.rdoc_options = ["--charset=UTF-8"]
38
+ s.require_paths = ["lib"]
39
+ s.rubygems_version = %q{1.3.5}
40
+ s.summary = %q{Helpers for the reCAPTCHA API}
41
+ s.test_files = [
42
+ "test/recaptcha_test.rb",
43
+ "test/verify_recaptcha_test.rb"
44
+ ]
45
+
46
+ if s.respond_to? :specification_version then
47
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
48
+ s.specification_version = 3
49
+
50
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
51
+ else
52
+ end
53
+ else
54
+ end
55
+ end
56
+
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :recaptcha do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,37 @@
1
+ require 'test/unit'
2
+ require 'cgi'
3
+ require File.dirname(__FILE__) + '/../lib/recaptcha'
4
+
5
+ class RecaptchaClientHelperTest < Test::Unit::TestCase
6
+ include Recaptcha
7
+ include Recaptcha::ClientHelper
8
+ include Recaptcha::Verify
9
+
10
+ attr_accessor :session
11
+
12
+ def setup
13
+ @session = {}
14
+ ENV['RECAPTCHA_PUBLIC_KEY'] = '0000000000000000000000000000000000000000'
15
+ ENV['RECAPTCHA_PRIVATE_KEY'] = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
16
+ end
17
+
18
+ def test_recaptcha_tags
19
+ # Might as well match something...
20
+ assert_match /http:\/\/api.recaptcha.net/, recaptcha_tags
21
+ end
22
+
23
+ def test_recaptcha_tags_with_ssl
24
+ assert_match /https:\/\/api-secure.recaptcha.net/, recaptcha_tags(:ssl => true)
25
+ end
26
+
27
+ def test_recaptcha_tags_without_noscript
28
+ assert_no_match /noscript/, recaptcha_tags(:noscript => false)
29
+ end
30
+
31
+ def test_should_raise_exception_without_public_key
32
+ assert_raise RecaptchaError do
33
+ ENV['RECAPTCHA_PUBLIC_KEY'] = nil
34
+ recaptcha_tags
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,96 @@
1
+ require 'test/unit'
2
+ require 'rails/version' # For getting the rails version constants
3
+ require 'active_support/vendor' # For loading I18n
4
+ require 'mocha'
5
+ require 'net/http'
6
+ require File.dirname(__FILE__) + '/../lib/recaptcha'
7
+
8
+ class RecaptchaVerifyTest < Test::Unit::TestCase
9
+ def setup
10
+
11
+ ENV['RECAPTCHA_PRIVATE_KEY'] = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
12
+ @controller = TestController.new
13
+ @controller.request = stub(:remote_ip => "1.1.1.1")
14
+ @controller.params = {:recaptcha_challenge_field => "challenge", :recaptcha_response_field => "response"}
15
+
16
+ @expected_post_data = {}
17
+ @expected_post_data["privatekey"] = ENV['RECAPTCHA_PRIVATE_KEY']
18
+ @expected_post_data["remoteip"] = @controller.request.remote_ip
19
+ @expected_post_data["challenge"] = "challenge"
20
+ @expected_post_data["response"] = "response"
21
+
22
+ @expected_uri = URI.parse("http://#{Recaptcha::RECAPTCHA_VERIFY_SERVER}/verify")
23
+ end
24
+
25
+ def test_should_raise_exception_without_private_key
26
+ assert_raise Recaptcha::RecaptchaError do
27
+ ENV['RECAPTCHA_PRIVATE_KEY'] = nil
28
+ @controller.verify_recaptcha
29
+ end
30
+ end
31
+
32
+ def test_should_return_false_when_key_is_invalid
33
+ expect_http_post(response_with_body("false\ninvalid-site-private-key"))
34
+
35
+ assert !@controller.verify_recaptcha
36
+ assert_equal "invalid-site-private-key", @controller.session[:recaptcha_error]
37
+ end
38
+
39
+ def test_returns_true_on_success
40
+ @controller.session[:recaptcha_error] = "previous error that should be cleared"
41
+ expect_http_post(response_with_body("true\n"))
42
+
43
+ assert @controller.verify_recaptcha
44
+ assert_nil @controller.session[:recaptcha_error]
45
+ end
46
+
47
+ def test_errors_should_be_added_to_model
48
+ expect_http_post(response_with_body("false\nbad-news"))
49
+
50
+ errors = mock
51
+ errors.expects(:add).with(:base, "Captcha response is incorrect, please try again.")
52
+ model = mock(:valid? => false, :errors => errors)
53
+
54
+ assert !@controller.verify_recaptcha(:model => model)
55
+ assert_equal "bad-news", @controller.session[:recaptcha_error]
56
+ end
57
+
58
+ def test_returns_true_on_success_with_optional_key
59
+ @controller.session[:recaptcha_error] = "previous error that should be cleared"
60
+ # reset private key
61
+ @expected_post_data["privatekey"] = 'ADIFFERENTPRIVATEKEYXXXXXXXXXXXXXX'
62
+ expect_http_post(response_with_body("true\n"))
63
+
64
+ assert @controller.verify_recaptcha(:private_key => 'ADIFFERENTPRIVATEKEYXXXXXXXXXXXXXX')
65
+ assert_nil @controller.session[:recaptcha_error]
66
+ end
67
+
68
+ def test_timeout
69
+ expect_http_post(Timeout::Error, :exception => true)
70
+ assert !@controller.verify_recaptcha()
71
+ assert_equal "recaptcha-not-reachable", @controller.session[:recaptcha_error]
72
+ end
73
+
74
+ private
75
+
76
+ class TestController
77
+ include Recaptcha::Verify
78
+ attr_accessor :request, :params, :session
79
+
80
+ def initialize
81
+ @session = {}
82
+ end
83
+ end
84
+
85
+ def expect_http_post(response, options = {})
86
+ unless options[:exception]
87
+ Net::HTTP.expects(:post_form).with(@expected_uri, @expected_post_data).returns(response)
88
+ else
89
+ Net::HTTP.expects(:post_form).raises response
90
+ end
91
+ end
92
+
93
+ def response_with_body(body)
94
+ stub(:body => body)
95
+ end
96
+ end
metadata ADDED
@@ -0,0 +1,72 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: glennr-recaptcha
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.4
5
+ platform: ruby
6
+ authors:
7
+ - Jason L. Perry
8
+ - Glenn Roberts
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2009-12-21 00:00:00 +02:00
14
+ default_executable:
15
+ dependencies: []
16
+
17
+ description: "This plugin adds helpers for the reCAPTCHA API "
18
+ email: jasper@ambethia.com
19
+ executables: []
20
+
21
+ extensions: []
22
+
23
+ extra_rdoc_files:
24
+ - LICENSE
25
+ - README.rdoc
26
+ files:
27
+ - CHANGELOG
28
+ - LICENSE
29
+ - README.rdoc
30
+ - Rakefile
31
+ - VERSION
32
+ - init.rb
33
+ - lib/recaptcha.rb
34
+ - lib/recaptcha/client_helper.rb
35
+ - lib/recaptcha/merb.rb
36
+ - lib/recaptcha/rails.rb
37
+ - lib/recaptcha/verify.rb
38
+ - recaptcha.gemspec
39
+ - tasks/recaptcha_tasks.rake
40
+ - test/recaptcha_test.rb
41
+ - test/verify_recaptcha_test.rb
42
+ has_rdoc: true
43
+ homepage: http://ambethia.com/recaptcha
44
+ licenses: []
45
+
46
+ post_install_message:
47
+ rdoc_options:
48
+ - --charset=UTF-8
49
+ require_paths:
50
+ - lib
51
+ required_ruby_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: "0"
56
+ version:
57
+ required_rubygems_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: "0"
62
+ version:
63
+ requirements: []
64
+
65
+ rubyforge_project:
66
+ rubygems_version: 1.3.5
67
+ signing_key:
68
+ specification_version: 3
69
+ summary: Helpers for the reCAPTCHA API
70
+ test_files:
71
+ - test/recaptcha_test.rb
72
+ - test/verify_recaptcha_test.rb