params_validator 0.2.0 → 0.3.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.
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # params_validator [![Continuous Integration](https://secure.travis-ci.org/chdorner/epubinfo.png?branch=master)](https://secure.travis-ci.org/chdorner/params_validator) [![Dependencies](https://gemnasium.com/chdorner/epubinfo.png)](https://gemnasium.com/chdorner/params_validator)
1
+ # params_validator [![Continuous Integration](https://secure.travis-ci.org/chdorner/params_validator.png?branch=master)](https://secure.travis-ci.org/chdorner/params_validator)
2
2
 
3
3
  A DSL for validating request parameters, raises exceptions when validation failed. Currently only supports Rails.
4
4
 
@@ -109,6 +109,19 @@ Basic usage:
109
109
  * `q=`
110
110
  * `somethingelse=term`
111
111
 
112
+ ### Whitelist
113
+
114
+ validate_params_for :search, { :type => { :_with => [:whitelist], :_whitelist: [:documents, :pictures], :_default: :documents } }
115
+
116
+ **Valid:**
117
+
118
+ * `type=documents`
119
+ * `type=pictures`
120
+
121
+ **Invalid:**
122
+
123
+ * `type=unicorns`
124
+
112
125
  ## Validation errors
113
126
 
114
127
  When validation of parameters fails, this gem is raising a `ParamsValidator::InvalidParamsException` error which contains an `errors` hash with further information.
@@ -127,7 +140,7 @@ As briefly described in the example at the beginning, the easiest way to rescue
127
140
  end
128
141
 
129
142
  ## Contributing to params_validator
130
-
143
+
131
144
  * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
132
145
  * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
133
146
  * Fork the project.
@@ -138,6 +151,6 @@ As briefly described in the example at the beginning, the easiest way to rescue
138
151
 
139
152
  ## Copyright
140
153
 
141
- Copyright (c) 2012 Christof Dorner. See LICENSE.txt for
154
+ Copyright (c) 2013 Christof Dorner. See LICENSE.txt for
142
155
  further details.
143
156
 
@@ -4,7 +4,13 @@ Bundler.require(:default)
4
4
  module ParamsValidator
5
5
  class InvalidValidatorException < Exception; end
6
6
  class InvalidParamsException < Exception
7
- attr_accessor :errors
7
+ attr_reader :errors
8
+
9
+ def initialize(errors)
10
+ @errors = errors
11
+
12
+ super()
13
+ end
8
14
  end
9
15
  end
10
16
 
@@ -14,7 +14,8 @@ module ParamsValidator
14
14
  action_filter_name = "validate_params_for_action_#{action}".to_sym
15
15
 
16
16
  define_method(action_filter_name) do
17
- Filter::validate_params(params, definition)
17
+ sanitized_params = Filter.sanitize_params(params, definition)
18
+ request.parameters.merge!(sanitized_params)
18
19
  end
19
20
  self.before_filter action_filter_name, :only => action
20
21
  end
@@ -2,33 +2,45 @@ module ParamsValidator
2
2
  module Filter
3
3
  extend ActiveSupport::Inflector
4
4
 
5
- def self.validate_params(params, definition)
5
+ class << self
6
+ attr_accessor :params
7
+ end
8
+
9
+ def self.sanitize_params(params, definition)
10
+ self.params = params
6
11
  errors = {}
7
12
  definition.each do |field, validation_definition|
8
- errors = validate_field(field, params, validation_definition, errors)
13
+ errors = validate_field(field, validation_definition, errors)
9
14
 
10
- validation_definition.reject {|k,v| k == :_with }.each do |nested_field, nested_validation_definition|
11
- errors = validate_field(nested_field, params[field.to_s], nested_validation_definition, errors)
15
+ validation_definition.reject {|k,v| reserved_keys.include?(k) }.each do |nested_field, nested_validation_definition|
16
+ sanitize_params(params[field.to_s], { nested_field => nested_validation_definition })
12
17
  end
13
18
  end
14
- if errors.count > 0
15
- exception = InvalidParamsException.new
16
- exception.errors = errors
17
- raise exception
18
- end
19
+ raise InvalidParamsException.new(errors) unless errors.empty?
20
+ self.params
19
21
  end
20
22
 
21
23
  private
22
24
 
23
- def self.validate_field(field, params, validation_definition, errors)
24
- return errors unless validation_definition.has_key? :_with
25
- validation_definition[:_with].each do |validator_name|
25
+ def self.reserved_keys
26
+ @reserved_keys ||= [:_default, :_whitelist, :_with].to_set
27
+ end
28
+
29
+ def self.validate_field(field, validation_definition, errors)
30
+ validators = validation_definition[:_with]
31
+ return errors unless validators
32
+ validators.each do |validator_name|
26
33
  camelized_validator_name = self.camelize(validator_name)
27
34
  begin
