params_sanitizer 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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,3 @@
1
+ module ParamsSanitizer
2
+ VERSION = "0.0.1"
3
+ 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