params_sanitizer 0.0.1
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 +7 -0
- data/.gitignore +18 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +105 -0
- data/Rakefile +1 -0
- data/lib/params_sanitizer.rb +2 -0
- data/lib/params_sanitizer/base.rb +97 -0
- data/lib/params_sanitizer/sanitizers/accept_range.rb +60 -0
- data/lib/params_sanitizer/sanitizers/accept_regex.rb +56 -0
- data/lib/params_sanitizer/sanitizers/accept_value.rb +57 -0
- data/lib/params_sanitizer/sanitizers/exist_value.rb +36 -0
- data/lib/params_sanitizer/sanitizers/reject_range.rb +60 -0
- data/lib/params_sanitizer/sanitizers/reject_regex.rb +56 -0
- data/lib/params_sanitizer/sanitizers/reject_value.rb +57 -0
- data/lib/params_sanitizer/version.rb +3 -0
- data/params_sanitizer.gemspec +27 -0
- data/spec/params_sanitizer/base_spec.rb +81 -0
- data/spec/params_sanitizer/sanitizers/accept_range_spec.rb +116 -0
- data/spec/params_sanitizer/sanitizers/accept_regex_spec.rb +72 -0
- data/spec/params_sanitizer/sanitizers/accept_value_spec.rb +63 -0
- data/spec/params_sanitizer/sanitizers/exist_value_spec.rb +64 -0
- data/spec/params_sanitizer/sanitizers/reject_range_spec.rb +116 -0
- data/spec/params_sanitizer/sanitizers/reject_regex_spec.rb +72 -0
- data/spec/params_sanitizer/sanitizers/reject_value_spec.rb +63 -0
- data/spec/spec_helper.rb +8 -0
- metadata +149 -0
@@ -0,0 +1,36 @@
|
|
1
|
+
module ParamsSanitizer::Sanitizers
|
2
|
+
module ExistValue
|
3
|
+
|
4
|
+
private
|
5
|
+
|
6
|
+
# Sanitize a destructive params.
|
7
|
+
# @note destructive method for params.
|
8
|
+
#
|
9
|
+
# @param params [Hash] parameters. (will be destructed by this method.)
|
10
|
+
# @param rules [Hash] rules of exist_value.
|
11
|
+
def sanitize_exist_value!(params, rules)
|
12
|
+
rules.each do |key, rule|
|
13
|
+
params[key] = params[key] || rule[:default_value]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module SanitizerMethods
|
18
|
+
# Define rule of exist_value
|
19
|
+
#
|
20
|
+
# @example
|
21
|
+
# exist_value(:keyword, '')
|
22
|
+
#
|
23
|
+
# @param key [String] key of parameter.
|
24
|
+
# @param default_value [Object] default values when input not exist value or nil.
|
25
|
+
def exist_value(key, default_value, min = nil, max = nil)
|
26
|
+
check_duplicated_definition!(key)
|
27
|
+
definitions[:exist_value] ||= Hash.new
|
28
|
+
definitions[:exist_value][key.to_s] = { default_value: default_value }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.included(mixin)
|
33
|
+
mixin.extend SanitizerMethods
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module ParamsSanitizer::Sanitizers
|
2
|
+
module RejectRange
|
3
|
+
|
4
|
+
private
|
5
|
+
|
6
|
+
# Sanitize a destructive params.
|
7
|
+
# @note destructive method for params.
|
8
|
+
#
|
9
|
+
# @param params [Hash] parameters. (will be destructed by this method.)
|
10
|
+
# @param rules [Hash] rules of reject_range.
|
11
|
+
def sanitize_reject_range!(params, rules)
|
12
|
+
rules.each do |key, rule|
|
13
|
+
if params.has_key?(key)
|
14
|
+
params[key] = check_reject_range(params[key].to_i, rule[:default_value], rule[:min], rule[:max])
|
15
|
+
else
|
16
|
+
params[key] = rule[:default_value]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Check whether a value is admitted range.
|
22
|
+
# @note return a default value when value is not admitted range.
|
23
|
+
#
|
24
|
+
# @param value [Object] value
|
25
|
+
# @param default_value [Object] default_value
|
26
|
+
# @param min [Integer] range of min.(when do not set a limit, nil)
|
27
|
+
# @param max [Integer] range of max.(when do not set a limit, nil)
|
28
|
+
# @return [Object] value or default_value.
|
29
|
+
def check_reject_range(value, default_value, min, max)
|
30
|
+
if min and value < min
|
31
|
+
value
|
32
|
+
elsif max and value > max
|
33
|
+
value
|
34
|
+
else
|
35
|
+
default_value
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
module SanitizerMethods
|
40
|
+
# Define rule of reject range.
|
41
|
+
#
|
42
|
+
# @example
|
43
|
+
# reject_range(:age, 100, 100, nil) # max 100.
|
44
|
+
#
|
45
|
+
# @param key [String] key of parameter.
|
46
|
+
# @param default_value [Object] default values when input not addmitted value.
|
47
|
+
# @param min [Integer] range of min.(when do not set a limit, nil)
|
48
|
+
# @param max [Integer] range of max.(when do not set a limit, nil)
|
49
|
+
def reject_range(key, default_value, min = nil, max = nil)
|
50
|
+
check_duplicated_definition!(key)
|
51
|
+
definitions[:reject_range] ||= Hash.new
|
52
|
+
definitions[:reject_range][key.to_s] = { default_value: default_value, min: min, max: max }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.included(mixin)
|
57
|
+
mixin.extend SanitizerMethods
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module ParamsSanitizer::Sanitizers
|
2
|
+
module RejectRegex
|
3
|
+
|
4
|
+
private
|
5
|
+
|
6
|
+
# Sanitize a destructive params.
|
7
|
+
# @note destructive method for params.
|
8
|
+
#
|
9
|
+
# @param params [Hash] parameters. (will be destructed by this method.)
|
10
|
+
# @param rules [Hash] rules of reject_regex.
|
11
|
+
def sanitize_reject_regex!(params, rules)
|
12
|
+
rules.each do |key, rule|
|
13
|
+
if params.has_key?(key)
|
14
|
+
params[key] = check_reject_regex(params[key], rule[:default_value], rule[:regex])
|
15
|
+
else
|
16
|
+
params[key] = rule[:default_value]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Check whether a value is admitted regex.
|
22
|
+
# @note return a default value when value is not admitted regex.
|
23
|
+
#
|
24
|
+
# @param value [Object] value
|
25
|
+
# @param default_value [Object] default_value
|
26
|
+
# @param regex [Regexp] reject when regex match.
|
27
|
+
# @return [Object] value or default_value.
|
28
|
+
def check_reject_regex(value, default_value, regex)
|
29
|
+
if regex.match(value)
|
30
|
+
default_value
|
31
|
+
else
|
32
|
+
value
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module SanitizerMethods
|
37
|
+
# Define rule of reject regex.
|
38
|
+
#
|
39
|
+
# @example
|
40
|
+
# reject_regex(:number, 0, /^\w$/)
|
41
|
+
#
|
42
|
+
# @param key [String] key of parameter.
|
43
|
+
# @param default_value [Object] default values when input not addmitted value.
|
44
|
+
# @param regex [Regexp] reject when regex match.
|
45
|
+
def reject_regex(key, default_value, regex)
|
46
|
+
check_duplicated_definition!(key)
|
47
|
+
definitions[:reject_regex] ||= Hash.new
|
48
|
+
definitions[:reject_regex][key.to_s] = { default_value: default_value, regex: regex }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.included(mixin)
|
53
|
+
mixin.extend SanitizerMethods
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module ParamsSanitizer::Sanitizers
|
2
|
+
module RejectValue
|
3
|
+
|
4
|
+
private
|
5
|
+
|
6
|
+
# Sanitize a destructive params.
|
7
|
+
# @note destructive method for params.
|
8
|
+
#
|
9
|
+
# @param params [Hash] parameters. (will be destructed by this method.)
|
10
|
+
# @param rules [Hash] rules of reject_value.
|
11
|
+
def sanitize_reject_value!(params, rules)
|
12
|
+
rules.each do |key, rule|
|
13
|
+
if params.has_key?(key)
|
14
|
+
params[key] = check_reject_value(params[key], rule[:default_value], rule[:reject_values])
|
15
|
+
else
|
16
|
+
params[key] = rule[:default_value]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Check whether a value is admitted.
|
22
|
+
# @note return a default value when value is not admitted.
|
23
|
+
#
|
24
|
+
# @param value [Object] value
|
25
|
+
# @param default_value [Object] default_value
|
26
|
+
# @param reject_values [Array] admitted values.
|
27
|
+
# @return [Object] value or default_value.
|
28
|
+
def check_reject_value(value, default_value, reject_values)
|
29
|
+
if reject_values.include?(value)
|
30
|
+
default_value
|
31
|
+
else
|
32
|
+
value
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module SanitizerMethods
|
37
|
+
# Define rule of reject value.
|
38
|
+
#
|
39
|
+
# @example
|
40
|
+
# reject_value(:user_name, nil, ['admin','root'])
|
41
|
+
#
|
42
|
+
# @param key [String] key of parameter.
|
43
|
+
# @param default_value [Object] default values when input not addmitted value.
|
44
|
+
# @param reject_values [Array<Object>] reject values.
|
45
|
+
def reject_value(key, default_value, reject_values)
|
46
|
+
check_duplicated_definition!(key)
|
47
|
+
definitions[:reject_value] ||= Hash.new
|
48
|
+
definitions[:reject_value][key.to_s] = { default_value: default_value, reject_values: reject_values }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
def self.included(mixin)
|
54
|
+
mixin.extend SanitizerMethods
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'params_sanitizer/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "params_sanitizer"
|
8
|
+
spec.version = ParamsSanitizer::VERSION
|
9
|
+
spec.authors = ["alfa-jpn"]
|
10
|
+
spec.email = ["a.nkmr.ja@gmail.com"]
|
11
|
+
spec.description = "params_sanitizer sanitize parameter.It is really easy and useful."
|
12
|
+
spec.summary = "params_sanitizer sanitize parameter.It is really easy and useful."
|
13
|
+
spec.homepage = "https://github.com/alfa-jpn/params_sanitizer"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
spec.add_development_dependency "rspec"
|
24
|
+
spec.add_development_dependency "yard"
|
25
|
+
|
26
|
+
spec.add_dependency "actionpack", "~> 4.0"
|
27
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe ParamsSanitizer::Base do
|
5
|
+
|
6
|
+
it 'Definitions instance was defined each class.' do
|
7
|
+
sanitizer1 = Class.new(ParamsSanitizer::Base)
|
8
|
+
sanitizer2 = Class.new(ParamsSanitizer::Base)
|
9
|
+
|
10
|
+
expect(sanitizer1.definitions.equal?(sanitizer2.definitions)).to be_false
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'included sanitizers methods.' do
|
14
|
+
expect(ParamsSanitizer::Base.methods.include?(:accept_value)).to be_true
|
15
|
+
expect(ParamsSanitizer::Base.methods.include?(:reject_value)).to be_true
|
16
|
+
expect(ParamsSanitizer::Base.methods.include?(:accept_range)).to be_true
|
17
|
+
expect(ParamsSanitizer::Base.methods.include?(:reject_range)).to be_true
|
18
|
+
expect(ParamsSanitizer::Base.methods.include?(:accept_regex)).to be_true
|
19
|
+
expect(ParamsSanitizer::Base.methods.include?(:reject_regex)).to be_true
|
20
|
+
expect(ParamsSanitizer::Base.methods.include?(:exist_value)).to be_true
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'check_duplicated_definition! method can check duplicated.' do
|
24
|
+
ParamsSanitizer::Base.stub(:definitions).and_return(
|
25
|
+
{
|
26
|
+
accept_value:{
|
27
|
+
'name' => nil,
|
28
|
+
'email' => nil,
|
29
|
+
}
|
30
|
+
}
|
31
|
+
)
|
32
|
+
|
33
|
+
expect {
|
34
|
+
ParamsSanitizer::Base.check_duplicated_definition!('safe')
|
35
|
+
}.not_to raise_error
|
36
|
+
|
37
|
+
expect {
|
38
|
+
ParamsSanitizer::Base.check_duplicated_definition!('email')
|
39
|
+
}.to raise_error
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'permit_filter called after call sanitize.' do
|
43
|
+
sanitizer = Class.new(ParamsSanitizer::Base)
|
44
|
+
params = ActionController::Parameters.new({nyaruko: 'kawaii', suiginto: 'kaminoryouiki'})
|
45
|
+
|
46
|
+
ParamsSanitizer::Base.should_receive(:permit_filter).and_return([:nyaruko])
|
47
|
+
params.should_receive(:permit).with([:nyaruko]).and_return(params)
|
48
|
+
|
49
|
+
sanitizer.sanitize(params)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'permit_filter enable.' do
|
53
|
+
ParamsSanitizer::Base.stub(:permit_filter).and_return([:nyaruko])
|
54
|
+
ParamsSanitizer::Base.stub(:definitions).and_return({})
|
55
|
+
|
56
|
+
sanitizer = Class.new(ParamsSanitizer::Base)
|
57
|
+
params = ActionController::Parameters.new({nyaruko: 'kawaii', suiginto: 'kaminoryouiki'})
|
58
|
+
sanitized = sanitizer.sanitize(params)
|
59
|
+
|
60
|
+
expect(sanitized.eql?({nyaruko: 'kawaii'})).to be_true
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'sanitize_params call sanitizer.' do
|
64
|
+
params = {'nyarukosan' => 'w'}
|
65
|
+
|
66
|
+
ParamsSanitizer::Base.stub(:definitions).and_return(
|
67
|
+
{
|
68
|
+
anime_value: 'rules'
|
69
|
+
}
|
70
|
+
)
|
71
|
+
|
72
|
+
sanitizer_inst = ParamsSanitizer::Base.new
|
73
|
+
sanitizer_inst.should_receive(:sanitize_anime_value!).with(params, 'rules')
|
74
|
+
|
75
|
+
sanitized = sanitizer_inst.sanitize_params(params)
|
76
|
+
|
77
|
+
# return symbol key.
|
78
|
+
expect(sanitized.eql?({nyarukosan: 'w'})).to be_true
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
|
3
|
+
describe ParamsSanitizer::Sanitizers::AcceptRange do
|
4
|
+
|
5
|
+
context 'after include' do
|
6
|
+
before(:each) do
|
7
|
+
class Sanitizer
|
8
|
+
include ParamsSanitizer::Sanitizers::AcceptRange
|
9
|
+
end
|
10
|
+
Sanitizer.stub(:check_duplicated_definition!)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'have accept_range methods.' do
|
14
|
+
expect(Sanitizer.private_method_defined?(:sanitize_accept_range!)).to be_true
|
15
|
+
expect(Sanitizer.methods.include?(:accept_range)).to be_true
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'accept_range method call check_duplicated_definition!' do
|
19
|
+
Sanitizer.stub(:definitions).and_return(Hash.new)
|
20
|
+
Sanitizer.should_receive(:check_duplicated_definition!).with(:anime)
|
21
|
+
Sanitizer.accept_range(:anime, 50, 0, 100)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'accept_range method add rule.' do
|
25
|
+
definition = Hash.new
|
26
|
+
Sanitizer.stub(:definitions).and_return(definition)
|
27
|
+
|
28
|
+
expect {
|
29
|
+
Sanitizer.accept_range(:anime, 50, 0, 100)
|
30
|
+
}.to change{definition.count}.by(1)
|
31
|
+
|
32
|
+
expect(definition.eql?(
|
33
|
+
{
|
34
|
+
accept_range: { 'anime' => { default_value: 50, min: 0, max: 100 } }
|
35
|
+
})).to be_true
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'after define rule' do
|
39
|
+
before(:each) do
|
40
|
+
definitions = Hash.new
|
41
|
+
Sanitizer.stub(:definitions).and_return(definitions)
|
42
|
+
|
43
|
+
Sanitizer.accept_range(:anime, 50, 0, 100)
|
44
|
+
@rule = definitions[:accept_range]
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'sanitize_accept_range! method sanitizes missing params.' do
|
48
|
+
params = {'anime' => '-50'}
|
49
|
+
Sanitizer.new.send(:sanitize_accept_range!, params, @rule)
|
50
|
+
expect(params.eql?({'anime' => 50})).to be_true
|
51
|
+
|
52
|
+
params = {'anime' => '-1'}
|
53
|
+
Sanitizer.new.send(:sanitize_accept_range!, params, @rule)
|
54
|
+
expect(params.eql?({'anime' => 50})).to be_true
|
55
|
+
|
56
|
+
params = {'anime' => '101'}
|
57
|
+
Sanitizer.new.send(:sanitize_accept_range!, params, @rule)
|
58
|
+
expect(params.eql?({'anime' => 50})).to be_true
|
59
|
+
|
60
|
+
params = {'anime' => '150'}
|
61
|
+
Sanitizer.new.send(:sanitize_accept_range!, params, @rule)
|
62
|
+
expect(params.eql?({'anime' => 50})).to be_true
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'sanitize_accept_range! method does not sanitize params.' do
|
66
|
+
params = {'anime' => '0'}
|
67
|
+
Sanitizer.new.send(:sanitize_accept_range!, params, @rule)
|
68
|
+
expect(params.eql?({'anime' => 0})).to be_true
|
69
|
+
|
70
|
+
params = {'anime' => '40'}
|
71
|
+
Sanitizer.new.send(:sanitize_accept_range!, params, @rule)
|
72
|
+
expect(params.eql?({'anime' => 40})).to be_true
|
73
|
+
|
74
|
+
params = {'anime' => '80'}
|
75
|
+
Sanitizer.new.send(:sanitize_accept_range!, params, @rule)
|
76
|
+
expect(params.eql?({'anime' => 80})).to be_true
|
77
|
+
|
78
|
+
params = {'anime' => '100'}
|
79
|
+
Sanitizer.new.send(:sanitize_accept_range!, params, @rule)
|
80
|
+
expect(params.eql?({'anime' => 100})).to be_true
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'after define rule of one limit free.' do
|
85
|
+
before(:each) do
|
86
|
+
definitions = Hash.new
|
87
|
+
Sanitizer.stub(:definitions).and_return(definitions)
|
88
|
+
|
89
|
+
Sanitizer.accept_range(:minnil, 50, nil, 100)
|
90
|
+
Sanitizer.accept_range(:maxnil, 50, 0, nil)
|
91
|
+
@rule = definitions[:accept_range]
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'sanitize_accept_range! method sanitizes missing params.' do
|
95
|
+
params = {'minnil' => '150'}
|
96
|
+
Sanitizer.new.send(:sanitize_accept_range!, params, @rule)
|
97
|
+
expect(params.eql?({'minnil' => 50, 'maxnil' => 50})).to be_true
|
98
|
+
|
99
|
+
params = {'maxnil' => '-50'}
|
100
|
+
Sanitizer.new.send(:sanitize_accept_range!, params, @rule)
|
101
|
+
expect(params.eql?({'minnil' => 50, 'maxnil' => 50})).to be_true
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'sanitize_accept_range! method does not sanitize params.' do
|
105
|
+
params = {'minnil' => '-999'}
|
106
|
+
Sanitizer.new.send(:sanitize_accept_range!, params, @rule)
|
107
|
+
expect(params.eql?({'minnil' => -999, 'maxnil' => 50})).to be_true
|
108
|
+
|
109
|
+
params = {'maxnil' => '999'}
|
110
|
+
Sanitizer.new.send(:sanitize_accept_range!, params, @rule)
|
111
|
+
expect(params.eql?({'minnil' => 50, 'maxnil' => 999})).to be_true
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
end
|