28
- validator = constantize("ParamsValidator::Validator::#{camelized_validator_name}")
35
+ validator = ParamsValidator::Validator.const_get(camelized_validator_name)
36
+ validator = validator.new(validation_definition)
29
37
  value = params.is_a?(Hash) ? params[field.to_s] : nil
30
38
  unless validator.valid?(value)
31
- errors[field] = validator.error_message
39
+ if validator.respond_to?(:default?) && validator.default?
40
+ params[field] = validator.default
41
+ else
42
+ errors[field] = validator.error_message
43
+ end
32
44
  end
33
45
  rescue NameError
34
46
  raise InvalidValidatorException.new(validator_name)
@@ -1,3 +1,5 @@
1
- require 'params_validator/validator/type'
1
+ require 'params_validator/validator/base'
2
2
  require 'params_validator/validator/presence'
3
+ require 'params_validator/validator/type'
4
+ require 'params_validator/validator/whitelist'
3
5
 
@@ -0,0 +1,22 @@
1
+ module ParamsValidator
2
+ module Validator
3
+ class Base
4
+ attr_reader :default
5
+
6
+ def initialize(definition={})
7
+ end
8
+
9
+ def default?
10
+ instance_variable_defined?('@default')
11
+ end
12
+
13
+ def error_message
14
+ raise NotImplementedError
15
+ end
16
+
17
+ def valid?(value)
18
+ raise NotImplementedError
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,9 +1,11 @@
1
1
  module ParamsValidator
2
2
  module Validator
3
- module Presence
4
- def self.error_message; "is empty"; end
3
+ class Presence < Base
4
+ def error_message
5
+ 'is empty'
6
+ end
5
7
 
6
- def self.valid?(value)
8
+ def valid?(value)
7
9
  value.present?
8
10
  end
9
11
  end
@@ -1,50 +1,49 @@
1
1
  module ParamsValidator
2
2
  module Validator
3
+ class Type < Base
4
+ def error_message
5
+ "is not of type #{type}"
6
+ end
3
7
 
4
- private
8
+ def valid?(value)
9
+ true unless Presence.new.valid?(value)
10
+ end
5
11
 
6
- module Base
7
12
  private
8
- def define_type_validator(type_name, &block)
9
- @type_name = type_name
10
- @block = block
11
-
12
- def self.error_message
13
- "is not of type #{@type_name.to_s.downcase}"
14
- end
15
13
 
16
- def self.valid?(value)
17
- return true unless Presence.valid?(value)
18
- return !!@block.call(value) rescue false
19
- end
14
+ def type
15
+ self.class.to_s.split(/type/i).last.downcase
20
16
  end
21
17
  end
22
18
 
23
- public
24
-
25
- module TypeInteger
26
- extend Base
27
- define_type_validator('integer') { |value| Integer(value) }
19
+ class TypeInteger < Type
20
+ def valid?(value)
21
+ super || !!Integer(value) rescue false
22
+ end
28
23
  end
29
24
 
30
- module TypeFloat
31
- extend Base
32
- define_type_validator('float') { |value| Float(value) }
25
+ class TypeFloat < Type
26
+ def valid?(value)
27
+ super || !!Float(value) rescue false
28
+ end
33
29
  end
34
30
 
35
- module TypeString
36
- extend Base
37
- define_type_validator('string') { |value| value.kind_of? String }
31
+ class TypeString < Type
32
+ def valid?(value)
33
+ super || value.kind_of?(String)
34
+ end
38
35
  end
39
36
 
40
- module TypeArray
41
- extend Base
42
- define_type_validator('array') { |value| value.kind_of? Array }
37
+ class TypeArray < Type
38
+ def valid?(value)
39
+ super || value.kind_of?(Array)
40
+ end
43
41
  end
44
42
 
45
- module TypeHash
46
- extend Base
47
- define_type_validator('hash') { |value| value.kind_of? Hash }
43
+ class TypeHash < Type
44
+ def valid?(value)
45
+ super || value.kind_of?(Hash)
46
+ end
48
47
  end
49
48
  end
50
49
  end
@@ -0,0 +1,29 @@
1
+ module ParamsValidator
2
+ module Validator
3
+ class Whitelist
4
+ attr_reader :default
5
+
6
+ def initialize(definition)
7
+ @default = definition[:_default] if definition.key?(:_default)
8
+ @whitelist = definition[:_whitelist].map(&:to_s).to_set
9
+ end
10
+
11
+ def default?
12
+ instance_variable_defined?('@default')
13
+ end
14
+
15
+ def error_message
16
+ 'is invalid'
17
+ end
18
+
19
+ def valid?(value)
20
+ whitelist.include?(value)
21
+ end
22
+
23
+ private
24
+
25
+ attr_reader :whitelist
26
+ end
27
+ end
28
+ end
29
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: params_validator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-05-25 00:00:00.000000000 Z
12
+ date: 2013-06-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
- requirement: &70160878293820 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: 3.0.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70160878293820
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 3.0.0
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: rspec
27
- requirement: &70160878293300 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ~>
@@ -32,21 +37,31 @@ dependencies:
32
37
  version: 2.9.0
