kandr-easy_captcha 0.8.0 → 0.9.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.
- checksums.yaml +4 -4
- data/README.md +32 -35
- data/spec/easy_captcha/captcha_controller_spec.rb +55 -0
- data/spec/easy_captcha/captcha_spec.rb +28 -0
- data/spec/easy_captcha/controller_helpers_spec.rb +21 -0
- data/spec/easy_captcha/espeak_spec.rb +49 -8
- data/spec/easy_captcha/generators/install_generator_spec.rb +71 -0
- data/spec/easy_captcha/model_helpers_spec.rb +65 -0
- data/spec/easy_captcha/routing_spec.rb +4 -11
- data/spec/easy_captcha/view_helpers_spec.rb +14 -0
- data/spec/easy_captcha_spec.rb +47 -125
- data/spec/fixtures/application.rb +24 -0
- data/spec/fixtures/controller.rb +17 -0
- data/spec/fixtures/model.rb +29 -0
- data/spec/spec_helper.rb +17 -1
- metadata +19 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7afea87e8b21ef3ff7055cd15b30c1d78d40d2cfde7198734e110797631c8dd4
|
4
|
+
data.tar.gz: 6436bbdf72bc8fba98f80c7cc4d85a49a576905dabaa48c2b552eacfd8e53432
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 72091d69c920aa172ba2059eb7d9408ea8f8dd2dec4fc18d2cf4acdc47fa3e7d002a89f0470e6fd7ca5f4def95103ce7f77e146dde7e7726685b603430cbd966
|
7
|
+
data.tar.gz: e54c20efbdc0b587837751e1ecdd2ab34154b00d129e45a9da55104c6ed539f1ac216d4da9d926da166ae56c0561ad9e2f71ea22d83611907febeb00d98a6029
|
data/README.md
CHANGED
@@ -1,14 +1,22 @@
|
|
1
|
-
|
1
|
+
# EasyCAPTCHA
|
2
|
+
|
3
|
+
[](https://codeclimate.com/github/K-and-R/easy_captcha/maintainability)
|
4
|
+
[](https://codeclimate.com/github/K-and-R/easy_captcha/test_coverage)
|
2
5
|
|
3
6
|
A simple captcha implementation for Rails 5+ based on RMagick.
|
4
7
|
|
5
|
-
This (`kandr-easy_captcha`) is a fork of
|
8
|
+
This (`kandr-easy_captcha`) is a fork of
|
9
|
+
[EasyCaptcha](https://github.com/phatworx/easy_captcha) (`easy_captcha`) with Rails 5+ support. This fork is
|
10
|
+
maintained by Karl Wilbur/K&R Software (karl@kandrsoftware.com).
|
11
|
+
|
12
|
+
## Dependencies/Requirements
|
6
13
|
|
7
|
-
|
14
|
+
* Rails 5+ (<http://github.com/rails/rails>)
|
15
|
+
* RMagick
|
8
16
|
|
9
17
|
RMagick should be included in your `Gemfile`
|
10
18
|
|
11
|
-
```
|
19
|
+
```ruby
|
12
20
|
gem 'rmagick'
|
13
21
|
```
|
14
22
|
|
@@ -18,7 +26,7 @@ for Java/JRuby you can use
|
|
18
26
|
gem 'rmagick4j'
|
19
27
|
```
|
20
28
|
|
21
|
-
|
29
|
+
## Installation
|
22
30
|
|
23
31
|
add to Gemfile
|
24
32
|
|
@@ -32,9 +40,10 @@ after running `bundle install`, execute
|
|
32
40
|
rails g easy_captcha:install
|
33
41
|
```
|
34
42
|
|
35
|
-
|
43
|
+
## Configuration
|
36
44
|
|
37
|
-
You can configure `easy_captcha` in `config/initializers/easy_captcha.rb`, if
|
45
|
+
You can configure `easy_captcha` in `config/initializers/easy_captcha.rb`, if
|
46
|
+
you want to customize the default configuration
|
38
47
|
|
39
48
|
```ruby
|
40
49
|
EasyCaptcha.setup do |config|
|
@@ -109,9 +118,10 @@ You can configure `easy_captcha` in `config/initializers/easy_captcha.rb`, if yo
|
|
109
118
|
end
|
110
119
|
```
|
111
120
|
|
112
|
-
|
121
|
+
## Caching
|
113
122
|
|
114
|
-
It is strongly recommended to enable caching. You can see the three paramters which you have to fill in your config
|
123
|
+
It is strongly recommended to enable caching. You can see the three paramters which you have to fill in your config
|
124
|
+
file below.
|
115
125
|
|
116
126
|
```ruby
|
117
127
|
EasyCaptcha.setup do |config|
|
@@ -126,12 +136,7 @@ It is strongly recommended to enable caching. You can see the three paramters wh
|
|
126
136
|
end
|
127
137
|
```
|
128
138
|
|
129
|
-
|
130
|
-
|
131
|
-
* RMagick
|
132
|
-
* Rails 3 (http://github.com/rails/rails)
|
133
|
-
|
134
|
-
== Example
|
139
|
+
## Example
|
135
140
|
|
136
141
|
```ruby
|
137
142
|
<% form_tag '/' do %>
|
@@ -144,36 +149,28 @@ It is strongly recommended to enable caching. You can see the three paramters wh
|
|
144
149
|
<% end %>
|
145
150
|
```
|
146
151
|
|
147
|
-
|
152
|
+
## Example app
|
148
153
|
|
149
|
-
You find an example app under: http://github.com/phatworx/easy_captcha_example
|
154
|
+
You find an example app under: <http://github.com/phatworx/easy_captcha_example>
|
150
155
|
|
151
|
-
|
156
|
+
## History
|
152
157
|
|
153
|
-
|
154
|
-
* 0.2 cache support for high frequented sites
|
155
|
-
* 0.3 use generators, optimizations, update licence to same of all my plugins
|
156
|
-
* 0.4 generator support
|
157
|
-
* 0.5 (transparent) background support
|
158
|
-
* 0.6 espeak support for barrier-free support
|
158
|
+
See the [CHANGELOG.md](./CHANGELOG.md)
|
159
159
|
|
160
|
-
|
160
|
+
## Maintainers
|
161
161
|
|
162
|
-
*
|
163
|
-
*
|
164
|
-
* Alexander Dreher (http://github.com/alexdreher)
|
165
|
-
* Christoph Chilian (http://github.com/cc-web)
|
162
|
+
* Karl Wilbur (<http://github.com/karlwilbur>)
|
163
|
+
* K&R Software (<http://github.com/K-and-R>)
|
166
164
|
|
167
|
-
|
165
|
+
## Contributing to (K&R) EasyCaptcha
|
168
166
|
|
169
|
-
*
|
170
|
-
* Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
|
167
|
+
* See the [TODO.md](./TODO.md) file for a list of needed changes
|
171
168
|
* Fork the project
|
172
169
|
* Start a feature/bugfix branch
|
173
170
|
* Commit and push until you are happy with your contribution
|
174
|
-
* Make sure to add tests for it
|
175
|
-
* Please
|
171
|
+
* Make sure to add tests for it!
|
172
|
+
* Please do not edit `Rakefile`, `EasyCaptcha::VERSION`, or `CHANGELOG`
|
176
173
|
|
177
|
-
|
174
|
+
## Copyright
|
178
175
|
|
179
176
|
Copyright (c) 2010 Marco Scholl. See LICENSE.txt for further details.
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
# require 'rails-controller-testing'
|
6
|
+
# Rails::Controller::Testing.install
|
7
|
+
|
8
|
+
require 'fixtures/application'
|
9
|
+
Rails.logger = Logger.new('/dev/null')
|
10
|
+
|
11
|
+
RSpec.describe EasyCaptcha::CaptchaController, type: :controller do
|
12
|
+
let(:controller) { described_class.new }
|
13
|
+
|
14
|
+
before do
|
15
|
+
EasyCaptcha.init
|
16
|
+
EasyCaptcha.setup do |config|
|
17
|
+
config.cache = false
|
18
|
+
config.espeak = true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '`captcha` action' do
|
23
|
+
it 'exists' do
|
24
|
+
expect(controller).to respond_to :captcha
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'with defaults' do
|
28
|
+
before do
|
29
|
+
get :captcha
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'sends an image' do
|
33
|
+
expect(response.header['Content-Type']).to eq 'image/png'
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'sends content' do
|
37
|
+
expect(response.body).not_to be_empty
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'with a WAV request' do
|
42
|
+
before do
|
43
|
+
get :captcha, format: 'wav'
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'sends an audio file' do
|
47
|
+
expect(response.header['Content-Type']).to eq 'audio/wav'
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'sends content' do
|
51
|
+
expect(response.body).not_to be_empty
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe EasyCaptcha::Captcha do
|
6
|
+
let(:captcha_text) { 'asdf246' }
|
7
|
+
let(:captcha) { described_class.new(captcha_text) }
|
8
|
+
|
9
|
+
before do
|
10
|
+
EasyCaptcha.setup
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'uses new CAPTCHA text passed on initialization' do
|
14
|
+
expect(captcha.code).to eq captcha_text
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'generates a CAPTCHA on initialization' do
|
18
|
+
expect(captcha.image).not_to be_nil
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'shows its class name when inspected' do
|
22
|
+
expect(captcha.inspect).to include described_class.name
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'shows its code value when inspected' do
|
26
|
+
expect(captcha.inspect).to include "@code=#{captcha_text}"
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'fixtures/application'
|
5
|
+
require 'fixtures/controller'
|
6
|
+
|
7
|
+
RSpec.describe 'EasyCaptcha::ControllerHelpers', type: :helper do
|
8
|
+
let(:controller) { EasyCaptcha::TestController.new }
|
9
|
+
|
10
|
+
before do
|
11
|
+
EasyCaptcha.setup
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'has a `valid_captcha?` method' do
|
15
|
+
expect(helper).to respond_to :valid_captcha?
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'has a `captcha_valid?` method' do
|
19
|
+
expect(helper).to respond_to :captcha_valid?
|
20
|
+
end
|
21
|
+
end
|
@@ -1,22 +1,63 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require 'spec_helper'
|
4
4
|
|
5
5
|
RSpec.describe EasyCaptcha::Espeak do
|
6
|
+
before do
|
7
|
+
# Ensure that we have created a config
|
8
|
+
EasyCaptcha.setup
|
9
|
+
end
|
10
|
+
|
6
11
|
context 'with default values' do
|
7
|
-
subject(:
|
12
|
+
subject(:audio_captcha) { described_class.new }
|
8
13
|
|
9
14
|
let(:amplitude_range) { 80..120 }
|
10
15
|
let(:pitch_range) { 30..70 }
|
11
16
|
|
12
|
-
specify(:amplitude) { expect(amplitude_range).to include(
|
13
|
-
specify(:pitch) { expect(pitch_range).to include(
|
14
|
-
specify(:gap) { expect(
|
15
|
-
specify(:voice) { expect(
|
17
|
+
specify(:amplitude) { expect(amplitude_range).to include(audio_captcha.amplitude) }
|
18
|
+
specify(:pitch) { expect(pitch_range).to include(audio_captcha.pitch) }
|
19
|
+
specify(:gap) { expect(audio_captcha.gap).to eq 80 }
|
20
|
+
specify(:voice) { expect(audio_captcha.voice).to be_nil }
|
21
|
+
|
22
|
+
context 'when generating WAV file' do
|
23
|
+
let(:code) { 'asdf2648' }
|
24
|
+
let(:wav_file) { Tempfile.new("#{code}.wav") }
|
25
|
+
|
26
|
+
after do
|
27
|
+
wav_file.close!
|
28
|
+
wav_file.unlink
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'generates without error' do
|
32
|
+
expect { audio_captcha.generate(code, wav_file.path) }.not_to raise_error
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'generates file content' do
|
36
|
+
audio_captcha.generate(code, wav_file.path)
|
37
|
+
expect(wav_file.size).not_to be_zero
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'raises an ArgumentError with an invalid code' do
|
41
|
+
expect { audio_captcha.generate(nil, wav_file.path) }.to raise_error ArgumentError
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'with an `EasyCaptcha::Captcha` instance as its code' do
|
45
|
+
let(:captcha_code_object) { EasyCaptcha::Captcha.new(code) }
|
46
|
+
|
47
|
+
it 'can accept code argument without an error' do
|
48
|
+
expect { audio_captcha.generate(captcha_code_object, wav_file.path) }.not_to raise_error
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'can generate file content' do
|
52
|
+
audio_captcha.generate(captcha_code_object, wav_file.path)
|
53
|
+
expect(wav_file.size).not_to be_zero
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
16
57
|
end
|
17
58
|
|
18
59
|
context 'with config: voices' do
|
19
|
-
subject(:
|
60
|
+
subject(:audio_captcha) do
|
20
61
|
described_class.new do |config|
|
21
62
|
config.voice = voices
|
22
63
|
end
|
@@ -24,6 +65,6 @@ RSpec.describe EasyCaptcha::Espeak do
|
|
24
65
|
|
25
66
|
let(:voices) { ['german', 'german+m1'] }
|
26
67
|
|
27
|
-
specify { expect(voices).to include(
|
68
|
+
specify { expect(voices).to include(audio_captcha.voice) }
|
28
69
|
end
|
29
70
|
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
require 'spec_helper'
|
5
|
+
require 'generator_spec'
|
6
|
+
|
7
|
+
require 'generators/easy_captcha/install_generator'
|
8
|
+
|
9
|
+
RSpec.describe EasyCaptcha::Generators::InstallGenerator, type: :generator do
|
10
|
+
temp_dir = File.expand_path('../../../tmp', __dir__)
|
11
|
+
destination temp_dir
|
12
|
+
|
13
|
+
# rubocop:disable RSpec/BeforeAfterAll
|
14
|
+
before(:all) do
|
15
|
+
prepare_destination
|
16
|
+
# Replicate a Rails app structure
|
17
|
+
FileUtils.mkdir_p "#{temp_dir}/config/initializers"
|
18
|
+
File.open "#{temp_dir}/config/routes.rb", 'w' do |f|
|
19
|
+
f.write "Rails.application.routes.draw do \nend"
|
20
|
+
end
|
21
|
+
FileUtils.mkdir_p "#{temp_dir}/app/controllers"
|
22
|
+
File.open "#{temp_dir}/app/controllers/application_controller.rb", 'w' do |f|
|
23
|
+
f.write "class ApplicationController \nend"
|
24
|
+
end
|
25
|
+
# Ensure taht `ApplicationController` is already defined.
|
26
|
+
require "#{temp_dir}/app/controllers/application_controller.rb"
|
27
|
+
run_generator
|
28
|
+
end
|
29
|
+
|
30
|
+
after(:all) do
|
31
|
+
FileUtils.rm_rf "#{temp_dir}/config"
|
32
|
+
FileUtils.rm_rf "#{temp_dir}/app"
|
33
|
+
end
|
34
|
+
# rubocop:enable RSpec/BeforeAfterAll
|
35
|
+
|
36
|
+
# rubocop:disable Lint/AmbiguousBlockAssociation
|
37
|
+
specify do
|
38
|
+
expect(destination_root).to have_structure {
|
39
|
+
directory('config') do
|
40
|
+
directory('initializers') do
|
41
|
+
file('easy_captcha.rb') do
|
42
|
+
contains('EasyCaptcha.setup')
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
specify do
|
50
|
+
expect(destination_root).to have_structure {
|
51
|
+
directory('app') do
|
52
|
+
directory('controllers') do
|
53
|
+
file('application_controller.rb') do
|
54
|
+
contains('reset_last_captcha_code!')
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
}
|
59
|
+
end
|
60
|
+
|
61
|
+
specify do
|
62
|
+
expect(destination_root).to have_structure {
|
63
|
+
directory('config') do
|
64
|
+
file('routes.rb') do
|
65
|
+
contains('captcha_route')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
}
|
69
|
+
end
|
70
|
+
# rubocop:enable Lint/AmbiguousBlockAssociation
|
71
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
require 'fixtures/model'
|
6
|
+
|
7
|
+
RSpec.describe EasyCaptcha::ModelHelpers, type: :helper do
|
8
|
+
let(:model) { EasyCaptcha::TestModel.new }
|
9
|
+
|
10
|
+
it 'is included in the ActiveRecord helpers' do
|
11
|
+
expect(ActiveRecord::Base).to include described_class
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'when included in a model instance' do
|
15
|
+
it 'has `captcha` reader' do
|
16
|
+
expect(model).to respond_to :captcha
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'has `captcha` writer' do
|
20
|
+
expect(model).to respond_to :captcha=
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'has `captcha_verification` writer' do
|
24
|
+
expect(model).to respond_to :captcha_verification=
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'has `captcha_valid?` method' do
|
28
|
+
expect(model).to respond_to :captcha_valid?
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'has `captcha_verification_match?` method' do
|
32
|
+
expect(model).to respond_to :captcha_verification_match?
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'is not valid with a `nil` CAPTCHA' do
|
36
|
+
model.captcha = nil
|
37
|
+
model.captcha_verification = nil
|
38
|
+
expect(model).not_to be_valid_captcha
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'is not valid with a `nil` CAPTCHA verification text' do
|
42
|
+
model.captcha = 'foo'
|
43
|
+
model.captcha_verification = nil
|
44
|
+
expect(model).not_to be_valid_captcha
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'is not valid with mismatched CAPTCHA and verification text' do
|
48
|
+
model.captcha = 'foo'
|
49
|
+
model.captcha_verification = 'bar'
|
50
|
+
expect(model).not_to be_valid_captcha
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'is valid with matching CAPTCHA and verification text' do
|
54
|
+
model.captcha = 'foo'
|
55
|
+
model.captcha_verification = 'foo'
|
56
|
+
expect(model).to be_valid_captcha
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'is valid with matching CAPTCHA and verification text with mismatched case' do
|
60
|
+
model.captcha = 'Foo'
|
61
|
+
model.captcha_verification = 'foo'
|
62
|
+
expect(model).to be_valid_captcha
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -1,19 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require 'spec_helper'
|
4
4
|
|
5
|
-
|
6
|
-
class TestApp < ::Rails::Application
|
7
|
-
end
|
8
|
-
|
9
|
-
TestApp.routes.draw do
|
10
|
-
captcha_route
|
11
|
-
end
|
12
|
-
end
|
5
|
+
require 'fixtures/application'
|
13
6
|
|
14
7
|
RSpec.describe EasyCaptcha::CaptchaController, type: :routing do
|
15
|
-
routes {
|
16
|
-
let(:routeset) {
|
8
|
+
routes { Rails.application.routes }
|
9
|
+
let(:routeset) { Rails.application.routes }
|
17
10
|
let(:captcha_request) { { get: '/captcha' } }
|
18
11
|
|
19
12
|
it 'has added a route' do
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe EasyCaptcha::ViewHelpers, type: :helper do
|
6
|
+
describe 'captcha_tag' do
|
7
|
+
let(:captcha_path) { '/captcha' }
|
8
|
+
|
9
|
+
it 'returns an image tag' do
|
10
|
+
allow(helper).to receive(:captcha_path).and_return(captcha_path)
|
11
|
+
expect(helper.captcha_tag).to match(%r{^<img alt="captcha" .* src="#{captcha_path}" />$})
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/spec/easy_captcha_spec.rb
CHANGED
@@ -1,146 +1,68 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require 'spec_helper'
|
4
4
|
|
5
5
|
describe EasyCaptcha do
|
6
|
-
|
7
|
-
described_class.
|
8
|
-
|
9
|
-
config.cache = false
|
10
|
-
|
11
|
-
# Chars
|
12
|
-
config.captcha_character_pool = %w[2 3 4 5 6 7 9 A C D E F G H J K L M N P Q R S T U X Y Z]
|
13
|
-
|
14
|
-
# Image
|
15
|
-
config.captcha_image_height = 40
|
16
|
-
config.captcha_image_width = 140
|
17
|
-
|
18
|
-
# Length
|
19
|
-
config.captcha_character_count = 6
|
20
|
-
|
21
|
-
# configure generator
|
22
|
-
config.generator :default do |generator|
|
23
|
-
# Blur
|
24
|
-
generator.blur = true
|
25
|
-
generator.blur_radius = 1
|
26
|
-
generator.blur_sigma = 2
|
27
|
-
|
28
|
-
# Font
|
29
|
-
generator.font_size = 24
|
30
|
-
generator.font_fill_color = '#333333'
|
31
|
-
generator.font_stroke_color = '#000000'
|
32
|
-
generator.font_stroke = 0
|
33
|
-
generator.font_family = File.expand_path('../resources/afont.ttf', __dir__)
|
34
|
-
|
35
|
-
# Image background
|
36
|
-
generator.image_background_color = '#FFFFFF'
|
37
|
-
|
38
|
-
# Implode
|
39
|
-
generator.implode = 0.1
|
6
|
+
it 'has a VERSION' do
|
7
|
+
expect(described_class::VERSION).not_to be_blank
|
8
|
+
end
|
40
9
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
10
|
+
describe '#setup' do
|
11
|
+
context 'when using defaults' do
|
12
|
+
it 'does not require a block to be given' do
|
13
|
+
expect { described_class.setup }.not_to raise_error
|
14
|
+
end
|
45
15
|
|
46
|
-
|
47
|
-
|
48
|
-
generator.wave_length = (60..100)
|
49
|
-
generator.wave_amplitude = (3..5)
|
16
|
+
it 'will use defaults if no block given' do
|
17
|
+
described_class.setup
|
50
18
|
end
|
51
|
-
end
|
52
19
|
|
53
|
-
|
54
|
-
|
20
|
+
it 'has default generator' do
|
21
|
+
expect(described_class.generator).to be_an(EasyCaptcha::Generator::Default)
|
22
|
+
end
|
55
23
|
end
|
56
24
|
|
57
|
-
|
58
|
-
|
59
|
-
|
25
|
+
context 'when chaging defaults' do
|
26
|
+
let(:captcha_config_options) do
|
27
|
+
{
|
28
|
+
cache: false,
|
29
|
+
captcha_character_pool: %w[2 4 6 8 A E I O U],
|
30
|
+
captcha_image_height: 6,
|
31
|
+
captcha_image_width: 9,
|
32
|
+
captcha_character_count: 6
|
33
|
+
}
|
34
|
+
end
|
60
35
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
wave_amplitude
|
79
|
-
|
80
|
-
]
|
36
|
+
let(:generator_config_options) do
|
37
|
+
{
|
38
|
+
blur: true,
|
39
|
+
blur_radius: 1,
|
40
|
+
blur_sigma: 2,
|
41
|
+
font_size: 24,
|
42
|
+
font_fill_color: '#333333',
|
43
|
+
font_stroke_color: '#000000',
|
44
|
+
font_stroke: 0,
|
45
|
+
font_family: File.expand_path('../resources/afont.ttf', __dir__),
|
46
|
+
image_background_color: '#FFFFFF',
|
47
|
+
implode: 0.1,
|
48
|
+
sketch: true,
|
49
|
+
sketch_radius: 3,
|
50
|
+
sketch_sigma: 1,
|
51
|
+
wave: true,
|
52
|
+
wave_length: (60..100),
|
53
|
+
wave_amplitude: (3..5)
|
54
|
+
}
|
81
55
|
end
|
82
56
|
|
83
57
|
before do
|
84
58
|
described_class.setup do |config|
|
85
|
-
#
|
86
|
-
config.
|
87
|
-
config.captcha_image_width = 140
|
88
|
-
|
89
|
-
# Length
|
90
|
-
config.captcha_character_count = 6
|
91
|
-
|
92
|
-
config.generator :default do |generator|
|
93
|
-
# Blur
|
94
|
-
generator.blur = true
|
95
|
-
generator.blur_radius = 1
|
96
|
-
generator.blur_sigma = 2
|
97
|
-
|
98
|
-
# Font
|
99
|
-
generator.font_size = 24
|
100
|
-
generator.font_fill_color = '#333333'
|
101
|
-
generator.font_stroke_color = '#000000'
|
102
|
-
generator.font_stroke = 0
|
103
|
-
generator.font_family = File.expand_path('../resources/afont.ttf', __dir__)
|
104
|
-
|
105
|
-
# Image background
|
106
|
-
generator.image_background_color = '#FFFFFF'
|
107
|
-
|
108
|
-
# Implode
|
109
|
-
generator.implode = 0.1
|
110
|
-
|
111
|
-
# Sketch
|
112
|
-
generator.sketch = true
|
113
|
-
generator.sketch_radius = 3
|
114
|
-
generator.sketch_sigma = 1
|
115
|
-
|
116
|
-
# Wave
|
117
|
-
generator.wave = true
|
118
|
-
generator.wave_length = (60..100)
|
119
|
-
generator.wave_amplitude = (3..5)
|
120
|
-
end
|
59
|
+
captcha_config_options.each { |k, v| config.send("#{k}=", v) }
|
60
|
+
config.generator(:default) { |generator| generator_config_options.each { |k, v| generator.send("#{k}=", v) } }
|
121
61
|
end
|
122
62
|
end
|
123
63
|
|
124
|
-
it '
|
125
|
-
|
126
|
-
expect(described_class.generator.send(opt)).not_to be_nil
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
it 'raises NoMethodError on missing non-depracations' do
|
131
|
-
expect { described_class.send(EasyCaptcha::DEPRECATED_METHODS.first) }.not_to raise_error(NoMethodError)
|
132
|
-
end
|
133
|
-
|
134
|
-
it 'does not raise NoMethodError on depracations' do
|
135
|
-
expect { described_class.send(:a_missing_method) }.to raise_error(NoMethodError)
|
136
|
-
end
|
137
|
-
|
138
|
-
it 'does not respond_to? depracations' do
|
139
|
-
expect(described_class).not_to respond_to(EasyCaptcha::DEPRECATED_METHODS.first)
|
140
|
-
end
|
141
|
-
|
142
|
-
it 'does not respond_to? missing non-depracations' do
|
143
|
-
expect(described_class).not_to respond_to(:a_missing_method)
|
64
|
+
it 'does not cache' do
|
65
|
+
expect(described_class).not_to be_cache
|
144
66
|
end
|
145
67
|
end
|
146
68
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_support/all'
|
4
|
+
require 'action_controller'
|
5
|
+
require 'action_dispatch'
|
6
|
+
require 'action_view'
|
7
|
+
|
8
|
+
class EasyCaptcha::TestApp < ::Rails::Application
|
9
|
+
def env_config; {} end
|
10
|
+
def routes
|
11
|
+
return @routes unless !defined?(@routes) || @routes.nil?
|
12
|
+
@routes = ActionDispatch::Routing::RouteSet.new
|
13
|
+
@routes
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module Rails
|
18
|
+
def self.application
|
19
|
+
@app ||= EasyCaptcha::TestApp.new
|
20
|
+
end
|
21
|
+
end
|
22
|
+
Rails.application.routes.draw do
|
23
|
+
captcha_route
|
24
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Rails.logger = Logger.new('/dev/null')
|
4
|
+
class EasyCaptcha::TestController < ActionController::Base
|
5
|
+
include ActionController::Helpers
|
6
|
+
|
7
|
+
attr_accessor :controller_path, :session
|
8
|
+
|
9
|
+
def initilaize(*args)
|
10
|
+
@session = {}
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
def params
|
15
|
+
{}
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class EasyCaptcha::TestModel
|
4
|
+
# Required dependency for ActiveModel::Errors
|
5
|
+
extend ActiveModel::Naming
|
6
|
+
|
7
|
+
include EasyCaptcha::ModelHelpers
|
8
|
+
acts_as_easy_captcha
|
9
|
+
|
10
|
+
attr_accessor :name
|
11
|
+
attr_reader :errors
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@errors = ActiveModel::Errors.new(self)
|
15
|
+
end
|
16
|
+
|
17
|
+
# For ActiveModel::Errors, the following methods are needed to be minimally implemented
|
18
|
+
def read_attribute_for_validation(attr)
|
19
|
+
send(attr)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.human_attribute_name(attr, _options = {})
|
23
|
+
attr
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.lookup_ancestors
|
27
|
+
[self]
|
28
|
+
end
|
29
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -5,8 +5,16 @@ require 'pry'
|
|
5
5
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
6
6
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
7
7
|
require 'simplecov'
|
8
|
-
SimpleCov.
|
8
|
+
# SimpleCov.minimum_coverage 90
|
9
|
+
SimpleCov.start 'rails' do
|
10
|
+
# Ignore initilalizer template
|
11
|
+
add_filter 'lib/generators/templates/'
|
12
|
+
# Ignore version file because it already loaded and won't be detected by SimpleCov
|
13
|
+
add_filter 'lib/easy_captcha/version'
|
14
|
+
end
|
15
|
+
|
9
16
|
# require 'rails/all'
|
17
|
+
require 'active_support/all'
|
10
18
|
require 'action_controller'
|
11
19
|
require 'action_dispatch'
|
12
20
|
require 'action_view'
|
@@ -16,3 +24,11 @@ require 'easy_captcha'
|
|
16
24
|
# Requires supporting files with custom matchers and macros, etc,
|
17
25
|
# in ./support/ and its subdirectories.
|
18
26
|
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].sort.each { |f| require f }
|
27
|
+
|
28
|
+
# RSpec.configure do |config|
|
29
|
+
# [:controller, :view, :request].each do |type|
|
30
|
+
# config.include ::Rails::Controller::Testing::TestProcess, :type => type
|
31
|
+
# config.include ::Rails::Controller::Testing::TemplateAssertions, :type => type
|
32
|
+
# config.include ::Rails::Controller::Testing::Integration, :type => type
|
33
|
+
# end
|
34
|
+
# end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kandr-easy_captcha
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marco Scholl
|
@@ -50,9 +50,18 @@ extra_rdoc_files:
|
|
50
50
|
files:
|
51
51
|
- LICENSE.txt
|
52
52
|
- README.md
|
53
|
+
- spec/easy_captcha/captcha_controller_spec.rb
|
54
|
+
- spec/easy_captcha/captcha_spec.rb
|
55
|
+
- spec/easy_captcha/controller_helpers_spec.rb
|
53
56
|
- spec/easy_captcha/espeak_spec.rb
|
57
|
+
- spec/easy_captcha/generators/install_generator_spec.rb
|
58
|
+
- spec/easy_captcha/model_helpers_spec.rb
|
54
59
|
- spec/easy_captcha/routing_spec.rb
|
60
|
+
- spec/easy_captcha/view_helpers_spec.rb
|
55
61
|
- spec/easy_captcha_spec.rb
|
62
|
+
- spec/fixtures/application.rb
|
63
|
+
- spec/fixtures/controller.rb
|
64
|
+
- spec/fixtures/model.rb
|
56
65
|
- spec/spec.opts
|
57
66
|
- spec/spec_helper.rb
|
58
67
|
homepage: http://github.com/K-and-R/easy_captcha
|
@@ -79,8 +88,17 @@ signing_key:
|
|
79
88
|
specification_version: 4
|
80
89
|
summary: CAPTCHA Plugin for Rails
|
81
90
|
test_files:
|
91
|
+
- spec/easy_captcha/captcha_controller_spec.rb
|
92
|
+
- spec/easy_captcha/captcha_spec.rb
|
93
|
+
- spec/easy_captcha/controller_helpers_spec.rb
|
82
94
|
- spec/easy_captcha/espeak_spec.rb
|
95
|
+
- spec/easy_captcha/generators/install_generator_spec.rb
|
96
|
+
- spec/easy_captcha/model_helpers_spec.rb
|
83
97
|
- spec/easy_captcha/routing_spec.rb
|
98
|
+
- spec/easy_captcha/view_helpers_spec.rb
|
84
99
|
- spec/easy_captcha_spec.rb
|
100
|
+
- spec/fixtures/application.rb
|
101
|
+
- spec/fixtures/controller.rb
|
102
|
+
- spec/fixtures/model.rb
|
85
103
|
- spec/spec.opts
|
86
104
|
- spec/spec_helper.rb
|