rack-recaptcha2 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fe4b7b672ad738889bca4ded27940d615d43631d
4
+ data.tar.gz: 9ec20d4976ccc435823dfc803c7543e808a49a96
5
+ SHA512:
6
+ metadata.gz: debec378c1bdbb90e1ca672611b8bd1edcf75a4132376d40d08c04a3df6a957eaafb09914e3b90dcc413452ae0e0492f13ff6854289f2d932eb66244479f1d21
7
+ data.tar.gz: c1eeee981b98b8953fe907acc66c45273dd6a1901b640d728b8919029ab528e3b634b6aa6f01866c22bcd33a979ec84b2d54bacb714abda46d9d545dd7ea52e0
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
@@ -0,0 +1,23 @@
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
+ .rvmrc
21
+ .rbx/
22
+
23
+ ## PROJECT::SPECIFIC
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Arthur Chiu
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.
@@ -0,0 +1,211 @@
1
+ # rack-recaptcha [![](http://stillmaintained.com/achiu/rack-recaptcha.png)](http://stillmaintained.com/achiu/rack-recaptcha)
2
+
3
+ [![Build Status](https://secure.travis-ci.org/achiu/rack-recaptcha.png)](http://travis-ci.org/achiu/rack-recaptcha)
4
+
5
+ Drop this Rack middleware in your web application to enable CAPTCHA verification via Recaptcha API.
6
+
7
+ ## How to Use
8
+
9
+ ### Configuration
10
+
11
+ First, install the library with:
12
+ [sudo] gem install rack-recaptcha
13
+
14
+ You have to require 'rack-recaptcha' in your gemfile.
15
+
16
+ ````ruby
17
+ ## Gemfile
18
+ gem 'rack-recaptcha', :require => 'rack/recaptcha'
19
+ ````
20
+
21
+
22
+ Available options for `Rack::Recaptcha` middleware are:
23
+
24
+ * :public_key -- your ReCaptcha API public key *(required)*
25
+ * :private_key -- your ReCaptcha API private key *(required)*
26
+ * :proxy_host -- the HTTP Proxy hostname *(optional)*
27
+ * :proxy_port -- the HTTP Proxy port *(optional)*
28
+ * :proxy_user -- the HTTP Proxy user *(optional, omit unless the proxy requires it)*
29
+ * :proxy_password -- the HTTP Proxy password *(optional, omit unless the proxy requires it)*
30
+
31
+ Now configure your app to use the middleware. This might be different across each web framework.
32
+
33
+ #### Sinatra
34
+
35
+ ````ruby
36
+ ## app.rb
37
+ use Rack::Recaptcha, :public_key => 'KEY', :private_key => 'SECRET'
38
+ helpers Rack::Recaptcha::Helpers
39
+ ````
40
+
41
+ #### Padrino
42
+
43
+ ````ruby
44
+ ## app/app.rb
45
+ use Rack::Recaptcha, :public_key => 'KEY', :private_key => 'SECRET'
46
+ helpers Rack::Recaptcha::Helpers
47
+ ````
48
+
49
+
50
+ #### Rails
51
+
52
+ ````ruby
53
+ ## application.rb:
54
+ module YourRailsAppName
55
+ class Application < Rails::Application
56
+ ...
57
+ config.gem 'rack-recaptcha', :lib => 'rack/recaptcha'
58
+ config.middleware.use Rack::Recaptcha, :public_key => 'KEY', :private_key => 'SECRET'
59
+ end
60
+ end
61
+
62
+ ## application_helper.rb or whatever helper you want it in.
63
+ module ApplicationHelper
64
+ include Rack::Recaptcha::Helpers
65
+ end
66
+
67
+ ## application_controller.rb or whatever controller you want it in.
68
+ class ApplicationController < ActionController::Base
69
+ ...
70
+ include Rack::Recaptcha::Helpers
71
+ ...
72
+ end
73
+ ````
74
+
75
+ ### Helpers
76
+
77
+ The `Rack::Recaptcha::Helpers` module (for Sinatra, Rails, Padrino) adds these methods to your app:
78
+
79
+ Return a javascript recaptcha form
80
+ ```ruby
81
+ recaptcha_tag :challenge
82
+ ```
83
+
84
+ Return a non-javascript recaptcha form
85
+ ```ruby
86
+ recaptcha_tag :noscript
87
+ ```
88
+
89
+ Return a ajax recaptcha form
90
+ ```ruby
91
+ recaptcha_tag :ajax
92
+ ```
93
+
94
+ For ajax recaptcha's, you can pass additional options like:
95
+ ```ruby
96
+ recaptcha_tag :ajax, :display => { :theme => 'red'}
97
+ ```
98
+
99
+ For non-ajax recaptcha's, you can pass additional options like:
100
+ ```ruby
101
+ # Overrides the key set in Middleware
102
+ recaptcha_tag :challenge, :public_key => KEY
103
+
104
+ # Adjust Height and/or Width
105
+ recaptcha_tag :noscript, :height => 300, :width => 500
106
+
107
+ # Adjust the rows and/or columns
108
+ recaptcha_tag :challenge, :row => 3, :cols => 5
109
+
110
+ # Set the language
111
+ recaptcha_tag :noscript, :language => :en
112
+ ```
113
+
114
+ To test whether or not the verification passed, you can use:
115
+
116
+ ```ruby
117
+ recaptcha_valid?
118
+ ```
119
+
120
+ The `recaptcha_valid?` helper can also be overloaded during tests. You
121
+ can set its response to either true or false by doing the following:
122
+
123
+ ```ruby
124
+ # Have recaptcha_valid? return true
125
+ Rack::Recaptcha.test_mode!
126
+
127
+ # Or have it return false
128
+ Rack::Recaptcha.test_mode! :return => false
129
+ ```
130
+
131
+
132
+ For additional options and resources checkout the [customization page](https://developers.google.com/recaptcha/docs/customization)
133
+
134
+ #### Example
135
+
136
+ In Padrino, here's how you would use the helpers.
137
+
138
+ ````haml
139
+ ## new.haml
140
+ - form_tag '/login', :class => 'some_form', :method => 'post' do
141
+ = text_field_tag :email
142
+ = password_field_tag :password
143
+ = recaptcha_tag(:challenge)
144
+ = submit_tag "Submit"
145
+
146
+ ## sessions.rb
147
+ post :create, :map => '/login' do
148
+ if recaptcha_valid?
149
+ "passed!"
150
+ else
151
+ "failed!"
152
+ end
153
+ end
154
+ ````
155
+
156
+ In rails, you'll need to use also use the raw method:
157
+
158
+ ````haml
159
+ ## new.html.haml
160
+ - form_tag '/login' do
161
+ = raw recaptcha_tag(:challenge)
162
+ = submit_tag "Submit"
163
+ ````
164
+
165
+ ### Contributors
166
+
167
+ Daniel Mendler - [minad](https://github.com/minad)
168
+
169
+ * support for multiple paths and helpers clean up
170
+
171
+ Eric Anderson - [eric1234](https://github.com/eric1234)
172
+
173
+ * Make verify independently usable.
174
+
175
+ Chad Johnston - [iamthechad](https://github.com/iamthechad)
176
+
177
+ * Adding Error Message handling in recaptcha widget
178
+
179
+ Eric Hu - [eric-hu](https://github.com/eric-hu)
180
+
181
+ * Patching error message issue when no `request` is present
182
+
183
+ Tobias Begalke - [elcamino](https://github.com/elcamino)
184
+
185
+ * Added HTTP Proxy support
186
+
187
+ Julik Tarkhanov - [julik](https://github.com/julik)
188
+
189
+ * Adding rack-recaptcha to travis-ci
190
+
191
+ Rob Worley - [robworley](https://github.com/robworley)
192
+
193
+ * Adding language setting for recaptcha form
194
+
195
+ sam71 - [sam71](https://github.com/sam71)
196
+
197
+ * Fix recaptcha hanging when used in proxy environment.
198
+
199
+ #### Note on Patches/Pull Requests
200
+
201
+ * Fork the project.
202
+ * Make your feature addition or bug fix.
203
+ * Add tests for it. This is important so I don't break it in a
204
+ future version unintentionally.
205
+ * Commit, do not mess with rakefile, version, or history.
206
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
207
+ * Send me a pull request. Bonus points for topic branches.
208
+
209
+ #### Copyright
210
+
211
+ Copyright (c) 2010, 2011, 2012 Arthur Chiu. See LICENSE for details.
@@ -0,0 +1,12 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rake/testtask'
5
+ Rake::TestTask.new(:test) do |test|
6
+ test.libs << 'lib' << 'test'
7
+ test.pattern = 'test/**/*_test.rb'
8
+ test.warning = true
9
+ test.verbose = true
10
+ end
11
+
12
+ task :default => [:test]
@@ -0,0 +1,82 @@
1
+ require File.expand_path '../recaptcha/helpers', __FILE__
2
+ require 'net/http'
3
+ require 'json'
4
+
5
+ module Rack
6
+ class Recaptcha
7
+ API_URL = 'http://www.google.com/recaptcha/api.js'
8
+ API_SECURE_URL = 'https://www.google.com/recaptcha/api.js'
9
+ VERIFY_URL = 'https://www.google.com/recaptcha/api/siteverify'
10
+ RESPONSE_FIELD = 'g-recaptcha-response'
11
+
12
+ class << self
13
+ attr_accessor :private_key, :public_key, :test_mode, :proxy_host, :proxy_port, :proxy_user, :proxy_password
14
+
15
+ def test_mode!(options = {})
16
+ value = options[:return]
17
+ self.test_mode = value.nil? ? true : options[:return]
18
+ end
19
+ end
20
+
21
+ # Initialize the Rack Middleware. Some of the available options are:
22
+ # :public_key -- your ReCaptcha API public key *(required)*
23
+ # :private_key -- your ReCaptcha API private key *(required)*
24
+ #
25
+ def initialize(app,options = {})
26
+ @app = app
27
+ @paths = options[:paths] && [options[:paths]].flatten.compact
28
+ self.class.private_key = options[:private_key]
29
+ self.class.public_key = options[:public_key]
30
+ self.class.proxy_host = options[:proxy_host]
31
+ self.class.proxy_port = options[:proxy_port]
32
+ self.class.proxy_user = options[:proxy_user]
33
+ self.class.proxy_password = options[:proxy_password]
34
+ end
35
+
36
+ def call(env)
37
+ dup._call(env)
38
+ end
39
+
40
+ def _call(env)
41
+ request = Request.new(env)
42
+ if request.params[RESPONSE_FIELD]
43
+ value, msg = verify(
44
+ request.ip,
45
+ request.params[RESPONSE_FIELD]
46
+ )
47
+ env.merge!('recaptcha.valid' => value, 'recaptcha.msg' => msg)
48
+ end
49
+ @app.call(env)
50
+ end
51
+
52
+ def verify(ip, response)
53
+ params = {
54
+ 'secret' => Rack::Recaptcha.private_key,
55
+ 'remoteip' => ip,
56
+ 'response' => response
57
+ }
58
+
59
+ uri = URI.parse(VERIFY_URL)
60
+
61
+
62
+ if self.class.proxy_host && self.class.proxy_port
63
+ http = Net::HTTP.Proxy(self.class.proxy_host,
64
+ self.class.proxy_port,
65
+ self.class.proxy_user,
66
+ self.class.proxy_password).start(uri.host, uri.port, :use_ssl => true)
67
+ else
68
+ http = Net::HTTP.start(uri.host, uri.port, :use_ssl => true)
69
+ end
70
+
71
+ request = Net::HTTP::Post.new(uri.path)
72
+ request.form_data = params
73
+ response = http.request(request)
74
+
75
+ parsed_response = JSON.parse(response.body)
76
+ success = parsed_response['success']
77
+ error_messages = parsed_response['error-codes'] || []
78
+ return [success, error_messages.join(',')]
79
+ end
80
+
81
+ end
82
+ end
@@ -0,0 +1,48 @@
1
+ require 'json'
2
+
3
+ module Rack
4
+ class Recaptcha
5
+ module Helpers
6
+
7
+ DEFAULT= {
8
+ :ssl => true
9
+ }
10
+
11
+ # Helper method to output a recaptcha widget.
12
+ # Available options:
13
+ #
14
+ # :public_key - Set the public key. Overrides the key set in Middleware option
15
+ def recaptcha_widget(options={})
16
+ options = DEFAULT.merge(options)
17
+ options[:public_key] ||= Rack::Recaptcha.public_key
18
+
19
+ %{<div class="g-recaptcha" data-sitekey="#{options[:public_key]}"></div>}.gsub(/^ +/, '')
20
+ end
21
+
22
+ # Helper method to output the recaptcha javascript.
23
+ # Available options:
24
+ #
25
+ # :language - Set the language
26
+ def recaptcha_javascript(options={})
27
+ options = DEFAULT.merge(options)
28
+ path = options[:ssl] ? Rack::Recaptcha::API_SECURE_URL : Rack::Recaptcha::API_URL
29
+ params = ''
30
+ params += "?hl=" + uri_parser.escape(options[:language].to_s) if options[:language]
31
+ %{<script src='#{path + params}'></script>}
32
+ end
33
+
34
+ # Helper to return whether the recaptcha was accepted.
35
+ def recaptcha_valid?
36
+ test = Rack::Recaptcha.test_mode
37
+ test.nil? ? request.env['recaptcha.valid'] : test
38
+ end
39
+
40
+ private
41
+
42
+ def uri_parser
43
+ @uri_parser ||= URI.const_defined?(:Parser) ? URI::Parser.new : URI
44
+ end
45
+
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,23 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = %q{rack-recaptcha2}
3
+ s.version = "1.0.0"
4
+ s.required_rubygems_version = ">=1.3.6"
5
+ s.authors = ["Arthur Chiu"]
6
+ s.date = %q{2010-07-18}
7
+ s.description = %q{Rack middleware Captcha verification using Recaptcha API.}
8
+ s.email = %q{mr.arthur.chiu@gmail.com}
9
+ s.extra_rdoc_files = ["LICENSE", "README.md"]
10
+ s.files = %w{.document .gitignore LICENSE README.md Rakefile rack-recaptcha.gemspec} + Dir.glob("{lib,test}/**/*")
11
+ s.homepage = %q{http://github.com/achiu/rack-recaptcha}
12
+ s.rdoc_options = ["--charset=UTF-8"]
13
+ s.require_paths = ["lib"]
14
+ s.rubygems_version = %q{1.3.7}
15
+ s.summary = %q{Rack middleware for Recaptcha}
16
+ s.test_files = Dir.glob("test/**/*")
17
+ s.add_runtime_dependency "json", ">= 0"
18
+ s.add_development_dependency "rake", "~> 0.9.2"
19
+ s.add_development_dependency "minitest", "~> 4.6"
20
+ s.add_development_dependency "rack-test", "~> 0.5.7"
21
+ s.add_development_dependency "fakeweb", "~> 1.3.0"
22
+ s.add_development_dependency "rr", "~> 1.0.2"
23
+ end
@@ -0,0 +1,92 @@
1
+ require File.expand_path '../test_helper', __FILE__
2
+
3
+ class HelperTest
4
+ attr_accessor :request
5
+ include Rack::Recaptcha::Helpers
6
+
7
+ def initialize
8
+ @request = HelperTest::Request.new
9
+ end
10
+
11
+ class Request
12
+ attr_accessor :env
13
+ end
14
+ end
15
+
16
+ # With "attr_accessor :request" HelperTest has "request" defined as a method
17
+ # even when @request is set to nil
18
+ #
19
+ # defined?(request)
20
+ # => method
21
+ # request
22
+ # => nil
23
+ # self
24
+ # => #<HelperTest:0x00000002125000 @request=nil>
25
+ class HelperTestWithoutRequest
26
+ include Rack::Recaptcha::Helpers
27
+ end
28
+
29
+ describe Rack::Recaptcha::Helpers do
30
+
31
+ def helper_test
32
+ HelperTest.new
33
+ end
34
+
35
+ def helper_test_without_request
36
+ HelperTestWithoutRequest.new
37
+ end
38
+
39
+ before do
40
+ Rack::Recaptcha.public_key = ::PUBLIC_KEY
41
+ end
42
+
43
+ describe ".recaptcha_widget" do
44
+
45
+ it "should render recaptcha div" do
46
+ topic = helper_test.recaptcha_widget()
47
+
48
+ assert_match %r{<div class="g-recaptcha" data-sitekey=".*"></div>}, topic
49
+ end
50
+
51
+ it "should use given public key" do
52
+ topic = helper_test.recaptcha_widget(:public_key => 'test')
53
+
54
+ assert_match %r{<div class="g-recaptcha" data-sitekey="test"></div>}, topic
55
+ end
56
+ end
57
+
58
+ describe ".recaptcha_valid?" do
59
+ it "should assert that it passes when recaptcha.valid is true" do
60
+ Rack::Recaptcha.test_mode = nil
61
+ mock(helper_test.request.env).[]('recaptcha.valid').returns(true)
62
+ assert helper_test.recaptcha_valid?
63
+ end
64
+
65
+ it "should refute that it passes when recaptcha.valid is false" do
66
+ Rack::Recaptcha.test_mode = nil
67
+ mock(helper_test.request.env).[]('recaptcha.valid').returns(false)
68
+ refute helper_test.recaptcha_valid?
69
+ end
70
+
71
+ it "should assert that it passes when test mode set to pass" do
72
+ Rack::Recaptcha.test_mode!
73
+ assert helper_test.recaptcha_valid?
74
+ end
75
+
76
+ it "should assert that it passes when test mode set to fail" do
77
+ Rack::Recaptcha.test_mode! :return => false
78
+ refute helper_test.recaptcha_valid?
79
+ end
80
+ end
81
+
82
+ describe ".recaptcha_widget without request object" do
83
+
84
+ it "should work without request object" do
85
+ topic = helper_test_without_request.recaptcha_widget()
86
+
87
+ assert_match %r{<div class="g-recaptcha" data-sitekey=".*"></div>}, topic
88
+ end
89
+
90
+ end
91
+
92
+ end
@@ -0,0 +1,31 @@
1
+ require File.expand_path '../test_helper', __FILE__
2
+
3
+ describe Rack::Recaptcha do
4
+ before do
5
+ FakeWeb.allow_net_connect = false
6
+ end
7
+
8
+ describe "#test_mode!" do
9
+ it "should set test_mode to true" do
10
+ Rack::Recaptcha.test_mode!
11
+ assert Rack::Recaptcha.test_mode
12
+ end
13
+
14
+ it "should set test_mode to true" do
15
+ Rack::Recaptcha.test_mode! :return => false
16
+ refute Rack::Recaptcha.test_mode
17
+ end
18
+ end
19
+
20
+ it "should hit the login and pass" do
21
+ FakeWeb.register_uri(:post, Rack::Recaptcha::VERIFY_URL, :body => '{"success":true}')
22
+ post("/login", 'g-recaptcha-response' => 'response')
23
+ assert_equal 'post login', last_response.body
24
+ end
25
+
26
+ it "should hit the login and fail" do
27
+ FakeWeb.register_uri(:post, Rack::Recaptcha::VERIFY_URL, :body => '{"success":false,"error-codes":["invalid-input-response"]}')
28
+ post("/login", 'g-recaptcha-response' => 'response')
29
+ assert_equal 'post fail', last_response.body
30
+ end
31
+ end
@@ -0,0 +1,43 @@
1
+ require 'rubygems'
2
+ gem 'minitest'
3
+ require 'minitest/autorun'
4
+ require 'rack/test'
5
+ require 'rack/mock'
6
+ require 'rack/utils'
7
+ require 'rack/session/cookie'
8
+ require 'rack/builder'
9
+ require 'fakeweb'
10
+ require 'rr'
11
+ require File.expand_path '../../lib/rack/recaptcha', __FILE__
12
+
13
+ PUBLIC_KEY = '0'*40
14
+ PRIVATE_KEY = 'X'*40
15
+
16
+ class MiniTest::Spec
17
+ include Rack::Test::Methods
18
+ include RR::Adapters::MiniTest
19
+
20
+ def app
21
+ main_app = lambda { |env|
22
+ request = Rack::Request.new(env)
23
+ return_code, body_text =
24
+ case request.path
25
+ when '/' then [200,'Hello world']
26
+ when '/login'
27
+ if request.post?
28
+ env['recaptcha.valid'] ? [200, 'post login'] : [200, 'post fail']
29
+ else
30
+ [200,'login']
31
+ end
32
+ else
33
+ [404,'Nothing here']
34
+ end
35
+ [return_code,{'Content-type' => 'text/plain'}, [body_text]]
36
+ }
37
+
38
+ builder = Rack::Builder.new
39
+ builder.use Rack::Recaptcha, :private_key => PRIVATE_KEY, :public_key => PUBLIC_KEY
40
+ builder.run main_app
41
+ builder.to_app
42
+ end
43
+ end
metadata ADDED
@@ -0,0 +1,143 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack-recaptcha2
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Arthur Chiu
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2010-07-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.2
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 0.9.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '4.6'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '4.6'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rack-test
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 0.5.7
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 0.5.7
69
+ - !ruby/object:Gem::Dependency
70
+ name: fakeweb
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: 1.3.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: 1.3.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rr
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: 1.0.2
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: 1.0.2
97
+ description: Rack middleware Captcha verification using Recaptcha API.
98
+ email: mr.arthur.chiu@gmail.com
99
+ executables: []
100
+ extensions: []
101
+ extra_rdoc_files:
102
+ - LICENSE
103
+ - README.md
104
+ files:
105
+ - .document
106
+ - .gitignore
107
+ - LICENSE
108
+ - README.md
109
+ - Rakefile
110
+ - rack-recaptcha.gemspec
111
+ - lib/rack/recaptcha.rb
112
+ - lib/rack/recaptcha/helpers.rb
113
+ - test/helpers_test.rb
114
+ - test/test_helper.rb
115
+ - test/recaptcha_test.rb
116
+ homepage: http://github.com/achiu/rack-recaptcha
117
+ licenses: []
118
+ metadata: {}
119
+ post_install_message:
120
+ rdoc_options:
121
+ - --charset=UTF-8
122
+ require_paths:
123
+ - lib
124
+ required_ruby_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - '>='
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ required_rubygems_version: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - '>='
132
+ - !ruby/object:Gem::Version
133
+ version: 1.3.6
134
+ requirements: []
135
+ rubyforge_project:
136
+ rubygems_version: 2.0.3
137
+ signing_key:
138
+ specification_version: 4
139
+ summary: Rack middleware for Recaptcha
140
+ test_files:
141
+ - test/helpers_test.rb
142
+ - test/test_helper.rb
143
+ - test/recaptcha_test.rb