33
38
  type: :development
34
39
  prerelease: false
35
- version_requirements: *70160878293300
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 2.9.0
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: yard
38
- requirement: &70160878292800 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ~>
42
52
  - !ruby/object:Gem::Version
43
- version: '0.7'
53
+ version: '0.8'
44
54
  type: :development
45
55
  prerelease: false
46
- version_requirements: *70160878292800
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '0.8'
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: rdoc
49
- requirement: &70160878292320 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ~>
@@ -54,10 +69,15 @@ dependencies:
54
69
  version: '3.12'
55
70
  type: :development
56
71
  prerelease: false
57
- version_requirements: *70160878292320
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '3.12'
58
78
  - !ruby/object:Gem::Dependency
59
79
  name: bundler
60
- requirement: &70160878291840 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
61
81
  none: false
62
82
  requirements:
63
83
  - - ! '>='
@@ -65,10 +85,15 @@ dependencies:
65
85
  version: '0'
66
86
  type: :development
67
87
  prerelease: false
68
- version_requirements: *70160878291840
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
69
94
  - !ruby/object:Gem::Dependency
70
95
  name: jeweler
71
- requirement: &70160878291320 !ruby/object:Gem::Requirement
96
+ requirement: !ruby/object:Gem::Requirement
72
97
  none: false
73
98
  requirements:
74
99
  - - ~>
@@ -76,10 +101,15 @@ dependencies:
76
101
  version: 1.8.3
77
102
  type: :development
78
103
  prerelease: false
79
- version_requirements: *70160878291320
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: 1.8.3
80
110
  - !ruby/object:Gem::Dependency
81
111
  name: guard
82
- requirement: &70160878290780 !ruby/object:Gem::Requirement
112
+ requirement: !ruby/object:Gem::Requirement
83
113
  none: false
84
114
  requirements:
85
115
  - - ! '>='
@@ -87,10 +117,15 @@ dependencies:
87
117
  version: '0'
88
118
  type: :development
89
119
  prerelease: false
90
- version_requirements: *70160878290780
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
91
126
  - !ruby/object:Gem::Dependency
92
127
  name: guard-rspec
93
- requirement: &70160878290240 !ruby/object:Gem::Requirement
128
+ requirement: !ruby/object:Gem::Requirement
94
129
  none: false
95
130
  requirements:
96
131
  - - ! '>='
@@ -98,10 +133,15 @@ dependencies:
98
133
  version: '0'
99
134
  type: :development
100
135
  prerelease: false
101
- version_requirements: *70160878290240
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
102
142
  - !ruby/object:Gem::Dependency
103
143
  name: rb-fsevent
104
- requirement: &70160878289720 !ruby/object:Gem::Requirement
144
+ requirement: !ruby/object:Gem::Requirement
105
145
  none: false
106
146
  requirements:
107
147
  - - ! '>='
@@ -109,10 +149,15 @@ dependencies:
109
149
  version: '0'
110
150
  type: :development
111
151
  prerelease: false
112
- version_requirements: *70160878289720
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
113
158
  - !ruby/object:Gem::Dependency
114
159
  name: growl
115
- requirement: &70160878305580 !ruby/object:Gem::Requirement
160
+ requirement: !ruby/object:Gem::Requirement
116
161
  none: false
117
162
  requirements:
118
163
  - - ! '>='
@@ -120,7 +165,12 @@ dependencies:
120
165
  version: '0'
121
166
  type: :development
122
167
  prerelease: false
123
- version_requirements: *70160878305580
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
124
174
  description:
125
175
  email: christof@chdorner.me
126
176
  executables: []
@@ -134,8 +184,10 @@ files:
134
184
  - lib/params_validator/filter.rb
135
185
  - lib/params_validator/railtie.rb
136
186
  - lib/params_validator/validator.rb
187
+ - lib/params_validator/validator/base.rb
137
188
  - lib/params_validator/validator/presence.rb
138
189
  - lib/params_validator/validator/type.rb
190
+ - lib/params_validator/validator/whitelist.rb
139
191
  - LICENSE.txt
140
192
  - README.md
141
193
  homepage: https://github.com/chdorner/params_validator
@@ -153,7 +205,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
153
205
  version: '0'
154
206
  segments:
155
207
  - 0
156
- hash: 464833905745855690
208
+ hash: -1148739892296269609
157
209
  required_rubygems_version: !ruby/object:Gem::Requirement
158
210
  none: false
159
211
  requirements:
@@ -162,7 +214,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
162
214
  version: '0'
163
215
  requirements: []
164
216
  rubyforge_project:
165
- rubygems_version: 1.8.11
217
+ rubygems_version: 1.8.23
166
218
  signing_key:
167
219
  specification_version: 3
168
220
  summary: A DSL for validating request parameters, raises exceptions when validation